fleetlens 0.12.0 → 0.12.2

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/app/apps/web/.next/BUILD_ID +1 -1
  2. package/app/apps/web/.next/build-manifest.json +3 -3
  3. package/app/apps/web/.next/prerender-manifest.json +3 -3
  4. package/app/apps/web/.next/server/app/_global-error.html +1 -1
  5. package/app/apps/web/.next/server/app/_global-error.rsc +1 -1
  6. package/app/apps/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  7. package/app/apps/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  8. package/app/apps/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  9. package/app/apps/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  10. package/app/apps/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  11. package/app/apps/web/.next/server/app/_not-found/page.js +2 -1
  12. package/app/apps/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  13. package/app/apps/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  14. package/app/apps/web/.next/server/app/api/ask/route.js +1 -1
  15. package/app/apps/web/.next/server/app/api/ask/route.js.nft.json +1 -1
  16. package/app/apps/web/.next/server/app/api/digest/day/[date]/route.js +1 -1
  17. package/app/apps/web/.next/server/app/api/digest/day/[date]/route.js.nft.json +1 -1
  18. package/app/apps/web/.next/server/app/api/digest/month/[yearMonth]/route.js +1 -1
  19. package/app/apps/web/.next/server/app/api/digest/month/[yearMonth]/route.js.nft.json +1 -1
  20. package/app/apps/web/.next/server/app/api/digest/month-index/route.js +1 -1
  21. package/app/apps/web/.next/server/app/api/digest/month-index/route.js.nft.json +1 -1
  22. package/app/apps/web/.next/server/app/api/digest/week/[startDate]/route.js +1 -1
  23. package/app/apps/web/.next/server/app/api/digest/week/[startDate]/route.js.nft.json +1 -1
  24. package/app/apps/web/.next/server/app/api/digest/week-index/route.js +1 -1
  25. package/app/apps/web/.next/server/app/api/digest/week-index/route.js.nft.json +1 -1
  26. package/app/apps/web/.next/server/app/api/events/route.js +1 -1
  27. package/app/apps/web/.next/server/app/api/events/route.js.nft.json +1 -1
  28. package/app/apps/web/.next/server/app/api/jobs/route.js +1 -1
  29. package/app/apps/web/.next/server/app/api/jobs/route.js.nft.json +1 -1
  30. package/app/apps/web/.next/server/app/api/pdf/[key]/route.js +1 -1
  31. package/app/apps/web/.next/server/app/api/pdf/[key]/route.js.nft.json +1 -1
  32. package/app/apps/web/.next/server/app/api/runs/[runId]/route.js +1 -1
  33. package/app/apps/web/.next/server/app/api/runs/[runId]/route.js.nft.json +1 -1
  34. package/app/apps/web/.next/server/app/api/runs/[runId]/stream/route.js +1 -1
  35. package/app/apps/web/.next/server/app/api/runs/[runId]/stream/route.js.nft.json +1 -1
  36. package/app/apps/web/.next/server/app/api/runs/route.js +1 -1
  37. package/app/apps/web/.next/server/app/api/runs/route.js.nft.json +1 -1
  38. package/app/apps/web/.next/server/app/api/settings/route.js +1 -1
  39. package/app/apps/web/.next/server/app/api/settings/route.js.nft.json +1 -1
  40. package/app/apps/web/.next/server/app/api/team-config/route.js +1 -1
  41. package/app/apps/web/.next/server/app/api/team-config/route.js.nft.json +1 -1
  42. package/app/apps/web/.next/server/app/api/workflow-agent/route.js +1 -1
  43. package/app/apps/web/.next/server/app/api/workflow-agent/route.js.nft.json +1 -1
  44. package/app/apps/web/.next/server/app/changelog/page.js +2 -1
  45. package/app/apps/web/.next/server/app/changelog/page.js.nft.json +1 -1
  46. package/app/apps/web/.next/server/app/changelog/page_client-reference-manifest.js +1 -1
  47. package/app/apps/web/.next/server/app/day/[date]/page.js +2 -1
  48. package/app/apps/web/.next/server/app/day/[date]/page.js.nft.json +1 -1
  49. package/app/apps/web/.next/server/app/day/[date]/page_client-reference-manifest.js +1 -1
  50. package/app/apps/web/.next/server/app/day/page.js +2 -1
  51. package/app/apps/web/.next/server/app/day/page.js.nft.json +1 -1
  52. package/app/apps/web/.next/server/app/day/page_client-reference-manifest.js +1 -1
  53. package/app/apps/web/.next/server/app/digest/[date]/page.js +2 -1
  54. package/app/apps/web/.next/server/app/digest/[date]/page.js.nft.json +1 -1
  55. package/app/apps/web/.next/server/app/digest/[date]/page_client-reference-manifest.js +1 -1
  56. package/app/apps/web/.next/server/app/digest/page.js +2 -1
  57. package/app/apps/web/.next/server/app/digest/page.js.nft.json +1 -1
  58. package/app/apps/web/.next/server/app/digest/page_client-reference-manifest.js +1 -1
  59. package/app/apps/web/.next/server/app/insights/[key]/page.js +2 -1
  60. package/app/apps/web/.next/server/app/insights/[key]/page.js.nft.json +1 -1
  61. package/app/apps/web/.next/server/app/insights/[key]/page_client-reference-manifest.js +1 -1
  62. package/app/apps/web/.next/server/app/insights/page.js +2 -1
  63. package/app/apps/web/.next/server/app/insights/page.js.nft.json +1 -1
  64. package/app/apps/web/.next/server/app/insights/page_client-reference-manifest.js +1 -1
  65. package/app/apps/web/.next/server/app/page.js +2 -1
  66. package/app/apps/web/.next/server/app/page.js.nft.json +1 -1
  67. package/app/apps/web/.next/server/app/page_client-reference-manifest.js +1 -1
  68. package/app/apps/web/.next/server/app/parallelism/page.js +2 -1
  69. package/app/apps/web/.next/server/app/parallelism/page.js.nft.json +1 -1
  70. package/app/apps/web/.next/server/app/parallelism/page_client-reference-manifest.js +1 -1
  71. package/app/apps/web/.next/server/app/print/[key]/page.js +2 -1
  72. package/app/apps/web/.next/server/app/print/[key]/page.js.nft.json +1 -1
  73. package/app/apps/web/.next/server/app/print/[key]/page_client-reference-manifest.js +1 -1
  74. package/app/apps/web/.next/server/app/projects/[slug]/page.js +2 -1
  75. package/app/apps/web/.next/server/app/projects/[slug]/page.js.nft.json +1 -1
  76. package/app/apps/web/.next/server/app/projects/[slug]/page_client-reference-manifest.js +1 -1
  77. package/app/apps/web/.next/server/app/projects/page.js +2 -1
  78. package/app/apps/web/.next/server/app/projects/page.js.nft.json +1 -1
  79. package/app/apps/web/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  80. package/app/apps/web/.next/server/app/runs/page.js +2 -1
  81. package/app/apps/web/.next/server/app/runs/page.js.nft.json +1 -1
  82. package/app/apps/web/.next/server/app/runs/page_client-reference-manifest.js +1 -1
  83. package/app/apps/web/.next/server/app/sessions/[id]/page.js +2 -1
  84. package/app/apps/web/.next/server/app/sessions/[id]/page.js.nft.json +1 -1
  85. package/app/apps/web/.next/server/app/sessions/[id]/page_client-reference-manifest.js +1 -1
  86. package/app/apps/web/.next/server/app/sessions/page.js +2 -1
  87. package/app/apps/web/.next/server/app/sessions/page.js.nft.json +1 -1
  88. package/app/apps/web/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  89. package/app/apps/web/.next/server/app/settings/page.js +2 -1
  90. package/app/apps/web/.next/server/app/settings/page.js.nft.json +1 -1
  91. package/app/apps/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  92. package/app/apps/web/.next/server/app/team/page.js +2 -1
  93. package/app/apps/web/.next/server/app/team/page.js.nft.json +1 -1
  94. package/app/apps/web/.next/server/app/team/page_client-reference-manifest.js +1 -1
  95. package/app/apps/web/.next/server/app/usage/page.js +2 -1
  96. package/app/apps/web/.next/server/app/usage/page.js.nft.json +1 -1
  97. package/app/apps/web/.next/server/app/usage/page_client-reference-manifest.js +1 -1
  98. package/app/apps/web/.next/server/chunks/packages_parser_dist_06d9se1._.js +3 -0
  99. package/app/apps/web/.next/server/chunks/packages_parser_dist_10ihc3~._.js +3 -0
  100. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0n-ax-5._.js +3 -0
  101. package/app/apps/web/.next/server/chunks/ssr/_0xu2pvc._.js +1 -1
  102. package/app/apps/web/.next/server/chunks/ssr/apps_web_lib_0k0tl52._.js +3 -0
  103. package/app/apps/web/.next/server/chunks/ssr/apps_web_lib_changelog_ts_0n7_p1d._.js +3 -0
  104. package/app/apps/web/.next/server/chunks/ssr/apps_web_lib_changelog_ts_0nb5_-s._.js +3 -0
  105. package/app/apps/web/.next/server/chunks/ssr/packages_parser_dist_12.endt._.js +1 -1
  106. package/app/apps/web/.next/server/middleware-build-manifest.js +3 -3
  107. package/app/apps/web/.next/server/middleware-manifest.json +5 -5
  108. package/app/apps/web/.next/server/pages/500.html +1 -1
  109. package/app/apps/web/.next/server/server-reference-manifest.js +1 -1
  110. package/app/apps/web/.next/server/server-reference-manifest.json +1 -1
  111. package/app/apps/web/.next/static/chunks/0a~ro-n30brjy.js +1 -0
  112. package/app/apps/web/app/projects/[slug]/page.tsx +3 -4
  113. package/app/apps/web/lib/changelog-data.generated.ts +1 -1
  114. package/app/apps/web/package.json +1 -1
  115. package/app/apps/web/tsconfig.tsbuildinfo +1 -1
  116. package/dist/daemon-worker.js +127 -32
  117. package/dist/index.js +205 -77
  118. package/package.json +1 -1
  119. package/app/apps/web/.next/server/chunks/packages_parser_dist_04rh1zd._.js +0 -3
  120. package/app/apps/web/.next/server/chunks/packages_parser_dist_0ndsxe6._.js +0 -3
  121. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__03y~03u._.js +0 -3
  122. package/app/apps/web/.next/server/chunks/ssr/apps_web_lib_0af94gl._.js +0 -3
  123. package/app/apps/web/.next/static/chunks/0ck03i0l4zeun.js +0 -1
  124. /package/app/apps/web/.next/static/{WH20Ct_NdpZTKsqI_yquG → NVjCMw2mlLqMATkilYzT7}/_buildManifest.js +0 -0
  125. /package/app/apps/web/.next/static/{WH20Ct_NdpZTKsqI_yquG → NVjCMw2mlLqMATkilYzT7}/_clientMiddlewareManifest.js +0 -0
  126. /package/app/apps/web/.next/static/{WH20Ct_NdpZTKsqI_yquG → NVjCMw2mlLqMATkilYzT7}/_ssgManifest.js +0 -0
