@adonis-agora/durable-dashboard 0.8.3 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +44 -0
- package/dist/spa/assets/index-Co0ef3-q.css +1 -0
- package/dist/spa/assets/index-DmgfShPp.js +16 -0
- package/dist/spa/assets/index-DmgfShPp.js.map +1 -0
- package/dist/spa/index.html +2 -2
- package/package.json +3 -3
- package/skills/durable-observability/SKILL.md +2 -1
- package/dist/spa/assets/index-6nmSTfT7.css +0 -1
- package/dist/spa/assets/index-BULnCUuC.js +0 -16
- package/dist/spa/assets/index-BULnCUuC.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,49 @@
|
|
|
1
1
|
# @adonis-agora/durable-dashboard
|
|
2
2
|
|
|
3
|
+
## 0.9.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [#452](https://github.com/DavideCarvalho/adonis-agora-durable/pull/452) [`c8da086`](https://github.com/DavideCarvalho/adonis-agora-durable/commit/c8da086545c841c8aab7bc89784aec5ec43e3131) Thanks [@DavideCarvalho](https://github.com/DavideCarvalho)! - Start a workflow when another one finishes, without the finishing workflow knowing about it. When a run settles, the engine publishes `run.completed:<workflow>` or `run.failed:<workflow>` with the run's input, output, error, tags and search attributes, and `@OnWorkflowCompleted(Workflow, { where, input })` / `@OnWorkflowFailed(Workflow, { where, input, statuses })` subscribe to it. With a class ref, the subscriber's `run` input is type-checked against the event, or against what `input` builds from it.
|
|
8
|
+
|
|
9
|
+
Delivery is exactly once per subscriber and settled run: the terminal status write also tags the run `durable:lifecycle:pending`, the live publish swaps it for `durable:triggered:<subscriber>` tags, and the `durable:work` tick (`engine.sweepLifecycleEvents`) publishes any run still marked after 30 seconds. Subscriber run ids are deterministic (`evt:<runId>:<kind>:<subscriber>`), so publishing twice starts each subscriber once. A subscriber whose `where` throws or whose start fails is reported as `run.trigger_failed` and not retried.
|
|
10
|
+
|
|
11
|
+
`onEvent` entries can now be `{ event, where, input }`. The two runs are linked both ways: the run detail carries `triggered` and `triggeredBy` (read from the run rows, so any process can answer), and the dashboard's run header lists them. `engine.triggeredRuns(runId)`, `triggeredRunsOf(run)` and `lifecycleSourceOf(run)` give the same links in code. The engine emits `run.triggered` and `run.trigger_failed`, counted by the metrics as `runs.triggered` and `runs.triggerFailed`.
|
|
12
|
+
|
|
13
|
+
Retention skips a run still tagged `durable:lifecycle:pending`, so a short retention window cannot delete a run before its lifecycle event is published.
|
|
14
|
+
|
|
15
|
+
Subscriptions are announced by the fleet, so a subscriber registered on only some instances (or during a rolling deploy) is not lost. The terminal write also tags the run `durable:lifecycle:owed:<subscriber>` (`LIFECYCLE_OWED_TAG_PREFIX`) for every subscriber registered locally or announced by the fleet, read with a 5s cache from two places: the lifecycle subscription registry in the state store, which works with every transport (one completed `__lifecycle_registry` run per engine with `onEvent` subscriptions, `LIFECYCLE_REGISTRY_WORKFLOW`, `lifecycleRegistryRunId`, `LIFECYCLE_REGISTRY_TAG`, `LifecycleRegistryEntry`, `lifecycleRegistrySubscriptions`, rewritten every 10s by the `durable:work` tick through `engine.heartbeatLifecycleRegistry()`, live for 35s, deleted 10 minutes after its engine stopped: `LIFECYCLE_REGISTRY_HEARTBEAT_MS`, `LIFECYCLE_REGISTRY_TTL_MS`, `LIFECYCLE_REGISTRY_STALE_MS`), and the new `subscribes` field of a worker descriptor's `registrations` (how a Python subscriber is announced). Registry runs are kept by retention (`retentionKeeps`) and left out of a policy's `maxCount`, and `engine.listRuns` / `countRuns` / `runFacets` / `runValueFacets` leave them out through the new `RunQuery.excludeWorkflows` (`NOT IN`, implemented by the in-memory and Lucid stores) unless the query names the registry workflow. A run is owed only to the subscribers that serve its namespace (`engine.lifecycleSubscribers(workflow, kind, namespace)`): the settling instance's own when it has no namespace or the run's, registry rows of instances in that namespace or with none (`LifecycleRegistryEntry.engineNamespace`, `null` for an instance with no namespace, read by `lifecycleRegistryNamespace`), and descriptors serving it, so an instance with no namespace no longer marks a tenant's run owed to another tenant's subscribers. Each instance starts only the owed subscribers it has and drops `durable:lifecycle:pending` with the last owed tag; an owed subscriber no live worker announces is dropped after 24 hours (`LIFECYCLE_ORPHAN_MS`) with `run.trigger_failed`.
|
|
16
|
+
|
|
17
|
+
`ctx.waitForRun(runId, { timeoutMs })` (and `ctx.waitForRun(WorkflowClass, runId)`, typed as `LifecycleEventOf<C>`) waits durably for any run to settle, following a continue-as-new chain to its last run (at most 100 hops), and resolves with its lifecycle event, at once if it already settled. An unknown run throws a non-retryable `FatalError`; the timer sweep (`engine.sweepRunWaits`) wakes waiters whose wake was lost.
|
|
18
|
+
|
|
19
|
+
`engine.republishLifecycle({ runId } | { workflow, kind, since, until, limit })`, with an optional `subscriber`, publishes settled runs' lifecycle events again (idempotent, returns `{ runs, started, failed }`) to backfill a subscriber registered after the runs settled. It starts the subscribers registered on the calling instance and marks any other one owed again, for the sweep of an instance that has it. The workflow form takes a `namespace`. It is also a run gateway verb carried by the tenant proxy in both forms (`{ kind: 'republishLifecycle', target }`: a run is ownership-checked like `retry`, a workflow's runs are forced to the tenant's namespace), the `durable:lifecycle:republish` ace command, `POST /runs/:id/republish-lifecycle`, and a "Republish lifecycle event" action in the dashboard, whose run detail now carries `lifecycleSubscribers`.
|
|
20
|
+
|
|
21
|
+
`eventBatch` takes a `key` (debounce and batch), so events coalesce per key into their own accumulator (`__evtacc__:<target>#<key>`; the unkeyed id is unchanged), and is now a `static workflow` option. `@OnWorkflowCompleted` / `@OnWorkflowFailed` take `debounce: { windowMs, key }` or `batch: { maxSize, windowMs, key }`, with `key` typed by the subscriber's input and a batched subscriber typed as `{ events }`.
|
|
22
|
+
|
|
23
|
+
A Python workflow (Aviary's `durable-worker`: `@worker.workflow("notify", on_workflow_completed="ingest", on_workflow_failed=..., on_event=[...])`) announces `subscribes` and is started by name, under the deterministic lifecycle id with the event as input, by an engine that reaches its worker group (registered with `registerRemote`, or a live group of that name); `publishEvent` starts an announced `on_event` subscriber the same way. A subscriber another Node engine announces is left to it, and one registered locally is started once, through its own `onEvent`.
|
|
24
|
+
|
|
25
|
+
The lifecycle sweep pages through marked runs (at most 1000 read per tick) and skips the ones it cannot act on, so runs owed only to subscribers on other instances no longer starve the ones it can publish. `sweepRunWaits` skips waiters on runs still in flight, reads at most 1000 waited-on runs per call and resumes where the last call stopped.
|
|
26
|
+
|
|
27
|
+
With `attachDurableOtel`, a lifecycle subscriber's run span links to its source run's span and carries `durable.lifecycle.source_run_id` and `durable.lifecycle.kind`. The bridge installs `engine.setRunTraceparent`, the run's first suspend write (or else its settling write) records its root span as a `durable:lifecycle:trace:<traceparent>` tag (`LIFECYCLE_TRACE_TAG_PREFIX`, `lifecycleTraceparentOf`), so the link holds when the run settles on an instance that never saw its first turn, and the subscriber's `run.started` carries it as `sourceTraceparent`. The metrics count subscriber runs by settled workflow and subscriber (`triggeredBySubscriber`, `durable_runs_triggered_total{workflow,subscriber}`).
|
|
28
|
+
|
|
29
|
+
`engine.workflowLifecycle(workflow)` (`WorkflowLifecycleLinks` of `LifecycleSubscriptionLink`, plus `parseLifecycleEvent`) answers who starts whom: the workflows that start when it settles and the ones whose settling starts it, local and announced, with their `where`, `input` and debounce/batch. `engine.workflowLifecycle(workflow, { namespace })` keeps only one namespace's subscriptions. It is a run gateway verb (`workflowLifecycle`, carried by the tenant proxy and scoped to the tenant's namespace, like the run detail's lifecycle links), `GET /workflows/:name/lifecycle`, the run detail's `workflowLifecycle`, and a workflow page in the dashboard (`#/workflow/<name>`).
|
|
30
|
+
|
|
31
|
+
A tenant proxy talking to a control plane older than `republishLifecycle` or `workflowLifecycle` rejects at once with the new `RunGatewayError` (code `unsupported-request`, `<verb> is not supported by this server`), which every refused `ProxyRunGateway` call now rejects with (`RunGatewayErrorCode`); the dashboard answers `501`.
|
|
32
|
+
|
|
33
|
+
The dashboard shows where every lifecycle feature stands. The run detail (`GET /runs/:id`, from `engine.getRunDetail`) carries `lifecycleDeliveries` (`LifecycleDelivery`, `LifecycleDeliveryState`, built by `lifecycleDeliveriesOf`): per subscriber of a settled run, `started` with its run and status, `owed` with since when (`owedSince`) and, when no live instance has it, when the sweep drops it (`orphanAt`), `coalesced` with the accumulator run when derivable, or `not-started`; `waitsFor` and `awaitedBy` (`RunWaitLink`), the `ctx.waitForRun` waits on either side of a run with the other run's status; and `triggeredBy` (`LifecycleSource`) adds the source run's `status`, `namespace` and the `traceId` of its recorded span. The detail's ETag covers those reads of other runs (`extendEtag`), and a tenant proxy keeps them to the tenant's own runs. The run list names a `ctx.waitForRun` wait as `waiting: { on: 'run', name: <runId> }`, and has a "lifecycle pending" chip selecting runs tagged `durable:lifecycle:pending`. The run header shows "started by `<run>` on completed / failed" with the source's status and a copyable trace id, "Waiting for run `<id>`", "Awaited by", and a "Lifecycle subscribers" list beside the Republish action. `GET /workflows/:name/lifecycle` adds `triggerCounts` (started and failed per subscriber, counted by the dashboard's process), shown on the workflow page, from the new `triggerFailedBySubscriber` metric (`durable_runs_trigger_failed_total{workflow,subscriber}`).
|
|
34
|
+
|
|
35
|
+
The Telescope "Workflows" dashboard adds "Failed triggers" (recent `run.trigger_failed`) and "Owed lifecycle events" (settled runs still owed past the 30s grace) to "Needs attention", and a "Lifecycle" section with "Lifecycle triggers over time" and "Triggered by subscriber", backed by the new `durable.failedTriggers`, `durable.owedLifecycle` and `durable.lifecycleTriggers` providers (`durableFailedTriggersProvider`, `durableOwedLifecycleProvider`, `durableLifecycleTriggersProvider`). The diagnostics bridge stamps a lifecycle subscriber's events with `lifecycleSourceRunId` and `lifecycleKind`, and `dedupeRunEvents` keeps apart two subscribers of one run whose events share an instant. "Needs attention" also has an "Owed runs" stat (`durable.owedLifecycle` with `{ metric: 'count' }`, one `countRuns`). The opt-in `DurableTelescopeWatcher` (wired to Telescope's `safeRecord`, with `buildDurableEntry`, `durableEntryTags`, `DURABLE_DIAGNOSTIC_EVENTS`, `traceIdOfTraceparent`, `TelescopeRecordInput`, `WatcherContext`) records durable's diagnostics events with the same tags as the NestJS watcher (`run:<id>`, `parent:`, `workflow:`, `triggered`, `trigger_failed`, `subscriber:<name>`, `lifecycle`, `source:<id>`, `sourceTrace:<id>`), claiming the `durable:*` keys so the generic watcher skips them.
|
|
36
|
+
|
|
37
|
+
A subscriber a settled run could not start (its `where` threw, its input was rejected, its start failed, or the sweep dropped it as an orphan) gets a `durable:trigger_failed:<subscriber>` tag (`LIFECYCLE_TRIGGER_FAILED_TAG_PREFIX`, `lifecycleTriggerFailedTag`) in the same tag write that drops its owed tag, removed by the write that records a later start of it; it is left out of the event's `tags`. `LifecycleDeliveryState` gains `failed` and `LifecycleDelivery` gains `error` (not stored with the run: the reason stays in the `run.trigger_failed` event), and the dashboard row shows "failed" with the reason when the page saw the event; Republish retries it. The run detail has an "Events" panel rendering the run's live stream (the last 200 events while the page is open, nothing stored), linking `run.triggered`, lifecycle-started and child runs both ways.
|
|
38
|
+
|
|
39
|
+
A run that settles before its instance has read the fleet's subscriptions (right after boot, or while the read fails) is marked `durable:lifecycle:pending` with no owed tag: its owed set is unresolved, and the first publish with a successful read (the live publish, or the sweep, which reads again on every tick while the last read failed) resolves it into owed tags for every subscriber the run's tags do not record as started or failed (`deliveredSubscribersOf`). Until then an instance starts its own subscribers and keeps the run marked. Each sweep also heals the runs settled in the last two minutes (`LIFECYCLE_HEAL_WINDOW_MS`, up to 100 per subscribed workflow, through the new `RunQuery.updatedAfter`, implemented by the in-memory and Lucid stores and covered by the conformance suite): a subscriber announced just after a run settled is started or marked owed, once per instance. A subscriber that appears later is a backfill for `republishLifecycle`. The subscription registry is read page by page, so a fleet past 1000 rows is read whole.
|
|
40
|
+
|
|
41
|
+
Publishers of one run take turns: the live publish, the sweep, the heal and a republish each hold the run's lease (owner `<instanceId>#lifecycle#<uuid>`) while they read the run, start subscribers and write its tags, asking again after 50 to 800 ms and leaving a still-held run to the sweep (a republish reports it in `failed` with subscriber `*`); an explicit retry of a failed run waits for a publish holding it. `run.triggered` and `run.trigger_failed` are emitted only by the write that adds the subscriber's tag. A debounce/batch subscriber's delivery is recorded as a `durable:coalesced:<subscriber>` tag (`LIFECYCLE_COALESCED_TAG_PREFIX`, `lifecycleCoalescedTag`, `coalescedSubscribersOf`), so the heal never routes it again, its `run.triggered` comes from the write that adds the tag, the run detail shows it `coalesced`, and a republish routes it again only after a failed delivery. A debounce/batch accumulator drops an event it already took (named by the subscriber run id it would start; an event published with the same `id`, for `publishEvent`), remembering the last 200 across bursts, so a routed event never counts twice.
|
|
42
|
+
|
|
43
|
+
`republishLifecycle` reads the fleet's subscriptions afresh and refuses a `subscriber` that does not subscribe to the run's ending (`subscriber <name> does not subscribe to <event>` in `failed`, nothing marked). Over the run gateway, the control plane also refuses, with the new `bad-request` code (`400` in the dashboard), a `limit` that is not a positive integer and a `subscriber` that does not subscribe in the tenant's namespace, and clamps `limit` to 1000.
|
|
44
|
+
|
|
45
|
+
Two `debounce`/`batch` configs on one workflow match when their mode, window, size and `key` source text match, so separately written identical `key` arrows no longer throw; keys whose source differs still do.
|
|
46
|
+
|
|
3
47
|
## 0.8.3
|
|
4
48
|
|
|
5
49
|
### Patch Changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.react-flow{--xy-edge-stroke-default:#b1b1b7;--xy-edge-stroke-width-default:1;--xy-edge-stroke-selected-default:#555;--xy-connectionline-stroke-default:#b1b1b7;--xy-connectionline-stroke-width-default:1;--xy-attribution-background-color-default:#ffffff80;--xy-minimap-background-color-default:#fff;--xy-minimap-mask-background-color-default:#f0f0f099;--xy-minimap-mask-stroke-color-default:transparent;--xy-minimap-mask-stroke-width-default:1;--xy-minimap-node-background-color-default:#e2e2e2;--xy-minimap-node-stroke-color-default:transparent;--xy-minimap-node-stroke-width-default:2;--xy-background-color-default:transparent;--xy-background-pattern-dots-color-default:#91919a;--xy-background-pattern-lines-color-default:#eee;--xy-background-pattern-cross-color-default:#e2e2e2;background-color:var(--xy-background-color,var(--xy-background-color-default));--xy-node-color-default:inherit;--xy-node-border-default:1px solid #1a192b;--xy-node-background-color-default:#fff;--xy-node-group-background-color-default:#f0f0f040;--xy-node-boxshadow-hover-default:0 1px 4px 1px #00000014;--xy-node-boxshadow-selected-default:0 0 0 .5px #1a192b;--xy-node-border-radius-default:3px;--xy-handle-background-color-default:#1a192b;--xy-handle-border-color-default:#fff;--xy-selection-background-color-default:#0059dc14;--xy-selection-border-default:1px dotted #0059dccc;--xy-controls-button-background-color-default:#fefefe;--xy-controls-button-background-color-hover-default:#f4f4f4;--xy-controls-button-color-default:inherit;--xy-controls-button-color-hover-default:inherit;--xy-controls-button-border-color-default:#eee;--xy-controls-box-shadow-default:0 0 2px 1px #00000014;--xy-edge-label-background-color-default:#fff;--xy-edge-label-color-default:inherit;--xy-resize-background-color-default:#3367d9;direction:ltr}.react-flow.dark{--xy-edge-stroke-default:#3e3e3e;--xy-edge-stroke-width-default:1;--xy-edge-stroke-selected-default:#727272;--xy-connectionline-stroke-default:#b1b1b7;--xy-connectionline-stroke-width-default:1;--xy-attribution-background-color-default:#96969640;--xy-minimap-background-color-default:#141414;--xy-minimap-mask-background-color-default:#3c3c3c99;--xy-minimap-mask-stroke-color-default:transparent;--xy-minimap-mask-stroke-width-default:1;--xy-minimap-node-background-color-default:#2b2b2b;--xy-minimap-node-stroke-color-default:transparent;--xy-minimap-node-stroke-width-default:2;--xy-background-color-default:#141414;--xy-background-pattern-dots-color-default:#555;--xy-background-pattern-lines-color-default:#333;--xy-background-pattern-cross-color-default:#333;--xy-node-color-default:#f8f8f8;--xy-node-border-default:1px solid #3c3c3c;--xy-node-background-color-default:#1e1e1e;--xy-node-group-background-color-default:#f0f0f040;--xy-node-boxshadow-hover-default:0 1px 4px 1px #ffffff14;--xy-node-boxshadow-selected-default:0 0 0 .5px #999;--xy-handle-background-color-default:#bebebe;--xy-handle-border-color-default:#1e1e1e;--xy-selection-background-color-default:#c8c8dc14;--xy-selection-border-default:1px dotted #c8c8dccc;--xy-controls-button-background-color-default:#2b2b2b;--xy-controls-button-background-color-hover-default:#3e3e3e;--xy-controls-button-color-default:#f8f8f8;--xy-controls-button-color-hover-default:#fff;--xy-controls-button-border-color-default:#5b5b5b;--xy-controls-box-shadow-default:0 0 2px 1px #00000014;--xy-edge-label-background-color-default:#141414;--xy-edge-label-color-default:#f8f8f8}.react-flow__background{background-color:var(--xy-background-color-props,var(--xy-background-color,var(--xy-background-color-default)));pointer-events:none;z-index:-1}.react-flow__container{width:100%;height:100%;position:absolute;top:0;left:0}.react-flow__pane{z-index:1;touch-action:none}.react-flow__pane.draggable{cursor:grab}.react-flow__pane.dragging{cursor:grabbing}.react-flow__pane.selection{cursor:pointer}.react-flow__viewport{transform-origin:0 0;z-index:2;pointer-events:none}.react-flow__renderer{z-index:4}.react-flow__selection{z-index:6}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible{outline:none}.react-flow__edge-path{stroke:var(--xy-edge-stroke,var(--xy-edge-stroke-default));stroke-width:var(--xy-edge-stroke-width,var(--xy-edge-stroke-width-default));fill:none}.react-flow__connection-path{stroke:var(--xy-connectionline-stroke,var(--xy-connectionline-stroke-default));stroke-width:var(--xy-connectionline-stroke-width,var(--xy-connectionline-stroke-width-default));fill:none}.react-flow .react-flow__edges{position:absolute}.react-flow .react-flow__edges svg{pointer-events:none;position:absolute;overflow:visible}.react-flow__edge{pointer-events:visibleStroke}.react-flow__edge.selectable{cursor:pointer}.react-flow__edge.animated path{stroke-dasharray:5;animation:.5s linear infinite dashdraw}.react-flow__edge.animated path.react-flow__edge-interaction{stroke-dasharray:none;animation:none}.react-flow__edge.inactive{pointer-events:none}.react-flow__edge.selected,.react-flow__edge:focus,.react-flow__edge:focus-visible{outline:none}.react-flow__edge.selected .react-flow__edge-path,.react-flow__edge.selectable:focus .react-flow__edge-path,.react-flow__edge.selectable:focus-visible .react-flow__edge-path{stroke:var(--xy-edge-stroke-selected,var(--xy-edge-stroke-selected-default))}.react-flow__edge-textwrapper{pointer-events:all}.react-flow__edge .react-flow__edge-text{pointer-events:none;-webkit-user-select:none;user-select:none}.react-flow__arrowhead polyline{stroke:var(--xy-edge-stroke,var(--xy-edge-stroke-default))}.react-flow__arrowhead polyline.arrowclosed{fill:var(--xy-edge-stroke,var(--xy-edge-stroke-default))}.react-flow__connection{pointer-events:none}.react-flow__connection .animated{stroke-dasharray:5;animation:.5s linear infinite dashdraw}svg.react-flow__connectionline{z-index:1001;position:absolute;overflow:visible}.react-flow__nodes{pointer-events:none;transform-origin:0 0}.react-flow__node{-webkit-user-select:none;user-select:none;pointer-events:all;transform-origin:0 0;box-sizing:border-box;cursor:default;position:absolute}.react-flow__node.selectable{cursor:pointer}.react-flow__node.draggable{cursor:grab;pointer-events:all}.react-flow__node.draggable.dragging{cursor:grabbing}.react-flow__nodesselection{z-index:3;transform-origin:0 0;pointer-events:none}.react-flow__nodesselection-rect{pointer-events:all;cursor:grab;position:absolute}.react-flow__handle{pointer-events:none;background-color:var(--xy-handle-background-color,var(--xy-handle-background-color-default));border:1px solid var(--xy-handle-border-color,var(--xy-handle-border-color-default));border-radius:100%;width:6px;min-width:5px;height:6px;min-height:5px;position:absolute}.react-flow__handle.connectingfrom{pointer-events:all}.react-flow__handle.connectionindicator{pointer-events:all;cursor:crosshair}.react-flow__handle-bottom{top:auto;bottom:0;left:50%;transform:translate(-50%,50%)}.react-flow__handle-top{top:0;left:50%;transform:translate(-50%,-50%)}.react-flow__handle-left{top:50%;left:0;transform:translate(-50%,-50%)}.react-flow__handle-right{top:50%;right:0;transform:translate(50%,-50%)}.react-flow__edgeupdater{cursor:move;pointer-events:all}.react-flow__pane.selection .react-flow__panel{pointer-events:none}.react-flow__panel{z-index:5;margin:15px;position:absolute}.react-flow__panel.top{top:0}.react-flow__panel.bottom{bottom:0}.react-flow__panel.top.center,.react-flow__panel.bottom.center{left:50%;transform:translate(-15px)translate(-50%)}.react-flow__panel.left{left:0}.react-flow__panel.right{right:0}.react-flow__panel.left.center,.react-flow__panel.right.center{top:50%;transform:translateY(-15px)translateY(-50%)}.react-flow__attribution{background:var(--xy-attribution-background-color,var(--xy-attribution-background-color-default));margin:0;padding:2px 3px;font-size:10px}.react-flow__attribution a{color:#999;text-decoration:none}@keyframes dashdraw{0%{stroke-dashoffset:10px}}.react-flow__edgelabel-renderer{pointer-events:none;-webkit-user-select:none;user-select:none;width:100%;height:100%;position:absolute;top:0;left:0}.react-flow__viewport-portal{-webkit-user-select:none;user-select:none;width:100%;height:100%;position:absolute;top:0;left:0}.react-flow__minimap{background:var(--xy-minimap-background-color-props,var(--xy-minimap-background-color,var(--xy-minimap-background-color-default)))}.react-flow__minimap-svg{display:block}.react-flow__minimap-mask{fill:var(--xy-minimap-mask-background-color-props,var(--xy-minimap-mask-background-color,var(--xy-minimap-mask-background-color-default)));stroke:var(--xy-minimap-mask-stroke-color-props,var(--xy-minimap-mask-stroke-color,var(--xy-minimap-mask-stroke-color-default)));stroke-width:var(--xy-minimap-mask-stroke-width-props,var(--xy-minimap-mask-stroke-width,var(--xy-minimap-mask-stroke-width-default)))}.react-flow__minimap-node{fill:var(--xy-minimap-node-background-color-props,var(--xy-minimap-node-background-color,var(--xy-minimap-node-background-color-default)));stroke:var(--xy-minimap-node-stroke-color-props,var(--xy-minimap-node-stroke-color,var(--xy-minimap-node-stroke-color-default)));stroke-width:var(--xy-minimap-node-stroke-width-props,var(--xy-minimap-node-stroke-width,var(--xy-minimap-node-stroke-width-default)))}.react-flow__background-pattern.dots{fill:var(--xy-background-pattern-color-props,var(--xy-background-pattern-color,var(--xy-background-pattern-dots-color-default)))}.react-flow__background-pattern.lines{stroke:var(--xy-background-pattern-color-props,var(--xy-background-pattern-color,var(--xy-background-pattern-lines-color-default)))}.react-flow__background-pattern.cross{stroke:var(--xy-background-pattern-color-props,var(--xy-background-pattern-color,var(--xy-background-pattern-cross-color-default)))}.react-flow__controls{box-shadow:var(--xy-controls-box-shadow,var(--xy-controls-box-shadow-default));flex-direction:column;display:flex}.react-flow__controls.horizontal{flex-direction:row}.react-flow__controls-button{background:var(--xy-controls-button-background-color,var(--xy-controls-button-background-color-default));border:none;border-bottom:1px solid var(--xy-controls-button-border-color-props,var(--xy-controls-button-border-color,var(--xy-controls-button-border-color-default)));width:26px;height:26px;color:var(--xy-controls-button-color-props,var(--xy-controls-button-color,var(--xy-controls-button-color-default)));cursor:pointer;-webkit-user-select:none;user-select:none;justify-content:center;align-items:center;padding:4px;display:flex}.react-flow__controls-button svg{fill:currentColor;width:100%;max-width:12px;max-height:12px}.react-flow__edge.updating .react-flow__edge-path{stroke:#777}.react-flow__edge-text{font-size:10px}.react-flow__node.selectable:focus,.react-flow__node.selectable:focus-visible{outline:none}.react-flow__node-input,.react-flow__node-default,.react-flow__node-output,.react-flow__node-group{border-radius:var(--xy-node-border-radius,var(--xy-node-border-radius-default));width:150px;color:var(--xy-node-color,var(--xy-node-color-default));text-align:center;border:var(--xy-node-border,var(--xy-node-border-default));background-color:var(--xy-node-background-color,var(--xy-node-background-color-default));padding:10px;font-size:12px}.react-flow__node-input.selectable:hover,.react-flow__node-default.selectable:hover,.react-flow__node-output.selectable:hover,.react-flow__node-group.selectable:hover{box-shadow:var(--xy-node-boxshadow-hover,var(--xy-node-boxshadow-hover-default))}.react-flow__node-input.selectable.selected,.react-flow__node-input.selectable:focus,.react-flow__node-input.selectable:focus-visible,.react-flow__node-default.selectable.selected,.react-flow__node-default.selectable:focus,.react-flow__node-default.selectable:focus-visible,.react-flow__node-output.selectable.selected,.react-flow__node-output.selectable:focus,.react-flow__node-output.selectable:focus-visible,.react-flow__node-group.selectable.selected,.react-flow__node-group.selectable:focus,.react-flow__node-group.selectable:focus-visible{box-shadow:var(--xy-node-boxshadow-selected,var(--xy-node-boxshadow-selected-default))}.react-flow__node-group{background-color:var(--xy-node-group-background-color,var(--xy-node-group-background-color-default))}.react-flow__nodesselection-rect,.react-flow__selection{background:var(--xy-selection-background-color,var(--xy-selection-background-color-default));border:var(--xy-selection-border,var(--xy-selection-border-default))}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible,.react-flow__selection:focus,.react-flow__selection:focus-visible{outline:none}.react-flow__controls-button:hover{background:var(--xy-controls-button-background-color-hover-props,var(--xy-controls-button-background-color-hover,var(--xy-controls-button-background-color-hover-default)));color:var(--xy-controls-button-color-hover-props,var(--xy-controls-button-color-hover,var(--xy-controls-button-color-hover-default)))}.react-flow__controls-button:disabled{pointer-events:none}.react-flow__controls-button:disabled svg{fill-opacity:.4}.react-flow__controls-button:last-child{border-bottom:none}.react-flow__controls.horizontal .react-flow__controls-button{border-bottom:none;border-right:1px solid var(--xy-controls-button-border-color-props,var(--xy-controls-button-border-color,var(--xy-controls-button-border-color-default)))}.react-flow__controls.horizontal .react-flow__controls-button:last-child{border-right:none}.react-flow__resize-control{position:absolute}.react-flow__resize-control.left,.react-flow__resize-control.right{cursor:ew-resize}.react-flow__resize-control.top,.react-flow__resize-control.bottom{cursor:ns-resize}.react-flow__resize-control.top.left,.react-flow__resize-control.bottom.right{cursor:nwse-resize}.react-flow__resize-control.bottom.left,.react-flow__resize-control.top.right{cursor:nesw-resize}.react-flow__resize-control.handle{background-color:var(--xy-resize-background-color,var(--xy-resize-background-color-default));border:1px solid #fff;border-radius:1px;width:5px;height:5px;translate:-50% -50%}.react-flow__resize-control.handle.left{top:50%;left:0}.react-flow__resize-control.handle.right{top:50%;left:100%}.react-flow__resize-control.handle.top{top:0;left:50%}.react-flow__resize-control.handle.bottom{top:100%;left:50%}.react-flow__resize-control.handle.top.left,.react-flow__resize-control.handle.bottom.left{left:0}.react-flow__resize-control.handle.top.right,.react-flow__resize-control.handle.bottom.right{left:100%}.react-flow__resize-control.line{border-color:var(--xy-resize-background-color,var(--xy-resize-background-color-default));border-style:solid;border-width:0}.react-flow__resize-control.line.left,.react-flow__resize-control.line.right{width:1px;height:100%;top:0;transform:translate(-50%)}.react-flow__resize-control.line.left{border-left-width:1px;left:0}.react-flow__resize-control.line.right{border-right-width:1px;left:100%}.react-flow__resize-control.line.top,.react-flow__resize-control.line.bottom{width:100%;height:1px;left:0;transform:translateY(-50%)}.react-flow__resize-control.line.top{border-top-width:1px;top:0}.react-flow__resize-control.line.bottom{border-bottom-width:1px;top:100%}.react-flow__edge-textbg{fill:var(--xy-edge-label-background-color,var(--xy-edge-label-background-color-default))}.react-flow__edge-text{fill:var(--xy-edge-label-color,var(--xy-edge-label-color-default))}@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-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-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--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-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-ease:initial}}}@layer theme{:root,:host{--font-sans:-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";--color-red-200:oklch(88.5% .062 18.334);--color-red-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-amber-100:oklch(96.2% .059 95.617);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-emerald-300:oklch(84.5% .143 164.978);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-teal-200:oklch(91% .096 180.426);--color-teal-300:oklch(85.5% .138 181.071);--color-teal-400:oklch(77.7% .152 181.912);--color-teal-500:oklch(70.4% .14 182.503);--color-sky-200:oklch(90.1% .058 230.902);--color-sky-300:oklch(82.8% .111 230.318);--color-sky-400:oklch(74.6% .16 232.661);--color-sky-500:oklch(68.5% .169 237.323);--color-indigo-100:oklch(93% .034 272.788);--color-indigo-200:oklch(87% .065 274.039);--color-indigo-300:oklch(78.5% .115 274.713);--color-indigo-400:oklch(67.3% .182 276.935);--color-indigo-500:oklch(58.5% .233 277.117);--color-rose-200:oklch(89.2% .058 10.001);--color-rose-300:oklch(81% .117 11.638);--color-rose-500:oklch(64.5% .246 16.439);--color-zinc-50:oklch(98.5% 0 none);--color-zinc-100:oklch(96.7% .001 286.375);--color-zinc-200:oklch(92% .004 286.32);--color-zinc-300:oklch(87.1% .006 286.286);--color-zinc-400:oklch(70.5% .015 286.067);--color-zinc-500:oklch(55.2% .016 285.938);--color-zinc-600:oklch(44.2% .017 285.786);--color-zinc-700:oklch(37% .013 285.805);--color-zinc-800:oklch(27.4% .006 286.033);--color-zinc-900:oklch(21% .006 285.885);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--container-md:28rem;--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);--font-weight-medium:500;--font-weight-semibold:600;--tracking-tight:-.025em;--tracking-normal:0em;--tracking-wide:.025em;--tracking-wider:.05em;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--ease-out:cubic-bezier(0, 0, .2, 1);--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-sm:8px;--blur-md:12px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:"JetBrains Mono", ui-monospace, SFMono-Regular, 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}*,:after,:before,::backdrop{border-color:var(--line)}::file-selector-button{border-color:var(--line)}button:not(:disabled),[role=button]:not(:disabled){cursor:pointer}}@layer components;@layer utilities{.collapse{visibility:collapse}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:0}.inset-x-0{inset-inline:0}.inset-x-6{inset-inline:calc(var(--spacing) * 6)}.inset-y-0{inset-block:0}.top-0{top:0}.top-1\/2{top:50%}.top-full{top:100%}.right-0{right:0}.right-4{right:calc(var(--spacing) * 4)}.bottom-4{bottom:calc(var(--spacing) * 4)}.bottom-6{bottom:calc(var(--spacing) * 6)}.left-0{left:0}.left-1\/2{left:50%}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.order-42{order:42}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.mx-auto{margin-inline:auto}.my-1{margin-block:var(--spacing)}.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)}.mr-1{margin-right:var(--spacing)}.mb-1{margin-bottom:var(--spacing)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.ml-1{margin-left:var(--spacing)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-\[10px\]{margin-left:10px}.ml-\[18px\]{margin-left:18px}.ml-auto{margin-left:auto}.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-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-10{height:calc(var(--spacing) * 10)}.h-40{height:calc(var(--spacing) * 40)}.h-64{height:calc(var(--spacing) * 64)}.h-full{height:100%}.h-px{height:1px}.max-h-48{max-height:calc(var(--spacing) * 48)}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-72{max-height:calc(var(--spacing) * 72)}.max-h-80{max-height:calc(var(--spacing) * 80)}.max-h-\[320px\]{max-height:320px}.min-h-0{min-height:0}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-3{width:calc(var(--spacing) * 3)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-7{width:calc(var(--spacing) * 7)}.w-10{width:calc(var(--spacing) * 10)}.w-16{width:calc(var(--spacing) * 16)}.w-32{width:calc(var(--spacing) * 32)}.w-36{width:calc(var(--spacing) * 36)}.w-40{width:calc(var(--spacing) * 40)}.w-44{width:calc(var(--spacing) * 44)}.w-48{width:calc(var(--spacing) * 48)}.w-72{width:calc(var(--spacing) * 72)}.w-80{width:calc(var(--spacing) * 80)}.w-\[3px\]{width:3px}.w-\[208px\]{width:208px}.w-\[300px\]{width:300px}.w-\[380px\]{width:380px}.w-\[min\(560px\,92vw\)\]{width:min(560px,92vw)}.w-full{width:100%}.max-w-3xl{max-width:var(--container-3xl)}.max-w-\[10rem\]{max-width:10rem}.max-w-\[12rem\]{max-width:12rem}.max-w-\[24rem\]{max-width:24rem}.max-w-\[28rem\]{max-width:28rem}.max-w-\[90\%\]{max-width:90%}.max-w-\[120px\]{max-width:120px}.max-w-\[180px\]{max-width:180px}.max-w-\[280px\]{max-width:280px}.max-w-full{max-width:100%}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.min-w-0{min-width:0}.flex-1{flex:1}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.-rotate-90{rotate:-90deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.cursor-row-resize{cursor:row-resize}.resize{resize:both}.resize-y{resize:vertical}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-\[130px_1fr\]{grid-template-columns:130px 1fr}.grid-cols-\[150px_1fr\]{grid-template-columns:150px 1fr}.grid-cols-\[minmax\(140px\,1\.2fr\)_minmax\(120px\,1fr\)_minmax\(110px\,0\.9fr\)_90px_90px_minmax\(110px\,0\.9fr\)_auto\]{grid-template-columns:minmax(140px,1.2fr) minmax(120px,1fr) minmax(110px,.9fr) 90px 90px minmax(110px,.9fr) auto}.grid-cols-\[minmax\(300px\,360px\)_1fr\]{grid-template-columns:minmax(300px,360px) 1fr}.flex-col{flex-direction:column}.flex-nowrap{flex-wrap:nowrap}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.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}.justify-end{justify-content:flex-end}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}: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(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-y-0\.5{row-gap:calc(var(--spacing) * .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)))}:where(.divide-line-soft>:not(:last-child)){border-color:var(--line-soft)}.self-end{align-self:flex-end}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-\[2px\]{border-radius:2px}.rounded-\[3px\]{border-radius:3px}.rounded-full{border-radius:2147483647px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.\!border-0{border-style:var(--tw-border-style)!important;border-width:0!important}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-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-amber-500\/20{border-color:#f99c0033}@supports (color:color-mix(in lab, red, red)){.border-amber-500\/20{border-color:color-mix(in oklab, var(--color-amber-500) 20%, transparent)}}.border-amber-500\/25{border-color:#f99c0040}@supports (color:color-mix(in lab, red, red)){.border-amber-500\/25{border-color:color-mix(in oklab, var(--color-amber-500) 25%, transparent)}}.border-amber-500\/30{border-color:#f99c004d}@supports (color:color-mix(in lab, red, red)){.border-amber-500\/30{border-color:color-mix(in oklab, var(--color-amber-500) 30%, transparent)}}.border-amber-500\/40{border-color:#f99c0066}@supports (color:color-mix(in lab, red, red)){.border-amber-500\/40{border-color:color-mix(in oklab, var(--color-amber-500) 40%, transparent)}}.border-amber-500\/50{border-color:#f99c0080}@supports (color:color-mix(in lab, red, red)){.border-amber-500\/50{border-color:color-mix(in oklab, var(--color-amber-500) 50%, transparent)}}.border-bad\/25{border-color:var(--bad)}@supports (color:color-mix(in lab, red, red)){.border-bad\/25{border-color:color-mix(in oklab, var(--bad) 25%, transparent)}}.border-brand\/30{border-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.border-brand\/30{border-color:color-mix(in oklab, var(--accent) 30%, transparent)}}.border-brand\/60{border-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.border-brand\/60{border-color:color-mix(in oklab, var(--accent) 60%, transparent)}}.border-current\/30{border-color:currentColor}@supports (color:color-mix(in lab, red, red)){.border-current\/30{border-color:color-mix(in oklab, currentcolor 30%, transparent)}}.border-emerald-500\/25{border-color:#00bb7f40}@supports (color:color-mix(in lab, red, red)){.border-emerald-500\/25{border-color:color-mix(in oklab, var(--color-emerald-500) 25%, transparent)}}.border-indigo-500\/30{border-color:#625fff4d}@supports (color:color-mix(in lab, red, red)){.border-indigo-500\/30{border-color:color-mix(in oklab, var(--color-indigo-500) 30%, transparent)}}.border-indigo-500\/40{border-color:#625fff66}@supports (color:color-mix(in lab, red, red)){.border-indigo-500\/40{border-color:color-mix(in oklab, var(--color-indigo-500) 40%, transparent)}}.border-line{border-color:var(--line)}.border-line-soft{border-color:var(--line-soft)}.border-line\/60{border-color:var(--line)}@supports (color:color-mix(in lab, red, red)){.border-line\/60{border-color:color-mix(in oklab, var(--line) 60%, transparent)}}.border-red-500\/20{border-color:#fb2c3633}@supports (color:color-mix(in lab, red, red)){.border-red-500\/20{border-color:color-mix(in oklab, var(--color-red-500) 20%, transparent)}}.border-red-500\/25{border-color:#fb2c3640}@supports (color:color-mix(in lab, red, red)){.border-red-500\/25{border-color:color-mix(in oklab, var(--color-red-500) 25%, transparent)}}.border-red-500\/30{border-color:#fb2c364d}@supports (color:color-mix(in lab, red, red)){.border-red-500\/30{border-color:color-mix(in oklab, var(--color-red-500) 30%, transparent)}}.border-red-500\/40{border-color:#fb2c3666}@supports (color:color-mix(in lab, red, red)){.border-red-500\/40{border-color:color-mix(in oklab, var(--color-red-500) 40%, transparent)}}.border-rose-500\/30{border-color:#ff23574d}@supports (color:color-mix(in lab, red, red)){.border-rose-500\/30{border-color:color-mix(in oklab, var(--color-rose-500) 30%, transparent)}}.border-rose-500\/40{border-color:#ff235766}@supports (color:color-mix(in lab, red, red)){.border-rose-500\/40{border-color:color-mix(in oklab, var(--color-rose-500) 40%, transparent)}}.border-rose-500\/50{border-color:#ff235780}@supports (color:color-mix(in lab, red, red)){.border-rose-500\/50{border-color:color-mix(in oklab, var(--color-rose-500) 50%, transparent)}}.border-sky-500\/30{border-color:#00a5ef4d}@supports (color:color-mix(in lab, red, red)){.border-sky-500\/30{border-color:color-mix(in oklab, var(--color-sky-500) 30%, transparent)}}.border-sky-500\/40{border-color:#00a5ef66}@supports (color:color-mix(in lab, red, red)){.border-sky-500\/40{border-color:color-mix(in oklab, var(--color-sky-500) 40%, transparent)}}.border-teal-500\/30{border-color:#00baa74d}@supports (color:color-mix(in lab, red, red)){.border-teal-500\/30{border-color:color-mix(in oklab, var(--color-teal-500) 30%, transparent)}}.border-transparent{border-color:#0000}.border-warn\/40{border-color:var(--warn)}@supports (color:color-mix(in lab, red, red)){.border-warn\/40{border-color:color-mix(in oklab, var(--warn) 40%, transparent)}}.border-zinc-500{border-color:var(--color-zinc-500)}.border-zinc-600{border-color:var(--color-zinc-600)}.border-zinc-600\/50{border-color:#52525c80}@supports (color:color-mix(in lab, red, red)){.border-zinc-600\/50{border-color:color-mix(in oklab, var(--color-zinc-600) 50%, transparent)}}.border-zinc-700{border-color:var(--color-zinc-700)}.\!bg-zinc-600{background-color:var(--color-zinc-600)!important}.bg-amber-400{background-color:var(--color-amber-400)}.bg-amber-500\/5{background-color:#f99c000d}@supports (color:color-mix(in lab, red, red)){.bg-amber-500\/5{background-color:color-mix(in oklab, var(--color-amber-500) 5%, transparent)}}.bg-amber-500\/10{background-color:#f99c001a}@supports (color:color-mix(in lab, red, red)){.bg-amber-500\/10{background-color:color-mix(in oklab, var(--color-amber-500) 10%, transparent)}}.bg-amber-500\/15{background-color:#f99c0026}@supports (color:color-mix(in lab, red, red)){.bg-amber-500\/15{background-color:color-mix(in oklab, var(--color-amber-500) 15%, transparent)}}.bg-amber-500\/35{background-color:#f99c0059}@supports (color:color-mix(in lab, red, red)){.bg-amber-500\/35{background-color:color-mix(in oklab, var(--color-amber-500) 35%, transparent)}}.bg-amber-500\/60{background-color:#f99c0099}@supports (color:color-mix(in lab, red, red)){.bg-amber-500\/60{background-color:color-mix(in oklab, var(--color-amber-500) 60%, transparent)}}.bg-bad\/10{background-color:var(--bad)}@supports (color:color-mix(in lab, red, red)){.bg-bad\/10{background-color:color-mix(in oklab, var(--bad) 10%, transparent)}}.bg-black\/15{background-color:#00000026}@supports (color:color-mix(in lab, red, red)){.bg-black\/15{background-color:color-mix(in oklab, var(--color-black) 15%, transparent)}}.bg-black\/20{background-color:#0003}@supports (color:color-mix(in lab, red, red)){.bg-black\/20{background-color:color-mix(in oklab, var(--color-black) 20%, transparent)}}.bg-black\/40{background-color:#0006}@supports (color:color-mix(in lab, red, red)){.bg-black\/40{background-color:color-mix(in oklab, var(--color-black) 40%, transparent)}}.bg-black\/60{background-color:#0009}@supports (color:color-mix(in lab, red, red)){.bg-black\/60{background-color:color-mix(in oklab, var(--color-black) 60%, transparent)}}.bg-brand\/10{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.bg-brand\/10{background-color:color-mix(in oklab, var(--accent) 10%, transparent)}}.bg-current{background-color:currentColor}.bg-emerald-400{background-color:var(--color-emerald-400)}.bg-emerald-400\/45{background-color:#00d29473}@supports (color:color-mix(in lab, red, red)){.bg-emerald-400\/45{background-color:color-mix(in oklab, var(--color-emerald-400) 45%, transparent)}}.bg-emerald-500\/10{background-color:#00bb7f1a}@supports (color:color-mix(in lab, red, red)){.bg-emerald-500\/10{background-color:color-mix(in oklab, var(--color-emerald-500) 10%, transparent)}}.bg-emerald-500\/15{background-color:#00bb7f26}@supports (color:color-mix(in lab, red, red)){.bg-emerald-500\/15{background-color:color-mix(in oklab, var(--color-emerald-500) 15%, transparent)}}.bg-emerald-500\/20{background-color:#00bb7f33}@supports (color:color-mix(in lab, red, red)){.bg-emerald-500\/20{background-color:color-mix(in oklab, var(--color-emerald-500) 20%, transparent)}}.bg-emerald-500\/30{background-color:#00bb7f4d}@supports (color:color-mix(in lab, red, red)){.bg-emerald-500\/30{background-color:color-mix(in oklab, var(--color-emerald-500) 30%, transparent)}}.bg-emerald-500\/40{background-color:#00bb7f66}@supports (color:color-mix(in lab, red, red)){.bg-emerald-500\/40{background-color:color-mix(in oklab, var(--color-emerald-500) 40%, transparent)}}.bg-emerald-500\/60{background-color:#00bb7f99}@supports (color:color-mix(in lab, red, red)){.bg-emerald-500\/60{background-color:color-mix(in oklab, var(--color-emerald-500) 60%, transparent)}}.bg-indigo-500\/10{background-color:#625fff1a}@supports (color:color-mix(in lab, red, red)){.bg-indigo-500\/10{background-color:color-mix(in oklab, var(--color-indigo-500) 10%, transparent)}}.bg-indigo-500\/15{background-color:#625fff26}@supports (color:color-mix(in lab, red, red)){.bg-indigo-500\/15{background-color:color-mix(in oklab, var(--color-indigo-500) 15%, transparent)}}.bg-indigo-500\/20{background-color:#625fff33}@supports (color:color-mix(in lab, red, red)){.bg-indigo-500\/20{background-color:color-mix(in oklab, var(--color-indigo-500) 20%, transparent)}}.bg-line-soft{background-color:var(--line-soft)}.bg-live,.bg-live\/15{background-color:var(--live)}@supports (color:color-mix(in lab, red, red)){.bg-live\/15{background-color:color-mix(in oklab, var(--live) 15%, transparent)}}.bg-live\/20{background-color:var(--live)}@supports (color:color-mix(in lab, red, red)){.bg-live\/20{background-color:color-mix(in oklab, var(--live) 20%, transparent)}}.bg-live\/70{background-color:var(--live)}@supports (color:color-mix(in lab, red, red)){.bg-live\/70{background-color:color-mix(in oklab, var(--live) 70%, transparent)}}.bg-panel{background-color:var(--panel)}.bg-panel-2{background-color:var(--panel-2)}.bg-panel\/95{background-color:var(--panel)}@supports (color:color-mix(in lab, red, red)){.bg-panel\/95{background-color:color-mix(in oklab, var(--panel) 95%, transparent)}}.bg-popover\/95{background-color:var(--panel-2)}@supports (color:color-mix(in lab, red, red)){.bg-popover\/95{background-color:color-mix(in oklab, var(--panel-2) 95%, transparent)}}.bg-red-400{background-color:var(--color-red-400)}.bg-red-500\/10{background-color:#fb2c361a}@supports (color:color-mix(in lab, red, red)){.bg-red-500\/10{background-color:color-mix(in oklab, var(--color-red-500) 10%, transparent)}}.bg-red-500\/15{background-color:#fb2c3626}@supports (color:color-mix(in lab, red, red)){.bg-red-500\/15{background-color:color-mix(in oklab, var(--color-red-500) 15%, transparent)}}.bg-red-500\/20{background-color:#fb2c3633}@supports (color:color-mix(in lab, red, red)){.bg-red-500\/20{background-color:color-mix(in oklab, var(--color-red-500) 20%, transparent)}}.bg-red-500\/25{background-color:#fb2c3640}@supports (color:color-mix(in lab, red, red)){.bg-red-500\/25{background-color:color-mix(in oklab, var(--color-red-500) 25%, transparent)}}.bg-red-500\/35{background-color:#fb2c3659}@supports (color:color-mix(in lab, red, red)){.bg-red-500\/35{background-color:color-mix(in oklab, var(--color-red-500) 35%, transparent)}}.bg-red-500\/40{background-color:#fb2c3666}@supports (color:color-mix(in lab, red, red)){.bg-red-500\/40{background-color:color-mix(in oklab, var(--color-red-500) 40%, transparent)}}.bg-red-500\/70{background-color:#fb2c36b3}@supports (color:color-mix(in lab, red, red)){.bg-red-500\/70{background-color:color-mix(in oklab, var(--color-red-500) 70%, transparent)}}.bg-rose-500\/10{background-color:#ff23571a}@supports (color:color-mix(in lab, red, red)){.bg-rose-500\/10{background-color:color-mix(in oklab, var(--color-rose-500) 10%, transparent)}}.bg-rose-500\/15{background-color:#ff235726}@supports (color:color-mix(in lab, red, red)){.bg-rose-500\/15{background-color:color-mix(in oklab, var(--color-rose-500) 15%, transparent)}}.bg-rose-500\/80{background-color:#ff2357cc}@supports (color:color-mix(in lab, red, red)){.bg-rose-500\/80{background-color:color-mix(in oklab, var(--color-rose-500) 80%, transparent)}}.bg-sky-500\/10{background-color:#00a5ef1a}@supports (color:color-mix(in lab, red, red)){.bg-sky-500\/10{background-color:color-mix(in oklab, var(--color-sky-500) 10%, transparent)}}.bg-sky-500\/15{background-color:#00a5ef26}@supports (color:color-mix(in lab, red, red)){.bg-sky-500\/15{background-color:color-mix(in oklab, var(--color-sky-500) 15%, transparent)}}.bg-teal-500\/10{background-color:#00baa71a}@supports (color:color-mix(in lab, red, red)){.bg-teal-500\/10{background-color:color-mix(in oklab, var(--color-teal-500) 10%, transparent)}}.bg-transparent{background-color:#0000}.bg-warn\/10{background-color:var(--warn)}@supports (color:color-mix(in lab, red, red)){.bg-warn\/10{background-color:color-mix(in oklab, var(--warn) 10%, transparent)}}.bg-zinc-500\/60{background-color:#71717b99}@supports (color:color-mix(in lab, red, red)){.bg-zinc-500\/60{background-color:color-mix(in oklab, var(--color-zinc-500) 60%, transparent)}}.bg-zinc-700\/40{background-color:#3f3f4666}@supports (color:color-mix(in lab, red, red)){.bg-zinc-700\/40{background-color:color-mix(in oklab, var(--color-zinc-700) 40%, transparent)}}.bg-zinc-700\/70{background-color:#3f3f46b3}@supports (color:color-mix(in lab, red, red)){.bg-zinc-700\/70{background-color:color-mix(in oklab, var(--color-zinc-700) 70%, transparent)}}.bg-zinc-800{background-color:var(--color-zinc-800)}.bg-zinc-800\/40{background-color:#27272a66}@supports (color:color-mix(in lab, red, red)){.bg-zinc-800\/40{background-color:color-mix(in oklab, var(--color-zinc-800) 40%, transparent)}}.bg-zinc-800\/50{background-color:#27272a80}@supports (color:color-mix(in lab, red, red)){.bg-zinc-800\/50{background-color:color-mix(in oklab, var(--color-zinc-800) 50%, transparent)}}.bg-zinc-800\/60{background-color:#27272a99}@supports (color:color-mix(in lab, red, red)){.bg-zinc-800\/60{background-color:color-mix(in oklab, var(--color-zinc-800) 60%, transparent)}}.bg-zinc-800\/70{background-color:#27272ab3}@supports (color:color-mix(in lab, red, red)){.bg-zinc-800\/70{background-color:color-mix(in oklab, var(--color-zinc-800) 70%, transparent)}}.bg-zinc-900{background-color:var(--color-zinc-900)}.bg-zinc-900\/30{background-color:#18181b4d}@supports (color:color-mix(in lab, red, red)){.bg-zinc-900\/30{background-color:color-mix(in oklab, var(--color-zinc-900) 30%, transparent)}}.bg-zinc-900\/40{background-color:#18181b66}@supports (color:color-mix(in lab, red, red)){.bg-zinc-900\/40{background-color:color-mix(in oklab, var(--color-zinc-900) 40%, transparent)}}.bg-zinc-900\/60{background-color:#18181b99}@supports (color:color-mix(in lab, red, red)){.bg-zinc-900\/60{background-color:color-mix(in oklab, var(--color-zinc-900) 60%, transparent)}}.p-0{padding:0}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.px-0{padding-inline:0}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.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-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-7{padding-inline:calc(var(--spacing) * 7)}.py-0{padding-block:0}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.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)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-px{padding-block:1px}.pt-1\.5{padding-top:calc(var(--spacing) * 1.5)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pb-1\.5{padding-bottom:calc(var(--spacing) * 1.5)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pl-1{padding-left:var(--spacing)}.pl-2{padding-left:calc(var(--spacing) * 2)}.pl-3\.5{padding-left:calc(var(--spacing) * 3.5)}.pl-\[26px\]{padding-left:26px}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.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))}.text-\[9px\]{font-size:9px}.text-\[10\.5px\]{font-size:10.5px}.text-\[10px\]{font-size:10px}.text-\[11\.5px\]{font-size:11.5px}.text-\[11px\]{font-size:11px}.text-\[12\.5px\]{font-size:12.5px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[15px\]{font-size:15px}.leading-7{--tw-leading:calc(var(--spacing) * 7);line-height:calc(var(--spacing) * 7)}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.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-\[0\.2em\]{--tw-tracking:.2em;letter-spacing:.2em}.tracking-\[0\.15em\]{--tw-tracking:.15em;letter-spacing:.15em}.tracking-\[0\.16em\]{--tw-tracking:.16em;letter-spacing:.16em}.tracking-\[0\.18em\]{--tw-tracking:.18em;letter-spacing:.18em}.tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.break-words{overflow-wrap:break-word}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.text-amber-100{color:var(--color-amber-100)}.text-amber-200{color:var(--color-amber-200)}.text-amber-300{color:var(--color-amber-300)}.text-amber-300\/70{color:#ffd236b3}@supports (color:color-mix(in lab, red, red)){.text-amber-300\/70{color:color-mix(in oklab, var(--color-amber-300) 70%, transparent)}}.text-amber-300\/80{color:#ffd236cc}@supports (color:color-mix(in lab, red, red)){.text-amber-300\/80{color:color-mix(in oklab, var(--color-amber-300) 80%, transparent)}}.text-amber-400\/70{color:#fcbb00b3}@supports (color:color-mix(in lab, red, red)){.text-amber-400\/70{color:color-mix(in oklab, var(--color-amber-400) 70%, transparent)}}.text-amber-400\/80{color:#fcbb00cc}@supports (color:color-mix(in lab, red, red)){.text-amber-400\/80{color:color-mix(in oklab, var(--color-amber-400) 80%, transparent)}}.text-bad{color:var(--bad)}.text-brand{color:var(--accent)}.text-emerald-300{color:var(--color-emerald-300)}.text-emerald-400{color:var(--color-emerald-400)}.text-emerald-500\/80{color:#00bb7fcc}@supports (color:color-mix(in lab, red, red)){.text-emerald-500\/80{color:color-mix(in oklab, var(--color-emerald-500) 80%, transparent)}}.text-foreground{color:var(--text)}.text-good{color:var(--good)}.text-indigo-300{color:var(--color-indigo-300)}.text-indigo-300\/70{color:#a4b3ffb3}@supports (color:color-mix(in lab, red, red)){.text-indigo-300\/70{color:color-mix(in oklab, var(--color-indigo-300) 70%, transparent)}}.text-indigo-300\/80{color:#a4b3ffcc}@supports (color:color-mix(in lab, red, red)){.text-indigo-300\/80{color:color-mix(in oklab, var(--color-indigo-300) 80%, transparent)}}.text-indigo-400{color:var(--color-indigo-400)}.text-live{color:var(--live)}.text-red-200{color:var(--color-red-200)}.text-red-300{color:var(--color-red-300)}.text-red-300\/70{color:#ffa3a3b3}@supports (color:color-mix(in lab, red, red)){.text-red-300\/70{color:color-mix(in oklab, var(--color-red-300) 70%, transparent)}}.text-red-400{color:var(--color-red-400)}.text-red-400\/80{color:#ff6568cc}@supports (color:color-mix(in lab, red, red)){.text-red-400\/80{color:color-mix(in oklab, var(--color-red-400) 80%, transparent)}}.text-rose-200{color:var(--color-rose-200)}.text-rose-300{color:var(--color-rose-300)}.text-rose-300\/70{color:#ffa2aeb3}@supports (color:color-mix(in lab, red, red)){.text-rose-300\/70{color:color-mix(in oklab, var(--color-rose-300) 70%, transparent)}}.text-rose-300\/80{color:#ffa2aecc}@supports (color:color-mix(in lab, red, red)){.text-rose-300\/80{color:color-mix(in oklab, var(--color-rose-300) 80%, transparent)}}.text-sky-200{color:var(--color-sky-200)}.text-sky-300{color:var(--color-sky-300)}.text-sky-300\/70{color:#77d4ffb3}@supports (color:color-mix(in lab, red, red)){.text-sky-300\/70{color:color-mix(in oklab, var(--color-sky-300) 70%, transparent)}}.text-sky-300\/80{color:#77d4ffcc}@supports (color:color-mix(in lab, red, red)){.text-sky-300\/80{color:color-mix(in oklab, var(--color-sky-300) 80%, transparent)}}.text-teal-300{color:var(--color-teal-300)}.text-warn{color:var(--warn)}.text-white{color:var(--color-white)}.text-zinc-50{color:var(--color-zinc-50)}.text-zinc-100{color:var(--color-zinc-100)}.text-zinc-200{color:var(--color-zinc-200)}.text-zinc-300{color:var(--color-zinc-300)}.text-zinc-400{color:var(--color-zinc-400)}.text-zinc-500{color:var(--color-zinc-500)}.text-zinc-600{color:var(--color-zinc-600)}.text-zinc-700{color:var(--color-zinc-700)}.text-zinc-800{color:var(--color-zinc-800)}.normal-case{text-transform:none}.uppercase{text-transform:uppercase}.italic{font-style:italic}.underline-offset-2{text-underline-offset:2px}.underline-offset-4{text-underline-offset:4px}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring,.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-amber-500\/45{--tw-ring-color:#f99c0073}@supports (color:color-mix(in lab, red, red)){.ring-amber-500\/45{--tw-ring-color:color-mix(in oklab, var(--color-amber-500) 45%, transparent)}}.ring-brand\/30{--tw-ring-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.ring-brand\/30{--tw-ring-color:color-mix(in oklab, var(--accent) 30%, transparent)}}.ring-emerald-400\/60{--tw-ring-color:#00d29499}@supports (color:color-mix(in lab, red, red)){.ring-emerald-400\/60{--tw-ring-color:color-mix(in oklab, var(--color-emerald-400) 60%, transparent)}}.ring-emerald-500\/40{--tw-ring-color:#00bb7f66}@supports (color:color-mix(in lab, red, red)){.ring-emerald-500\/40{--tw-ring-color:color-mix(in oklab, var(--color-emerald-500) 40%, transparent)}}.ring-emerald-500\/50{--tw-ring-color:#00bb7f80}@supports (color:color-mix(in lab, red, red)){.ring-emerald-500\/50{--tw-ring-color:color-mix(in oklab, var(--color-emerald-500) 50%, transparent)}}.ring-indigo-500\/40{--tw-ring-color:#625fff66}@supports (color:color-mix(in lab, red, red)){.ring-indigo-500\/40{--tw-ring-color:color-mix(in oklab, var(--color-indigo-500) 40%, transparent)}}.ring-line-soft{--tw-ring-color:var(--line-soft)}.ring-red-500\/40{--tw-ring-color:#fb2c3666}@supports (color:color-mix(in lab, red, red)){.ring-red-500\/40{--tw-ring-color:color-mix(in oklab, var(--color-red-500) 40%, transparent)}}.ring-red-500\/50{--tw-ring-color:#fb2c3680}@supports (color:color-mix(in lab, red, red)){.ring-red-500\/50{--tw-ring-color:color-mix(in oklab, var(--color-red-500) 50%, transparent)}}.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,)}.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,)}.backdrop-blur-md{--tw-backdrop-blur:blur(var(--blur-md));-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,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-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-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-500{--tw-duration:.5s;transition-duration:.5s}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.placeholder\:text-zinc-600::placeholder{color:var(--color-zinc-600)}.placeholder\:text-zinc-700::placeholder{color:var(--color-zinc-700)}.focus-within\:border-zinc-600:focus-within{border-color:var(--color-zinc-600)}@media (hover:hover){.hover\:-translate-y-0\.5:hover{--tw-translate-y:calc(var(--spacing) * -.5);translate:var(--tw-translate-x) var(--tw-translate-y)}.hover\:border-amber-500\/40:hover{border-color:#f99c0066}@supports (color:color-mix(in lab, red, red)){.hover\:border-amber-500\/40:hover{border-color:color-mix(in oklab, var(--color-amber-500) 40%, transparent)}}.hover\:border-indigo-400\/60:hover{border-color:#7d87ff99}@supports (color:color-mix(in lab, red, red)){.hover\:border-indigo-400\/60:hover{border-color:color-mix(in oklab, var(--color-indigo-400) 60%, transparent)}}.hover\:border-red-400\/60:hover{border-color:#ff656899}@supports (color:color-mix(in lab, red, red)){.hover\:border-red-400\/60:hover{border-color:color-mix(in oklab, var(--color-red-400) 60%, transparent)}}.hover\:border-sky-400\/60:hover{border-color:#00bcfe99}@supports (color:color-mix(in lab, red, red)){.hover\:border-sky-400\/60:hover{border-color:color-mix(in oklab, var(--color-sky-400) 60%, transparent)}}.hover\:border-teal-400\/60:hover{border-color:#00d3bd99}@supports (color:color-mix(in lab, red, red)){.hover\:border-teal-400\/60:hover{border-color:color-mix(in oklab, var(--color-teal-400) 60%, transparent)}}.hover\:border-zinc-500:hover{border-color:var(--color-zinc-500)}.hover\:border-zinc-600:hover{border-color:var(--color-zinc-600)}.hover\:bg-brand\/20:hover{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-brand\/20:hover{background-color:color-mix(in oklab, var(--accent) 20%, transparent)}}.hover\:bg-brand\/40:hover{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-brand\/40:hover{background-color:color-mix(in oklab, var(--accent) 40%, transparent)}}.hover\:bg-indigo-500\/20:hover{background-color:#625fff33}@supports (color:color-mix(in lab, red, red)){.hover\:bg-indigo-500\/20:hover{background-color:color-mix(in oklab, var(--color-indigo-500) 20%, transparent)}}.hover\:bg-red-500\/15:hover{background-color:#fb2c3626}@supports (color:color-mix(in lab, red, red)){.hover\:bg-red-500\/15:hover{background-color:color-mix(in oklab, var(--color-red-500) 15%, transparent)}}.hover\:bg-rose-500\/20:hover{background-color:#ff235733}@supports (color:color-mix(in lab, red, red)){.hover\:bg-rose-500\/20:hover{background-color:color-mix(in oklab, var(--color-rose-500) 20%, transparent)}}.hover\:bg-sky-500\/20:hover{background-color:#00a5ef33}@supports (color:color-mix(in lab, red, red)){.hover\:bg-sky-500\/20:hover{background-color:color-mix(in oklab, var(--color-sky-500) 20%, transparent)}}.hover\:bg-warn\/20:hover{background-color:var(--warn)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-warn\/20:hover{background-color:color-mix(in oklab, var(--warn) 20%, transparent)}}.hover\:bg-zinc-800:hover{background-color:var(--color-zinc-800)}.hover\:bg-zinc-800\/50:hover{background-color:#27272a80}@supports (color:color-mix(in lab, red, red)){.hover\:bg-zinc-800\/50:hover{background-color:color-mix(in oklab, var(--color-zinc-800) 50%, transparent)}}.hover\:bg-zinc-900\/50:hover{background-color:#18181b80}@supports (color:color-mix(in lab, red, red)){.hover\:bg-zinc-900\/50:hover{background-color:color-mix(in oklab, var(--color-zinc-900) 50%, transparent)}}.hover\:bg-zinc-900\/60:hover{background-color:#18181b99}@supports (color:color-mix(in lab, red, red)){.hover\:bg-zinc-900\/60:hover{background-color:color-mix(in oklab, var(--color-zinc-900) 60%, transparent)}}.hover\:text-amber-100:hover{color:var(--color-amber-100)}.hover\:text-indigo-100:hover{color:var(--color-indigo-100)}.hover\:text-indigo-200:hover{color:var(--color-indigo-200)}.hover\:text-sky-200:hover{color:var(--color-sky-200)}.hover\:text-teal-200:hover{color:var(--color-teal-200)}.hover\:text-zinc-100:hover{color:var(--color-zinc-100)}.hover\:text-zinc-200:hover{color:var(--color-zinc-200)}.hover\:text-zinc-300:hover{color:var(--color-zinc-300)}.hover\:underline:hover{text-decoration-line:underline}}.focus\:border-zinc-600:focus{border-color:var(--color-zinc-600)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:ring-1:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color:var(--accent)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}@media (hover:hover){.enabled\:hover\:bg-rose-500\/25:enabled:hover{background-color:#ff235740}@supports (color:color-mix(in lab, red, red)){.enabled\:hover\:bg-rose-500\/25:enabled:hover{background-color:color-mix(in oklab, var(--color-rose-500) 25%, transparent)}}}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-default:disabled{cursor:default}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-50:disabled{opacity:.5}.data-\[active\]\:bg-zinc-700[data-active]{background-color:var(--color-zinc-700)}.data-\[active\]\:text-zinc-100[data-active]{color:var(--color-zinc-100)}}:root{--bg:#09090b;--panel:#0c0c0f;--panel-2:#101017;--line:#1c1c22;--line-soft:#16161a;--text:#e7e7ea;--muted:#76767f;--good:#34d399;--warn:#fbbf24;--bad:#f87171;--live:#60a5fa;--accent:#a3e635}*{box-sizing:border-box}html,body,#root{height:100%}body{background:var(--bg);color:var(--text);-webkit-font-smoothing:antialiased;margin:0;font-family:Space Grotesk,ui-sans-serif,system-ui,sans-serif}.app-bg{z-index:0;pointer-events:none;background-image:radial-gradient(900px 400px at 78% -8%, var(--accent), transparent 70%), linear-gradient(to right, var(--line-soft) 1px, transparent 1px), linear-gradient(to bottom, var(--line-soft) 1px, transparent 1px);position:fixed;inset:0}@supports (color:color-mix(in lab, red, red)){.app-bg{background-image:radial-gradient(900px 400px at 78% -8%, color-mix(in srgb, var(--accent) 8%, transparent), transparent 70%), linear-gradient(to right, var(--line-soft) 1px, transparent 1px), linear-gradient(to bottom, var(--line-soft) 1px, transparent 1px)}}.app-bg{opacity:.5;background-size:100% 100%,44px 44px,44px 44px;-webkit-mask-image:linear-gradient(#000,#000 60%,#0000);mask-image:linear-gradient(#000,#000 60%,#0000)}.mono{font-family:JetBrains Mono,ui-monospace,monospace}.tnum{font-variant-numeric:tabular-nums}.s-running{color:var(--live)}.s-suspended{color:var(--warn)}.s-sleeping{color:#818cf8}.s-awaiting{color:var(--warn)}.s-completed{color:var(--good)}.s-failed{color:var(--bad)}.s-cancelling{color:#f59e0b}.s-cancelled{color:#71717a}.s-dead{color:#e11d48}.s-pending{color:#94a3b8}.s-no-worker,.s-blocked{color:#fb923c}.s-queued{color:#a78bfa}.s-stale{color:#fb923c}.dot{background:currentColor;border-radius:999px;width:7px;height:7px;box-shadow:0 0 0 3px}@supports (color:color-mix(in lab, red, red)){.dot{box-shadow:0 0 0 3px color-mix(in srgb, currentColor 18%, transparent)}}.pulse{animation:1.6s ease-in-out infinite pulse}@keyframes pulse{50%{opacity:.5}}@keyframes rise{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}.rise{animation:.32s cubic-bezier(.2,.7,.2,1) both rise}.react-flow{--xy-background-color:transparent;--xy-edge-stroke-default:var(--line);--xy-attribution-background-color:transparent}.react-flow__edge-path{stroke-width:1.5px}.react-flow__controls{border:1px solid var(--line);box-shadow:none;border-radius:8px;overflow:hidden}.react-flow__controls-button{background:var(--panel);border-bottom:1px solid var(--line);color:var(--muted);fill:var(--muted)}.react-flow__controls-button:hover{background:#18181b}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-thumb{border:3px solid var(--bg);background:#26262c;border-radius:999px}@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-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-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@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-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}@property --tw-ease{syntax:"*";inherits:false}
|