fleetlens 0.16.8 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +189 -0
  3. package/app/apps/web/.next/BUILD_ID +1 -1
  4. package/app/apps/web/.next/build-manifest.json +3 -3
  5. package/app/apps/web/.next/prerender-manifest.json +3 -3
  6. package/app/apps/web/.next/server/app/_global-error.html +1 -1
  7. package/app/apps/web/.next/server/app/_global-error.rsc +1 -1
  8. package/app/apps/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  9. package/app/apps/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  10. package/app/apps/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  11. package/app/apps/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  12. package/app/apps/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  13. package/app/apps/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  14. package/app/apps/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  15. package/app/apps/web/.next/server/app/agent/page.js.nft.json +1 -1
  16. package/app/apps/web/.next/server/app/agent/page_client-reference-manifest.js +1 -1
  17. package/app/apps/web/.next/server/app/api/agent/chats/[id]/messages/route.js.nft.json +1 -1
  18. package/app/apps/web/.next/server/app/api/agent/index/route.js.nft.json +1 -1
  19. package/app/apps/web/.next/server/app/api/agent/mcp/route.js.nft.json +1 -1
  20. package/app/apps/web/.next/server/app/api/agent/suggestions/route.js.nft.json +1 -1
  21. package/app/apps/web/.next/server/app/api/ask/route.js.nft.json +1 -1
  22. package/app/apps/web/.next/server/app/api/digest/day/[date]/route.js.nft.json +1 -1
  23. package/app/apps/web/.next/server/app/api/digest/month/[yearMonth]/route.js.nft.json +1 -1
  24. package/app/apps/web/.next/server/app/api/digest/month-index/route.js.nft.json +1 -1
  25. package/app/apps/web/.next/server/app/api/digest/week/[startDate]/route.js.nft.json +1 -1
  26. package/app/apps/web/.next/server/app/api/digest/week-index/route.js.nft.json +1 -1
  27. package/app/apps/web/.next/server/app/api/events/route.js +1 -1
  28. package/app/apps/web/.next/server/app/api/events/route.js.nft.json +1 -1
  29. package/app/apps/web/.next/server/app/api/pdf/[key]/route.js +1 -1
  30. package/app/apps/web/.next/server/app/api/pdf/[key]/route.js.nft.json +1 -1
  31. package/app/apps/web/.next/server/app/api/projects/open-folder/route.js.nft.json +1 -1
  32. package/app/apps/web/.next/server/app/api/runs/[runId]/route.js.nft.json +1 -1
  33. package/app/apps/web/.next/server/app/api/runs/[runId]/stream/route.js.nft.json +1 -1
  34. package/app/apps/web/.next/server/app/api/settings/credentials/route.js.nft.json +1 -1
  35. package/app/apps/web/.next/server/app/api/settings/route.js.nft.json +1 -1
  36. package/app/apps/web/.next/server/app/changelog/page.js.nft.json +1 -1
  37. package/app/apps/web/.next/server/app/changelog/page_client-reference-manifest.js +1 -1
  38. package/app/apps/web/.next/server/app/day/[date]/page.js.nft.json +1 -1
  39. package/app/apps/web/.next/server/app/day/[date]/page_client-reference-manifest.js +1 -1
  40. package/app/apps/web/.next/server/app/day/page.js.nft.json +1 -1
  41. package/app/apps/web/.next/server/app/day/page_client-reference-manifest.js +1 -1
  42. package/app/apps/web/.next/server/app/digest/[date]/page.js.nft.json +1 -1
  43. package/app/apps/web/.next/server/app/digest/[date]/page_client-reference-manifest.js +1 -1
  44. package/app/apps/web/.next/server/app/digest/page.js.nft.json +1 -1
  45. package/app/apps/web/.next/server/app/digest/page_client-reference-manifest.js +1 -1
  46. package/app/apps/web/.next/server/app/insights/[key]/page.js.nft.json +1 -1
  47. package/app/apps/web/.next/server/app/insights/[key]/page_client-reference-manifest.js +1 -1
  48. package/app/apps/web/.next/server/app/insights/page.js.nft.json +1 -1
  49. package/app/apps/web/.next/server/app/insights/page_client-reference-manifest.js +1 -1
  50. package/app/apps/web/.next/server/app/page.js.nft.json +1 -1
  51. package/app/apps/web/.next/server/app/page_client-reference-manifest.js +1 -1
  52. package/app/apps/web/.next/server/app/parallelism/page.js.nft.json +1 -1
  53. package/app/apps/web/.next/server/app/parallelism/page_client-reference-manifest.js +1 -1
  54. package/app/apps/web/.next/server/app/print/[key]/page.js.nft.json +1 -1
  55. package/app/apps/web/.next/server/app/print/[key]/page_client-reference-manifest.js +1 -1
  56. package/app/apps/web/.next/server/app/projects/[slug]/page.js.nft.json +1 -1
  57. package/app/apps/web/.next/server/app/projects/[slug]/page_client-reference-manifest.js +1 -1
  58. package/app/apps/web/.next/server/app/projects/page.js.nft.json +1 -1
  59. package/app/apps/web/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  60. package/app/apps/web/.next/server/app/runs/page.js.nft.json +1 -1
  61. package/app/apps/web/.next/server/app/runs/page_client-reference-manifest.js +1 -1
  62. package/app/apps/web/.next/server/app/sessions/[id]/page.js.nft.json +1 -1
  63. package/app/apps/web/.next/server/app/sessions/[id]/page_client-reference-manifest.js +1 -1
  64. package/app/apps/web/.next/server/app/sessions/page.js.nft.json +1 -1
  65. package/app/apps/web/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  66. package/app/apps/web/.next/server/app/settings/page.js.nft.json +1 -1
  67. package/app/apps/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  68. package/app/apps/web/.next/server/app/team/onboarding/page.js.nft.json +1 -1
  69. package/app/apps/web/.next/server/app/team/onboarding/page_client-reference-manifest.js +1 -1
  70. package/app/apps/web/.next/server/app/team/page.js.nft.json +1 -1
  71. package/app/apps/web/.next/server/app/team/page_client-reference-manifest.js +1 -1
  72. package/app/apps/web/.next/server/app/usage/page.js.nft.json +1 -1
  73. package/app/apps/web/.next/server/app/usage/page_client-reference-manifest.js +1 -1
  74. package/app/apps/web/.next/server/chunks/{[externals]__0rv9ct5._.js → [externals]__0vj7dsg._.js} +2 -2
  75. package/app/apps/web/.next/server/chunks/[root-of-the-server]__02petpy._.js +3 -0
  76. package/app/apps/web/.next/server/chunks/[root-of-the-server]__0_nle98._.js +1 -1
  77. package/app/apps/web/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_02bw8.n.js +2 -2
  78. package/app/apps/web/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0sr4wr_.js +1 -1
  79. package/app/apps/web/.next/server/chunks/packages_entries_dist_0-0s5ui._.js +1 -1
  80. package/app/apps/web/.next/server/chunks/packages_entries_dist_0~0d7ku._.js +1 -1
  81. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__01wj6p0._.js +1 -1
  82. package/app/apps/web/.next/server/chunks/ssr/_0k8yioi._.js +1 -1
  83. package/app/apps/web/.next/server/chunks/ssr/apps_web_0~aj0~u._.js +1 -1
  84. package/app/apps/web/.next/server/chunks/ssr/apps_web_components_0x014hn._.js +1 -1
  85. package/app/apps/web/.next/server/chunks/ssr/apps_web_components_agent-chat_tsx_0xbtx2n._.js +1 -1
  86. package/app/apps/web/.next/server/chunks/ssr/apps_web_lib_changelog_ts_0n7_p1d._.js +1 -1
  87. package/app/apps/web/.next/server/chunks/ssr/apps_web_lib_changelog_ts_0nb5_-s._.js +1 -1
  88. package/app/apps/web/.next/server/chunks/ssr/packages_entries_dist_node_0_271yr.js +1 -1
  89. package/app/apps/web/.next/server/middleware-build-manifest.js +3 -3
  90. package/app/apps/web/.next/server/middleware-manifest.json +5 -5
  91. package/app/apps/web/.next/server/pages/500.html +1 -1
  92. package/app/apps/web/.next/server/server-reference-manifest.js +1 -1
  93. package/app/apps/web/.next/server/server-reference-manifest.json +1 -1
  94. package/app/apps/web/.next/static/chunks/{0~opjw4gew2-w.js → 06ypi6hp.gb8s.js} +1 -1
  95. package/app/apps/web/.next/static/chunks/{04feoajklmrl3.js → 0oz~x2s3c1zp_.js} +2 -2
  96. package/app/apps/web/.next/static/chunks/18c7gd5.b8gfc.js +14 -0
  97. package/app/apps/web/app/api/events/route.ts +2 -0
  98. package/app/apps/web/app/settings/page.tsx +1 -1
  99. package/app/apps/web/components/agent-chat.tsx +1 -1
  100. package/app/apps/web/components/menubar-install.tsx +1 -1
  101. package/app/apps/web/components/usage-sidebar.tsx +1 -1
  102. package/app/apps/web/components/zai-credentials-form.tsx +2 -2
  103. package/app/apps/web/lib/agent/extract.test.ts +1 -1
  104. package/app/apps/web/lib/changelog-data.generated.ts +1 -1
  105. package/app/apps/web/lib/daemon-lifecycle.test.ts +62 -0
  106. package/app/apps/web/lib/daemon-lifecycle.ts +50 -0
  107. package/app/apps/web/lib/format.test.ts +8 -8
  108. package/app/apps/web/lib/format.ts +1 -1
  109. package/app/apps/web/lib/menubar-data.ts +1 -1
  110. package/app/apps/web/package.json +1 -1
  111. package/app/apps/web/tsconfig.tsbuildinfo +1 -1
  112. package/dist/daemon-worker.js +12 -5
  113. package/dist/index.js +53 -28
  114. package/menubar/{FleetlensMenubar.app → Fleetlens.app}/Contents/Info.plist +4 -4
  115. package/menubar/Fleetlens.app/Contents/MacOS/FleetlensMenubar +0 -0
  116. package/menubar/Fleetlens.app/Contents/Resources/Fleetlens.icns +0 -0
  117. package/menubar/Fleetlens.app/Contents/Resources/fleetlens-mark.svg +7 -0
  118. package/menubar/{FleetlensMenubar.app → Fleetlens.app}/Contents/_CodeSignature/CodeResources +22 -0
  119. package/package.json +18 -2
  120. package/app/apps/web/.next/server/chunks/[root-of-the-server]__123tfcb._.js +0 -3
  121. package/app/apps/web/.next/static/chunks/01ky0t_.38u4u.js +0 -14
  122. package/menubar/FleetlensMenubar.app/Contents/MacOS/FleetlensMenubar +0 -0
  123. /package/app/apps/web/.next/static/{yxbgwGc3dXx7HY0GSHJeG → mSM83A_ktoKiZ6y_p7wNk}/_buildManifest.js +0 -0
  124. /package/app/apps/web/.next/static/{yxbgwGc3dXx7HY0GSHJeG → mSM83A_ktoKiZ6y_p7wNk}/_clientMiddlewareManifest.js +0 -0
  125. /package/app/apps/web/.next/static/{yxbgwGc3dXx7HY0GSHJeG → mSM83A_ktoKiZ6y_p7wNk}/_ssgManifest.js +0 -0
  126. /package/menubar/{FleetlensMenubar.app → Fleetlens.app}/Contents/Resources/claude.svg +0 -0
  127. /package/menubar/{FleetlensMenubar.app → Fleetlens.app}/Contents/Resources/codex.svg +0 -0
  128. /package/menubar/{FleetlensMenubar.app → Fleetlens.app}/Contents/Resources/grok.svg +0 -0
  129. /package/menubar/{FleetlensMenubar.app → Fleetlens.app}/Contents/Resources/zai.svg +0 -0