package/dist/index.js CHANGED
@@ -12,19 +12,27 @@ var __export = (target, all) => {
12
12
  // src/pid.ts
13
13
  import { readFileSync, writeFileSync, mkdirSync, unlinkSync } from "node:fs";
14
14
  import { dirname } from "node:path";
15
- function writePid(filePath, pid, port) {
15
+ function writePid(filePath, pid, port, version) {
16
16
  mkdirSync(dirname(filePath), { recursive: true });
17
- const content = port != null ? `${pid}:${port}` : String(pid);
17
+ let content = String(pid);
18
+ if (port != null) {
19
+ content += `:${port}`;
20
+ if (version) content += `:${version}`;
21
+ }
18
22
  writeFileSync(filePath, content, "utf8");
19
23
  }
20
24
  function readPid(filePath) {
21
25
  try {
22
26
  const content = readFileSync(filePath, "utf8").trim();
23
- const [pidStr, portStr] = content.split(":");
27
+ const [pidStr, portStr, versionStr] = content.split(":");
24
28
  const pid = parseInt(pidStr, 10);
25
29
  if (Number.isNaN(pid)) return null;
26
30
  const port = portStr ? parseInt(portStr, 10) : void 0;
27
- return { pid, port: Number.isNaN(port) ? void 0 : port };
31
+ return {
32
+ pid,
33
+ port: Number.isNaN(port) ? void 0 : port,
34
+ version: versionStr || void 0
35
+ };
28
36
  } catch {
29
37
  return null;
30
38
  }
@@ -176,7 +184,19 @@ function dailyActivity(sessions) {
176
184
  };
177
185
  for (const s of sessions) {
178
186
  const startDay = sessionDay(s);
179
- if (startDay) {
187
+ if (s.dailyBreakdown && s.dailyBreakdown.length > 0) {
188
+ for (const d of s.dailyBreakdown) {
189
+ const bucket = touchBucket(d.day);
190
+ bucket.toolCalls += d.toolCalls;
191
+ bucket.turns += d.turns;
192
+ bucket.tokens.input += d.tokens.input;
193
+ bucket.tokens.output += d.tokens.output;
194
+ bucket.tokens.cacheRead += d.tokens.cacheRead;
195
+ bucket.tokens.cacheWrite += d.tokens.cacheWrite;
196
+ }
197
+ if (startDay)
198
+ touchBucket(startDay).durationMs += s.durationMs ?? 0;
199
+ } else if (startDay) {
180
200
  const bucket = touchBucket(startDay);
181
201
  bucket.toolCalls += s.toolCallCount ?? 0;
182
202
  bucket.turns += s.turnCount ?? 0;
@@ -186,31 +206,30 @@ function dailyActivity(sessions) {
186
206
  bucket.tokens.cacheWrite += s.totalUsage.cacheWrite;
187
207
  bucket.durationMs += s.durationMs ?? 0;
188
208
  }
209
+ const presenceDays = /* @__PURE__ */ new Set();
189
210
  const segments = s.activeSegments;
190
211
  if (segments && segments.length > 0) {
191
- const touchedDays = /* @__PURE__ */ new Set();
192
212
  for (const seg of segments) {
193
213
  let cur = seg.startMs;
194
214
  while (cur < seg.endMs) {
195
215
  const day2 = toLocalDay(cur);
196
- touchedDays.add(day2);
216
+ presenceDays.add(day2);
197
217
  const d = new Date(cur);
198
218
  d.setHours(24, 0, 0, 0);
199
219
  const dayEndMs = Math.min(d.getTime(), seg.endMs);
200
- const bucket = touchBucket(day2);
201
- bucket.airTimeMs += dayEndMs - cur;
220
+ touchBucket(day2).airTimeMs += dayEndMs - cur;
202
221
  cur = dayEndMs;
203
222
  }
204
223
  }
205
- for (const day2 of touchedDays) {
206
- const bucket = touchBucket(day2);
207
- bucket.sessions++;
208
- }
209
224
  } else if (startDay) {
210
- const bucket = touchBucket(startDay);
211
- bucket.sessions++;
212
- bucket.airTimeMs += s.airTimeMs ?? 0;
225
+ presenceDays.add(startDay);
226
+ touchBucket(startDay).airTimeMs += s.airTimeMs ?? 0;
213
227
  }
228
+ if (s.dailyBreakdown)
229
+ for (const d of s.dailyBreakdown)
230
+ presenceDays.add(d.day);
231
+ for (const day2 of presenceDays)
232
+ touchBucket(day2).sessions++;
214
233
  }
215
234
  const range = minDay && maxDay ? daysBetween(minDay, maxDay) : [];
216
235
  const out = [];
@@ -1255,9 +1274,31 @@ function parseTranscript(rawLines) {
1255
1274
  let linesAdded = 0;
1256
1275
  let linesRemoved = 0;
1257
1276
  const filesEdited = /* @__PURE__ */ new Set();
1277
+ const perDay = /* @__PURE__ */ new Map();
1278
+ const fallbackDay = startMs !== void 0 ? toLocalDay(startMs) : void 0;
1279
+ const dayBucket = (ts) => {
1280
+ let day2;
1281
+ if (ts) {
1282
+ const ms = Date.parse(ts);
1283
+ if (!Number.isNaN(ms))
1284
+ day2 = toLocalDay(ms);
1285
+ }
1286
+ day2 = day2 ?? fallbackDay;
1287
+ if (!day2)
1288
+ return void 0;
1289
+ let b = perDay.get(day2);
1290
+ if (!b) {
1291
+ b = { toolCalls: 0, turns: 0, tokens: { ...BLANK_USAGE2 } };
1292
+ perDay.set(day2, b);
1293
+ }
1294
+ return b;
1295
+ };
1258
1296
  for (const e of events) {
1259
1297
  if (e.role === "tool-call") {
1260
1298
  toolCallCount++;
1299
+ const tcDay = dayBucket(e.timestamp);
1300
+ if (tcDay)
1301
+ tcDay.toolCalls++;
1261
1302
  const toolBlock = e.blocks.find((b) => b && b.type === "tool_use");
1262
1303
  if (toolBlock) {
1263
1304
  const input = toolBlock.input ?? {};
@@ -1294,6 +1335,9 @@ function parseTranscript(rawLines) {
1294
1335
  firstUserPreview = e.teammateMessage ? e.teammateMessage.body : e.preview;
1295
1336
  }
1296
1337
  turnCount++;
1338
+ const turnDay = dayBucket(e.timestamp);
1339
+ if (turnDay)
1340
+ turnDay.turns++;
1297
1341
  lastUserPreview = e.preview;
1298
1342
  }
1299
1343
  }
@@ -1335,6 +1379,14 @@ function parseTranscript(rawLines) {
1335
1379
  totalUsage.output += u.output;
1336
1380
  totalUsage.cacheRead += u.cacheRead;
1337
1381
  totalUsage.cacheWrite += u.cacheWrite;
1382
+ const ts = typeof o.timestamp === "string" ? o.timestamp : void 0;
1383
+ const b = dayBucket(ts);
1384
+ if (b) {
1385
+ b.tokens.input += u.input;
1386
+ b.tokens.output += u.output;
1387
+ b.tokens.cacheRead += u.cacheRead;
1388
+ b.tokens.cacheWrite += u.cacheWrite;
1389
+ }
1338
1390
  }
1339
1391
  }
1340
1392
  }
@@ -1358,6 +1410,7 @@ function parseTranscript(rawLines) {
1358
1410
  lastAgentPreview,
1359
1411
  toolCallCount,
1360
1412
  turnCount,
1413
+ dailyBreakdown: Array.from(perDay.entries()).map(([day2, v]) => ({ day: day2, toolCalls: v.toolCalls, turns: v.turns, tokens: v.tokens })).sort((a, b) => a.day.localeCompare(b.day)),
1361
1414
  airTimeMs,
1362
1415
  activeSegments,
1363
1416
  linesAdded,
@@ -1376,6 +1429,7 @@ var init_parser = __esm({
1376
1429
  "../parser/dist/parser.js"() {
1377
1430
  "use strict";
1378
1431
  init_user_input();
1432
+ init_analytics();
1379
1433
  BLANK_USAGE2 = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };
1380
1434
  TEAMMATE_MSG_RE = /^\s*<teammate-message\s+teammate_id="([^"]+)"[^>]*>([\s\S]*?)<\/teammate-message>/;
1381
1435
  }
@@ -1649,7 +1703,7 @@ async function loadCalibrationEvents(root = DEFAULT_ROOT) {
1649
1703
  out.sort((a, b) => a.ts.localeCompare(b.ts));
1650
1704
  return out;
1651
1705
  }
1652
- function aggregateUsageFromLines(lines, seenKeys, usage2) {
1706
+ function aggregateUsageFromLines(lines, seenKeys, usage2, perDay, fallbackDay) {
1653
1707
  for (const raw of lines) {
1654
1708
  if (!raw || typeof raw !== "object")
1655
1709
  continue;
@@ -1669,35 +1723,85 @@ function aggregateUsageFromLines(lines, seenKeys, usage2) {
1669
1723
  const u = m.usage;
1670
1724
  if (u) {
1671
1725
  const toNum = (v) => typeof v === "number" ? v : 0;
1672
- usage2.input += toNum(u.input_tokens);
1673
- usage2.output += toNum(u.output_tokens);
1674
- usage2.cacheRead += toNum(u.cache_read_input_tokens);
1675
- usage2.cacheWrite += toNum(u.cache_creation_input_tokens);
1726
+ const inp = toNum(u.input_tokens);
1727
+ const out = toNum(u.output_tokens);
1728
+ const cr = toNum(u.cache_read_input_tokens);
1729
+ const cw = toNum(u.cache_creation_input_tokens);
1730
+ usage2.input += inp;
1731
+ usage2.output += out;
1732
+ usage2.cacheRead += cr;
1733
+ usage2.cacheWrite += cw;
1734
+ if (perDay) {
1735
+ let day2;
1736
+ const ts = typeof r.timestamp === "string" ? r.timestamp : void 0;
1737
+ if (ts) {
1738
+ const ms = Date.parse(ts);
1739
+ if (!Number.isNaN(ms))
1740
+ day2 = toLocalDay(ms);
1741
+ }
1742
+ day2 = day2 ?? fallbackDay;
1743
+ if (day2) {
1744
+ let d = perDay.get(day2);
1745
+ if (!d) {
1746
+ d = { ...BLANK_USAGE3 };
1747
+ perDay.set(day2, d);
1748
+ }
1749
+ d.input += inp;
1750
+ d.output += out;
1751
+ d.cacheRead += cr;
1752
+ d.cacheWrite += cw;
1753
+ }
1754
+ }
1676
1755
  }
1677
1756
  }
1678
1757
  }
1679
- async function computeSessionUsageWithSubagents(parentLines, projectDirPath, sessionId) {
1758
+ async function computeSessionUsageWithSubagents(parentLines, projectDirPath, sessionId, fallbackDay) {
1680
1759
  const usage2 = { ...BLANK_USAGE3 };
1681
1760
  const seenKeys = /* @__PURE__ */ new Set();
1682
- aggregateUsageFromLines(parentLines, seenKeys, usage2);
1761
+ const perDay = /* @__PURE__ */ new Map();
1762
+ aggregateUsageFromLines(parentLines, seenKeys, usage2, perDay, fallbackDay);
1683
1763
  const subagentsDir = path.join(projectDirPath, sessionId, "subagents");
1684
1764
  let entries2;
1685
1765
  try {
1686
1766
  entries2 = await fs.readdir(subagentsDir);
1687
1767
  } catch {
1688
- return usage2;
1768
+ return { usage: usage2, perDay };
1689
1769
  }
1690
1770
  const jsonlFiles = entries2.filter((f) => f.endsWith(".jsonl"));
1691
1771
  if (jsonlFiles.length === 0)
1692
- return usage2;
1772
+ return { usage: usage2, perDay };
1693
1773
  await Promise.all(jsonlFiles.map(async (f) => {
1694
1774
  try {
1695
1775
  const lines = await readJsonlFile(path.join(subagentsDir, f));
1696
- aggregateUsageFromLines(lines, seenKeys, usage2);
1776
+ aggregateUsageFromLines(lines, seenKeys, usage2, perDay, fallbackDay);
1697
1777
  } catch {
1698
1778
  }
1699
1779
  }));
1700
- return usage2;
1780
+ return { usage: usage2, perDay };
1781
+ }
1782
+ function mergeDailyTokens(base, perDayTokens, totalUsage) {
1783
+ const counts = new Map((base ?? []).map((d) => [d.day, d]));
1784
+ const days = /* @__PURE__ */ new Set([...counts.keys(), ...perDayTokens.keys()]);
1785
+ const out = [...days].sort((a, b) => a.localeCompare(b)).map((day2) => ({
1786
+ day: day2,
1787
+ toolCalls: counts.get(day2)?.toolCalls ?? 0,
1788
+ turns: counts.get(day2)?.turns ?? 0,
1789
+ tokens: { ...perDayTokens.get(day2) ?? BLANK_USAGE3 }
1790
+ }));
1791
+ if (out.length > 0) {
1792
+ const summed = out.reduce((a, r) => ({
1793
+ input: a.input + r.tokens.input,
1794
+ output: a.output + r.tokens.output,
1795
+ cacheRead: a.cacheRead + r.tokens.cacheRead,
1796
+ cacheWrite: a.cacheWrite + r.tokens.cacheWrite
1797
+ }), { ...BLANK_USAGE3 });
1798
+ const first = out[0].tokens;
1799
+ first.input += totalUsage.input - summed.input;
1800
+ first.output += totalUsage.output - summed.output;
1801
+ first.cacheRead += totalUsage.cacheRead - summed.cacheRead;
1802
+ first.cacheWrite += totalUsage.cacheWrite - summed.cacheWrite;
1803
+ }
1804
+ return out;
1701
1805
  }
1702
1806
  async function scanWorkflowAggregate(projectDirPath, sessionId) {
1703
1807
  const dir = path.join(projectDirPath, sessionId, "workflows");
@@ -1755,7 +1859,10 @@ async function getCachedMeta(f) {
1755
1859
  const { meta } = parseTranscript(rawLines);
1756
1860
  const sessionId = sessionIdFromFileName(f.fileName);
1757
1861
  const projectDirPath = path.dirname(f.fullPath);
1758
- meta.totalUsage = await computeSessionUsageWithSubagents(rawLines, projectDirPath, sessionId);
1862
+ const fallbackDay = meta.firstTimestamp ? toLocalDay(Date.parse(meta.firstTimestamp)) : void 0;
1863
+ const { usage: usage2, perDay: perDayTokens } = await computeSessionUsageWithSubagents(rawLines, projectDirPath, sessionId, fallbackDay);
1864
+ meta.totalUsage = usage2;
1865
+ meta.dailyBreakdown = mergeDailyTokens(meta.dailyBreakdown, perDayTokens, usage2);
1759
1866
  const wf = await scanWorkflowAggregate(projectDirPath, sessionId);
1760
1867
  const full = {
1761
1868
  ...meta,
@@ -4369,7 +4476,9 @@ var init_fs = __esm({
4369
4476
  // src/server.ts
4370
4477
  var server_exports = {};
4371
4478
  __export(server_exports, {
4479
+ ensureCurrentServer: () => ensureCurrentServer,
4372
4480
  getServerStatus: () => getServerStatus,
4481
+ isServerStale: () => isServerStale,
4373
4482
  openBrowser: () => openBrowser,
4374
4483
  startServer: () => startServer,
4375
4484
  stopServer: () => stopServer
@@ -4387,10 +4496,29 @@ function getServerStatus() {
4387
4496
  cleanStalePid(PID_FILE);
4388
4497
  const entry = readPid(PID_FILE);
4389
4498
  if (entry !== null && isProcessAlive(entry.pid)) {
4390
- return { running: true, pid: entry.pid, port: entry.port ?? DEFAULT_PORT };
4499
+ return { running: true, pid: entry.pid, port: entry.port ?? DEFAULT_PORT, version: entry.version };
4391
4500
  }
4392
4501
  return { running: false };
4393
4502
  }
4503
+ function isServerStale(status2) {
4504
+ return status2.running === true && status2.version !== "0.12.2";
4505
+ }
4506
+ async function ensureCurrentServer(opts = {}) {
4507
+ const status2 = getServerStatus();
4508
+ if (status2.running && !isServerStale(status2)) {
4509
+ return { pid: status2.pid, port: status2.port, restarted: false };
4510
+ }
4511
+ let previousVersion;
4512
+ let port = opts.port;
4513
+ if (status2.running) {
4514
+ previousVersion = status2.version;
4515
+ port = port ?? status2.port;
4516
+ stopServer();
4517
+ await waitForPortFree(port, 5e3);
4518
+ }
4519
+ const result = await startServer({ port });
4520
+ return { ...result, restarted: status2.running, previousVersion };
4521
+ }
4394
4522
  async function startServer(opts = {}) {
4395
4523
  const port = opts.port ?? (parseInt(process.env.CCLENS_PORT ?? "", 10) || DEFAULT_PORT);
4396
4524
  const serverJs = join2(appDir(), "server.js");
@@ -4416,7 +4544,7 @@ async function startServer(opts = {}) {
4416
4544
  });
4417
4545
  child.unref();
4418
4546
  const pid = child.pid;
4419
- writePid(PID_FILE, pid, port);
4547
+ writePid(PID_FILE, pid, port, "0.12.2");
4420
4548
  await waitForHealth(`http://localhost:${port}`, 1e4);
4421
4549
  return { pid, port };
4422
4550
  }
@@ -4444,6 +4572,13 @@ async function checkPort(port) {
4444
4572
  server.listen(port, "localhost");
4445
4573
  });
4446
4574
  }
4575
+ async function waitForPortFree(port, timeoutMs) {
4576
+ const start2 = Date.now();
4577
+ while (Date.now() - start2 < timeoutMs) {
4578
+ if (!await checkPort(port)) return;
4579
+ await new Promise((r) => setTimeout(r, 200));
4580
+ }
4581
+ }
4447
4582
  async function waitForHealth(url, timeoutMs) {
4448
4583
  const start2 = Date.now();
4449
4584
  while (Date.now() - start2 < timeoutMs) {
@@ -4769,9 +4904,9 @@ Installed: ${PACKAGE_NAME}@${verify.installedVersion} at ${verify.installedPath
4769
4904
  console.warn(
4770
4905
  ` \u2022 reinstall in the correct Node env: 'npm install -g ${PACKAGE_NAME}@latest'`
4771
4906
  );
4772
- } else if (verify.installedVersion !== "0.12.0") {
4907
+ } else if (verify.installedVersion !== "0.12.2") {
4773
4908
  console.log(
4774
- ` \u2192 This process is still running ${"0.12.0"}. Next invocation will use ${verify.installedVersion}.`
4909
+ ` \u2192 This process is still running ${"0.12.2"}. Next invocation will use ${verify.installedVersion}.`
4775
4910
  );
4776
4911
  }
4777
4912
  }
@@ -4806,14 +4941,14 @@ async function getUpdateAvailability() {
4806
4941
  if (isDevMode()) return null;
4807
4942
  const latest = await fetchLatestVersion();
4808
4943
  if (latest === null) return {
4809
- current: "0.12.0",
4944
+ current: "0.12.2",
4810
4945
  latest: null,
4811
4946
  updateAvailable: false
4812
4947
  };
4813
4948
  return {
4814
- current: "0.12.0",
4949
+ current: "0.12.2",
4815
4950
  latest,
4816
- updateAvailable: shouldUpdate("0.12.0", latest)
4951
+ updateAvailable: shouldUpdate("0.12.2", latest)
4817
4952
  };
4818
4953
  }
4819
4954
  async function checkForUpdate() {
@@ -4903,7 +5038,7 @@ async function restartServices(state) {
4903
5038
  }
4904
5039
  async function forceUpdate() {
4905
5040
  const latest = await fetchLatestVersion();
4906
- const current = "0.12.0";
5041
+ const current = "0.12.2";
4907
5042
  if (latest === null) {
4908
5043
  console.error("Could not reach npm registry. Check your network.");
4909
5044
  process.exit(1);
@@ -4954,24 +5089,23 @@ async function start(args2) {
4954
5089
  await checkForUpdate();
4955
5090
  } catch {
4956
5091
  }
4957
- const status2 = getServerStatus();
4958
5092
  let serverUrl;
4959
5093
  let serverPid;
4960
- if (status2.running) {
4961
- serverUrl = `http://localhost:${status2.port}`;
4962
- serverPid = status2.pid;
4963
- console.log(`Server: already running on ${serverUrl} (PID ${serverPid})`);
4964
- } else {
5094
+ try {
4965
5095
  console.log("Starting Fleetlens...");
4966
- try {
4967
- const result = await startServer({ port });
4968
- serverUrl = `http://localhost:${result.port}`;
4969
- serverPid = result.pid;
4970
- console.log(`Server: started on ${serverUrl} (PID ${serverPid})`);
4971
- } catch (err) {
4972
- console.error(`Failed to start server: ${err.message}`);
4973
- process.exit(1);
5096
+ const result = await ensureCurrentServer({ port });
5097
+ serverUrl = `http://localhost:${result.port}`;
5098
+ serverPid = result.pid;
5099
+ if (result.restarted) {
5100
+ console.log(
5101
+ `Server: restarted on ${serverUrl} (PID ${serverPid}) \u2014 replaced stale ${result.previousVersion ?? "unknown"} server`
5102
+ );
5103
+ } else {
5104
+ console.log(`Server: running on ${serverUrl} (PID ${serverPid})`);
4974
5105
  }
5106
+ } catch (err) {
5107
+ console.error(`Failed to start server: ${err.message}`);
5108
+ process.exit(1);
4975
5109
  }
4976
5110
  if (!noDaemon) {
4977
5111
  const daemon2 = startDaemonSilent();
@@ -5044,7 +5178,13 @@ async function status() {
5044
5178
  const server = getServerStatus();
5045
5179
  if (server.running) {
5046
5180
  const url = `http://localhost:${server.port}`;
5047
- console.log(`Server: running on ${url} (PID ${server.pid})`);
5181
+ const ver = server.version ?? "unknown";
5182
+ console.log(`Server: running on ${url} (PID ${server.pid}, v${ver})`);
5183
+ if (isServerStale(server)) {
5184
+ console.log(
5185
+ ` \u26A0 serving stale ${ver} (CLI is ${"0.12.2"}) \u2014 run 'fleetlens start' to restart on the current version`
5186
+ );
5187
+ }
5048
5188
  } else {
5049
5189
  console.log("Server: not running");
5050
5190
  }
@@ -5082,31 +5222,23 @@ async function web(args2) {
5082
5222
  const positional = args2.filter((a) => !a.startsWith("--"));
5083
5223
  const rawPath = positional[0] ?? "";
5084
5224
  const path7 = rawPath.startsWith("/") ? rawPath : rawPath ? `/${rawPath}` : "";
5085
- const status2 = getServerStatus();
5086
- if (status2.running) {
5087
- const url = `http://localhost:${status2.port}${path7}`;
5088
- if (open) {
5089
- console.log(`Opening ${url}`);
5090
- openBrowser(url);
5091
- } else {
5092
- console.log(`Dashboard ready at ${url} (re-run with --open to launch it automatically).`);
5093
- }
5094
- return;
5095
- }
5096
- console.log("fleetlens is not running. Starting server...");
5225
+ let result;
5097
5226
  try {
5098
- const result = await startServer({});
5099
- const url = `http://localhost:${result.port}${path7}`;
5100
- console.log(`fleetlens running on ${url} (PID ${result.pid})`);
5101
- if (open) {
5102
- openBrowser(url);
5103
- } else {
5104
- console.log(`Open ${url} in your browser, or re-run with --open to launch it automatically.`);
5105
- }
5227
+ result = await ensureCurrentServer({});
5106
5228
  } catch (err) {
5107
5229
  console.error(`Failed to start: ${err.message}`);
5108
5230
  process.exit(1);
5109
5231
  }
5232
+ const url = `http://localhost:${result.port}${path7}`;
5233
+ if (result.restarted) {
5234
+ console.log(`fleetlens restarted on http://localhost:${result.port} (PID ${result.pid}) \u2014 replaced stale ${result.previousVersion ?? "unknown"} server`);
5235
+ }
5236
+ if (open) {
5237
+ console.log(`Opening ${url}`);
5238
+ openBrowser(url);
5239
+ } else {
5240
+ console.log(`Dashboard ready at ${url} (re-run with --open to launch it automatically).`);
5241
+ }
5110
5242
  }
5111
5243
  var init_web = __esm({
5112
5244
  "src/commands/web.ts"() {
@@ -15719,16 +15851,12 @@ function bucketToRollup(b) {
15719
15851
  };
15720
15852
  }
15721
15853
  function buildRollupsForRange(sessions, sinceDay) {
15722
- const buckets = dailyActivity(sessions);
15723
15854
  const startCounts = /* @__PURE__ */ new Map();
15724
15855
  for (const s of sessions) {
15725
15856
  const d = sessionDay(s);
15726
15857
  if (d) startCounts.set(d, (startCounts.get(d) ?? 0) + 1);
15727
15858
  }
15728
- return buckets.filter((b) => !sinceDay || b.date >= sinceDay).map((b) => ({
15729
- ...bucketToRollup(b),
15730
- sessions: startCounts.get(b.date) ?? 0
15731
- }));
15859
+ return dailyActivity(sessions).filter((b) => !sinceDay || b.date >= sinceDay).map((b) => ({ ...bucketToRollup(b), uniqueSessions: startCounts.get(b.date) ?? 0 }));
15732
15860
  }
15733
15861
  function dayBoundsMs(day2) {
15734
15862
  const [y, m, d] = day2.split("-").map(Number);
@@ -17531,7 +17659,7 @@ async function main() {
17531
17659
  case "version":
17532
17660
  case "--version":
17533
17661
  case "-v":
17534
- console.log(`fleetlens ${"0.12.0"}`);
17662
+ console.log(`fleetlens ${"0.12.2"}`);
17535
17663
  break;
17536
17664
  case "help":
17537
17665
  case "--help":
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fleetlens",
3
- "version": "0.12.0",
3
+ "version": "0.12.2",
4
4
  "description": "fleetlens — local-only dashboard and usage tracker for Claude Code sessions and agent fleets",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -1,3 +0,0 @@
1
- module.exports=[39587,e=>{"use strict";let t={kind:"claude-code",displayName:"Claude Code",shortLabel:"Claude",accentColor:"var(--af-accent)",iconChar:"✦"},i={kind:"codex",displayName:"Codex (OpenAI)",shortLabel:"Codex",accentColor:"rgb(16, 163, 127)",iconChar:"◆"},s={kind:"gemini",displayName:"Gemini CLI",shortLabel:"Gemini",accentColor:"rgb(124, 92, 246)",iconChar:"✺"},n={kind:"antigravity",displayName:"Antigravity",shortLabel:"Agy",accentColor:"rgb(236, 72, 153)",iconChar:"⏃"},a={kind:"cowork",displayName:"Cowork",shortLabel:"Cowork",accentColor:"rgb(217, 119, 87)",iconChar:"⌘"},r=[t,i,s,n,a];r.map(e=>e.kind),e.s(["ANTIGRAVITY_METADATA",0,n,"CLAUDE_CODE_METADATA",0,t,"CODEX_METADATA",0,i,"COWORK_METADATA",0,a,"GEMINI_METADATA",0,s,"agentMetadata",0,r])},20629,36521,34235,e=>{"use strict";var t=e.i(2157),i=e.i(60526),s=e.i(50227);let n=[/<system_instruction\b[^>]*>[\s\S]*?<\/system_instruction>\s*/gi],a=["<command-name>","<local-command-stdout>","<local-command-caveat>","<task-notification>","Base directory for this skill:"];function r(e){if(!e)return e;let t=e;for(let e of n)t=t.replace(e,"");return t.trim()}function o(e){if(!e)return!1;let t=r(e);if(!t)return!0;for(let e of a)if(t.startsWith(e))return!0;return!1}e.s(["isFrameworkInjectedUserInput",0,o,"stripFrameworkBoilerplate",0,r],36521);let l={input:0,output:0,cacheRead:0,cacheWrite:0};function u(e,t=200){let i=e.replace(/<[^>]+>/g,"").replace(/\s+/g," ").trim();return i.length>t?i.slice(0,t-1)+"…":i}let c=/^\s*<teammate-message\s+teammate_id="([^"]+)"[^>]*>([\s\S]*?)<\/teammate-message>/;function p(e){let t=e.match(c);if(!t)return;let i=t[1],s=t[2].trim(),n="message";if(s.startsWith("{"))try{let e=JSON.parse(s);"idle_notification"===e.type?n="idle-notification":"shutdown_request"===e.type?n="shutdown-request":"shutdown_approved"===e.type?n="shutdown-approved":"task_assignment"===e.type?n="task-assignment":"teammate_terminated"===e.type&&(n="teammate-terminated")}catch{}return{teammateId:i,body:s,kind:n}}function f(e){if(!e||"object"!=typeof e)return;let t=e=>"number"==typeof e?e:0;return{input:t(e.input_tokens),output:t(e.output_tokens),cacheRead:t(e.cache_read_input_tokens),cacheWrite:t(e.cache_creation_input_tokens)}}function d(e){let t,i,s,n,a,c,d,m,g,y=[];for(let t=0;t<e.length;t++){let i=function(e,t){if(!e||"object"!=typeof e)return null;let i=String(e.type??""),s=e.uuid,n=e.parentUuid??null,a=e.timestamp;if("assistant"===i){let r,o,l,c=e.message??{},p=c.content??[],d=f(c.usage),m=c.model,g=e.requestId,y=c.id,h=c.stop_reason,w=p[0],M="agent";return w?.type==="thinking"?(M="agent-thinking",r="[thinking] "+u(w.thinking,140)):w?.type==="tool_use"?(M="tool-call",o=w.name,l=w.id,r=`${w.name} `+u(JSON.stringify(w.input??{}),100)):r=w?.type==="text"?u(w.text,200):`<assistant:${w?.type??"empty"}>`,{index:t,uuid:s,parentUuid:n,timestamp:a,role:M,rawType:i,preview:r,blocks:p,usage:d,model:m,requestId:g,messageId:y,stopReason:h,toolName:o,toolUseId:l,raw:e}}if("user"===i){let o=(e.message??{}).content;if("string"==typeof o){let l=r(o),c=p(l);return{index:t,uuid:s,parentUuid:n,timestamp:a,role:"user",rawType:i,preview:u(l,200),blocks:l?[{type:"text",text:l}]:[],raw:e,teammateMessage:c}}if(Array.isArray(o)){let l=o[0];if(l?.type==="tool_result")return{index:t,uuid:s,parentUuid:n,timestamp:a,role:"tool-result",rawType:i,preview:u("string"==typeof l.content?l.content:JSON.stringify(l.content),200),blocks:o,toolUseId:l.tool_use_id,toolResult:e.toolUseResult,raw:e};let c=o.find(e=>e?.type==="text"),f=c?r(c.text):"",d=c?o.map(e=>e===c?{type:"text",text:f}:e):o,m=f?p(f):void 0;return{index:t,uuid:s,parentUuid:n,timestamp:a,role:"user",rawType:i,preview:f?u(f,200):u(JSON.stringify(o),200),blocks:d,raw:e,teammateMessage:m}}}if("attachment"===i){let r=e.attachment??{},o=String(r.type??"attachment"),l=`<attachment: ${o}>`;return"string"==typeof r.content&&r.content.length>0?l=`[${o}] `+u(r.content,140):Array.isArray(r.addedNames)&&(l=`[${o}] +${r.addedNames.length} names`),{index:t,uuid:s,parentUuid:n,timestamp:a,role:"system",rawType:i,preview:l,blocks:[{type:"text",text:JSON.stringify(r,null,2)}],attachmentType:o,raw:e}}return{index:t,uuid:s,parentUuid:n,timestamp:a,role:"meta",rawType:i||"unknown",preview:`${i}: ${u(JSON.stringify(e),140)}`,blocks:[{type:"text",text:JSON.stringify(e,null,2)}],raw:e}}(e[t],t);i&&y.push(i)}let h=y.map(e=>e.timestamp?Date.parse(e.timestamp):void 0).filter(e=>"number"==typeof e&&!Number.isNaN(e)),w=h.length?Math.min(...h):void 0,M=h.length?Math.max(...h):void 0,v=void 0!==w?new Date(w).toISOString():void 0,_=void 0!==M?new Date(M).toISOString():void 0;for(let e of y){if(!e.timestamp)continue;let t=Date.parse(e.timestamp);Number.isNaN(t)||void 0!==w&&(e.tOffsetMs=Math.max(0,t-w))}let k=y.filter(e=>{let t;return e.timestamp&&("user"===(t=e.role)||"agent"===t||"agent-thinking"===t||"tool-call"===t||"tool-result"===t)}).map(e=>({e,ms:Date.parse(e.timestamp)})).filter(e=>!Number.isNaN(e.ms)).sort((e,t)=>e.ms-t.ms);for(let e=1;e<k.length;e++)k[e].e.gapMs=Math.max(0,k[e].ms-k[e-1].ms);let j=y.filter(e=>e.timestamp).map(e=>Date.parse(e.timestamp)).filter(e=>!Number.isNaN(e)).sort((e,t)=>e-t),b=[],I=0;if(j.length>0){let e=j[0],t=j[0];for(let i=1;i<j.length;i++){let s=j[i],n=s-t;n>18e4?(b.push({startMs:e,endMs:t}),e=s):n>0&&(I+=n),t=s}b.push({startMs:e,endMs:t})}let N=new Map,x=[];for(let e of y){if(!e.timestamp)continue;let t=Date.parse(e.timestamp);if(!Number.isNaN(t)){if("assistant"===e.rawType&&e.usage&&e.messageId){let i=N.get(e.messageId);i?(i.siblings.push(e),t<i.ms&&(i.rep=e,i.ms=t)):N.set(e.messageId,{rep:e,ms:t,siblings:[e]})}else if("system"===e.rawType){let i=e.raw;if(i?.subtype!=="compact_boundary")continue;let s=i.compactMetadata??{};x.push({ms:t,trigger:"manual"===s.trigger?"manual":"auto",preTokens:"number"==typeof s.preTokens?s.preTokens:0})}}}let S=[...N.values()].sort((e,t)=>e.ms-t.ms);x.sort((e,t)=>e.ms-t.ms);let T=0,A=0,C=(e,t)=>{for(let i of e.siblings)i.coldResume=t;T++,A+=t.writeTokens},P=new Set;for(let e of x){let t,i=S.find(t=>t.ms>e.ms&&(t.rep.usage?.cacheWrite??0)>=1e3);if(!i)continue;for(let i=S.length-1;i>=0;i--)if(S[i].ms<=e.ms){t=S[i].ms;break}let s=i.rep.usage,n=s.cacheWrite+s.cacheRead;C(i,{trigger:"compact",gapMs:void 0!==t?i.ms-t:0,writeTokens:s.cacheWrite,writeRatio:n>0?s.cacheWrite/n:0,compact:{trigger:e.trigger,preTokens:e.preTokens}}),P.add(i.rep.messageId)}for(let e=1;e<S.length;e++){let t=S[e-1],i=S[e];if(P.has(i.rep.messageId))continue;let s=i.rep.usage,n=s.cacheWrite+s.cacheRead,a=n>0?s.cacheWrite/n:0,r=i.ms-t.ms;r>3e5&&s.cacheWrite>=1e3&&a>=.3&&C(i,{trigger:"idle",gapMs:r,writeTokens:s.cacheWrite,writeRatio:a})}let D={...l},$=new Set,O="",z=!1,R=!1,B=0,E=0,F=0,U=0,W=new Set;for(let e of y){if("tool-call"===e.role){B++;let t=e.blocks.find(e=>e&&"tool_use"===e.type);if(t){let e=t.input??{};if("TeamCreate"===t.name&&(z=!0),"SendMessage"===t.name){let t="string"==typeof e.to?e.to:"";t&&"team-lead"!==t&&(R=!0)}let i="string"==typeof e.file_path?e.file_path:void 0;if("Edit"===t.name&&i){W.add(i);let t="string"==typeof e.old_string?e.old_string:"",s="string"==typeof e.new_string?e.new_string:"",n=t?t.split("\n").length:0,a=s?s.split("\n").length:0;F+=Math.max(0,a-n),U+=Math.max(0,n-a)}else if("Write"===t.name&&i){W.add(i);let t="string"==typeof e.content?e.content:"";F+=t?t.split("\n").length:0}}}if("user"===e.role){let t=o(function(e){let t=e?.content;if("string"==typeof t)return t;if(Array.isArray(t)){for(let e of t)if(e&&"object"==typeof e&&"text"===e.type&&"string"==typeof e.text)return e.text}return""}(e.raw?.message)),i=void 0!==e.teammateMessage&&!c;t||i||(d||(d=e.teammateMessage?e.teammateMessage.body:e.preview),E++,g=e.preview)}"agent"===e.role&&(m=e.preview)}for(let r of e)if(r&&"object"==typeof r&&("string"!=typeof r.sessionId||O||(O=r.sessionId),"string"!=typeof r.cwd||i||(i=r.cwd),"string"!=typeof r.gitBranch||s||(s=r.gitBranch),"string"!=typeof r.entrypoint||n||(n=r.entrypoint),"string"!=typeof r.teamName||a||(a=r.teamName),"string"!=typeof r.agentName||c||(c=r.agentName),"assistant"===r.type)){let e=r.message;if(e){"string"!=typeof e.model||t||(t=e.model);let i="string"==typeof e.id?e.id:void 0,s="string"==typeof r.requestId?r.requestId:void 0,n=null!=i?`${i}:${s??""}`:void 0;if(n&&$.has(n))continue;n&&$.add(n);let a=f(e.usage);a&&(D.input+=a.input,D.output+=a.output,D.cacheRead+=a.cacheRead,D.cacheWrite+=a.cacheWrite)}}return{events:y,meta:{sessionId:O,firstTimestamp:v,lastTimestamp:_,durationMs:void 0!==w&&void 0!==M?M-w:void 0,eventCount:y.length,model:t,cwd:i,gitBranch:s,entrypoint:n,totalUsage:D,status:"idle",firstUserPreview:d,lastUserPreview:g,lastAgentPreview:m,toolCallCount:B,turnCount:E,airTimeMs:I,activeSegments:b,linesAdded:F,linesRemoved:U,filesEdited:W.size,coldResumeCount:T,cacheRebuildTokens:A,teamName:a,agentName:c,isTeamLead:void 0!==a&&void 0===c&&(z||R)}}}e.s(["parseTranscript",0,d],34235);var m=e.i(39587);let g=s.default.join(i.default.homedir(),".claude","projects");function y(e){return e.startsWith("-")?"/"+e.slice(1).replace(/-/g,"/"):e}let h=s.default.join(i.default.homedir(),".cclens","runtime").replace(/[/.]/g,"-");async function w(e){let i=await t.promises.readFile(e,"utf8"),s=[];for(let e of i.split("\n")){let t=e.trim();if(t)try{s.push(JSON.parse(t))}catch{}}return s}function M(e){return e.replace(/\.jsonl$/i,"")}let v=new Map,_=new Map,k=new Map,j=null;async function b(e=g){let i;if(j&&j.root===e&&Date.now()-j.capturedAtMs<1e3)return j.files;try{i=await t.promises.readdir(e,{withFileTypes:!0})}catch{return[]}let n=i.filter(e=>e.isDirectory()&&e.name!==h).map(e=>e.name),a=(await Promise.all(n.map(async i=>{let n,a=s.default.join(e,i);try{n=await t.promises.readdir(a)}catch{return[]}let r=n.filter(e=>e.endsWith(".jsonl"));return(await Promise.all(r.map(async e=>{let n=s.default.join(a,e);try{let s=await t.promises.stat(n);return{projectDir:i,fileName:e,fullPath:n,mtimeMs:s.mtimeMs,sizeBytes:s.size}}catch{return null}}))).filter(e=>null!==e)}))).flat();return j={files:a,capturedAtMs:Date.now(),root:e},a}let I={input:0,output:0,cacheRead:0,cacheWrite:0};function N(e,t,i){for(let s of e){if(!s||"object"!=typeof s||"assistant"!==s.type)continue;let e=s.message;if(!e)continue;let n="string"==typeof e.id?e.id:void 0,a="string"==typeof s.requestId?s.requestId:void 0,r=null!=n&&null!=a?`${n}:${a}`:void 0;if(r&&t.has(r))continue;r&&t.add(r);let o=e.usage;if(o){let e=e=>"number"==typeof e?e:0;i.input+=e(o.input_tokens),i.output+=e(o.output_tokens),i.cacheRead+=e(o.cache_read_input_tokens),i.cacheWrite+=e(o.cache_creation_input_tokens)}}}async function x(e,i,n){let a,r={...I},o=new Set;N(e,o,r);let l=s.default.join(i,n,"subagents");try{a=await t.promises.readdir(l)}catch{return r}let u=a.filter(e=>e.endsWith(".jsonl"));return 0===u.length||await Promise.all(u.map(async e=>{try{let t=await w(s.default.join(l,e));N(t,o,r)}catch{}})),r}async function S(e,i){let n,a=s.default.join(e,i,"workflows");try{n=await t.promises.readdir(a)}catch{return{workflowCount:0,spawnedAgentCount:0,spans:[]}}let r=n.filter(e=>e.startsWith("wf_")&&e.endsWith(".json"));if(0===r.length)return{workflowCount:0,spawnedAgentCount:0,spans:[]};let o=0,l=[];return{workflowCount:(await Promise.all(r.map(async e=>{try{let i=JSON.parse(await t.promises.readFile(s.default.join(a,e),"utf8"));return"number"==typeof i.agentCount&&(o+=i.agentCount),"number"==typeof i.startTime&&"number"==typeof i.durationMs&&i.durationMs>0&&l.push({startMs:i.startTime,endMs:i.startTime+i.durationMs}),!0}catch{return!1}}))).filter(Boolean).length,spawnedAgentCount:o,spans:l}}function T(e,t){if(0===t.length)return{};let i=[...e??[],...t].filter(e=>e.endMs>e.startMs).sort((e,t)=>e.startMs-t.startMs);if(0===i.length)return{};let s=[{...i[0]}];for(let e=1;e<i.length;e++){let t=i[e],n=s[s.length-1];t.startMs<=n.endMs?n.endMs=Math.max(n.endMs,t.endMs):s.push({...t})}let n=s.reduce((e,t)=>e+(t.endMs-t.startMs),0);return{activeSegments:s,airTimeMs:n}}async function A(e){let t=v.get(e.fullPath);if(t&&t.mtimeMs===e.mtimeMs&&t.sizeBytes===e.sizeBytes)return t.meta;try{let t=await w(e.fullPath),{meta:i}=d(t),n=M(e.fileName),a=s.default.dirname(e.fullPath);i.totalUsage=await x(t,a,n);let r=await S(a,n),o={...i,id:n,filePath:e.fullPath,projectDir:e.projectDir,projectName:i.cwd??y(e.projectDir),...r.workflowCount>0?{workflowCount:r.workflowCount,spawnedAgentCount:r.spawnedAgentCount}:{},...T(i.activeSegments,r.spans)};return v.set(e.fullPath,{meta:o,mtimeMs:e.mtimeMs,sizeBytes:e.sizeBytes}),o}catch{return null}}async function C(e){let t=_.get(e.fullPath);if(t&&t.mtimeMs===e.mtimeMs&&t.sizeBytes===e.sizeBytes)return t.detail;try{let t=await w(e.fullPath),{meta:i,events:n}=d(t),a=M(e.fileName),r=await S(s.default.dirname(e.fullPath),a),o={...i,id:a,filePath:e.fullPath,projectDir:e.projectDir,projectName:i.cwd??y(e.projectDir),events:n,...r.workflowCount>0?{workflowCount:r.workflowCount,spawnedAgentCount:r.spawnedAgentCount}:{},...T(i.activeSegments,r.spans)};_.set(e.fullPath,{detail:o,mtimeMs:e.mtimeMs,sizeBytes:e.sizeBytes});let l={...o};return delete l.events,v.set(e.fullPath,{meta:l,mtimeMs:e.mtimeMs,sizeBytes:e.sizeBytes}),o}catch{return null}}async function P(e={}){let{root:t=g,limit:i=500,projectDir:s}=e,n=await b(t);s&&(n=n.filter(e=>e.projectDir===s)),n.sort((e,t)=>t.mtimeMs-e.mtimeMs);let a=n.slice(0,i);return(await Promise.all(a.map(e=>A(e)))).filter(e=>null!==e)}async function D(e,t={}){let{root:i=g}=t,n=(await b(i)).find(t=>M(t.fileName)===e);if(!n)return null;let a=await C(n);if(!a)return a;let r=a.firstTimestamp?Date.parse(a.firstTimestamp):void 0,o=s.default.join(s.default.dirname(n.fullPath),M(n.fileName),"subagents"),l=s.default.join(s.default.dirname(n.fullPath),M(n.fileName),"workflows"),[u,c]=await Promise.all([$(o,r,a.events),O(l,r,a.events)]),p=c.reduce((e,t)=>e+t.agentCount,0);return{...a,subagents:u,workflows:c,...c.length>0?{workflowCount:c.length,spawnedAgentCount:p}:{}}}async function $(e,i,n){let a;try{a=await t.promises.readdir(e)}catch{return[]}let r=new Map,o=[];for(let e of n)if("tool-call"===e.role&&"Agent"===e.toolName)for(let t of e.blocks){if(t?.type!=="tool_use"||"Agent"!==t.name)continue;let i=t.input??{},s="string"==typeof i.description?i.description:void 0,n=e.timestamp?Date.parse(e.timestamp):void 0,a={toolUseId:t.id,parentUuid:e.uuid??"",runInBackground:!0===i.run_in_background,prompt:"string"==typeof i.prompt?i.prompt:void 0,tsMs:n};s&&r.set(s,a),void 0!==n&&o.push(a)}o.sort((e,t)=>(e.tsMs??0)-(t.tsMs??0));let l=a.filter(e=>e.startsWith("agent-")&&e.endsWith(".jsonl"));return(await Promise.all(l.map(async n=>{let a,l=n.replace(/^agent-/,"").replace(/\.jsonl$/,""),u=s.default.join(e,n),c=s.default.join(e,`agent-${l}.meta.json`),p={};try{let e=await t.promises.readFile(c,"utf8");p=JSON.parse(e)}catch{}try{a=await w(u)}catch{return null}let f=function(e){let t,i,s,n,a,r={...I},o=new Set,l=0,u=0,c=0,p=new Map;for(let f of e){if(!f||"object"!=typeof f)continue;l++;let e="string"==typeof f.timestamp?Date.parse(f.timestamp):NaN;if(!Number.isNaN(e)&&((void 0===t||e<t)&&(t=e),(void 0===i||e>i)&&(i=e)),void 0===a&&"user"===f.type&&(null===f.parentUuid||void 0===f.parentUuid)){let e=f.message,t=e?.content;if("string"==typeof t)a=t;else if(Array.isArray(t)){let e=t.find(e=>e&&"object"==typeof e&&"text"===e.type);e?.text&&(a=e.text)}}if("assistant"===f.type){let e=f.message;if(!e)continue;n||"string"!=typeof e.model||(n=e.model);let t="string"==typeof e.id?e.id:void 0,i="string"==typeof f.requestId?f.requestId:void 0,a=null!=t&&null!=i?`${t}:${i}`:void 0,l=!a||!o.has(a);if(a&&l&&o.add(a),l){u++;let t=e.usage;if(t){let e=e=>"number"==typeof e?e:0;r.input+=e(t.input_tokens),r.output+=e(t.output_tokens),r.cacheRead+=e(t.cache_read_input_tokens),r.cacheWrite+=e(t.cache_creation_input_tokens)}}let d=e.content;if(Array.isArray(d))for(let e of d)e&&"object"==typeof e&&("text"===e.type&&"string"==typeof e.text?s=e.text:"tool_use"===e.type&&"string"==typeof e.name&&(c++,p.set(e.name,(p.get(e.name)??0)+1)))}}let f=Array.from(p.entries()).map(([e,t])=>({name:e,count:t})).sort((e,t)=>t.count-e.count);return{startMs:t,endMs:i,totalUsage:r,eventCount:l,finalPreview:void 0!==s?s.replace(/\s+/g," ").trim().slice(0,240):void 0,finalText:s,model:n,toolCalls:f,toolCallCount:c,assistantMessageCount:u,initialPrompt:a}}(a),d=p.description&&p.description.trim().length>0?p.description:void 0,m=d?r.get(d):function(e){let t;if(void 0===e)return;let i=1/0;for(let s of o){if(void 0===s.tsMs)continue;let n=Math.abs(e-s.tsMs);n<i&&n<=2e3&&(t=s,i=n)}return t}(f.startMs),g=d??(f.initialPrompt?f.initialPrompt.replace(/\s+/g," ").trim().slice(0,80):"(no description)"),y=m?.prompt??f.initialPrompt,h=void 0!==i&&void 0!==f.startMs?Math.max(0,f.startMs-i):void 0,M=void 0!==i&&void 0!==f.endMs?Math.max(0,f.endMs-i):void 0,v=void 0!==f.startMs&&void 0!==f.endMs?f.endMs-f.startMs:void 0;return{agentId:l,agentType:p.agentType??"unknown",description:g,startMs:f.startMs,endMs:f.endMs,durationMs:v,startTOffsetMs:h,endTOffsetMs:M,eventCount:f.eventCount,totalUsage:f.totalUsage,parentUuid:m?.parentUuid,parentToolUseId:m?.toolUseId,runInBackground:m?.runInBackground,prompt:y,finalPreview:f.finalPreview,finalText:f.finalText,model:f.model,toolCalls:f.toolCalls,toolCallCount:f.toolCallCount,assistantMessageCount:f.assistantMessageCount}}))).filter(e=>null!==e).sort((e,t)=>(e.startMs??0)-(t.startMs??0))}async function O(e,i,n){let a;try{a=await t.promises.readdir(e)}catch{return[]}let r=a.filter(e=>e.startsWith("wf_")&&e.endsWith(".json"));if(0===r.length)return[];let o=[];for(let e of n){if("tool-call"!==e.role||"Workflow"!==e.toolName)continue;let t=e.timestamp?Date.parse(e.timestamp):NaN;if(!Number.isNaN(t))for(let i of e.blocks)i?.type==="tool_use"&&"Workflow"===i.name&&o.push({toolUseId:i.id,parentUuid:e.uuid??"",tsMs:t})}o.sort((e,t)=>e.tsMs-t.tsMs);let l=e=>"number"==typeof e?e:void 0,u=e=>"string"==typeof e&&e.length>0?e:void 0;return(await Promise.all(r.map(async n=>{let a;try{a=JSON.parse(await t.promises.readFile(s.default.join(e,n),"utf8"))}catch{return null}let r=u(a.runId)??n.replace(/\.json$/,""),c=l(a.startTime),p=l(a.durationMs),f=void 0!==c&&void 0!==p?c+p:void 0,d=void 0!==i&&void 0!==c?Math.max(0,c-i):void 0,m=void 0!==i&&void 0!==f?Math.max(0,f-i):void 0,g=Array.isArray(a.phases)?a.phases.filter(e=>!!e&&"object"==typeof e&&"string"==typeof e.title).map(e=>({title:e.title,detail:u(e.detail)})):[],y=Array.isArray(a.logs)?a.logs.filter(e=>"string"==typeof e):[],h=(e,t)=>{let i=u(e);return void 0===i?void 0:i.length>t?i.slice(0,t)+"…":i},w=(Array.isArray(a.workflowProgress)?a.workflowProgress:[]).filter(e=>!!e&&"object"==typeof e&&"workflow_agent"===e.type).map(e=>({index:l(e.index)??0,label:u(e.label)??"(agent)",phaseIndex:l(e.phaseIndex),phaseTitle:u(e.phaseTitle),agentId:u(e.agentId),model:u(e.model),state:u(e.state),startedAt:l(e.startedAt),durationMs:l(e.durationMs),tokens:l(e.tokens),toolCalls:l(e.toolCalls),lastToolSummary:h(e.lastToolSummary,200),promptPreview:h(e.promptPreview,600),resultPreview:h(e.resultPreview,600)})).sort((e,t)=>e.index-t.index),M=(e=>{let t,i;if(void 0===e||0===o.length)return;let s=1/0,n=1/0;for(let a of o){let r=Math.abs(e-a.tsMs);!(r>6e4)&&(r<n&&(i=a,n=r),a.tsMs<=e&&r<s&&(t=a,s=r))}return t??i})(c);return{runId:r,name:u(a.workflowName)??r,description:u(a.summary),status:u(a.status)??"unknown",agentCount:l(a.agentCount)??0,toolCallCount:l(a.totalToolCalls)??0,totalTokens:l(a.totalTokens)??0,durationMs:p,startMs:c,endMs:f,startTOffsetMs:d,endTOffsetMs:m,model:u(a.defaultModel),phases:g,logs:y,agents:w,parentToolUseId:M?.toolUseId,parentUuid:M?.parentUuid}}))).filter(e=>null!==e).sort((e,t)=>(e.startMs??0)-(t.startMs??0))}async function z(e,t,i,n={}){let a,r,o,l,u,c,{root:p=g}=n;if(!/^[\w.-]+$/.test(t)||!/^[\w.-]+$/.test(i))return null;let f=(await b(p)).find(t=>M(t.fileName)===e);if(!f)return null;let d=s.default.join(s.default.dirname(f.fullPath),e,"subagents","workflows",t,`agent-${i}.jsonl`);try{a=await w(d)}catch{return null}let m=new Set;for(let e of a){if(!e||"object"!=typeof e)continue;let t=e.message?.content;if(Array.isArray(t))for(let e of t)e&&"object"==typeof e&&"tool_result"===e.type&&!0===e.is_error&&"string"==typeof e.tool_use_id&&m.add(e.tool_use_id)}let y=[],h=new Map,v={...I},_=new Set,k=0,j=0;for(let e of a){if(!e||"object"!=typeof e)continue;j++;let t="string"==typeof e.timestamp?Date.parse(e.timestamp):NaN;if(!Number.isNaN(t)&&((void 0===u||t<u)&&(u=t),(void 0===c||t>c)&&(c=t)),void 0===r&&"user"===e.type&&(null===e.parentUuid||void 0===e.parentUuid)){let t=e.message?.content;if("string"==typeof t)r=t;else if(Array.isArray(t)){let e=t.find(e=>e&&"object"==typeof e&&"text"===e.type);e?.text&&(r=e.text)}}if("assistant"!==e.type)continue;let i=e.message;if(!i)continue;l||"string"!=typeof i.model||(l=i.model);let s="string"==typeof i.id?i.id:void 0,n="string"==typeof e.requestId?e.requestId:void 0,a=null!=s&&null!=n?`${s}:${n}`:void 0,p=!a||!_.has(a);if(a&&p&&_.add(a),p){k++;let e=i.usage;if(e){let t=e=>"number"==typeof e?e:0;v.input+=t(e.input_tokens),v.output+=t(e.output_tokens),v.cacheRead+=t(e.cache_read_input_tokens),v.cacheWrite+=t(e.cache_creation_input_tokens)}}let f=i.content;if(Array.isArray(f)){for(let e of f)if(e&&"object"==typeof e){if("text"===e.type&&"string"==typeof e.text)o=e.text;else if("tool_use"===e.type&&"string"==typeof e.name&&(h.set(e.name,(h.get(e.name)??0)+1),y.length<2e3)){let t=function(e){if(!e||"object"!=typeof e)return"";let t=t=>"string"==typeof e[t]?e[t]:void 0;return t("command")??t("file_path")??t("path")??t("pattern")??t("url")??t("description")??t("query")??t("prompt")??t("old_string")??JSON.stringify(e)}(e.input),i=t.replace(/\s+/g," ").trim().slice(0,160),s=t.length>4e3?t.slice(0,4e3)+"…":t;y.push({index:y.length+1,tool:e.name,preview:i,full:s.length>i.length||s.includes("\n")?s:void 0,isError:"string"==typeof e.id&&m.has(e.id)})}}}}return{agentId:i,prompt:r,finalText:o,steps:y,toolCalls:Array.from(h.entries()).map(([e,t])=>({name:e,count:t})).sort((e,t)=>t.count-e.count),toolCallCount:y.length,assistantMessageCount:k,eventCount:j,totalUsage:v,model:l,durationMs:void 0!==u&&void 0!==c?c-u:void 0}}let R={...m.CLAUDE_CODE_METADATA,defaultRoot:g,async listSessions(e){let t=await P(e);for(let e of t)e.agent||(e.agent="claude-code");return t},async getSession(e,t){let i=await D(e,t);return i&&!i.agent&&(i.agent="claude-code"),i}};e.s(["DEFAULT_ROOT",0,g,"claudeCodeSource",0,R,"getSession",0,D,"invalidateClaudeCodeFile",0,function(e){v.delete(e),_.delete(e),k.delete(e),j=null},"listSessions",0,P,"loadWorkflowAgentDetail",0,z],20629)},79357,e=>{"use strict";let t=["/.claude/worktrees/","/.worktrees/","/claude/worktrees/"],i=/\/conductor\/workspaces\/[^/]+\/([^/]+)(?:\/|$)/,s="/.superset/worktrees/",n=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;e.s(["canonicalProjectName",0,function(e){let a=e.replace(/\/{2,}/g,"/"),r=function(e){for(let i of t){let t=e.lastIndexOf(i);if(t>=0)return{idx:t,marker:i}}return null}(a);if(r)return a.slice(0,r.idx);let o=function(e){let t=i.exec(e);if(!t)return null;let s=t[1],n=+!!t[0].endsWith("/");return{canonicalEndIdx:t.index+t[0].length-s.length-1-n,workspaceName:s}}(a);if(o)return a.slice(0,o.canonicalEndIdx);let l=function(e){let t=e.indexOf(s);if(t<0)return null;let i=e.slice(t+s.length).split("/").filter(Boolean);if(0===i.length)return null;let a=n.test(i[0])?i[1]??i[0]:i[0];return{canonical:e.slice(0,t)+s+a,workspaceName:a}}(a);return l?l.canonical:a},"computeBurstsFromSessions",0,function(e,t={}){let i=[];for(let t of e)t.activeSegments&&0!==t.activeSegments.length&&i.push({id:t.id,projectDir:t.projectDir,segments:t.activeSegments});return function(e,t){let i=t.minDurationMs??6e4,s=t.mergeGapMs??6e5,n=t.minActive??2,a=[];for(let t of e)for(let e of t.segments)e.endMs<=e.startMs||(a.push({ms:e.startMs,delta:1,sessionId:t.id}),a.push({ms:e.endMs,delta:-1,sessionId:t.id}));a.sort((e,t)=>e.ms-t.ms||t.delta-e.delta);let r=new Map,o=[],l=null;for(let e of a){if(1===e.delta)r.set(e.sessionId,(r.get(e.sessionId)??0)+1);else{let t=(r.get(e.sessionId)??0)-1;t<=0?r.delete(e.sessionId):r.set(e.sessionId,t)}let t=r.size;if(t>=n)if(l)for(let i of(l.endMs=e.ms,t>l.peak&&(l.peak=t),r.keys()))l.sessionIds.add(i);else l={startMs:e.ms,endMs:e.ms,peak:t,sessionIds:new Set(r.keys())};else l&&(l.endMs=e.ms,o.push(l),l=null)}l&&o.push(l);let u=o.filter(e=>e.endMs-e.startMs>=i),c=[];for(let e of u){let t=c[c.length-1];if(t&&e.startMs-t.endMs<=s)for(let i of(t.endMs=e.endMs,e.peak>t.peak&&(t.peak=e.peak),e.sessionIds))t.sessionIds.add(i);else c.push({startMs:e.startMs,endMs:e.endMs,peak:e.peak,sessionIds:new Set(e.sessionIds)})}let p=new Map;for(let t of e)p.set(t.id,t.projectDir);return c.map(e=>{let t=Array.from(new Set(Array.from(e.sessionIds).map(e=>p.get(e)).filter(e=>!!e)));return{startMs:e.startMs,endMs:e.endMs,peak:e.peak,sessionIds:Array.from(e.sessionIds),projectDirs:t,crossProject:t.length>1}})}(i,t)},"toLocalDay",0,function(e){let t=new Date(e),i=t.getFullYear(),s=String(t.getMonth()+1).padStart(2,"0"),n=String(t.getDate()).padStart(2,"0");return`${i}-${s}-${n}`}])},43427,e=>{"use strict";let t;e.s(["cclensHome",()=>ef,"cclensPath",()=>ed,"getAnySession",()=>ev,"invalidateFile",()=>em],43427);var i=e.i(2157),s=e.i(60526),n=e.i(50227),a=e.i(39587),r=e.i(20629),o=e.i(79357),l=e.i(36521);let u=n.default.join(s.default.homedir(),".codex","sessions"),c=/^rollout-(\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2})-([0-9a-f-]+)\.jsonl$/;async function p(e){return i.promises.readdir(e).catch(()=>[])}async function f(e){let t=[];for(let s of(await p(e))){if(!/^\d{4}$/.test(s))continue;let a=n.default.join(e,s);for(let e of(await p(a))){if(!/^\d{2}$/.test(e))continue;let s=n.default.join(a,e);for(let e of(await p(s))){if(!/^\d{2}$/.test(e))continue;let a=n.default.join(s,e);for(let e of(await p(a))){let s=c.exec(e);if(!s)continue;let r=n.default.join(a,e),o=await i.promises.stat(r).catch(()=>null);o&&t.push({filePath:r,sessionId:s[2],mtimeMs:o.mtimeMs,sizeBytes:o.size})}}}}return t}async function d(e){let t=await i.promises.readFile(e,"utf8"),s=[];for(let e of t.split("\n")){let t=e.trim();if(t)try{s.push(JSON.parse(t))}catch{}}return s}function m(e){return e.replace(/\s+/g," ").trim().slice(0,200)}function g(e,t){let i,s,n,a,r,u,c,p=[],f={input:0,output:0,cacheRead:0,cacheWrite:0},d=0,g=0,h=[],w=0;for(let e of t){if("object"!=typeof e||null===e)continue;let t="string"==typeof e.timestamp?e.timestamp:void 0;if(t){i||(i=t),s=t;let e=Date.parse(t);Number.isFinite(e)&&h.push(e)}let o="string"==typeof e.type?e.type:"",v=e.payload??{},_="string"==typeof v.type?v.type:"";if("session_meta"===o){"string"==typeof v.cwd&&(n=v.cwd);continue}if("turn_context"===o){"string"==typeof v.cwd&&(n=v.cwd),"string"==typeof v.model&&(a=v.model);continue}if("event_msg"===o&&"token_count"===_){let e=v.info??null,t=e?.total_token_usage??null;t&&(f.input=y(t.input_tokens)??f.input,f.output=y(t.output_tokens)??f.output,f.cacheRead=y(t.cached_input_tokens)??f.cacheRead);continue}if("event_msg"===o&&"user_message"===_){let i="string"==typeof v.message?v.message:"",s=m(i),n=(0,l.isFrameworkInjectedUserInput)(i);i&&!n&&(r||(r=s),u=s,g+=1),p.push({index:w++,timestamp:t,role:"user",rawType:"event_msg/user_message",preview:s,blocks:i?[{type:"text",text:i}]:[],raw:e});continue}if("event_msg"===o&&"agent_message"===_){let i="string"==typeof v.message?v.message:"",s=m(i);i&&(c=s),p.push({index:w++,timestamp:t,role:"agent",rawType:"event_msg/agent_message",preview:s,blocks:i?[{type:"text",text:i}]:[],model:a,raw:e});continue}if("response_item"===o&&"reasoning"===_){let i=(v.summary??[]).map(e=>"string"==typeof e.text?e.text:"").join("\n").trim();p.push({index:w++,timestamp:t,role:"agent-thinking",rawType:"response_item/reasoning",preview:m(i),blocks:i?[{type:"thinking",thinking:i}]:[],model:a,raw:e});continue}if("response_item"===o&&"message"===_&&"assistant"===v.role){let i=(v.content??[]).map(e=>"string"==typeof e.text?e.text:"").join("\n").trim(),s=m(i);i&&(c=s),p.push({index:w++,timestamp:t,role:"agent",rawType:"response_item/message",preview:s,blocks:i?[{type:"text",text:i}]:[],model:a,raw:e});continue}if("response_item"===o&&"function_call"===_){var M;let i="string"==typeof v.name?v.name:"(unknown)",s="string"==typeof v.call_id?v.call_id:void 0,n="string"==typeof v.arguments?v.arguments:"",r=function(e){if(!e)return null;try{return JSON.parse(e)}catch{return e}}(n);d+=1,p.push({index:w++,timestamp:t,role:"tool-call",rawType:"response_item/function_call",preview:`${i}(${(M=n).length<=80?M:M.slice(0,79)+"…"})`,blocks:[{type:"tool_use",id:s??`codex-${w}`,name:i,input:r}],toolName:i,toolUseId:s,model:a,raw:e});continue}if("response_item"===o&&"function_call_output"===_){let i="string"==typeof v.call_id?v.call_id:void 0,s="string"==typeof v.output?v.output:"",n=/process exited with code [1-9]/i.test(s);p.push({index:w++,timestamp:t,role:"tool-result",rawType:"response_item/function_call_output",preview:m(s),blocks:[{type:"tool_result",tool_use_id:i??"",content:s,is_error:n}],toolUseId:i,toolResult:s,raw:e});continue}p.push({index:w++,timestamp:t,role:"meta",rawType:_?`${o}/${_}`:o,preview:"",blocks:[],raw:e})}if(f.input>0||f.output>0){let t=-1;for(let e=p.length-1;e>=0;e--){let i=p[e].role;if("agent"===i||"agent-thinking"===i||"tool-call"===i){t=e;break}}if(t>=0){let i=p[t];i.messageId=`codex-${e.sessionId}-total`,i.usage={input:f.input,output:f.output,cacheRead:f.cacheRead,cacheWrite:0}}}let v=i?Date.parse(i):void 0;if(void 0!==v&&Number.isFinite(v)){let e;for(let t of p){if(!t.timestamp)continue;let i=Date.parse(t.timestamp);Number.isFinite(i)&&(t.tOffsetMs=Math.max(0,i-v),void 0!==e&&(t.gapMs=Math.max(0,i-e)),e=i)}}let _=function(e){if(0===e.length)return[];let t=[...e].sort((e,t)=>e-t),i=[],s=t[0],n=t[0];for(let e=1;e<t.length;e++)t[e]-n>18e4&&(i.push({startMs:s,endMs:n}),s=t[e]),n=t[e];return i.push({startMs:s,endMs:n}),i}(h),k=_.reduce((e,t)=>e+(t.endMs-t.startMs),0),j=i&&s?Date.parse(s)-Date.parse(i):void 0,b=n?(0,o.canonicalProjectName)(n):"(unknown)",I=n?n.replace(/^\//,"-").replace(/\//g,"-"):"(unknown)";return{meta:{agent:"codex",id:e.sessionId,filePath:e.filePath,projectName:b,projectDir:I,sessionId:e.sessionId,firstTimestamp:i,lastTimestamp:s,durationMs:j&&Number.isFinite(j)?j:void 0,eventCount:p.length,model:a,cwd:n,totalUsage:f,status:"idle",firstUserPreview:r,lastUserPreview:u,lastAgentPreview:c,toolCallCount:d,turnCount:g,airTimeMs:k,activeSegments:_},events:p}}function y(e){return"number"==typeof e&&Number.isFinite(e)?e:void 0}let h=new Map,w=new Map;async function M(e={}){let t=e.root??u,i=await f(t),s=[];for(let e of i){let t=h.get(e.filePath);if(t&&t.mtimeMs===e.mtimeMs&&t.sizeBytes===e.sizeBytes){s.push(t.meta);continue}try{let t=await d(e.filePath),{meta:i}=g(e,t);h.set(e.filePath,{meta:i,mtimeMs:e.mtimeMs,sizeBytes:e.sizeBytes}),s.push(i)}catch{}}return(s.sort((e,t)=>(t.firstTimestamp??"").localeCompare(e.firstTimestamp??"")),void 0!==e.limit)?s.slice(0,e.limit):s}async function v(e,t={}){let i=t.root??u,s=(await f(i)).find(t=>t.sessionId===e);if(!s)return null;let n=w.get(s.filePath);if(n&&n.mtimeMs===s.mtimeMs&&n.sizeBytes===s.sizeBytes)return n.detail;let a=await d(s.filePath),{meta:r,events:o}=g(s,a),l={...r,events:o};return w.set(s.filePath,{detail:l,mtimeMs:s.mtimeMs,sizeBytes:s.sizeBytes}),l}async function _(e={}){let t=e.root??u,i=await f(t);if(0===i.length)return null;for(let e of(i.sort((e,t)=>t.mtimeMs-e.mtimeMs),i)){let t=await d(e.filePath);for(let i=t.length-1;i>=0;i--){let s=t[i];if("object"!=typeof s||null===s||"event_msg"!==s.type)continue;let n=s.payload??{};if("token_count"!==n.type)continue;let a=n.rate_limits??null;if(!a)continue;let r=a.primary??null,o=a.secondary??null,l=y(r?.used_percent),u=y(o?.used_percent),c=y(r?.resets_at),p=y(o?.resets_at),f="string"==typeof a.plan_type?a.plan_type:null;return{five_hour:{utilization:l??null,resets_at:void 0!==c?new Date(1e3*c).toISOString():null},seven_day:{utilization:u??null,resets_at:void 0!==p?new Date(1e3*p).toISOString():null},plan_type:f,source_path:e.filePath}}}return null}let k=n.default.join(s.default.homedir(),".gemini","tmp"),j=n.default.join(s.default.homedir(),".gemini","projects.json"),b=/^session-.+\.(jsonl|json)$/;async function I(e){return i.promises.readdir(e).catch(()=>[])}async function N(e){let t=[];for(let s of(await I(e))){let a=n.default.join(e,s,"chats");for(let e of(await I(a))){if(!b.test(e))continue;let r=n.default.join(a,e),o=await i.promises.stat(r).catch(()=>null);if(!o||!o.isFile())continue;let l=e.replace(/\.(jsonl|json)$/,"").split("-").pop()??e;t.push({filePath:r,slug:s,filenameId:l,format:e.endsWith(".jsonl")?"jsonl":"legacy-json",mtimeMs:o.mtimeMs,sizeBytes:o.size})}}return t}let x=null;async function S(){let e,t=await i.promises.stat(j).catch(()=>null);if(!t)return new Map;if(x&&x.mtimeMs===t.mtimeMs)return x.slugToCwd;let s=await i.promises.readFile(j,"utf8").catch(()=>"");try{e=JSON.parse(s)}catch{e={}}let n=new Map;for(let[t,i]of Object.entries(e.projects??{}))"string"==typeof i&&n.set(i,t);return x={mtimeMs:t.mtimeMs,slugToCwd:n},n}function T(e){return!!e&&"object"==typeof e&&"string"==typeof e.id&&"string"==typeof e.type}async function A(e){let t=await i.promises.readFile(e.filePath,"utf8");if("legacy-json"===e.format){let e;try{e=JSON.parse(t)}catch{return{meta:{},messages:[]}}return{meta:{sessionId:"string"==typeof e.sessionId?e.sessionId:void 0,projectHash:"string"==typeof e.projectHash?e.projectHash:void 0,startTime:"string"==typeof e.startTime?e.startTime:void 0,lastUpdated:"string"==typeof e.lastUpdated?e.lastUpdated:void 0,summary:"string"==typeof e.summary?e.summary:void 0},messages:(Array.isArray(e.messages)?e.messages:[]).filter(T)}}let s={},n=new Map,a=[];for(let e of t.split("\n")){let t,i=e.trim();if(i){var r,o;try{t=JSON.parse(i)}catch{continue}if((r=t)&&"object"==typeof r&&"$rewindTo"in r){let e=t.$rewindTo,i=a.indexOf(e);if(i>=0){for(let e of a.slice(i))n.delete(e);a.length=i}continue}if((o=t)&&"object"==typeof o&&"$set"in o){Object.assign(s,t.$set);continue}if(T(t)){n.has(t.id)||a.push(t.id),n.set(t.id,t);continue}if("object"==typeof t&&null!==t){let e=t;"string"!=typeof e.sessionId||s.sessionId||(s.sessionId=e.sessionId,"string"==typeof e.projectHash&&(s.projectHash=e.projectHash),"string"==typeof e.startTime&&(s.startTime=e.startTime),"string"==typeof e.lastUpdated&&(s.lastUpdated=e.lastUpdated),"string"==typeof e.summary&&(s.summary=e.summary))}}}let l=[];for(let e of a){let t=n.get(e);t&&l.push(t)}return{meta:s,messages:l}}function C(e){return e.replace(/\s+/g," ").trim().slice(0,200)}function P(e){if(!e)return"";if("string"==typeof e)return e;let t=Array.isArray(e)?e:[e],i=[];for(let e of t){if(!e||"object"!=typeof e)continue;if("string"==typeof e.text){i.push(e.text);continue}let t=e.functionResponse;if(t){let e=t.response;"string"==typeof e?i.push(e):e&&"object"==typeof e&&("string"==typeof e.output?i.push(e.output):"string"==typeof e.error?i.push(`error: ${e.error}`):i.push(JSON.stringify(e)))}}return i.join("\n")}async function D(e){let t,i,s,n,a,r,{meta:u,messages:c}=await A(e),p=(await S()).get(e.slug),f=[],d={input:0,output:0,cacheRead:0,cacheWrite:0},m=0,g=0,y=[],h=0;function w(e){if(f.push(e),e.timestamp&&"meta"!==e.role){t||(t=e.timestamp),i=e.timestamp;let s=Date.parse(e.timestamp);Number.isFinite(s)&&y.push(s)}}for(let e of c){let t=e.timestamp;if("user"===e.type){let i=P(e.displayContent??e.content),s=C(i),r=(0,l.isFrameworkInjectedUserInput)(i);i&&!r&&(n||(n=s),a=s,g+=1),w({index:h++,timestamp:t,role:"user",rawType:"gemini/user",preview:s,blocks:i?[{type:"text",text:i}]:[],messageId:e.id,raw:e});continue}if("gemini"===e.type){let i;"string"==typeof e.model&&(s=e.model);let n=P(e.content),a=C(n);if(n&&(r=a),e.tokens){let t=e.tokens,s={input:t.input??0,output:t.output??0,cacheRead:t.cached??0,cacheWrite:0};i=s,d.input+=s.input,d.output+=s.output,d.cacheRead+=s.cacheRead}for(let i of e.thoughts??[]){let e=[i.subject,i.description].filter(Boolean).join(": ");e&&w({index:h++,timestamp:i.timestamp??t,role:"agent-thinking",rawType:"gemini/thought",preview:C(e),blocks:[{type:"thinking",thinking:e}],model:s,raw:i})}for(let r of(n?w({index:h++,timestamp:t,role:"agent",rawType:"gemini/agent",preview:a,blocks:[{type:"text",text:n}],messageId:e.id,model:s,usage:i,raw:e}):i&&w({index:h++,timestamp:t,role:"agent",rawType:"gemini/agent",preview:"",blocks:[],messageId:e.id,model:s,usage:i,raw:e}),e.toolCalls??[])){m+=1;let e=r.args?JSON.stringify(r.args):"";w({index:h++,timestamp:r.timestamp??t,role:"tool-call",rawType:"gemini/tool_call",preview:`${r.name}(${e.length<=80?e:e.slice(0,79)+"…"})`,blocks:[{type:"tool_use",id:r.id,name:r.name,input:r.args??{}}],toolName:r.name,toolUseId:r.id,model:s,raw:r});let i=(r.status??"").toLowerCase();if("success"===i||"error"===i||"cancelled"===i){let e=P(r.result);w({index:h++,timestamp:r.timestamp??t,role:"tool-result",rawType:"gemini/tool_result",preview:C(e),blocks:[{type:"tool_result",tool_use_id:r.id,content:e,is_error:"error"===i||"cancelled"===i}],toolUseId:r.id,toolResult:e,raw:r})}}continue}if("info"===e.type||"warning"===e.type||"error"===e.type){let i=P(e.content);w({index:h++,timestamp:t,role:"meta",rawType:`gemini/${e.type}`,preview:C(i),blocks:i?[{type:"text",text:i}]:[],raw:e});continue}}let M=t?Date.parse(t):void 0;if(void 0!==M&&Number.isFinite(M)){let e;for(let t of f){if(!t.timestamp)continue;let i=Date.parse(t.timestamp);Number.isFinite(i)&&(t.tOffsetMs=Math.max(0,i-M),void 0!==e&&(t.gapMs=Math.max(0,i-e)),e=i)}}let v=function(e){if(0===e.length)return[];let t=[...e].sort((e,t)=>e-t),i=[],s=t[0],n=t[0];for(let e=1;e<t.length;e++)t[e]-n>18e4&&(i.push({startMs:s,endMs:n}),s=t[e]),n=t[e];return i.push({startMs:s,endMs:n}),i}(y),_=v.reduce((e,t)=>e+(t.endMs-t.startMs),0),k=t&&i?Date.parse(i)-Date.parse(t):void 0,j=u.sessionId??e.filenameId,b=p?(0,o.canonicalProjectName)(p):e.slug,I=p?p.replace(/^\//,"-").replace(/\//g,"-"):e.slug;return{meta:{agent:"gemini",id:j,filePath:e.filePath,projectName:b,projectDir:I,sessionId:j,firstTimestamp:t,lastTimestamp:i,durationMs:k&&Number.isFinite(k)?k:void 0,eventCount:f.length,model:s,cwd:p,totalUsage:d,status:"idle",firstUserPreview:n,lastUserPreview:a,lastAgentPreview:r,toolCallCount:m,turnCount:g,airTimeMs:_,activeSegments:v},events:f}}let $=new Map,O=new Map;async function z(e={}){let t=e.root??k,i=await N(t),s=[];for(let e of i){let t=$.get(e.filePath);if(t&&t.mtimeMs===e.mtimeMs&&t.sizeBytes===e.sizeBytes){s.push(t.meta);continue}try{let{meta:t}=await D(e);$.set(e.filePath,{meta:t,mtimeMs:e.mtimeMs,sizeBytes:e.sizeBytes}),s.push(t)}catch{}}return(s.sort((e,t)=>(t.firstTimestamp??"").localeCompare(e.firstTimestamp??"")),void 0!==e.limit)?s.slice(0,e.limit):s}async function R(e,t={}){let i,s=t.root??k,n=await N(s);for(let t of n)if(t.filenameId===e||e.startsWith(t.filenameId)){i=t;break}if(!i)for(let t of n){let{meta:s}=await D(t).catch(()=>({meta:{id:""}}));if(s.id===e){i=t;break}}if(!i)return null;let a=O.get(i.filePath);if(a&&a.mtimeMs===i.mtimeMs&&a.sizeBytes===i.sizeBytes)return a.detail;let{meta:r,events:o}=await D(i),l={...r,events:o};return O.set(i.filePath,{detail:l,mtimeMs:i.mtimeMs,sizeBytes:i.sizeBytes}),l}let B=n.default.join(s.default.homedir(),".gemini","antigravity-cli");async function E(e){return i.promises.readdir(e).catch(()=>[])}let F=null;async function U(e){let t=n.default.join(e,"history.jsonl"),s=await i.promises.stat(t).catch(()=>null);if(!s)return new Map;if(F&&F.mtimeMs===s.mtimeMs)return F.slugToCwd;let a=await i.promises.readFile(t,"utf8").catch(()=>""),r=new Map;for(let e of a.split("\n")){let t=e.trim();if(t)try{let e=JSON.parse(t);e.conversationId&&e.workspace&&r.set(e.conversationId,e.workspace)}catch{}}return F={mtimeMs:s.mtimeMs,slugToCwd:r},r}async function W(e){let t=await U(e),s=[],a=n.default.join(e,"brain");for(let e of(await E(a))){let r=n.default.join(a,e,".system_generated","logs","transcript.jsonl"),o=await i.promises.stat(r).catch(()=>null);o&&o.isFile()&&s.push({filePath:r,conversationId:e,cwd:t.get(e),mtimeMs:o.mtimeMs,sizeBytes:o.size})}return s}function J(e){return e.replace(/\s+/g," ").trim().slice(0,200)}async function L(e){let t,s,n,a,r,u,c=await i.promises.readFile(e.filePath,"utf8"),p=[],f=0,d=0,m=[],g=0;function y(e){if(p.push(e),e.timestamp&&"meta"!==e.role){t||(t=e.timestamp),s=e.timestamp;let i=Date.parse(e.timestamp);Number.isFinite(i)&&m.push(i)}}let h=[],w=[],M=new Map;for(let e of c.split("\n")){let t=e.trim();if(t)try{let e=JSON.parse(t),i=e.step_index;"number"==typeof i?M.has(i)?w[M.get(i)]=e:(M.set(i,w.length),w.push(e)):w.push(e)}catch{}}for(let e of w){let t=e.created_at||e.timestamp;if("USER_INPUT"===e.type){if("string"==typeof e.content){let t=e.content.match(/Model Selection` from .*? to (.*?)\.\s*No need to/);if(t){let e=t[1].trim();n=e=e.replace(/\s*\(.*?\)\s*$/,"").trim()}else{let t=e.content.match(/Model Selection` from .*? to ([^\n]+)/);if(t){let e=t[1].trim();e.endsWith(".")&&(e=e.slice(0,-1).trim()),n=e=e.replace(/\s*\(.*?\)\s*$/,"").trim()}}}let i=e.content||"",s=i.match(/<USER_REQUEST>([\s\S]*?)<\/USER_REQUEST>/);s&&(i=s[1].trim());let o=J(i),u=(0,l.isFrameworkInjectedUserInput)(i);i&&!u&&(a||(a=o),r=o,d+=1),y({index:g++,timestamp:t,role:"user",rawType:"antigravity/user",preview:o,blocks:i?[{type:"text",text:i}]:[],messageId:e.step_index?.toString(),raw:e});continue}if("PLANNER_RESPONSE"===e.type){let i=e.thinking,s=e.content;if(i&&y({index:g++,timestamp:t,role:"agent-thinking",rawType:"antigravity/thought",preview:J(i),blocks:[{type:"thinking",thinking:i}],model:n,raw:e}),s){let i=J(s);u=i,y({index:g++,timestamp:t,role:"agent",rawType:"antigravity/agent",preview:i,blocks:[{type:"text",text:s}],messageId:e.step_index?.toString(),model:n,raw:e})}let a=e.tool_calls||[];for(let i=0;i<a.length;i++){let s=a[i];f+=1;let r=`tool-${e.step_index}-${i}`,o=s.args?JSON.stringify(s.args):"";h.push({id:r,name:s.name}),y({index:g++,timestamp:t,role:"tool-call",rawType:"antigravity/tool_call",preview:`${s.name}(${o.length<=80?o:o.slice(0,79)+"…"})`,blocks:[{type:"tool_use",id:r,name:s.name,input:s.args||{}}],toolName:s.name,toolUseId:r,model:n,raw:s})}continue}if("MODEL"===e.source&&"PLANNER_RESPONSE"!==e.type&&"ERROR_MESSAGE"!==e.type&&h.length>0){let i=h.shift(),s=i?i.id:`tool-${e.step_index}-unknown`,n="string"==typeof e.content?e.content:JSON.stringify(e.content||""),a="ERROR"===e.status||"FAILED"===e.status||"CANCELED"===e.status||!!e.error;y({index:g++,timestamp:t,role:"tool-result",rawType:"antigravity/tool_result",preview:J(n),blocks:[{type:"tool_result",tool_use_id:s,content:n,is_error:a}],toolUseId:s,toolResult:n,raw:e});continue}let i=e.content||e.error||"";y({index:g++,timestamp:t,role:"meta",rawType:`antigravity/${e.type?.toLowerCase()||"unknown"}`,preview:J(i),blocks:i?[{type:"text",text:i}]:[],raw:e})}let v=t?Date.parse(t):void 0;if(void 0!==v&&Number.isFinite(v)){let e;for(let t of p){if(!t.timestamp)continue;let i=Date.parse(t.timestamp);Number.isFinite(i)&&(t.tOffsetMs=Math.max(0,i-v),void 0!==e&&(t.gapMs=Math.max(0,i-e)),e=i)}}let _=function(e){if(0===e.length)return[];let t=[...e].sort((e,t)=>e-t),i=[],s=t[0],n=t[0];for(let e=1;e<t.length;e++)t[e]-n>18e4&&(i.push({startMs:s,endMs:n}),s=t[e]),n=t[e];return i.push({startMs:s,endMs:n}),i}(m),k=_.reduce((e,t)=>e+(t.endMs-t.startMs),0),j=t&&s?Date.parse(s)-Date.parse(t):void 0,b=e.conversationId,I=e.cwd,N=I?(0,o.canonicalProjectName)(I):e.conversationId,x=I?I.replace(/^\//,"-").replace(/\//g,"-"):e.conversationId;return{meta:{agent:"antigravity",id:b,filePath:e.filePath,projectName:N,projectDir:x,sessionId:b,firstTimestamp:t,lastTimestamp:s,durationMs:j&&Number.isFinite(j)?j:void 0,eventCount:p.length,model:n,cwd:I,totalUsage:{input:0,output:0,cacheRead:0,cacheWrite:0},status:"idle",firstUserPreview:a,lastUserPreview:r,lastAgentPreview:u,toolCallCount:f,turnCount:d,airTimeMs:k,activeSegments:_},events:p}}let q=new Map,G=new Map;async function H(e={}){let t=e.root??B,i=await W(t),s=[];for(let e of i){let t=q.get(e.filePath);if(t&&t.mtimeMs===e.mtimeMs&&t.sizeBytes===e.sizeBytes&&t.cwd===e.cwd){s.push(t.meta);continue}try{let{meta:t}=await L(e);q.set(e.filePath,{meta:t,mtimeMs:e.mtimeMs,sizeBytes:e.sizeBytes,cwd:e.cwd}),s.push(t)}catch{}}return(s.sort((e,t)=>(t.firstTimestamp??"").localeCompare(e.firstTimestamp??"")),void 0!==e.limit)?s.slice(0,e.limit):s}async function Y(e,t={}){let i,s=t.root??B;for(let t of(await W(s)))if(t.conversationId===e){i=t;break}if(!i)return null;let n=G.get(i.filePath);if(n&&n.mtimeMs===i.mtimeMs&&n.sizeBytes===i.sizeBytes&&n.cwd===i.cwd)return n.detail;let{meta:a,events:r}=await L(i),o={...a,events:r};return G.set(i.filePath,{detail:o,mtimeMs:i.mtimeMs,sizeBytes:i.sizeBytes,cwd:i.cwd}),o}var K=e.i(34235);let Q=(t=s.default.homedir(),n.default.join(t,".config","Claude","local-agent-mode-sessions")),V=/^local_[0-9a-f-]+$/;async function X(e){return i.promises.readdir(e).catch(()=>[])}async function Z(e){let t=await i.promises.stat(e).catch(()=>null);return t?t.mtimeMs:0}async function ee(e){let t=[];for(let s of(await X(e))){let a=n.default.join(e,s);for(let e of(await X(a))){let s=n.default.join(a,e),r=await Z(n.default.join(s,"spaces.json"));for(let e of(await X(s))){if(!V.test(e))continue;let a=n.default.join(s,e,"audit.jsonl"),o=await i.promises.stat(a).catch(()=>null);if(!o||!o.isFile()||0===o.size)continue;let l=n.default.join(s,`${e}.json`),u=await Z(l);t.push({sessionId:e,auditPath:a,metaPath:l,workspaceDir:s,auditMtimeMs:o.mtimeMs,auditSize:o.size,metaMtimeMs:u,spacesMtimeMs:r})}}}return t}let et=new Map;async function ei(e){let t=n.default.join(e,"spaces.json"),s=await i.promises.stat(t).catch(()=>null);if(!s)return new Map;let a=et.get(e);if(a&&a.mtimeMs===s.mtimeMs)return a.spaceIdToPath;let r=await i.promises.readFile(t,"utf8").catch(()=>""),o=new Map;try{for(let e of JSON.parse(r).spaces??[]){let t="string"==typeof e.id?e.id:void 0,i=(Array.isArray(e.folders)?e.folders:[])[0],s="string"==typeof i?.path?i.path:void 0;t&&s&&o.set(t,s)}}catch{}return et.set(e,{mtimeMs:s.mtimeMs,spaceIdToPath:o}),o}async function es(e){let t=await i.promises.readFile(e,"utf8").catch(()=>"");if(!t)return{};try{let e=JSON.parse(t);return{spaceId:"string"==typeof e.spaceId?e.spaceId:void 0,userSelectedFolders:Array.isArray(e.userSelectedFolders)?e.userSelectedFolders.filter(e=>"string"==typeof e):void 0,cwd:"string"==typeof e.cwd?e.cwd:void 0,model:"string"==typeof e.model?e.model:void 0,title:"string"==typeof e.title?e.title:void 0,createdAt:"number"==typeof e.createdAt?e.createdAt:void 0,lastActivityAt:"number"==typeof e.lastActivityAt?e.lastActivityAt:void 0}}catch{return{}}}async function en(e){let t=await i.promises.readFile(e,"utf8"),s=[];for(let e of t.split("\n")){let t=e.trim();if(t)try{s.push(JSON.parse(t))}catch{}}return s}async function ea(e){let t,[i,s,n]=await Promise.all([en(e.auditPath),es(e.metaPath),ei(e.workspaceDir)]),{meta:a,events:r}=(0,K.parseTranscript)(i),{projectName:l,projectDir:u,cwd:c}=(s.spaceId&&(t=n.get(s.spaceId)),!t&&s.userSelectedFolders&&s.userSelectedFolders.length>0&&(t=s.userSelectedFolders[0]),t)?{projectName:(0,o.canonicalProjectName)(t),projectDir:t.replace(/^\//,"-").replace(/\//g,"-"),cwd:t}:{projectName:"cowork:unspaced",projectDir:"cowork-unspaced"};return{meta:{...a,agent:"cowork",id:e.sessionId,sessionId:e.sessionId,filePath:e.auditPath,projectName:l,projectDir:u,cwd:c??a.cwd,model:a.model??s.model},events:r}}function er(e){return{auditMtimeMs:e.auditMtimeMs,auditSize:e.auditSize,metaMtimeMs:e.metaMtimeMs,spacesMtimeMs:e.spacesMtimeMs}}function eo(e,t){return e.auditMtimeMs===t.auditMtimeMs&&e.auditSize===t.auditSize&&e.metaMtimeMs===t.metaMtimeMs&&e.spacesMtimeMs===t.spacesMtimeMs}let el=new Map,eu=new Map;async function ec(e={}){let t=e.root??Q,i=await ee(t),s=[];for(let e of i){let t=er(e),i=el.get(e.auditPath);if(i&&eo(i.key,t)){s.push(i.meta);continue}try{let{meta:i}=await ea(e);el.set(e.auditPath,{meta:i,key:t}),s.push(i)}catch{}}return(s.sort((e,t)=>(t.firstTimestamp??"").localeCompare(e.firstTimestamp??"")),void 0!==e.limit)?s.slice(0,e.limit):s}async function ep(e,t={}){let i=t.root??Q,s=(await ee(i)).find(t=>t.sessionId===e);if(!s)return null;let n=er(s),a=eu.get(s.auditPath);if(a&&eo(a.key,n))return a.detail;let{meta:r,events:o}=await ea(s),l={...r,events:o};return eu.set(s.auditPath,{detail:l,key:n}),l}function ef(){return process.env.CCLENS_HOME||n.default.join(s.default.homedir(),".cclens")}function ed(...e){return n.default.join(ef(),...e)}function em(e){(0,r.invalidateClaudeCodeFile)(e)}let eg={...a.CODEX_METADATA,defaultRoot:u,listSessions:async e=>M(e),getSession:async e=>v(e),async usagePoller(){let e=await _();return e?{captured_at:new Date().toISOString(),agent:"codex",five_hour:e.five_hour,seven_day:e.seven_day}:null}},ey={...a.GEMINI_METADATA,defaultRoot:k,listSessions:async e=>z(e),getSession:async e=>R(e)},eh={...a.ANTIGRAVITY_METADATA,defaultRoot:B,listSessions:async e=>H(e),getSession:async e=>Y(e)},ew={...a.COWORK_METADATA,defaultRoot:Q,listSessions:async e=>ec(e),getSession:async e=>ep(e)},eM=[r.claudeCodeSource,eg,ey,eh,ew];async function ev(e){for(let t of eM){let i=await t.getSession(e);if(i)return i}return null}}];
2
-
3
- //# sourceMappingURL=packages_parser_dist_04rh1zd._.js.map