fleetlens 0.6.1 → 0.6.3

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 (80) 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.js.nft.json +1 -1
  12. package/app/apps/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  13. package/app/apps/web/.next/server/app/api/digest/day/[date]/route.js.nft.json +1 -1
  14. package/app/apps/web/.next/server/app/api/digest/month/[yearMonth]/route.js.nft.json +1 -1
  15. package/app/apps/web/.next/server/app/api/digest/month-index/route.js.nft.json +1 -1
  16. package/app/apps/web/.next/server/app/api/digest/week/[startDate]/route.js.nft.json +1 -1
  17. package/app/apps/web/.next/server/app/api/digest/week-index/route.js.nft.json +1 -1
  18. package/app/apps/web/.next/server/app/api/jobs/route.js.nft.json +1 -1
  19. package/app/apps/web/.next/server/app/api/runs/[runId]/route.js.nft.json +1 -1
  20. package/app/apps/web/.next/server/app/api/runs/[runId]/stream/route.js.nft.json +1 -1
  21. package/app/apps/web/.next/server/app/api/settings/route.js.nft.json +1 -1
  22. package/app/apps/web/.next/server/app/day/[date]/page.js.nft.json +1 -1
  23. package/app/apps/web/.next/server/app/day/[date]/page_client-reference-manifest.js +1 -1
  24. package/app/apps/web/.next/server/app/day/page.js.nft.json +1 -1
  25. package/app/apps/web/.next/server/app/day/page_client-reference-manifest.js +1 -1
  26. package/app/apps/web/.next/server/app/digest/[date]/page.js.nft.json +1 -1
  27. package/app/apps/web/.next/server/app/digest/[date]/page_client-reference-manifest.js +1 -1
  28. package/app/apps/web/.next/server/app/digest/page.js.nft.json +1 -1
  29. package/app/apps/web/.next/server/app/digest/page_client-reference-manifest.js +1 -1
  30. package/app/apps/web/.next/server/app/insights/[key]/page.js.nft.json +1 -1
  31. package/app/apps/web/.next/server/app/insights/[key]/page_client-reference-manifest.js +1 -1
  32. package/app/apps/web/.next/server/app/insights/page.js.nft.json +1 -1
  33. package/app/apps/web/.next/server/app/insights/page_client-reference-manifest.js +1 -1
  34. package/app/apps/web/.next/server/app/page.js.nft.json +1 -1
  35. package/app/apps/web/.next/server/app/page_client-reference-manifest.js +1 -1
  36. package/app/apps/web/.next/server/app/parallelism/page.js.nft.json +1 -1
  37. package/app/apps/web/.next/server/app/parallelism/page_client-reference-manifest.js +1 -1
  38. package/app/apps/web/.next/server/app/projects/[slug]/page.js.nft.json +1 -1
  39. package/app/apps/web/.next/server/app/projects/[slug]/page_client-reference-manifest.js +1 -1
  40. package/app/apps/web/.next/server/app/projects/page.js.nft.json +1 -1
  41. package/app/apps/web/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  42. package/app/apps/web/.next/server/app/runs/page.js.nft.json +1 -1
  43. package/app/apps/web/.next/server/app/runs/page_client-reference-manifest.js +1 -1
  44. package/app/apps/web/.next/server/app/sessions/[id]/page.js.nft.json +1 -1
  45. package/app/apps/web/.next/server/app/sessions/[id]/page_client-reference-manifest.js +1 -1
  46. package/app/apps/web/.next/server/app/sessions/page.js.nft.json +1 -1
  47. package/app/apps/web/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  48. package/app/apps/web/.next/server/app/settings/page.js.nft.json +1 -1
  49. package/app/apps/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  50. package/app/apps/web/.next/server/app/usage/page.js.nft.json +1 -1
  51. package/app/apps/web/.next/server/app/usage/page_client-reference-manifest.js +1 -1
  52. package/app/apps/web/.next/server/chunks/node_modules_next_036my~r._.js +6 -6
  53. package/app/apps/web/.next/server/chunks/packages_entries_dist_node_0bckr7-.js +12 -12
  54. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0-1_njm._.js +1 -1
  55. package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0wwa6gh._.js +1 -1
  56. package/app/apps/web/.next/server/chunks/ssr/_0xu2pvc._.js +1 -1
  57. package/app/apps/web/.next/server/chunks/ssr/apps_web_app_settings_ai-features-form_tsx_01p699p._.js +1 -1
  58. package/app/apps/web/.next/server/chunks/ssr/packages_entries_dist_node_0_271yr.js +1 -1
  59. package/app/apps/web/.next/server/middleware-build-manifest.js +3 -3
  60. package/app/apps/web/.next/server/pages/500.html +1 -1
  61. package/app/apps/web/.next/server/server-reference-manifest.js +1 -1
  62. package/app/apps/web/.next/server/server-reference-manifest.json +1 -1
  63. package/app/apps/web/.next/static/chunks/04m3slg_5ph02.js +1 -0
  64. package/app/apps/web/.next/static/chunks/0wfbj5zr~az.z.css +1 -0
  65. package/app/apps/web/app/api/settings/route.ts +8 -3
  66. package/app/apps/web/app/insights/page.tsx +5 -3
  67. package/app/apps/web/app/settings/ai-features-form.tsx +19 -1
  68. package/app/apps/web/app/settings/page.tsx +4 -1
  69. package/app/apps/web/lib/validate-settings.ts +4 -1
  70. package/app/apps/web/package.json +1 -1
  71. package/app/apps/web/tsconfig.tsbuildinfo +1 -1
  72. package/dist/daemon-worker.js +7495 -74
  73. package/dist/index.js +31 -10
  74. package/package.json +1 -1
  75. package/app/apps/web/.next/static/chunks/0-yc2_pjxwwuq.js +0 -1
  76. package/app/apps/web/.next/static/chunks/0fs3gxea5h0s3.css +0 -1
  77. package/app/apps/web/lib/auto-week-fire.ts +0 -37
  78. /package/app/apps/web/.next/static/{fm3KE6Y_UOzhf_27jAYYK → YT0fi8TIPXu7nZyww-N2v}/_buildManifest.js +0 -0
  79. /package/app/apps/web/.next/static/{fm3KE6Y_UOzhf_27jAYYK → YT0fi8TIPXu7nZyww-N2v}/_clientMiddlewareManifest.js +0 -0
  80. /package/app/apps/web/.next/static/{fm3KE6Y_UOzhf_27jAYYK → YT0fi8TIPXu7nZyww-N2v}/_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.1") {
