fleetlens 0.6.0 → 0.6.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 (54) hide show
  1. package/app/apps/web/.next/BUILD_ID +1 -1
  2. package/app/apps/web/.next/build-manifest.json +3 -3
  3. package/app/apps/web/.next/prerender-manifest.json +3 -3
  4. package/app/apps/web/.next/server/app/_global-error.html +1 -1
  5. package/app/apps/web/.next/server/app/_global-error.rsc +1 -1
  6. package/app/apps/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  7. package/app/apps/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  8. package/app/apps/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  9. package/app/apps/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  10. package/app/apps/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  11. package/app/apps/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  12. package/app/apps/web/.next/server/app/day/[date]/page_client-reference-manifest.js +1 -1
  13. package/app/apps/web/.next/server/app/day/page_client-reference-manifest.js +1 -1
  14. package/app/apps/web/.next/server/app/digest/[date]/page_client-reference-manifest.js +1 -1
  15. package/app/apps/web/.next/server/app/digest/page_client-reference-manifest.js +1 -1
  16. package/app/apps/web/.next/server/app/insights/[key]/page_client-reference-manifest.js +1 -1
  17. package/app/apps/web/.next/server/app/insights/page_client-reference-manifest.js +1 -1
  18. package/app/apps/web/.next/server/app/page_client-reference-manifest.js +1 -1
  19. package/app/apps/web/.next/server/app/parallelism/page_client-reference-manifest.js +1 -1
  20. package/app/apps/web/.next/server/app/projects/[slug]/page_client-reference-manifest.js +1 -1
  21. package/app/apps/web/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  22. package/app/apps/web/.next/server/app/runs/page_client-reference-manifest.js +1 -1
  23. package/app/apps/web/.next/server/app/sessions/[id]/page_client-reference-manifest.js +1 -1
  24. package/app/apps/web/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  25. package/app/apps/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  26. package/app/apps/web/.next/server/app/usage/page_client-reference-manifest.js +1 -1
  27. package/app/apps/web/.next/server/chunks/node_modules_next_036my~r._.js +6 -6
  28. package/app/apps/web/.next/server/chunks/packages_entries_dist_node_0bckr7-.js +11 -11
  29. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0-1_njm._.js +1 -1
  30. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0wwa6gh._.js +1 -1
  31. package/app/apps/web/.next/server/chunks/ssr/_0xu2pvc._.js +1 -1
  32. package/app/apps/web/.next/server/chunks/ssr/apps_web_app_settings_ai-features-form_tsx_01p699p._.js +1 -1
  33. package/app/apps/web/.next/server/chunks/ssr/packages_entries_dist_node_0_271yr.js +1 -1
  34. package/app/apps/web/.next/server/middleware-build-manifest.js +3 -3
  35. package/app/apps/web/.next/server/pages/500.html +1 -1
  36. package/app/apps/web/.next/server/server-reference-manifest.js +1 -1
  37. package/app/apps/web/.next/server/server-reference-manifest.json +1 -1
  38. package/app/apps/web/.next/static/chunks/04m3slg_5ph02.js +1 -0
  39. package/app/apps/web/.next/static/chunks/0wfbj5zr~az.z.css +1 -0
  40. package/app/apps/web/app/api/settings/route.ts +8 -3
  41. package/app/apps/web/app/settings/ai-features-form.tsx +19 -1
  42. package/app/apps/web/app/settings/page.tsx +4 -1
  43. package/app/apps/web/lib/auto-week-fire.ts +1 -37
  44. package/app/apps/web/lib/validate-settings.ts +4 -1
  45. package/app/apps/web/package.json +1 -1
  46. package/app/apps/web/tsconfig.tsbuildinfo +1 -1
  47. package/dist/daemon-worker.js +7479 -74
  48. package/dist/index.js +97 -58
  49. package/package.json +2 -4
  50. package/app/apps/web/.next/static/chunks/0-yc2_pjxwwuq.js +0 -1
  51. package/app/apps/web/.next/static/chunks/0fs3gxea5h0s3.css +0 -1
  52. /package/app/apps/web/.next/static/{8tTWPvUhtatZEoocIhamh → MLK3PKEm3q_E_QuKH5kOz}/_buildManifest.js +0 -0
  53. /package/app/apps/web/.next/static/{8tTWPvUhtatZEoocIhamh → MLK3PKEm3q_E_QuKH5kOz}/_clientMiddlewareManifest.js +0 -0
  54. /package/app/apps/web/.next/static/{8tTWPvUhtatZEoocIhamh → MLK3PKEm3q_E_QuKH5kOz}/_ssgManifest.js +0 -0
