@teeras/afterhours 0.1.1 → 0.3.1

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 (84) hide show
  1. package/README.md +101 -15
  2. package/dist/activity.d.ts +35 -1
  3. package/dist/activity.d.ts.map +1 -1
  4. package/dist/activity.js +148 -1
  5. package/dist/activity.js.map +1 -1
  6. package/dist/autosync.d.ts +22 -0
  7. package/dist/autosync.d.ts.map +1 -0
  8. package/dist/autosync.js +85 -0
  9. package/dist/autosync.js.map +1 -0
  10. package/dist/cli.js +112 -9
  11. package/dist/cli.js.map +1 -1
  12. package/dist/cloud.d.ts +5 -0
  13. package/dist/cloud.d.ts.map +1 -1
  14. package/dist/cloud.js +10 -2
  15. package/dist/cloud.js.map +1 -1
  16. package/dist/collect.d.ts +3 -1
  17. package/dist/collect.d.ts.map +1 -1
  18. package/dist/collect.js +19 -7
  19. package/dist/collect.js.map +1 -1
  20. package/dist/detect.d.ts.map +1 -1
  21. package/dist/detect.js +35 -6
  22. package/dist/detect.js.map +1 -1
  23. package/dist/hooks.d.ts +29 -0
  24. package/dist/hooks.d.ts.map +1 -0
  25. package/dist/hooks.js +196 -0
  26. package/dist/hooks.js.map +1 -0
  27. package/dist/index.d.ts +9 -2
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +8 -1
  30. package/dist/index.js.map +1 -1
  31. package/dist/install.d.ts +25 -0
  32. package/dist/install.d.ts.map +1 -0
  33. package/dist/install.js +155 -0
  34. package/dist/install.js.map +1 -0
  35. package/dist/moments.d.ts +21 -0
  36. package/dist/moments.d.ts.map +1 -0
  37. package/dist/moments.js +52 -0
  38. package/dist/moments.js.map +1 -0
  39. package/dist/off.d.ts +24 -0
  40. package/dist/off.d.ts.map +1 -0
  41. package/dist/off.js +36 -0
  42. package/dist/off.js.map +1 -0
  43. package/dist/privacy.d.ts +8 -0
  44. package/dist/privacy.d.ts.map +1 -1
  45. package/dist/privacy.js +27 -1
  46. package/dist/privacy.js.map +1 -1
  47. package/dist/qr.d.ts +29 -0
  48. package/dist/qr.d.ts.map +1 -0
  49. package/dist/qr.js +92 -0
  50. package/dist/qr.js.map +1 -0
  51. package/dist/render.d.ts.map +1 -1
  52. package/dist/render.js +61 -1
  53. package/dist/render.js.map +1 -1
  54. package/dist/report.d.ts.map +1 -1
  55. package/dist/report.js +115 -1
  56. package/dist/report.js.map +1 -1
  57. package/dist/runtime.d.ts +18 -0
  58. package/dist/runtime.d.ts.map +1 -0
  59. package/dist/runtime.js +70 -0
  60. package/dist/runtime.js.map +1 -0
  61. package/dist/secret.d.ts +9 -0
  62. package/dist/secret.d.ts.map +1 -0
  63. package/dist/secret.js +32 -0
  64. package/dist/secret.js.map +1 -0
  65. package/dist/setup.d.ts +18 -0
  66. package/dist/setup.d.ts.map +1 -0
  67. package/dist/setup.js +155 -0
  68. package/dist/setup.js.map +1 -0
  69. package/dist/sources/claude.d.ts.map +1 -1
  70. package/dist/sources/claude.js +162 -18
  71. package/dist/sources/claude.js.map +1 -1
  72. package/dist/sources/codex.d.ts.map +1 -1
  73. package/dist/sources/codex.js +240 -21
  74. package/dist/sources/codex.js.map +1 -1
  75. package/dist/sources/cursor.d.ts.map +1 -1
  76. package/dist/sources/cursor.js +1 -0
  77. package/dist/sources/cursor.js.map +1 -1
  78. package/dist/sources/gemini.d.ts.map +1 -1
  79. package/dist/sources/gemini.js +85 -8
  80. package/dist/sources/gemini.js.map +1 -1
  81. package/dist/types.d.ts +109 -6
  82. package/dist/types.d.ts.map +1 -1
  83. package/llms-install.md +29 -0
  84. package/package.json +3 -2
