context-lens 0.3.2 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/README.md +52 -16
  2. package/dist/analysis/ingest.d.ts +13 -0
  3. package/dist/analysis/ingest.d.ts.map +1 -0
  4. package/dist/analysis/ingest.js +75 -0
  5. package/dist/analysis/ingest.js.map +1 -0
  6. package/dist/analysis/server.d.ts +10 -0
  7. package/dist/analysis/server.d.ts.map +1 -0
  8. package/dist/analysis/server.js +95 -0
  9. package/dist/analysis/server.js.map +1 -0
  10. package/dist/analysis/watcher.d.ts +55 -0
  11. package/dist/analysis/watcher.d.ts.map +1 -0
  12. package/dist/analysis/watcher.js +170 -0
  13. package/dist/analysis/watcher.js.map +1 -0
  14. package/dist/cli-utils.d.ts +16 -0
  15. package/dist/cli-utils.d.ts.map +1 -1
  16. package/dist/cli-utils.js +185 -3
  17. package/dist/cli-utils.js.map +1 -1
  18. package/dist/cli.js +629 -88
  19. package/dist/cli.js.map +1 -1
  20. package/dist/core/conversation.d.ts +8 -1
  21. package/dist/core/conversation.d.ts.map +1 -1
  22. package/dist/core/conversation.js +38 -12
  23. package/dist/core/conversation.js.map +1 -1
  24. package/dist/core/parse.d.ts.map +1 -1
  25. package/dist/core/parse.js +17 -1
  26. package/dist/core/parse.js.map +1 -1
  27. package/dist/core/session-analysis.d.ts +100 -0
  28. package/dist/core/session-analysis.d.ts.map +1 -0
  29. package/dist/core/session-analysis.js +435 -0
  30. package/dist/core/session-analysis.js.map +1 -0
  31. package/dist/core/session-format.d.ts +20 -0
  32. package/dist/core/session-format.d.ts.map +1 -0
  33. package/dist/core/session-format.js +298 -0
  34. package/dist/core/session-format.js.map +1 -0
  35. package/dist/core.d.ts +4 -0
  36. package/dist/core.d.ts.map +1 -1
  37. package/dist/core.js +2 -0
  38. package/dist/core.js.map +1 -1
  39. package/dist/lhar/reader.d.ts +22 -0
  40. package/dist/lhar/reader.d.ts.map +1 -0
  41. package/dist/lhar/reader.js +43 -0
  42. package/dist/lhar/reader.js.map +1 -0
  43. package/dist/lhar/record.d.ts.map +1 -1
  44. package/dist/lhar/record.js +3 -0
  45. package/dist/lhar/record.js.map +1 -1
  46. package/dist/lhar/response.d.ts +8 -0
  47. package/dist/lhar/response.d.ts.map +1 -1
  48. package/dist/lhar/response.js +44 -0
  49. package/dist/lhar/response.js.map +1 -1
  50. package/dist/lhar/tools.d.ts +17 -0
  51. package/dist/lhar/tools.d.ts.map +1 -0
  52. package/dist/lhar/tools.js +48 -0
  53. package/dist/lhar/tools.js.map +1 -0
  54. package/dist/lhar-types.generated.d.ts +34 -0
  55. package/dist/lhar-types.generated.d.ts.map +1 -1
  56. package/dist/lhar.d.ts +4 -1
  57. package/dist/lhar.d.ts.map +1 -1
  58. package/dist/lhar.js +5 -1
  59. package/dist/lhar.js.map +1 -1
  60. package/dist/proxy/capture.d.ts +40 -0
  61. package/dist/proxy/capture.d.ts.map +1 -0
  62. package/dist/proxy/capture.js +56 -0
  63. package/dist/proxy/capture.js.map +1 -0
  64. package/dist/proxy/config.d.ts +16 -0
  65. package/dist/proxy/config.d.ts.map +1 -0
  66. package/dist/proxy/config.js +34 -0
  67. package/dist/proxy/config.js.map +1 -0
  68. package/dist/proxy/forward.d.ts +20 -0
  69. package/dist/proxy/forward.d.ts.map +1 -0
  70. package/dist/proxy/forward.js +210 -0
  71. package/dist/proxy/forward.js.map +1 -0
  72. package/dist/proxy/headers.d.ts +16 -0
  73. package/dist/proxy/headers.d.ts.map +1 -0
  74. package/dist/proxy/headers.js +37 -0
  75. package/dist/proxy/headers.js.map +1 -0
  76. package/dist/proxy/routing.d.ts +44 -0
  77. package/dist/proxy/routing.d.ts.map +1 -0
  78. package/dist/proxy/routing.js +114 -0
  79. package/dist/proxy/routing.js.map +1 -0
  80. package/dist/proxy/server.d.ts +27 -0
  81. package/dist/proxy/server.d.ts.map +1 -0
  82. package/dist/proxy/server.js +55 -0
  83. package/dist/proxy/server.js.map +1 -0
  84. package/dist/schemas.d.ts +328 -0
  85. package/dist/schemas.d.ts.map +1 -0
  86. package/dist/schemas.js +249 -0
  87. package/dist/schemas.js.map +1 -0
  88. package/dist/server/api.d.ts +3 -4
  89. package/dist/server/api.d.ts.map +1 -1
  90. package/dist/server/api.js +195 -220
  91. package/dist/server/api.js.map +1 -1
  92. package/dist/server/store.d.ts +23 -7
  93. package/dist/server/store.d.ts.map +1 -1
  94. package/dist/server/store.js +141 -50
  95. package/dist/server/store.js.map +1 -1
  96. package/dist/server/webui.d.ts +5 -2
  97. package/dist/server/webui.d.ts.map +1 -1
  98. package/dist/server/webui.js +32 -13
  99. package/dist/server/webui.js.map +1 -1
  100. package/dist/server-utils.d.ts +1 -2
  101. package/dist/server-utils.d.ts.map +1 -1
  102. package/dist/server-utils.js +0 -2
  103. package/dist/server-utils.js.map +1 -1
  104. package/dist/types.d.ts +1 -1
  105. package/dist/types.d.ts.map +1 -1
  106. package/dist/version.generated.d.ts +1 -1
  107. package/dist/version.generated.js +1 -1
  108. package/mitm_addon.py +99 -28
  109. package/package.json +12 -5
  110. package/schema/lhar.schema.json +50 -0
  111. package/dist/server/config.d.ts +0 -13
  112. package/dist/server/config.d.ts.map +0 -1
  113. package/dist/server/config.js +0 -36
  114. package/dist/server/config.js.map +0 -1
  115. package/dist/server/proxy.d.ts +0 -13
  116. package/dist/server/proxy.d.ts.map +0 -1
  117. package/dist/server/proxy.js +0 -218
  118. package/dist/server/proxy.js.map +0 -1
  119. package/dist/server/static.d.ts +0 -9
  120. package/dist/server/static.d.ts.map +0 -1
  121. package/dist/server/static.js +0 -78
  122. package/dist/server/static.js.map +0 -1
  123. package/dist/server.d.ts +0 -3
  124. package/dist/server.d.ts.map +0 -1
  125. package/dist/server.js +0 -43
  126. package/dist/server.js.map +0 -1
