fleetlens 0.11.0 → 0.11.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 (156) hide show
  1. package/app/apps/web/.next/BUILD_ID +1 -1
  2. package/app/apps/web/.next/app-path-routes-manifest.json +2 -0
  3. package/app/apps/web/.next/build-manifest.json +5 -5
  4. package/app/apps/web/.next/prerender-manifest.json +3 -3
  5. package/app/apps/web/.next/routes-manifest.json +12 -0
  6. package/app/apps/web/.next/server/app/_global-error/page/build-manifest.json +2 -2
  7. package/app/apps/web/.next/server/app/_global-error.html +1 -1
  8. package/app/apps/web/.next/server/app/_global-error.rsc +1 -1
  9. package/app/apps/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  10. package/app/apps/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  11. package/app/apps/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  12. package/app/apps/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  13. package/app/apps/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  14. package/app/apps/web/.next/server/app/_not-found/page/build-manifest.json +2 -2
  15. package/app/apps/web/.next/server/app/_not-found/page.js +1 -1
  16. package/app/apps/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  17. package/app/apps/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  18. package/app/apps/web/.next/server/app/api/ask/route.js.nft.json +1 -1
  19. package/app/apps/web/.next/server/app/api/digest/day/[date]/route.js.nft.json +1 -1
  20. package/app/apps/web/.next/server/app/api/digest/month/[yearMonth]/route.js.nft.json +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.nft.json +1 -1
  23. package/app/apps/web/.next/server/app/api/digest/week-index/route.js.nft.json +1 -1
  24. package/app/apps/web/.next/server/app/api/runs/[runId]/route.js.nft.json +1 -1
  25. package/app/apps/web/.next/server/app/api/runs/[runId]/stream/route.js.nft.json +1 -1
  26. package/app/apps/web/.next/server/app/api/settings/route.js +3 -3
  27. package/app/apps/web/.next/server/app/api/settings/route.js.nft.json +1 -1
  28. package/app/apps/web/.next/server/app/api/team-config/route/app-paths-manifest.json +3 -0
  29. package/app/apps/web/.next/server/app/api/team-config/route/build-manifest.json +9 -0
  30. package/app/apps/web/.next/server/app/api/team-config/route/server-reference-manifest.json +4 -0
  31. package/app/apps/web/.next/server/app/api/team-config/route.js +8 -0
  32. package/app/apps/web/.next/server/app/api/team-config/route.js.map +5 -0
  33. package/app/apps/web/.next/server/app/api/team-config/route.js.nft.json +1 -0
  34. package/app/apps/web/.next/server/app/api/team-config/route_client-reference-manifest.js +3 -0
  35. package/app/apps/web/.next/server/app/changelog/page/build-manifest.json +2 -2
  36. package/app/apps/web/.next/server/app/changelog/page.js +1 -1
  37. package/app/apps/web/.next/server/app/changelog/page.js.nft.json +1 -1
  38. package/app/apps/web/.next/server/app/changelog/page_client-reference-manifest.js +1 -1
  39. package/app/apps/web/.next/server/app/day/[date]/page/build-manifest.json +2 -2
  40. package/app/apps/web/.next/server/app/day/[date]/page.js +1 -1
  41. package/app/apps/web/.next/server/app/day/[date]/page.js.nft.json +1 -1
  42. package/app/apps/web/.next/server/app/day/[date]/page_client-reference-manifest.js +1 -1
  43. package/app/apps/web/.next/server/app/day/page/build-manifest.json +2 -2
  44. package/app/apps/web/.next/server/app/day/page.js +1 -1
  45. package/app/apps/web/.next/server/app/day/page.js.nft.json +1 -1
  46. package/app/apps/web/.next/server/app/day/page_client-reference-manifest.js +1 -1
  47. package/app/apps/web/.next/server/app/digest/[date]/page/build-manifest.json +2 -2
  48. package/app/apps/web/.next/server/app/digest/[date]/page.js +1 -1
  49. package/app/apps/web/.next/server/app/digest/[date]/page.js.nft.json +1 -1
  50. package/app/apps/web/.next/server/app/digest/[date]/page_client-reference-manifest.js +1 -1
  51. package/app/apps/web/.next/server/app/digest/page/build-manifest.json +2 -2
  52. package/app/apps/web/.next/server/app/digest/page.js +1 -1
  53. package/app/apps/web/.next/server/app/digest/page.js.nft.json +1 -1
  54. package/app/apps/web/.next/server/app/digest/page_client-reference-manifest.js +1 -1
  55. package/app/apps/web/.next/server/app/insights/[key]/page/build-manifest.json +2 -2
  56. package/app/apps/web/.next/server/app/insights/[key]/page.js +1 -1
  57. package/app/apps/web/.next/server/app/insights/[key]/page.js.nft.json +1 -1
  58. package/app/apps/web/.next/server/app/insights/[key]/page_client-reference-manifest.js +1 -1
  59. package/app/apps/web/.next/server/app/insights/page/build-manifest.json +2 -2
  60. package/app/apps/web/.next/server/app/insights/page.js +1 -1
  61. package/app/apps/web/.next/server/app/insights/page.js.nft.json +1 -1
  62. package/app/apps/web/.next/server/app/insights/page_client-reference-manifest.js +1 -1
  63. package/app/apps/web/.next/server/app/page/build-manifest.json +2 -2
  64. package/app/apps/web/.next/server/app/page.js +2 -2
  65. package/app/apps/web/.next/server/app/page.js.nft.json +1 -1
  66. package/app/apps/web/.next/server/app/page_client-reference-manifest.js +1 -1
  67. package/app/apps/web/.next/server/app/parallelism/page/build-manifest.json +2 -2
  68. package/app/apps/web/.next/server/app/parallelism/page.js +1 -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/projects/[slug]/page/build-manifest.json +2 -2
  72. package/app/apps/web/.next/server/app/projects/[slug]/page.js +2 -2
  73. package/app/apps/web/.next/server/app/projects/[slug]/page.js.nft.json +1 -1
  74. package/app/apps/web/.next/server/app/projects/[slug]/page_client-reference-manifest.js +1 -1
  75. package/app/apps/web/.next/server/app/projects/page/build-manifest.json +2 -2
  76. package/app/apps/web/.next/server/app/projects/page.js +1 -1
  77. package/app/apps/web/.next/server/app/projects/page.js.nft.json +1 -1
  78. package/app/apps/web/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  79. package/app/apps/web/.next/server/app/runs/page/build-manifest.json +2 -2
  80. package/app/apps/web/.next/server/app/runs/page.js +1 -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/build-manifest.json +2 -2
  84. package/app/apps/web/.next/server/app/sessions/[id]/page.js +1 -1
  85. package/app/apps/web/.next/server/app/sessions/[id]/page.js.nft.json +1 -1
  86. package/app/apps/web/.next/server/app/sessions/[id]/page_client-reference-manifest.js +1 -1
  87. package/app/apps/web/.next/server/app/sessions/page/build-manifest.json +2 -2
  88. package/app/apps/web/.next/server/app/sessions/page.js +1 -1
  89. package/app/apps/web/.next/server/app/sessions/page.js.nft.json +1 -1
  90. package/app/apps/web/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  91. package/app/apps/web/.next/server/app/settings/page/build-manifest.json +2 -2
  92. package/app/apps/web/.next/server/app/settings/page.js +1 -1
  93. package/app/apps/web/.next/server/app/settings/page.js.nft.json +1 -1
  94. package/app/apps/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  95. package/app/apps/web/.next/server/app/team/page/app-paths-manifest.json +3 -0
  96. package/app/apps/web/.next/server/app/team/page/build-manifest.json +17 -0
  97. package/app/apps/web/.next/server/app/team/page/next-font-manifest.json +6 -0
  98. package/app/apps/web/.next/server/app/team/page/react-loadable-manifest.json +1 -0
  99. package/app/apps/web/.next/server/app/team/page/server-reference-manifest.json +4 -0
  100. package/app/apps/web/.next/server/app/team/page.js +17 -0
  101. package/app/apps/web/.next/server/app/team/page.js.map +5 -0
  102. package/app/apps/web/.next/server/app/team/page.js.nft.json +1 -0
  103. package/app/apps/web/.next/server/app/team/page_client-reference-manifest.js +3 -0
  104. package/app/apps/web/.next/server/app/usage/page/build-manifest.json +2 -2
  105. package/app/apps/web/.next/server/app/usage/page.js +1 -1
  106. package/app/apps/web/.next/server/app/usage/page.js.nft.json +1 -1
  107. package/app/apps/web/.next/server/app/usage/page_client-reference-manifest.js +1 -1
  108. package/app/apps/web/.next/server/app-paths-manifest.json +2 -0
  109. package/app/apps/web/.next/server/chunks/[root-of-the-server]__0atn.dt._.js +3 -0
  110. package/app/apps/web/.next/server/chunks/[root-of-the-server]__0b.b7~1._.js +3 -0
  111. package/app/apps/web/.next/server/chunks/_0euqdko._.js +49 -0
  112. package/app/apps/web/.next/server/chunks/apps_web__next-internal_server_app_api_team-config_route_actions_0ad2gak.js +3 -0
  113. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0_xpuh7._.js +3 -0
  114. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0exckd4._.js +3 -0
  115. package/app/apps/web/.next/server/chunks/ssr/{[root-of-the-server]__10~b4bf._.js → [root-of-the-server]__0o03ymy._.js} +2 -2
  116. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0q9qy0z._.js +3 -0
  117. package/app/apps/web/.next/server/chunks/ssr/{[root-of-the-server]__08l86e-._.js → [root-of-the-server]__0z7mg0b._.js} +2 -2
  118. package/app/apps/web/.next/server/chunks/ssr/_0xu2pvc._.js +1 -1
  119. package/app/apps/web/.next/server/chunks/ssr/apps_web__next-internal_server_app_team_page_actions_0i26.dg.js +3 -0
  120. package/app/apps/web/.next/server/chunks/ssr/apps_web_app_team_team-sync-form_tsx_0choz0h._.js +3 -0
  121. package/app/apps/web/.next/server/chunks/ssr/apps_web_components_0txtsv5._.js +1 -1
  122. package/app/apps/web/.next/server/chunks/ssr/apps_web_lib_0af94gl._.js +1 -1
  123. package/app/apps/web/.next/server/chunks/ssr/{node_modules_0yrkyef._.js → node_modules_next_dist_0t-hj0x._.js} +2 -2
  124. package/app/apps/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_09rx8oz.js +4 -0
  125. package/app/apps/web/.next/server/functions-config-manifest.json +1 -0
  126. package/app/apps/web/.next/server/middleware-build-manifest.js +5 -5
  127. package/app/apps/web/.next/server/pages/500.html +1 -1
  128. package/app/apps/web/.next/server/server-reference-manifest.js +1 -1
  129. package/app/apps/web/.next/server/server-reference-manifest.json +1 -1
  130. package/app/apps/web/.next/static/chunks/{0e-wrhqh4h3r5.js → 0gblp_v.kiu-..js} +1 -1
  131. package/app/apps/web/.next/static/chunks/0s4eyofh28l~u.js +1 -0
  132. package/app/apps/web/.next/static/chunks/0~e7pnd7ot84w.js +14 -0
  133. package/app/apps/web/.next/static/chunks/12jvvc_w.cb45.css +1 -0
  134. package/app/apps/web/.next/static/chunks/14joqbsr9ihhu.js +1 -0
  135. package/app/apps/web/.next/static/chunks/{turbopack-04ud5x25hbc_4.js → turbopack-0lb9w090w5ezx.js} +1 -1
  136. package/app/apps/web/app/api/team-config/route.ts +39 -0
  137. package/app/apps/web/app/team/page.tsx +191 -0
  138. package/app/apps/web/app/team/team-sync-form.tsx +144 -0
  139. package/app/apps/web/components/sidebar.tsx +8 -0
  140. package/app/apps/web/lib/changelog-data.generated.ts +1 -1
  141. package/app/apps/web/lib/team-config.ts +52 -0
  142. package/app/apps/web/package.json +1 -1
  143. package/app/apps/web/tsconfig.tsbuildinfo +1 -1
  144. package/dist/daemon-worker.js +436 -283
  145. package/dist/index.js +191 -26
  146. package/package.json +1 -1
  147. package/app/apps/web/.next/server/chunks/[externals]__0o43ejh._.js +0 -3
  148. package/app/apps/web/.next/server/chunks/node_modules_next_036my~r._.js +0 -49
  149. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0yv0m0q._.js +0 -3
  150. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__100.ck7._.js +0 -3
  151. package/app/apps/web/.next/static/chunks/0bjcz5~ugoonp.js +0 -14
  152. package/app/apps/web/.next/static/chunks/0o5m5g1dfx4ev.css +0 -1
  153. package/app/apps/web/.next/static/chunks/10wg31hnd6phg.js +0 -1
  154. /package/app/apps/web/.next/static/{WHoyEWNo3d5LkDnYSmiG4 → m6ibRSdAu8jD10VBA2OFH}/_buildManifest.js +0 -0
  155. /package/app/apps/web/.next/static/{WHoyEWNo3d5LkDnYSmiG4 → m6ibRSdAu8jD10VBA2OFH}/_clientMiddlewareManifest.js +0 -0
  156. /package/app/apps/web/.next/static/{WHoyEWNo3d5LkDnYSmiG4 → m6ibRSdAu8jD10VBA2OFH}/_ssgManifest.js +0 -0
