fleetlens 0.16.2 → 0.16.4

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 (61) 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/agent/page_client-reference-manifest.js +1 -1
  13. package/app/apps/web/.next/server/app/changelog/page_client-reference-manifest.js +1 -1
  14. package/app/apps/web/.next/server/app/day/[date]/page_client-reference-manifest.js +1 -1
  15. package/app/apps/web/.next/server/app/day/page_client-reference-manifest.js +1 -1
  16. package/app/apps/web/.next/server/app/digest/[date]/page_client-reference-manifest.js +1 -1
  17. package/app/apps/web/.next/server/app/digest/page_client-reference-manifest.js +1 -1
  18. package/app/apps/web/.next/server/app/insights/[key]/page_client-reference-manifest.js +1 -1
  19. package/app/apps/web/.next/server/app/insights/page_client-reference-manifest.js +1 -1
  20. package/app/apps/web/.next/server/app/page_client-reference-manifest.js +1 -1
  21. package/app/apps/web/.next/server/app/parallelism/page_client-reference-manifest.js +1 -1
  22. package/app/apps/web/.next/server/app/print/[key]/page_client-reference-manifest.js +1 -1
  23. package/app/apps/web/.next/server/app/projects/[slug]/page_client-reference-manifest.js +1 -1
  24. package/app/apps/web/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  25. package/app/apps/web/.next/server/app/runs/page_client-reference-manifest.js +1 -1
  26. package/app/apps/web/.next/server/app/sessions/[id]/page_client-reference-manifest.js +1 -1
  27. package/app/apps/web/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  28. package/app/apps/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  29. package/app/apps/web/.next/server/app/team/onboarding/page_client-reference-manifest.js +1 -1
  30. package/app/apps/web/.next/server/app/team/page_client-reference-manifest.js +1 -1
  31. package/app/apps/web/.next/server/app/usage/page_client-reference-manifest.js +1 -1
  32. package/app/apps/web/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0sr4wr_.js +1 -1
  33. package/app/apps/web/.next/server/chunks/packages_parser_dist_06d9se1._.js +1 -1
  34. package/app/apps/web/.next/server/chunks/packages_parser_dist_10ihc3~._.js +1 -1
  35. package/app/apps/web/.next/server/chunks/ssr/_0k8yioi._.js +1 -1
  36. package/app/apps/web/.next/server/chunks/ssr/apps_web_0epqfet._.js +1 -1
  37. package/app/apps/web/.next/server/chunks/ssr/apps_web_lib_changelog_ts_0n7_p1d._.js +1 -1
  38. package/app/apps/web/.next/server/chunks/ssr/apps_web_lib_changelog_ts_0nb5_-s._.js +1 -1
  39. package/app/apps/web/.next/server/chunks/ssr/packages_parser_dist_0mx_509._.js +1 -1
  40. package/app/apps/web/.next/server/middleware-build-manifest.js +3 -3
  41. package/app/apps/web/.next/server/middleware-manifest.json +5 -5
  42. package/app/apps/web/.next/server/pages/500.html +1 -1
  43. package/app/apps/web/.next/server/server-reference-manifest.js +1 -1
  44. package/app/apps/web/.next/server/server-reference-manifest.json +1 -1
  45. package/app/apps/web/.next/static/chunks/13hdlcc0bj_zt.js +14 -0
  46. package/app/apps/web/.next/static/chunks/16gca31.pi4.o.css +1 -0
  47. package/app/apps/web/app/globals.css +19 -9
  48. package/app/apps/web/app/usage/page.tsx +27 -1
  49. package/app/apps/web/lib/changelog-data.generated.ts +1 -1
  50. package/app/apps/web/package.json +1 -1
  51. package/app/apps/web/tsconfig.tsbuildinfo +1 -1
  52. package/dist/daemon-worker.js +46 -21
  53. package/dist/index.js +51 -28
  54. package/menubar/FleetlensMenubar.app/Contents/Info.plist +2 -2
  55. package/menubar/FleetlensMenubar.app/Contents/MacOS/FleetlensMenubar +0 -0
  56. package/package.json +1 -1
  57. package/app/apps/web/.next/static/chunks/0d~7p_ye7v7_5.css +0 -1
  58. package/app/apps/web/.next/static/chunks/0jes0m38a9ib_.js +0 -14
  59. /package/app/apps/web/.next/static/{q_fQaCe85j7F9VawBRe81 → cKCY-h3trXN9_kNrMfxWd}/_buildManifest.js +0 -0
  60. /package/app/apps/web/.next/static/{q_fQaCe85j7F9VawBRe81 → cKCY-h3trXN9_kNrMfxWd}/_clientMiddlewareManifest.js +0 -0
  61. /package/app/apps/web/.next/static/{q_fQaCe85j7F9VawBRe81 → cKCY-h3trXN9_kNrMfxWd}/_ssgManifest.js +0 -0
