@codemieai/code 0.7.1 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. package/dist/agents/core/AgentCLI.d.ts +4 -1
  2. package/dist/agents/core/AgentCLI.d.ts.map +1 -1
  3. package/dist/agents/core/AgentCLI.js +106 -5
  4. package/dist/agents/core/AgentCLI.js.map +1 -1
  5. package/dist/agents/core/session/session-origin-audit.d.ts +4 -0
  6. package/dist/agents/core/session/session-origin-audit.d.ts.map +1 -0
  7. package/dist/agents/core/session/session-origin-audit.js +57 -0
  8. package/dist/agents/core/session/session-origin-audit.js.map +1 -0
  9. package/dist/agents/core/session/session-ownership.d.ts +2 -0
  10. package/dist/agents/core/session/session-ownership.d.ts.map +1 -0
  11. package/dist/agents/core/session/session-ownership.js +27 -0
  12. package/dist/agents/core/session/session-ownership.js.map +1 -0
  13. package/dist/agents/core/types.d.ts +26 -0
  14. package/dist/agents/core/types.d.ts.map +1 -1
  15. package/dist/agents/plugins/claude/claude.plugin.d.ts +2 -1
  16. package/dist/agents/plugins/claude/claude.plugin.d.ts.map +1 -1
  17. package/dist/agents/plugins/claude/claude.plugin.js +16 -3
  18. package/dist/agents/plugins/claude/claude.plugin.js.map +1 -1
  19. package/dist/agents/plugins/claude/session/processors/claude.conversations-processor.d.ts.map +1 -1
  20. package/dist/agents/plugins/claude/session/processors/claude.conversations-processor.js +2 -0
  21. package/dist/agents/plugins/claude/session/processors/claude.conversations-processor.js.map +1 -1
  22. package/dist/agents/plugins/codex/codex.plugin.d.ts +8 -0
  23. package/dist/agents/plugins/codex/codex.plugin.d.ts.map +1 -1
  24. package/dist/agents/plugins/codex/codex.plugin.js +14 -0
  25. package/dist/agents/plugins/codex/codex.plugin.js.map +1 -1
  26. package/dist/agents/plugins/codex/session/processors/codex.conversations-processor.d.ts.map +1 -1
  27. package/dist/agents/plugins/codex/session/processors/codex.conversations-processor.js +2 -0
  28. package/dist/agents/plugins/codex/session/processors/codex.conversations-processor.js.map +1 -1
  29. package/dist/agents/plugins/gemini/session/processors/gemini.conversations-processor.d.ts.map +1 -1
  30. package/dist/agents/plugins/gemini/session/processors/gemini.conversations-processor.js +2 -0
  31. package/dist/agents/plugins/gemini/session/processors/gemini.conversations-processor.js.map +1 -1
  32. package/dist/agents/plugins/opencode/session/processors/opencode.conversations-processor.d.ts.map +1 -1
  33. package/dist/agents/plugins/opencode/session/processors/opencode.conversations-processor.js +2 -0
  34. package/dist/agents/plugins/opencode/session/processors/opencode.conversations-processor.js.map +1 -1
  35. package/dist/cli/commands/analytics/aggregator.js +1 -1
  36. package/dist/cli/commands/analytics/aggregator.js.map +1 -1
  37. package/dist/cli/commands/analytics/cost/cost-enricher.d.ts.map +1 -1
  38. package/dist/cli/commands/analytics/cost/cost-enricher.js +45 -9
  39. package/dist/cli/commands/analytics/cost/cost-enricher.js.map +1 -1
  40. package/dist/cli/commands/analytics/cost/pricing.d.ts +1 -0
  41. package/dist/cli/commands/analytics/cost/pricing.d.ts.map +1 -1
  42. package/dist/cli/commands/analytics/cost/pricing.js +66 -0
  43. package/dist/cli/commands/analytics/cost/pricing.js.map +1 -1
  44. package/dist/cli/commands/analytics/cost/pricing.json +8 -1
  45. package/dist/cli/commands/analytics/cost/usage-readers.d.ts +2 -0
  46. package/dist/cli/commands/analytics/cost/usage-readers.d.ts.map +1 -1
  47. package/dist/cli/commands/analytics/cost/usage-readers.js +36 -2
  48. package/dist/cli/commands/analytics/cost/usage-readers.js.map +1 -1
  49. package/dist/cli/commands/analytics/data-loader.d.ts +2 -3
  50. package/dist/cli/commands/analytics/data-loader.d.ts.map +1 -1
  51. package/dist/cli/commands/analytics/formatter.d.ts.map +1 -1
  52. package/dist/cli/commands/analytics/formatter.js +4 -1
  53. package/dist/cli/commands/analytics/formatter.js.map +1 -1
  54. package/dist/cli/commands/analytics/index.d.ts.map +1 -1
  55. package/dist/cli/commands/analytics/index.js +137 -134
  56. package/dist/cli/commands/analytics/index.js.map +1 -1
  57. package/dist/cli/commands/analytics/native-loader.d.ts +2 -0
  58. package/dist/cli/commands/analytics/native-loader.d.ts.map +1 -1
  59. package/dist/cli/commands/analytics/native-loader.js +85 -3
  60. package/dist/cli/commands/analytics/native-loader.js.map +1 -1
  61. package/dist/cli/commands/analytics/otel-loader.d.ts +97 -0
  62. package/dist/cli/commands/analytics/otel-loader.d.ts.map +1 -0
  63. package/dist/cli/commands/analytics/otel-loader.js +504 -0
  64. package/dist/cli/commands/analytics/otel-loader.js.map +1 -0
  65. package/dist/cli/commands/analytics/report/client/app.js +56 -25
  66. package/dist/cli/commands/analytics/report/payload-builder.d.ts.map +1 -1
  67. package/dist/cli/commands/analytics/report/payload-builder.js +8 -3
  68. package/dist/cli/commands/analytics/report/payload-builder.js.map +1 -1
  69. package/dist/cli/commands/analytics/report/session-source-detector.d.ts +29 -0
  70. package/dist/cli/commands/analytics/report/session-source-detector.d.ts.map +1 -0
  71. package/dist/cli/commands/analytics/report/session-source-detector.js +64 -0
  72. package/dist/cli/commands/analytics/report/session-source-detector.js.map +1 -0
  73. package/dist/cli/commands/analytics/report/template.html +6 -2
  74. package/dist/cli/commands/analytics/report/types.d.ts +2 -0
  75. package/dist/cli/commands/analytics/report/types.d.ts.map +1 -1
  76. package/dist/cli/commands/analytics/sources/otel-source.d.ts +12 -0
  77. package/dist/cli/commands/analytics/sources/otel-source.d.ts.map +1 -0
  78. package/dist/cli/commands/analytics/sources/otel-source.js +44 -0
  79. package/dist/cli/commands/analytics/sources/otel-source.js.map +1 -0
  80. package/dist/cli/commands/analytics/sources/sessions-source.d.ts +10 -0
  81. package/dist/cli/commands/analytics/sources/sessions-source.d.ts.map +1 -0
  82. package/dist/cli/commands/analytics/sources/sessions-source.js +27 -0
  83. package/dist/cli/commands/analytics/sources/sessions-source.js.map +1 -0
  84. package/dist/cli/commands/analytics/sources/types.d.ts +38 -0
  85. package/dist/cli/commands/analytics/sources/types.d.ts.map +1 -0
  86. package/dist/cli/commands/analytics/sources/types.js +2 -0
  87. package/dist/cli/commands/analytics/sources/types.js.map +1 -0
  88. package/dist/cli/commands/analytics/types.d.ts +7 -0
  89. package/dist/cli/commands/analytics/types.d.ts.map +1 -1
  90. package/dist/cli/commands/assistants/chat/index.d.ts.map +1 -1
  91. package/dist/cli/commands/assistants/chat/index.js +8 -0
  92. package/dist/cli/commands/assistants/chat/index.js.map +1 -1
  93. package/dist/cli/commands/assistants/chat/types.d.ts +1 -0
  94. package/dist/cli/commands/assistants/chat/types.d.ts.map +1 -1
  95. package/dist/cli/commands/assistants/setup/index.js +2 -2
  96. package/dist/cli/commands/assistants/setup/index.js.map +1 -1
  97. package/dist/cli/commands/doctor/checks/JWTAuthCheck.d.ts.map +1 -1
  98. package/dist/cli/commands/doctor/checks/JWTAuthCheck.js +4 -2
  99. package/dist/cli/commands/doctor/checks/JWTAuthCheck.js.map +1 -1
  100. package/dist/cli/commands/hook.d.ts.map +1 -1
  101. package/dist/cli/commands/hook.js +51 -0
  102. package/dist/cli/commands/hook.js.map +1 -1
  103. package/dist/cli/commands/models.js +1 -1
  104. package/dist/cli/commands/models.js.map +1 -1
  105. package/dist/cli/commands/skills/add.d.ts.map +1 -1
  106. package/dist/cli/commands/skills/add.js +4 -0
  107. package/dist/cli/commands/skills/add.js.map +1 -1
  108. package/dist/env/types.d.ts +2 -0
  109. package/dist/env/types.d.ts.map +1 -1
  110. package/dist/env/types.js.map +1 -1
  111. package/dist/providers/core/default-agent-hooks.d.ts +10 -0
  112. package/dist/providers/core/default-agent-hooks.d.ts.map +1 -0
  113. package/dist/providers/core/default-agent-hooks.js +54 -0
  114. package/dist/providers/core/default-agent-hooks.js.map +1 -0
  115. package/dist/providers/core/types.d.ts +20 -0
  116. package/dist/providers/core/types.d.ts.map +1 -1
  117. package/dist/providers/core/types.js +20 -0
  118. package/dist/providers/core/types.js.map +1 -1
  119. package/dist/providers/plugins/jwt/index.d.ts +2 -0
  120. package/dist/providers/plugins/jwt/index.d.ts.map +1 -1
  121. package/dist/providers/plugins/jwt/index.js +6 -3
  122. package/dist/providers/plugins/jwt/index.js.map +1 -1
  123. package/dist/providers/plugins/jwt/jwt.models.d.ts +12 -0
  124. package/dist/providers/plugins/jwt/jwt.models.d.ts.map +1 -0
  125. package/dist/providers/plugins/jwt/jwt.models.js +28 -0
  126. package/dist/providers/plugins/jwt/jwt.models.js.map +1 -0
  127. package/dist/providers/plugins/jwt/jwt.setup-steps.d.ts +1 -1
  128. package/dist/providers/plugins/jwt/jwt.setup-steps.d.ts.map +1 -1
  129. package/dist/providers/plugins/jwt/jwt.setup-steps.js +10 -9
  130. package/dist/providers/plugins/jwt/jwt.setup-steps.js.map +1 -1
  131. package/dist/providers/plugins/jwt/jwt.template.d.ts +1 -1
  132. package/dist/providers/plugins/jwt/jwt.template.d.ts.map +1 -1
  133. package/dist/providers/plugins/jwt/jwt.template.js +9 -6
  134. package/dist/providers/plugins/jwt/jwt.template.js.map +1 -1
  135. package/dist/providers/plugins/jwt/jwt.utils.d.ts +16 -0
  136. package/dist/providers/plugins/jwt/jwt.utils.d.ts.map +1 -0
  137. package/dist/providers/plugins/jwt/jwt.utils.js +21 -0
  138. package/dist/providers/plugins/jwt/jwt.utils.js.map +1 -0
  139. package/dist/providers/plugins/sso/proxy/sso.proxy.d.ts.map +1 -1
  140. package/dist/providers/plugins/sso/proxy/sso.proxy.js +3 -2
  141. package/dist/providers/plugins/sso/proxy/sso.proxy.js.map +1 -1
  142. package/dist/providers/plugins/sso/session/processors/conversations/syncProcessor.d.ts.map +1 -1
  143. package/dist/providers/plugins/sso/session/processors/conversations/syncProcessor.js +4 -0
  144. package/dist/providers/plugins/sso/session/processors/conversations/syncProcessor.js.map +1 -1
  145. package/dist/providers/plugins/sso/sso.template.d.ts.map +1 -1
  146. package/dist/providers/plugins/sso/sso.template.js +6 -82
  147. package/dist/providers/plugins/sso/sso.template.js.map +1 -1
  148. package/dist/utils/auth.d.ts +1 -1
  149. package/dist/utils/auth.d.ts.map +1 -1
  150. package/dist/utils/auth.js +18 -1
  151. package/dist/utils/auth.js.map +1 -1
  152. package/dist/utils/config.d.ts +14 -0
  153. package/dist/utils/config.d.ts.map +1 -1
  154. package/dist/utils/config.js +48 -7
  155. package/dist/utils/config.js.map +1 -1
  156. package/dist/utils/errors.d.ts +3 -0
  157. package/dist/utils/errors.d.ts.map +1 -1
  158. package/dist/utils/errors.js +12 -3
  159. package/dist/utils/errors.js.map +1 -1
  160. package/package.json +13 -9
  161. package/scripts/validate-secrets.js +82 -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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"}