@@ -8258,7 +8258,9 @@ function classifySkill(name) {
8258
8258
  return "user";
8259
8259
  }
8260
8260
  var EXTERNAL_REF_PATTERNS = [
8261
- { kind: "linear-kip", re: /\bKIP-\d+\b/i },
8261
+ // Linear/Jira-style ticket ids. 2+ digits keeps model names (GPT-5) out;
8262
+ // the denylist drops the common spec/hash tokens that share the shape.
8263
+ { kind: "ticket-ref", re: /\b(?!(?:SHA|ISO|RFC|CVE)-)[A-Z]{2,10}-\d{2,}\b/ },
8262
8264
  { kind: "github-issue-pr", re: /\b(issue|pr|pull request)\s*#\d+\b|github\.com\/[^\s]+\/(issues|pull)\/\d+/i },
8263
8265
  { kind: "branch-ref", re: /\b(branch|feat|fix|chore|refactor)[/:]\s*[\w./-]+|on `[\w./-]+`/i },
8264
8266
  { kind: "url", re: /https?:\/\/\S+/ }
@@ -8944,6 +8946,10 @@ function sessionTouchesDay(s, day) {
8944
8946
  }
8945
8947
  return sessionDay(s) === day;
8946
8948
  }
8949
+ var SYNTHETIC_NAME_RE = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}|[0-9a-f]{16,64})$/i;
8950
+ function isSyntheticProjectName(name) {
8951
+ return SYNTHETIC_NAME_RE.test(name) || name === "cowork:unspaced" || name === "(unknown)";
8952
+ }
8947
8953
  function buildRichRollupBlocks(day, daySessions, entries, resolveRepo) {
8948
8954
  const bounds = dayBoundsMs(day);
8949
8955
  const clippedSessions = [];
@@ -8978,6 +8984,7 @@ function buildRichRollupBlocks(day, daySessions, entries, resolveRepo) {
8978
8984
  const canonical = canonicalProjectName(s.projectName);
8979
8985
  const name = projectKey(s.projectName);
8980
8986
  const repo = resolveRepo?.(canonical) ?? sessionRepo.get(s.id);
8987
+ if (!repo && isSyntheticProjectName(s.projectName)) continue;
8981
8988
  const key = repo ?? name;
8982
8989
  const ms = s.activeSegments.reduce((sum, seg) => sum + (seg.endMs - seg.startMs), 0);
8983
8990
  const cur = projects.get(key) ?? { project: name, agentTimeMs: 0, sessions: 0, ...repo ? { resolved: repo } : {} };
@@ -9104,7 +9111,7 @@ function buildIngestPayload(inputs) {
9104
9111
  return {
9105
9112
  ingestId: randomUUID(),
9106
9113
  observedAt: (/* @__PURE__ */ new Date()).toISOString(),
9107
- cliVersion: "0.16.8",
9114
+ cliVersion: "1.0.0",
9108
9115
  ...richRollup || inputs.enrichedExtras || inputs.artifactSignals ? { schemaVersion: RICH_ROLLUP_SCHEMA_VERSION } : {},
9109
9116
  ...inputs.rollup ? { dailyRollup: inputs.rollup } : {},
9110
9117
  ...richRollup ? { richRollup } : {},
@@ -18038,14 +18045,14 @@ async function getUpdateAvailability() {
18038
18045
  if (isDevMode()) return null;
18039
18046
  const latest = await fetchLatestVersion();
18040
18047
  if (latest === null) return {
18041
- current: "0.16.8",
18048
+ current: "1.0.0",
18042
18049
  latest: null,
18043
18050
  updateAvailable: false
18044
18051
  };
18045
18052
  return {
18046
- current: "0.16.8",
18053
+ current: "1.0.0",
18047
18054
  latest,
18048
- updateAvailable: shouldUpdate("0.16.8", latest)
18055
+ updateAvailable: shouldUpdate("1.0.0", latest)
18049
18056
  };
18050
18057
  }
18051
18058
 
package/dist/index.js CHANGED
@@ -6241,9 +6241,9 @@ function onDiskVersion() {
6241
6241
  try {
6242
6242
  const here = dirname3(fileURLToPath(import.meta.url));
6243
6243
  const pkg = JSON.parse(readFileSync5(join3(here, "..", "package.json"), "utf8"));
6244
- return pkg.version ?? "0.16.8";
6244
+ return pkg.version ?? "1.0.0";
6245
6245
  } catch {
6246
- return "0.16.8";
6246
+ return "1.0.0";
6247
6247
  }
6248
6248
  }
6249
6249
  function getServerStatus() {
@@ -6255,7 +6255,7 @@ function getServerStatus() {
6255
6255
  return { running: false };
6256
6256
  }
6257
6257
  function isServerStale(status2) {
6258
- return status2.running === true && status2.version !== "0.16.8";
6258
+ return status2.running === true && status2.version !== "1.0.0";
6259
6259
  }
6260
6260
  async function ensureCurrentServer(opts = {}) {
6261
6261
  const status2 = getServerStatus();
@@ -6263,7 +6263,7 @@ async function ensureCurrentServer(opts = {}) {
6263
6263
  return { pid: status2.pid, port: status2.port, restarted: false };
6264
6264
  }
6265
6265
  if (!status2.running) {
6266
- const result = await startServer({ port: opts.port });
6266
+ const result = await startServer(opts);
6267
6267
  return { ...result, restarted: false };
6268
6268
  }
6269
6269
  const previousVersion = status2.version;
@@ -6279,7 +6279,7 @@ async function ensureCurrentServer(opts = {}) {
6279
6279
  await waitForPortFree(port, 3e3);
6280
6280
  }
6281
6281
  try {
6282
- const result = await startServer({ port });
6282
+ const result = await startServer({ port, autoStartDaemon: opts.autoStartDaemon });
6283
6283
  return { ...result, restarted: true, previousVersion };
6284
6284
  } catch (err) {
6285
6285
  if (isProcessAlive(oldPid, SERVER_MARKERS)) writePid(PID_FILE, oldPid, port, previousVersion);
@@ -6305,7 +6305,8 @@ async function startServer(opts = {}) {
6305
6305
  PORT: String(port),
6306
6306
  HOSTNAME: "localhost",
6307
6307
  CCLENS_DATA_DIR: dataDir,
6308
- FLEETLENS_CLI_BIN: cliBinRealPath()
6308
+ FLEETLENS_CLI_BIN: cliBinRealPath(),
6309
+ FLEETLENS_WEB_START_DAEMON: opts.autoStartDaemon === false ? "0" : "1"
6309
6310
  },
6310
6311
  cwd: appDir()
6311
6312
  });
@@ -6694,9 +6695,9 @@ Installed: ${PACKAGE_NAME}@${verify.installedVersion} at ${verify.installedPath
6694
6695
  console.warn(
6695
6696
  ` \u2022 reinstall in the correct Node env: 'npm install -g ${PACKAGE_NAME}@latest'`
6696
6697
  );
6697
- } else if (verify.installedVersion !== "0.16.8") {
6698
+ } else if (verify.installedVersion !== "1.0.0") {
6698
6699
  console.log(
6699
- ` \u2192 This process is still running ${"0.16.8"}. Next invocation will use ${verify.installedVersion}.`
6700
+ ` \u2192 This process is still running ${"1.0.0"}. Next invocation will use ${verify.installedVersion}.`
6700
6701
  );
6701
6702
  }
6702
6703
  }
@@ -6731,14 +6732,14 @@ async function getUpdateAvailability() {
6731
6732
  if (isDevMode()) return null;
6732
6733
  const latest = await fetchLatestVersion();
6733
6734
  if (latest === null) return {
6734
- current: "0.16.8",
6735
+ current: "1.0.0",
6735
6736
  latest: null,
6736
6737
  updateAvailable: false
6737
6738
  };
6738
6739
  return {
6739
- current: "0.16.8",
6740
+ current: "1.0.0",
6740
6741
  latest,
6741
- updateAvailable: shouldUpdate("0.16.8", latest)
6742
+ updateAvailable: shouldUpdate("1.0.0", latest)
6742
6743
  };
6743
6744
  }
6744
6745
  async function checkForUpdate() {
@@ -6828,7 +6829,7 @@ async function restartServices(state) {
6828
6829
  }
6829
6830
  async function forceUpdate() {
6830
6831
  const latest = await fetchLatestVersion();
6831
- const current = "0.16.8";
6832
+ const current = "1.0.0";
6832
6833
  if (latest === null) {
6833
6834
  console.error("Could not reach npm registry. Check your network.");
6834
6835
  process.exit(1);
@@ -7147,7 +7148,7 @@ async function start(args2) {
7147
7148
  let serverPid;
7148
7149
  try {
7149
7150
  console.log("Starting Fleetlens...");
7150
- const result = await ensureCurrentServer({ port });
7151
+ const result = await ensureCurrentServer({ port, autoStartDaemon: !noDaemon });
7151
7152
  serverUrl = `http://localhost:${result.port}`;
7152
7153
  serverPid = result.pid;
7153
7154
  if (result.restarted) {
@@ -7241,7 +7242,7 @@ async function status() {
7241
7242
  console.log(`Server: running on ${url} (PID ${server.pid}, v${ver})`);
7242
7243
  if (isServerStale(server)) {
7243
7244
  console.log(
7244
- ` \u26A0 serving stale ${ver} (CLI is ${"0.16.8"}) \u2014 run 'fleetlens start' to restart on the current version`
7245
+ ` \u26A0 serving stale ${ver} (CLI is ${"1.0.0"}) \u2014 run 'fleetlens start' to restart on the current version`
7245
7246
  );
7246
7247
  }
7247
7248
  } else {
@@ -9376,7 +9377,9 @@ var init_signals = __esm({
9376
9377
  STOCK_SUBAGENT_PREFIXES = /^(general-purpose|Explore|Plan|claude-code-guide|playwright-qa-verifier|statusline-setup|frontend-design:|code-review:|code-simplifier:|codex:|superpowers:)/;
9377
9378
  STOCK_SKILL_PREFIXES = /^(superpowers|mcp__|frontend-design|code-review|codex|claude-code-guide|claude-api):/i;
9378
9379
  EXTERNAL_REF_PATTERNS = [
9379
- { kind: "linear-kip", re: /\bKIP-\d+\b/i },
9380
+ // Linear/Jira-style ticket ids. 2+ digits keeps model names (GPT-5) out;
9381
+ // the denylist drops the common spec/hash tokens that share the shape.
9382
+ { kind: "ticket-ref", re: /\b(?!(?:SHA|ISO|RFC|CVE)-)[A-Z]{2,10}-\d{2,}\b/ },
9380
9383
  { kind: "github-issue-pr", re: /\b(issue|pr|pull request)\s*#\d+\b|github\.com\/[^\s]+\/(issues|pull)\/\d+/i },
9381
9384
  { kind: "branch-ref", re: /\b(branch|feat|fix|chore|refactor)[/:]\s*[\w./-]+|on `[\w./-]+`/i },
9382
9385
  { kind: "url", re: /https?:\/\/\S+/ }
@@ -19442,6 +19445,9 @@ function writeCliLaunchFile() {
19442
19445
  function installedAppPath() {
19443
19446
  return join13(homedir6(), "Applications", APP_BUNDLE);
19444
19447
  }
19448
+ function legacyInstalledAppPath() {
19449
+ return join13(homedir6(), "Applications", LEGACY_APP_BUNDLE);
19450
+ }
19445
19451
  async function isRunning() {
19446
19452
  try {
19447
19453
  const { stdout } = await execFileAsync2("pgrep", ["-x", BUNDLE_EXEC]);
@@ -19461,11 +19467,18 @@ async function quitApp() {
19461
19467
  await execFileAsync2("pkill", ["-x", BUNDLE_EXEC]).catch(() => {
19462
19468
  });
19463
19469
  }
19464
- async function setLoginItem(enabled, appPath) {
19465
- const script = enabled ? `tell application "System Events" to make login item at end with properties {path:"${appPath}", hidden:false}` : `tell application "System Events" to delete login item "${APP_BUNDLE.replace(".app", "")}"`;
19470
+ async function addLoginItem(appPath) {
19471
+ const script = `tell application "System Events" to make login item at end with properties {path:"${appPath}", hidden:false}`;
19466
19472
  await execFileAsync2("osascript", ["-e", script]).catch(() => {
19467
19473
  });
19468
19474
  }
19475
+ async function removeLoginItem(name) {
19476
+ await execFileAsync2("osascript", [
19477
+ "-e",
19478
+ `tell application "System Events" to delete login item "${name}"`
19479
+ ]).catch(() => {
19480
+ });
19481
+ }
19469
19482
  async function installMenubar(opts) {
19470
19483
  if (!isMac2()) {
19471
19484
  console.log(NON_MAC_MSG2);
@@ -19475,7 +19488,7 @@ async function installMenubar(opts) {
19475
19488
  if (!existsSync19(src)) {
19476
19489
  console.error(
19477
19490
  `Bundled widget not found at ${src}.
19478
- This install was probably built without the menubar artifact. Run \`node apps/menubar/build-app.sh && cp -R apps/menubar/dist/FleetlensMenubar.app packages/cli/menubar/\` and rebuild.`
19491
+ This install was probably built without the menubar artifact. Run \`bash apps/menubar/build-app.sh && cp -R apps/menubar/dist/Fleetlens.app packages/cli/menubar/\` and rebuild.`
19479
19492
  );
19480
19493
  process.exit(1);
19481
19494
  }
@@ -19488,11 +19501,14 @@ This install was probably built without the menubar artifact. Run \`node apps/me
19488
19501
  await new Promise((r) => setTimeout(r, 400));
19489
19502
  }
19490
19503
  rmSync2(dest, { recursive: true, force: true });
19504
+ rmSync2(legacyInstalledAppPath(), { recursive: true, force: true });
19491
19505
  cpSync(src, dest, { recursive: true });
19492
19506
  writeCliLaunchFile();
19493
19507
  console.log(`Installed \u2192 ${dest}`);
19508
+ await removeLoginItem(APP_BUNDLE.replace(".app", ""));
19509
+ await removeLoginItem(LEGACY_APP_BUNDLE.replace(".app", ""));
19494
19510
  if (opts.login) {
19495
- await setLoginItem(true, dest);
19511
+ await addLoginItem(dest);
19496
19512
  console.log("Login item enabled (launches at login).");
19497
19513
  }
19498
19514
  if (opts.open) {
@@ -19507,7 +19523,8 @@ async function uninstallMenubar() {
19507
19523
  console.log(NON_MAC_MSG2);
19508
19524
  return;
19509
19525
  }
19510
- await setLoginItem(false, installedAppPath());
19526
+ await removeLoginItem(APP_BUNDLE.replace(".app", ""));
19527
+ await removeLoginItem(LEGACY_APP_BUNDLE.replace(".app", ""));
19511
19528
  if (await isRunning()) {
19512
19529
  console.log("Quitting the running widget\u2026");
19513
19530
  await quitApp();
@@ -19520,6 +19537,7 @@ async function uninstallMenubar() {
19520
19537
  } else {
19521
19538
  console.log("Widget is not installed \u2014 nothing to remove.");
19522
19539
  }
19540
+ rmSync2(legacyInstalledAppPath(), { recursive: true, force: true });
19523
19541
  console.log("Login item cleared (if it was set).");
19524
19542
  }
19525
19543
  async function openMenubar() {
@@ -19604,8 +19622,9 @@ async function menubar(args2) {
19604
19622
  status Show install/running/bundled state.
19605
19623
 
19606
19624
  The widget tails ~/.cclens/usage.jsonl and shows live Claude Code / Codex
19607
- plan utilization in the menu bar. Click it for a popover, or "Dashboard" to
19608
- open http://localhost:3321.`);
19625
+ plan utilization in the menu bar. It starts the usage daemon when launched
19626
+ and re-checks it whenever you open the popover or usage data becomes more
19627
+ than five minutes stale. Click "Dashboard" to open http://localhost:3321.`);
19609
19628
  break;
19610
19629
  default:
19611
19630
  console.error(
@@ -19615,13 +19634,14 @@ Usage: fleetlens menubar <install|uninstall|open|stop|status>`
19615
19634
  process.exit(1);
19616
19635
  }
19617
19636
  }
19618
- var execFileAsync2, APP_BUNDLE, BUNDLE_EXEC, NON_MAC_MSG2;
19637
+ var execFileAsync2, APP_BUNDLE, LEGACY_APP_BUNDLE, BUNDLE_EXEC, NON_MAC_MSG2;
19619
19638
  var init_menubar = __esm({
19620
19639
  "src/commands/menubar.ts"() {
19621
19640
  "use strict";
19622
19641
  init_fs();
19623
19642
  execFileAsync2 = promisify2(execFile2);
19624
- APP_BUNDLE = "FleetlensMenubar.app";
19643
+ APP_BUNDLE = "Fleetlens.app";
19644
+ LEGACY_APP_BUNDLE = "FleetlensMenubar.app";
19625
19645
  BUNDLE_EXEC = "FleetlensMenubar";
19626
19646
  NON_MAC_MSG2 = "The Fleetlens menu bar widget is a native macOS app and is macOS-only. On Linux/Windows, keep using the dashboard at the printed URL.";
19627
19647
  }
@@ -19752,6 +19772,9 @@ function sessionTouchesDay(s, day2) {
19752
19772
  }
19753
19773
  return sessionDay(s) === day2;
19754
19774
  }
19775
+ function isSyntheticProjectName(name) {
19776
+ return SYNTHETIC_NAME_RE.test(name) || name === "cowork:unspaced" || name === "(unknown)";
19777
+ }
19755
19778
  function buildRichRollupBlocks(day2, daySessions, entries2, resolveRepo) {
19756
19779
  const bounds = dayBoundsMs(day2);
19757
19780
  const clippedSessions = [];
@@ -19786,6 +19809,7 @@ function buildRichRollupBlocks(day2, daySessions, entries2, resolveRepo) {
19786
19809
  const canonical = canonicalProjectName(s.projectName);
19787
19810
  const name = projectKey(s.projectName);
19788
19811
  const repo = resolveRepo?.(canonical) ?? sessionRepo.get(s.id);
19812
+ if (!repo && isSyntheticProjectName(s.projectName)) continue;
19789
19813
  const key = repo ?? name;
19790
19814
  const ms = s.activeSegments.reduce((sum, seg) => sum + (seg.endMs - seg.startMs), 0);
19791
19815
  const cur = projects.get(key) ?? { project: name, agentTimeMs: 0, sessions: 0, ...repo ? { resolved: repo } : {} };
@@ -19911,7 +19935,7 @@ function buildIngestPayload(inputs) {
19911
19935
  return {
19912
19936
  ingestId: randomUUID2(),
19913
19937
  observedAt: (/* @__PURE__ */ new Date()).toISOString(),
19914
- cliVersion: "0.16.8",
19938
+ cliVersion: "1.0.0",
19915
19939
  ...richRollup || inputs.enrichedExtras || inputs.artifactSignals ? { schemaVersion: RICH_ROLLUP_SCHEMA_VERSION } : {},
19916
19940
  ...inputs.rollup ? { dailyRollup: inputs.rollup } : {},
19917
19941
  ...richRollup ? { richRollup } : {},
@@ -19936,7 +19960,7 @@ async function pushToTeamServer(config, payload) {
19936
19960
  const body = await res.json().catch(() => null);
19937
19961
  return { ok: res.ok, status: res.status, body };
19938
19962
  }
19939
- var SNAPSHOT_FRESHNESS_MS, POST_TIMEOUT_MS, ensuredSessions;
19963
+ var SNAPSHOT_FRESHNESS_MS, POST_TIMEOUT_MS, SYNTHETIC_NAME_RE, ensuredSessions;
19940
19964
  var init_push = __esm({
19941
19965
  "src/team/push.ts"() {
19942
19966
  "use strict";
@@ -19947,6 +19971,7 @@ var init_push = __esm({
19947
19971
  init_storage();
19948
19972
  SNAPSHOT_FRESHNESS_MS = 10 * 60 * 1e3;
19949
19973
  POST_TIMEOUT_MS = 15e3;
19974
+ SYNTHETIC_NAME_RE = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}|[0-9a-f]{16,64})$/i;
19950
19975
  ensuredSessions = /* @__PURE__ */ new Set();
19951
19976
  }
19952
19977
  });
@@ -21954,7 +21979,7 @@ async function main() {
21954
21979
  case "version":
21955
21980
  case "--version":
21956
21981
  case "-v":
21957
- console.log(`fleetlens ${"0.16.8"}`);
21982
+ console.log(`fleetlens ${"1.0.0"}`);
21958
21983
  break;
21959
21984
  case "help":
21960
21985
  case "--help":
@@ -21977,7 +22002,7 @@ Terminal:
21977
22002
  runs [--watch] [--json] [--since 24h] Live LLM call activity + token spend
21978
22003
 
21979
22004
  Advanced:
21980
- web [page] [--open] Print dashboard URL without auto-starting daemon (pass --open to also launch browser)
22005
+ web [page] [--open] Print dashboard URL; opening it also recovers a stopped daemon
21981
22006
  start --no-daemon Start only the web server (no daemon)
21982
22007
  daemon <start|stop|status|logs> Manage the usage daemon by itself
21983
22008
  autostart <install|uninstall|status> Run the usage daemon at login (macOS launchd)
@@ -4,14 +4,14 @@
4
4
  <dict>
5
5
  <key>CFBundleDevelopmentRegion</key><string>en</string>
6
6
  <key>CFBundleExecutable</key><string>FleetlensMenubar</string>
7
- <key>CFBundleIconFile</key><string></string>
7
+ <key>CFBundleIconFile</key><string>Fleetlens.icns</string>
8
8
  <key>CFBundleIdentifier</key><string>ai.fleetlens.menubar</string>
9
9
  <key>CFBundleInfoDictionaryVersion</key><string>6.0</string>
10
10
  <key>CFBundleName</key><string>Fleetlens</string>
11
- <key>CFBundleDisplayName</key><string>Fleetlens Menu Bar</string>
11
+ <key>CFBundleDisplayName</key><string>Fleetlens</string>
12
12
  <key>CFBundlePackageType</key><string>APPL</string>
13
- <key>CFBundleShortVersionString</key><string>0.16.8</string>
14
- <key>CFBundleVersion</key><string>0.16.8</string>
13
+ <key>CFBundleShortVersionString</key><string>1.0.0</string>
14
+ <key>CFBundleVersion</key><string>1.0.0</string>
15
15
  <key>LSApplicationCategoryType</key><string>public.app-category.developer-tools</string>
16
16
  <key>LSMinimumSystemVersion</key><string>14.0</string>
17
17
  <key>LSUIElement</key><true/>
@@ -0,0 +1,7 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32" fill="none">
2
+ <rect width="32" height="32" rx="9" fill="#0D9488"/>
3
+ <path d="M7.5 8.5h2.75c5.1 0 5.1 6.5 9.3 6.5H22v2h-2.45c-5.2 0-5.2-6.5-9.3-6.5H7.5z" fill="white"/>
4
+ <path d="M7.5 15H22v2H7.5z" fill="white"/>
5
+ <path d="M7.5 21.5h2.75c4.1 0 4.1-6.5 9.3-6.5H22v2h-2.45c-4.2 0-4.2 6.5-9.3 6.5H7.5z" fill="white"/>
6
+ <circle cx="24.5" cy="16" r="2.5" fill="white"/>
7
+ </svg>
@@ -4,6 +4,10 @@
4
4
  <dict>
5
5
  <key>files</key>
6
6
  <dict>
7
+ <key>Resources/Fleetlens.icns</key>
8
+ <data>
9
+ NKrSPxjCjw0xmOgvoG31OeMS5Po=
10
+ </data>
7
11
  <key>Resources/claude.svg</key>
8
12
  <data>
9
13
  sZ+BX4Qhp59/FCvfW2wJIwiH6Yo=
@@ -12,6 +16,10 @@
12
16
  <data>
13
17
  r+rHIJooRcD9VUSTGH3DzUbLfz0=
14
18
  </data>
19
+ <key>Resources/fleetlens-mark.svg</key>
20
+ <data>
21
+ uZIkTH/r4Jkr05rGOmWHVhc2UPc=
22
+ </data>
15
23
  <key>Resources/grok.svg</key>
16
24
  <data>
17
25
  ag5AkUKYKo/2vBhrhvxr8vFjYtg=
@@ -23,6 +31,13 @@
23
31
  </dict>
24
32
  <key>files2</key>
25
33
  <dict>
34
+ <key>Resources/Fleetlens.icns</key>
35
+ <dict>
36
+ <key>hash2</key>
37
+ <data>
38
+ jJthY0bxZLSwOOTOyKo77d76HDWcPdRXAsYhEylUgDg=
39
+ </data>
40
+ </dict>
26
41
  <key>Resources/claude.svg</key>
27
42
  <dict>
28
43
  <key>hash2</key>
@@ -37,6 +52,13 @@
37
52
  cYTye5ig9uIFRuJYr2R7kkGXfzthdp7f+T8NdbSzZP0=
38
53
  </data>
39
54
  </dict>
55
+ <key>Resources/fleetlens-mark.svg</key>
56
+ <dict>
57
+ <key>hash2</key>
58
+ <data>
59
+ xE+n+OmsiW4chf9QqmkT2QjGqCdwmt8qBPR98pU2s+4=
60
+ </data>
61
+ </dict>
40
62
  <key>Resources/grok.svg</key>
41
63
  <dict>
42
64
  <key>hash2</key>
package/package.json CHANGED
@@ -1,8 +1,22 @@
1
1
  {
2
2
  "name": "fleetlens",
3
- "version": "0.16.8",
3
+ "version": "1.0.0",
4
4
  "description": "fleetlens — local-only dashboard and usage tracker for Claude Code sessions and agent fleets",
5
5
  "license": "MIT",
6
+ "author": "cowcow02",
7
+ "homepage": "https://cowcow02.github.io/fleetlens/",
8
+ "keywords": [
9
+ "claude",
10
+ "claude-code",
11
+ "codex",
12
+ "gemini-cli",
13
+ "dashboard",
14
+ "agent",
15
+ "multi-agent",
16
+ "observability",
17
+ "usage",
18
+ "analytics"
19
+ ],
6
20
  "repository": {
7
21
  "type": "git",
8
22
  "url": "git+https://github.com/cowcow02/fleetlens.git",
@@ -15,7 +29,9 @@
15
29
  "files": [
16
30
  "dist",
17
31
  "app",
18
- "menubar"
32
+ "menubar",
33
+ "README.md",
34
+ "LICENSE"
19
35
  ],
20
36
  "scripts": {
21
37
  "build": "node build.mjs",
@@ -1,3 +0,0 @@
1
- module.exports=[93695,(e,t,r)=>{t.exports=e.x("next/dist/shared/lib/no-fallback-error.external.js",()=>require("next/dist/shared/lib/no-fallback-error.external.js"))},18622,(e,t,r)=>{t.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,t,r)=>{t.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,t,r)=>{t.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"))},70406,(e,t,r)=>{t.exports=e.x("next/dist/compiled/@opentelemetry/api",()=>require("next/dist/compiled/@opentelemetry/api"))},50227,(e,t,r)=>{t.exports=e.x("node:path",()=>require("node:path"))},2157,(e,t,r)=>{t.exports=e.x("node:fs",()=>require("node:fs"))},60526,(e,t,r)=>{t.exports=e.x("node:os",()=>require("node:os"))},66680,(e,t,r)=>{t.exports=e.x("node:crypto",()=>require("node:crypto"))},74533,(e,t,r)=>{t.exports=e.x("node:child_process",()=>require("node:child_process"))},27174,e=>{"use strict";e.i(39587),e.s([])},30212,e=>{"use strict";var t=e.i(79357);function r(e){return(0,t.toLocalDay)(e.getTime())}function n(e=new Date){let t=new Date(e.getFullYear(),e.getMonth(),e.getDate()),r=t.getDay(),a=new Date(t);a.setDate(t.getDate()-(r+6)%7);let o=new Date(a);return o.setDate(a.getDate()+6),{start:a,end:o}}e.s(["aggregateConcurrency",0,function(e,t){let n,a=function(e,t){let r=[],n=new Date(e.getFullYear(),e.getMonth(),e.getDate()),a=new Date(t.getFullYear(),t.getMonth(),t.getDate());for(;n.getTime()<=a.getTime();)r.push(new Date(n)),n.setDate(n.getDate()+1);return r}(t.start,t.end),o=new Map;for(let e of a)o.set(r(e),{peak:0,has_cross_project:!1});for(let t of e){let e=r(new Date(t.startMs)),n=o.get(e);n&&(t.peak>n.peak&&(n.peak=t.peak),t.crossProject&&(n.has_cross_project=!0))}let s=a.map(e=>{let t=r(e),n=o.get(t);return{date:t,peak:n.peak,has_cross_project:n.has_cross_project}}),i=0,p=0,l=0;for(let e of s)e.peak>i&&(i=e.peak,n=e.date),e.peak>=3&&p++,e.has_cross_project&&l++;return{by_day:s,peak:i,peak_day:n,multi_agent_days:p,cross_project_days:l}},"calendarMonth",0,function(e=new Date){return{start:new Date(e.getFullYear(),e.getMonth(),1),end:new Date(e.getFullYear(),e.getMonth()+1,0)}},"calendarWeek",0,n,"priorCalendarMonth",0,function(e=new Date){return{start:new Date(e.getFullYear(),e.getMonth()-1,1),end:new Date(e.getFullYear(),e.getMonth(),0)}},"priorCalendarWeek",0,function(e=new Date){let t=n(e),r=new Date(t.start);r.setDate(t.start.getDate()-1);let a=new Date(r);return a.setDate(r.getDate()-6),{start:a,end:r}}])},75169,e=>{"use strict";function t(e){let t=new Date(e),r=t.getFullYear(),n=String(t.getMonth()+1).padStart(2,"0"),a=String(t.getDate()).padStart(2,"0");return`${r}-${n}-${a}`}function r(e=Date.now()){return t(e)}e.i(5737);let n=/^\d{4}-\d{2}-\d{2}$/;function a(e){return n.test(e)}let o=/^\d{4}-\d{2}$/;e.s(["asMonday",0,function(e){return a(e)&&1===new Date(`${e}T00:00:00`).getDay()?e:null},"currentWeekMonday",0,function(e=Date.now()){var n;let a,o;return n=r(e),o=(a=new Date(`${n}T00:00:00`)).getDay(),a.setDate(a.getDate()+(0===o?-6:1-o)),t(a.getTime())},"currentYearMonth",0,function(e=Date.now()){return r(e).slice(0,7)},"isValidDate",0,a,"isValidYearMonth",0,function(e){return o.test(e)},"todayLocal",0,r])},59639,(e,t,r)=>{t.exports=e.x("node:process",()=>require("node:process"))},12057,(e,t,r)=>{t.exports=e.x("node:util",()=>require("node:util"))}];
2
-
3
- //# sourceMappingURL=%5Broot-of-the-server%5D__123tfcb._.js.map