@@ -3219,6 +3219,15 @@ async function getCodexSession(id, opts = {}) {
3219
3219
  function hasUsableRateLimitWindows(primary, secondary) {
3220
3220
  return numberOf(primary?.used_percent) !== void 0 || numberOf(secondary?.used_percent) !== void 0;
3221
3221
  }
3222
+ function normalizeCodexWindow(raw, nowMs) {
3223
+ const usedPercent = numberOf(raw?.used_percent);
3224
+ const resetUnix = numberOf(raw?.resets_at);
3225
+ const expired = resetUnix !== void 0 && nowMs > resetUnix * 1e3;
3226
+ return {
3227
+ utilization: usedPercent === void 0 ? null : expired ? 0 : usedPercent,
3228
+ resets_at: resetUnix !== void 0 ? new Date(resetUnix * 1e3).toISOString() : null
3229
+ };
3230
+ }
3222
3231
  async function getLatestCodexUsage(opts = {}) {
3223
3232
  const root = opts.root ?? DEFAULT_CODEX_ROOT;
3224
3233
  const files = await listRolloutFiles(root);
@@ -3244,23 +3253,34 @@ async function getLatestCodexUsage(opts = {}) {
3244
3253
  const secondary = rl.secondary ?? null;
3245
3254
  if (!hasUsableRateLimitWindows(primary, secondary))
3246
3255
  continue;
3247
- const fivePct = numberOf(primary?.used_percent);
3248
- const sevenPct = numberOf(secondary?.used_percent);
3249
- const fiveResetUnix = numberOf(primary?.resets_at);
3250
- const sevenResetUnix = numberOf(secondary?.resets_at);
3251
3256
  const planType = typeof rl.plan_type === "string" ? rl.plan_type : null;
3252
3257
  const nowMs = Date.now();
3253
- const fiveExpired = fiveResetUnix !== void 0 && nowMs > fiveResetUnix * 1e3;
3254
- const sevenExpired = sevenResetUnix !== void 0 && nowMs > sevenResetUnix * 1e3;
3258
+ let fiveHour = null;
3259
+ let sevenDay = null;
3260
+ for (const candidate of [primary, secondary]) {
3261
+ if (!candidate)
3262
+ continue;
3263
+ const windowMinutes = numberOf(candidate.window_minutes);
3264
+ if (windowMinutes === FIVE_HOUR_WINDOW_MINUTES) {
3265
+ fiveHour = normalizeCodexWindow(candidate, nowMs);
3266
+ } else if (windowMinutes === SEVEN_DAY_WINDOW_MINUTES) {
3267
+ sevenDay = normalizeCodexWindow(candidate, nowMs);
3268
+ }
3269
+ }
3270
+ const unknownWindows = [primary, secondary].filter((candidate) => candidate !== null && numberOf(candidate.window_minutes) === void 0);
3271
+ if (!fiveHour && !sevenDay) {
3272
+ fiveHour = primary ? normalizeCodexWindow(primary, nowMs) : null;
3273
+ sevenDay = secondary ? normalizeCodexWindow(secondary, nowMs) : null;
3274
+ } else if (unknownWindows.length === 1) {
3275
+ const inferred = normalizeCodexWindow(unknownWindows[0], nowMs);
3276
+ if (!fiveHour)
3277
+ fiveHour = inferred;
3278
+ else if (!sevenDay)
3279
+ sevenDay = inferred;
3280
+ }
3255
3281
  return {
3256
- five_hour: {
3257
- utilization: fiveExpired ? 0 : fivePct ?? null,
3258
- resets_at: fiveResetUnix !== void 0 ? new Date(fiveResetUnix * 1e3).toISOString() : null
3259
- },
3260
- seven_day: {
3261
- utilization: sevenExpired ? 0 : sevenPct ?? null,
3262
- resets_at: sevenResetUnix !== void 0 ? new Date(sevenResetUnix * 1e3).toISOString() : null
3263
- },
3282
+ five_hour: fiveHour ?? { utilization: null, resets_at: null },
3283
+ seven_day: sevenDay ?? { utilization: null, resets_at: null },
3264
3284
  plan_type: planType,
3265
3285
  source_path: file.filePath
3266
3286
  };
@@ -3274,7 +3294,7 @@ function codexSessionLocalDay(meta) {
3274
3294
  const ms = Date.parse(meta.firstTimestamp);
3275
3295
  return Number.isFinite(ms) ? toLocalDay(ms) : void 0;
3276
3296
  }
3277
- var DEFAULT_CODEX_ROOT, ROLLOUT_RE, IDLE_GAP_MS, metaCache2, detailCache2;
3297
+ var DEFAULT_CODEX_ROOT, ROLLOUT_RE, IDLE_GAP_MS, metaCache2, detailCache2, FIVE_HOUR_WINDOW_MINUTES, SEVEN_DAY_WINDOW_MINUTES;
3278
3298
  var init_codex = __esm({
3279
3299
  "../parser/dist/codex.js"() {
3280
3300
  "use strict";
@@ -3286,6 +3306,8 @@ var init_codex = __esm({
3286
3306
  IDLE_GAP_MS = 3 * 60 * 1e3;
3287
3307
  metaCache2 = /* @__PURE__ */ new Map();
3288
3308
  detailCache2 = /* @__PURE__ */ new Map();
3309
+ FIVE_HOUR_WINDOW_MINUTES = 5 * 60;
3310
+ SEVEN_DAY_WINDOW_MINUTES = 7 * 24 * 60;
3289
3311
  }
3290
3312
  });
3291
3313
 
@@ -5631,7 +5653,8 @@ var init_fs = __esm({
5631
5653
  captured_at: (/* @__PURE__ */ new Date()).toISOString(),
5632
5654
  agent: "codex",
5633
5655
  five_hour: w.five_hour,
5634
- seven_day: w.seven_day
5656
+ seven_day: w.seven_day,
5657
+ plan_type: w.plan_type
5635
5658
  };
5636
5659
  }
5637
5660
  };
@@ -8166,7 +8189,7 @@ function buildIngestPayload(inputs) {
8166
8189
  return {
8167
8190
  ingestId: randomUUID(),
8168
8191
  observedAt: (/* @__PURE__ */ new Date()).toISOString(),
8169
- cliVersion: "0.16.2",
8192
+ cliVersion: "0.16.4",
8170
8193
  ...richRollup || inputs.enrichedExtras || inputs.artifactSignals ? { schemaVersion: RICH_ROLLUP_SCHEMA_VERSION } : {},
8171
8194
  ...inputs.rollup ? { dailyRollup: inputs.rollup } : {},
8172
8195
  ...richRollup ? { richRollup } : {},
@@ -17100,14 +17123,14 @@ async function getUpdateAvailability() {
17100
17123
  if (isDevMode()) return null;
17101
17124
  const latest = await fetchLatestVersion();
17102
17125
  if (latest === null) return {
17103
- current: "0.16.2",
17126
+ current: "0.16.4",
17104
17127
  latest: null,
17105
17128
  updateAvailable: false
17106
17129
  };
17107
17130
  return {
17108
- current: "0.16.2",
17131
+ current: "0.16.4",
17109
17132
  latest,
17110
- updateAvailable: shouldUpdate("0.16.2", latest)
17133
+ updateAvailable: shouldUpdate("0.16.4", latest)
17111
17134
  };
17112
17135
  }
17113
17136
 
@@ -17262,9 +17285,11 @@ async function tick() {
17262
17285
  extra_usage: null
17263
17286
  };
17264
17287
  appendSnapshot(USAGE_LOG3, snapshot);
17288
+ const fiveHour = snapshot.five_hour.utilization === null ? "\u2014" : `${snapshot.five_hour.utilization}%`;
17289
+ const sevenDay = snapshot.seven_day.utilization === null ? "\u2014" : `${snapshot.seven_day.utilization}%`;
17265
17290
  log2(
17266
17291
  "info",
17267
- `${source.kind} snapshot 5h=${snapshot.five_hour.utilization}% 7d=${snapshot.seven_day.utilization}%`
17292
+ `${source.kind} snapshot 5h=${fiveHour} 7d=${sevenDay}`
17268
17293
  );
17269
17294
  } catch (err) {
17270
17295
  log2("warn", `${source.kind} poll failed: ${err.message}`);
package/dist/index.js CHANGED
@@ -3287,6 +3287,15 @@ async function getCodexSession(id, opts = {}) {
3287
3287
  function hasUsableRateLimitWindows(primary, secondary) {
3288
3288
  return numberOf(primary?.used_percent) !== void 0 || numberOf(secondary?.used_percent) !== void 0;
3289
3289
  }
3290
+ function normalizeCodexWindow(raw, nowMs) {
3291
+ const usedPercent = numberOf(raw?.used_percent);
3292
+ const resetUnix = numberOf(raw?.resets_at);
3293
+ const expired = resetUnix !== void 0 && nowMs > resetUnix * 1e3;
3294
+ return {
3295
+ utilization: usedPercent === void 0 ? null : expired ? 0 : usedPercent,
3296
+ resets_at: resetUnix !== void 0 ? new Date(resetUnix * 1e3).toISOString() : null
3297
+ };
3298
+ }
3290
3299
  async function getLatestCodexUsage(opts = {}) {
3291
3300
  const root = opts.root ?? DEFAULT_CODEX_ROOT;
3292
3301
  const files = await listRolloutFiles(root);
@@ -3312,23 +3321,34 @@ async function getLatestCodexUsage(opts = {}) {
3312
3321
  const secondary = rl.secondary ?? null;
3313
3322
  if (!hasUsableRateLimitWindows(primary, secondary))
3314
3323
  continue;
3315
- const fivePct = numberOf(primary?.used_percent);
3316
- const sevenPct = numberOf(secondary?.used_percent);
3317
- const fiveResetUnix = numberOf(primary?.resets_at);
3318
- const sevenResetUnix = numberOf(secondary?.resets_at);
3319
3324
  const planType = typeof rl.plan_type === "string" ? rl.plan_type : null;
3320
3325
  const nowMs = Date.now();
3321
- const fiveExpired = fiveResetUnix !== void 0 && nowMs > fiveResetUnix * 1e3;
3322
- const sevenExpired = sevenResetUnix !== void 0 && nowMs > sevenResetUnix * 1e3;
3326
+ let fiveHour = null;
3327
+ let sevenDay = null;
3328
+ for (const candidate of [primary, secondary]) {
3329
+ if (!candidate)
3330
+ continue;
3331
+ const windowMinutes = numberOf(candidate.window_minutes);
3332
+ if (windowMinutes === FIVE_HOUR_WINDOW_MINUTES) {
3333
+ fiveHour = normalizeCodexWindow(candidate, nowMs);
3334
+ } else if (windowMinutes === SEVEN_DAY_WINDOW_MINUTES) {
3335
+ sevenDay = normalizeCodexWindow(candidate, nowMs);
3336
+ }
3337
+ }
3338
+ const unknownWindows = [primary, secondary].filter((candidate) => candidate !== null && numberOf(candidate.window_minutes) === void 0);
3339
+ if (!fiveHour && !sevenDay) {
3340
+ fiveHour = primary ? normalizeCodexWindow(primary, nowMs) : null;
3341
+ sevenDay = secondary ? normalizeCodexWindow(secondary, nowMs) : null;
3342
+ } else if (unknownWindows.length === 1) {
3343
+ const inferred = normalizeCodexWindow(unknownWindows[0], nowMs);
3344
+ if (!fiveHour)
3345
+ fiveHour = inferred;
3346
+ else if (!sevenDay)
3347
+ sevenDay = inferred;
3348
+ }
3323
3349
  return {
3324
- five_hour: {
3325
- utilization: fiveExpired ? 0 : fivePct ?? null,
3326
- resets_at: fiveResetUnix !== void 0 ? new Date(fiveResetUnix * 1e3).toISOString() : null
3327
- },
3328
- seven_day: {
3329
- utilization: sevenExpired ? 0 : sevenPct ?? null,
3330
- resets_at: sevenResetUnix !== void 0 ? new Date(sevenResetUnix * 1e3).toISOString() : null
3331
- },
3350
+ five_hour: fiveHour ?? { utilization: null, resets_at: null },
3351
+ seven_day: sevenDay ?? { utilization: null, resets_at: null },
3332
3352
  plan_type: planType,
3333
3353
  source_path: file.filePath
3334
3354
  };
@@ -3342,7 +3362,7 @@ function codexSessionLocalDay(meta) {
3342
3362
  const ms = Date.parse(meta.firstTimestamp);
3343
3363
  return Number.isFinite(ms) ? toLocalDay(ms) : void 0;
3344
3364
  }
3345
- var DEFAULT_CODEX_ROOT, ROLLOUT_RE, IDLE_GAP_MS, metaCache2, detailCache2;
3365
+ var DEFAULT_CODEX_ROOT, ROLLOUT_RE, IDLE_GAP_MS, metaCache2, detailCache2, FIVE_HOUR_WINDOW_MINUTES, SEVEN_DAY_WINDOW_MINUTES;
3346
3366
  var init_codex = __esm({
3347
3367
  "../parser/dist/codex.js"() {
3348
3368
  "use strict";
@@ -3354,6 +3374,8 @@ var init_codex = __esm({
3354
3374
  IDLE_GAP_MS = 3 * 60 * 1e3;
3355
3375
  metaCache2 = /* @__PURE__ */ new Map();
3356
3376
  detailCache2 = /* @__PURE__ */ new Map();
3377
+ FIVE_HOUR_WINDOW_MINUTES = 5 * 60;
3378
+ SEVEN_DAY_WINDOW_MINUTES = 7 * 24 * 60;
3357
3379
  }
3358
3380
  });
3359
3381
 
@@ -5699,7 +5721,8 @@ var init_fs = __esm({
5699
5721
  captured_at: (/* @__PURE__ */ new Date()).toISOString(),
5700
5722
  agent: "codex",
5701
5723
  five_hour: w.five_hour,
5702
- seven_day: w.seven_day
5724
+ seven_day: w.seven_day,
5725
+ plan_type: w.plan_type
5703
5726
  };
5704
5727
  }
5705
5728
  };
@@ -5786,9 +5809,9 @@ function onDiskVersion() {
5786
5809
  try {
5787
5810
  const here = dirname3(fileURLToPath(import.meta.url));
5788
5811
  const pkg = JSON.parse(readFileSync5(join3(here, "..", "package.json"), "utf8"));
5789
- return pkg.version ?? "0.16.2";
5812
+ return pkg.version ?? "0.16.4";
5790
5813
  } catch {
5791
- return "0.16.2";
5814
+ return "0.16.4";
5792
5815
  }
5793
5816
  }
5794
5817
  function getServerStatus() {
@@ -5800,7 +5823,7 @@ function getServerStatus() {
5800
5823
  return { running: false };
5801
5824
  }
5802
5825
  function isServerStale(status2) {
5803
- return status2.running === true && status2.version !== "0.16.2";
5826
+ return status2.running === true && status2.version !== "0.16.4";
5804
5827
  }
5805
5828
  async function ensureCurrentServer(opts = {}) {
5806
5829
  const status2 = getServerStatus();
@@ -6239,9 +6262,9 @@ Installed: ${PACKAGE_NAME}@${verify.installedVersion} at ${verify.installedPath
6239
6262
  console.warn(
6240
6263
  ` \u2022 reinstall in the correct Node env: 'npm install -g ${PACKAGE_NAME}@latest'`
6241
6264
  );
6242
- } else if (verify.installedVersion !== "0.16.2") {
6265
+ } else if (verify.installedVersion !== "0.16.4") {
6243
6266
  console.log(
6244
- ` \u2192 This process is still running ${"0.16.2"}. Next invocation will use ${verify.installedVersion}.`
6267
+ ` \u2192 This process is still running ${"0.16.4"}. Next invocation will use ${verify.installedVersion}.`
6245
6268
  );
6246
6269
  }
6247
6270
  }
@@ -6276,14 +6299,14 @@ async function getUpdateAvailability() {
6276
6299
  if (isDevMode()) return null;
6277
6300
  const latest = await fetchLatestVersion();
6278
6301
  if (latest === null) return {
6279
- current: "0.16.2",
6302
+ current: "0.16.4",
6280
6303
  latest: null,
6281
6304
  updateAvailable: false
6282
6305
  };
6283
6306
  return {
6284
- current: "0.16.2",
6307
+ current: "0.16.4",
6285
6308
  latest,
6286
- updateAvailable: shouldUpdate("0.16.2", latest)
6309
+ updateAvailable: shouldUpdate("0.16.4", latest)
6287
6310
  };
6288
6311
  }
6289
6312
  async function checkForUpdate() {
@@ -6373,7 +6396,7 @@ async function restartServices(state) {
6373
6396
  }
6374
6397
  async function forceUpdate() {
6375
6398
  const latest = await fetchLatestVersion();
6376
- const current = "0.16.2";
6399
+ const current = "0.16.4";
6377
6400
  if (latest === null) {
6378
6401
  console.error("Could not reach npm registry. Check your network.");
6379
6402
  process.exit(1);
@@ -6786,7 +6809,7 @@ async function status() {
6786
6809
  console.log(`Server: running on ${url} (PID ${server.pid}, v${ver})`);
6787
6810
  if (isServerStale(server)) {
6788
6811
  console.log(
6789
- ` \u26A0 serving stale ${ver} (CLI is ${"0.16.2"}) \u2014 run 'fleetlens start' to restart on the current version`
6812
+ ` \u26A0 serving stale ${ver} (CLI is ${"0.16.4"}) \u2014 run 'fleetlens start' to restart on the current version`
6790
6813
  );
6791
6814
  }
6792
6815
  } else {
@@ -18929,7 +18952,7 @@ function buildIngestPayload(inputs) {
18929
18952
  return {
18930
18953
  ingestId: randomUUID2(),
18931
18954
  observedAt: (/* @__PURE__ */ new Date()).toISOString(),
18932
- cliVersion: "0.16.2",
18955
+ cliVersion: "0.16.4",
18933
18956
  ...richRollup || inputs.enrichedExtras || inputs.artifactSignals ? { schemaVersion: RICH_ROLLUP_SCHEMA_VERSION } : {},
18934
18957
  ...inputs.rollup ? { dailyRollup: inputs.rollup } : {},
18935
18958
  ...richRollup ? { richRollup } : {},
@@ -20972,7 +20995,7 @@ async function main() {
20972
20995
  case "version":
20973
20996
  case "--version":
20974
20997
  case "-v":
20975
- console.log(`fleetlens ${"0.16.2"}`);
20998
+ console.log(`fleetlens ${"0.16.4"}`);
20976
20999
  break;
20977
21000
  case "help":
20978
21001
  case "--help":
@@ -10,8 +10,8 @@
10
10
  <key>CFBundleName</key><string>Fleetlens</string>
11
11
  <key>CFBundleDisplayName</key><string>Fleetlens Menu Bar</string>
12
12
  <key>CFBundlePackageType</key><string>APPL</string>
13
- <key>CFBundleShortVersionString</key><string>0.16.2</string>
14
- <key>CFBundleVersion</key><string>0.16.2</string>
13
+ <key>CFBundleShortVersionString</key><string>0.16.4</string>
14
+ <key>CFBundleVersion</key><string>0.16.4</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/>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fleetlens",
3
- "version": "0.16.2",
3
+ "version": "0.16.4",
4
4
  "description": "fleetlens — local-only dashboard and usage tracker for Claude Code sessions and agent fleets",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -1 +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-divide-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-tracking: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-red-50:#fef2f2;--color-red-300:#ffa3a3;--color-red-400:#ff6568;--color-red-600:#e40014;--color-red-700:#bf000f;--color-red-800:#9f0712;--color-red-950:#460809;--color-amber-400:#fcbb00;--color-amber-600:#dd7400;--color-green-50:#f0fdf4;--color-green-300:#7bf1a8;--color-green-400:#05df72;--color-green-600:#00a544;--color-green-700:#008138;--color-green-800:#016630;--color-green-950:#032e15;--color-gray-100:#f3f4f6;--color-gray-200:#e5e7eb;--color-gray-300:#d1d5dc;--color-gray-400:#99a1af;--color-gray-500:#6a7282;--color-gray-600:#4a5565;--color-gray-700:#364153;--color-gray-900:#101828;--color-gray-950:#030712;--spacing:.25rem;--container-2xl:42rem;--container-3xl:48rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--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-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--font-weight-medium:500;--font-weight-semibold:600;--tracking-wide:.025em;--radius-lg:.5rem;--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-red-50:lab(96.5005% 4.18508 1.52328);--color-red-300:lab(76.5514% 36.422 15.5335);--color-red-400:lab(63.7053% 60.745 31.3109);--color-red-600:lab(48.4493% 77.4328 61.5452);--color-red-700:lab(40.4273% 67.2623 53.7441);--color-red-800:lab(33.7174% 55.8993 41.0293);--color-red-950:lab(13.003% 29.04 16.7519);--color-amber-400:lab(80.1641% 16.6016 99.2089);--color-amber-600:lab(60.3514% 40.5624 87.1228);--color-green-50:lab(98.1563% -5.60117 2.75915);--color-green-300:lab(86.9953% -47.2691 25.0054);--color-green-400:lab(78.503% -64.9265 39.7492);--color-green-600:lab(59.0978% -58.6621 41.2579);--color-green-700:lab(47.0329% -47.0239 31.4788);--color-green-800:lab(37.4616% -36.7971 22.9692);--color-green-950:lab(15.6845% -20.4225 11.7249);--color-gray-100:lab(96.1596% -.0823438 -1.13575);--color-gray-200:lab(91.6229% -.159115 -2.26791);--color-gray-300:lab(85.1236% -.612259 -3.7138);--color-gray-400:lab(65.9269% -.832707 -8.17473);--color-gray-500:lab(47.7841% -.393182 -10.0268);--color-gray-600:lab(35.6337% -1.58697 -10.8425);--color-gray-700:lab(27.1134% -.956401 -12.3224);--color-gray-900:lab(8.11897% .811279 -12.254);--color-gray-950:lab(1.90334% .278696 -5.48866)}}}@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}*,:after,:before{border-color:var(--af-border-subtle)}}@layer components;@layer utilities{.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.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}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.block{display:block}.contents{display:contents}.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}.h-5{height:calc(var(--spacing) * 5)}.max-h-60{max-height:calc(var(--spacing) * 60)}.max-h-80{max-height:calc(var(--spacing) * 80)}.max-h-96{max-height:calc(var(--spacing) * 96)}.w-5{width:calc(var(--spacing) * 5)}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.min-w-0{min-width:calc(var(--spacing) * 0)}.flex-1{flex:1}.shrink{flex-shrink:1}.grow{flex-grow:1}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.cursor-pointer{cursor:pointer}.resize{resize:both}.list-inside{list-style-position:inside}.list-disc{list-style-type:disc}.grid-cols-\[8rem_1fr\]{grid-template-columns:8rem 1fr}.grid-cols-\[10rem_1fr\]{grid-template-columns:10rem 1fr}.grid-cols-\[max-content_1fr\]{grid-template-columns:max-content 1fr}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}: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-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * 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)))}.gap-x-6{column-gap:calc(var(--spacing) * 6)}.gap-y-1{row-gap:calc(var(--spacing) * 1)}.gap-y-1\.5{row-gap:calc(var(--spacing) * 1.5)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}.self-center{align-self:center}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.border{border-style:var(--tw-border-style);border-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-amber-400\/40{border-color:#fcbb0066}@supports (color:color-mix(in lab, red, red)){.border-amber-400\/40{border-color:color-mix(in oklab, var(--color-amber-400) 40%, transparent)}}.border-gray-300{border-color:var(--color-gray-300)}.border-green-300{border-color:var(--color-green-300)}.border-red-300{border-color:var(--color-red-300)}.border-red-400{border-color:var(--color-red-400)}.bg-amber-400\/10{background-color:#fcbb001a}@supports (color:color-mix(in lab, red, red)){.bg-amber-400\/10{background-color:color-mix(in oklab, var(--color-amber-400) 10%, transparent)}}.bg-gray-100{background-color:var(--color-gray-100)}.bg-gray-950{background-color:var(--color-gray-950)}.bg-green-50{background-color:var(--color-green-50)}.bg-red-50{background-color:var(--color-red-50)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-2{padding-block:calc(var(--spacing) * 2)}.font-mono{font-family:SF Mono,Fira Code,JetBrains Mono,Cascadia Code,monospace}.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))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[11px\]{font-size:11px}.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)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.break-all{word-break:break-all}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-400{color:var(--color-amber-400)}.text-amber-600{color:var(--color-amber-600)}.text-gray-200{color:var(--color-gray-200)}.text-gray-300{color:var(--color-gray-300)}.text-gray-500{color:var(--color-gray-500)}.text-gray-500\!{color:var(--color-gray-500)!important}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-900{color:var(--color-gray-900)}.text-green-600{color:var(--color-green-600)}.text-green-700{color:var(--color-green-700)}.text-green-800{color:var(--color-green-800)}.text-red-400{color:var(--color-red-400)}.text-red-600{color:var(--color-red-600)}.text-red-700{color:var(--color-red-700)}.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}.opacity-50{opacity:.5}.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)}@media (hover:hover){.hover\:text-gray-700:hover{color:var(--color-gray-700)}.hover\:underline:hover{text-decoration-line:underline}}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}@media (prefers-color-scheme:dark){.dark\:border-gray-700{border-color:var(--color-gray-700)}.dark\:border-green-800{border-color:var(--color-green-800)}.dark\:border-red-800{border-color:var(--color-red-800)}.dark\:bg-gray-900{background-color:var(--color-gray-900)}.dark\:bg-green-950{background-color:var(--color-green-950)}.dark\:bg-red-950{background-color:var(--color-red-950)}.dark\:text-gray-100{color:var(--color-gray-100)}.dark\:text-gray-400{color:var(--color-gray-400)}.dark\:text-gray-700{color:var(--color-gray-700)}.dark\:text-green-300{color:var(--color-green-300)}.dark\:text-green-400{color:var(--color-green-400)}.dark\:text-red-300{color:var(--color-red-300)}}}: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}.sl-day-nav-btn{border:1px solid var(--af-border-subtle);background:var(--af-surface-hover);width:26px;height:26px;color:var(--af-text-secondary);cursor:pointer;border-radius:6px;justify-content:center;align-items:center;transition:background .15s,opacity .15s;display:inline-flex}.sl-day-nav-btn:hover:not(:disabled){background:var(--af-surface-elevated);color:var(--af-text-primary)}.sl-day-nav-btn:disabled{opacity:.35;cursor:default}::-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)}.af-btn,.af-btn-primary,.af-btn-danger{border-radius:8px;padding:6px 14px;font-size:13px;transition:background .12s,border-color .12s;display:inline-block}.af-btn{border:1px solid var(--af-border-subtle);background:var(--af-surface);color:var(--af-text)}.af-btn:hover:not(:disabled){border-color:var(--af-accent)}.af-btn-primary{background:var(--af-accent);color:var(--background);border:1px solid #0000;font-weight:500}.af-btn-primary:hover:not(:disabled){background:var(--af-accent-hover)}.af-btn-danger{border:1px solid var(--af-danger);color:var(--af-danger);background:0 0}.af-btn-danger:hover:not(:disabled){background:var(--af-danger-subtle)}.af-btn:disabled,.af-btn-primary:disabled,.af-btn-danger:disabled{opacity:.55;cursor:default}.af-panel{background:var(--af-surface-elevated);border:1px solid var(--af-border-subtle);border-radius:8px}.af-panel-danger{background:var(--af-danger-subtle);border:1px solid var(--af-danger);color:var(--af-danger);border-radius:8px}.af-step-active{background:var(--af-accent);color:var(--background)}.af-chip{border:1px solid var(--af-border-subtle);font-family:var(--font-mono);border-radius:9999px;padding:2px 10px;font-size:12px;display:inline-block}a.af-chip:hover{border-color:var(--af-accent);text-decoration:underline}.af-row:hover{background:var(--af-surface-hover)}.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-divide-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-tracking{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}