@@ -0,0 +1,435 @@
1
+ /**
2
+ * Session analysis: computes detailed statistics from LHAR entry records.
3
+ *
4
+ * Pure functions only (no I/O). Accepts parsed LharRecord arrays and
5
+ * returns structured analysis results.
6
+ */
7
+ // ---------------------------------------------------------------------------
8
+ // Internal helpers: entry accessors
9
+ // ---------------------------------------------------------------------------
10
+ function agentRole(e) {
11
+ return e.source.agent_role || "";
12
+ }
13
+ function cumTokens(e) {
14
+ return e.context_lens.growth.cumulative_tokens;
15
+ }
16
+ function isCompaction(e) {
17
+ return e.context_lens.growth.compaction_detected;
18
+ }
19
+ function finishReasons(e) {
20
+ return e.gen_ai.response.finish_reasons;
21
+ }
22
+ function costUsd(e) {
23
+ return e.usage_ext.cost_usd;
24
+ }
25
+ function model(e) {
26
+ return e.gen_ai.request.model;
27
+ }
28
+ // ---------------------------------------------------------------------------
29
+ // Compaction detection
30
+ // ---------------------------------------------------------------------------
31
+ export function findCompactions(entries) {
32
+ const compactions = [];
33
+ for (let i = 0; i < entries.length; i++) {
34
+ const e = entries[i];
35
+ if (!isCompaction(e))
36
+ continue;
37
+ // Find the best preceding entry: same agent_role, with a larger
38
+ // cumulative token count (the state right before compaction shrunk it).
39
+ let bestBefore = null;
40
+ const role = agentRole(e);
41
+ const after = cumTokens(e);
42
+ for (let j = i - 1; j >= 0; j--) {
43
+ const prev = entries[j];
44
+ if (agentRole(prev) !== role)
45
+ continue;
46
+ if (cumTokens(prev) >= after) {
47
+ bestBefore = cumTokens(prev);
48
+ break;
49
+ }
50
+ }
51
+ if (bestBefore === null || bestBefore === 0) {
52
+ compactions.push({
53
+ entryIndex: i,
54
+ sequence: e.sequence,
55
+ beforeTokens: 0,
56
+ afterTokens: after,
57
+ tokensLost: 0,
58
+ pctLost: 0,
59
+ });
60
+ continue;
61
+ }
62
+ const lost = bestBefore - after;
63
+ compactions.push({
64
+ entryIndex: i,
65
+ sequence: e.sequence,
66
+ beforeTokens: bestBefore,
67
+ afterTokens: after,
68
+ tokensLost: lost,
69
+ pctLost: bestBefore > 0 ? Math.round((lost / bestBefore) * 1000) / 10 : 0,
70
+ });
71
+ }
72
+ return compactions;
73
+ }
74
+ // ---------------------------------------------------------------------------
75
+ // Growth blocks
76
+ // ---------------------------------------------------------------------------
77
+ export function findGrowthBlocks(entries) {
78
+ // Use main agent entries; fall back to all if no main role detected
79
+ let main = entries.filter((e) => agentRole(e) === "main");
80
+ if (main.length === 0)
81
+ main = entries;
82
+ if (main.length === 0)
83
+ return [];
84
+ // Map from main-filtered index back to entries[] index
85
+ const mainIndices = entries
86
+ .map((e, i) => (agentRole(e) === "main" ? i : -1))
87
+ .filter((i) => i >= 0);
88
+ if (mainIndices.length === 0) {
89
+ // fallback: all entries
90
+ return findGrowthBlocksFromSlice(entries, entries.map((_, i) => i));
91
+ }
92
+ return findGrowthBlocksFromSlice(main, mainIndices);
93
+ }
94
+ function findGrowthBlocksFromSlice(slice, originalIndices) {
95
+ const blocks = [];
96
+ let blockStart = 0;
97
+ for (let i = 0; i < slice.length; i++) {
98
+ if (isCompaction(slice[i]) && i > blockStart) {
99
+ const prev = slice[i - 1];
100
+ const startE = slice[blockStart];
101
+ const num = i - blockStart;
102
+ const gained = cumTokens(prev) - cumTokens(startE);
103
+ blocks.push({
104
+ startIndex: originalIndices[blockStart],
105
+ endIndex: originalIndices[i - 1],
106
+ startTokens: cumTokens(startE),
107
+ endTokens: cumTokens(prev),
108
+ numEntries: num,
109
+ tokensGained: gained,
110
+ ratePerTurn: num > 0 ? Math.round((gained / num) * 10) / 10 : 0,
111
+ });
112
+ blockStart = i;
113
+ }
114
+ }
115
+ // Final block
116
+ if (blockStart < slice.length) {
117
+ const startE = slice[blockStart];
118
+ const endE = slice[slice.length - 1];
119
+ const num = slice.length - blockStart;
120
+ const gained = cumTokens(endE) - cumTokens(startE);
121
+ blocks.push({
122
+ startIndex: originalIndices[blockStart],
123
+ endIndex: originalIndices[slice.length - 1],
124
+ startTokens: cumTokens(startE),
125
+ endTokens: cumTokens(endE),
126
+ numEntries: num,
127
+ tokensGained: gained,
128
+ ratePerTurn: num > 0 ? Math.round((gained / num) * 10) / 10 : 0,
129
+ });
130
+ }
131
+ return blocks;
132
+ }
133
+ // ---------------------------------------------------------------------------
134
+ // User turns
135
+ // ---------------------------------------------------------------------------
136
+ export function identifyUserTurns(entries) {
137
+ if (entries.length === 0)
138
+ return [];
139
+ const turns = [];
140
+ let currentStart = 0;
141
+ let turnNumber = 1;
142
+ let lastMainEndTurnIdx = null;
143
+ for (let i = 1; i < entries.length; i++) {
144
+ const e = entries[i];
145
+ let isNewTurn = false;
146
+ if (agentRole(e) === "main" && lastMainEndTurnIdx !== null) {
147
+ const prevMain = entries[lastMainEndTurnIdx];
148
+ if (e.sequence > prevMain.sequence) {
149
+ isNewTurn = true;
150
+ }
151
+ }
152
+ if (isNewTurn) {
153
+ turns.push(buildUserTurn(turnNumber, currentStart, i - 1, entries.slice(currentStart, i)));
154
+ turnNumber++;
155
+ currentStart = i;
156
+ lastMainEndTurnIdx = null;
157
+ }
158
+ if (agentRole(e) === "main" && finishReasons(e).includes("end_turn")) {
159
+ lastMainEndTurnIdx = i;
160
+ }
161
+ }
162
+ // Final turn
163
+ turns.push(buildUserTurn(turnNumber, currentStart, entries.length - 1, entries.slice(currentStart)));
164
+ return turns;
165
+ }
166
+ function buildUserTurn(turnNumber, start, end, turnEntries) {
167
+ const models = new Set();
168
+ let cost = 0;
169
+ let peak = 0;
170
+ let compactions = 0;
171
+ for (const e of turnEntries) {
172
+ models.add(model(e));
173
+ const c = costUsd(e);
174
+ if (c)
175
+ cost += c;
176
+ const ct = cumTokens(e);
177
+ if (ct > peak)
178
+ peak = ct;
179
+ if (isCompaction(e))
180
+ compactions++;
181
+ }
182
+ return {
183
+ turnNumber,
184
+ startEntryIndex: start,
185
+ endEntryIndex: end,
186
+ numApiCalls: turnEntries.length,
187
+ modelsUsed: [...models].sort(),
188
+ totalCost: Math.round(cost * 1_000_000) / 1_000_000,
189
+ peakContextTokens: peak,
190
+ compactionsInTurn: compactions,
191
+ };
192
+ }
193
+ // ---------------------------------------------------------------------------
194
+ // Agent path trace
195
+ // ---------------------------------------------------------------------------
196
+ export function buildAgentPaths(entries, userTurns) {
197
+ return userTurns.map((turn) => {
198
+ const turnEntries = entries.slice(turn.startEntryIndex, turn.endEntryIndex + 1);
199
+ return turnEntries.map((e, i) => {
200
+ let action;
201
+ if (isCompaction(e)) {
202
+ action = "compaction";
203
+ }
204
+ else if (finishReasons(e).includes("tool_use")) {
205
+ action = "tool_use";
206
+ }
207
+ else if (finishReasons(e).includes("end_turn")) {
208
+ action = "end_turn";
209
+ }
210
+ else if (finishReasons(e).length === 0) {
211
+ action = "no_response";
212
+ }
213
+ else {
214
+ action = finishReasons(e).join(", ");
215
+ }
216
+ return {
217
+ entryIndex: turn.startEntryIndex + i,
218
+ sequence: e.sequence,
219
+ agentRole: agentRole(e),
220
+ model: model(e),
221
+ action,
222
+ contextTokens: cumTokens(e),
223
+ costUsd: costUsd(e),
224
+ };
225
+ });
226
+ });
227
+ }
228
+ // ---------------------------------------------------------------------------
229
+ // Timing & cache stats
230
+ // ---------------------------------------------------------------------------
231
+ function computeTimingStats(entries) {
232
+ if (entries.length === 0) {
233
+ return {
234
+ wallTimeMs: 0,
235
+ totalApiTimeMs: 0,
236
+ medianApiTimeMs: 0,
237
+ medianTokensPerSecond: null,
238
+ totalOutputTokens: 0,
239
+ totalInputTokens: 0,
240
+ };
241
+ }
242
+ // Wall time: first timestamp to last timestamp
243
+ const timestamps = entries.map((e) => new Date(e.timestamp).getTime());
244
+ const firstTs = Math.min(...timestamps);
245
+ const lastTs = Math.max(...timestamps);
246
+ // Add the duration of the last entry to get true wall time
247
+ const lastEntry = entries[entries.length - 1];
248
+ const lastDuration = lastEntry.timings?.total_ms ?? 0;
249
+ const wallTimeMs = lastTs - firstTs + lastDuration;
250
+ // API call durations
251
+ const durations = [];
252
+ let totalApiTimeMs = 0;
253
+ for (const e of entries) {
254
+ if (e.timings && e.timings.total_ms > 0) {
255
+ durations.push(e.timings.total_ms);
256
+ totalApiTimeMs += e.timings.total_ms;
257
+ }
258
+ }
259
+ // Median duration
260
+ durations.sort((a, b) => a - b);
261
+ const medianApiTimeMs = durations.length > 0 ? durations[Math.floor(durations.length / 2)] : 0;
262
+ // Tokens per second
263
+ const tpsList = [];
264
+ for (const e of entries) {
265
+ if (e.timings?.tokens_per_second != null &&
266
+ e.timings.tokens_per_second > 0) {
267
+ tpsList.push(e.timings.tokens_per_second);
268
+ }
269
+ }
270
+ tpsList.sort((a, b) => a - b);
271
+ const medianTokensPerSecond = tpsList.length > 0 ? tpsList[Math.floor(tpsList.length / 2)] : null;
272
+ // Total I/O tokens
273
+ let totalOutputTokens = 0;
274
+ let totalInputTokens = 0;
275
+ for (const e of entries) {
276
+ totalOutputTokens += e.gen_ai.usage.output_tokens;
277
+ totalInputTokens += e.gen_ai.usage.input_tokens;
278
+ }
279
+ return {
280
+ wallTimeMs,
281
+ totalApiTimeMs,
282
+ medianApiTimeMs,
283
+ medianTokensPerSecond,
284
+ totalOutputTokens,
285
+ totalInputTokens,
286
+ };
287
+ }
288
+ function computeCacheStats(entries) {
289
+ let totalCacheReadTokens = 0;
290
+ let totalCacheWriteTokens = 0;
291
+ let totalInputTokens = 0;
292
+ for (const e of entries) {
293
+ totalCacheReadTokens += e.usage_ext.cache_read_tokens;
294
+ totalCacheWriteTokens += e.usage_ext.cache_write_tokens;
295
+ // Effective input = base input + cache read + cache write
296
+ totalInputTokens +=
297
+ e.gen_ai.usage.input_tokens +
298
+ e.usage_ext.cache_read_tokens +
299
+ e.usage_ext.cache_write_tokens;
300
+ }
301
+ const cacheHitRate = totalInputTokens > 0
302
+ ? Math.round((totalCacheReadTokens / totalInputTokens) * 1000) / 1000
303
+ : 0;
304
+ return { totalCacheReadTokens, totalCacheWriteTokens, cacheHitRate };
305
+ }
306
+ export function analyzeSession(session, allEntries, filename, opts = {}) {
307
+ const entries = opts.mainOnly
308
+ ? allEntries.filter((e) => agentRole(e) === "main")
309
+ : allEntries;
310
+ if (entries.length === 0) {
311
+ return emptyAnalysis(filename, session);
312
+ }
313
+ // Primary model: most common model among main agent entries
314
+ const modelCounts = new Map();
315
+ for (const e of allEntries) {
316
+ if (agentRole(e) === "main") {
317
+ const m = model(e);
318
+ modelCounts.set(m, (modelCounts.get(m) || 0) + 1);
319
+ }
320
+ }
321
+ let primaryModel = session?.model || "";
322
+ if (modelCounts.size > 0) {
323
+ let maxCount = 0;
324
+ for (const [m, count] of modelCounts) {
325
+ if (count > maxCount) {
326
+ primaryModel = m;
327
+ maxCount = count;
328
+ }
329
+ }
330
+ }
331
+ if (!primaryModel) {
332
+ primaryModel = model(entries[0]);
333
+ }
334
+ const tool = session?.tool || entries[0].source.tool || "";
335
+ const startedAt = session?.started_at || entries[0].timestamp;
336
+ const mainCount = allEntries.filter((e) => agentRole(e) === "main").length;
337
+ const subagentCount = allEntries.filter((e) => agentRole(e) === "subagent").length;
338
+ // Context timeline: main agent only
339
+ let timelineEntries = entries.filter((e) => agentRole(e) === "main");
340
+ if (timelineEntries.length === 0)
341
+ timelineEntries = entries;
342
+ const contextTimeline = timelineEntries.map((e) => {
343
+ const idx = entries.indexOf(e);
344
+ return [idx, cumTokens(e)];
345
+ });
346
+ // Compaction events
347
+ const compactions = findCompactions(entries);
348
+ // Growth blocks
349
+ const growthBlocks = findGrowthBlocks(entries);
350
+ // User turns
351
+ const userTurns = identifyUserTurns(entries);
352
+ // Total cost (across all entries, including subagent)
353
+ let totalCost = 0;
354
+ for (const e of allEntries) {
355
+ const c = costUsd(e);
356
+ if (c)
357
+ totalCost += c;
358
+ }
359
+ // Composition: last main agent entry
360
+ let lastMain = entries.filter((e) => agentRole(e) === "main");
361
+ if (lastMain.length === 0)
362
+ lastMain = entries;
363
+ const compositionLast = lastMain[lastMain.length - 1].context_lens.composition;
364
+ // Composition: entry right before each compaction (same agent role)
365
+ const compositionsPreCompaction = [];
366
+ for (const comp of compactions) {
367
+ const compactedEntry = entries[comp.entryIndex];
368
+ const role = agentRole(compactedEntry);
369
+ for (let j = comp.entryIndex - 1; j >= 0; j--) {
370
+ const prev = entries[j];
371
+ if (agentRole(prev) === role &&
372
+ cumTokens(prev) >= cumTokens(compactedEntry)) {
373
+ compositionsPreCompaction.push([j, prev.context_lens.composition]);
374
+ break;
375
+ }
376
+ }
377
+ }
378
+ // Agent paths
379
+ const agentPaths = buildAgentPaths(entries, userTurns);
380
+ // Timing and cache stats (computed across all entries, not filtered)
381
+ const timing = computeTimingStats(allEntries);
382
+ const cache = computeCacheStats(allEntries);
383
+ return {
384
+ filename,
385
+ tool,
386
+ primaryModel,
387
+ startedAt,
388
+ totalEntries: allEntries.length,
389
+ mainEntries: mainCount,
390
+ subagentEntries: subagentCount,
391
+ userTurns,
392
+ contextTimeline,
393
+ growthBlocks,
394
+ compactions,
395
+ totalCostUsd: Math.round(totalCost * 10_000) / 10_000,
396
+ compositionLast,
397
+ compositionsPreCompaction,
398
+ agentPaths,
399
+ timing,
400
+ cache,
401
+ };
402
+ }
403
+ function emptyAnalysis(filename, session) {
404
+ return {
405
+ filename,
406
+ tool: session?.tool || "",
407
+ primaryModel: session?.model || "unknown",
408
+ startedAt: session?.started_at || "",
409
+ totalEntries: 0,
410
+ mainEntries: 0,
411
+ subagentEntries: 0,
412
+ userTurns: [],
413
+ contextTimeline: [],
414
+ growthBlocks: [],
415
+ compactions: [],
416
+ totalCostUsd: 0,
417
+ compositionLast: [],
418
+ compositionsPreCompaction: [],
419
+ agentPaths: [],
420
+ timing: {
421
+ wallTimeMs: 0,
422
+ totalApiTimeMs: 0,
423
+ medianApiTimeMs: 0,
424
+ medianTokensPerSecond: null,
425
+ totalOutputTokens: 0,
426
+ totalInputTokens: 0,
427
+ },
428
+ cache: {
429
+ totalCacheReadTokens: 0,
430
+ totalCacheWriteTokens: 0,
431
+ cacheHitRate: 0,
432
+ },
433
+ };
434
+ }
435
+ //# sourceMappingURL=session-analysis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-analysis.js","sourceRoot":"","sources":["../../src/core/session-analysis.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Human-readable formatting for session analysis results.
3
+ *
4
+ * Produces the text output for `context-lens analyze`.
5
+ */
6
+ import type { LharRecord } from "../lhar-types.generated.js";
7
+ import type { SessionAnalysis } from "./session-analysis.js";
8
+ export declare function fmtTokens(n: number): string;
9
+ export declare function fmtCost(c: number | null): string;
10
+ export declare function shortModel(m: string): string;
11
+ export declare function fmtDuration(ms: number): string;
12
+ export interface FormatOptions {
13
+ showPath?: boolean;
14
+ /** "last" | "pre-compaction" | number (turn number, 1-indexed) */
15
+ composition?: string;
16
+ /** Parsed entries, needed when --composition=N is used to look up a specific turn */
17
+ entries?: LharRecord[];
18
+ }
19
+ export declare function formatSessionAnalysis(a: SessionAnalysis, opts?: FormatOptions): string;
20
+ //# sourceMappingURL=session-format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-format.d.ts","sourceRoot":"","sources":["../../src/core/session-format.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAoB,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC/E,OAAO,KAAK,EAAiB,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAM5E,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAI3C;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAIhD;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAc5C;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAU9C;AAyCD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,kEAAkE;IAClE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qFAAqF;IACrF,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC;CACxB;AAED,wBAAgB,qBAAqB,CACnC,CAAC,EAAE,eAAe,EAClB,IAAI,GAAE,aAAkB,GACvB,MAAM,CAoRR"}