@@ -1,18 +1,96 @@
1
1
  import { readFileSync } from "node:fs";
2
- import { join } from "node:path";
3
- import { emptySource, finiteNumber, finishSource, inWindow, timestamp } from "../activity.js";
2
+ import { homedir } from "node:os";
3
+ import { isAbsolute, join, resolve } from "node:path";
4
+ import { addToken, delegationEpisode, emptySource, finishSource, humanWaitSamples, inWindow, latencyStats, modelActivityFrom, opaqueEpisodeId, optionalFiniteNumber, timestamp, } from "../activity.js";
4
5
  import { isDirectory, recentFiles } from "../files.js";
6
+ import { readContentFreeHookEvents } from "../hooks.js";
5
7
  import { parseLines, record } from "./shared.js";
8
+ const MODEL_ID = /^[a-z0-9][a-z0-9._:-]{0,79}$/i;
9
+ function codexRoots(home) {
10
+ const roots = [join(home, ".codex")];
11
+ const configured = process.env.CODEX_HOME?.trim();
12
+ // An explicit test/import home is an isolation boundary. For normal use,
13
+ // collect both the shared App home and a distinct CLI CODEX_HOME override.
14
+ if (home === homedir() && configured && isAbsolute(configured))
15
+ roots.push(configured);
16
+ return [...new Set(roots.map((root) => resolve(root)))];
17
+ }
18
+ function sourceFiles(roots, sinceMs) {
19
+ const files = roots.flatMap((root) => [
20
+ ...recentFiles(join(root, "sessions"), sinceMs, (name) => name.endsWith(".jsonl")),
21
+ ...recentFiles(join(root, "archived_sessions"), sinceMs, (name) => name.endsWith(".jsonl")),
22
+ ]);
23
+ return [...new Set(files)];
24
+ }
25
+ function sessionMetadata(rows) {
26
+ let sessionId = null;
27
+ let originator = null;
28
+ let source = null;
29
+ let modelFamily = null;
30
+ for (const row of rows) {
31
+ const payload = record(row.payload);
32
+ if (!payload)
33
+ continue;
34
+ if (row.type === "session_meta") {
35
+ const candidate = typeof payload.id === "string" ? payload.id : payload.session_id;
36
+ if (typeof candidate === "string" && candidate.length <= 200)
37
+ sessionId = candidate;
38
+ if (typeof payload.originator === "string")
39
+ originator = payload.originator;
40
+ if (typeof payload.source === "string")
41
+ source = payload.source;
42
+ }
43
+ if (row.type === "turn_context" &&
44
+ typeof payload.model === "string" &&
45
+ MODEL_ID.test(payload.model)) {
46
+ modelFamily = payload.model;
47
+ }
48
+ }
49
+ const normalizedOriginator = originator?.toLowerCase() ?? "";
50
+ const normalizedSource = source?.toLowerCase() ?? "";
51
+ let surface = "unknown";
52
+ // App sessions have historically used both `vscode` and `appServer` as
53
+ // source values. Originator is the more reliable discriminator.
54
+ if (normalizedOriginator.includes("codex desktop") ||
55
+ normalizedSource === "appserver") {
56
+ surface = "app";
57
+ }
58
+ else if (normalizedOriginator === "codex-tui" ||
59
+ normalizedOriginator === "codex_cli_rs" ||
60
+ normalizedSource === "cli") {
61
+ surface = "cli";
62
+ }
63
+ else if (normalizedOriginator === "codex_exec" || normalizedSource === "exec") {
64
+ surface = "exec";
65
+ }
66
+ else if (normalizedSource === "vscode") {
67
+ surface = "ide";
68
+ }
69
+ return {
70
+ sessionId,
71
+ adapterVersion: `codex-${surface}-v3`,
72
+ modelFamily,
73
+ };
74
+ }
75
+ function addUsage(target, usage) {
76
+ target.input = addToken(target.input, optionalFiniteNumber(usage.input_tokens));
77
+ target.cached = addToken(target.cached, optionalFiniteNumber(usage.cached_input_tokens));
78
+ target.output = addToken(target.output, optionalFiniteNumber(usage.output_tokens));
79
+ target.reasoning = addToken(target.reasoning, optionalFiniteNumber(usage.reasoning_output_tokens));
80
+ }
6
81
  export const codexSource = {
7
82
  id: "codex",
8
83
  name: "Codex app + CLI",
9
- collect({ home, sinceMs, untilMs }) {
10
- const root = join(home, ".codex");
11
- const source = emptySource("codex", "Codex app + CLI", isDirectory(root));
84
+ version: "codex-v3",
85
+ collect({ home, sinceMs, untilMs, episodeKeySecret }) {
86
+ const roots = codexRoots(home);
87
+ const source = emptySource("codex", "Codex app + CLI", roots.some(isDirectory));
12
88
  if (!source.configured)
13
89
  return source;
14
90
  const events = [];
15
- for (const path of recentFiles(join(root, "sessions"), sinceMs, (name) => name.endsWith(".jsonl"))) {
91
+ const modelTurnEvents = [];
92
+ const episodeIds = new Set();
93
+ for (const path of sourceFiles(roots, sinceMs)) {
16
94
  let rows;
17
95
  try {
18
96
  rows = parseLines(readFileSync(path, "utf8"));
@@ -20,35 +98,176 @@ export const codexSource = {
20
98
  catch {
21
99
  continue;
22
100
  }
23
- let used = false;
101
+ const metadata = sessionMetadata(rows);
102
+ const id = opaqueEpisodeId(episodeKeySecret, "codex", metadata.sessionId ?? path);
103
+ if (episodeIds.has(id))
104
+ continue;
105
+ const humanEvents = [];
106
+ const completedEvents = [];
107
+ const finalMessageEvents = [];
108
+ const tokenEvents = [];
109
+ const sessionTokens = { input: null, cached: null, output: null, reasoning: null };
110
+ const turnDurationSamples = [];
111
+ const firstTokenSamples = [];
112
+ let observedFailures = 0;
113
+ // Rollouts write a turn_context before the turn it configures, so the
114
+ // model in force at each event is the last one seen — unlike the
115
+ // session-level metadata, which keeps only the final turn's model.
116
+ let currentModel = null;
24
117
  for (const row of rows) {
25
- const at = timestamp(row.timestamp);
26
- if (at == null || !inWindow(at, sinceMs, untilMs))
27
- continue;
28
118
  const payload = record(row.payload);
29
119
  if (!payload)
30
120
  continue;
121
+ if (row.type === "turn_context" &&
122
+ typeof payload.model === "string" &&
123
+ MODEL_ID.test(payload.model)) {
124
+ currentModel = payload.model;
125
+ }
126
+ const at = timestamp(row.timestamp);
127
+ if (at == null || !inWindow(at, sinceMs, untilMs))
128
+ continue;
31
129
  if (row.type === "event_msg" && payload.type === "user_message") {
32
- events.push({ at, kind: "human" });
33
- used = true;
130
+ humanEvents.push({ at, kind: "human" });
131
+ }
132
+ if (row.type === "event_msg" && payload.type === "task_complete") {
133
+ completedEvents.push({ at, kind: "agent", model: currentModel ?? undefined });
134
+ // Codex measures its own turns; both values are numbers, never text.
135
+ const duration = optionalFiniteNumber(payload.duration_ms);
136
+ if (duration != null)
137
+ turnDurationSamples.push(duration);
138
+ const firstToken = optionalFiniteNumber(payload.time_to_first_token_ms);
139
+ if (firstToken != null)
140
+ firstTokenSamples.push(firstToken);
141
+ }
142
+ if (row.type === "event_msg" && payload.type === "turn_aborted") {
143
+ completedEvents.push({ at, kind: "agent", model: currentModel ?? undefined });
144
+ observedFailures += 1;
145
+ }
146
+ if (row.type === "event_msg" &&
147
+ payload.type === "agent_message" &&
148
+ (payload.phase === "final_answer" || payload.phase == null)) {
149
+ finalMessageEvents.push({ at, kind: "agent", model: currentModel ?? undefined });
34
150
  }
35
151
  if (row.type === "event_msg" && payload.type === "token_count") {
36
152
  const info = record(payload.info);
37
153
  const usage = record(info?.last_token_usage);
38
154
  if (!usage)
39
155
  continue;
40
- source.tokens.input += finiteNumber(usage.input_tokens);
41
- source.tokens.cached += finiteNumber(usage.cached_input_tokens);
42
- source.tokens.output += finiteNumber(usage.output_tokens);
43
- source.tokens.reasoning += finiteNumber(usage.reasoning_output_tokens);
44
- events.push({ at, kind: "agent" });
45
- used = true;
156
+ addUsage(source.tokens, usage);
157
+ addUsage(sessionTokens, usage);
158
+ tokenEvents.push({ at, kind: "agent", model: currentModel ?? undefined });
159
+ }
160
+ }
161
+ // Token updates fire per model call, so they are the densest evidence of
162
+ // agent ACTIVITY (active minutes, runway). `task_complete` marks one
163
+ // completed TURN and drives turn counts, status, and confidence.
164
+ const activityEvents = tokenEvents.length > 0
165
+ ? tokenEvents
166
+ : completedEvents.length > 0
167
+ ? completedEvents
168
+ : finalMessageEvents;
169
+ const turnCount = completedEvents.length > 0
170
+ ? completedEvents.length
171
+ : finalMessageEvents.length > 0
172
+ ? finalMessageEvents.length
173
+ : null;
174
+ const sessionEvents = [...humanEvents, ...activityEvents];
175
+ if (sessionEvents.length === 0)
176
+ continue;
177
+ events.push(...sessionEvents);
178
+ modelTurnEvents.push(...(completedEvents.length > 0 ? completedEvents : finalMessageEvents));
179
+ source.sessions += 1;
180
+ episodeIds.add(id);
181
+ const episode = delegationEpisode({
182
+ id,
183
+ adapterVersion: metadata.adapterVersion,
184
+ events: sessionEvents,
185
+ tokens: sessionTokens,
186
+ untilMs,
187
+ confidence: completedEvents.length > 0
188
+ ? "high"
189
+ : finalMessageEvents.length > 0
190
+ ? "medium"
191
+ : "low",
192
+ modelFamily: metadata.modelFamily,
193
+ latency: {
194
+ timeToFirstToken: latencyStats(firstTokenSamples),
195
+ turnDuration: latencyStats(turnDurationSamples),
196
+ // Without dense token events the first observed agent activity is
197
+ // the end of the turn, which would misread duration as wait.
198
+ humanWait: tokenEvents.length > 0 ? latencyStats(humanWaitSamples(sessionEvents)) : null,
199
+ },
200
+ });
201
+ if (!episode)
202
+ continue;
203
+ episode.failureEvents = observedFailures;
204
+ if (turnCount != null)
205
+ episode.agentTurns = turnCount;
206
+ if (completedEvents.length > 0)
207
+ episode.status = "observed_end";
208
+ source.episodes.push(episode);
209
+ }
210
+ const hookGroups = new Map();
211
+ for (const event of readContentFreeHookEvents(home, sinceMs, untilMs)) {
212
+ if (event.sourceId !== "codex")
213
+ continue;
214
+ const group = hookGroups.get(event.episodeId) ?? [];
215
+ group.push(event);
216
+ hookGroups.set(event.episodeId, group);
217
+ }
218
+ const episodeById = new Map(source.episodes.map((episode) => [episode.id, episode]));
219
+ for (const [id, hookEvents] of hookGroups) {
220
+ const existing = episodeById.get(id);
221
+ const approvalRequests = hookEvents.filter((event) => event.signal === "permission_requested").length;
222
+ const modelFamily = hookEvents.find((event) => event.modelFamily)?.modelFamily ?? null;
223
+ const lastSignal = hookEvents.at(-1)?.signal;
224
+ if (existing) {
225
+ existing.approvalRequests = approvalRequests;
226
+ existing.modelFamily ??= modelFamily;
227
+ const finalHook = hookEvents.at(-1);
228
+ if (finalHook && finalHook.at > Date.parse(existing.endedAt)) {
229
+ existing.endedAt = new Date(finalHook.at).toISOString();
46
230
  }
231
+ if (lastSignal === "human_prompt")
232
+ existing.status = "open";
233
+ if (lastSignal === "agent_stopped" || lastSignal === "session_ended")
234
+ existing.status = "observed_end";
235
+ continue;
47
236
  }
48
- if (used)
49
- source.sessions += 1;
237
+ const hookActivity = [];
238
+ for (const event of hookEvents) {
239
+ if (event.signal === "human_prompt")
240
+ hookActivity.push({ at: event.at, kind: "human" });
241
+ if (event.signal === "agent_stopped")
242
+ hookActivity.push({ at: event.at, kind: "agent" });
243
+ }
244
+ const episode = delegationEpisode({
245
+ id,
246
+ adapterVersion: "codex-hook-v1",
247
+ events: hookActivity,
248
+ tokens: { input: null, cached: null, output: null, reasoning: null },
249
+ untilMs,
250
+ confidence: "medium",
251
+ modelFamily,
252
+ });
253
+ if (!episode)
254
+ continue;
255
+ episode.approvalRequests = approvalRequests;
256
+ episode.failureEvents = null;
257
+ if (lastSignal === "agent_stopped" || lastSignal === "session_ended")
258
+ episode.status = "observed_end";
259
+ source.episodes.push(episode);
260
+ source.sessions += 1;
261
+ events.push(...hookActivity);
262
+ }
263
+ const finished = finishSource(source, events);
264
+ // Buckets and minutes come from dense activity events; the source-level
265
+ // turn count keeps user-visible turn semantics from the episodes.
266
+ if (finished.episodes.length > 0) {
267
+ finished.agentTurns = finished.episodes.reduce((sum, episode) => sum + episode.agentTurns, 0);
50
268
  }
51
- return finishSource(source, events);
269
+ finished.models = modelActivityFrom(events, modelTurnEvents);
270
+ return finished;
52
271
  },
53
272
  };
54
273
  //# sourceMappingURL=codex.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/sources/codex.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/sources/codex.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../src/sources/cursor.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,eAAO,MAAM,YAAY,EAAE,aAa1B,CAAC"}
1
+ {"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../src/sources/cursor.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,eAAO,MAAM,YAAY,EAAE,aAc1B,CAAC"}
@@ -4,6 +4,7 @@ import { isDirectory } from "../files.js";
4
4
  export const cursorSource = {
5
5
  id: "cursor",
6
6
  name: "Cursor",
7
+ version: "cursor-detection-v1",
7
8
  collect({ home }) {
8
9
  const configured = [
9
10
  join(home, "Library", "Application Support", "Cursor"),
@@ -1 +1 @@
1
- {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/sources/cursor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG1C,MAAM,CAAC,MAAM,YAAY,GAAkB;IACzC,EAAE,EAAE,QAAQ;IACZ,IAAI,EAAE,QAAQ;IACd,OAAO,CAAC,EAAE,IAAI,EAAE;QACd,MAAM,UAAU,GAAG;YACjB,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,qBAAqB,EAAE,QAAQ,CAAC;YACtD,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC;YAC/B,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC;SACtB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACpB,yEAAyE;QACzE,+EAA+E;QAC/E,OAAO,WAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;IACrD,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/sources/cursor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG1C,MAAM,CAAC,MAAM,YAAY,GAAkB;IACzC,EAAE,EAAE,QAAQ;IACZ,IAAI,EAAE,QAAQ;IACd,OAAO,EAAE,qBAAqB;IAC9B,OAAO,CAAC,EAAE,IAAI,EAAE;QACd,MAAM,UAAU,GAAG;YACjB,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,qBAAqB,EAAE,QAAQ,CAAC;YACtD,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC;YAC/B,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC;SACtB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACpB,yEAAyE;QACzE,+EAA+E;QAC/E,OAAO,WAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;IACrD,CAAC;CACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../src/sources/gemini.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,eAAO,MAAM,YAAY,EAAE,aA4B1B,CAAC"}
1
+ {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../src/sources/gemini.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,aAAa,EAAe,MAAM,aAAa,CAAC;AAG9D,eAAO,MAAM,YAAY,EAAE,aAyG1B,CAAC"}
@@ -1,17 +1,92 @@
1
1
  import { readFileSync } from "node:fs";
2
2
  import { join } from "node:path";
3
- import { emptySource, inWindow, timestamp } from "../activity.js";
3
+ import { addToken, delegationEpisode, emptySource, finishSource, humanWaitSamples, inWindow, latencyStats, modelActivityFrom, opaqueEpisodeId, optionalFiniteNumber, timestamp, } from "../activity.js";
4
4
  import { isDirectory, recentFiles } from "../files.js";
5
- import { record } from "./shared.js";
5
+ import { parseLines, record } from "./shared.js";
6
6
  export const geminiSource = {
7
7
  id: "gemini-cli",
8
8
  name: "Gemini CLI",
9
- collect({ home, sinceMs, untilMs }) {
9
+ version: "gemini-cli-v2",
10
+ collect({ home, sinceMs, untilMs, episodeKeySecret }) {
10
11
  const root = join(home, ".gemini");
11
12
  const source = emptySource("gemini-cli", "Gemini CLI", isDirectory(root));
12
13
  if (!source.configured)
13
14
  return source;
14
15
  const sessionIds = new Set();
16
+ const events = [];
17
+ for (const path of recentFiles(join(root, "tmp"), sinceMs, (name) => name.startsWith("session-") && name.endsWith(".jsonl"))) {
18
+ let rows;
19
+ try {
20
+ rows = parseLines(readFileSync(path, "utf8"));
21
+ }
22
+ catch {
23
+ continue;
24
+ }
25
+ const metadata = rows.find((row) => typeof row.sessionId === "string");
26
+ const sessionId = typeof metadata?.sessionId === "string" && metadata.sessionId.length <= 200
27
+ ? metadata.sessionId
28
+ : path;
29
+ const sessionEvents = [];
30
+ const sessionTokens = { input: null, cached: null, output: null, reasoning: null };
31
+ let modelFamily = null;
32
+ for (const row of rows) {
33
+ const at = timestamp(row.timestamp);
34
+ if (at == null || !inWindow(at, sinceMs, untilMs))
35
+ continue;
36
+ if (row.type === "user")
37
+ sessionEvents.push({ at, kind: "human" });
38
+ if (row.type !== "gemini")
39
+ continue;
40
+ const model = typeof row.model === "string" && /^[a-z0-9][a-z0-9._:-]{0,79}$/i.test(row.model)
41
+ ? row.model
42
+ : null;
43
+ if (model)
44
+ modelFamily = model;
45
+ sessionEvents.push({ at, kind: "agent", model: model ?? undefined });
46
+ const tokens = record(row.tokens);
47
+ if (tokens) {
48
+ const input = optionalFiniteNumber(tokens.input);
49
+ const cached = optionalFiniteNumber(tokens.cached);
50
+ const output = optionalFiniteNumber(tokens.output);
51
+ const reasoning = optionalFiniteNumber(tokens.thoughts);
52
+ source.tokens.input = addToken(source.tokens.input, input);
53
+ source.tokens.cached = addToken(source.tokens.cached, cached);
54
+ source.tokens.output = addToken(source.tokens.output, output);
55
+ source.tokens.reasoning = addToken(source.tokens.reasoning, reasoning);
56
+ sessionTokens.input = addToken(sessionTokens.input, input);
57
+ sessionTokens.cached = addToken(sessionTokens.cached, cached);
58
+ sessionTokens.output = addToken(sessionTokens.output, output);
59
+ sessionTokens.reasoning = addToken(sessionTokens.reasoning, reasoning);
60
+ }
61
+ }
62
+ if (sessionEvents.length === 0)
63
+ continue;
64
+ const id = opaqueEpisodeId(episodeKeySecret, "gemini-cli", sessionId);
65
+ if (sessionIds.has(id))
66
+ continue;
67
+ sessionIds.add(id);
68
+ events.push(...sessionEvents);
69
+ const episode = delegationEpisode({
70
+ id,
71
+ adapterVersion: "gemini-cli-v2",
72
+ events: sessionEvents,
73
+ tokens: sessionTokens,
74
+ untilMs,
75
+ confidence: "medium",
76
+ modelFamily,
77
+ latency: {
78
+ timeToFirstToken: null,
79
+ turnDuration: null,
80
+ // Gemini rows land when the reply completes, so this wait is an
81
+ // upper-bound estimate: message to finished answer.
82
+ humanWait: latencyStats(humanWaitSamples(sessionEvents)),
83
+ },
84
+ });
85
+ if (episode)
86
+ source.episodes.push(episode);
87
+ }
88
+ // Older Gemini CLI builds expose only session-level logs. Preserve honest
89
+ // coverage without inventing turns or attention measurements.
15
90
  for (const path of recentFiles(join(root, "tmp"), sinceMs, (name) => name === "logs.json")) {
16
91
  let rows;
17
92
  try {
@@ -27,14 +102,16 @@ export const geminiSource = {
27
102
  const at = timestamp(row?.timestamp);
28
103
  if (at == null || !inWindow(at, sinceMs, untilMs))
29
104
  continue;
30
- if (typeof row?.sessionId === "string")
31
- sessionIds.add(row.sessionId);
105
+ if (typeof row?.sessionId === "string") {
106
+ sessionIds.add(opaqueEpisodeId(episodeKeySecret, "gemini-cli", row.sessionId));
107
+ }
32
108
  }
33
109
  }
34
110
  source.sessions = sessionIds.size;
35
- if (source.sessions > 0)
36
- source.fidelity = "sessions";
37
- return source;
111
+ const finished = finishSource(source, events, events.length > 0 ? "activity" : "sessions");
112
+ // Every Gemini agent row is one turn, so activity and turn events coincide.
113
+ finished.models = modelActivityFrom(events, events.filter((event) => event.kind === "agent"));
114
+ return finished;
38
115
  },
39
116
  };
40
117
  //# sourceMappingURL=gemini.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/sources/gemini.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEvD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,CAAC,MAAM,YAAY,GAAkB;IACzC,EAAE,EAAE,YAAY;IAChB,IAAI,EAAE,YAAY;IAClB,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,WAAW,CAAC,YAAY,EAAE,YAAY,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1E,IAAI,CAAC,MAAM,CAAC,UAAU;YAAE,OAAO,MAAM,CAAC;QAEtC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;QACrC,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,WAAW,CAAC,EAAE,CAAC;YAC3F,IAAI,IAAa,CAAC;YAClB,IAAI,CAAC;gBACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;YAChD,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;gBAAE,SAAS;YACnC,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;gBACzB,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC1B,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;gBACrC,IAAI,EAAE,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC;oBAAE,SAAS;gBAC5D,IAAI,OAAO,GAAG,EAAE,SAAS,KAAK,QAAQ;oBAAE,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;QACD,MAAM,CAAC,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC;QAClC,IAAI,MAAM,CAAC,QAAQ,GAAG,CAAC;YAAE,MAAM,CAAC,QAAQ,GAAG,UAAU,CAAC;QACtD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/sources/gemini.ts"],"names":[],"mappings":"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"}