@kenkaiiii/ggcoder 5.59.3 → 5.60.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/README.md +2 -1
- package/assets/skills/refactoring/SKILL.md +64 -0
- package/assets/skills/refactoring/references/agent-pitfalls.md +43 -0
- package/assets/skills/refactoring/references/legacy.md +49 -0
- package/assets/skills/refactoring/references/smells.md +71 -0
- package/dist/core/agent-session.d.ts +6 -1
- package/dist/core/agent-session.js +33 -2
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/compaction/compactor.d.ts +34 -0
- package/dist/core/compaction/compactor.js +161 -2
- package/dist/core/compaction/compactor.js.map +1 -1
- package/dist/core/internal-diagnostics.d.ts +142 -0
- package/dist/core/internal-diagnostics.js +450 -0
- package/dist/core/internal-diagnostics.js.map +1 -0
- package/dist/core/slash-commands.d.ts +3 -1
- package/dist/core/slash-commands.js +6 -4
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/tools/session-stats.d.ts +26 -0
- package/dist/tools/session-stats.js +51 -0
- package/dist/tools/session-stats.js.map +1 -0
- package/package.json +4 -4
|
@@ -0,0 +1,450 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal-only session diagnostics — NOT a public feature.
|
|
3
|
+
*
|
|
4
|
+
* Enabled only when the internal flag is set (env `GG_INTERNAL=1` or
|
|
5
|
+
* `~/.gg/internal.json` containing `{"diagnostics": true}`). When disabled,
|
|
6
|
+
* nothing is recorded, no tool is registered, and `/diagnose` does not exist,
|
|
7
|
+
* so the public tool list and prompt stay byte-identical.
|
|
8
|
+
*
|
|
9
|
+
* What it captures per session (counters and timings only — never prompt
|
|
10
|
+
* text, file contents, or credentials):
|
|
11
|
+
* - per-turn usage + timing (reuses TurnMetricPayload, already persisted)
|
|
12
|
+
* - per-tool call/error/duration stats and clustered error digests
|
|
13
|
+
* - identical-call repeats (same tool + same args ≥ 3×)
|
|
14
|
+
* - truncation/continuation events, model switches, compactions
|
|
15
|
+
*
|
|
16
|
+
* Consumers: the `session_stats` tool (live, agent-facing) and the
|
|
17
|
+
* `/diagnose` slash command (cross-session aggregate, agent-facing).
|
|
18
|
+
*/
|
|
19
|
+
import fs from "node:fs";
|
|
20
|
+
import path from "node:path";
|
|
21
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
22
|
+
import { getAppPaths } from "../config.js";
|
|
23
|
+
let enabledCache;
|
|
24
|
+
/** Internal mode gate. Env wins; otherwise `~/.gg/internal.json` must set
|
|
25
|
+
* `diagnostics: true`. Result is cached for the process lifetime. */
|
|
26
|
+
export function isInternalDiagnosticsEnabled() {
|
|
27
|
+
if (enabledCache !== undefined)
|
|
28
|
+
return enabledCache;
|
|
29
|
+
const env = process.env.GG_INTERNAL;
|
|
30
|
+
if (env && ["1", "true", "yes"].includes(env.toLowerCase())) {
|
|
31
|
+
enabledCache = true;
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
try {
|
|
35
|
+
const file = path.join(getAppPaths().agentDir, "internal.json");
|
|
36
|
+
const parsed = JSON.parse(fs.readFileSync(file, "utf8"));
|
|
37
|
+
enabledCache = parsed?.diagnostics === true;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
enabledCache = false;
|
|
41
|
+
}
|
|
42
|
+
return enabledCache;
|
|
43
|
+
}
|
|
44
|
+
/** Test seam: reset the cached flag after mutating env/file state. */
|
|
45
|
+
export function resetInternalDiagnosticsCacheForTests() {
|
|
46
|
+
enabledCache = undefined;
|
|
47
|
+
}
|
|
48
|
+
export function diagnosticsSessionsDir() {
|
|
49
|
+
return (process.env.GG_DIAGNOSTICS_DIR ?? path.join(getAppPaths().agentDir, "diagnostics", "sessions"));
|
|
50
|
+
}
|
|
51
|
+
// ── Recorder ───────────────────────────────────────────────
|
|
52
|
+
const REPEAT_THRESHOLD = 3;
|
|
53
|
+
const MAX_ERROR_CLUSTERS = 8;
|
|
54
|
+
const MAX_REPEATED_KEYS = 16;
|
|
55
|
+
const MAX_TURNS_KEPT = 500;
|
|
56
|
+
function argsDigest(args) {
|
|
57
|
+
if (!args)
|
|
58
|
+
return "";
|
|
59
|
+
const json = JSON.stringify(args);
|
|
60
|
+
return json.length > 80 ? `${createHash("sha1").update(json).digest("hex").slice(0, 12)}…` : json;
|
|
61
|
+
}
|
|
62
|
+
/** True when a tool "succeeded" but its result text says it failed: bash
|
|
63
|
+
* prefixes non-zero exits with "Exit code: N", and most tools prefix
|
|
64
|
+
* rejections/refusals with "Error:". Empty-grep "no matches" is a legitimate
|
|
65
|
+
* answer, not a failure, so it stays clean. */
|
|
66
|
+
function isSoftFailure(result) {
|
|
67
|
+
return /^Exit code: [1-9]/m.test(result) || /^Error:/m.test(result);
|
|
68
|
+
}
|
|
69
|
+
/** Collapse an error result into a stable digest: first line, digits and
|
|
70
|
+
* quoted paths normalized, so 50 identical failures cluster into one row. */
|
|
71
|
+
function errorDigest(result) {
|
|
72
|
+
const firstLine = result.split("\n").find((l) => l.trim().length > 0) ?? "";
|
|
73
|
+
return firstLine
|
|
74
|
+
.replace(/\d+/g, "N")
|
|
75
|
+
.replace(/"[^"]+"/g, '"…"')
|
|
76
|
+
.replace(/'[^']+'/g, "'…'")
|
|
77
|
+
.slice(0, 120);
|
|
78
|
+
}
|
|
79
|
+
export class SessionDiagnosticsRecorder {
|
|
80
|
+
record;
|
|
81
|
+
pendingCalls = new Map();
|
|
82
|
+
repeatCounts = new Map();
|
|
83
|
+
clusterCounts = new Map();
|
|
84
|
+
unsubscribers = [];
|
|
85
|
+
fallbackSessionId;
|
|
86
|
+
getSessionId;
|
|
87
|
+
constructor(opts) {
|
|
88
|
+
this.getSessionId = () => typeof opts.sessionId === "function" ? opts.sessionId() : opts.sessionId;
|
|
89
|
+
this.record = {
|
|
90
|
+
version: 1,
|
|
91
|
+
sessionId: this.getSessionId(),
|
|
92
|
+
cwd: opts.cwd,
|
|
93
|
+
provider: opts.provider,
|
|
94
|
+
model: opts.model,
|
|
95
|
+
startedAt: Date.now(),
|
|
96
|
+
modelSwitches: [],
|
|
97
|
+
turns: [],
|
|
98
|
+
toolStats: {},
|
|
99
|
+
errorClusters: [],
|
|
100
|
+
repeats: [],
|
|
101
|
+
truncations: [],
|
|
102
|
+
compactions: [],
|
|
103
|
+
totals: {
|
|
104
|
+
turns: 0,
|
|
105
|
+
toolCalls: 0,
|
|
106
|
+
toolErrors: 0,
|
|
107
|
+
inputTokens: 0,
|
|
108
|
+
outputTokens: 0,
|
|
109
|
+
cacheRead: 0,
|
|
110
|
+
cacheWrite: 0,
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
this.dir = opts.dir;
|
|
114
|
+
}
|
|
115
|
+
dir;
|
|
116
|
+
/** Subscribe to the session bus. Safe to call once per session. */
|
|
117
|
+
attach(bus) {
|
|
118
|
+
this.unsubscribers.push(bus.on("tool_call_start", ({ toolCallId, name, args }) => {
|
|
119
|
+
this.pendingCalls.set(toolCallId, { name, argsKey: argsDigest(args) });
|
|
120
|
+
}));
|
|
121
|
+
this.unsubscribers.push(bus.on("tool_call_end", ({ toolCallId, result, isError, durationMs, invalidArgAttempt }) => {
|
|
122
|
+
const pending = this.pendingCalls.get(toolCallId);
|
|
123
|
+
this.pendingCalls.delete(toolCallId);
|
|
124
|
+
const name = pending?.name ?? "unknown";
|
|
125
|
+
const stat = (this.record.toolStats[name] ??= {
|
|
126
|
+
calls: 0,
|
|
127
|
+
errors: 0,
|
|
128
|
+
softErrors: 0,
|
|
129
|
+
totalMs: 0,
|
|
130
|
+
maxMs: 0,
|
|
131
|
+
invalidArgAttempts: 0,
|
|
132
|
+
truncatedResults: 0,
|
|
133
|
+
});
|
|
134
|
+
stat.calls += 1;
|
|
135
|
+
stat.totalMs += durationMs;
|
|
136
|
+
stat.maxMs = Math.max(stat.maxMs, durationMs);
|
|
137
|
+
if (invalidArgAttempt)
|
|
138
|
+
stat.invalidArgAttempts += 1;
|
|
139
|
+
if (/Full output saved to|\[truncated/i.test(result))
|
|
140
|
+
stat.truncatedResults += 1;
|
|
141
|
+
this.record.totals.toolCalls += 1;
|
|
142
|
+
const failed = isError || isSoftFailure(result);
|
|
143
|
+
if (isError)
|
|
144
|
+
stat.errors += 1;
|
|
145
|
+
else if (failed)
|
|
146
|
+
stat.softErrors += 1;
|
|
147
|
+
if (failed) {
|
|
148
|
+
this.record.totals.toolErrors += 1;
|
|
149
|
+
const digest = errorDigest(result);
|
|
150
|
+
const cluster = this.clusterCounts.get(digest) ?? {
|
|
151
|
+
count: 0,
|
|
152
|
+
sample: result.slice(0, 200),
|
|
153
|
+
};
|
|
154
|
+
cluster.count += 1;
|
|
155
|
+
this.clusterCounts.set(digest, cluster);
|
|
156
|
+
}
|
|
157
|
+
if (pending) {
|
|
158
|
+
const key = `${name}::${pending.argsKey}`;
|
|
159
|
+
const entry = this.repeatCounts.get(key) ?? {
|
|
160
|
+
tool: name,
|
|
161
|
+
argsDigest: pending.argsKey,
|
|
162
|
+
count: 0,
|
|
163
|
+
};
|
|
164
|
+
entry.count += 1;
|
|
165
|
+
this.repeatCounts.set(key, entry);
|
|
166
|
+
}
|
|
167
|
+
}));
|
|
168
|
+
this.unsubscribers.push(bus.on("model_change", ({ provider, model }) => {
|
|
169
|
+
if (model !== this.record.model || provider !== this.record.provider) {
|
|
170
|
+
this.record.modelSwitches.push({ at: Date.now(), provider, model });
|
|
171
|
+
this.record.provider = provider;
|
|
172
|
+
this.record.model = model;
|
|
173
|
+
}
|
|
174
|
+
}));
|
|
175
|
+
this.unsubscribers.push(bus.on("truncated", ({ reason, continued }) => {
|
|
176
|
+
this.record.truncations.push({ reason, continued });
|
|
177
|
+
}));
|
|
178
|
+
this.unsubscribers.push(bus.on("compaction_end", ({ compacted, originalCount, newCount }) => {
|
|
179
|
+
if (compacted)
|
|
180
|
+
this.record.compactions.push({ originalCount, newCount });
|
|
181
|
+
}));
|
|
182
|
+
}
|
|
183
|
+
/** Called from AgentSession.persistTurnMetric — the authoritative per-turn
|
|
184
|
+
* usage/timing source. Also the incremental flush point. */
|
|
185
|
+
recordTurnMetric(metric) {
|
|
186
|
+
this.record.totals.turns += 1;
|
|
187
|
+
this.record.totals.inputTokens += metric.usage.inputTokens;
|
|
188
|
+
this.record.totals.outputTokens += metric.usage.outputTokens;
|
|
189
|
+
this.record.totals.cacheRead += metric.usage.cacheRead ?? 0;
|
|
190
|
+
this.record.totals.cacheWrite += metric.usage.cacheWrite ?? 0;
|
|
191
|
+
this.record.turns.push({
|
|
192
|
+
turn: metric.turn,
|
|
193
|
+
stopReason: metric.stopReason,
|
|
194
|
+
inputTokens: metric.usage.inputTokens,
|
|
195
|
+
outputTokens: metric.usage.outputTokens,
|
|
196
|
+
cacheRead: metric.usage.cacheRead,
|
|
197
|
+
cacheWrite: metric.usage.cacheWrite,
|
|
198
|
+
ttftMs: metric.timing.ttftMs,
|
|
199
|
+
providerDurationMs: metric.timing.providerDurationMs,
|
|
200
|
+
});
|
|
201
|
+
if (this.record.turns.length > MAX_TURNS_KEPT)
|
|
202
|
+
this.record.turns.splice(0, this.record.turns.length - MAX_TURNS_KEPT);
|
|
203
|
+
void this.flush();
|
|
204
|
+
}
|
|
205
|
+
materializeDerived() {
|
|
206
|
+
this.record.errorClusters = [...this.clusterCounts.entries()]
|
|
207
|
+
.map(([digest, { count, sample }]) => ({ digest, count, sample }))
|
|
208
|
+
.sort((a, b) => b.count - a.count)
|
|
209
|
+
.slice(0, MAX_ERROR_CLUSTERS);
|
|
210
|
+
this.record.repeats = [...this.repeatCounts.values()]
|
|
211
|
+
.filter((e) => e.count >= REPEAT_THRESHOLD)
|
|
212
|
+
.sort((a, b) => b.count - a.count)
|
|
213
|
+
.slice(0, MAX_REPEATED_KEYS);
|
|
214
|
+
}
|
|
215
|
+
filePath() {
|
|
216
|
+
return path.join(this.dir ?? diagnosticsSessionsDir(), `${this.record.sessionId}.json`);
|
|
217
|
+
}
|
|
218
|
+
/** Best-effort incremental write — a diagnostics write failure must never
|
|
219
|
+
* affect the session. Synchronous ON PURPOSE: the record is a few KB written
|
|
220
|
+
* once per turn (negligible next to the network call it follows), and a sync
|
|
221
|
+
* write cannot be lost when a headless host exits immediately after the
|
|
222
|
+
* final turn_end — an async fire-and-forget flush racing process exit was
|
|
223
|
+
* silently dropping the whole session's record. */
|
|
224
|
+
flush() {
|
|
225
|
+
try {
|
|
226
|
+
this.materializeDerived();
|
|
227
|
+
this.record.sessionId = this.getSessionId();
|
|
228
|
+
// Transient hosts (json sub-agent mode) never assign a session id —
|
|
229
|
+
// fall back to a stable generated one so the record still lands under a
|
|
230
|
+
// real filename instead of `.json`.
|
|
231
|
+
if (!this.record.sessionId) {
|
|
232
|
+
this.fallbackSessionId ??= randomUUID();
|
|
233
|
+
this.record.sessionId = this.fallbackSessionId;
|
|
234
|
+
}
|
|
235
|
+
const file = this.filePath();
|
|
236
|
+
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
237
|
+
fs.writeFileSync(file, JSON.stringify(this.record), "utf8");
|
|
238
|
+
}
|
|
239
|
+
catch {
|
|
240
|
+
// Swallow: internal diagnostics are strictly best-effort.
|
|
241
|
+
}
|
|
242
|
+
return Promise.resolve();
|
|
243
|
+
}
|
|
244
|
+
async finalize() {
|
|
245
|
+
this.record.endedAt = Date.now();
|
|
246
|
+
for (const off of this.unsubscribers)
|
|
247
|
+
off();
|
|
248
|
+
this.unsubscribers = [];
|
|
249
|
+
await this.flush();
|
|
250
|
+
}
|
|
251
|
+
getRecord() {
|
|
252
|
+
return this.record;
|
|
253
|
+
}
|
|
254
|
+
// Test accessors — fresh derived state, independent of flush timing.
|
|
255
|
+
snapshotForTests() {
|
|
256
|
+
this.materializeDerived();
|
|
257
|
+
return JSON.parse(JSON.stringify(this.record));
|
|
258
|
+
}
|
|
259
|
+
repeatsForTests() {
|
|
260
|
+
this.materializeDerived();
|
|
261
|
+
return [...this.record.repeats];
|
|
262
|
+
}
|
|
263
|
+
errorClustersForTests() {
|
|
264
|
+
this.materializeDerived();
|
|
265
|
+
return [...this.record.errorClusters];
|
|
266
|
+
}
|
|
267
|
+
/** Compact agent-readable summary of THIS session (for session_stats). */
|
|
268
|
+
summary() {
|
|
269
|
+
return summarizeRecord(this.record);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
// ── Summaries + aggregation ─────────────────────────────────
|
|
273
|
+
function pct(part, whole) {
|
|
274
|
+
return whole > 0 ? `${((100 * part) / whole).toFixed(0)}%` : "—";
|
|
275
|
+
}
|
|
276
|
+
function fmtMs(ms) {
|
|
277
|
+
return ms >= 1000 ? `${(ms / 1000).toFixed(1)}s` : `${Math.round(ms)}ms`;
|
|
278
|
+
}
|
|
279
|
+
export function summarizeRecord(r) {
|
|
280
|
+
const lines = [];
|
|
281
|
+
const t = r.totals;
|
|
282
|
+
const promptTotal = t.inputTokens + t.cacheRead;
|
|
283
|
+
lines.push(`Session ${r.sessionId} (${r.provider}/${r.model}) — ${t.turns} turns, ${t.toolCalls} tool calls (${t.toolErrors} errors).`);
|
|
284
|
+
lines.push(`Tokens: ${t.inputTokens + t.cacheRead} prompt (${t.cacheRead} cached, ${pct(t.cacheRead, promptTotal)} reuse), ${t.outputTokens} output.`);
|
|
285
|
+
if (r.modelSwitches.length) {
|
|
286
|
+
lines.push(`Model switches: ${r.modelSwitches.length} (each likely rebuilds the cached prefix).`);
|
|
287
|
+
}
|
|
288
|
+
const ttfts = r.turns.map((x) => x.ttftMs).filter((x) => typeof x === "number");
|
|
289
|
+
if (ttfts.length) {
|
|
290
|
+
const sorted = [...ttfts].sort((a, b) => a - b);
|
|
291
|
+
lines.push(`TTFT median ${fmtMs(sorted[Math.floor(sorted.length / 2)])}, worst ${fmtMs(sorted[sorted.length - 1])}.`);
|
|
292
|
+
}
|
|
293
|
+
const toolLines = Object.entries(r.toolStats)
|
|
294
|
+
.sort((a, b) => b[1].totalMs - a[1].totalMs)
|
|
295
|
+
.slice(0, 6)
|
|
296
|
+
.map(([name, s]) => {
|
|
297
|
+
const failed = s.errors + (s.softErrors ?? 0);
|
|
298
|
+
const err = failed > 0 ? `, ${failed} failed (${pct(failed, s.calls)})` : "";
|
|
299
|
+
const bad = failed > 0 && failed / s.calls >= 0.25 ? " ⚠" : "";
|
|
300
|
+
return `- ${name}: ${s.calls} calls, ${fmtMs(s.totalMs)} total, ${fmtMs(s.maxMs)} max${err}${bad}`;
|
|
301
|
+
});
|
|
302
|
+
if (toolLines.length)
|
|
303
|
+
lines.push("Tools (by total time):", ...toolLines);
|
|
304
|
+
if (r.repeats.length) {
|
|
305
|
+
lines.push(`Repeated identical calls: ${r.repeats.map((x) => `${x.tool}×${x.count}`).join(", ")} — usually a stuck pattern.`);
|
|
306
|
+
}
|
|
307
|
+
for (const c of r.errorClusters.slice(0, 3)) {
|
|
308
|
+
lines.push(`Top error (${c.count}×): ${c.digest}`);
|
|
309
|
+
}
|
|
310
|
+
if (r.truncations.length) {
|
|
311
|
+
const continued = r.truncations.filter((x) => x.continued).length;
|
|
312
|
+
lines.push(`Output cut off ${r.truncations.length}× (${continued} auto-continued).`);
|
|
313
|
+
}
|
|
314
|
+
if (r.compactions.length) {
|
|
315
|
+
lines.push(`Compactions: ${r.compactions.length}× (${r.compactions
|
|
316
|
+
.map((c) => `${c.originalCount}→${c.newCount} msgs`)
|
|
317
|
+
.join(", ")}).`);
|
|
318
|
+
}
|
|
319
|
+
return lines.join("\n");
|
|
320
|
+
}
|
|
321
|
+
/** Read the newest N session records and produce a ranked, agent-readable
|
|
322
|
+
* findings report. Findings are ordered by cost × frequency, most urgent
|
|
323
|
+
* first; "what works" is included so regressions are visible. */
|
|
324
|
+
export function aggregateRecentDiagnostics(limit = 20, dir) {
|
|
325
|
+
const root = dir ?? diagnosticsSessionsDir();
|
|
326
|
+
let files;
|
|
327
|
+
try {
|
|
328
|
+
files = fs
|
|
329
|
+
.readdirSync(root)
|
|
330
|
+
.filter((f) => f.endsWith(".json"))
|
|
331
|
+
.map((f) => path.join(root, f))
|
|
332
|
+
.sort((a, b) => fs.statSync(b).mtimeMs - fs.statSync(a).mtimeMs)
|
|
333
|
+
.slice(0, limit);
|
|
334
|
+
}
|
|
335
|
+
catch {
|
|
336
|
+
return { sessionCount: 0, report: "No session diagnostics found (is internal mode enabled?)." };
|
|
337
|
+
}
|
|
338
|
+
const records = [];
|
|
339
|
+
for (const f of files) {
|
|
340
|
+
try {
|
|
341
|
+
const parsed = JSON.parse(fs.readFileSync(f, "utf8"));
|
|
342
|
+
if (parsed?.version === 1)
|
|
343
|
+
records.push(parsed);
|
|
344
|
+
}
|
|
345
|
+
catch {
|
|
346
|
+
// Skip corrupt files — diagnostics must never hard-fail.
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
if (!records.length) {
|
|
350
|
+
return { sessionCount: 0, report: "No valid session diagnostics records found." };
|
|
351
|
+
}
|
|
352
|
+
const findings = [];
|
|
353
|
+
const toolAgg = new Map();
|
|
354
|
+
const clusterAgg = new Map();
|
|
355
|
+
const repeatAgg = new Map();
|
|
356
|
+
let input = 0;
|
|
357
|
+
let cacheRead = 0;
|
|
358
|
+
let toolCalls = 0;
|
|
359
|
+
let toolErrors = 0;
|
|
360
|
+
let truncations = 0;
|
|
361
|
+
let compactions = 0;
|
|
362
|
+
let modelSwitches = 0;
|
|
363
|
+
const ttfts = [];
|
|
364
|
+
for (const r of records) {
|
|
365
|
+
input += r.totals.inputTokens;
|
|
366
|
+
cacheRead += r.totals.cacheRead;
|
|
367
|
+
toolCalls += r.totals.toolCalls;
|
|
368
|
+
toolErrors += r.totals.toolErrors;
|
|
369
|
+
truncations += r.truncations.length;
|
|
370
|
+
compactions += r.compactions.length;
|
|
371
|
+
modelSwitches += r.modelSwitches.length;
|
|
372
|
+
for (const x of r.turns)
|
|
373
|
+
if (typeof x.ttftMs === "number")
|
|
374
|
+
ttfts.push(x.ttftMs);
|
|
375
|
+
for (const [name, s] of Object.entries(r.toolStats)) {
|
|
376
|
+
const agg = toolAgg.get(name) ?? { calls: 0, errors: 0, maxMs: 0, totalMs: 0 };
|
|
377
|
+
agg.calls += s.calls;
|
|
378
|
+
agg.errors += s.errors + (s.softErrors ?? 0);
|
|
379
|
+
agg.maxMs = Math.max(agg.maxMs, s.maxMs);
|
|
380
|
+
agg.totalMs += s.totalMs;
|
|
381
|
+
toolAgg.set(name, agg);
|
|
382
|
+
}
|
|
383
|
+
for (const c of r.errorClusters)
|
|
384
|
+
clusterAgg.set(c.digest, (clusterAgg.get(c.digest) ?? 0) + c.count);
|
|
385
|
+
for (const rep of r.repeats) {
|
|
386
|
+
const key = `${rep.tool}::${rep.argsDigest}`;
|
|
387
|
+
repeatAgg.set(key, (repeatAgg.get(key) ?? 0) + rep.count);
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
const promptTotal = input + cacheRead;
|
|
391
|
+
findings.push(`${records.length} sessions — ${toolCalls} tool calls, ${toolErrors} errors (${pct(toolErrors, toolCalls)}), cache reuse ${pct(cacheRead, promptTotal)} across ${(promptTotal / 1000).toFixed(0)}k prompt tokens.`);
|
|
392
|
+
// 1. Error clusters — reliability, ranked by count.
|
|
393
|
+
const clusters = [...clusterAgg.entries()].sort((a, b) => b[1] - a[1]).slice(0, 5);
|
|
394
|
+
if (clusters.length) {
|
|
395
|
+
findings.push("CHECK OUT — recurring errors:", ...clusters.map(([digest, n]) => `- ${n}× ${digest}`));
|
|
396
|
+
}
|
|
397
|
+
// 2. High-failure-rate tools.
|
|
398
|
+
const flaky = [...toolAgg.entries()]
|
|
399
|
+
.filter(([, s]) => s.calls >= 5 && s.errors / s.calls >= 0.25)
|
|
400
|
+
.sort((a, b) => b[1].errors / b[1].calls - a[1].errors / a[1].calls);
|
|
401
|
+
if (flaky.length) {
|
|
402
|
+
findings.push("CHECK OUT — tools failing ≥25% of calls:", ...flaky.map(([name, s]) => `- ${name}: ${s.errors}/${s.calls} (${pct(s.errors, s.calls)})`));
|
|
403
|
+
}
|
|
404
|
+
// 3. Slow tools — worst-case duration.
|
|
405
|
+
const slow = [...toolAgg.entries()]
|
|
406
|
+
.filter(([, s]) => s.maxMs >= 30_000)
|
|
407
|
+
.sort((a, b) => b[1].maxMs - a[1].maxMs);
|
|
408
|
+
if (slow.length) {
|
|
409
|
+
findings.push("SPEED — tools with ≥30s worst-case calls:", ...slow.map(([name, s]) => `- ${name}: max ${fmtMs(s.maxMs)}, total ${fmtMs(s.totalMs)}`));
|
|
410
|
+
}
|
|
411
|
+
// 4. Repeats — wasted turns.
|
|
412
|
+
const repeats = [...repeatAgg.entries()].sort((a, b) => b[1] - a[1]).slice(0, 5);
|
|
413
|
+
if (repeats.length) {
|
|
414
|
+
findings.push("WASTE — identical calls repeated ≥3× (stuck patterns):", ...repeats.map(([key]) => `- ${key.replace("::", " ")}`));
|
|
415
|
+
}
|
|
416
|
+
// 5. Cache + compaction pressure.
|
|
417
|
+
if (modelSwitches > 0) {
|
|
418
|
+
findings.push(`COST — ${modelSwitches} mid-session model switch(es): each one can rebuild the cached prefix and re-bill the whole context.`);
|
|
419
|
+
}
|
|
420
|
+
if (compactions > 0)
|
|
421
|
+
findings.push(`COST — ${compactions} compaction(s) across these sessions.`);
|
|
422
|
+
if (truncations > 0)
|
|
423
|
+
findings.push(`RELIABILITY — output cut off ${truncations}× (output-token limits).`);
|
|
424
|
+
if (ttfts.length) {
|
|
425
|
+
const sorted = [...ttfts].sort((a, b) => a - b);
|
|
426
|
+
findings.push(`SPEED — TTFT median ${fmtMs(sorted[Math.floor(sorted.length / 2)])}, p95 ${fmtMs(sorted[Math.floor(sorted.length * 0.95)])} over ${ttfts.length} turns.`);
|
|
427
|
+
}
|
|
428
|
+
// What's working — the counterfactual baseline.
|
|
429
|
+
const healthy = [...toolAgg.entries()].filter(([, s]) => s.calls >= 5 && s.errors === 0);
|
|
430
|
+
if (healthy.length) {
|
|
431
|
+
findings.push(`WORKING — zero-error tools (≥5 calls): ${healthy.map(([n]) => n).join(", ")}.`);
|
|
432
|
+
}
|
|
433
|
+
return { sessionCount: records.length, report: findings.join("\n") };
|
|
434
|
+
}
|
|
435
|
+
// ── /diagnose slash command ────────────────────────────────
|
|
436
|
+
/** Internal-only command; registered exclusively when the internal flag is on. */
|
|
437
|
+
export function createDiagnoseCommand() {
|
|
438
|
+
return {
|
|
439
|
+
name: "diagnose",
|
|
440
|
+
aliases: ["diag"],
|
|
441
|
+
description: "Internal: aggregate recent session diagnostics into ranked findings",
|
|
442
|
+
usage: "/diagnose [sessions]",
|
|
443
|
+
execute(args) {
|
|
444
|
+
const parsed = Number.parseInt(args.trim(), 10);
|
|
445
|
+
const limit = Number.isFinite(parsed) && parsed > 0 ? Math.min(parsed, 100) : 20;
|
|
446
|
+
return aggregateRecentDiagnostics(limit).report;
|
|
447
|
+
},
|
|
448
|
+
};
|
|
449
|
+
}
|
|
450
|
+
//# sourceMappingURL=internal-diagnostics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internal-diagnostics.js","sourceRoot":"","sources":["../../src/core/internal-diagnostics.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export interface SlashCommandContext {
|
|
2
2
|
switchModel: (provider: string, model: string) => Promise<void>;
|
|
3
|
-
compact:
|
|
3
|
+
/** Compact now. `focus` is the user's `/compact <focus>` text: a short
|
|
4
|
+
* description of what must survive the summary verbatim. */
|
|
5
|
+
compact: (focus?: string) => Promise<void>;
|
|
4
6
|
newSession: () => Promise<void>;
|
|
5
7
|
listSessions: () => Promise<string>;
|
|
6
8
|
getSettings: () => Record<string, unknown>;
|
|
@@ -77,10 +77,12 @@ export function createBuiltinCommands() {
|
|
|
77
77
|
name: "compact",
|
|
78
78
|
aliases: ["c"],
|
|
79
79
|
description: "Compact conversation to reduce context usage",
|
|
80
|
-
usage: "/compact",
|
|
81
|
-
async execute(
|
|
82
|
-
await ctx.compact();
|
|
83
|
-
return
|
|
80
|
+
usage: "/compact [focus]",
|
|
81
|
+
async execute(args, ctx) {
|
|
82
|
+
await ctx.compact(args.trim() || undefined);
|
|
83
|
+
return args.trim()
|
|
84
|
+
? `Conversation compacted (focus: ${args.trim()}).`
|
|
85
|
+
: "Conversation compacted.";
|
|
84
86
|
},
|
|
85
87
|
},
|
|
86
88
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slash-commands.js","sourceRoot":"","sources":["../../src/core/slash-commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"slash-commands.js","sourceRoot":"","sources":["../../src/core/slash-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal-only `session_stats` tool — NOT part of the public tool set.
|
|
3
|
+
*
|
|
4
|
+
* Registered by AgentSession exclusively when internal diagnostics are
|
|
5
|
+
* enabled (env `GG_INTERNAL=1` or `~/.gg/internal.json` with
|
|
6
|
+
* `diagnostics: true`). Gives the agent live visibility into its own
|
|
7
|
+
* session — token spend, cache reuse, per-tool cost and errors, repeated
|
|
8
|
+
* calls — plus an optional cross-session aggregate, so it can notice waste
|
|
9
|
+
* and self-correct instead of spinning.
|
|
10
|
+
*/
|
|
11
|
+
import { z } from "zod";
|
|
12
|
+
import type { AgentTool } from "@kenkaiiii/gg-agent";
|
|
13
|
+
import { type SessionDiagnosticsRecorder } from "../core/internal-diagnostics.js";
|
|
14
|
+
declare const SessionStatsParams: z.ZodObject<{
|
|
15
|
+
recent_sessions: z.ZodOptional<z.ZodNumber>;
|
|
16
|
+
}, z.core.$strip>;
|
|
17
|
+
export interface SessionStatsSource {
|
|
18
|
+
summary(): string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* @param getCurrent Recorder for the live session, if internal mode is on and
|
|
22
|
+
* the session has one. The lazy getter keeps tool creation decoupled from
|
|
23
|
+
* recorder lifecycle (the recorder is created during session init).
|
|
24
|
+
*/
|
|
25
|
+
export declare function createSessionStatsTool(getCurrent: () => (SessionDiagnosticsRecorder & SessionStatsSource) | undefined): AgentTool<typeof SessionStatsParams>;
|
|
26
|
+
export {};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal-only `session_stats` tool — NOT part of the public tool set.
|
|
3
|
+
*
|
|
4
|
+
* Registered by AgentSession exclusively when internal diagnostics are
|
|
5
|
+
* enabled (env `GG_INTERNAL=1` or `~/.gg/internal.json` with
|
|
6
|
+
* `diagnostics: true`). Gives the agent live visibility into its own
|
|
7
|
+
* session — token spend, cache reuse, per-tool cost and errors, repeated
|
|
8
|
+
* calls — plus an optional cross-session aggregate, so it can notice waste
|
|
9
|
+
* and self-correct instead of spinning.
|
|
10
|
+
*/
|
|
11
|
+
import { z } from "zod";
|
|
12
|
+
import { aggregateRecentDiagnostics, } from "../core/internal-diagnostics.js";
|
|
13
|
+
const SessionStatsParams = z.object({
|
|
14
|
+
recent_sessions: z
|
|
15
|
+
.number()
|
|
16
|
+
.int()
|
|
17
|
+
.min(1)
|
|
18
|
+
.max(50)
|
|
19
|
+
.optional()
|
|
20
|
+
.describe("Also append an aggregate over the N most recent sessions (default: current session only)"),
|
|
21
|
+
});
|
|
22
|
+
/**
|
|
23
|
+
* @param getCurrent Recorder for the live session, if internal mode is on and
|
|
24
|
+
* the session has one. The lazy getter keeps tool creation decoupled from
|
|
25
|
+
* recorder lifecycle (the recorder is created during session init).
|
|
26
|
+
*/
|
|
27
|
+
export function createSessionStatsTool(getCurrent) {
|
|
28
|
+
return {
|
|
29
|
+
name: "session_stats",
|
|
30
|
+
description: "Read this session's live efficiency stats: token spend, cache reuse, per-tool time/errors, " +
|
|
31
|
+
"repeated identical calls, compactions. Use it when you suspect you are looping, re-reading, " +
|
|
32
|
+
"or burning tokens, and change approach based on what it shows.",
|
|
33
|
+
parameters: SessionStatsParams,
|
|
34
|
+
async execute({ recent_sessions }) {
|
|
35
|
+
const current = getCurrent();
|
|
36
|
+
const parts = [];
|
|
37
|
+
if (current) {
|
|
38
|
+
parts.push("=== Current session ===", current.summary());
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
parts.push("No live recorder for this session (internal diagnostics disabled mid-session?).");
|
|
42
|
+
}
|
|
43
|
+
if (recent_sessions) {
|
|
44
|
+
const agg = aggregateRecentDiagnostics(recent_sessions);
|
|
45
|
+
parts.push("", `=== Last ${agg.sessionCount} session(s) ===`, agg.report);
|
|
46
|
+
}
|
|
47
|
+
return parts.join("\n");
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=session-stats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-stats.js","sourceRoot":"","sources":["../../src/tools/session-stats.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EACL,0BAA0B,GAE3B,MAAM,iCAAiC,CAAC;AAEzC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,eAAe,EAAE,CAAC;SACf,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,EAAE,CAAC;SACP,QAAQ,EAAE;SACV,QAAQ,CACP,0FAA0F,CAC3F;CACJ,CAAC,CAAC;AAMH;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CACpC,UAA+E;IAE/E,OAAO;QACL,IAAI,EAAE,eAAe;QACrB,WAAW,EACT,6FAA6F;YAC7F,8FAA8F;YAC9F,gEAAgE;QAClE,UAAU,EAAE,kBAAkB;QAC9B,KAAK,CAAC,OAAO,CAAC,EAAE,eAAe,EAAE;YAC/B,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,IAAI,OAAO,EAAE,CAAC;gBACZ,KAAK,CAAC,IAAI,CAAC,yBAAyB,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;YAC3D,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CACR,iFAAiF,CAClF,CAAC;YACJ,CAAC;YACD,IAAI,eAAe,EAAE,CAAC;gBACpB,MAAM,GAAG,GAAG,0BAA0B,CAAC,eAAe,CAAC,CAAC;gBACxD,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,YAAY,GAAG,CAAC,YAAY,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;YAC5E,CAAC;YACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kenkaiiii/ggcoder",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.60.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "CLI coding agent with OAuth authentication for Anthropic, OpenAI, and Gemini",
|
|
6
6
|
"license": "MIT",
|
|
@@ -114,9 +114,9 @@
|
|
|
114
114
|
"typescript-language-server": "^5.3.0",
|
|
115
115
|
"wrap-ansi": "^10.0.0",
|
|
116
116
|
"zod": "^4.4.3",
|
|
117
|
-
"@kenkaiiii/gg-agent": "5.
|
|
118
|
-
"@kenkaiiii/gg-ai": "5.
|
|
119
|
-
"@kenkaiiii/gg-core": "5.
|
|
117
|
+
"@kenkaiiii/gg-agent": "5.60.0",
|
|
118
|
+
"@kenkaiiii/gg-ai": "5.60.0",
|
|
119
|
+
"@kenkaiiii/gg-core": "5.60.0"
|
|
120
120
|
},
|
|
121
121
|
"optionalDependencies": {
|
|
122
122
|
"@huggingface/transformers": "^3.6.0",
|