@codemieai/code 0.7.0 → 0.8.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/dist/agents/plugins/claude/claude.plugin.js +3 -3
- package/dist/cli/commands/analytics/aggregator.js +1 -1
- package/dist/cli/commands/analytics/aggregator.js.map +1 -1
- package/dist/cli/commands/analytics/cost/cost-enricher.d.ts.map +1 -1
- package/dist/cli/commands/analytics/cost/cost-enricher.js +45 -9
- package/dist/cli/commands/analytics/cost/cost-enricher.js.map +1 -1
- package/dist/cli/commands/analytics/cost/pricing.d.ts +1 -0
- package/dist/cli/commands/analytics/cost/pricing.d.ts.map +1 -1
- package/dist/cli/commands/analytics/cost/pricing.js +66 -0
- package/dist/cli/commands/analytics/cost/pricing.js.map +1 -1
- package/dist/cli/commands/analytics/cost/pricing.json +8 -1
- package/dist/cli/commands/analytics/cost/usage-readers.d.ts +2 -0
- package/dist/cli/commands/analytics/cost/usage-readers.d.ts.map +1 -1
- package/dist/cli/commands/analytics/cost/usage-readers.js +36 -2
- package/dist/cli/commands/analytics/cost/usage-readers.js.map +1 -1
- package/dist/cli/commands/analytics/data-loader.d.ts +2 -3
- package/dist/cli/commands/analytics/data-loader.d.ts.map +1 -1
- package/dist/cli/commands/analytics/index.d.ts.map +1 -1
- package/dist/cli/commands/analytics/index.js +137 -134
- package/dist/cli/commands/analytics/index.js.map +1 -1
- package/dist/cli/commands/analytics/otel-loader.d.ts +97 -0
- package/dist/cli/commands/analytics/otel-loader.d.ts.map +1 -0
- package/dist/cli/commands/analytics/otel-loader.js +504 -0
- package/dist/cli/commands/analytics/otel-loader.js.map +1 -0
- package/dist/cli/commands/analytics/report/client/app.js +56 -25
- package/dist/cli/commands/analytics/report/payload-builder.d.ts.map +1 -1
- package/dist/cli/commands/analytics/report/payload-builder.js +8 -3
- package/dist/cli/commands/analytics/report/payload-builder.js.map +1 -1
- package/dist/cli/commands/analytics/report/session-source-detector.d.ts +29 -0
- package/dist/cli/commands/analytics/report/session-source-detector.d.ts.map +1 -0
- package/dist/cli/commands/analytics/report/session-source-detector.js +64 -0
- package/dist/cli/commands/analytics/report/session-source-detector.js.map +1 -0
- package/dist/cli/commands/analytics/report/template.html +6 -2
- package/dist/cli/commands/analytics/report/types.d.ts +2 -0
- package/dist/cli/commands/analytics/report/types.d.ts.map +1 -1
- package/dist/cli/commands/analytics/sources/otel-source.d.ts +12 -0
- package/dist/cli/commands/analytics/sources/otel-source.d.ts.map +1 -0
- package/dist/cli/commands/analytics/sources/otel-source.js +44 -0
- package/dist/cli/commands/analytics/sources/otel-source.js.map +1 -0
- package/dist/cli/commands/analytics/sources/sessions-source.d.ts +10 -0
- package/dist/cli/commands/analytics/sources/sessions-source.d.ts.map +1 -0
- package/dist/cli/commands/analytics/sources/sessions-source.js +27 -0
- package/dist/cli/commands/analytics/sources/sessions-source.js.map +1 -0
- package/dist/cli/commands/analytics/sources/types.d.ts +38 -0
- package/dist/cli/commands/analytics/sources/types.d.ts.map +1 -0
- package/dist/cli/commands/analytics/sources/types.js +2 -0
- package/dist/cli/commands/analytics/sources/types.js.map +1 -0
- package/dist/cli/commands/analytics/types.d.ts +7 -0
- package/dist/cli/commands/analytics/types.d.ts.map +1 -1
- package/dist/cli/commands/hook.d.ts.map +1 -1
- package/dist/cli/commands/hook.js +33 -0
- package/dist/cli/commands/hook.js.map +1 -1
- package/dist/cli/commands/proxy/connectors/desktop.d.ts +45 -5
- package/dist/cli/commands/proxy/connectors/desktop.d.ts.map +1 -1
- package/dist/cli/commands/proxy/connectors/desktop.js +149 -15
- package/dist/cli/commands/proxy/connectors/desktop.js.map +1 -1
- package/dist/cli/commands/proxy/connectors/managed-mcp-remote.d.ts +20 -0
- package/dist/cli/commands/proxy/connectors/managed-mcp-remote.d.ts.map +1 -0
- package/dist/cli/commands/proxy/connectors/managed-mcp-remote.js +94 -0
- package/dist/cli/commands/proxy/connectors/managed-mcp-remote.js.map +1 -0
- package/dist/cli/commands/proxy/index.d.ts.map +1 -1
- package/dist/cli/commands/proxy/index.js +14 -2
- package/dist/cli/commands/proxy/index.js.map +1 -1
- package/dist/cli/commands/skills/add.d.ts.map +1 -1
- package/dist/cli/commands/skills/add.js +4 -0
- package/dist/cli/commands/skills/add.js.map +1 -1
- package/dist/providers/plugins/sso/proxy/sso.proxy.d.ts +6 -0
- package/dist/providers/plugins/sso/proxy/sso.proxy.d.ts.map +1 -1
- package/dist/providers/plugins/sso/proxy/sso.proxy.js +24 -0
- package/dist/providers/plugins/sso/proxy/sso.proxy.js.map +1 -1
- package/dist/utils/config.d.ts +14 -0
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +41 -6
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/errors.d.ts +3 -0
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +6 -0
- package/dist/utils/errors.js.map +1 -1
- package/package.json +3 -3
- package/scripts/validate-secrets.js +75 -20
|
@@ -0,0 +1,504 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OTEL analytics source.
|
|
3
|
+
*
|
|
4
|
+
* Reads a flattened `otel-events.jsonl` (the contract produced by the
|
|
5
|
+
* codemie-claude-otel file sink / collector fan-out) and maps native Claude Code
|
|
6
|
+
* telemetry into the same {@link RawSessionData} + {@link SessionCostIndex} the rest
|
|
7
|
+
* of the analytics pipeline consumes, so `codemie analytics --source otel` renders the
|
|
8
|
+
* existing HTML report (incl. session detail) from OTEL data instead of local sessions.
|
|
9
|
+
*
|
|
10
|
+
* What each OTEL event contributes:
|
|
11
|
+
* - api_request → tokens + cost (authoritative `cost_usd`) + per-model rollup
|
|
12
|
+
* - tool_result → per-tool calls / success / failure
|
|
13
|
+
* - subagent_completed → agent dispatches (Timeline) + agentInvocations
|
|
14
|
+
* - skill_activated → skill dispatches (Timeline) + skillInvocations
|
|
15
|
+
* - user_prompt → turn count + session title (first prompt)
|
|
16
|
+
* - lines_of_code.count → net lines added/removed
|
|
17
|
+
* - claude.session.start (this plugin's own event) → cwd + git branch (Project/Branch)
|
|
18
|
+
*
|
|
19
|
+
* NOTE: native Claude Code emits NO cwd or git branch. Project/Branch are only available
|
|
20
|
+
* for sessions recorded with the codemie-claude-otel plugin active (joined by session id);
|
|
21
|
+
* native-only sessions fall back to "Unknown".
|
|
22
|
+
*/
|
|
23
|
+
import { readFileSync, readdirSync, openSync, readSync, closeSync } from 'node:fs';
|
|
24
|
+
import { join } from 'node:path';
|
|
25
|
+
import { homedir } from 'node:os';
|
|
26
|
+
import { MAX_SERIES_POINTS, MAX_DISPATCHES } from './cost/types.js';
|
|
27
|
+
import { normalizeModelName } from './model-normalizer.js';
|
|
28
|
+
function num(v) {
|
|
29
|
+
const n = Number(v);
|
|
30
|
+
return Number.isFinite(n) ? n : 0;
|
|
31
|
+
}
|
|
32
|
+
function attr(e, k) {
|
|
33
|
+
return (e.attrs || {})[k];
|
|
34
|
+
}
|
|
35
|
+
function sessionOf(e) {
|
|
36
|
+
return String(attr(e, 'session.id') || attr(e, 'session_id') || '');
|
|
37
|
+
}
|
|
38
|
+
function userKey(e) {
|
|
39
|
+
return String(attr(e, 'user.email') || attr(e, 'user.id') || '');
|
|
40
|
+
}
|
|
41
|
+
function isApiRequest(e) {
|
|
42
|
+
return e._type === 'log' && (e.name === 'api_request' || attr(e, 'event.name') === 'api_request');
|
|
43
|
+
}
|
|
44
|
+
/** Parse flattened JSONL text into events, skipping malformed lines. */
|
|
45
|
+
export function parseOtelJsonl(text) {
|
|
46
|
+
const out = [];
|
|
47
|
+
for (const line of text.split('\n')) {
|
|
48
|
+
const t = line.trim();
|
|
49
|
+
if (!t)
|
|
50
|
+
continue;
|
|
51
|
+
try {
|
|
52
|
+
const e = JSON.parse(t);
|
|
53
|
+
if (e && typeof e === 'object' && e.name)
|
|
54
|
+
out.push(e);
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
/* skip malformed line */
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return out;
|
|
61
|
+
}
|
|
62
|
+
/** Select `api_request` log events, optionally filtered by user and time window. */
|
|
63
|
+
export function filterApiRequests(events, filter = {}) {
|
|
64
|
+
const sinceMs = filter.since ? filter.since.getTime() : -Infinity;
|
|
65
|
+
const untilMs = filter.until ? filter.until.getTime() : Infinity;
|
|
66
|
+
return events.filter((e) => {
|
|
67
|
+
if (!isApiRequest(e))
|
|
68
|
+
return false;
|
|
69
|
+
if (filter.user && userKey(e) !== filter.user)
|
|
70
|
+
return false;
|
|
71
|
+
const ms = Date.parse(e.ts);
|
|
72
|
+
if (Number.isFinite(ms) && (ms < sinceMs || ms > untilMs))
|
|
73
|
+
return false;
|
|
74
|
+
return true;
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
function emptyTokens() {
|
|
78
|
+
return { input: 0, output: 0, cacheRead: 0, cacheCreation: 0, cacheCreation1h: 0, total: 0 };
|
|
79
|
+
}
|
|
80
|
+
function addTokens(t, e) {
|
|
81
|
+
t.input += num(attr(e, 'input_tokens'));
|
|
82
|
+
t.output += num(attr(e, 'output_tokens'));
|
|
83
|
+
t.cacheRead += num(attr(e, 'cache_read_tokens'));
|
|
84
|
+
t.cacheCreation += num(attr(e, 'cache_creation_tokens'));
|
|
85
|
+
t.total = t.input + t.output + t.cacheRead + t.cacheCreation;
|
|
86
|
+
}
|
|
87
|
+
/** Build the cost index + run summary directly from native api_request events. */
|
|
88
|
+
export function buildCostIndex(apiRequests) {
|
|
89
|
+
const index = new Map();
|
|
90
|
+
const perModelMap = new Map();
|
|
91
|
+
const seriesPts = new Map();
|
|
92
|
+
for (const e of apiRequests) {
|
|
93
|
+
const sid = sessionOf(e);
|
|
94
|
+
if (!sid)
|
|
95
|
+
continue;
|
|
96
|
+
if (!index.has(sid)) {
|
|
97
|
+
index.set(sid, { sessionId: sid, tokens: emptyTokens(), costUSD: 0, perModel: [], priced: true, hadLog: true });
|
|
98
|
+
perModelMap.set(sid, new Map());
|
|
99
|
+
seriesPts.set(sid, []);
|
|
100
|
+
}
|
|
101
|
+
const sc = index.get(sid);
|
|
102
|
+
addTokens(sc.tokens, e);
|
|
103
|
+
const cost = num(attr(e, 'cost_usd'));
|
|
104
|
+
sc.costUSD += cost;
|
|
105
|
+
// Normalize so bedrock/converse spellings collapse onto the canonical model.
|
|
106
|
+
const model = normalizeModelName(String(attr(e, 'model') || '(unknown)'));
|
|
107
|
+
const mm = perModelMap.get(sid);
|
|
108
|
+
if (!mm.has(model))
|
|
109
|
+
mm.set(model, { tokens: emptyTokens(), costUSD: 0 });
|
|
110
|
+
const mc = mm.get(model);
|
|
111
|
+
addTokens(mc.tokens, e);
|
|
112
|
+
mc.costUSD += cost;
|
|
113
|
+
const ms = Date.parse(e.ts);
|
|
114
|
+
seriesPts.get(sid).push({
|
|
115
|
+
t: Number.isFinite(ms) ? ms : 0,
|
|
116
|
+
cost,
|
|
117
|
+
tokens: num(attr(e, 'input_tokens')) + num(attr(e, 'output_tokens')) + num(attr(e, 'cache_read_tokens')) + num(attr(e, 'cache_creation_tokens')),
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
for (const [sid, sc] of index) {
|
|
121
|
+
const mm = perModelMap.get(sid);
|
|
122
|
+
sc.perModel = [...mm.entries()]
|
|
123
|
+
.map(([model, r]) => ({ model, tokens: r.tokens, costUSD: r.costUSD, unpriced: false }))
|
|
124
|
+
.sort((a, b) => b.costUSD - a.costUSD);
|
|
125
|
+
sc.costSeries = downsampleSeries(seriesPts.get(sid));
|
|
126
|
+
}
|
|
127
|
+
const summary = {
|
|
128
|
+
totalCostUSD: [...index.values()].reduce((s, c) => s + c.costUSD, 0),
|
|
129
|
+
pricedSessions: [...index.values()].filter((c) => c.priced).length,
|
|
130
|
+
totalSessions: index.size,
|
|
131
|
+
unpricedModels: [],
|
|
132
|
+
};
|
|
133
|
+
return { index, summary };
|
|
134
|
+
}
|
|
135
|
+
function downsampleSeries(pts) {
|
|
136
|
+
const sorted = [...pts].sort((a, b) => a.t - b.t);
|
|
137
|
+
let cost = 0;
|
|
138
|
+
let tokens = 0;
|
|
139
|
+
const series = sorted.map((p) => {
|
|
140
|
+
cost += p.cost;
|
|
141
|
+
tokens += p.tokens;
|
|
142
|
+
return { t: p.t, cost, tokens };
|
|
143
|
+
});
|
|
144
|
+
if (series.length <= MAX_SERIES_POINTS)
|
|
145
|
+
return series;
|
|
146
|
+
const step = series.length / MAX_SERIES_POINTS;
|
|
147
|
+
const ds = [];
|
|
148
|
+
for (let i = 0; i < MAX_SERIES_POINTS; i++)
|
|
149
|
+
ds.push(series[Math.floor(i * step)]);
|
|
150
|
+
ds.push(series[series.length - 1]);
|
|
151
|
+
return ds;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Timed agent/skill invocations for the session-detail Timeline.
|
|
155
|
+
*
|
|
156
|
+
* A subagent_completed event fires at completion and carries duration_ms, so the dispatch
|
|
157
|
+
* spans [completion − duration, completion]. Its cost/tokens are recovered by attributing
|
|
158
|
+
* the subagent's own api_requests — those tagged `query_source = agent:*` — that fall inside
|
|
159
|
+
* that window (the subagent shares the parent session.id). Each api_request is attributed to at
|
|
160
|
+
* most one dispatch, so parallel subagents whose windows overlap do not both claim a shared
|
|
161
|
+
* request (which would double-count a dispatch's cost/tokens). Falls back to the event's
|
|
162
|
+
* total_tokens when no windowed agent request matches.
|
|
163
|
+
*/
|
|
164
|
+
export function buildDispatches(sessionEvents) {
|
|
165
|
+
const agentReqs = sessionEvents
|
|
166
|
+
.filter((e) => isApiRequest(e) && String(attr(e, 'query_source') || '').startsWith('agent:'))
|
|
167
|
+
.map((e) => ({ ms: Date.parse(e.ts), e }))
|
|
168
|
+
.filter((x) => Number.isFinite(x.ms));
|
|
169
|
+
const skillReqs = sessionEvents
|
|
170
|
+
.filter((e) => isApiRequest(e) && attr(e, 'skill.name'))
|
|
171
|
+
.map((e) => ({ ms: Date.parse(e.ts), name: String(attr(e, 'skill.name')), e }))
|
|
172
|
+
.filter((x) => Number.isFinite(x.ms));
|
|
173
|
+
const skillStarts = sessionEvents
|
|
174
|
+
.filter((e) => e.name === 'skill_activated')
|
|
175
|
+
.map((e) => ({ name: String(attr(e, 'skill.name') || '(skill)'), ms: Date.parse(e.ts) }))
|
|
176
|
+
.filter((x) => Number.isFinite(x.ms));
|
|
177
|
+
const agentWindows = [];
|
|
178
|
+
for (const e of sessionEvents) {
|
|
179
|
+
if (e.name !== 'subagent_completed')
|
|
180
|
+
continue;
|
|
181
|
+
const end = Date.parse(e.ts);
|
|
182
|
+
if (!Number.isFinite(end))
|
|
183
|
+
continue;
|
|
184
|
+
const durationMs = num(attr(e, 'duration_ms'));
|
|
185
|
+
const start = durationMs > 0 ? end - durationMs : end;
|
|
186
|
+
agentWindows.push({ e, start, end, durationMs });
|
|
187
|
+
}
|
|
188
|
+
// Pass 2: attribute each agent:* api_request to the NARROWEST containing window. OTEL carries
|
|
189
|
+
// no per-invocation id linking a request to a specific subagent run, so when parallel
|
|
190
|
+
// subagents' [start, end] windows overlap, the tightest containing window is the best
|
|
191
|
+
// available signal (a wider, unrelated window should not out-compete a precise match). Each
|
|
192
|
+
// request contributes to at most one window.
|
|
193
|
+
const claimed = new Map();
|
|
194
|
+
for (const ar of agentReqs) {
|
|
195
|
+
let best = null;
|
|
196
|
+
for (const w of agentWindows) {
|
|
197
|
+
if (ar.ms < w.start || ar.ms > w.end)
|
|
198
|
+
continue;
|
|
199
|
+
if (!best || w.end - w.start < best.end - best.start)
|
|
200
|
+
best = w;
|
|
201
|
+
}
|
|
202
|
+
if (!best)
|
|
203
|
+
continue;
|
|
204
|
+
let claim = claimed.get(best);
|
|
205
|
+
if (!claim) {
|
|
206
|
+
claim = { tokens: emptyTokens(), costUSD: 0, matched: 0 };
|
|
207
|
+
claimed.set(best, claim);
|
|
208
|
+
}
|
|
209
|
+
addTokens(claim.tokens, ar.e);
|
|
210
|
+
claim.costUSD += num(attr(ar.e, 'cost_usd'));
|
|
211
|
+
claim.matched += 1;
|
|
212
|
+
}
|
|
213
|
+
const out = [];
|
|
214
|
+
for (const w of agentWindows) {
|
|
215
|
+
const claim = claimed.get(w);
|
|
216
|
+
const d = { kind: 'agent', name: String(attr(w.e, 'agent_type') || '(agent)'), start: w.start, durationMs: w.durationMs };
|
|
217
|
+
if (claim && claim.matched > 0) {
|
|
218
|
+
d.tokens = claim.tokens;
|
|
219
|
+
d.costUSD = claim.costUSD;
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
const tt = num(attr(w.e, 'total_tokens'));
|
|
223
|
+
if (tt > 0) {
|
|
224
|
+
const t = emptyTokens();
|
|
225
|
+
t.total = tt;
|
|
226
|
+
d.tokens = t;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
out.push(d);
|
|
230
|
+
}
|
|
231
|
+
// Skill windows are non-overlapping by construction (a skill's window ends at the next
|
|
232
|
+
// activation of the SAME skill), so the original name+window matching is unaffected by the
|
|
233
|
+
// parallel-agent fix above and is kept as-is.
|
|
234
|
+
for (const e of sessionEvents) {
|
|
235
|
+
if (e.name !== 'skill_activated')
|
|
236
|
+
continue;
|
|
237
|
+
const start = Date.parse(e.ts);
|
|
238
|
+
if (!Number.isFinite(start))
|
|
239
|
+
continue;
|
|
240
|
+
const name = String(attr(e, 'skill.name') || '(skill)');
|
|
241
|
+
const nextSame = skillStarts
|
|
242
|
+
.filter((s) => s.name === name && s.ms > start)
|
|
243
|
+
.reduce((min, s) => Math.min(min, s.ms), Infinity);
|
|
244
|
+
const matched = skillReqs.filter((r) => r.name === name && r.ms >= start && r.ms < nextSame);
|
|
245
|
+
const d = { kind: 'skill', name, start, durationMs: 0 };
|
|
246
|
+
if (matched.length) {
|
|
247
|
+
const tokens = emptyTokens();
|
|
248
|
+
let costUSD = 0;
|
|
249
|
+
let lastEnd = start;
|
|
250
|
+
for (const { ms, e: req } of matched) {
|
|
251
|
+
addTokens(tokens, req);
|
|
252
|
+
costUSD += num(attr(req, 'cost_usd'));
|
|
253
|
+
lastEnd = Math.max(lastEnd, ms + num(attr(req, 'duration_ms')));
|
|
254
|
+
}
|
|
255
|
+
d.durationMs = Math.max(0, lastEnd - start);
|
|
256
|
+
d.tokens = tokens;
|
|
257
|
+
d.costUSD = costUSD;
|
|
258
|
+
}
|
|
259
|
+
out.push(d);
|
|
260
|
+
}
|
|
261
|
+
out.sort((a, b) => a.start - b.start);
|
|
262
|
+
return out.slice(0, MAX_DISPATCHES);
|
|
263
|
+
}
|
|
264
|
+
/** Read the first `bytes` of a file without loading the whole (transcripts can be large). */
|
|
265
|
+
function readHead(file, bytes = 65536) {
|
|
266
|
+
const fd = openSync(file, 'r');
|
|
267
|
+
try {
|
|
268
|
+
const buf = Buffer.alloc(bytes);
|
|
269
|
+
const n = readSync(fd, buf, 0, bytes, 0);
|
|
270
|
+
return buf.toString('utf8', 0, n);
|
|
271
|
+
}
|
|
272
|
+
finally {
|
|
273
|
+
closeSync(fd);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
function defaultProjectsDir() {
|
|
277
|
+
return join(homedir(), '.claude', 'projects');
|
|
278
|
+
}
|
|
279
|
+
let _transcriptIndex = null;
|
|
280
|
+
function transcriptIndex(projectsDir) {
|
|
281
|
+
if (_transcriptIndex && _transcriptIndex.dir === projectsDir)
|
|
282
|
+
return _transcriptIndex.map;
|
|
283
|
+
const map = new Map();
|
|
284
|
+
try {
|
|
285
|
+
for (const dir of readdirSync(projectsDir)) {
|
|
286
|
+
let files;
|
|
287
|
+
try {
|
|
288
|
+
files = readdirSync(join(projectsDir, dir));
|
|
289
|
+
}
|
|
290
|
+
catch {
|
|
291
|
+
continue;
|
|
292
|
+
}
|
|
293
|
+
for (const f of files)
|
|
294
|
+
if (f.endsWith('.jsonl'))
|
|
295
|
+
map.set(f.slice(0, -6), join(projectsDir, dir, f));
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
catch {
|
|
299
|
+
/* no projects dir */
|
|
300
|
+
}
|
|
301
|
+
_transcriptIndex = { dir: projectsDir, map };
|
|
302
|
+
return map;
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Recover the real project (cwd) and git branch for a session from its Claude Code
|
|
306
|
+
* transcript (~/.claude/projects/<dir>/<session-id>.jsonl) — the authoritative record of
|
|
307
|
+
* where Claude Code ran. Native OTEL carries neither. Returns undefined if no transcript.
|
|
308
|
+
*/
|
|
309
|
+
export function lookupTranscriptCwd(sessionId, projectsDir = defaultProjectsDir()) {
|
|
310
|
+
const file = transcriptIndex(projectsDir).get(sessionId);
|
|
311
|
+
if (!file)
|
|
312
|
+
return undefined;
|
|
313
|
+
try {
|
|
314
|
+
for (const line of readHead(file).split('\n')) {
|
|
315
|
+
if (!line.trim())
|
|
316
|
+
continue;
|
|
317
|
+
let e;
|
|
318
|
+
try {
|
|
319
|
+
e = JSON.parse(line);
|
|
320
|
+
}
|
|
321
|
+
catch {
|
|
322
|
+
continue;
|
|
323
|
+
}
|
|
324
|
+
if (e.cwd || e.gitBranch)
|
|
325
|
+
return { cwd: e.cwd, branch: e.gitBranch };
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
catch {
|
|
329
|
+
/* unreadable */
|
|
330
|
+
}
|
|
331
|
+
return undefined;
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Synthesize MetricDelta records for a session so the aggregator computes tools, skills,
|
|
335
|
+
* agents, turns, title, and net lines. Turns are derived from user_prompt events (one delta
|
|
336
|
+
* each); all session activity is aggregated onto the first delta (the report shows session
|
|
337
|
+
* totals, not per-turn splits). A session with activity but no captured prompts still gets
|
|
338
|
+
* one delta so its tools/agents surface.
|
|
339
|
+
*/
|
|
340
|
+
export function buildDeltas(sessionEvents, cwd) {
|
|
341
|
+
const sid = sessionEvents.length ? sessionOf(sessionEvents[0]) : '';
|
|
342
|
+
const prompts = sessionEvents
|
|
343
|
+
.filter((e) => e.name === 'user_prompt')
|
|
344
|
+
.sort((a, b) => Date.parse(a.ts) - Date.parse(b.ts));
|
|
345
|
+
// Aggregate session activity.
|
|
346
|
+
const tools = {};
|
|
347
|
+
const toolStatus = {};
|
|
348
|
+
const agentInvocations = {};
|
|
349
|
+
const skillInvocations = {};
|
|
350
|
+
const models = new Set();
|
|
351
|
+
let linesAdded = 0;
|
|
352
|
+
let linesRemoved = 0;
|
|
353
|
+
for (const e of sessionEvents) {
|
|
354
|
+
if (e.name === 'tool_result') {
|
|
355
|
+
const tn = String(attr(e, 'tool_name') || '(unknown)');
|
|
356
|
+
tools[tn] = (tools[tn] || 0) + 1;
|
|
357
|
+
if (!toolStatus[tn])
|
|
358
|
+
toolStatus[tn] = { success: 0, failure: 0 };
|
|
359
|
+
if (String(attr(e, 'success')) === 'true')
|
|
360
|
+
toolStatus[tn].success += 1;
|
|
361
|
+
else
|
|
362
|
+
toolStatus[tn].failure += 1;
|
|
363
|
+
}
|
|
364
|
+
else if (e.name === 'subagent_completed') {
|
|
365
|
+
const a = String(attr(e, 'agent_type') || '(agent)');
|
|
366
|
+
agentInvocations[a] = (agentInvocations[a] || 0) + 1;
|
|
367
|
+
}
|
|
368
|
+
else if (e.name === 'skill_activated') {
|
|
369
|
+
const s = String(attr(e, 'skill.name') || '(skill)');
|
|
370
|
+
skillInvocations[s] = (skillInvocations[s] || 0) + 1;
|
|
371
|
+
}
|
|
372
|
+
else if (isApiRequest(e)) {
|
|
373
|
+
if (attr(e, 'model'))
|
|
374
|
+
models.add(String(attr(e, 'model')));
|
|
375
|
+
}
|
|
376
|
+
else if (e._type === 'metric' && e.name === 'claude_code.lines_of_code.count') {
|
|
377
|
+
const v = num(e.value);
|
|
378
|
+
if (attr(e, 'type') === 'added')
|
|
379
|
+
linesAdded += v;
|
|
380
|
+
else if (attr(e, 'type') === 'removed')
|
|
381
|
+
linesRemoved += v;
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
const hasActivity = Object.keys(tools).length > 0 ||
|
|
385
|
+
Object.keys(agentInvocations).length > 0 ||
|
|
386
|
+
Object.keys(skillInvocations).length > 0 ||
|
|
387
|
+
linesAdded > 0 ||
|
|
388
|
+
linesRemoved > 0 ||
|
|
389
|
+
models.size > 0;
|
|
390
|
+
const turnCount = prompts.length || (hasActivity ? 1 : 0);
|
|
391
|
+
if (turnCount === 0)
|
|
392
|
+
return [];
|
|
393
|
+
const branch = cwd?.branch;
|
|
394
|
+
const deltas = [];
|
|
395
|
+
for (let i = 0; i < turnCount; i++) {
|
|
396
|
+
const p = prompts[i];
|
|
397
|
+
deltas.push({
|
|
398
|
+
recordId: `${sid}-otel-${i}`,
|
|
399
|
+
sessionId: sid,
|
|
400
|
+
agentSessionId: sid,
|
|
401
|
+
timestamp: p ? Date.parse(p.ts) : (sessionEvents[0] ? Date.parse(sessionEvents[0].ts) : 0),
|
|
402
|
+
gitBranch: branch,
|
|
403
|
+
userPrompts: p ? [{ count: 1, text: String(attr(p, 'prompt') || '') }] : undefined,
|
|
404
|
+
syncStatus: 'synced',
|
|
405
|
+
syncAttempts: 0,
|
|
406
|
+
});
|
|
407
|
+
}
|
|
408
|
+
// Attach all aggregated activity to the first delta — totals are what the report shows.
|
|
409
|
+
const first = deltas[0];
|
|
410
|
+
if (Object.keys(tools).length)
|
|
411
|
+
first.tools = tools;
|
|
412
|
+
if (Object.keys(toolStatus).length)
|
|
413
|
+
first.toolStatus = toolStatus;
|
|
414
|
+
if (Object.keys(agentInvocations).length)
|
|
415
|
+
first.agentInvocations = agentInvocations;
|
|
416
|
+
if (Object.keys(skillInvocations).length)
|
|
417
|
+
first.skillInvocations = skillInvocations;
|
|
418
|
+
if (models.size)
|
|
419
|
+
first.models = [...models];
|
|
420
|
+
if (linesAdded > 0 || linesRemoved > 0) {
|
|
421
|
+
// OTEL's lines_of_code metric has no per-file path, so net lines are attributed to one
|
|
422
|
+
// synthetic aggregate path (the aggregator skips path-less ops). Consequence: a session's
|
|
423
|
+
// "files changed" reads 1 — net lines are accurate, per-file breakdown is not available.
|
|
424
|
+
first.fileOperations = [{ type: 'edit', path: '<otel:aggregate>', linesAdded, linesRemoved }];
|
|
425
|
+
}
|
|
426
|
+
return deltas;
|
|
427
|
+
}
|
|
428
|
+
/** Map of session id → cwd/branch, from this plugin's own session.start events. */
|
|
429
|
+
function buildCwdMap(events) {
|
|
430
|
+
const m = new Map();
|
|
431
|
+
for (const e of events) {
|
|
432
|
+
if (attr(e, 'event_type') === 'claude.session.start' || attr(e, 'cwd')) {
|
|
433
|
+
const sid = sessionOf(e);
|
|
434
|
+
if (sid && !m.has(sid)) {
|
|
435
|
+
m.set(sid, { cwd: attr(e, 'cwd') ? String(attr(e, 'cwd')) : undefined, branch: attr(e, 'git_branch') ? String(attr(e, 'git_branch')) : undefined });
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
return m;
|
|
440
|
+
}
|
|
441
|
+
/** Build one RawSessionData (with synthesized deltas) for a session's events. */
|
|
442
|
+
export function buildRawSession(sessionId, sessionEvents, cwd, projectLabel) {
|
|
443
|
+
const times = sessionEvents.map((e) => Date.parse(e.ts)).filter(Number.isFinite);
|
|
444
|
+
const startTime = times.length ? Math.min(...times) : 0;
|
|
445
|
+
const endTime = times.length ? Math.max(...times) : 0;
|
|
446
|
+
const workingDirectory = cwd?.cwd || projectLabel;
|
|
447
|
+
const startEvent = {
|
|
448
|
+
recordId: sessionId,
|
|
449
|
+
type: 'session_start',
|
|
450
|
+
timestamp: startTime,
|
|
451
|
+
codeMieSessionId: sessionId,
|
|
452
|
+
agentName: 'claude',
|
|
453
|
+
syncStatus: 'synced',
|
|
454
|
+
data: { provider: 'claude', workingDirectory, startTime },
|
|
455
|
+
};
|
|
456
|
+
const endEvent = {
|
|
457
|
+
recordId: `${sessionId}-end`,
|
|
458
|
+
type: 'session_end',
|
|
459
|
+
timestamp: endTime,
|
|
460
|
+
codeMieSessionId: sessionId,
|
|
461
|
+
agentName: 'claude',
|
|
462
|
+
syncStatus: 'synced',
|
|
463
|
+
data: { endTime, duration: Math.max(0, endTime - startTime), totalTurns: 0 },
|
|
464
|
+
};
|
|
465
|
+
return { sessionId, startEvent, endEvent, deltas: buildDeltas(sessionEvents, cwd) };
|
|
466
|
+
}
|
|
467
|
+
/** Load + map an OTEL events file into the analytics pipeline inputs. */
|
|
468
|
+
export function loadOtelSessions(opts) {
|
|
469
|
+
const projectLabel = opts.projectLabel ?? 'Unknown';
|
|
470
|
+
const cwdLookup = opts.cwdLookup ?? ((sid) => lookupTranscriptCwd(sid));
|
|
471
|
+
const events = parseOtelJsonl(readFileSync(opts.file, 'utf-8'));
|
|
472
|
+
// Owned sessions = those with an api_request matching the user/time filter.
|
|
473
|
+
const apiRequests = filterApiRequests(events, opts.filter);
|
|
474
|
+
const ownedSids = new Set(apiRequests.map(sessionOf).filter(Boolean));
|
|
475
|
+
// Group ALL events for owned sessions (deltas/dispatches need the full event variety).
|
|
476
|
+
const bySession = new Map();
|
|
477
|
+
for (const e of events) {
|
|
478
|
+
const sid = sessionOf(e);
|
|
479
|
+
if (sid && ownedSids.has(sid)) {
|
|
480
|
+
if (!bySession.has(sid))
|
|
481
|
+
bySession.set(sid, []);
|
|
482
|
+
bySession.get(sid).push(e);
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
const pluginCwdMap = buildCwdMap(events); // fallback for sessions recorded with this plugin
|
|
486
|
+
const { index, summary } = buildCostIndex(apiRequests);
|
|
487
|
+
// Attach per-session dispatches (Timeline) onto the cost index.
|
|
488
|
+
for (const [sid, evs] of bySession) {
|
|
489
|
+
const sc = index.get(sid);
|
|
490
|
+
if (sc) {
|
|
491
|
+
const d = buildDispatches(evs);
|
|
492
|
+
if (d.length)
|
|
493
|
+
sc.dispatches = d;
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
const rawSessions = [...bySession.entries()].map(([sid, evs]) => {
|
|
497
|
+
// Project/branch: transcript join first (authoritative, works for all sessions),
|
|
498
|
+
// then this plugin's session.start event as a fallback.
|
|
499
|
+
const cwd = cwdLookup(sid) ?? pluginCwdMap.get(sid);
|
|
500
|
+
return buildRawSession(sid, evs, cwd, projectLabel);
|
|
501
|
+
});
|
|
502
|
+
return { rawSessions, costIndex: index, summary };
|
|
503
|
+
}
|
|
504
|
+
//# sourceMappingURL=otel-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"otel-loader.js","sourceRoot":"","sources":["../../../../src/cli/commands/analytics/otel-loader.ts"],"names":[],"mappings":"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"}
|