package/dist/index.js CHANGED
@@ -454,9 +454,9 @@ Installed: ${PACKAGE_NAME}@${verify.installedVersion} at ${verify.installedPath
454
454
  console.warn(
455
455
  ` \u2022 reinstall in the correct Node env: 'npm install -g ${PACKAGE_NAME}@latest'`
456
456
  );
457
- } else if (verify.installedVersion !== "0.6.0") {
457
+ } else if (verify.installedVersion !== "0.6.2") {
458
458
  console.log(
459
- ` \u2192 This process is still running ${"0.6.0"}. Next invocation will use ${verify.installedVersion}.`
459
+ ` \u2192 This process is still running ${"0.6.2"}. Next invocation will use ${verify.installedVersion}.`
460
460
  );
461
461
  }
462
462
  }
@@ -492,7 +492,7 @@ async function checkForUpdate() {
492
492
  if (process.env.__FLEETLENS_UPDATED === "1" || process.env.__CCLENS_UPDATED === "1") return;
493
493
  const latest = await fetchLatestVersion();
494
494
  if (latest === null) return;
495
- const current = "0.6.0";
495
+ const current = "0.6.2";
496
496
  if (!shouldUpdate(current, latest)) return;
497
497
  console.log(`Updating ${PACKAGE_NAME} ${current} \u2192 ${latest}...`);
498
498
  await stopRunningServices();
@@ -574,7 +574,7 @@ async function restartServices(state) {
574
574
  }
575
575
  async function forceUpdate() {
576
576
  const latest = await fetchLatestVersion();
577
- const current = "0.6.0";
577
+ const current = "0.6.2";
578
578
  if (latest === null) {
579
579
  console.error("Could not reach npm registry. Check your network.");
580
580
  process.exit(1);
@@ -8697,7 +8697,8 @@ function toDisk(s) {
8697
8697
  ai_features: {
8698
8698
  enabled: s.ai_features.enabled,
8699
8699
  model: s.ai_features.model,
8700
- monthly_budget_usd: s.ai_features.monthlyBudgetUsd
8700
+ monthly_budget_usd: s.ai_features.monthlyBudgetUsd,
8701
+ auto_backfill_last_week: s.ai_features.autoBackfillLastWeek
8701
8702
  }
8702
8703
  };
8703
8704
  }
@@ -8707,7 +8708,8 @@ function fromDisk(d) {
8707
8708
  ai_features: {
8708
8709
  enabled: af.enabled ?? DEFAULT_SETTINGS.ai_features.enabled,
8709
8710
  model: af.model ?? DEFAULT_SETTINGS.ai_features.model,
8710
- monthlyBudgetUsd: af.monthly_budget_usd ?? null
8711
+ monthlyBudgetUsd: af.monthly_budget_usd ?? null,
8712
+ autoBackfillLastWeek: af.auto_backfill_last_week ?? DEFAULT_SETTINGS.ai_features.autoBackfillLastWeek
8711
8713
  }
8712
8714
  };
8713
8715
  }
@@ -8740,7 +8742,8 @@ var init_settings = __esm({
8740
8742
  ai_features: {
8741
8743
  enabled: true,
8742
8744
  model: "sonnet",
8743
- monthlyBudgetUsd: null
8745
+ monthlyBudgetUsd: null,
8746
+ autoBackfillLastWeek: true
8744
8747
  }
8745
8748
  };
8746
8749
  settingsPathCached = null;
@@ -12294,6 +12297,40 @@ var init_digest_month_pipeline = __esm({
12294
12297
  }
12295
12298
  });
12296
12299
 
12300
+ // ../entries/dist/auto-week-fire.js
12301
+ import { existsSync as existsSync11, readFileSync as readFileSync11, mkdirSync as mkdirSync8, renameSync as renameSync4, writeFileSync as writeFileSync7 } from "node:fs";
12302
+ import { join as join12, dirname as dirname9 } from "node:path";
12303
+ import { homedir as homedir11 } from "node:os";
12304
+ function autoFireFile() {
12305
+ return process.env.CCLENS_AUTO_WEEK_FILE ?? join12(homedir11(), ".cclens", "auto-week-fired-at");
12306
+ }
12307
+ function shouldAutoFireWeek(monday) {
12308
+ const file = autoFireFile();
12309
+ let prev = null;
12310
+ if (existsSync11(file)) {
12311
+ try {
12312
+ const raw = readFileSync11(file, "utf8").trim();
12313
+ if (MONDAY_RE.test(raw))
12314
+ prev = raw;
12315
+ } catch {
12316
+ }
12317
+ }
12318
+ if (prev === monday)
12319
+ return false;
12320
+ mkdirSync8(dirname9(file), { recursive: true });
12321
+ const tmp = `${file}.tmp`;
12322
+ writeFileSync7(tmp, monday + "\n", "utf8");
12323
+ renameSync4(tmp, file);
12324
+ return true;
12325
+ }
12326
+ var MONDAY_RE;
12327
+ var init_auto_week_fire = __esm({
12328
+ "../entries/dist/auto-week-fire.js"() {
12329
+ "use strict";
12330
+ MONDAY_RE = /^\d{4}-\d{2}-\d{2}$/;
12331
+ }
12332
+ });
12333
+
12297
12334
  // ../entries/dist/node.js
12298
12335
  var node_exports = {};
12299
12336
  __export(node_exports, {
@@ -12347,6 +12384,7 @@ __export(node_exports, {
12347
12384
  setCurrentMonthDigestInCache: () => setCurrentMonthDigestInCache,
12348
12385
  setCurrentWeekDigestInCache: () => setCurrentWeekDigestInCache,
12349
12386
  setTodayDigestInCache: () => setTodayDigestInCache,
12387
+ shouldAutoFireWeek: () => shouldAutoFireWeek,
12350
12388
  weekDates: () => weekDates,
12351
12389
  writeDayDigest: () => writeDayDigest,
12352
12390
  writeInteractiveLock: () => writeInteractiveLock,
@@ -12372,6 +12410,7 @@ var init_node = __esm({
12372
12410
  init_digest_month();
12373
12411
  init_digest_week_pipeline();
12374
12412
  init_digest_month_pipeline();
12413
+ init_auto_week_fire();
12375
12414
  init_digest_fs();
12376
12415
  }
12377
12416
  });
@@ -12843,23 +12882,23 @@ var init_digest = __esm({
12843
12882
  });
12844
12883
 
12845
12884
  // src/team/config.ts
12846
- import { readFileSync as readFileSync11, writeFileSync as writeFileSync7, unlinkSync as unlinkSync3, mkdirSync as mkdirSync8 } from "node:fs";
12847
- import { join as join12 } from "node:path";
12848
- import { homedir as homedir11 } from "node:os";
12885
+ import { readFileSync as readFileSync12, writeFileSync as writeFileSync8, unlinkSync as unlinkSync3, mkdirSync as mkdirSync9 } from "node:fs";
12886
+ import { join as join13 } from "node:path";
12887
+ import { homedir as homedir12 } from "node:os";
12849
12888
  function readTeamConfig(dir = DEFAULT_DIR) {
12850
12889
  try {
12851
- return JSON.parse(readFileSync11(join12(dir, CONFIG_FILE), "utf8"));
12890
+ return JSON.parse(readFileSync12(join13(dir, CONFIG_FILE), "utf8"));
12852
12891
  } catch {
12853
12892
  return null;
12854
12893
  }
12855
12894
  }
12856
12895
  function writeTeamConfig(config, dir = DEFAULT_DIR) {
12857
- mkdirSync8(dir, { recursive: true });
12858
- writeFileSync7(join12(dir, CONFIG_FILE), JSON.stringify(config, null, 2), { mode: 384 });
12896
+ mkdirSync9(dir, { recursive: true });
12897
+ writeFileSync8(join13(dir, CONFIG_FILE), JSON.stringify(config, null, 2), { mode: 384 });
12859
12898
  }
12860
12899
  function clearTeamConfig(dir = DEFAULT_DIR) {
12861
12900
  try {
12862
- unlinkSync3(join12(dir, CONFIG_FILE));
12901
+ unlinkSync3(join13(dir, CONFIG_FILE));
12863
12902
  } catch {
12864
12903
  }
12865
12904
  }
@@ -12867,14 +12906,14 @@ var DEFAULT_DIR, CONFIG_FILE;
12867
12906
  var init_config = __esm({
12868
12907
  "src/team/config.ts"() {
12869
12908
  "use strict";
12870
- DEFAULT_DIR = join12(homedir11(), ".cclens");
12909
+ DEFAULT_DIR = join13(homedir12(), ".cclens");
12871
12910
  CONFIG_FILE = "team.json";
12872
12911
  }
12873
12912
  });
12874
12913
 
12875
12914
  // src/usage/profile.ts
12876
- import { existsSync as existsSync11, mkdirSync as mkdirSync9, readFileSync as readFileSync12, writeFileSync as writeFileSync8 } from "node:fs";
12877
- import { dirname as dirname9 } from "node:path";
12915
+ import { existsSync as existsSync12, mkdirSync as mkdirSync10, readFileSync as readFileSync13, writeFileSync as writeFileSync9 } from "node:fs";
12916
+ import { dirname as dirname10 } from "node:path";
12878
12917
  function mapRateLimitTier(rateLimitTier) {
12879
12918
  switch (rateLimitTier) {
12880
12919
  case "default_claude_pro":
@@ -12914,9 +12953,9 @@ async function fetchProfile(nowMs = Date.now()) {
12914
12953
  };
12915
12954
  }
12916
12955
  function readCachedProfile(cachePath) {
12917
- if (!existsSync11(cachePath)) return null;
12956
+ if (!existsSync12(cachePath)) return null;
12918
12957
  try {
12919
- const raw = JSON.parse(readFileSync12(cachePath, "utf8"));
12958
+ const raw = JSON.parse(readFileSync13(cachePath, "utf8"));
12920
12959
  if (typeof raw.fetchedAtMs !== "number" || !raw.profile) return null;
12921
12960
  return raw;
12922
12961
  } catch {
@@ -12924,8 +12963,8 @@ function readCachedProfile(cachePath) {
12924
12963
  }
12925
12964
  }
12926
12965
  function writeCachedProfile(cachePath, profile, nowMs = Date.now()) {
12927
- mkdirSync9(dirname9(cachePath), { recursive: true });
12928
- writeFileSync8(
12966
+ mkdirSync10(dirname10(cachePath), { recursive: true });
12967
+ writeFileSync9(
12929
12968
  cachePath,
12930
12969
  JSON.stringify({ fetchedAtMs: nowMs, profile }, null, 2),
12931
12970
  { mode: 384 }
@@ -12960,8 +12999,8 @@ __export(backfill_exports, {
12960
12999
  chunk: () => chunk,
12961
13000
  runTeamBackfill: () => runTeamBackfill
12962
13001
  });
12963
- import { homedir as homedir12 } from "node:os";
12964
- import { join as join13 } from "node:path";
13002
+ import { homedir as homedir13 } from "node:os";
13003
+ import { join as join14 } from "node:path";
12965
13004
  function rawToWire(raw) {
12966
13005
  const win = (w) => w ? { utilization: w.utilization, resetsAt: w.resets_at } : null;
12967
13006
  return {
@@ -13068,8 +13107,8 @@ var init_backfill = __esm({
13068
13107
  init_storage();
13069
13108
  init_config();
13070
13109
  init_profile();
13071
- USAGE_LOG4 = join13(homedir12(), ".cclens", "usage.jsonl");
13072
- PROFILE_CACHE = join13(homedir12(), ".cclens", "profile.json");
13110
+ USAGE_LOG4 = join14(homedir13(), ".cclens", "usage.jsonl");
13111
+ PROFILE_CACHE = join14(homedir13(), ".cclens", "profile.json");
13073
13112
  BATCH_SIZE = 500;
13074
13113
  noopLog = () => {
13075
13114
  };
@@ -13156,11 +13195,11 @@ var init_push = __esm({
13156
13195
  });
13157
13196
 
13158
13197
  // src/team/queue.ts
13159
- import { readFileSync as readFileSync13, writeFileSync as writeFileSync9, appendFileSync as appendFileSync4, statSync as statSync3, mkdirSync as mkdirSync10 } from "node:fs";
13160
- import { join as join14, dirname as dirname10 } from "node:path";
13161
- import { homedir as homedir13 } from "node:os";
13198
+ import { readFileSync as readFileSync14, writeFileSync as writeFileSync10, appendFileSync as appendFileSync4, statSync as statSync3, mkdirSync as mkdirSync11 } from "node:fs";
13199
+ import { join as join15, dirname as dirname11 } from "node:path";
13200
+ import { homedir as homedir14 } from "node:os";
13162
13201
  function enqueuePayload(payload, queuePath = QUEUE_PATH) {
13163
- mkdirSync10(dirname10(queuePath), { recursive: true });
13202
+ mkdirSync11(dirname11(queuePath), { recursive: true });
13164
13203
  const entry = { payload, enqueuedAt: (/* @__PURE__ */ new Date()).toISOString() };
13165
13204
  appendFileSync4(queuePath, JSON.stringify(entry) + "\n", "utf8");
13166
13205
  try {
@@ -13174,7 +13213,7 @@ function enqueuePayload(payload, queuePath = QUEUE_PATH) {
13174
13213
  function dequeuePayloads(queuePath = QUEUE_PATH) {
13175
13214
  let lines;
13176
13215
  try {
13177
- lines = readFileSync13(queuePath, "utf8").trim().split("\n").filter(Boolean);
13216
+ lines = readFileSync14(queuePath, "utf8").trim().split("\n").filter(Boolean);
13178
13217
  } catch {
13179
13218
  return [];
13180
13219
  }
@@ -13189,24 +13228,24 @@ function dequeuePayloads(queuePath = QUEUE_PATH) {
13189
13228
  } catch {
13190
13229
  }
13191
13230
  }
13192
- writeFileSync9(queuePath, "", "utf8");
13231
+ writeFileSync10(queuePath, "", "utf8");
13193
13232
  return valid.map((e) => e.payload);
13194
13233
  }
13195
13234
  function pruneOldest(queuePath) {
13196
13235
  let lines;
13197
13236
  try {
13198
- lines = readFileSync13(queuePath, "utf8").trim().split("\n").filter(Boolean);
13237
+ lines = readFileSync14(queuePath, "utf8").trim().split("\n").filter(Boolean);
13199
13238
  } catch {
13200
13239
  return;
13201
13240
  }
13202
13241
  const keep = lines.slice(Math.floor(lines.length / 2));
13203
- writeFileSync9(queuePath, keep.join("\n") + "\n", "utf8");
13242
+ writeFileSync10(queuePath, keep.join("\n") + "\n", "utf8");
13204
13243
  }
13205
13244
  var QUEUE_PATH, MAX_SIZE_BYTES, MAX_AGE_MS;
13206
13245
  var init_queue2 = __esm({
13207
13246
  "src/team/queue.ts"() {
13208
13247
  "use strict";
13209
- QUEUE_PATH = join14(homedir13(), ".cclens", "ingest-queue.jsonl");
13248
+ QUEUE_PATH = join15(homedir14(), ".cclens", "ingest-queue.jsonl");
13210
13249
  MAX_SIZE_BYTES = 10 * 1024 * 1024;
13211
13250
  MAX_AGE_MS = 7 * 24 * 60 * 60 * 1e3;
13212
13251
  }
@@ -13217,8 +13256,8 @@ var sync_exports = {};
13217
13256
  __export(sync_exports, {
13218
13257
  runTeamSync: () => runTeamSync
13219
13258
  });
13220
- import { homedir as homedir14 } from "node:os";
13221
- import { join as join15 } from "node:path";
13259
+ import { homedir as homedir15 } from "node:os";
13260
+ import { join as join16 } from "node:path";
13222
13261
  async function runTeamSync(log = noopLog2, configOverride) {
13223
13262
  const config = configOverride === void 0 ? readTeamConfig() : configOverride;
13224
13263
  if (!config) return { paired: false, pushed: 0, queued: 0, queuedDrained: 0 };
@@ -13362,8 +13401,8 @@ var init_sync = __esm({
13362
13401
  init_push();
13363
13402
  init_queue2();
13364
13403
  init_profile();
13365
- USAGE_LOG5 = join15(homedir14(), ".cclens", "usage.jsonl");
13366
- PROFILE_CACHE2 = join15(homedir14(), ".cclens", "profile.json");
13404
+ USAGE_LOG5 = join16(homedir15(), ".cclens", "usage.jsonl");
13405
+ PROFILE_CACHE2 = join16(homedir15(), ".cclens", "profile.json");
13367
13406
  noopLog2 = () => {
13368
13407
  };
13369
13408
  }
@@ -13508,13 +13547,13 @@ var logs_exports = {};
13508
13547
  __export(logs_exports, {
13509
13548
  teamLogs: () => teamLogs
13510
13549
  });
13511
- import { readFileSync as readFileSync14 } from "node:fs";
13512
- import { join as join16 } from "node:path";
13513
- import { homedir as homedir15 } from "node:os";
13550
+ import { readFileSync as readFileSync15 } from "node:fs";
13551
+ import { join as join17 } from "node:path";
13552
+ import { homedir as homedir16 } from "node:os";
13514
13553
  async function teamLogs() {
13515
- const logPath = join16(homedir15(), ".cclens", "daemon.log");
13554
+ const logPath = join17(homedir16(), ".cclens", "daemon.log");
13516
13555
  try {
13517
- const lines = readFileSync14(logPath, "utf8").trim().split("\n");
13556
+ const lines = readFileSync15(logPath, "utf8").trim().split("\n");
13518
13557
  const teamLines = lines.filter((l) => l.includes("team "));
13519
13558
  if (teamLines.length === 0) {
13520
13559
  console.log("No team-related log entries found.");
@@ -13610,9 +13649,9 @@ __export(runs_exports, {
13610
13649
  runs: () => runs
13611
13650
  });
13612
13651
  import { execSync as execSync2 } from "node:child_process";
13613
- import { existsSync as existsSync12, readFileSync as readFileSync15, readdirSync as readdirSync3, statSync as statSync4 } from "node:fs";
13614
- import { homedir as homedir16 } from "node:os";
13615
- import { join as join17 } from "node:path";
13652
+ import { existsSync as existsSync13, readFileSync as readFileSync16, readdirSync as readdirSync3, statSync as statSync4 } from "node:fs";
13653
+ import { homedir as homedir17 } from "node:os";
13654
+ import { join as join18 } from "node:path";
13616
13655
  async function runs(args2) {
13617
13656
  const json = args2.includes("--json");
13618
13657
  const watch = args2.includes("--watch");
@@ -13696,8 +13735,8 @@ function listActiveRuns() {
13696
13735
  return runs2.sort((a, b) => a.elapsed_s - b.elapsed_s);
13697
13736
  }
13698
13737
  function readSpend(sinceMs) {
13699
- if (!existsSync12(SPEND_PATH)) return [];
13700
- const lines = readFileSync15(SPEND_PATH, "utf-8").split("\n").filter((l) => l.trim());
13738
+ if (!existsSync13(SPEND_PATH)) return [];
13739
+ const lines = readFileSync16(SPEND_PATH, "utf-8").split("\n").filter((l) => l.trim());
13701
13740
  const out = [];
13702
13741
  for (const line of lines) {
13703
13742
  try {
@@ -13818,23 +13857,23 @@ function ageLabel(ms) {
13818
13857
  return `${Math.floor(ms / 864e5)}d`;
13819
13858
  }
13820
13859
  function listTraceFiles() {
13821
- if (!existsSync12(RUNS_DIR2)) return [];
13860
+ if (!existsSync13(RUNS_DIR2)) return [];
13822
13861
  const entries2 = readdirSync3(RUNS_DIR2).filter((f) => f.endsWith(".jsonl"));
13823
13862
  return entries2.map((f) => {
13824
- const path2 = join17(RUNS_DIR2, f);
13863
+ const path2 = join18(RUNS_DIR2, f);
13825
13864
  const st = statSync4(path2);
13826
13865
  return { runId: f.replace(/\.jsonl$/, ""), path: path2, mtimeMs: st.mtimeMs };
13827
13866
  }).sort((a, b) => b.mtimeMs - a.mtimeMs);
13828
13867
  }
13829
13868
  function resolveRunId(arg) {
13830
- if (!existsSync12(RUNS_DIR2)) return null;
13869
+ if (!existsSync13(RUNS_DIR2)) return null;
13831
13870
  if (arg === "latest") {
13832
13871
  const all2 = listTraceFiles();
13833
13872
  if (all2.length === 0) return null;
13834
13873
  return { runId: all2[0].runId, path: all2[0].path };
13835
13874
  }
13836
- const exact = join17(RUNS_DIR2, `${arg}.jsonl`);
13837
- if (existsSync12(exact)) return { runId: arg, path: exact };
13875
+ const exact = join18(RUNS_DIR2, `${arg}.jsonl`);
13876
+ if (existsSync13(exact)) return { runId: arg, path: exact };
13838
13877
  const all = listTraceFiles();
13839
13878
  const matches = all.filter((r) => r.runId.includes(arg));
13840
13879
  if (matches.length === 1) return { runId: matches[0].runId, path: matches[0].path };
@@ -13846,7 +13885,7 @@ function resolveRunId(arg) {
13846
13885
  return null;
13847
13886
  }
13848
13887
  function readTrace(path2) {
13849
- return readFileSync15(path2, "utf-8").split("\n").filter((l) => l.trim()).map((l) => {
13888
+ return readFileSync16(path2, "utf-8").split("\n").filter((l) => l.trim()).map((l) => {
13850
13889
  try {
13851
13890
  return JSON.parse(l);
13852
13891
  } catch {
@@ -13858,7 +13897,7 @@ async function inspect(arg, follow, json) {
13858
13897
  const r = resolveRunId(arg);
13859
13898
  if (!r) {
13860
13899
  console.error(`run not found: ${arg}`);
13861
- if (existsSync12(RUNS_DIR2)) {
13900
+ if (existsSync13(RUNS_DIR2)) {
13862
13901
  const all = listTraceFiles().slice(0, 5);
13863
13902
  if (all.length > 0) {
13864
13903
  console.error(`
@@ -13959,8 +13998,8 @@ var init_runs = __esm({
13959
13998
  { kind: "day_digest", marker: /single local day into a short, honest narrative/i },
13960
13999
  { kind: "entry_enrich", marker: /per[- ]entry|enrich.{0,40}entry|brief_summary/i }
13961
14000
  ];
13962
- SPEND_PATH = join17(homedir16(), ".cclens", "llm-spend.jsonl");
13963
- RUNS_DIR2 = join17(homedir16(), ".cclens", "llm-runs");
14001
+ SPEND_PATH = join18(homedir17(), ".cclens", "llm-spend.jsonl");
14002
+ RUNS_DIR2 = join18(homedir17(), ".cclens", "llm-runs");
13964
14003
  }
13965
14004
  });
13966
14005
 
@@ -14027,7 +14066,7 @@ async function main() {
14027
14066
  case "version":
14028
14067
  case "--version":
14029
14068
  case "-v":
14030
- console.log(`fleetlens ${"0.6.0"}`);
14069
+ console.log(`fleetlens ${"0.6.2"}`);
14031
14070
  break;
14032
14071
  case "help":
14033
14072
  case "--help":
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fleetlens",
3
- "version": "0.6.0",
3
+ "version": "0.6.2",
4
4
  "description": "fleetlens — local-only dashboard and usage tracker for Claude Code sessions and agent fleets",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -21,10 +21,8 @@
21
21
  "test:coverage": "vitest run --coverage",
22
22
  "lint": "eslint"
23
23
  },
24
- "dependencies": {
25
- "@claude-lens/entries": "workspace:*"
26
- },
27
24
  "devDependencies": {
25
+ "@claude-lens/entries": "workspace:*",
28
26
  "@claude-lens/parser": "workspace:*",
29
27
  "@types/node": "^20.11.0",
30
28
  "@vitest/coverage-v8": "^2.1.9",
@@ -1 +0,0 @@
1
- (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,55700,e=>{"use strict";var t=e.i(18050),s=e.i(71645);e.s(["AiFeaturesForm",0,function({initial:e}){let[a,n]=(0,s.useState)(e.enabled),[i,c]=(0,s.useState)(!1),[l,r]=(0,s.useState)(null);async function o(e){e.preventDefault(),c(!0),r(null);let t=await fetch("/api/settings",{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({ai_features:{enabled:a}})});c(!1),r(t.ok?"Saved.":`Error: ${t.status}`)}return(0,t.jsxs)("form",{onSubmit:o,className:"space-y-4",children:[(0,t.jsxs)("label",{className:"flex items-center gap-2",children:[(0,t.jsx)("input",{type:"checkbox",checked:a,onChange:e=>n(e.target.checked)}),(0,t.jsx)("span",{children:"Enable AI digests and enrichment"})]}),(0,t.jsx)("button",{type:"submit",disabled:i,className:"px-3 py-1 border rounded bg-black text-white disabled:opacity-60",children:i?"Saving…":"Save"}),l&&(0,t.jsx)("p",{className:"text-sm",children:l})]})}])}]);
@@ -1 +0,0 @@
1
- @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-ease:initial}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", sans-serif;--font-mono:"SF Mono", "Fira Code", "JetBrains Mono", "Cascadia Code", monospace;--color-gray-500:#6a7282;--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-2xl:42rem;--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--font-weight-medium:500;--font-weight-semibold:600;--ease-out:cubic-bezier(0, 0, .2, 1);--ease-in-out:cubic-bezier(.4, 0, .2, 1);--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", sans-serif;--default-mono-font-family:"SF Mono", "Fira Code", "JetBrains Mono", "Cascadia Code", monospace}@supports (color:lab(0% 0 0)){:root,:host{--color-gray-500:lab(47.7841% -.393182 -10.0268)}}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.sticky{position:sticky}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.mx-auto{margin-inline:auto}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.max-w-2xl{max-width:var(--container-2xl)}.shrink{flex-shrink:1}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.resize{resize:both}.items-baseline{align-items:baseline}.items-center{align-items:center}.gap-2{gap:calc(var(--spacing) * 2)}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.rounded{border-radius:.25rem}.border{border-style:var(--tw-border-style);border-width:1px}.bg-black{background-color:var(--color-black)}.p-6{padding:calc(var(--spacing) * 6)}.px-3{padding-inline:calc(var(--spacing) * 3)}.py-1{padding-block:calc(var(--spacing) * 1)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.break-all{word-break:break-all}.text-gray-500{color:var(--color-gray-500)}.text-white{color:var(--color-white)}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.line-through{text-decoration-line:line-through}.underline{text-decoration-line:underline}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.disabled\:opacity-60:disabled{opacity:.6}}:root,[data-theme=dark]{--background:#1a1a1f;--foreground:#e8e8f0;--af-accent:#2dd4bf;--af-accent-hover:#5eead4;--af-accent-subtle:#2dd4bf1f;--af-success:#34d399;--af-success-subtle:#34d3991f;--af-warning:#fbbf24;--af-warning-subtle:#fbbf241a;--af-danger:#f87171;--af-danger-subtle:#f871711f;--af-info:#a78bfa;--af-info-subtle:#a78bfa1f;--af-surface:#2c2c33;--af-surface-hover:#333340;--af-surface-elevated:#38384a;--af-border-subtle:#2f2f38;--af-text:#e8e8f0;--af-text-secondary:#9090a0;--af-text-tertiary:#707078;--af-heatmap-0:#2f2f38;--af-heatmap-1:#2dd4bf2e;--af-heatmap-2:#2dd4bf59;--af-heatmap-3:#2dd4bf99;--af-heatmap-4:#2dd4bfe6}[data-theme=light]{--background:#fdfbf9;--foreground:#1a1a1a;--af-accent:#14b8a6;--af-accent-hover:#0d9488;--af-accent-subtle:#14b8a61f;--af-success:#059669;--af-success-subtle:#0596691f;--af-warning:#d97706;--af-warning-subtle:#d977061f;--af-danger:#c53030;--af-danger-subtle:#c530301f;--af-info:#8168e0;--af-info-subtle:#8168e01f;--af-surface:#f5f1ec;--af-surface-hover:#ede8e0;--af-surface-elevated:#e8e2da;--af-border-subtle:#e8e2da;--af-text:#1a1a1a;--af-text-secondary:#5a544e;--af-text-tertiary:#8a8580;--af-heatmap-0:#ede8e0;--af-heatmap-1:#14b8a638;--af-heatmap-2:#14b8a666;--af-heatmap-3:#14b8a6a6;--af-heatmap-4:#14b8a6f2}html,body{background:var(--background);color:var(--foreground);font-family:var(--font-sans);-webkit-font-smoothing:antialiased;margin:0;padding:0;font-size:14px;line-height:1.6}body{min-height:100vh}a{color:inherit;text-decoration:none}button{cursor:pointer;font-family:inherit}input,select,textarea{font-family:inherit}input:not([type=checkbox]):not([type=radio]),select,textarea{background:var(--background);border:1px solid var(--af-border-subtle);color:var(--af-text);border-radius:8px;outline:none;padding:9px 12px;font-size:13px;transition:border-color .15s}input:not([type=checkbox]):not([type=radio]):focus,select:focus,textarea:focus{border-color:var(--af-accent);box-shadow:0 0 0 3px var(--af-accent-subtle)}input::placeholder{color:var(--af-text-tertiary)}.sl-compact-select{border-radius:6px!important;height:32px!important;padding:4px 28px 4px 10px!important;font-size:12px!important}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:var(--af-border-subtle);border-radius:4px}::-webkit-scrollbar-thumb:hover{background:var(--af-surface-elevated)}.af-panel{background:var(--af-surface);border:1px solid var(--af-border-subtle);border-radius:12px;overflow:hidden}.af-panel-header{border-bottom:1px solid var(--af-border-subtle);align-items:center;gap:6px;padding:14px 18px;font-size:13px;font-weight:600;display:flex}.af-tag{border:none;border-radius:100px;padding:3px 10px;font-size:11px;font-weight:500;display:inline-block}.af-tag-default{background:var(--af-border-subtle);color:var(--af-text-secondary)}.af-tag-accent{background:var(--af-accent-subtle);color:var(--af-accent)}.af-tag-success{background:var(--af-success-subtle);color:var(--af-success)}.af-tag-warning{background:var(--af-warning-subtle);color:var(--af-warning)}.af-tag-danger{background:var(--af-danger-subtle);color:var(--af-danger)}.af-empty{text-align:center;color:var(--af-text-tertiary);padding:48px 32px;font-size:13px}.af-tabs{background:var(--background);border-radius:8px;gap:2px;padding:3px;display:inline-flex}.af-tab-btn{color:var(--af-text-secondary);cursor:pointer;background:0 0;border:none;border-radius:6px;padding:7px 18px;font-family:inherit;font-size:13px;font-weight:500;transition:all .15s}.af-tab-btn:hover{color:var(--af-text)}.af-tab-btn.active{background:var(--af-surface-elevated);color:var(--af-text);box-shadow:0 1px 3px #0003}.flex{display:flex}.items-center{align-items:center}.items-baseline{align-items:baseline}.af-card{background:var(--af-surface);border:1px solid var(--af-border-subtle);border-radius:12px;padding:18px 20px;transition:border-color .12s}.af-card:hover{border-color:var(--af-surface-elevated)}.sl-prose{color:var(--af-text);word-break:break-word;font-size:13.5px;line-height:1.65}.sl-prose>:first-child{margin-top:0}.sl-prose>:last-child{margin-bottom:0}.sl-prose h1,.sl-prose h2,.sl-prose h3,.sl-prose h4{letter-spacing:-.01em;color:var(--af-text);margin:18px 0 8px;font-weight:700;line-height:1.25}.sl-prose h1{border-bottom:1px solid var(--af-border-subtle);padding-bottom:6px;font-size:20px}.sl-prose h2{font-size:16px}.sl-prose h3{font-size:14px}.sl-prose h4{color:var(--af-text-secondary);font-size:13px}.sl-prose p{margin:10px 0}.sl-prose strong{color:var(--af-text);font-weight:600}.sl-prose em{color:var(--af-text);font-style:italic}.sl-prose ul,.sl-prose ol{margin:10px 0;padding-left:22px}.sl-prose ul{list-style-type:disc}.sl-prose ol{list-style-type:decimal}.sl-prose li,.sl-prose li>p{margin:4px 0}.sl-prose blockquote{border-left:3px solid var(--af-accent);color:var(--af-text-secondary);background:var(--af-accent-subtle);border-radius:0 6px 6px 0;margin:12px 0;padding:4px 14px}.sl-prose code{font-family:var(--font-mono);background:var(--af-border-subtle);color:var(--af-text);border-radius:4px;padding:1px 5px;font-size:12px}.sl-prose pre{background:var(--background);border:1px solid var(--af-border-subtle);border-radius:8px;margin:12px 0;padding:12px 14px;font-size:12px;line-height:1.55;overflow-x:auto}.sl-prose pre code{font-size:inherit;background:0 0;border-radius:0;padding:0}.sl-prose table{border-collapse:collapse;width:100%;margin:12px 0;font-size:12px}.sl-prose th,.sl-prose td{border:1px solid var(--af-border-subtle);text-align:left;padding:6px 10px}.sl-prose th{background:var(--af-surface-hover);font-weight:600}.sl-prose hr{border:none;border-top:1px solid var(--af-border-subtle);margin:16px 0}.sl-prose a{color:var(--af-accent);text-underline-offset:2px;text-decoration:underline}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}