agent-lyceum 0.32.0 → 0.33.1

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.
@@ -13,8 +13,19 @@ export type WatchFrame = {
13
13
  * A task that was running in the previous frame and has finished (completed or partial) since is included once more, so the reader sees
14
14
  * it finish (and can toast) before it is dropped. `tracked` is that previous set; it is replaced by the ids running now.
15
15
  */
16
+ /**
17
+ * Reports of finished runs, kept so a sweep does not rebuild them (about 300 ms each). An entry is reused while the
18
+ * run's state.json is unchanged and it is younger than `FINISHED_TTL_MS`; the TTL picks up what lives outside that file
19
+ * (unread mail, memory advice).
20
+ */
21
+ export type FinishedCache = Map<string, {
22
+ stamp: string;
23
+ at: number;
24
+ report: StatusReport;
25
+ }>;
16
26
  export declare function buildWatchFrame(project: ResolvedProject, tracked: Set<string>, opts?: {
17
27
  allTasks?: boolean;
28
+ cache?: FinishedCache;
18
29
  }): WatchFrame;
19
30
  export interface WatchDeps {
20
31
  /** The project, loaded again each time so config edits and new runs show up. */
@@ -1,11 +1,16 @@
1
1
  import fs from "node:fs";
2
- import { buildStatusReport, buildTaskListReport, isFinishedRun } from "./status.js";
3
- /**
4
- * The frame for now. Every task that is not finished (running, interrupted, waiting for answers, or ended blocked,
5
- * failed or cancelled) gets its own report, so it stays listed until it is resumed or cleared.
6
- * A task that was running in the previous frame and has finished (completed or partial) since is included once more, so the reader sees
7
- * it finish (and can toast) before it is dropped. `tracked` is that previous set; it is replaced by the ids running now.
8
- */
2
+ import path from "node:path";
3
+ import { buildStatusReport, buildTaskListReport, currentRun, isFinishedRun } from "./status.js";
4
+ const FINISHED_TTL_MS = 5 * 60_000;
5
+ function stampOf(project, id) {
6
+ try {
7
+ const st = fs.statSync(path.join(project.paths.runs, id, "state.json"));
8
+ return `${st.mtimeMs}:${st.size}`;
9
+ }
10
+ catch {
11
+ return "";
12
+ }
13
+ }
9
14
  export function buildWatchFrame(project, tracked, opts) {
10
15
  const all = buildTaskListReport(project).runs;
11
16
  const running = all.filter((r) => r.state === "running").map((r) => r.run_id);
@@ -13,9 +18,27 @@ export function buildWatchFrame(project, tracked, opts) {
13
18
  const runs = {};
14
19
  // The web page keeps every task. The terminal watch drops one after it has finished, once the finish has been seen.
15
20
  const ids = opts?.allTasks ? all.map((r) => r.run_id) : [...open, ...tracked];
16
- for (const id of new Set(ids))
21
+ const finished = new Set(all.filter(isFinishedRun).map((r) => r.run_id));
22
+ const cache = opts?.cache;
23
+ const now = Date.now();
24
+ for (const id of new Set(ids)) {
25
+ const stamp = cache && finished.has(id) ? stampOf(project, id) : "";
26
+ const hit = stamp ? cache?.get(id) : undefined;
27
+ if (hit && hit.stamp === stamp && now - hit.at < FINISHED_TTL_MS) {
28
+ runs[id] = hit.report;
29
+ continue;
30
+ }
17
31
  runs[id] = buildStatusReport(project, id);
18
- const report = buildStatusReport(project);
32
+ if (stamp)
33
+ cache?.set(id, { stamp, at: now, report: runs[id] });
34
+ }
35
+ if (cache)
36
+ for (const id of cache.keys())
37
+ if (!finished.has(id))
38
+ cache.delete(id);
39
+ // The project's own report shows the current run, which is usually one already built above.
40
+ const currentId = currentRun(project)?.state.run_id;
41
+ const report = currentId && runs[currentId] ? runs[currentId] : buildStatusReport(project);
19
42
  tracked.clear();
20
43
  for (const id of running)
21
44
  tracked.add(id);
@@ -31,6 +54,7 @@ function fsWatch(dir, onChange) {
31
54
  */
32
55
  export function createStatusWatcher(d) {
33
56
  const tracked = new Set();
57
+ const cache = new Map();
34
58
  const watch = d.watch ?? fsWatch;
35
59
  let lastLine = "";
36
60
  let watching = "";
@@ -41,7 +65,7 @@ export function createStatusWatcher(d) {
41
65
  let project;
42
66
  try {
43
67
  project = d.load();
44
- frame = buildWatchFrame(project, tracked, { allTasks: d.allTasks });
68
+ frame = buildWatchFrame(project, tracked, { allTasks: d.allTasks, cache });
45
69
  }
46
70
  catch (e) {
47
71
  frame = { schema_version: 1, error: e.message };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-lyceum",
3
- "version": "0.32.0",
3
+ "version": "0.33.1",
4
4
  "description": "Config + dispatcher for teams of Claude Code / Codex agents with scoped context and file-based mailboxes",
5
5
  "keywords": [
6
6
  "ai",
@@ -0,0 +1,2 @@
1
+ /*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
2
+ @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-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--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-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-animation-delay:0s;--tw-animation-direction:normal;--tw-animation-duration:initial;--tw-animation-fill-mode:none;--tw-animation-iteration-count:1;--tw-enter-blur:0;--tw-enter-opacity:1;--tw-enter-rotate:0;--tw-enter-scale:1;--tw-enter-translate-x:0;--tw-enter-translate-y:0;--tw-exit-blur:0;--tw-exit-opacity:1;--tw-exit-rotate:0;--tw-exit-scale:1;--tw-exit-translate-x:0;--tw-exit-translate-y:0}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, -apple-system, "Segoe UI", "PingFang TC", "Noto Sans TC", "Microsoft JhengHei", sans-serif;--spacing:.25rem;--container-xl:36rem;--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-base:1rem;--text-base--line-height:calc(1.5 / 1);--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);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--font-weight-medium:500;--font-weight-semibold:600;--tracking-tight:-.025em;--leading-snug:1.375;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:ui-sans-serif, system-ui, -apple-system, "Segoe UI", "PingFang TC", "Noto Sans TC", "Microsoft JhengHei", sans-serif;--default-mono-font-family:ui-monospace, "SF Mono", "JetBrains Mono", Menlo, Consolas, monospace}}@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,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, 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:where(:not(iframe)){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{.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.top-0{top:0}.top-3{top:calc(var(--spacing) * 3)}.-left-8{left:calc(var(--spacing) * -8)}.left-1\/2{left:50%}.z-10{z-index:10}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-auto{margin-top:auto}.mr-2{margin-right:calc(var(--spacing) * 2)}.ml-3{margin-left:calc(var(--spacing) * 3)}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.size-1\.5{width:calc(var(--spacing) * 1.5);height:calc(var(--spacing) * 1.5)}.size-2{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.h-2{height:calc(var(--spacing) * 2)}.h-3{height:calc(var(--spacing) * 3)}.h-7{height:calc(var(--spacing) * 7)}.h-dvh{height:100dvh}.h-full{height:100%}.min-h-0{min-height:0}.w-2\/3{width:66.6667%}.w-20{width:calc(var(--spacing) * 20)}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-xl{max-width:var(--container-xl)}.min-w-0{min-width:0}.min-w-36{min-width:calc(var(--spacing) * 36)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.basis-full{flex-basis:100%}.-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.animate-in{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.animate-pulse{animation:var(--animate-pulse)}.list-decimal{list-style-type:decimal}.list-none{list-style-type:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-\[7rem_minmax\(0\,1fr\)\]{grid-template-columns:7rem minmax(0,1fr)}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-6{gap:calc(var(--spacing) * 6)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * 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)))}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-x-6{column-gap:calc(var(--spacing) * 6)}.gap-y-1{row-gap:var(--spacing)}.self-stretch{align-self:stretch}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.panel{border:1px solid var(--c-line);background:var(--c-paper);border-radius:.75rem}.rounded{border-radius:.25rem}.rounded-full{border-radius:2147483647px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-failed\/40{border-color:var(--c-failed)}@supports (color:color-mix(in lab, red, red)){.border-failed\/40{border-color:color-mix(in oklab, var(--c-failed) 40%, transparent)}}.border-line{border-color:var(--c-line)}.border-signal\/60{border-color:var(--c-signal)}@supports (color:color-mix(in lab, red, red)){.border-signal\/60{border-color:color-mix(in oklab, var(--c-signal) 60%, transparent)}}.border-transparent{border-color:#0000}.border-warn\/40{border-color:var(--c-warn)}@supports (color:color-mix(in lab, red, red)){.border-warn\/40{border-color:color-mix(in oklab, var(--c-warn) 40%, transparent)}}.bg-failed{background-color:var(--c-failed)}.bg-failed-soft{background-color:var(--c-failed-soft)}.bg-ink\/25{background-color:var(--c-ink)}@supports (color:color-mix(in lab, red, red)){.bg-ink\/25{background-color:color-mix(in oklab, var(--c-ink) 25%, transparent)}}.bg-ink\/30{background-color:var(--c-ink)}@supports (color:color-mix(in lab, red, red)){.bg-ink\/30{background-color:color-mix(in oklab, var(--c-ink) 30%, transparent)}}.bg-line{background-color:var(--c-line)}.bg-paper,.bg-paper\/90{background-color:var(--c-paper)}@supports (color:color-mix(in lab, red, red)){.bg-paper\/90{background-color:color-mix(in oklab, var(--c-paper) 90%, transparent)}}.bg-signal{background-color:var(--c-signal)}.bg-signal-soft\/40{background-color:var(--c-signal-soft)}@supports (color:color-mix(in lab, red, red)){.bg-signal-soft\/40{background-color:color-mix(in oklab, var(--c-signal-soft) 40%, transparent)}}.bg-wall,.bg-wall\/50{background-color:var(--c-wall)}@supports (color:color-mix(in lab, red, red)){.bg-wall\/50{background-color:color-mix(in oklab, var(--c-wall) 50%, transparent)}}.bg-warn-soft{background-color:var(--c-warn-soft)}.fill-failed{fill:var(--c-failed)}.fill-none{fill:none}.fill-signal\/70{fill:var(--c-signal)}@supports (color:color-mix(in lab, red, red)){.fill-signal\/70{fill:color-mix(in oklab, var(--c-signal) 70%, transparent)}}.stroke-line{stroke:var(--c-line)}.stroke-working{stroke:var(--c-signal)}.p-0{padding:0}.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-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.pt-0{padding-top:0}.pt-2{padding-top:calc(var(--spacing) * 2)}.inset-safe{padding-bottom:env(safe-area-inset-bottom);padding-left:env(safe-area-inset-left)}.pb-1{padding-bottom:var(--spacing)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-5{padding-left:calc(var(--spacing) * 5)}.pl-8{padding-left:calc(var(--spacing) * 8)}.text-left{text-align:left}.font-mono{font-family:ui-monospace,SF Mono,JetBrains Mono,Menlo,Consolas,monospace}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--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-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.eyebrow{letter-spacing:.06em;text-transform:uppercase;color:var(--c-ink);font-size:.75rem;font-weight:600}@supports (color:color-mix(in lab, red, red)){.eyebrow{color:color-mix(in oklab, var(--c-ink) 60%, transparent)}}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.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-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.text-balance{text-wrap:balance}.text-pretty{text-wrap:pretty}.wrap-break-word{overflow-wrap:break-word}.whitespace-pre-wrap{white-space:pre-wrap}.text-failed{color:var(--c-failed)}.text-ink,.text-ink\/50{color:var(--c-ink)}@supports (color:color-mix(in lab, red, red)){.text-ink\/50{color:color-mix(in oklab, var(--c-ink) 50%, transparent)}}.text-ink\/60{color:var(--c-ink)}@supports (color:color-mix(in lab, red, red)){.text-ink\/60{color:color-mix(in oklab, var(--c-ink) 60%, transparent)}}.text-ink\/70{color:var(--c-ink)}@supports (color:color-mix(in lab, red, red)){.text-ink\/70{color:color-mix(in oklab, var(--c-ink) 70%, transparent)}}.text-ink\/80{color:var(--c-ink)}@supports (color:color-mix(in lab, red, red)){.text-ink\/80{color:color-mix(in oklab, var(--c-ink) 80%, transparent)}}.text-signal{color:var(--c-signal)}.text-warn{color:var(--c-warn)}.text-working{color:var(--c-signal)}.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}.backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.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))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.enter{--tw-ease:ease-out}.fade-in{--tw-enter-opacity:0}.running{animation-play-state:running}.group-data-\[open\]\:hidden:is(:where(.group)[data-open] *){display:none}.group-data-\[open\]\:inline:is(:where(.group)[data-open] *){display:inline}.first\:mt-0:first-child{margin-top:0}@media (hover:hover){.hover\:bg-wall:hover,.hover\:bg-wall\/70:hover{background-color:var(--c-wall)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-wall\/70:hover{background-color:color-mix(in oklab, var(--c-wall) 70%, transparent)}}}.disabled\:opacity-60:disabled{opacity:.6}@media (width>=40rem){.sm\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}}@media (width>=48rem){.md\:block{display:block}.md\:h-dvh{height:100dvh}.md\:min-w-0{min-width:0}.md\:grid-cols-\[15rem_minmax\(0\,1fr\)\]{grid-template-columns:15rem minmax(0,1fr)}.md\:flex-col{flex-direction:column}.md\:overflow-y-auto{overflow-y:auto}.md\:border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.md\:border-b-0{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.md\:text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}}@media (width>=64rem){.lg\:sticky{position:sticky}.lg\:top-16{top:calc(var(--spacing) * 16)}.lg\:max-h-\[calc\(100dvh-5rem\)\]{max-height:calc(100dvh - 5rem)}.lg\:grid-cols-\[minmax\(0\,1fr\)_19rem\]{grid-template-columns:minmax(0,1fr) 19rem}.lg\:self-start{align-self:flex-start}.lg\:overflow-y-auto{overflow-y:auto}.lg\:p-6{padding:calc(var(--spacing) * 6)}}}@property --tw-animation-delay{syntax:"*";inherits:false;initial-value:0s}@property --tw-animation-direction{syntax:"*";inherits:false;initial-value:normal}@property --tw-animation-duration{syntax:"*";inherits:false}@property --tw-animation-fill-mode{syntax:"*";inherits:false;initial-value:none}@property --tw-animation-iteration-count{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-translate-y{syntax:"*";inherits:false;initial-value:0}:root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light dark;--c-ink:#0f172a;--c-wall:#eef1f5;--c-paper:#fff;--c-line:#d6dce5;--c-signal:#047857;--c-signal-soft:#d1fae5;--c-failed:#b91c1c;--c-failed-soft:#fee2e2;--c-warn:#a16207;--c-warn-soft:#fef3c7}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial;--c-ink:#e6ebf2;--c-wall:#0b1220;--c-paper:#111a2b;--c-line:#25324a;--c-signal:#34d399;--c-signal-soft:#0d3b2e;--c-failed:#f87171;--c-failed-soft:#3f1a1f;--c-warn:#fbbf24;--c-warn-soft:#3a2f0f}}body{font-family:var(--font-sans);color:var(--c-ink);background:var(--c-wall);-webkit-font-smoothing:antialiased;margin:0}button{cursor:pointer;transition:background-color .15s ease-out,border-color .15s ease-out,color .15s ease-out}button:disabled{cursor:default}:focus-visible{outline:2px solid var(--c-signal);outline-offset:2px}@keyframes pulse-dot{0%,to{opacity:1;transform:scale(1)}50%{opacity:.4;transform:scale(.8)}}.pulse-dot{animation:1.6s ease-in-out infinite pulse-dot}@media (prefers-reduced-motion:reduce){.enter,.pulse-dot{animation:none}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@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-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@keyframes pulse{50%{opacity:.5}}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0));filter:blur(var(--tw-enter-blur,0))}}