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.
- package/LICENSE +21 -0
- package/README.md +189 -0
- package/app/apps/web/.next/BUILD_ID +1 -1
- package/app/apps/web/.next/build-manifest.json +3 -3
- package/app/apps/web/.next/prerender-manifest.json +3 -3
- package/app/apps/web/.next/server/app/_global-error.html +1 -1
- package/app/apps/web/.next/server/app/_global-error.rsc +1 -1
- package/app/apps/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/app/apps/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/app/apps/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/app/apps/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/app/apps/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/app/apps/web/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app/agent/page.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/agent/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app/api/agent/chats/[id]/messages/route.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/api/agent/index/route.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/api/agent/mcp/route.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/api/agent/suggestions/route.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/api/ask/route.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/api/digest/day/[date]/route.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/api/digest/month/[yearMonth]/route.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/api/digest/month-index/route.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/api/digest/week/[startDate]/route.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/api/digest/week-index/route.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/api/events/route.js +1 -1
- package/app/apps/web/.next/server/app/api/events/route.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/api/pdf/[key]/route.js +1 -1
- package/app/apps/web/.next/server/app/api/pdf/[key]/route.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/api/projects/open-folder/route.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/api/runs/[runId]/route.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/api/runs/[runId]/stream/route.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/api/settings/credentials/route.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/api/settings/route.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/changelog/page.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/changelog/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app/day/[date]/page.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/day/[date]/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app/day/page.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/day/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app/digest/[date]/page.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/digest/[date]/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app/digest/page.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/digest/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app/insights/[key]/page.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/insights/[key]/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app/insights/page.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/insights/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app/page.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app/parallelism/page.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/parallelism/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app/print/[key]/page.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/print/[key]/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app/projects/[slug]/page.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/projects/[slug]/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app/projects/page.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/projects/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app/runs/page.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/runs/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app/sessions/[id]/page.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/sessions/[id]/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app/sessions/page.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app/settings/page.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app/team/onboarding/page.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/team/onboarding/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app/team/page.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/team/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app/usage/page.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/usage/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/chunks/{[externals]__0rv9ct5._.js → [externals]__0vj7dsg._.js} +2 -2
- package/app/apps/web/.next/server/chunks/[root-of-the-server]__02petpy._.js +3 -0
- package/app/apps/web/.next/server/chunks/[root-of-the-server]__0_nle98._.js +1 -1
- package/app/apps/web/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_02bw8.n.js +2 -2
- package/app/apps/web/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0sr4wr_.js +1 -1
- package/app/apps/web/.next/server/chunks/packages_entries_dist_0-0s5ui._.js +1 -1
- package/app/apps/web/.next/server/chunks/packages_entries_dist_0~0d7ku._.js +1 -1
- package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__01wj6p0._.js +1 -1
- package/app/apps/web/.next/server/chunks/ssr/_0k8yioi._.js +1 -1
- package/app/apps/web/.next/server/chunks/ssr/apps_web_0~aj0~u._.js +1 -1
- package/app/apps/web/.next/server/chunks/ssr/apps_web_components_0x014hn._.js +1 -1
- package/app/apps/web/.next/server/chunks/ssr/apps_web_components_agent-chat_tsx_0xbtx2n._.js +1 -1
- package/app/apps/web/.next/server/chunks/ssr/apps_web_lib_changelog_ts_0n7_p1d._.js +1 -1
- package/app/apps/web/.next/server/chunks/ssr/apps_web_lib_changelog_ts_0nb5_-s._.js +1 -1
- package/app/apps/web/.next/server/chunks/ssr/packages_entries_dist_node_0_271yr.js +1 -1
- package/app/apps/web/.next/server/middleware-build-manifest.js +3 -3
- package/app/apps/web/.next/server/middleware-manifest.json +5 -5
- package/app/apps/web/.next/server/pages/500.html +1 -1
- package/app/apps/web/.next/server/server-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/server-reference-manifest.json +1 -1
- package/app/apps/web/.next/static/chunks/{0~opjw4gew2-w.js → 06ypi6hp.gb8s.js} +1 -1
- package/app/apps/web/.next/static/chunks/{04feoajklmrl3.js → 0oz~x2s3c1zp_.js} +2 -2
- package/app/apps/web/.next/static/chunks/18c7gd5.b8gfc.js +14 -0
- package/app/apps/web/app/api/events/route.ts +2 -0
- package/app/apps/web/app/settings/page.tsx +1 -1
- package/app/apps/web/components/agent-chat.tsx +1 -1
- package/app/apps/web/components/menubar-install.tsx +1 -1
- package/app/apps/web/components/usage-sidebar.tsx +1 -1
- package/app/apps/web/components/zai-credentials-form.tsx +2 -2
- package/app/apps/web/lib/agent/extract.test.ts +1 -1
- package/app/apps/web/lib/changelog-data.generated.ts +1 -1
- package/app/apps/web/lib/daemon-lifecycle.test.ts +62 -0
- package/app/apps/web/lib/daemon-lifecycle.ts +50 -0
- package/app/apps/web/lib/format.test.ts +8 -8
- package/app/apps/web/lib/format.ts +1 -1
- package/app/apps/web/lib/menubar-data.ts +1 -1
- package/app/apps/web/package.json +1 -1
- package/app/apps/web/tsconfig.tsbuildinfo +1 -1
- package/dist/daemon-worker.js +12 -5
- package/dist/index.js +53 -28
- package/menubar/{FleetlensMenubar.app → Fleetlens.app}/Contents/Info.plist +4 -4
- package/menubar/Fleetlens.app/Contents/MacOS/FleetlensMenubar +0 -0
- package/menubar/Fleetlens.app/Contents/Resources/Fleetlens.icns +0 -0
- package/menubar/Fleetlens.app/Contents/Resources/fleetlens-mark.svg +7 -0
- package/menubar/{FleetlensMenubar.app → Fleetlens.app}/Contents/_CodeSignature/CodeResources +22 -0
- package/package.json +18 -2
- package/app/apps/web/.next/server/chunks/[root-of-the-server]__123tfcb._.js +0 -3
- package/app/apps/web/.next/static/chunks/01ky0t_.38u4u.js +0 -14
- package/menubar/FleetlensMenubar.app/Contents/MacOS/FleetlensMenubar +0 -0
- /package/app/apps/web/.next/static/{yxbgwGc3dXx7HY0GSHJeG → mSM83A_ktoKiZ6y_p7wNk}/_buildManifest.js +0 -0
- /package/app/apps/web/.next/static/{yxbgwGc3dXx7HY0GSHJeG → mSM83A_ktoKiZ6y_p7wNk}/_clientMiddlewareManifest.js +0 -0
- /package/app/apps/web/.next/static/{yxbgwGc3dXx7HY0GSHJeG → mSM83A_ktoKiZ6y_p7wNk}/_ssgManifest.js +0 -0
- /package/menubar/{FleetlensMenubar.app → Fleetlens.app}/Contents/Resources/claude.svg +0 -0
- /package/menubar/{FleetlensMenubar.app → Fleetlens.app}/Contents/Resources/codex.svg +0 -0
- /package/menubar/{FleetlensMenubar.app → Fleetlens.app}/Contents/Resources/grok.svg +0 -0
- /package/menubar/{FleetlensMenubar.app → Fleetlens.app}/Contents/Resources/zai.svg +0 -0
package/dist/daemon-worker.js
CHANGED
|
@@ -8258,7 +8258,9 @@ function classifySkill(name) {
|
|
|
8258
8258
|
return "user";
|
|
8259
8259
|
}
|
|
8260
8260
|
var EXTERNAL_REF_PATTERNS = [
|
|
8261
|
-
|
|
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.
|
|
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.
|
|
18048
|
+
current: "1.0.0",
|
|
18042
18049
|
latest: null,
|
|
18043
18050
|
updateAvailable: false
|
|
18044
18051
|
};
|
|
18045
18052
|
return {
|
|
18046
|
-
current: "0.
|
|
18053
|
+
current: "1.0.0",
|
|
18047
18054
|
latest,
|
|
18048
|
-
updateAvailable: shouldUpdate("0.
|
|
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.
|
|
6244
|
+
return pkg.version ?? "1.0.0";
|
|
6245
6245
|
} catch {
|
|
6246
|
-
return "0.
|
|
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.
|
|
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(
|
|
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.
|
|
6698
|
+
} else if (verify.installedVersion !== "1.0.0") {
|
|
6698
6699
|
console.log(
|
|
6699
|
-
` \u2192 This process is still running ${"0.
|
|
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.
|
|
6735
|
+
current: "1.0.0",
|
|
6735
6736
|
latest: null,
|
|
6736
6737
|
updateAvailable: false
|
|
6737
6738
|
};
|
|
6738
6739
|
return {
|
|
6739
|
-
current: "0.
|
|
6740
|
+
current: "1.0.0",
|
|
6740
6741
|
latest,
|
|
6741
|
-
updateAvailable: shouldUpdate("0.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
|
19465
|
-
const script =
|
|
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 \`
|
|
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
|
|
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
|
|
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.
|
|
19608
|
-
open
|
|
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 = "
|
|
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.
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
11
|
+
<key>CFBundleDisplayName</key><string>Fleetlens</string>
|
|
12
12
|
<key>CFBundlePackageType</key><string>APPL</string>
|
|
13
|
-
<key>CFBundleShortVersionString</key><string>0.
|
|
14
|
-
<key>CFBundleVersion</key><string>0.
|
|
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/>
|
|
Binary file
|
|
Binary file
|
|
@@ -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>
|
package/menubar/{FleetlensMenubar.app → Fleetlens.app}/Contents/_CodeSignature/CodeResources
RENAMED
|
@@ -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.
|
|
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
|