clawprobe 0.2.2 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/commands/context.d.ts.map +1 -1
- package/dist/cli/commands/context.js +162 -38
- package/dist/cli/commands/context.js.map +1 -1
- package/dist/cli/commands/session.d.ts.map +1 -1
- package/dist/cli/commands/session.js +72 -35
- package/dist/cli/commands/session.js.map +1 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +30 -32
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/core/jsonl-parser.d.ts +77 -13
- package/dist/core/jsonl-parser.d.ts.map +1 -1
- package/dist/core/jsonl-parser.js +158 -8
- package/dist/core/jsonl-parser.js.map +1 -1
- package/dist/core/session-store.d.ts +12 -0
- package/dist/core/session-store.d.ts.map +1 -1
- package/dist/core/session-store.js +9 -0
- package/dist/core/session-store.js.map +1 -1
- package/dist/engines/cost.d.ts +9 -0
- package/dist/engines/cost.d.ts.map +1 -1
- package/dist/engines/cost.js +33 -0
- package/dist/engines/cost.js.map +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/context.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/context.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAStD,UAAU,cAAc;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAuCD,wBAAsB,UAAU,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA6KzF"}
|
|
@@ -1,67 +1,191 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import path from "path";
|
|
1
3
|
import { openDb } from "../../core/db.js";
|
|
2
4
|
import { getActiveSession } from "../../core/session-store.js";
|
|
3
|
-
import {
|
|
5
|
+
import { parseSessionStats } from "../../core/jsonl-parser.js";
|
|
6
|
+
import { analyzeWorkspaceFiles } from "../../engines/file-analyzer.js";
|
|
4
7
|
import { header, makeTable, fmtTokens, truncBadge, outputJson, severity, getWindowSize, } from "../format.js";
|
|
8
|
+
/** Rough token estimate: chars / 4 */
|
|
9
|
+
function estTok(chars) {
|
|
10
|
+
return Math.ceil(chars / 4);
|
|
11
|
+
}
|
|
12
|
+
function fmtTok(n) {
|
|
13
|
+
return `~${fmtTokens(n)} tok`;
|
|
14
|
+
}
|
|
15
|
+
/** Try to read a text file from the workspace dir */
|
|
16
|
+
function readWsFile(workspaceDir, name) {
|
|
17
|
+
const p = path.join(workspaceDir, name);
|
|
18
|
+
if (!fs.existsSync(p))
|
|
19
|
+
return null;
|
|
20
|
+
try {
|
|
21
|
+
return fs.readFileSync(p, "utf-8");
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function scanSkills(workspaceDir) {
|
|
28
|
+
const results = [];
|
|
29
|
+
if (!fs.existsSync(workspaceDir))
|
|
30
|
+
return results;
|
|
31
|
+
// skills/ subdirectory
|
|
32
|
+
const skillsDir = path.join(workspaceDir, "skills");
|
|
33
|
+
if (fs.existsSync(skillsDir) && fs.statSync(skillsDir).isDirectory()) {
|
|
34
|
+
for (const f of fs.readdirSync(skillsDir)) {
|
|
35
|
+
if (f.endsWith(".md") || f.endsWith(".txt")) {
|
|
36
|
+
try {
|
|
37
|
+
const content = fs.readFileSync(path.join(skillsDir, f), "utf-8");
|
|
38
|
+
results.push({ name: path.basename(f, path.extname(f)), chars: content.length });
|
|
39
|
+
}
|
|
40
|
+
catch { /* skip */ }
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return results.sort((a, b) => b.chars - a.chars);
|
|
45
|
+
}
|
|
5
46
|
export async function runContext(cfg, opts) {
|
|
6
47
|
const agent = opts.agent ?? cfg.probe.openclaw.agent;
|
|
7
48
|
const db = openDb(cfg.probeDir);
|
|
8
|
-
const analysis =
|
|
49
|
+
const analysis = analyzeWorkspaceFiles(cfg.workspaceDir, cfg.bootstrapMaxChars);
|
|
9
50
|
const activeSession = getActiveSession(cfg.sessionsDir);
|
|
10
|
-
|
|
11
|
-
const
|
|
51
|
+
// Read jsonl transcript for accurate context token count
|
|
52
|
+
const transcriptPath = activeSession
|
|
53
|
+
? path.join(cfg.sessionsDir, `${activeSession.sessionKey}.jsonl`)
|
|
54
|
+
: null;
|
|
55
|
+
const jsonlStats = transcriptPath && fs.existsSync(transcriptPath)
|
|
56
|
+
? parseSessionStats(transcriptPath)
|
|
57
|
+
: null;
|
|
58
|
+
// sessionTokens = actual context usage (from last assistant usage.totalTokens in jsonl)
|
|
59
|
+
const sessionTokens = jsonlStats?.lastTotalTokens ?? activeSession?.sessionTokens ?? 0;
|
|
60
|
+
const windowSize = (activeSession?.windowSize || activeSession?.contextTokens) ?? 0;
|
|
61
|
+
const model = jsonlStats?.model ?? activeSession?.modelOverride ?? null;
|
|
62
|
+
const resolvedWindowSize = getWindowSize(model, windowSize || sessionTokens);
|
|
63
|
+
// ── Estimate fixed-cost components ──────────────────────────────────────
|
|
64
|
+
// System prompt: read SOUL.md as proxy if present; otherwise estimate from known agents
|
|
65
|
+
const soulContent = readWsFile(cfg.workspaceDir, "SOUL.md") ?? "";
|
|
66
|
+
const agentsContent = readWsFile(cfg.workspaceDir, "AGENTS.md") ?? "";
|
|
67
|
+
const identityContent = readWsFile(cfg.workspaceDir, "IDENTITY.md") ?? "";
|
|
68
|
+
const heartbeatContent = readWsFile(cfg.workspaceDir, "HEARTBEAT.md") ?? "";
|
|
69
|
+
const bootstrapContent = readWsFile(cfg.workspaceDir, "BOOTSTRAP.md") ?? "";
|
|
70
|
+
// Skills
|
|
71
|
+
const skills = scanSkills(cfg.workspaceDir);
|
|
72
|
+
const skillsChars = skills.reduce((s, sk) => s + sk.chars, 0);
|
|
73
|
+
// Workspace files total (injected)
|
|
74
|
+
const wsFiles = analysis.files;
|
|
75
|
+
const wsTotalInjectedChars = wsFiles.reduce((s, f) => s + f.injectedChars, 0);
|
|
76
|
+
const wsTotalInjectedTokens = wsFiles.reduce((s, f) => s + f.injectedEstTokens, 0);
|
|
77
|
+
// Session history = sessionTokens - all fixed overhead
|
|
78
|
+
// Fixed overhead = workspace files + system prompt estimate
|
|
79
|
+
const fixedOverheadTokens = wsTotalInjectedTokens;
|
|
80
|
+
const sessionHistoryTokens = sessionTokens > fixedOverheadTokens
|
|
81
|
+
? sessionTokens - fixedOverheadTokens
|
|
82
|
+
: sessionTokens > 0 ? sessionTokens : 0;
|
|
12
83
|
if (opts.json) {
|
|
13
84
|
outputJson({
|
|
14
85
|
agent,
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
86
|
+
workspaceDir: cfg.workspaceDir,
|
|
87
|
+
bootstrapMaxChars: cfg.bootstrapMaxChars,
|
|
88
|
+
sessionTokens,
|
|
89
|
+
windowSize: resolvedWindowSize,
|
|
90
|
+
utilizationPct: resolvedWindowSize > 0 ? Math.round(sessionTokens / resolvedWindowSize * 100) : 0,
|
|
91
|
+
workspaceFiles: wsFiles.map((f) => ({
|
|
19
92
|
name: f.name,
|
|
20
93
|
rawChars: f.rawChars,
|
|
21
94
|
injectedChars: f.injectedChars,
|
|
22
95
|
wasTruncated: f.wasTruncated,
|
|
23
|
-
|
|
24
|
-
lostPercent: Math.round(f.lostPercent),
|
|
25
|
-
estTokens: f.estTokens,
|
|
26
|
-
injectedEstTokens: f.injectedEstTokens,
|
|
96
|
+
estTokens: f.injectedEstTokens,
|
|
27
97
|
})),
|
|
98
|
+
sessionHistoryTokensEst: sessionHistoryTokens,
|
|
28
99
|
});
|
|
29
100
|
return;
|
|
30
101
|
}
|
|
31
102
|
header("🔍", "Context Analysis", `agent: ${agent}`);
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
f.wasTruncated
|
|
40
|
-
? `${f.injectedChars.toLocaleString()} chars`
|
|
41
|
-
: `${f.injectedChars.toLocaleString()} chars`,
|
|
42
|
-
`~${fmtTokens(f.injectedEstTokens)}`,
|
|
43
|
-
truncBadge(f.wasTruncated),
|
|
44
|
-
]);
|
|
103
|
+
// ── Overall context bar ──────────────────────────────────────────────────
|
|
104
|
+
if (sessionTokens > 0) {
|
|
105
|
+
const { tokenBar } = await import("../format.js");
|
|
106
|
+
const pct = Math.round(sessionTokens / resolvedWindowSize * 100);
|
|
107
|
+
console.log(` Context used: ${fmtTokens(sessionTokens)} / ${fmtTokens(resolvedWindowSize)} tokens ` +
|
|
108
|
+
`${tokenBar(sessionTokens, resolvedWindowSize)} ${pct}%`);
|
|
109
|
+
console.log();
|
|
45
110
|
}
|
|
46
|
-
|
|
47
|
-
|
|
111
|
+
else {
|
|
112
|
+
console.log(severity.muted(` Context window: ${fmtTokens(resolvedWindowSize)} tokens (actual usage not available)`));
|
|
48
113
|
console.log();
|
|
49
|
-
for (const f of analysis.truncatedFiles) {
|
|
50
|
-
console.log(severity.warning(` ⚠ ${f.name}: ${f.lostChars.toLocaleString()} chars (${Math.round(f.lostPercent)}%) are never seen by the model`));
|
|
51
|
-
}
|
|
52
114
|
}
|
|
115
|
+
// ── Workspace directory info ─────────────────────────────────────────────
|
|
116
|
+
console.log(severity.muted(` Workspace: ${cfg.workspaceDir}`));
|
|
117
|
+
console.log(severity.muted(` Bootstrap max: ${cfg.bootstrapMaxChars.toLocaleString()} chars / file`));
|
|
118
|
+
console.log();
|
|
119
|
+
// ── Injected workspace files ─────────────────────────────────────────────
|
|
120
|
+
console.log(severity.bold(" Injected workspace files:"));
|
|
53
121
|
console.log();
|
|
54
|
-
|
|
122
|
+
if (wsFiles.length === 0) {
|
|
123
|
+
console.log(severity.muted(" (none found)"));
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
const table = makeTable(["File", "Raw", "Injected", "~Tokens", "Status"], [18, 14, 14, 10, 12]);
|
|
127
|
+
for (const f of wsFiles) {
|
|
128
|
+
table.push([
|
|
129
|
+
f.name,
|
|
130
|
+
`${f.rawChars.toLocaleString()} chars`,
|
|
131
|
+
`${f.injectedChars.toLocaleString()} chars`,
|
|
132
|
+
fmtTok(f.injectedEstTokens),
|
|
133
|
+
truncBadge(f.wasTruncated),
|
|
134
|
+
]);
|
|
135
|
+
}
|
|
136
|
+
console.log(table.toString());
|
|
137
|
+
if (analysis.truncatedFiles.length > 0) {
|
|
138
|
+
for (const f of analysis.truncatedFiles) {
|
|
139
|
+
console.log(severity.warning(` ⚠ ${f.name}: ${f.lostChars.toLocaleString()} chars (${Math.round(f.lostPercent)}%) truncated — model never sees this content`));
|
|
140
|
+
}
|
|
141
|
+
console.log();
|
|
142
|
+
}
|
|
143
|
+
console.log(` Workspace subtotal: ~${fmtTokens(wsTotalInjectedTokens)} tokens ` +
|
|
144
|
+
severity.muted(`(${wsFiles.length} files, ${wsTotalInjectedChars.toLocaleString()} chars injected)`));
|
|
145
|
+
}
|
|
55
146
|
console.log();
|
|
56
|
-
|
|
57
|
-
if (
|
|
58
|
-
console.log(`
|
|
147
|
+
// ── Skills (if found) ────────────────────────────────────────────────────
|
|
148
|
+
if (skills.length > 0) {
|
|
149
|
+
console.log(severity.bold(` Skills (${skills.length} loaded):`));
|
|
150
|
+
console.log();
|
|
151
|
+
const skillTable = makeTable(["Skill", "Chars", "~Tokens"], [24, 12, 12]);
|
|
152
|
+
for (const sk of skills.slice(0, 10)) {
|
|
153
|
+
skillTable.push([sk.name, sk.chars.toLocaleString(), fmtTok(estTok(sk.chars))]);
|
|
154
|
+
}
|
|
155
|
+
if (skills.length > 10) {
|
|
156
|
+
skillTable.push([`… +${skills.length - 10} more`, "", ""]);
|
|
157
|
+
}
|
|
158
|
+
console.log(skillTable.toString());
|
|
159
|
+
console.log(` Skills subtotal: ~${fmtTokens(estTok(skillsChars))} tokens`);
|
|
160
|
+
console.log();
|
|
59
161
|
}
|
|
60
|
-
|
|
61
|
-
if (
|
|
62
|
-
|
|
63
|
-
console.log(
|
|
162
|
+
// ── Session history estimate ─────────────────────────────────────────────
|
|
163
|
+
if (sessionTokens > 0) {
|
|
164
|
+
console.log(severity.bold(" Session history estimate:"));
|
|
165
|
+
console.log();
|
|
166
|
+
console.log(` Total in context: ${fmtTokens(sessionTokens)} tokens`);
|
|
167
|
+
console.log(` Fixed overhead: ~${fmtTokens(fixedOverheadTokens)} tokens ` +
|
|
168
|
+
severity.muted("(workspace files)"));
|
|
169
|
+
console.log(` Conversation est: ~${fmtTokens(sessionHistoryTokens)} tokens ` +
|
|
170
|
+
severity.muted("(messages + system prompt + tools)"));
|
|
171
|
+
console.log();
|
|
172
|
+
console.log(severity.muted(" Note: For exact breakdown, run: /context detail inside OpenClaw"));
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
console.log(severity.muted(" Session token data not available."));
|
|
176
|
+
console.log(severity.muted(" Start a session and ensure the daemon is running: clawprobe start"));
|
|
64
177
|
}
|
|
65
178
|
console.log();
|
|
179
|
+
// ── Remaining headroom ───────────────────────────────────────────────────
|
|
180
|
+
if (sessionTokens > 0 && resolvedWindowSize > 0) {
|
|
181
|
+
const remaining = resolvedWindowSize - sessionTokens;
|
|
182
|
+
const remainingPct = Math.round(remaining / resolvedWindowSize * 100);
|
|
183
|
+
console.log(severity.bold(" Remaining headroom:") +
|
|
184
|
+
` ${fmtTokens(remaining)} tokens (${remainingPct}%)`);
|
|
185
|
+
if (remaining < resolvedWindowSize * 0.1) {
|
|
186
|
+
console.log(severity.warning(" ⚠ Less than 10% context remaining — compaction may be needed soon"));
|
|
187
|
+
}
|
|
188
|
+
console.log();
|
|
189
|
+
}
|
|
66
190
|
}
|
|
67
191
|
//# sourceMappingURL=context.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/cli/commands/context.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/cli/commands/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EACL,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,GAC9E,MAAM,cAAc,CAAC;AAOtB,sCAAsC;AACtC,SAAS,MAAM,CAAC,KAAa;IAC3B,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,MAAM,CAAC,CAAS;IACvB,OAAO,IAAI,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;AAChC,CAAC;AAED,qDAAqD;AACrD,SAAS,UAAU,CAAC,YAAoB,EAAE,IAAY;IACpD,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IACxC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,CAAC;QAAC,OAAO,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;AACpE,CAAC;AAID,SAAS,UAAU,CAAC,YAAoB;IACtC,MAAM,OAAO,GAAgB,EAAE,CAAC;IAChC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,OAAO,CAAC;IAEjD,uBAAuB;IACvB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IACpD,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QACrE,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1C,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC5C,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;oBAClE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;gBACnF,CAAC;gBAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAmB,EAAE,IAAoB;IACxE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;IACrD,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAEhC,MAAM,QAAQ,GAAG,qBAAqB,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAChF,MAAM,aAAa,GAAG,gBAAgB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAExD,yDAAyD;IACzD,MAAM,cAAc,GAAG,aAAa;QAClC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,aAAa,CAAC,UAAU,QAAQ,CAAC;QACjE,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,UAAU,GAAG,cAAc,IAAI,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC;QAChE,CAAC,CAAC,iBAAiB,CAAC,cAAc,CAAC;QACnC,CAAC,CAAC,IAAI,CAAC;IAET,wFAAwF;IACxF,MAAM,aAAa,GAAG,UAAU,EAAE,eAAe,IAAI,aAAa,EAAE,aAAa,IAAI,CAAC,CAAC;IACvF,MAAM,UAAU,GAAG,CAAC,aAAa,EAAE,UAAU,IAAI,aAAa,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;IACpF,MAAM,KAAK,GAAG,UAAU,EAAE,KAAK,IAAI,aAAa,EAAE,aAAa,IAAI,IAAI,CAAC;IACxE,MAAM,kBAAkB,GAAG,aAAa,CAAC,KAAK,EAAE,UAAU,IAAI,aAAa,CAAC,CAAC;IAE7E,2EAA2E;IAC3E,wFAAwF;IACxF,MAAM,WAAW,GAAG,UAAU,CAAC,GAAG,CAAC,YAAY,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC;IAClE,MAAM,aAAa,GAAG,UAAU,CAAC,GAAG,CAAC,YAAY,EAAE,WAAW,CAAC,IAAI,EAAE,CAAC;IACtE,MAAM,eAAe,GAAG,UAAU,CAAC,GAAG,CAAC,YAAY,EAAE,aAAa,CAAC,IAAI,EAAE,CAAC;IAC1E,MAAM,gBAAgB,GAAG,UAAU,CAAC,GAAG,CAAC,YAAY,EAAE,cAAc,CAAC,IAAI,EAAE,CAAC;IAC5E,MAAM,gBAAgB,GAAG,UAAU,CAAC,GAAG,CAAC,YAAY,EAAE,cAAc,CAAC,IAAI,EAAE,CAAC;IAE5E,SAAS;IACT,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC5C,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAE9D,mCAAmC;IACnC,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC;IAC/B,MAAM,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;IAC9E,MAAM,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC;IAEnF,uDAAuD;IACvD,4DAA4D;IAC5D,MAAM,mBAAmB,GAAG,qBAAqB,CAAC;IAClD,MAAM,oBAAoB,GAAG,aAAa,GAAG,mBAAmB;QAC9D,CAAC,CAAC,aAAa,GAAG,mBAAmB;QACrC,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IAE1C,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,UAAU,CAAC;YACT,KAAK;YACL,YAAY,EAAE,GAAG,CAAC,YAAY;YAC9B,iBAAiB,EAAE,GAAG,CAAC,iBAAiB;YACxC,aAAa;YACb,UAAU,EAAE,kBAAkB;YAC9B,cAAc,EAAE,kBAAkB,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,kBAAkB,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACjG,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAClC,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,QAAQ,EAAE,CAAC,CAAC,QAAQ;gBACpB,aAAa,EAAE,CAAC,CAAC,aAAa;gBAC9B,YAAY,EAAE,CAAC,CAAC,YAAY;gBAC5B,SAAS,EAAE,CAAC,CAAC,iBAAiB;aAC/B,CAAC,CAAC;YACH,uBAAuB,EAAE,oBAAoB;SAC9C,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,MAAM,CAAC,IAAI,EAAE,kBAAkB,EAAE,UAAU,KAAK,EAAE,CAAC,CAAC;IAEpD,4EAA4E;IAC5E,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QAClD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,kBAAkB,GAAG,GAAG,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,CACT,oBAAoB,SAAS,CAAC,aAAa,CAAC,MAAM,SAAS,CAAC,kBAAkB,CAAC,WAAW;YAC1F,GAAG,QAAQ,CAAC,aAAa,EAAE,kBAAkB,CAAC,KAAK,GAAG,GAAG,CAC1D,CAAC;QACF,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,qBAAqB,SAAS,CAAC,kBAAkB,CAAC,sCAAsC,CAAC,CAAC,CAAC;QACtH,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IAED,4EAA4E;IAC5E,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,uBAAuB,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,uBAAuB,GAAG,CAAC,iBAAiB,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC,CAAC;IAC1G,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,4EAA4E;IAC5E,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAClD,CAAC;SAAM,CAAC;QACN,MAAM,KAAK,GAAG,SAAS,CACrB,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,CAAC,EAChD,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CACrB,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC;gBACT,CAAC,CAAC,IAAI;gBACN,GAAG,CAAC,CAAC,QAAQ,CAAC,cAAc,EAAE,QAAQ;gBACtC,GAAG,CAAC,CAAC,aAAa,CAAC,cAAc,EAAE,QAAQ;gBAC3C,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC;gBAC3B,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC;aAC3B,CAAC,CAAC;QACL,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QAE9B,IAAI,QAAQ,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvC,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,cAAc,EAAE,CAAC;gBACxC,OAAO,CAAC,GAAG,CACT,QAAQ,CAAC,OAAO,CACd,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,SAAS,CAAC,cAAc,EAAE,WAAW,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,8CAA8C,CACjI,CACF,CAAC;YACJ,CAAC;YACD,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC;QAED,OAAO,CAAC,GAAG,CACT,2BAA2B,SAAS,CAAC,qBAAqB,CAAC,WAAW;YACtE,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,WAAW,oBAAoB,CAAC,cAAc,EAAE,kBAAkB,CAAC,CACrG,CAAC;IACJ,CAAC;IACD,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,4EAA4E;IAC5E,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,MAAM,WAAW,CAAC,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,MAAM,UAAU,GAAG,SAAS,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QAC1E,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YACrC,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAClF,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YACvB,UAAU,CAAC,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,MAAM,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,wBAAwB,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,CAAC;QAC7E,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IAED,4EAA4E;IAC5E,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,wBAAwB,SAAS,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,CAAC,yBAAyB,SAAS,CAAC,mBAAmB,CAAC,WAAW;YAC5E,QAAQ,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,yBAAyB,SAAS,CAAC,oBAAoB,CAAC,WAAW;YAC7E,QAAQ,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,oEAAoE,CAAC,CAAC,CAAC;IACpG,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC,CAAC;QACnE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,qEAAqE,CAAC,CAAC,CAAC;IACrG,CAAC;IAED,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,4EAA4E;IAC5E,IAAI,aAAa,GAAG,CAAC,IAAI,kBAAkB,GAAG,CAAC,EAAE,CAAC;QAChD,MAAM,SAAS,GAAG,kBAAkB,GAAG,aAAa,CAAC;QACrD,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,kBAAkB,GAAG,GAAG,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CACT,QAAQ,CAAC,IAAI,CAAC,uBAAuB,CAAC;YACtC,KAAK,SAAS,CAAC,SAAS,CAAC,YAAY,YAAY,IAAI,CACtD,CAAC;QACF,IAAI,SAAS,GAAG,kBAAkB,GAAG,GAAG,EAAE,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,qEAAqE,CAAC,CAAC,CAAC;QACvG,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/session.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/session.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AActD,UAAU,cAAc;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAoED,wBAAsB,UAAU,CAC9B,GAAG,EAAE,cAAc,EACnB,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,IAAI,CAAC,CAuIf"}
|
|
@@ -1,20 +1,66 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
1
|
+
import path from "path";
|
|
2
|
+
import fs from "fs";
|
|
3
|
+
import { getActiveSession, readSessionsStore, listJsonlFiles, sessionKeyFromPath } from "../../core/session-store.js";
|
|
4
|
+
import { parseSessionStats } from "../../core/jsonl-parser.js";
|
|
5
|
+
import { getSessionCostFromJsonl, estimateCost, sessionCostFromEntry, } from "../../engines/cost.js";
|
|
4
6
|
import chalk from "chalk";
|
|
5
7
|
import { header, fmtUsd, fmtTokens, fmtDate, fmtDuration, makeTable, outputJson, severity, } from "../format.js";
|
|
8
|
+
/**
|
|
9
|
+
* Load session cost from the jsonl transcript — the authoritative source.
|
|
10
|
+
* Falls back to sessions.json summary if no transcript is found.
|
|
11
|
+
*/
|
|
12
|
+
function loadSessionCost(sessionsDir, sessionKey, customPrices) {
|
|
13
|
+
// Transcript path: sessions dir + sessionKey + .jsonl (for UUID-based keys)
|
|
14
|
+
// or derive from the key itself
|
|
15
|
+
const candidates = [
|
|
16
|
+
path.join(sessionsDir, `${sessionKey}.jsonl`),
|
|
17
|
+
];
|
|
18
|
+
for (const p of candidates) {
|
|
19
|
+
if (fs.existsSync(p)) {
|
|
20
|
+
const stats = parseSessionStats(p);
|
|
21
|
+
if (stats) {
|
|
22
|
+
return getSessionCostFromJsonl(stats, sessionKey, customPrices);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
// Fall back to sessions.json
|
|
27
|
+
const liveEntry = readSessionsStore(sessionsDir).find((e) => e.sessionKey === sessionKey);
|
|
28
|
+
if (liveEntry) {
|
|
29
|
+
return sessionCostFromEntry(liveEntry, customPrices);
|
|
30
|
+
}
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Discover all session keys by scanning .jsonl files + sessions.json.
|
|
35
|
+
*/
|
|
36
|
+
function discoverAllSessions(sessionsDir, customPrices) {
|
|
37
|
+
const costs = [];
|
|
38
|
+
const seenKeys = new Set();
|
|
39
|
+
// Primary: scan all .jsonl files
|
|
40
|
+
for (const jsonlPath of listJsonlFiles(sessionsDir)) {
|
|
41
|
+
const key = sessionKeyFromPath(jsonlPath);
|
|
42
|
+
if (seenKeys.has(key))
|
|
43
|
+
continue;
|
|
44
|
+
seenKeys.add(key);
|
|
45
|
+
const stats = parseSessionStats(jsonlPath);
|
|
46
|
+
if (stats) {
|
|
47
|
+
costs.push(getSessionCostFromJsonl(stats, key, customPrices));
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// Supplement: add any sessions.json entries not found as .jsonl files
|
|
51
|
+
for (const entry of readSessionsStore(sessionsDir)) {
|
|
52
|
+
if (!seenKeys.has(entry.sessionKey)) {
|
|
53
|
+
seenKeys.add(entry.sessionKey);
|
|
54
|
+
costs.push(sessionCostFromEntry(entry, customPrices));
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return costs.sort((a, b) => b.lastActiveAt - a.lastActiveAt);
|
|
58
|
+
}
|
|
6
59
|
export async function runSession(cfg, sessionKeyArg, opts) {
|
|
7
60
|
const agent = opts.agent ?? cfg.probe.openclaw.agent;
|
|
8
|
-
const db = openDb(cfg.probeDir);
|
|
9
61
|
const customPrices = cfg.probe.cost.customPrices;
|
|
10
62
|
if (opts.list) {
|
|
11
|
-
|
|
12
|
-
const dbCosts = getAllSessionCosts(db, agent, customPrices);
|
|
13
|
-
const dbKeys = new Set(dbCosts.map((c) => c.sessionKey));
|
|
14
|
-
const liveEntries = readSessionsStore(cfg.sessionsDir)
|
|
15
|
-
.filter((e) => !dbKeys.has(e.sessionKey))
|
|
16
|
-
.map((e) => sessionCostFromEntry(e, customPrices));
|
|
17
|
-
const costs = [...dbCosts, ...liveEntries].sort((a, b) => b.lastActiveAt - a.lastActiveAt);
|
|
63
|
+
const costs = discoverAllSessions(cfg.sessionsDir, customPrices);
|
|
18
64
|
const active = getActiveSession(cfg.sessionsDir);
|
|
19
65
|
if (opts.json) {
|
|
20
66
|
outputJson(costs);
|
|
@@ -27,12 +73,14 @@ export async function runSession(cfg, sessionKeyArg, opts) {
|
|
|
27
73
|
return;
|
|
28
74
|
}
|
|
29
75
|
if (opts.full) {
|
|
30
|
-
// Full-width output: one session per line, no table truncation
|
|
31
76
|
for (const c of costs) {
|
|
32
77
|
const isActive = active?.sessionKey === c.sessionKey;
|
|
33
78
|
const activeTag = isActive ? chalk.green(" ●") : "";
|
|
34
79
|
console.log(` ${chalk.bold(c.sessionKey)}${activeTag}`);
|
|
35
|
-
console.log(` Model: ${c.model ?? "—"}
|
|
80
|
+
console.log(` Model: ${c.model ?? "—"} ` +
|
|
81
|
+
`In: ${fmtTokens(c.inputTokens)} Out: ${fmtTokens(c.outputTokens)} ` +
|
|
82
|
+
`Compacts: ${c.compactionCount} ` +
|
|
83
|
+
`Last: ${c.lastActiveAt > 0 ? fmtDate(c.lastActiveAt) : "—"}`);
|
|
36
84
|
console.log();
|
|
37
85
|
}
|
|
38
86
|
}
|
|
@@ -40,7 +88,6 @@ export async function runSession(cfg, sessionKeyArg, opts) {
|
|
|
40
88
|
const table = makeTable(["Session Key", "Model", "Tokens (in/out)", "Cost", "Compacts", "Last Active"], [30, 22, 18, 10, 10, 16]);
|
|
41
89
|
for (const c of costs) {
|
|
42
90
|
const isActive = active?.sessionKey === c.sessionKey;
|
|
43
|
-
// Show first 24 chars + ellipsis for readability; use --full for complete key
|
|
44
91
|
const keyDisplay = c.sessionKey.length > 25
|
|
45
92
|
? `${c.sessionKey.slice(0, 24)}…${isActive ? " ●" : ""}`
|
|
46
93
|
: `${c.sessionKey}${isActive ? " ●" : ""}`;
|
|
@@ -61,7 +108,7 @@ export async function runSession(cfg, sessionKeyArg, opts) {
|
|
|
61
108
|
console.log();
|
|
62
109
|
return;
|
|
63
110
|
}
|
|
64
|
-
// Single session view
|
|
111
|
+
// ── Single session view ───────────────────────────────────────────────────
|
|
65
112
|
let targetKey = sessionKeyArg;
|
|
66
113
|
if (!targetKey) {
|
|
67
114
|
const active = getActiveSession(cfg.sessionsDir);
|
|
@@ -71,17 +118,10 @@ export async function runSession(cfg, sessionKeyArg, opts) {
|
|
|
71
118
|
}
|
|
72
119
|
targetKey = active.sessionKey;
|
|
73
120
|
}
|
|
74
|
-
|
|
75
|
-
let cost = getSessionCost(db, agent, targetKey, customPrices);
|
|
76
|
-
if (!cost) {
|
|
77
|
-
const liveEntry = readSessionsStore(cfg.sessionsDir).find((e) => e.sessionKey === targetKey);
|
|
78
|
-
if (liveEntry) {
|
|
79
|
-
cost = sessionCostFromEntry(liveEntry, customPrices);
|
|
80
|
-
}
|
|
81
|
-
}
|
|
121
|
+
const cost = loadSessionCost(cfg.sessionsDir, targetKey, customPrices);
|
|
82
122
|
if (!cost) {
|
|
83
123
|
console.error(severity.critical(`No data found for session: ${targetKey}`));
|
|
84
|
-
console.log(severity.muted("
|
|
124
|
+
console.log(severity.muted(" Ensure OpenClaw is running and has written a transcript."));
|
|
85
125
|
process.exit(1);
|
|
86
126
|
}
|
|
87
127
|
if (opts.json) {
|
|
@@ -92,35 +132,32 @@ export async function runSession(cfg, sessionKeyArg, opts) {
|
|
|
92
132
|
console.log(` Agent: ${agent}`);
|
|
93
133
|
if (cost.model)
|
|
94
134
|
console.log(` Model: ${cost.model}`);
|
|
135
|
+
if (cost.provider)
|
|
136
|
+
console.log(` Provider: ${cost.provider}`);
|
|
95
137
|
if (cost.startedAt > 0) {
|
|
96
138
|
console.log(` Started: ${fmtDate(cost.startedAt)}`);
|
|
97
139
|
console.log(` Last active: ${fmtDate(cost.lastActiveAt)} (${fmtDuration(cost.durationMin)})`);
|
|
98
140
|
}
|
|
99
141
|
console.log(` Compactions: ${cost.compactionCount}`);
|
|
100
142
|
if (!cost.costAccurate) {
|
|
101
|
-
|
|
102
|
-
console.log(severity.warning(" ⚠ Showing live data from sessions.json (daemon not running — no per-turn breakdown)"));
|
|
103
|
-
}
|
|
104
|
-
else {
|
|
105
|
-
console.log(severity.muted(" ⚠ Cost may be understated (clawprobe was not running at session start)"));
|
|
106
|
-
}
|
|
143
|
+
console.log(severity.warning(" ⚠ Showing summary from sessions.json (no transcript found — no per-turn breakdown)"));
|
|
107
144
|
}
|
|
108
145
|
console.log();
|
|
109
146
|
console.log(severity.bold(" Token usage:"));
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
console.log(`
|
|
147
|
+
// inputTokens here = last turn's totalTokens (current context size)
|
|
148
|
+
// outputTokens = cumulative output across all turns
|
|
149
|
+
console.log(` Context now: ${fmtTokens(cost.inputTokens)} tokens`);
|
|
150
|
+
console.log(` Output total: ${fmtTokens(cost.outputTokens)} tokens ${fmtUsd(estimateCost({ input: 0, output: cost.outputTokens }, cost.model, customPrices))}`);
|
|
113
151
|
const showTurns = opts.turns !== false && cost.turns.length > 0;
|
|
114
152
|
if (showTurns) {
|
|
115
153
|
console.log();
|
|
116
154
|
console.log(severity.bold(" Turn-by-turn timeline:"));
|
|
117
155
|
console.log();
|
|
118
|
-
const maxUsd = Math.max(...cost.turns.map((t) => t.estimatedUsd), 0.001);
|
|
119
156
|
for (const turn of cost.turns) {
|
|
120
157
|
const compact = turn.compactOccurred ? severity.warning("← compact") : "";
|
|
121
158
|
const usdStr = turn.estimatedUsd > 0 ? fmtUsd(turn.estimatedUsd) : severity.muted("$0.00");
|
|
122
159
|
console.log(` Turn ${String(turn.turnIndex).padStart(2)} ${fmtDate(turn.timestamp)}` +
|
|
123
|
-
`
|
|
160
|
+
` ctx ${fmtTokens(turn.inputTokensDelta)} / out +${fmtTokens(turn.outputTokensDelta)}` +
|
|
124
161
|
` ${usdStr} ${compact}`);
|
|
125
162
|
}
|
|
126
163
|
const avgUsd = cost.turns.reduce((s, t) => s + t.estimatedUsd, 0) / cost.turns.length;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/cli/commands/session.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/cli/commands/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAUtD,UAAU,aAAa;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,SAAS,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAUtD,UAAU,aAAa;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,SAAS,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAmGvF"}
|
|
@@ -3,7 +3,7 @@ import path from "path";
|
|
|
3
3
|
import { openDb } from "../../core/db.js";
|
|
4
4
|
import { getActiveSession, readSessionsStore } from "../../core/session-store.js";
|
|
5
5
|
import { getLatestSnapshot } from "../../core/db.js";
|
|
6
|
-
import {
|
|
6
|
+
import { parseSessionStats } from "../../core/jsonl-parser.js";
|
|
7
7
|
import { header, fmtTokens, fmtDate, tokenBar, outputJson, printError, severity, getWindowSize, } from "../format.js";
|
|
8
8
|
export async function runStatus(cfg, opts) {
|
|
9
9
|
const agent = opts.agent ?? cfg.probe.openclaw.agent;
|
|
@@ -16,35 +16,28 @@ export async function runStatus(cfg, opts) {
|
|
|
16
16
|
process.exit(1);
|
|
17
17
|
}
|
|
18
18
|
const snapshot = getLatestSnapshot(db, agent, sessionEntry.sessionKey);
|
|
19
|
-
// Prefer
|
|
20
|
-
|
|
21
|
-
let compactionCount = sessionEntry.compactionCount;
|
|
22
|
-
let lastActiveAt = sessionEntry.updatedAt;
|
|
23
|
-
// When sessions.json has no token/compact data yet, derive from transcript so
|
|
24
|
-
// "clawprobe status" shows existing state without requiring daemon to have run first.
|
|
19
|
+
// Prefer jsonl transcript as the authoritative source for actual context token count.
|
|
20
|
+
// Each assistant message reports `usage.totalTokens` = cumulative context at that turn.
|
|
25
21
|
const transcriptPath = path.join(cfg.sessionsDir, `${sessionEntry.sessionKey}.jsonl`);
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
lastActiveAt = Math.floor(fs.statSync(transcriptPath).mtimeMs / 1000);
|
|
39
|
-
}
|
|
40
|
-
catch {
|
|
41
|
-
// ignore
|
|
42
|
-
}
|
|
22
|
+
const jsonlStats = fs.existsSync(transcriptPath) ? parseSessionStats(transcriptPath) : null;
|
|
23
|
+
// sessionTokens = actual tokens in context right now
|
|
24
|
+
// jsonlStats.lastTotalTokens is the most accurate (from last assistant message's usage.totalTokens)
|
|
25
|
+
const sessionTokens = jsonlStats?.lastTotalTokens ?? sessionEntry.sessionTokens;
|
|
26
|
+
const windowSize = sessionEntry.windowSize || sessionEntry.contextTokens; // upper limit from sessions.json
|
|
27
|
+
// Use jsonl stats for compaction count and last active time (more reliable)
|
|
28
|
+
let compactionCount = jsonlStats?.compactionCount ?? sessionEntry.compactionCount;
|
|
29
|
+
let lastActiveAt = jsonlStats?.lastActiveAt ?? sessionEntry.updatedAt;
|
|
30
|
+
// Final fallback: transcript mtime
|
|
31
|
+
if (lastActiveAt === 0 && fs.existsSync(transcriptPath)) {
|
|
32
|
+
try {
|
|
33
|
+
lastActiveAt = Math.floor(fs.statSync(transcriptPath).mtimeMs / 1000);
|
|
43
34
|
}
|
|
35
|
+
catch { /* ignore */ }
|
|
44
36
|
}
|
|
45
37
|
const model = snapshot?.model ?? sessionEntry.modelOverride ?? null;
|
|
46
|
-
const
|
|
47
|
-
const
|
|
38
|
+
const resolvedWindowSize = getWindowSize(model, windowSize || sessionTokens);
|
|
39
|
+
const displayContextTokens = sessionTokens > 0 ? sessionTokens : 0;
|
|
40
|
+
const utilization = resolvedWindowSize > 0 ? displayContextTokens / resolvedWindowSize : 0;
|
|
48
41
|
const isActive = !opts.session;
|
|
49
42
|
if (opts.json) {
|
|
50
43
|
outputJson({
|
|
@@ -53,8 +46,8 @@ export async function runStatus(cfg, opts) {
|
|
|
53
46
|
sessionId: sessionEntry.sessionId,
|
|
54
47
|
model,
|
|
55
48
|
provider: snapshot?.provider ?? sessionEntry.providerOverride ?? null,
|
|
56
|
-
|
|
57
|
-
windowSize,
|
|
49
|
+
sessionTokens: displayContextTokens,
|
|
50
|
+
windowSize: resolvedWindowSize,
|
|
58
51
|
utilizationPct: Math.round(utilization * 100),
|
|
59
52
|
inputTokens: sessionEntry.inputTokens,
|
|
60
53
|
outputTokens: sessionEntry.outputTokens,
|
|
@@ -70,8 +63,14 @@ export async function runStatus(cfg, opts) {
|
|
|
70
63
|
if (model)
|
|
71
64
|
console.log(` Model: ${model}`);
|
|
72
65
|
console.log();
|
|
73
|
-
|
|
74
|
-
|
|
66
|
+
if (displayContextTokens > 0) {
|
|
67
|
+
console.log(` Context: ${fmtTokens(displayContextTokens)} / ${fmtTokens(resolvedWindowSize)} tokens ` +
|
|
68
|
+
`${tokenBar(displayContextTokens, resolvedWindowSize)} ${Math.round(utilization * 100)}%`);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
console.log(` Context window: ${fmtTokens(resolvedWindowSize)} tokens ` +
|
|
72
|
+
severity.muted("(actual usage not in sessions.json — run: clawprobe context)"));
|
|
73
|
+
}
|
|
75
74
|
console.log(` This session: ${fmtTokens(sessionEntry.inputTokens)} in / ${fmtTokens(sessionEntry.outputTokens)} out`);
|
|
76
75
|
console.log(` Compacts: ${compactionCount}`);
|
|
77
76
|
if (lastActiveAt) {
|
|
@@ -79,10 +78,9 @@ export async function runStatus(cfg, opts) {
|
|
|
79
78
|
}
|
|
80
79
|
if (sessionEntry.inputTokens === 0 &&
|
|
81
80
|
sessionEntry.outputTokens === 0 &&
|
|
82
|
-
sessionEntry.contextTokens === 0 &&
|
|
83
81
|
fs.existsSync(transcriptPath)) {
|
|
84
82
|
console.log();
|
|
85
|
-
console.log(severity.muted(" Token counts come from sessions.json. If OpenClaw hasn
|
|
83
|
+
console.log(severity.muted(" Token counts come from sessions.json. If OpenClaw hasn't written them yet, run a turn or check your OpenClaw version."));
|
|
86
84
|
}
|
|
87
85
|
console.log();
|
|
88
86
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,35 +2,55 @@ export interface SessionHeader {
|
|
|
2
2
|
type: "session";
|
|
3
3
|
id: string;
|
|
4
4
|
cwd: string;
|
|
5
|
-
timestamp: number;
|
|
5
|
+
timestamp: string | number;
|
|
6
6
|
parentSession?: string;
|
|
7
7
|
}
|
|
8
|
+
export interface TokenUsage {
|
|
9
|
+
input: number;
|
|
10
|
+
output: number;
|
|
11
|
+
cacheRead: number;
|
|
12
|
+
cacheWrite: number;
|
|
13
|
+
totalTokens: number;
|
|
14
|
+
}
|
|
8
15
|
export interface MessageEntry {
|
|
9
16
|
type: "message";
|
|
10
17
|
id: string;
|
|
11
18
|
parentId: string;
|
|
12
|
-
|
|
19
|
+
timestamp: string;
|
|
20
|
+
message: {
|
|
21
|
+
role: "user" | "assistant" | "tool" | "toolResult";
|
|
22
|
+
content: unknown[];
|
|
23
|
+
api?: string;
|
|
24
|
+
provider?: string;
|
|
25
|
+
model?: string;
|
|
26
|
+
usage?: TokenUsage;
|
|
27
|
+
stopReason?: string;
|
|
28
|
+
errorMessage?: string;
|
|
29
|
+
timestamp?: number;
|
|
30
|
+
};
|
|
31
|
+
role: "user" | "assistant" | "tool" | "toolResult";
|
|
32
|
+
/** Text content extracted from the first text block, or stringified JSON */
|
|
13
33
|
content: string;
|
|
14
|
-
timestamp?: number;
|
|
15
34
|
}
|
|
16
35
|
export interface CompactionEntry {
|
|
17
36
|
type: "compaction";
|
|
18
37
|
id: string;
|
|
19
38
|
parentId: string;
|
|
20
39
|
firstKeptEntryId: string;
|
|
21
|
-
tokensBefore
|
|
22
|
-
content
|
|
23
|
-
|
|
40
|
+
tokensBefore?: number;
|
|
41
|
+
content?: string;
|
|
42
|
+
summaryText?: string;
|
|
43
|
+
timestamp?: string;
|
|
24
44
|
}
|
|
25
|
-
export interface
|
|
26
|
-
type: "
|
|
45
|
+
export interface CustomEntry {
|
|
46
|
+
type: "custom";
|
|
47
|
+
customType: string;
|
|
27
48
|
id: string;
|
|
28
|
-
parentId
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
hidden?: boolean;
|
|
49
|
+
parentId?: string;
|
|
50
|
+
timestamp: string;
|
|
51
|
+
data?: Record<string, unknown>;
|
|
32
52
|
}
|
|
33
|
-
export type JournalEntry = SessionHeader | MessageEntry | CompactionEntry |
|
|
53
|
+
export type JournalEntry = SessionHeader | MessageEntry | CompactionEntry | CustomEntry | {
|
|
34
54
|
type: string;
|
|
35
55
|
[key: string]: unknown;
|
|
36
56
|
};
|
|
@@ -43,6 +63,45 @@ export interface CompactEvent {
|
|
|
43
63
|
timestamp?: number;
|
|
44
64
|
lineIndex: number;
|
|
45
65
|
}
|
|
66
|
+
export interface TurnStats {
|
|
67
|
+
turnIndex: number;
|
|
68
|
+
/** Unix seconds */
|
|
69
|
+
timestamp: number;
|
|
70
|
+
model: string | null;
|
|
71
|
+
provider: string | null;
|
|
72
|
+
usage: TokenUsage;
|
|
73
|
+
stopReason: string;
|
|
74
|
+
isError: boolean;
|
|
75
|
+
toolCallCount: number;
|
|
76
|
+
}
|
|
77
|
+
export interface SessionStats {
|
|
78
|
+
sessionId: string;
|
|
79
|
+
/** Unix seconds */
|
|
80
|
+
startedAt: number;
|
|
81
|
+
/** Unix seconds of last message */
|
|
82
|
+
lastActiveAt: number;
|
|
83
|
+
model: string | null;
|
|
84
|
+
provider: string | null;
|
|
85
|
+
/** Total input tokens across all turns (non-error) */
|
|
86
|
+
totalInput: number;
|
|
87
|
+
/** Total output tokens across all turns (non-error) */
|
|
88
|
+
totalOutput: number;
|
|
89
|
+
/** Total cache-read tokens */
|
|
90
|
+
totalCacheRead: number;
|
|
91
|
+
/** Total tokens in last successful assistant turn (= current context usage) */
|
|
92
|
+
lastTotalTokens: number;
|
|
93
|
+
/** Number of user turns */
|
|
94
|
+
userTurns: number;
|
|
95
|
+
/** Number of successful assistant turns */
|
|
96
|
+
assistantTurns: number;
|
|
97
|
+
/** Number of error turns */
|
|
98
|
+
errorTurns: number;
|
|
99
|
+
/** Number of tool calls across all turns */
|
|
100
|
+
toolCallCount: number;
|
|
101
|
+
/** Number of compaction events */
|
|
102
|
+
compactionCount: number;
|
|
103
|
+
turns: TurnStats[];
|
|
104
|
+
}
|
|
46
105
|
export interface ParseResult {
|
|
47
106
|
entries: JournalEntry[];
|
|
48
107
|
compactEvents: CompactEvent[];
|
|
@@ -50,6 +109,11 @@ export interface ParseResult {
|
|
|
50
109
|
export declare function parseAll(filePath: string): ParseResult;
|
|
51
110
|
export declare function parseIncremental(filePath: string): ParseResult;
|
|
52
111
|
export declare function resetCursor(filePath: string): void;
|
|
112
|
+
/**
|
|
113
|
+
* Parse all entries in a .jsonl file and compute session-level statistics
|
|
114
|
+
* directly from the message usage fields (the authoritative data source).
|
|
115
|
+
*/
|
|
116
|
+
export declare function parseSessionStats(filePath: string): SessionStats | null;
|
|
53
117
|
export declare function getCompactedMessages(allEntries: JournalEntry[], compactEvent: CompactEvent, previousFirstKeptId?: string): MessageEntry[];
|
|
54
118
|
export declare function buildConversationTree(entries: JournalEntry[]): MessageEntry[];
|
|
55
119
|
//# sourceMappingURL=jsonl-parser.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonl-parser.d.ts","sourceRoot":"","sources":["../../src/core/jsonl-parser.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,SAAS,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"jsonl-parser.d.ts","sourceRoot":"","sources":["../../src/core/jsonl-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,17 +29,30 @@ export function parseIncremental(filePath) {
|
|
|
29
29
|
let lineIndex = 0;
|
|
30
30
|
for (const line of lines) {
|
|
31
31
|
try {
|
|
32
|
-
const
|
|
32
|
+
const raw = JSON.parse(line);
|
|
33
|
+
const entry = raw;
|
|
34
|
+
// Populate convenience fields on MessageEntry
|
|
35
|
+
if (raw["type"] === "message" && raw["message"]) {
|
|
36
|
+
const msg = raw["message"];
|
|
37
|
+
const role = msg["role"] ?? "user";
|
|
38
|
+
const content = msg["content"] ?? [];
|
|
39
|
+
const textContent = content
|
|
40
|
+
.filter((c) => c["type"] === "text")
|
|
41
|
+
.map((c) => c["text"])
|
|
42
|
+
.join("\n");
|
|
43
|
+
raw["role"] = role;
|
|
44
|
+
raw["content"] = textContent || JSON.stringify(content).slice(0, 300);
|
|
45
|
+
}
|
|
33
46
|
entries.push(entry);
|
|
34
47
|
if (entry.type === "compaction") {
|
|
35
48
|
const ce = entry;
|
|
36
49
|
compactEvents.push({
|
|
37
50
|
entryId: ce.id,
|
|
38
|
-
parentId: ce.parentId,
|
|
51
|
+
parentId: ce.parentId ?? "",
|
|
39
52
|
firstKeptEntryId: ce.firstKeptEntryId,
|
|
40
|
-
tokensBefore: ce.tokensBefore,
|
|
41
|
-
summaryText: ce.content,
|
|
42
|
-
timestamp: ce.timestamp,
|
|
53
|
+
tokensBefore: ce.tokensBefore ?? 0,
|
|
54
|
+
summaryText: ce.summaryText ?? ce.content ?? "",
|
|
55
|
+
timestamp: ce.timestamp ? tsToSec(ce.timestamp) : undefined,
|
|
43
56
|
lineIndex,
|
|
44
57
|
});
|
|
45
58
|
}
|
|
@@ -54,10 +67,139 @@ export function parseIncremental(filePath) {
|
|
|
54
67
|
export function resetCursor(filePath) {
|
|
55
68
|
fileCursors.delete(filePath);
|
|
56
69
|
}
|
|
70
|
+
// --- Session stats from jsonl ---
|
|
71
|
+
/**
|
|
72
|
+
* Parse all entries in a .jsonl file and compute session-level statistics
|
|
73
|
+
* directly from the message usage fields (the authoritative data source).
|
|
74
|
+
*/
|
|
75
|
+
export function parseSessionStats(filePath) {
|
|
76
|
+
if (!fs.existsSync(filePath))
|
|
77
|
+
return null;
|
|
78
|
+
let raw;
|
|
79
|
+
try {
|
|
80
|
+
raw = fs.readFileSync(filePath, "utf-8");
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
const lines = raw.split("\n").filter((l) => l.trim().length > 0);
|
|
86
|
+
let sessionId = "";
|
|
87
|
+
let startedAt = 0;
|
|
88
|
+
let lastActiveAt = 0;
|
|
89
|
+
let model = null;
|
|
90
|
+
let provider = null;
|
|
91
|
+
let totalInput = 0;
|
|
92
|
+
let totalOutput = 0;
|
|
93
|
+
let totalCacheRead = 0;
|
|
94
|
+
let lastTotalTokens = 0;
|
|
95
|
+
let userTurns = 0;
|
|
96
|
+
let assistantTurns = 0;
|
|
97
|
+
let errorTurns = 0;
|
|
98
|
+
let toolCallCount = 0;
|
|
99
|
+
let compactionCount = 0;
|
|
100
|
+
const turns = [];
|
|
101
|
+
for (const line of lines) {
|
|
102
|
+
let entry;
|
|
103
|
+
try {
|
|
104
|
+
entry = JSON.parse(line);
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
const type = entry["type"];
|
|
110
|
+
const ts = entry["timestamp"];
|
|
111
|
+
const entrySec = ts ? tsToSec(String(ts)) : 0;
|
|
112
|
+
if (entrySec > 0) {
|
|
113
|
+
if (startedAt === 0)
|
|
114
|
+
startedAt = entrySec;
|
|
115
|
+
if (entrySec > lastActiveAt)
|
|
116
|
+
lastActiveAt = entrySec;
|
|
117
|
+
}
|
|
118
|
+
if (type === "session") {
|
|
119
|
+
sessionId = entry["id"] ?? "";
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
if (type === "compaction") {
|
|
123
|
+
compactionCount++;
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
if (type !== "message")
|
|
127
|
+
continue;
|
|
128
|
+
const msg = entry["message"];
|
|
129
|
+
if (!msg)
|
|
130
|
+
continue;
|
|
131
|
+
const role = msg["role"];
|
|
132
|
+
// Track model/provider from the most recent assistant message
|
|
133
|
+
if (msg["model"])
|
|
134
|
+
model = msg["model"];
|
|
135
|
+
if (msg["provider"])
|
|
136
|
+
provider = msg["provider"];
|
|
137
|
+
if (role === "user") {
|
|
138
|
+
userTurns++;
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
// toolResult entries — skip for token counting
|
|
142
|
+
if (role === "toolResult" || role === "tool")
|
|
143
|
+
continue;
|
|
144
|
+
if (role === "assistant") {
|
|
145
|
+
const usage = msg["usage"];
|
|
146
|
+
const stopReason = msg["stopReason"] ?? "";
|
|
147
|
+
const isError = stopReason === "error" || !!(msg["errorMessage"]);
|
|
148
|
+
// Count tool calls in content
|
|
149
|
+
const content = msg["content"] ?? [];
|
|
150
|
+
const toolCalls = content.filter((c) => c["type"] === "toolCall").length;
|
|
151
|
+
if (isError) {
|
|
152
|
+
errorTurns++;
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
assistantTurns++;
|
|
156
|
+
if (usage) {
|
|
157
|
+
// Accumulate only output tokens (input is cumulative/context each turn)
|
|
158
|
+
totalOutput += usage.output ?? 0;
|
|
159
|
+
totalCacheRead += usage.cacheRead ?? 0;
|
|
160
|
+
// The last turn's totalTokens = current context window usage
|
|
161
|
+
if (usage.totalTokens > 0) {
|
|
162
|
+
lastTotalTokens = usage.totalTokens;
|
|
163
|
+
totalInput = usage.input ?? 0; // most recent input = current context
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
toolCallCount += toolCalls;
|
|
167
|
+
const msgTs = msg["timestamp"];
|
|
168
|
+
const turnTs = msgTs ? Math.floor(msgTs / 1000) : entrySec;
|
|
169
|
+
turns.push({
|
|
170
|
+
turnIndex: assistantTurns,
|
|
171
|
+
timestamp: turnTs,
|
|
172
|
+
model: msg["model"] ?? model,
|
|
173
|
+
provider: msg["provider"] ?? provider,
|
|
174
|
+
usage: usage ?? { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, totalTokens: 0 },
|
|
175
|
+
stopReason,
|
|
176
|
+
isError: false,
|
|
177
|
+
toolCallCount: toolCalls,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return {
|
|
183
|
+
sessionId,
|
|
184
|
+
startedAt,
|
|
185
|
+
lastActiveAt,
|
|
186
|
+
model,
|
|
187
|
+
provider,
|
|
188
|
+
totalInput,
|
|
189
|
+
totalOutput,
|
|
190
|
+
totalCacheRead,
|
|
191
|
+
lastTotalTokens,
|
|
192
|
+
userTurns,
|
|
193
|
+
assistantTurns,
|
|
194
|
+
errorTurns,
|
|
195
|
+
toolCallCount,
|
|
196
|
+
compactionCount,
|
|
197
|
+
turns,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
57
200
|
// --- Full analysis helpers ---
|
|
58
201
|
export function getCompactedMessages(allEntries, compactEvent, previousFirstKeptId) {
|
|
59
|
-
const messages = allEntries.filter((e) => e.type === "message");
|
|
60
|
-
// Entries after the previous compact boundary, before this compact's firstKeptEntryId
|
|
202
|
+
const messages = allEntries.filter((e) => e.type === "message" && e.message?.role === "user");
|
|
61
203
|
let started = previousFirstKeptId === undefined;
|
|
62
204
|
const result = [];
|
|
63
205
|
for (const msg of messages) {
|
|
@@ -73,7 +215,15 @@ export function getCompactedMessages(allEntries, compactEvent, previousFirstKept
|
|
|
73
215
|
return result;
|
|
74
216
|
}
|
|
75
217
|
export function buildConversationTree(entries) {
|
|
76
|
-
// Return messages in insertion order (they form a linear chain via parentId)
|
|
77
218
|
return entries.filter((e) => e.type === "message");
|
|
78
219
|
}
|
|
220
|
+
// --- Helpers ---
|
|
221
|
+
function tsToSec(ts) {
|
|
222
|
+
if (typeof ts === "number") {
|
|
223
|
+
// milliseconds if > 1e10, else seconds
|
|
224
|
+
return ts > 1e10 ? Math.floor(ts / 1000) : ts;
|
|
225
|
+
}
|
|
226
|
+
const d = new Date(ts);
|
|
227
|
+
return isNaN(d.getTime()) ? 0 : Math.floor(d.getTime() / 1000);
|
|
228
|
+
}
|
|
79
229
|
//# sourceMappingURL=jsonl-parser.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonl-parser.js","sourceRoot":"","sources":["../../src/core/jsonl-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"jsonl-parser.js","sourceRoot":"","sources":["../../src/core/jsonl-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,14 @@ export interface SessionEntry {
|
|
|
5
5
|
inputTokens: number;
|
|
6
6
|
outputTokens: number;
|
|
7
7
|
totalTokens: number;
|
|
8
|
+
/** Actual tokens currently in context window (session_tokens / total in /context detail) */
|
|
9
|
+
sessionTokens: number;
|
|
10
|
+
/** Context window size upper limit (ctx= field, i.e. model max context) */
|
|
11
|
+
windowSize: number;
|
|
12
|
+
/**
|
|
13
|
+
* @deprecated Use sessionTokens for actual usage, windowSize for the limit.
|
|
14
|
+
* Kept for backward compatibility — may equal windowSize (not actual usage).
|
|
15
|
+
*/
|
|
8
16
|
contextTokens: number;
|
|
9
17
|
compactionCount: number;
|
|
10
18
|
memoryFlushAt?: number;
|
|
@@ -21,6 +29,10 @@ interface RawSessionEntry {
|
|
|
21
29
|
outputTokens?: number;
|
|
22
30
|
totalTokens?: number;
|
|
23
31
|
contextTokens?: number;
|
|
32
|
+
sessionTokens?: number;
|
|
33
|
+
session_tokens?: number;
|
|
34
|
+
ctxSize?: number;
|
|
35
|
+
ctx_size?: number;
|
|
24
36
|
compactionCount?: number;
|
|
25
37
|
memoryFlushAt?: number;
|
|
26
38
|
modelOverride?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-store.d.ts","sourceRoot":"","sources":["../../src/core/session-store.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CAC3C;AAGD,UAAU,eAAe;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,YAAY,EAAE,CA2BrE;
|
|
1
|
+
{"version":3,"file":"session-store.d.ts","sourceRoot":"","sources":["../../src/core/session-store.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,4FAA4F;IAC5F,aAAa,EAAE,MAAM,CAAC;IACtB,2EAA2E;IAC3E,UAAU,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CAC3C;AAGD,UAAU,eAAe;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,YAAY,EAAE,CA2BrE;AA6ED,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAE5F;AAED,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAK9E;AAED,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAM5D;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE3D"}
|
|
@@ -35,7 +35,14 @@ function normalizeEntry(sessionKey, raw) {
|
|
|
35
35
|
const inputTokens = getFirstNum(sources, "inputTokens", "input_tokens");
|
|
36
36
|
const outputTokens = getFirstNum(sources, "outputTokens", "output_tokens");
|
|
37
37
|
const totalTokens = getFirstNum(sources, "totalTokens", "total_tokens") || inputTokens + outputTokens;
|
|
38
|
+
// contextTokens in sessions.json is actually the window size upper limit (ctx=256000),
|
|
39
|
+
// NOT the actual current usage. The actual usage is in session_tokens field.
|
|
38
40
|
const contextTokens = getFirstNum(sources, "contextTokens", "context_tokens");
|
|
41
|
+
// sessionTokens = actual tokens in context right now (matches "Session tokens (cached)" in /context detail)
|
|
42
|
+
// Try several field names OpenClaw may use
|
|
43
|
+
const sessionTokens = getFirstNum(sources, "sessionTokens", "session_tokens");
|
|
44
|
+
// windowSize = context window upper limit (ctx= value)
|
|
45
|
+
const windowSize = getFirstNum(sources, "ctxSize", "ctx_size") || contextTokens;
|
|
39
46
|
const compactionCount = getFirstNum(sources, "compactionCount", "compaction_count");
|
|
40
47
|
let updatedAt = getFirstNum(sources, "updatedAt", "updated_at");
|
|
41
48
|
if (updatedAt === 0) {
|
|
@@ -53,6 +60,8 @@ function normalizeEntry(sessionKey, raw) {
|
|
|
53
60
|
inputTokens,
|
|
54
61
|
outputTokens,
|
|
55
62
|
totalTokens,
|
|
63
|
+
sessionTokens,
|
|
64
|
+
windowSize,
|
|
56
65
|
contextTokens,
|
|
57
66
|
compactionCount,
|
|
58
67
|
memoryFlushAt: (raw.memoryFlushAt ?? raw.memory_flush_at),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-store.js","sourceRoot":"","sources":["../../src/core/session-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"session-store.js","sourceRoot":"","sources":["../../src/core/session-store.ts"],"names":[],"mappings":"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"}
|
package/dist/engines/cost.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { DatabaseSync } from "node:sqlite";
|
|
2
2
|
import type { SessionEntry } from "../core/session-store.js";
|
|
3
|
+
import type { SessionStats } from "../core/jsonl-parser.js";
|
|
3
4
|
export declare const MODEL_PRICES: Record<string, {
|
|
4
5
|
input: number;
|
|
5
6
|
output: number;
|
|
@@ -65,6 +66,14 @@ export declare function sessionCostFromEntry(entry: SessionEntry, customPrices?:
|
|
|
65
66
|
input: number;
|
|
66
67
|
output: number;
|
|
67
68
|
}>): SessionCost;
|
|
69
|
+
/**
|
|
70
|
+
* Build a SessionCost directly from parsed jsonl stats.
|
|
71
|
+
* This is the most accurate data source — usage comes from the model's own reported token counts.
|
|
72
|
+
*/
|
|
73
|
+
export declare function getSessionCostFromJsonl(stats: SessionStats, sessionKey: string, customPrices?: Record<string, {
|
|
74
|
+
input: number;
|
|
75
|
+
output: number;
|
|
76
|
+
}>): SessionCost;
|
|
68
77
|
export declare function getAllSessionCosts(db: DatabaseSync, agent: string, customPrices?: Record<string, {
|
|
69
78
|
input: number;
|
|
70
79
|
output: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cost.d.ts","sourceRoot":"","sources":["../../src/engines/cost.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAS3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"cost.d.ts","sourceRoot":"","sources":["../../src/engines/cost.ts"],"names":[],"mappings":"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"}
|
package/dist/engines/cost.js
CHANGED
|
@@ -100,6 +100,39 @@ export function sessionCostFromEntry(entry, customPrices = {}) {
|
|
|
100
100
|
turns: [],
|
|
101
101
|
};
|
|
102
102
|
}
|
|
103
|
+
/**
|
|
104
|
+
* Build a SessionCost directly from parsed jsonl stats.
|
|
105
|
+
* This is the most accurate data source — usage comes from the model's own reported token counts.
|
|
106
|
+
*/
|
|
107
|
+
export function getSessionCostFromJsonl(stats, sessionKey, customPrices = {}) {
|
|
108
|
+
const model = stats.model;
|
|
109
|
+
const turns = stats.turns.map((t) => ({
|
|
110
|
+
turnIndex: t.turnIndex,
|
|
111
|
+
timestamp: t.timestamp,
|
|
112
|
+
inputTokensDelta: t.usage.input,
|
|
113
|
+
outputTokensDelta: t.usage.output,
|
|
114
|
+
estimatedUsd: estimateCost({ input: t.usage.input, output: t.usage.output }, model, customPrices),
|
|
115
|
+
compactOccurred: false, // compaction analysis done separately
|
|
116
|
+
}));
|
|
117
|
+
const totalUsd = turns.reduce((s, t) => s + t.estimatedUsd, 0);
|
|
118
|
+
return {
|
|
119
|
+
sessionKey,
|
|
120
|
+
model,
|
|
121
|
+
provider: stats.provider,
|
|
122
|
+
// totalInput = last turn's input (= current context size in tokens)
|
|
123
|
+
// totalOutput = cumulative output across all turns
|
|
124
|
+
inputTokens: stats.totalInput,
|
|
125
|
+
outputTokens: stats.totalOutput,
|
|
126
|
+
totalTokens: stats.totalInput + stats.totalOutput,
|
|
127
|
+
estimatedUsd: totalUsd,
|
|
128
|
+
startedAt: stats.startedAt,
|
|
129
|
+
lastActiveAt: stats.lastActiveAt,
|
|
130
|
+
durationMin: Math.round((stats.lastActiveAt - stats.startedAt) / 60),
|
|
131
|
+
compactionCount: stats.compactionCount,
|
|
132
|
+
costAccurate: true,
|
|
133
|
+
turns,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
103
136
|
export function getAllSessionCosts(db, agent, customPrices = {}) {
|
|
104
137
|
const keys = getAllSessionKeys(db, agent);
|
|
105
138
|
return keys
|
package/dist/engines/cost.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cost.js","sourceRoot":"","sources":["../../src/engines/cost.ts"],"names":[],"mappings":"AACA,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EAGjB,eAAe,EACf,gBAAgB,GACjB,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"cost.js","sourceRoot":"","sources":["../../src/engines/cost.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -12,7 +12,7 @@ import { runCompacts } from "./cli/commands/compacts.js";
|
|
|
12
12
|
import { runContext } from "./cli/commands/context.js";
|
|
13
13
|
import { runSuggest } from "./cli/commands/suggest.js";
|
|
14
14
|
import { runMemoryList, runMemorySearch, runMemoryAdd, runMemoryEdit, runMemoryDelete, runMemorySaveCompact, } from "./cli/commands/memory.js";
|
|
15
|
-
const VERSION = "0.2.
|
|
15
|
+
const VERSION = "0.2.4";
|
|
16
16
|
const program = new Command();
|
|
17
17
|
program
|
|
18
18
|
.name("clawprobe")
|