@roberttlange/agentlens 0.2.3 → 0.3.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 (38) hide show
  1. package/dist/browser.js +154 -20
  2. package/dist/browser.js.map +1 -1
  3. package/dist/main.test.js +138 -1
  4. package/dist/main.test.js.map +1 -1
  5. package/node_modules/@agentlens/contracts/dist/index.d.ts +109 -0
  6. package/node_modules/@agentlens/core/dist/__tests__/config.test.js +18 -0
  7. package/node_modules/@agentlens/core/dist/__tests__/config.test.js.map +1 -1
  8. package/node_modules/@agentlens/core/dist/__tests__/index.test.js +370 -2
  9. package/node_modules/@agentlens/core/dist/__tests__/index.test.js.map +1 -1
  10. package/node_modules/@agentlens/core/dist/config.js +33 -0
  11. package/node_modules/@agentlens/core/dist/config.js.map +1 -1
  12. package/node_modules/@agentlens/core/dist/metrics.d.ts +13 -0
  13. package/node_modules/@agentlens/core/dist/metrics.js +98 -2
  14. package/node_modules/@agentlens/core/dist/metrics.js.map +1 -1
  15. package/node_modules/@agentlens/core/dist/sourceProfiles.js +4 -0
  16. package/node_modules/@agentlens/core/dist/sourceProfiles.js.map +1 -1
  17. package/node_modules/@agentlens/core/dist/traceIndex.d.ts +22 -1
  18. package/node_modules/@agentlens/core/dist/traceIndex.js +322 -21
  19. package/node_modules/@agentlens/core/dist/traceIndex.js.map +1 -1
  20. package/node_modules/@agentlens/server/dist/activity-cache.d.ts +6 -3
  21. package/node_modules/@agentlens/server/dist/activity-cache.js +6 -0
  22. package/node_modules/@agentlens/server/dist/activity-cache.js.map +1 -1
  23. package/node_modules/@agentlens/server/dist/activity-cache.test.js +86 -0
  24. package/node_modules/@agentlens/server/dist/activity-cache.test.js.map +1 -1
  25. package/node_modules/@agentlens/server/dist/activity.d.ts +20 -1
  26. package/node_modules/@agentlens/server/dist/activity.js +482 -6
  27. package/node_modules/@agentlens/server/dist/activity.js.map +1 -1
  28. package/node_modules/@agentlens/server/dist/app.d.ts +4 -2
  29. package/node_modules/@agentlens/server/dist/app.js +242 -5
  30. package/node_modules/@agentlens/server/dist/app.js.map +1 -1
  31. package/node_modules/@agentlens/server/dist/app.test.js +669 -8
  32. package/node_modules/@agentlens/server/dist/app.test.js.map +1 -1
  33. package/node_modules/@agentlens/server/dist/web/assets/index-CTFOBaBt.css +1 -0
  34. package/node_modules/@agentlens/server/dist/web/assets/index-CVf00w06.js +52 -0
  35. package/node_modules/@agentlens/server/dist/web/index.html +2 -2
  36. package/package.json +1 -1
  37. package/node_modules/@agentlens/server/dist/web/assets/index-DjwZvHl6.css +0 -1
  38. package/node_modules/@agentlens/server/dist/web/assets/index-Ei_qfgA9.js +0 -52
@@ -2,6 +2,7 @@ export type AgentKind = "claude" | "codex" | "cursor" | "opencode" | "gemini" |
2
2
  export type EventKind = "system" | "assistant" | "user" | "tool_use" | "tool_result" | "reasoning" | "compaction" | "meta";
3
3
  export type SessionActivityStatus = "running" | "waiting_input" | "idle";
4
4
  export type ActivityBinsMode = "time" | "event_index";
5
+ export type ActivityHeatmapMetric = "sessions" | "output_tokens" | "total_cost_usd";
5
6
  export type CostUnknownModelPolicy = "n_a" | "zero";
6
7
  export type ScanMode = "adaptive" | "fixed";
7
8
  export type RetentionStrategy = "aggressive_recency" | "full_memory";