package/dist/index.js CHANGED
@@ -3022,12 +3022,22 @@ var init_team_config = __esm({
3022
3022
  }
3023
3023
  });
3024
3024
 
3025
+ // ../parser/dist/team-wire.js
3026
+ var RICH_ROLLUP_SCHEMA_VERSION;
3027
+ var init_team_wire = __esm({
3028
+ "../parser/dist/team-wire.js"() {
3029
+ "use strict";
3030
+ RICH_ROLLUP_SCHEMA_VERSION = 2;
3031
+ }
3032
+ });
3033
+
3025
3034
  // ../parser/dist/fs.js
3026
3035
  var fs_exports = {};
3027
3036
  __export(fs_exports, {
3028
3037
  DEFAULT_CODEX_ROOT: () => DEFAULT_CODEX_ROOT,
3029
3038
  DEFAULT_GEMINI_ROOT: () => DEFAULT_GEMINI_ROOT,
3030
3039
  DEFAULT_ROOT: () => DEFAULT_ROOT,
3040
+ RICH_ROLLUP_SCHEMA_VERSION: () => RICH_ROLLUP_SCHEMA_VERSION,
3031
3041
  agentSources: () => agentSources,
3032
3042
  buildCalibrationCurve: () => buildCalibrationCurve,
3033
3043
  cacheStats: () => cacheStats,
@@ -3327,6 +3337,7 @@ var init_fs = __esm({
3327
3337
  init_codex();
3328
3338
  init_gemini();
3329
3339
  init_team_config();
3340
+ init_team_wire();
3330
3341
  codexSource = {
3331
3342
  ...CODEX_METADATA,
3332
3343
  defaultRoot: DEFAULT_CODEX_ROOT,
@@ -3765,9 +3776,9 @@ Installed: ${PACKAGE_NAME}@${verify.installedVersion} at ${verify.installedPath
3765
3776
  console.warn(
3766
3777
  ` \u2022 reinstall in the correct Node env: 'npm install -g ${PACKAGE_NAME}@latest'`
3767
3778
  );
3768
- } else if (verify.installedVersion !== "0.11.0") {
3779
+ } else if (verify.installedVersion !== "0.11.2") {
3769
3780
  console.log(
3770
- ` \u2192 This process is still running ${"0.11.0"}. Next invocation will use ${verify.installedVersion}.`
3781
+ ` \u2192 This process is still running ${"0.11.2"}. Next invocation will use ${verify.installedVersion}.`
3771
3782
  );
3772
3783
  }
3773
3784
  }
@@ -3802,14 +3813,14 @@ async function getUpdateAvailability() {
3802
3813
  if (isDevMode()) return null;
3803
3814
  const latest = await fetchLatestVersion();
3804
3815
  if (latest === null) return {
3805
- current: "0.11.0",
3816
+ current: "0.11.2",
3806
3817
  latest: null,
3807
3818
  updateAvailable: false
3808
3819
  };
3809
3820
  return {
3810
- current: "0.11.0",
3821
+ current: "0.11.2",
3811
3822
  latest,
3812
- updateAvailable: shouldUpdate("0.11.0", latest)
3823
+ updateAvailable: shouldUpdate("0.11.2", latest)
3813
3824
  };
3814
3825
  }
3815
3826
  async function checkForUpdate() {
@@ -3899,7 +3910,7 @@ async function restartServices(state) {
3899
3910
  }
3900
3911
  async function forceUpdate() {
3901
3912
  const latest = await fetchLatestVersion();
3902
- const current = "0.11.0";
3913
+ const current = "0.11.2";
3903
3914
  if (latest === null) {
3904
3915
  console.error("Could not reach npm registry. Check your network.");
3905
3916
  process.exit(1);
@@ -3944,7 +3955,7 @@ __export(start_exports, {
3944
3955
  async function start(args2) {
3945
3956
  const portFlag = args2.indexOf("--port");
3946
3957
  const port = portFlag !== -1 ? parseInt(args2[portFlag + 1], 10) : void 0;
3947
- const noOpen = args2.includes("--no-open");
3958
+ const open = args2.includes("--open");
3948
3959
  const noDaemon = args2.includes("--no-daemon");
3949
3960
  try {
3950
3961
  await checkForUpdate();
@@ -3979,7 +3990,12 @@ async function start(args2) {
3979
3990
  console.warn(`Daemon: failed to start \u2014 ${daemon2.error}`);
3980
3991
  }
3981
3992
  }
3982
- if (!noOpen) openBrowser(serverUrl);
3993
+ if (open) {
3994
+ openBrowser(serverUrl);
3995
+ } else {
3996
+ console.log(`
3997
+ Open ${serverUrl} in your browser, or re-run with --open to launch it automatically.`);
3998
+ }
3983
3999
  }
3984
4000
  var init_start = __esm({
3985
4001
  "src/commands/start.ts"() {
@@ -4069,15 +4085,19 @@ __export(web_exports, {
4069
4085
  web: () => web
4070
4086
  });
4071
4087
  async function web(args2) {
4072
- const noOpen = args2.includes("--no-open");
4088
+ const open = args2.includes("--open");
4073
4089
  const positional = args2.filter((a) => !a.startsWith("--"));
4074
4090
  const rawPath = positional[0] ?? "";
4075
4091
  const path5 = rawPath.startsWith("/") ? rawPath : rawPath ? `/${rawPath}` : "";
4076
4092
  const status2 = getServerStatus();
4077
4093
  if (status2.running) {
4078
4094
  const url = `http://localhost:${status2.port}${path5}`;
4079
- console.log(noOpen ? `Server running at ${url}` : `Opening ${url}`);
4080
- if (!noOpen) openBrowser(url);
4095
+ if (open) {
4096
+ console.log(`Opening ${url}`);
4097
+ openBrowser(url);
4098
+ } else {
4099
+ console.log(`Dashboard ready at ${url} (re-run with --open to launch it automatically).`);
4100
+ }
4081
4101
  return;
4082
4102
  }
4083
4103
  console.log("fleetlens is not running. Starting server...");
@@ -4085,7 +4105,11 @@ async function web(args2) {
4085
4105
  const result = await startServer({});
4086
4106
  const url = `http://localhost:${result.port}${path5}`;
4087
4107
  console.log(`fleetlens running on ${url} (PID ${result.pid})`);
4088
- if (!noOpen) openBrowser(url);
4108
+ if (open) {
4109
+ openBrowser(url);
4110
+ } else {
4111
+ console.log(`Open ${url} in your browser, or re-run with --open to launch it automatically.`);
4112
+ }
4089
4113
  } catch (err) {
4090
4114
  console.error(`Failed to start: ${err.message}`);
4091
4115
  process.exit(1);
@@ -14706,14 +14730,142 @@ function buildRollupsForRange(sessions, sinceDay) {
14706
14730
  sessions: startCounts.get(b.date) ?? 0
14707
14731
  }));
14708
14732
  }
14709
- function buildIngestPayload(rollup, usageSnapshot, planTier, cyclePeaks) {
14733
+ function dayBoundsMs(day2) {
14734
+ const [y, m, d] = day2.split("-").map(Number);
14735
+ return {
14736
+ startMs: new Date(y, m - 1, d, 0, 0, 0, 0).getTime(),
14737
+ endMs: new Date(y, m - 1, d + 1, 0, 0, 0, 0).getTime()
14738
+ };
14739
+ }
14740
+ function clipSegmentsToDay(segments, bounds) {
14741
+ if (!segments || segments.length === 0) return [];
14742
+ const out = [];
14743
+ for (const seg of segments) {
14744
+ const s = Math.max(seg.startMs, bounds.startMs);
14745
+ const e = Math.min(seg.endMs, bounds.endMs);
14746
+ if (e > s) out.push({ startMs: s, endMs: e });
14747
+ }
14748
+ return out;
14749
+ }
14750
+ function sessionTouchesDay(s, day2) {
14751
+ const bounds = dayBoundsMs(day2);
14752
+ if (s.activeSegments && s.activeSegments.length > 0) {
14753
+ return s.activeSegments.some((seg) => seg.endMs > bounds.startMs && seg.startMs < bounds.endMs);
14754
+ }
14755
+ return sessionDay(s) === day2;
14756
+ }
14757
+ function buildRichRollupBlocks(day2, daySessions, entries2, privateProjects) {
14758
+ const bounds = dayBoundsMs(day2);
14759
+ const clippedSessions = [];
14760
+ for (const s of daySessions) {
14761
+ const clipped = clipSegmentsToDay(s.activeSegments, bounds);
14762
+ if (clipped.length === 0) continue;
14763
+ clippedSessions.push({ ...s, activeSegments: clipped });
14764
+ }
14765
+ const bursts = computeBurstsFromSessions(clippedSessions);
14766
+ const stats = summarizeBursts(bursts);
14767
+ const projects = /* @__PURE__ */ new Map();
14768
+ for (const s of clippedSessions) {
14769
+ const name = canonicalProjectName(s.projectName);
14770
+ if (privateProjects.has(name)) continue;
14771
+ const ms = s.activeSegments.reduce((sum, seg) => sum + (seg.endMs - seg.startMs), 0);
14772
+ const cur = projects.get(name) ?? { agentTimeMs: 0, sessions: 0 };
14773
+ cur.agentTimeMs += ms;
14774
+ cur.sessions += 1;
14775
+ projects.set(name, cur);
14776
+ }
14777
+ const workingShapes = /* @__PURE__ */ new Map();
14778
+ const skills = /* @__PURE__ */ new Map();
14779
+ const subagents = /* @__PURE__ */ new Map();
14780
+ let toolErrors = 0;
14781
+ let brainstorm = 0;
14782
+ let planMode = 0;
14783
+ let prs = 0;
14784
+ let commits = 0;
14785
+ let pushes = 0;
14786
+ let longCount = 0;
14787
+ let longTotalMin = 0;
14788
+ let longMaxSingleMin = 0;
14789
+ for (const e of entries2) {
14790
+ if (privateProjects.has(e.project)) continue;
14791
+ const shape = e.signals?.working_shape ?? null;
14792
+ if (shape) {
14793
+ const cur = workingShapes.get(shape) ?? { sessions: 0, agentTimeMs: 0 };
14794
+ cur.sessions += 1;
14795
+ cur.agentTimeMs += e.numbers.active_min * 6e4;
14796
+ workingShapes.set(shape, cur);
14797
+ }
14798
+ for (const [name, count] of Object.entries(e.skills)) {
14799
+ if (count > 0) skills.set(name, (skills.get(name) ?? 0) + 1);
14800
+ }
14801
+ for (const sa of e.subagents) {
14802
+ subagents.set(sa.type, (subagents.get(sa.type) ?? 0) + 1);
14803
+ }
14804
+ toolErrors += e.numbers.tool_errors;
14805
+ if (e.signals?.brainstorm_warmup) brainstorm += 1;
14806
+ if (e.numbers.exit_plan_calls > 0) planMode += 1;
14807
+ prs += e.numbers.prs;
14808
+ commits += e.numbers.commits;
14809
+ pushes += e.numbers.pushes;
14810
+ if (e.flags.includes("long_autonomous")) {
14811
+ longCount += 1;
14812
+ longTotalMin += e.numbers.active_min;
14813
+ if (e.numbers.active_min > longMaxSingleMin) longMaxSingleMin = e.numbers.active_min;
14814
+ }
14815
+ }
14816
+ return {
14817
+ projects: Array.from(projects.entries()).map(([project, v]) => ({ project, ...v })).sort((a, b) => b.agentTimeMs - a.agentTimeMs),
14818
+ workingShapes: Array.from(workingShapes.entries()).map(([shape, v]) => ({ shape, ...v })).sort((a, b) => b.sessions - a.sessions),
14819
+ concurrencyPeak: stats.peakConcurrent,
14820
+ parallelMinutes: Math.round(stats.totalParallelMs / 6e4),
14821
+ longAutonomous: { count: longCount, totalMin: longTotalMin, maxSingleMin: longMaxSingleMin },
14822
+ toolErrors,
14823
+ skillsLoaded: Array.from(skills.entries()).map(([name, sessions]) => ({ name, sessions })).sort((a, b) => b.sessions - a.sessions),
14824
+ subagentsDispatched: Array.from(subagents.entries()).map(([type, count]) => ({ type, count })).sort((a, b) => b.count - a.count),
14825
+ brainstormWarmupSessions: brainstorm,
14826
+ planModeUsed: planMode,
14827
+ prs,
14828
+ commits,
14829
+ pushes
14830
+ };
14831
+ }
14832
+ function buildEnrichedExtras(entries2) {
14833
+ const outcomeMix = {};
14834
+ const helpfulnessMix = {};
14835
+ const goalMix = {};
14836
+ for (const e of entries2) {
14837
+ if (e.enrichment.status !== "done") continue;
14838
+ if (e.enrichment.outcome) {
14839
+ outcomeMix[e.enrichment.outcome] = (outcomeMix[e.enrichment.outcome] ?? 0) + 1;
14840
+ }
14841
+ if (e.enrichment.claude_helpfulness) {
14842
+ helpfulnessMix[e.enrichment.claude_helpfulness] = (helpfulnessMix[e.enrichment.claude_helpfulness] ?? 0) + 1;
14843
+ }
14844
+ for (const [cat, mins] of Object.entries(e.enrichment.goal_categories)) {
14845
+ if (typeof mins === "number") goalMix[cat] = (goalMix[cat] ?? 0) + mins;
14846
+ }
14847
+ }
14848
+ return { outcomeMix, helpfulnessMix, goalMix };
14849
+ }
14850
+ function buildRichBlocksForDay(day2, daySessions, privateProjects, enrichmentOptIn) {
14851
+ const entries2 = listEntriesForDay(day2);
14852
+ if (entries2.length === 0) return void 0;
14853
+ const rich = buildRichRollupBlocks(day2, daySessions, entries2, privateProjects);
14854
+ const enriched = enrichmentOptIn ? buildEnrichedExtras(entries2) : void 0;
14855
+ return enriched ? { rich, enriched } : { rich };
14856
+ }
14857
+ function buildIngestPayload(inputs) {
14858
+ const richRollup = inputs.rollup && inputs.richExtras ? { ...inputs.rollup, ...inputs.richExtras } : void 0;
14710
14859
  return {
14711
14860
  ingestId: randomUUID2(),
14712
14861
  observedAt: (/* @__PURE__ */ new Date()).toISOString(),
14713
- ...rollup ? { dailyRollup: rollup } : {},
14714
- ...usageSnapshot ? { usageSnapshot } : {},
14715
- ...planTier ? { planTier } : {},
14716
- ...cyclePeaks ? { cyclePeaks } : {}
14862
+ ...richRollup || inputs.enrichedExtras ? { schemaVersion: RICH_ROLLUP_SCHEMA_VERSION } : {},
14863
+ ...inputs.rollup ? { dailyRollup: inputs.rollup } : {},
14864
+ ...richRollup ? { richRollup } : {},
14865
+ ...inputs.enrichedExtras ? { enrichedExtras: inputs.enrichedExtras } : {},
14866
+ ...inputs.usageSnapshot ? { usageSnapshot: inputs.usageSnapshot } : {},
14867
+ ...inputs.planTier ? { planTier: inputs.planTier } : {},
14868
+ ...inputs.cyclePeaks ? { cyclePeaks: inputs.cyclePeaks } : {}
14717
14869
  };
14718
14870
  }
14719
14871
  async function pushToTeamServer(config, payload) {
@@ -14734,6 +14886,8 @@ var init_push = __esm({
14734
14886
  "src/team/push.ts"() {
14735
14887
  "use strict";
14736
14888
  init_dist();
14889
+ init_fs();
14890
+ init_fs2();
14737
14891
  init_storage();
14738
14892
  SNAPSHOT_FRESHNESS_MS = 10 * 60 * 1e3;
14739
14893
  POST_TIMEOUT_MS = 15e3;
@@ -15103,7 +15257,7 @@ async function runActivityBackfill(command2, config, log) {
15103
15257
  }
15104
15258
  let pushed = 0;
15105
15259
  for (const rollup of rollups) {
15106
- const payload = buildIngestPayload(rollup);
15260
+ const payload = buildIngestPayload({ rollup });
15107
15261
  const result = await pushToTeamServer(config, payload);
15108
15262
  if (!result.ok) {
15109
15263
  return {
@@ -15202,7 +15356,7 @@ async function runTeamSync(log = noopLog2, configOverride, options = {}) {
15202
15356
  if (usageBackfill.sentSnapshots === 0) log("info", "team push: nothing to sync");
15203
15357
  return { paired: true, pushed: 0, queued: 0, queuedDrained: 0, usageBackfill };
15204
15358
  }
15205
- const payload = buildIngestPayload(void 0, usageSnapshot, planTier, cyclePeaks);
15359
+ const payload = buildIngestPayload({ usageSnapshot, planTier, cyclePeaks });
15206
15360
  const result = await pushToTeamServer(config, payload);
15207
15361
  if (!result.ok) {
15208
15362
  const errLine = `team push failed (${result.status})`;
@@ -15232,17 +15386,28 @@ async function runTeamSync(log = noopLog2, configOverride, options = {}) {
15232
15386
  let queued = 0;
15233
15387
  let failedDay;
15234
15388
  let lastPushedDay;
15389
+ const privateProjects = new Set(config.privateProjects ?? []);
15390
+ const enrichmentOptIn = !!config.enrichmentOptIn;
15235
15391
  for (let i = 0; i < rollups.length; i++) {
15236
15392
  const rollup = rollups[i];
15237
15393
  const isLatest = i === rollups.length - 1;
15238
- const payload = buildIngestPayload(
15394
+ const daySessions = sessions.filter((s) => sessionTouchesDay(s, rollup.day));
15395
+ const richBlocks = buildRichBlocksForDay(
15396
+ rollup.day,
15397
+ daySessions,
15398
+ privateProjects,
15399
+ enrichmentOptIn
15400
+ );
15401
+ const payload = buildIngestPayload({
15239
15402
  rollup,
15240
- isLatest ? usageSnapshot : void 0,
15403
+ richExtras: richBlocks?.rich,
15404
+ enrichedExtras: richBlocks?.enriched,
15405
+ usageSnapshot: isLatest ? usageSnapshot : void 0,
15241
15406
  planTier,
15242
15407
  // Same rationale as usageSnapshot — current cycle data only on the
15243
15408
  // latest rollup so older days don't get tagged with today's peaks.
15244
- isLatest ? cyclePeaks : void 0
15245
- );
15409
+ cyclePeaks: isLatest ? cyclePeaks : void 0
15410
+ });
15246
15411
  const result = await pushToTeamServer(config, payload);
15247
15412
  if (!result.ok) {
15248
15413
  const errLine = `team push failed on ${rollup.day} (${result.status})`;
@@ -16039,7 +16204,7 @@ async function main() {
16039
16204
  case "version":
16040
16205
  case "--version":
16041
16206
  case "-v":
16042
- console.log(`fleetlens ${"0.11.0"}`);
16207
+ console.log(`fleetlens ${"0.11.2"}`);
16043
16208
  break;
16044
16209
  case "help":
16045
16210
  case "--help":
@@ -16047,7 +16212,7 @@ async function main() {
16047
16212
  console.log(`Usage: fleetlens <command>
16048
16213
 
16049
16214
  Common:
16050
- start [--port N] [--no-open] Start dashboard + usage daemon
16215
+ start [--port N] [--open] Start dashboard + usage daemon (prints URL; pass --open to also launch browser)
16051
16216
  stop Stop dashboard + usage daemon
16052
16217
  status Show server + daemon + latest snapshot
16053
16218
  update Update to the latest version
@@ -16062,7 +16227,7 @@ Terminal:
16062
16227
  runs [--watch] [--json] [--since 24h] Live LLM call activity + token spend
16063
16228
 
16064
16229
  Advanced:
16065
- web [page] [--no-open] Open dashboard in browser without auto-starting daemon
16230
+ web [page] [--open] Print dashboard URL without auto-starting daemon (pass --open to also launch browser)
16066
16231
  start --no-daemon Start only the web server (no daemon)
16067
16232
  daemon <start|stop|status|logs> Manage the usage daemon by itself
16068
16233
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fleetlens",
3
- "version": "0.11.0",
3
+ "version": "0.11.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=[18622,(e,r,t)=>{r.exports=e.x("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js"))},56704,(e,r,t)=>{r.exports=e.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},32319,(e,r,t)=>{r.exports=e.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},24725,(e,r,t)=>{r.exports=e.x("next/dist/server/app-render/after-task-async-storage.external.js",()=>require("next/dist/server/app-render/after-task-async-storage.external.js"))},93695,(e,r,t)=>{r.exports=e.x("next/dist/shared/lib/no-fallback-error.external.js",()=>require("next/dist/shared/lib/no-fallback-error.external.js"))},70406,(e,r,t)=>{r.exports=e.x("next/dist/compiled/@opentelemetry/api",()=>require("next/dist/compiled/@opentelemetry/api"))},50227,(e,r,t)=>{r.exports=e.x("node:path",()=>require("node:path"))},2157,(e,r,t)=>{r.exports=e.x("node:fs",()=>require("node:fs"))},60526,(e,r,t)=>{r.exports=e.x("node:os",()=>require("node:os"))},66680,(e,r,t)=>{r.exports=e.x("node:crypto",()=>require("node:crypto"))},74533,(e,r,t)=>{r.exports=e.x("node:child_process",()=>require("node:child_process"))}];
2
-
3
- //# sourceMappingURL=%5Bexternals%5D__0o43ejh._.js.map