457
+ } else if (verify.installedVersion !== "0.6.3") {
458
458
  console.log(
459
- ` \u2192 This process is still running ${"0.6.1"}. Next invocation will use ${verify.installedVersion}.`
459
+ ` \u2192 This process is still running ${"0.6.3"}. 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.1";
495
+ const current = "0.6.3";
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.1";
577
+ const current = "0.6.3";
578
578
  if (latest === null) {
579
579
  console.error("Could not reach npm registry. Check your network.");
580
580
  process.exit(1);
@@ -8552,10 +8552,26 @@ function lockPath() {
8552
8552
  function __setInteractiveLockPathForTest(path2) {
8553
8553
  lockPathCached = path2;
8554
8554
  }
8555
- function writeInteractiveLock() {
8555
+ function touchLock() {
8556
8556
  writeFileSync5(lockPath(), String(process.pid), "utf8");
8557
8557
  }
8558
+ function writeInteractiveLock() {
8559
+ touchLock();
8560
+ if (heartbeat)
8561
+ clearInterval(heartbeat);
8562
+ heartbeat = setInterval(() => {
8563
+ try {
8564
+ touchLock();
8565
+ } catch {
8566
+ }
8567
+ }, HEARTBEAT_MS);
8568
+ heartbeat.unref?.();
8569
+ }
8558
8570
  function removeInteractiveLock() {
8571
+ if (heartbeat) {
8572
+ clearInterval(heartbeat);
8573
+ heartbeat = null;
8574
+ }
8559
8575
  try {
8560
8576
  unlinkSync2(lockPath());
8561
8577
  } catch {
@@ -8587,12 +8603,14 @@ function interactiveLockFresh(nowMs) {
8587
8603
  return false;
8588
8604
  }
8589
8605
  }
8590
- var STALE_MS, lockPathCached;
8606
+ var STALE_MS, HEARTBEAT_MS, lockPathCached, heartbeat;
8591
8607
  var init_pipeline_lock = __esm({
8592
8608
  "../entries/dist/pipeline-lock.js"() {
8593
8609
  "use strict";
8594
8610
  STALE_MS = 60 * 1e3;
8611
+ HEARTBEAT_MS = 30 * 1e3;
8595
8612
  lockPathCached = null;
8613
+ heartbeat = null;
8596
8614
  }
8597
8615
  });
8598
8616
 
@@ -8697,7 +8715,8 @@ function toDisk(s) {
8697
8715
  ai_features: {
8698
8716
  enabled: s.ai_features.enabled,
8699
8717
  model: s.ai_features.model,
8700
- monthly_budget_usd: s.ai_features.monthlyBudgetUsd
8718
+ monthly_budget_usd: s.ai_features.monthlyBudgetUsd,
8719
+ auto_backfill_last_week: s.ai_features.autoBackfillLastWeek
8701
8720
  }
8702
8721
  };
8703
8722
  }
@@ -8707,7 +8726,8 @@ function fromDisk(d) {
8707
8726
  ai_features: {
8708
8727
  enabled: af.enabled ?? DEFAULT_SETTINGS.ai_features.enabled,
8709
8728
  model: af.model ?? DEFAULT_SETTINGS.ai_features.model,
8710
- monthlyBudgetUsd: af.monthly_budget_usd ?? null
8729
+ monthlyBudgetUsd: af.monthly_budget_usd ?? null,
8730
+ autoBackfillLastWeek: af.auto_backfill_last_week ?? DEFAULT_SETTINGS.ai_features.autoBackfillLastWeek
8711
8731
  }
8712
8732
  };
8713
8733
  }
@@ -8740,7 +8760,8 @@ var init_settings = __esm({
8740
8760
  ai_features: {
8741
8761
  enabled: true,
8742
8762
  model: "sonnet",
8743
- monthlyBudgetUsd: null
8763
+ monthlyBudgetUsd: null,
8764
+ autoBackfillLastWeek: true
8744
8765
  }
8745
8766
  };
8746
8767
  settingsPathCached = null;
@@ -14027,7 +14048,7 @@ async function main() {
14027
14048
  case "version":
14028
14049
  case "--version":
14029
14050
  case "-v":
14030
- console.log(`fleetlens ${"0.6.1"}`);
14051
+ console.log(`fleetlens ${"0.6.3"}`);
14031
14052
  break;
14032
14053
  case "help":
14033
14054
  case "--help":
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fleetlens",
3
- "version": "0.6.1",
3
+ "version": "0.6.3",
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",
@@ -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}
@@ -1,37 +0,0 @@
1
- import "server-only";
2
- import { existsSync, readFileSync, mkdirSync, renameSync, writeFileSync } from "node:fs";
3
- import { join, dirname } from "node:path";
4
- import { homedir } from "node:os";
5
-
6
- function autoFireFile(): string {
7
- return process.env.CCLENS_AUTO_WEEK_FILE
8
- ?? join(homedir(), ".cclens", "auto-week-fired-at");
9
- }
10
-
11
- const MONDAY_RE = /^\d{4}-\d{2}-\d{2}$/;
12
-
13
- /**
14
- * Returns true if this call is the one that should trigger auto-fire for `monday`.
15
- * Atomically updates the on-disk record so subsequent calls in the same ISO week
16
- * return false. Idempotent across server restarts.
17
- *
18
- * Corrupt/unreadable file is treated as "absent" — the caller will fire and
19
- * the file will be rewritten with a clean Monday line.
20
- */
21
- export function shouldAutoFireWeek(monday: string): boolean {
22
- const file = autoFireFile();
23
- let prev: string | null = null;
24
- if (existsSync(file)) {
25
- try {
26
- const raw = readFileSync(file, "utf8").trim();
27
- if (MONDAY_RE.test(raw)) prev = raw;
28
- } catch { /* corrupt — treat as absent */ }
29
- }
30
- if (prev === monday) return false;
31
-
32
- mkdirSync(dirname(file), { recursive: true });
33
- const tmp = `${file}.tmp`;
34
- writeFileSync(tmp, monday + "\n", "utf8");
35
- renameSync(tmp, file);
36
- return true;
37
- }