@@ -36,6 +37,10 @@ export interface TraceInspectorConfig {
36
37
  showAgentBadges: boolean;
37
38
  showHealthDiagnostics: boolean;
38
39
  }
40
+ export interface ActivityHeatmapConfig {
41
+ metric: ActivityHeatmapMetric;
42
+ color: string;
43
+ }
39
44
  export interface RedactionConfig {
40
45
  mode: "strict" | "off";
41
46
  alwaysOn: boolean;
@@ -108,6 +113,7 @@ export interface AppConfig {
108
113
  sessionLogDirectories: SessionLogDirectoryConfig[];
109
114
  sources: Record<string, SourceProfileConfig>;
110
115
  traceInspector: TraceInspectorConfig;
116
+ activityHeatmap: ActivityHeatmapConfig;
111
117
  redaction: RedactionConfig;
112
118
  cost: CostConfig;
113
119
  models: ModelsConfig;
@@ -196,10 +202,55 @@ export interface TracePage {
196
202
  nextBefore: string;
197
203
  liveCursor: string;
198
204
  }
205
+ export type IndexStartupPhase = "cold" | "bootstrapping" | "hydrating" | "ready" | "failed";
206
+ export interface IndexStartupStatus {
207
+ phase: IndexStartupPhase;
208
+ inspectorReady: boolean;
209
+ fullReady: boolean;
210
+ isPartial: boolean;
211
+ discoveredTraceCount: number;
212
+ hydratedTraceCount: number;
213
+ startupError?: string;
214
+ }
215
+ export type TraceIndexStartupState = IndexStartupStatus;
216
+ export interface ActivityHydrationProgress {
217
+ ready: boolean;
218
+ relevantDiscoveredCount: number;
219
+ relevantHydratedCount: number;
220
+ percent: number;
221
+ }
222
+ export type LiveDeltaType = "trace_added" | "trace_updated" | "trace_removed" | "events_appended" | "overview_updated";
223
+ export interface LiveEnvelopeBase<TType extends string, TPayload> {
224
+ id: string;
225
+ type: TType;
226
+ version: number;
227
+ payload: TPayload;
228
+ }
229
+ export type TraceUpsertLiveEnvelope = LiveEnvelopeBase<"trace_added" | "trace_updated", {
230
+ summary: TraceSummary;
231
+ }>;
232
+ export type TraceRemovedLiveEnvelope = LiveEnvelopeBase<"trace_removed", {
233
+ id: string;
234
+ }>;
235
+ export type EventsAppendedLiveEnvelope = LiveEnvelopeBase<"events_appended", {
236
+ id: string;
237
+ appended: number;
238
+ latestEvents?: NormalizedEvent[];
239
+ }>;
240
+ export type OverviewUpdatedLiveEnvelope = LiveEnvelopeBase<"overview_updated", {
241
+ overview: OverviewStats;
242
+ startup: IndexStartupStatus;
243
+ }>;
244
+ export type LiveDeltaEnvelope = TraceUpsertLiveEnvelope | TraceRemovedLiveEnvelope | EventsAppendedLiveEnvelope | OverviewUpdatedLiveEnvelope;
245
+ export type LiveBatchEnvelope = LiveEnvelopeBase<"batch", {
246
+ events: LiveDeltaEnvelope[];
247
+ }>;
199
248
  export interface AgentActivityBin {
200
249
  startMs: number;
201
250
  endMs: number;
202
251
  activeSessionCount: number;
252
+ heatmapValue: number;
253
+ heatmapValues?: ActivityHeatmapMetricValues;
203
254
  activeTraceIds: string[];
204
255
  primaryTraceId: string;
205
256
  activeByAgent: Record<AgentKind, number>;
@@ -209,6 +260,16 @@ export interface AgentActivityBin {
209
260
  dominantEventKind: EventKind | "none";
210
261
  isBreak: boolean;
211
262
  }
263
+ export interface ActivityHeatmapPresentation {
264
+ metric: ActivityHeatmapMetric;
265
+ color: string;
266
+ palette: [string, string, string, string, string];
267
+ }
268
+ export interface ActivityHeatmapMetricValues {
269
+ sessions: number;
270
+ output_tokens: number;
271
+ total_cost_usd: number;
272
+ }
212
273
  export interface AgentActivityDay {
213
274
  dateLocal: string;
214
275
  tzOffsetMinutes: number;
@@ -219,6 +280,7 @@ export interface AgentActivityDay {
219
280
  totalSessionsInWindow: number;
220
281
  peakConcurrentSessions: number;
221
282
  peakConcurrentAtMs: number | null;
283
+ totalEventCount: number;
222
284
  bins: AgentActivityBin[];
223
285
  }
224
286
  export interface AgentActivityWeekDay {
@@ -226,11 +288,15 @@ export interface AgentActivityWeekDay {
226
288
  windowStartMs: number;
227
289
  windowEndMs: number;
228
290
  totalSessionsInWindow: number;
291
+ heatmapValue: number;
292
+ heatmapValues?: ActivityHeatmapMetricValues;
229
293
  peakConcurrentSessions: number;
230
294
  peakConcurrentAtMs: number | null;
295
+ totalEventCount: number;
231
296
  bins: AgentActivityBin[];
232
297
  }
233
298
  export interface AgentActivityWeek {
299
+ presentation: ActivityHeatmapPresentation;
234
300
  tzOffsetMinutes: number;
235
301
  dayCount: number;
236
302
  slotMinutes: number;
@@ -239,6 +305,49 @@ export interface AgentActivityWeek {
239
305
  startDateLocal: string;
240
306
  endDateLocal: string;
241
307
  days: AgentActivityWeekDay[];
308
+ usageSummary?: ActivityUsageSummary;
309
+ }
310
+ export interface ActivityUsageSummaryRow {
311
+ agent: AgentKind;
312
+ sessionHours: number;
313
+ sessionSharePct: number;
314
+ uniqueSessions: number;
315
+ activeSlots: number;
316
+ activeDays: number;
317
+ peakConcurrentSessions: number;
318
+ inputTokens: number;
319
+ cacheTokens: number;
320
+ outputTokens: number;
321
+ }
322
+ export interface ActivityUsageSummaryTotals {
323
+ totalUniqueSessions: number;
324
+ totalSessionHours: number;
325
+ peakAllAgentConcurrency: number;
326
+ mostUsedAgent: AgentKind | null;
327
+ }
328
+ export interface ActivityUsageSummary {
329
+ rows: ActivityUsageSummaryRow[];
330
+ totals: ActivityUsageSummaryTotals;
331
+ }
332
+ export interface AgentActivityYearDay {
333
+ dateLocal: string;
334
+ windowStartMs: number;
335
+ windowEndMs: number;
336
+ totalSessionsInWindow: number;
337
+ heatmapValue: number;
338
+ heatmapValues?: ActivityHeatmapMetricValues;
339
+ peakConcurrentSessions: number;
340
+ peakConcurrentAtMs: number | null;
341
+ totalEventCount: number;
342
+ }
343
+ export interface AgentActivityYear {
344
+ presentation: ActivityHeatmapPresentation;
345
+ tzOffsetMinutes: number;
346
+ dayCount: number;
347
+ startDateLocal: string;
348
+ endDateLocal: string;
349
+ days: AgentActivityYearDay[];
350
+ usageSummary: ActivityUsageSummary;
242
351
  }
243
352
  export interface OverviewStats {
244
353
  traceCount: number;
@@ -23,6 +23,8 @@ describe("config", () => {
23
23
  expect(config.cost.modelRates.some((rate) => rate.model === "claude-opus-4-5-20251101")).toBe(true);
24
24
  expect(config.models.defaultContextWindowTokens).toBeGreaterThan(0);
25
25
  expect(config.models.contextWindows.some((entry) => entry.model === "gpt-5.2-codex")).toBe(true);
26
+ expect(config.activityHeatmap.metric).toBe("sessions");
27
+ expect(config.activityHeatmap.color).toBe("#dc2626");
26
28
  expect(config.models.contextWindows.some((entry) => entry.model === "gpt-5.2-codex" && entry.contextWindowTokens === 400_000)).toBe(true);
27
29
  expect(config.models.contextWindows.some((entry) => entry.model === "claude-sonnet-4-5-20250929" && entry.contextWindowTokens === 200_000)).toBe(true);
28
30
  expect(config.models.contextWindows.some((entry) => entry.model === "gpt-5.4" && entry.contextWindowTokens === 1_050_000)).toBe(true);
@@ -139,6 +141,10 @@ contextWindowTokens = 400000
139
141
  [models]
140
142
  defaultContextWindowTokens = 123456
141
143
 
144
+ [activityHeatmap]
145
+ metric = "output_tokens"
146
+ color = "#16a34a"
147
+
142
148
  [[models.contextWindows]]
143
149
  model = "gpt-5.3-codex"
144
150
  contextWindowTokens = 272000
@@ -171,6 +177,8 @@ maxResidentEventsPerWarmTrace = 20
171
177
  expect(gpt53CodexRate?.contextWindowTokens).toBe(400000);
172
178
  expect(config.models.defaultContextWindowTokens).toBe(123456);
173
179
  expect(config.models.contextWindows.find((entry) => entry.model === "gpt-5.3-codex")?.contextWindowTokens).toBe(272000);
180
+ expect(config.activityHeatmap.metric).toBe("output_tokens");
181
+ expect(config.activityHeatmap.color).toBe("#16a34a");
174
182
  expect(config.scan.mode).toBe("fixed");
175
183
  expect(config.scan.intervalSeconds).toBe(7);
176
184
  expect(config.scan.batchDebounceMs).toBe(88);
@@ -210,5 +218,15 @@ maxResidentEventsPerWarmTrace = 20
210
218
  expect(codexWindow?.contextWindowTokens).toBe(123_000);
211
219
  expect(gpt54Window?.contextWindowTokens).toBe(1_050_000);
212
220
  });
221
+ it("falls back to default activity heatmap values for invalid input", () => {
222
+ const config = mergeConfig({
223
+ activityHeatmap: {
224
+ metric: "bogus",
225
+ color: "red",
226
+ },
227
+ });
228
+ expect(config.activityHeatmap.metric).toBe("sessions");
229
+ expect(config.activityHeatmap.color).toBe("#dc2626");
230
+ });
213
231
  });
214
232
  //# sourceMappingURL=config.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.test.js","sourceRoot":"","sources":["../../src/__tests__/config.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.test.js","sourceRoot":"","sources":["../../src/__tests__/config.test.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,49 @@
1
- import { appendFile, mkdtemp, mkdir, writeFile } from "node:fs/promises";
1
+ import { appendFile, mkdtemp, mkdir, utimes, writeFile } from "node:fs/promises";
2
2
  import os from "node:os";
3
3
  import path from "node:path";
4
- import { describe, expect, it } from "vitest";
4
+ import { describe, expect, it, vi } from "vitest";
5
5
  import { mergeConfig } from "../config.js";
6
6
  import { TraceIndex } from "../traceIndex.js";
7
7
  async function createTempRoot() {
8
8
  return mkdtemp(path.join(os.tmpdir(), "agentlens-core-"));
9
9
  }
10
+ function buildCodexTraceLog(sessionId, sequence) {
11
+ const firstTs = new Date(Date.UTC(2026, 1, 11, 10, 0, sequence)).toISOString();
12
+ const secondTs = new Date(Date.UTC(2026, 1, 11, 10, 0, sequence + 1)).toISOString();
13
+ return [
14
+ JSON.stringify({
15
+ timestamp: firstTs,
16
+ type: "session_meta",
17
+ payload: { id: sessionId, cwd: "/tmp/project", cli_version: "0.1.0" },
18
+ }),
19
+ JSON.stringify({
20
+ timestamp: secondTs,
21
+ type: "response_item",
22
+ payload: {
23
+ type: "message",
24
+ role: "assistant",
25
+ content: [{ type: "output_text", text: `trace ${sequence}` }],
26
+ },
27
+ }),
28
+ ].join("\n");
29
+ }
30
+ async function waitForCondition(predicate, options = {}) {
31
+ const timeoutMs = options.timeoutMs ?? 5_000;
32
+ const intervalMs = options.intervalMs ?? 25;
33
+ const deadline = Date.now() + timeoutMs;
34
+ for (;;) {
35
+ try {
36
+ predicate();
37
+ return;
38
+ }
39
+ catch (error) {
40
+ if (Date.now() >= deadline) {
41
+ throw error;
42
+ }
43
+ await new Promise((resolve) => setTimeout(resolve, intervalMs));
44
+ }
45
+ }
46
+ }
10
47
  describe("trace index", () => {
11
48
  it("defaults sessionLogDirectories to common agent homes with explicit log types", () => {
12
49
  const config = mergeConfig();
@@ -48,6 +85,113 @@ describe("trace index", () => {
48
85
  { directory: "~/.pi", logType: "pi" },
49
86
  ]);
50
87
  });
88
+ it("arms the watcher before bootstrap hydration during start", async () => {
89
+ const baseConfig = mergeConfig({ sessionLogDirectories: [] });
90
+ const config = {
91
+ ...baseConfig,
92
+ sessionLogDirectories: [],
93
+ sources: Object.fromEntries(Object.entries(baseConfig.sources).map(([key, value]) => [
94
+ key,
95
+ {
96
+ ...value,
97
+ enabled: false,
98
+ roots: [],
99
+ },
100
+ ])),
101
+ };
102
+ const index = new TraceIndex(config);
103
+ const internal = index;
104
+ const calls = [];
105
+ const bootstrapSpy = vi.spyOn(internal, "bootstrapRecentTraces").mockImplementation(async () => {
106
+ calls.push("bootstrap");
107
+ });
108
+ const restartWatcherSpy = vi.spyOn(internal, "restartWatcher").mockImplementation(async () => {
109
+ calls.push("watcher");
110
+ });
111
+ try {
112
+ await index.start();
113
+ expect(calls).toEqual(["watcher", "bootstrap"]);
114
+ }
115
+ finally {
116
+ bootstrapSpy.mockRestore();
117
+ restartWatcherSpy.mockRestore();
118
+ index.stop();
119
+ }
120
+ });
121
+ it("becomes inspector-ready before full hydration finishes during start", async () => {
122
+ const root = await createTempRoot();
123
+ const codexDir = path.join(root, ".codex", "sessions", "2026", "02", "11");
124
+ await mkdir(codexDir, { recursive: true });
125
+ for (let traceIndex = 0; traceIndex < 130; traceIndex += 1) {
126
+ const tracePath = path.join(codexDir, `bootstrap-${String(traceIndex).padStart(3, "0")}.jsonl`);
127
+ await writeFile(tracePath, buildCodexTraceLog(`bootstrap-${traceIndex}`, traceIndex), "utf8");
128
+ const mtime = new Date(Date.UTC(2026, 1, 11, 10, 0, 0) + (130 - traceIndex) * 1_000);
129
+ await utimes(tracePath, mtime, mtime);
130
+ }
131
+ const config = mergeConfig({
132
+ sessionLogDirectories: [],
133
+ sources: {
134
+ codex_home: {
135
+ name: "codex_home",
136
+ enabled: true,
137
+ roots: [path.join(root, ".codex", "sessions")],
138
+ includeGlobs: ["**/*.jsonl"],
139
+ excludeGlobs: [],
140
+ maxDepth: 8,
141
+ agentHint: "codex",
142
+ },
143
+ claude_projects: {
144
+ name: "claude_projects",
145
+ enabled: false,
146
+ roots: [],
147
+ includeGlobs: ["**/*.jsonl"],
148
+ excludeGlobs: [],
149
+ maxDepth: 8,
150
+ agentHint: "claude",
151
+ },
152
+ claude_history: {
153
+ name: "claude_history",
154
+ enabled: false,
155
+ roots: [],
156
+ includeGlobs: ["history.jsonl"],
157
+ excludeGlobs: [],
158
+ maxDepth: 8,
159
+ agentHint: "claude",
160
+ },
161
+ },
162
+ });
163
+ const index = new TraceIndex(config);
164
+ try {
165
+ await index.start();
166
+ const startup = index.getStartupState();
167
+ expect(startup.inspectorReady).toBe(true);
168
+ expect(startup.fullReady).toBe(false);
169
+ expect(startup.isPartial).toBe(true);
170
+ expect(startup.discoveredTraceCount).toBe(130);
171
+ expect(startup.hydratedTraceCount).toBeLessThan(130);
172
+ expect(index.getSummaries()).toHaveLength(startup.hydratedTraceCount);
173
+ const allProgress = index.getHydrationProgress(0);
174
+ expect(allProgress).toEqual({
175
+ ready: false,
176
+ relevantDiscoveredCount: 130,
177
+ relevantHydratedCount: startup.hydratedTraceCount,
178
+ percent: Math.round((startup.hydratedTraceCount / 130) * 100),
179
+ });
180
+ const newestHydratedMtime = Math.min(...index.getSummaries().map((summary) => summary.mtimeMs));
181
+ const newestWindowProgress = index.getHydrationProgress(newestHydratedMtime);
182
+ expect(newestWindowProgress.ready).toBe(true);
183
+ await waitForCondition(() => {
184
+ const ready = index.getStartupState();
185
+ expect(ready.fullReady).toBe(true);
186
+ expect(ready.isPartial).toBe(false);
187
+ expect(ready.hydratedTraceCount).toBe(130);
188
+ });
189
+ expect(index.getSummaries()).toHaveLength(130);
190
+ }
191
+ finally {
192
+ index.stop();
193
+ }
194
+ });
51
195
  it("parses codex home session files and computes overview", async () => {
52
196
  const root = await createTempRoot();
53
197
  const codexDir = path.join(root, ".codex", "sessions", "2026", "02", "11");
@@ -1713,6 +1857,135 @@ describe("trace index", () => {
1713
1857
  expect(summary?.costEstimateUsd).not.toBeNull();
1714
1858
  expect((summary?.costEstimateUsd ?? 0) > 0).toBe(true);
1715
1859
  });
1860
+ it("derives timestamped codex usage points from token_count rows", async () => {
1861
+ const root = await createTempRoot();
1862
+ const codexDir = path.join(root, ".codex", "sessions", "2026", "02", "13");
1863
+ await mkdir(codexDir, { recursive: true });
1864
+ const codexPath = path.join(codexDir, "rollout-usage-points.jsonl");
1865
+ await writeFile(codexPath, [
1866
+ JSON.stringify({
1867
+ timestamp: "2026-02-13T23:59:00.000Z",
1868
+ type: "session_meta",
1869
+ payload: { id: "sess-usage-points", cwd: "/tmp/project", cli_version: "0.1.0" },
1870
+ }),
1871
+ JSON.stringify({
1872
+ timestamp: "2026-02-13T23:59:01.000Z",
1873
+ type: "turn_context",
1874
+ payload: { model: "gpt-5.3-codex" },
1875
+ }),
1876
+ JSON.stringify({
1877
+ timestamp: "2026-02-13T23:59:02.000Z",
1878
+ type: "event_msg",
1879
+ payload: {
1880
+ type: "token_count",
1881
+ info: {
1882
+ total_token_usage: {
1883
+ input_tokens: 100,
1884
+ cached_input_tokens: 20,
1885
+ output_tokens: 10,
1886
+ reasoning_output_tokens: 0,
1887
+ total_tokens: 130,
1888
+ },
1889
+ last_token_usage: {
1890
+ input_tokens: 100,
1891
+ cached_input_tokens: 20,
1892
+ output_tokens: 10,
1893
+ reasoning_output_tokens: 0,
1894
+ total_tokens: 130,
1895
+ },
1896
+ },
1897
+ },
1898
+ }),
1899
+ JSON.stringify({
1900
+ timestamp: "2026-02-14T00:00:01.000Z",
1901
+ type: "event_msg",
1902
+ payload: {
1903
+ type: "token_count",
1904
+ info: {
1905
+ total_token_usage: {
1906
+ input_tokens: 140,
1907
+ cached_input_tokens: 30,
1908
+ output_tokens: 40,
1909
+ reasoning_output_tokens: 5,
1910
+ total_tokens: 215,
1911
+ },
1912
+ last_token_usage: {
1913
+ input_tokens: 40,
1914
+ cached_input_tokens: 10,
1915
+ output_tokens: 30,
1916
+ reasoning_output_tokens: 5,
1917
+ total_tokens: 85,
1918
+ },
1919
+ },
1920
+ },
1921
+ }),
1922
+ ].join("\n"), "utf8");
1923
+ const config = mergeConfig({
1924
+ sessionLogDirectories: [],
1925
+ cost: {
1926
+ enabled: true,
1927
+ currency: "USD",
1928
+ unknownModelPolicy: "n_a",
1929
+ modelRates: [
1930
+ {
1931
+ model: "gpt-5.3-codex",
1932
+ inputPer1MUsd: 1,
1933
+ outputPer1MUsd: 1,
1934
+ cachedReadPer1MUsd: 1,
1935
+ cachedCreatePer1MUsd: 1,
1936
+ reasoningOutputPer1MUsd: 1,
1937
+ },
1938
+ ],
1939
+ },
1940
+ sources: {
1941
+ codex_home: {
1942
+ name: "codex_home",
1943
+ enabled: true,
1944
+ roots: [path.join(root, ".codex", "sessions")],
1945
+ includeGlobs: ["**/*.jsonl"],
1946
+ excludeGlobs: [],
1947
+ maxDepth: 8,
1948
+ agentHint: "codex",
1949
+ },
1950
+ claude_projects: {
1951
+ name: "claude_projects",
1952
+ enabled: false,
1953
+ roots: [],
1954
+ includeGlobs: ["**/*.jsonl"],
1955
+ excludeGlobs: [],
1956
+ maxDepth: 8,
1957
+ agentHint: "claude",
1958
+ },
1959
+ claude_history: {
1960
+ name: "claude_history",
1961
+ enabled: false,
1962
+ roots: [],
1963
+ includeGlobs: ["history.jsonl"],
1964
+ excludeGlobs: [],
1965
+ maxDepth: 8,
1966
+ agentHint: "claude",
1967
+ },
1968
+ },
1969
+ });
1970
+ const index = new TraceIndex(config);
1971
+ await index.refresh();
1972
+ const summary = index.getSummaries()[0];
1973
+ const usageArtifacts = index.getSessionUsageArtifacts(summary.id);
1974
+ expect(usageArtifacts.usagePoints).toHaveLength(2);
1975
+ expect(usageArtifacts.usagePoints[0]).toMatchObject({
1976
+ timestampMs: Date.UTC(2026, 1, 13, 23, 59, 2),
1977
+ inputTokens: 100,
1978
+ cachedReadTokens: 20,
1979
+ outputTokens: 10,
1980
+ });
1981
+ expect(usageArtifacts.usagePoints[1]).toMatchObject({
1982
+ timestampMs: Date.UTC(2026, 1, 14, 0, 0, 1),
1983
+ inputTokens: 40,
1984
+ cachedReadTokens: 10,
1985
+ outputTokens: 30,
1986
+ reasoningOutputTokens: 5,
1987
+ });
1988
+ });
1716
1989
  it("does not double bill codex cached input tokens in cost estimate", async () => {
1717
1990
  const root = await createTempRoot();
1718
1991
  const codexDir = path.join(root, ".codex", "sessions", "2026", "02", "13");
@@ -2328,6 +2601,101 @@ describe("trace index", () => {
2328
2601
  index.stop();
2329
2602
  }
2330
2603
  });
2604
+ it("serves activity artifacts for cold traces without materializing full events", async () => {
2605
+ const root = await createTempRoot();
2606
+ const codexDir = path.join(root, ".codex", "sessions", "2026", "02", "13");
2607
+ await mkdir(codexDir, { recursive: true });
2608
+ for (const [index, filename] of ["rollout-a.jsonl", "rollout-b.jsonl", "rollout-c.jsonl"].entries()) {
2609
+ await writeFile(path.join(codexDir, filename), [
2610
+ JSON.stringify({
2611
+ timestamp: `2026-02-13T10:00:0${index}.000Z`,
2612
+ type: "session_meta",
2613
+ payload: { id: `sess-${index}`, cwd: "/tmp/project", cli_version: "0.1.0" },
2614
+ }),
2615
+ JSON.stringify({
2616
+ timestamp: `2026-02-13T10:00:1${index}.000Z`,
2617
+ type: "response_item",
2618
+ payload: {
2619
+ type: "message",
2620
+ role: "assistant",
2621
+ content: [{ type: "output_text", text: `trace-${index}` }],
2622
+ },
2623
+ }),
2624
+ ].join("\n") + "\n", "utf8");
2625
+ }
2626
+ const config = mergeConfig({
2627
+ retention: {
2628
+ strategy: "aggressive_recency",
2629
+ hotTraceCount: 1,
2630
+ warmTraceCount: 0,
2631
+ maxResidentEventsPerHotTrace: 1000,
2632
+ maxResidentEventsPerWarmTrace: 50,
2633
+ detailLoadMode: "lazy_from_disk",
2634
+ },
2635
+ sessionLogDirectories: [],
2636
+ sources: {
2637
+ codex_home: {
2638
+ name: "codex_home",
2639
+ enabled: true,
2640
+ roots: [path.join(root, ".codex", "sessions")],
2641
+ includeGlobs: ["**/*.jsonl"],
2642
+ excludeGlobs: [],
2643
+ maxDepth: 8,
2644
+ agentHint: "codex",
2645
+ },
2646
+ claude_projects: {
2647
+ name: "claude_projects",
2648
+ enabled: false,
2649
+ roots: [],
2650
+ includeGlobs: ["**/*.jsonl"],
2651
+ excludeGlobs: [],
2652
+ maxDepth: 8,
2653
+ agentHint: "claude",
2654
+ },
2655
+ claude_history: {
2656
+ name: "claude_history",
2657
+ enabled: false,
2658
+ roots: [],
2659
+ includeGlobs: ["history.jsonl"],
2660
+ excludeGlobs: [],
2661
+ maxDepth: 8,
2662
+ agentHint: "claude",
2663
+ },
2664
+ },
2665
+ });
2666
+ const index = new TraceIndex(config);
2667
+ await index.start();
2668
+ try {
2669
+ const summaries = index.getSummaries();
2670
+ const coldTraceId = summaries[2]?.id;
2671
+ expect(coldTraceId).toBeTruthy();
2672
+ if (!coldTraceId) {
2673
+ throw new Error("missing cold trace");
2674
+ }
2675
+ const internal = index;
2676
+ const entry = internal.entries.get(coldTraceId);
2677
+ expect(entry?.cachedFullEvents).toBeNull();
2678
+ expect(entry?.cachedRawEvents).toBeNull();
2679
+ expect(entry?.activityArtifacts).toMatchObject({
2680
+ eventCount: 2,
2681
+ eventTimestamps: [],
2682
+ });
2683
+ const parseFileSyncSpy = vi.spyOn(internal.parserRegistry, "parseFileSync");
2684
+ const artifacts = index.getSessionActivityArtifacts(coldTraceId);
2685
+ expect(artifacts.eventCount).toBe(2);
2686
+ expect(artifacts.eventTimestamps).toEqual([]);
2687
+ expect(entry?.cachedFullEvents).toBeNull();
2688
+ expect(entry?.cachedRawEvents).toBeNull();
2689
+ expect(entry?.activityArtifacts).toMatchObject({
2690
+ eventCount: 2,
2691
+ eventTimestamps: [],
2692
+ });
2693
+ expect(parseFileSyncSpy).not.toHaveBeenCalled();
2694
+ }
2695
+ finally {
2696
+ index.stop();
2697
+ }
2698
+ });
2331
2699
  it("keeps codex model and cost metrics after appends with strict redaction", async () => {
2332
2700
  const root = await createTempRoot();
2333
2701
  const codexDir = path.join(root, ".codex", "sessions", "2026", "02", "13");