specweave 1.0.591 → 1.0.592
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/.claude-plugin/marketplace.json +2 -2
- package/dist/dashboard/assets/{index-DH3l1QBV.js → index-C4kubt_5.js} +1 -1
- package/dist/dashboard/assets/index-DAfC5dt1.css +1 -0
- package/dist/dashboard/index.html +2 -2
- package/package.json +2 -2
- package/plugins/specweave/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave/lib/integrations/ado/ado-spec-sync.js +0 -1
- package/plugins/specweave/lib/integrations/github/metadata-issue-lookup.js +3 -1
- package/plugins/specweave/lib/integrations/jira/jira-spec-sync.js +100 -90
- package/plugins/specweave/lib/integrations/jira/jira-status-sync.js +54 -2
- package/plugins/specweave/skills/team-lead/SKILL.md +67 -4
- package/plugins/specweave/skills/team-lead/agents/_protocol.md +44 -0
- package/plugins/specweave/skills/team-lead/agents/backend.md +2 -0
- package/plugins/specweave/skills/team-lead/agents/database.md +2 -0
- package/plugins/specweave/skills/team-lead/agents/testing.md +2 -0
- package/plugins/specweave/skills/team-lead/reference/dynamic-workflows.md +144 -0
- package/dist/dashboard/assets/index-vkwF92tD.css +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: Phase-agnostic orchestrator for parallel multi-agent work — brainstorm, plan, implement, review, research, or test. Auto-detects mode from intent. Use for implementation (3+ domains or 15+ tasks), brainstorming (multiple perspectives), parallel planning (PM + Architect), code review (delegates to sw:code-reviewer), research (multiple topics), or testing (parallel test layers). Also use when user says "team setup", "parallel agents", "team lead", "agent teams", "brainstorm with agents", "plan in parallel", "review code", "research this".
|
|
3
|
-
version: 1.
|
|
2
|
+
description: Phase-agnostic orchestrator for parallel multi-agent work — brainstorm, plan, implement, review, research, or test. Auto-detects mode from intent. Use for implementation (3+ domains or 15+ tasks), brainstorming (multiple perspectives), parallel planning (PM + Architect), code review (delegates to sw:code-reviewer), research (multiple topics), or testing (parallel test layers). Also use when user says "team setup", "parallel agents", "team lead", "agent teams", "brainstorm with agents", "plan in parallel", "review code", "research this". Also auto-selects a dynamic Workflow for batch-class work (migrations, repo-wide audits, deep research, high-stakes verification) without being asked.
|
|
3
|
+
version: 1.1.0
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Team Lead
|
|
@@ -12,6 +12,7 @@ version: 1.0.0
|
|
|
12
12
|
- **Read**: Load the master `spec.md` once for fan-out decisions and read agent prompt templates under `plugins/specweave/skills/team-lead/agents/`. During the active phase, prefer `PLAN_READY` summaries from agents over re-reading full plan files.
|
|
13
13
|
- **Bash**: Inspect team state (`specweave doctor`, `ls ~/.claude/teams/`, grep metadata.json) and run CLI-only operations — never to implement code.
|
|
14
14
|
- **TeamCreate / Task / SendMessage**: Core orchestration primitives for spawning agents, routing messages, and handling heartbeats.
|
|
15
|
+
- **Workflow**: Dynamic-workflow engine for batch-class fan-out (migrations, repo-wide audits, high-stakes verification, deep research) — auto-selected per §0.4, never requires the user to ask. See `reference/dynamic-workflows.md`.
|
|
15
16
|
|
|
16
17
|
## MANDATORY: Orchestrator Identity (NEVER SKIP)
|
|
17
18
|
|
|
@@ -22,9 +23,10 @@ version: 1.0.0
|
|
|
22
23
|
- **NEVER** say "I'll do this directly" — that defeats the purpose of team-lead
|
|
23
24
|
- Even if you just finished a previous team-lead session in this conversation, you MUST create a **new** team and spawn **new** agents
|
|
24
25
|
- **Fan-out threshold**: Spawn agents when **domains ≥ 3** OR **tasks ≥ 15** OR `--parallel` flag is set. For 1-domain or <15-task work, execute directly without spawning.
|
|
25
|
-
- Your only tools are: `TeamCreate`, `Task`, `SendMessage`, `Read` (for agent templates; during active phase use PLAN_READY summaries instead of reading full plan files), `Bash` (only for team state inspection), and `Skill()` (only during closure phase for grill/done)
|
|
26
|
+
- Your only tools are: `TeamCreate`, `Task`, `SendMessage`, `Workflow` (for batch-class fan-out per §0.4), `Read` (for agent templates; during active phase use PLAN_READY summaries instead of reading full plan files), `Bash` (only for team state inspection), and `Skill()` (only during closure phase for grill/done)
|
|
27
|
+
- **`Workflow` IS orchestration, not implementation** — per §0.4 you MAY launch a `Workflow()` for batch-class work (migrations, repo-wide audits, high-stakes verification, deep research). Delegating to a Workflow does NOT violate this rule; writing the code yourself does.
|
|
26
28
|
|
|
27
|
-
**The test**: If you're about to call `Edit()` or write code, STOP — you're violating this rule.
|
|
29
|
+
**The test**: If you're about to call `Edit()` or write code yourself, STOP — you're violating this rule. (Launching a `Workflow()` that spawns agents to do the work is fine.)
|
|
28
30
|
|
|
29
31
|
---
|
|
30
32
|
|
|
@@ -128,6 +130,8 @@ sw:team-lead --preset api-only --max-agents 4 "Add payments API"
|
|
|
128
130
|
|
|
129
131
|
**team_name**: `brainstorm-{topic-slug}`
|
|
130
132
|
|
|
133
|
+
**Engine** (per §0.4): Agent Teams — brainstorm needs interactive steering + the idea tree, not a deterministic batch. Pattern: perspective-diverse verify (advocate / critic / pragmatist fan out → synthesize).
|
|
134
|
+
|
|
131
135
|
Skip increment pre-flight entirely. Brainstorm doesn't need a spec — it explores possibilities.
|
|
132
136
|
|
|
133
137
|
1. Create team: `TeamCreate({ team_name: "brainstorm-{slug}", description: "Brainstorm: {topic}" })`
|
|
@@ -249,6 +253,8 @@ Pass through any arguments the user provided (--pr N, --changes, --cross-repo, p
|
|
|
249
253
|
|
|
250
254
|
**team_name**: `research-{topic-slug}`
|
|
251
255
|
|
|
256
|
+
**Engine** (per §0.4): prefer a **Dynamic Workflow** deep-research pipeline (fan-out searches → fetch → adversarially verify → synthesize a cited report, results held off-context) for multi-source / multi-subtopic research; use Agent Teams only for 2-3 steerable researchers. Falls back to Agent Teams when `quality.workflows.enabled` is off.
|
|
257
|
+
|
|
252
258
|
Skip increment pre-flight. Research is exploratory — no spec needed.
|
|
253
259
|
|
|
254
260
|
1. Create team: `TeamCreate({ team_name: "research-{slug}", description: "Research: {topic}" })`
|
|
@@ -285,6 +291,8 @@ Skip increment pre-flight. Research is exploratory — no spec needed.
|
|
|
285
291
|
|
|
286
292
|
**team_name**: `test-{increment-id}`
|
|
287
293
|
|
|
294
|
+
**Engine** (per §0.4): route **many independent same-shape tests** to a **Dynamic Workflow** (generate → run → fix-loop until green); keep Agent Teams when test layers have setup dependencies. Falls back to Agent Teams when `quality.workflows.enabled` is off.
|
|
295
|
+
|
|
288
296
|
Testing mode requires an increment (it needs to know WHAT to test).
|
|
289
297
|
|
|
290
298
|
1. **Verify increment exists** (same as implementation mode — see below)
|
|
@@ -321,6 +329,48 @@ Testing mode requires an increment (it needs to know WHAT to test).
|
|
|
321
329
|
|
|
322
330
|
---
|
|
323
331
|
|
|
332
|
+
## 0.4. Orchestration Engine Selection (AUTO-DETECT — never wait for a flag)
|
|
333
|
+
|
|
334
|
+
**Run AFTER §0 Mode Detection, BEFORE §0.5 Increment Pre-Flight.** Pick the engine from the *shape* of the work, not from the user's words. The user must NEVER have to say "use a workflow" — you infer it.
|
|
335
|
+
|
|
336
|
+
Three engines:
|
|
337
|
+
|
|
338
|
+
| Engine | What it is | Owns |
|
|
339
|
+
|--------|-----------|------|
|
|
340
|
+
| **Dynamic Workflow** | `Workflow()` — deterministic JS scheduler, ≤16 concurrent / 1000 total subagents, results in script vars (off context), resumable, background | Large homogeneous fan-out: migrations, repo-wide audits, many-similar-tests, adversarial/judge verification |
|
|
341
|
+
| **Agent Teams** (default) | `TeamCreate` + `Task` + `SendMessage` + tmux — model-driven, domain-aware, SpecWeave-lifecycle owner | Feature work: 3+ domains or 15+ tasks with cross-domain contracts + closure + sync |
|
|
342
|
+
| **Inline** | This orchestrator, no spawn | <15 tasks, single domain, sequential |
|
|
343
|
+
|
|
344
|
+
### Decision table (first match wins)
|
|
345
|
+
|
|
346
|
+
| Signal in the work | Engine | Why |
|
|
347
|
+
|--------------------|--------|-----|
|
|
348
|
+
| ≥~25 **same-shape** tasks, no cross-task deps (rename X→Y across N files, add header to N modules, port N tests) | **Dynamic Workflow** (top-level, bypass team-lead) | Pure fan-out under ONE budget + ONE scheduler — no glue needed |
|
|
349
|
+
| Codebase **migration** / repo-wide **audit** / lint-sweep / dependency-bump across many files | **Dynamic Workflow** (top-level) | Domain-blind batch; team-lead's lifecycle is dead weight here |
|
|
350
|
+
| High-stakes **verification** needing N independent checks (adversarial-verify, judge-panel, completeness-critic) | **Dynamic Workflow** (top-level) | Built-in reusable patterns; deterministic reduce |
|
|
351
|
+
| **Deep research** spanning many sources/subtopics | **Dynamic Workflow** (pipeline) | fan-out → fetch → verify → synthesize, results off-context |
|
|
352
|
+
| 3+ domains OR 15+ tasks **with cross-domain contracts** (frontend ⇐ OpenAPI ⇐ schema), needs increment activation + closure + GitHub/Jira/ADO sync | **Agent Teams** | Phased dependencies defeat fan-out; only team-lead owns the SpecWeave contract |
|
|
353
|
+
| A single Agent-Teams **domain agent** discovers its OWN task list is a ≥~25 same-shape batch | Agent Teams **+ inner Workflow ×1** (see `agents/_protocol.md` Workflow Mode) | Legal one-level borrow; team-lead stays outer coordinator |
|
|
354
|
+
| <15 tasks, 1 domain, sequential | **Inline** | Spawning overhead unjustified |
|
|
355
|
+
|
|
356
|
+
### AUTO-DETECT signals (no flag required)
|
|
357
|
+
|
|
358
|
+
- **→ Dynamic Workflow**: `migrate`, `migration`, `port`, `rename across`, `repo-wide`, `codebase-wide`, `audit`, `sweep`, `bulk`, `every file`, `all <N> …`, `double-check`, `verify independently`, `judge`, `tournament`, `deep research`, `survey the literature`, `ultracode` keyword / `/effort ultracode`.
|
|
359
|
+
- **→ Agent Teams**: `build <feature>`, `team`, `parallel agents`, `multi-domain`, increment with 3+ domains, contracts (Prisma/OpenAPI/shared types) in scope, anything needing `sw:done`/sync.
|
|
360
|
+
- **→ Inline**: small single-domain change, hotfix, one-file edit.
|
|
361
|
+
|
|
362
|
+
### Guards (CHECK before routing to any Workflow)
|
|
363
|
+
|
|
364
|
+
1. **Default-off** — if `quality.workflows.enabled` is absent or `false`, do NOT auto-fire a Workflow and do NOT honor the inner borrow; fall back to Agent Teams / inline (classic behavior, byte-for-byte). This is what keeps the enhancement non-destructive.
|
|
365
|
+
2. **Budget gate** — read `quality.workflows.perRunTokenBudget` + `maxConcurrentWorkflows` from config. If a route would exceed either, DOWNGRADE to inline/sequential and tell the user.
|
|
366
|
+
3. **Nesting law** — `Workflow()` allows ONE nesting level and THROWS inside a leaf subagent. Legal chain: `team-lead (orchestrator, not a Workflow) → Task member → Workflow ×1 → leaves (cannot nest)`. team-lead may fire a top-level Workflow OR delegate the borrow to a member — never both for the same work.
|
|
367
|
+
4. **One top-level Workflow beats N nested ones** — for pure batch-class work, prefer a SINGLE top-level `Workflow` with `parallel()` over the items (one budget, one scheduler) instead of N domain agents each launching their own.
|
|
368
|
+
5. **Inject SpecWeave context** — Workflow is domain-blind (zero knowledge of specs/ACs/increments/gates). Every Workflow-routed agent prompt MUST carry the increment path, file-ownership patterns, AC list, and contract artifacts, or it produces unanchored code.
|
|
369
|
+
|
|
370
|
+
See `reference/dynamic-workflows.md` for primitives, quality patterns, and the full `quality.workflows` config schema.
|
|
371
|
+
|
|
372
|
+
---
|
|
373
|
+
|
|
324
374
|
## 0.5. Increment Pre-Flight (IMPLEMENTATION and TESTING modes only)
|
|
325
375
|
|
|
326
376
|
**This section applies only to IMPLEMENTATION mode (default) and TESTING mode.**
|
|
@@ -402,6 +452,7 @@ fi
|
|
|
402
452
|
| Spawn agent | `Task` | `team_name`, `name`, `subagent_type`, `prompt`, `mode: "bypassPermissions"` |
|
|
403
453
|
| Send message | `SendMessage` | `type`, `recipient`, `content`, `summary` |
|
|
404
454
|
| Shutdown agent | `SendMessage` | `type: "shutdown_request"`, `recipient` |
|
|
455
|
+
| Run batch fan-out | `Workflow` | `script` (a `meta` literal + `agent()`/`parallel()`/`pipeline()`) — for batch-class work per §0.4; see `reference/dynamic-workflows.md` |
|
|
405
456
|
|
|
406
457
|
---
|
|
407
458
|
|
|
@@ -993,6 +1044,18 @@ When an agent is declared stuck:
|
|
|
993
1044
|
- Heartbeat STATUS messages let team-lead detect problems early instead of after long silences
|
|
994
1045
|
- If an agent's task count exceeds 40 despite the cap, split before spawning
|
|
995
1046
|
|
|
1047
|
+
### Workflow-Aware Stuck Detection (agent borrowing a Workflow)
|
|
1048
|
+
|
|
1049
|
+
A domain agent that borrows a Workflow (see `agents/_protocol.md` Workflow Mode) goes **silent for minutes** while the background run executes — the normal 5min/20min windows would false-kill a healthy agent. Additive handling:
|
|
1050
|
+
|
|
1051
|
+
1. **Delegation state** — when an agent's STATUS contains `DELEGATING … workflow_id=`, mark it `state=workflow-delegating` and record the `workflow_id`. SUSPEND the normal 5/20 windows.
|
|
1052
|
+
2. **Extended windows** — while delegating, apply `quality.workflows.stuckDetection.{workflowNoProgressMin, workflowTotalStuckMin}` (defaults 20min / 60min) instead. Silence here is expected, not stuck.
|
|
1053
|
+
3. **Clear on completion** — a `STATUS: WORKFLOW_DONE` (or a `BLOCKING_ISSUE` citing the same `workflow_id`) restores `state=active` and the normal 5/20 windows from the next heartbeat.
|
|
1054
|
+
4. **Probe before kill** — if `workflowTotalStuckMin` elapses with no `WORKFLOW_DONE`, send ONE `STATUS_CHECK` asking the agent to report the Workflow's own progress (it is resumable/background). Declare stuck only after a second unanswered probe; prefer leaving the increment open over killing mid-batch.
|
|
1055
|
+
5. **Loop-detection unchanged** — the "same task number 3+ heartbeats = stuck loop" rule still applies to NON-delegating agents; a delegating agent emits no task-number heartbeats and is exempt by construction.
|
|
1056
|
+
|
|
1057
|
+
**Default-off**: with no `quality.workflows` config, no agent ever enters `state=workflow-delegating`, so behavior is identical to today.
|
|
1058
|
+
|
|
996
1059
|
---
|
|
997
1060
|
|
|
998
1061
|
## 9. Workflow Summary
|
|
@@ -86,3 +86,47 @@ Approve only if you have no unsaved state. Approving terminates your process.
|
|
|
86
86
|
- Do NOT wait for team-lead response to PLAN_READY — proceed immediately
|
|
87
87
|
- ALL repository operations MUST use `repositories/{ORG}/` directory structure
|
|
88
88
|
- Create `.specweave/increments/` in YOUR assigned repo, NOT in the umbrella project root
|
|
89
|
+
- **Workflow Mode** (below) is OPT-IN and default-off — only borrow a `Workflow()` for a ≥~25 same-shape independent-task batch, exactly once, and only if `quality.workflows.agentBorrow.enabled` is true
|
|
90
|
+
|
|
91
|
+
## Workflow Mode (OPT-IN — large homogeneous batch only)
|
|
92
|
+
|
|
93
|
+
You normally implement tasks sequentially. **IF AND ONLY IF** your assigned task list is a **large homogeneous batch** — **≥~25 tasks of the same shape with no cross-task dependencies** (e.g. apply the same rename/migration/edit to N files, port N similar tests, audit N modules) — you MAY call `Workflow()` **EXACTLY ONCE** to fan them out.
|
|
94
|
+
|
|
95
|
+
**Gate (ALL must hold, else implement sequentially):**
|
|
96
|
+
- `quality.workflows.enabled === true` AND `quality.workflows.agentBorrow.enabled === true` in `.specweave/config.json` (both default **off** — if absent/false, do NOT use Workflow).
|
|
97
|
+
- ≥~25 same-shape, independent tasks (`quality.workflows.batchShapeThreshold`, default 25).
|
|
98
|
+
- Projected concurrency ≤ `quality.workflows.maxSubagentsPerWorkflow` (≤16) and projected tokens ≤ `quality.workflows.perRunTokenBudget`.
|
|
99
|
+
|
|
100
|
+
**Nesting law (HARD):** You were spawned by team-lead via the `Task` tool, so you ARE allowed ONE `Workflow()` call. The subagents your Workflow spawns are **leaves** — they CANNOT call `Workflow()` (it throws). One borrow, one level down. Never nest.
|
|
101
|
+
|
|
102
|
+
**Heartbeat-before-Workflow (MANDATORY — prevents false-kill):** A background Workflow makes you silent for minutes. BEFORE the call, emit a STATUS that declares the delegation so team-lead extends its stuck-detection window (see SKILL.md §8b Workflow-Aware Stuck Detection):
|
|
103
|
+
|
|
104
|
+
```
|
|
105
|
+
SendMessage({ type: "message", recipient: "team-lead",
|
|
106
|
+
content: "STATUS: T-{N}/{total} — DELEGATING {batchCount} tasks to background Workflow (workflow_id={id}). Expect silence until WORKFLOW_DONE.",
|
|
107
|
+
summary: "[Domain] entering Workflow Mode — {batchCount} tasks" })
|
|
108
|
+
```
|
|
109
|
+
On completion emit `STATUS: WORKFLOW_DONE — {done}/{batchCount} ok, {failed} failed. Resuming T-{M}.` then resume normal heartbeats.
|
|
110
|
+
|
|
111
|
+
**Template** (one call; results stay in script vars, NOT your context). Inject SpecWeave context (spec/AC refs, file paths) into every agent prompt — Workflow is domain-blind:
|
|
112
|
+
|
|
113
|
+
```js
|
|
114
|
+
export const meta = {
|
|
115
|
+
name: "batch-fanout",
|
|
116
|
+
description: "Fan out a homogeneous batch of same-shape tasks",
|
|
117
|
+
phases: [{ title: "batch" }],
|
|
118
|
+
};
|
|
119
|
+
const items = [/* the >=25 same-shape task descriptors: { target, acRef, file } */];
|
|
120
|
+
const results = await parallel(
|
|
121
|
+
items.map((it) => () => agent(
|
|
122
|
+
`Apply <the same transform> to ${it.target}. Spec: ${it.acRef}. Write ONLY ${it.file}.`,
|
|
123
|
+
{ label: it.target, phase: "batch", isolation: "worktree" }
|
|
124
|
+
))
|
|
125
|
+
);
|
|
126
|
+
log(`batch complete: ${results.filter(Boolean).length}/${items.length}`);
|
|
127
|
+
return results;
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
**Budget guard:** Keep projected tokens under `quality.workflows.perRunTokenBudget`. If your batch would exceed it, split into fewer items or fall back to sequential — do NOT raise the cap yourself.
|
|
131
|
+
|
|
132
|
+
**If the gate fails for any reason → implement the tasks sequentially as usual.** Workflow Mode is an optimization, never a requirement.
|
|
@@ -35,3 +35,5 @@ DOMAIN RULES:
|
|
|
35
35
|
- Every new API endpoint needs request/response validation
|
|
36
36
|
- Error handling follows project conventions
|
|
37
37
|
- All services must have unit tests
|
|
38
|
+
- Workflow Mode: for >=~25 independent same-shape endpoints/DTOs,
|
|
39
|
+
you MAY borrow a Workflow() ONCE (see _protocol.md; gated on quality.workflows.agentBorrow.enabled)
|
|
@@ -30,3 +30,5 @@ DOMAIN RULES:
|
|
|
30
30
|
- Always create migrations (never modify schema without a migration)
|
|
31
31
|
- Seed data must be idempotent
|
|
32
32
|
- Schema changes should be backward-compatible when possible
|
|
33
|
+
- Workflow Mode: for a bulk migration touching >=~25 independent tables/files,
|
|
34
|
+
you MAY borrow a Workflow() ONCE (see _protocol.md; gated on quality.workflows.agentBorrow.enabled)
|
|
@@ -33,3 +33,5 @@ DOMAIN RULES:
|
|
|
33
33
|
- Tests must cover all ACs from spec.md
|
|
34
34
|
- Follow existing test patterns and utilities
|
|
35
35
|
- E2E tests include a11y checks when applicable
|
|
36
|
+
- Workflow Mode: if you must generate/port >=~25 independent same-shape test files,
|
|
37
|
+
you MAY borrow a Workflow() ONCE (see _protocol.md; gated on quality.workflows.agentBorrow.enabled)
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
# Dynamic Workflows — Team Lead Reference
|
|
2
|
+
|
|
3
|
+
Loaded on demand by §0.4 when team-lead routes work to the **Dynamic Workflow** engine, or when a
|
|
4
|
+
domain agent enters **Workflow Mode** (`agents/_protocol.md`). Keep this OUT of the main reasoning
|
|
5
|
+
loop unless a Workflow is actually being authored.
|
|
6
|
+
|
|
7
|
+
## What it is
|
|
8
|
+
|
|
9
|
+
`Workflow()` runs a **JavaScript script that HOLDS the orchestration plan in code**. A deterministic
|
|
10
|
+
runtime executes it in the background; intermediate results live in **script variables (OFF the
|
|
11
|
+
agent's context)** — only the `return` value lands back in context. It is resumable and background.
|
|
12
|
+
|
|
13
|
+
| | Agent Teams | Dynamic Workflow |
|
|
14
|
+
|---|---|---|
|
|
15
|
+
| Driver | model, turn-by-turn | the script (deterministic) |
|
|
16
|
+
| Domain awareness | full (specs/ACs/increments/gates) | **none** — domain-blind |
|
|
17
|
+
| Intermediate results | agent context | script variables |
|
|
18
|
+
| Scale | a handful of peers | ≤16 concurrent / ≤1000 total |
|
|
19
|
+
| Best for | feature work, lifecycle, sync | homogeneous fan-out, verify, research |
|
|
20
|
+
|
|
21
|
+
## Hard limits
|
|
22
|
+
|
|
23
|
+
- **≤16 concurrent** subagents (fewer on low-CPU machines), **≤1000 total** per run.
|
|
24
|
+
- **One nesting level only** — `workflow()` inside a leaf subagent THROWS.
|
|
25
|
+
- `meta` export is **required** and must be a **pure literal** (no variables/among/calls/spreads).
|
|
26
|
+
- **Forbidden in scripts**: `Date.now()`, `Math.random()`, argless `new Date()` (break resume).
|
|
27
|
+
|
|
28
|
+
## Primitives
|
|
29
|
+
|
|
30
|
+
| Primitive | Shape | Barrier? | Use |
|
|
31
|
+
|---|---|---|---|
|
|
32
|
+
| `agent(prompt, opts?)` | `→ Promise<string \| object>` | — | unit of work; with `schema` returns validated JSON (auto-retries on mismatch) |
|
|
33
|
+
| `parallel(thunks)` | `Array<() => Promise> → Promise<(T\|null)[]>` | **YES** (waits for all) | fan-out-then-reduce, judge panels. Failed thunks → `null`; `.filter(Boolean)` |
|
|
34
|
+
| `pipeline(items, ...stages)` | each stage `(prev, orig, idx)` | **NO** (streaming) | **default** multi-stage; item A in stage 3 while B in stage 1 |
|
|
35
|
+
| `phase(title)` | `→ void` | — | name a progress group |
|
|
36
|
+
| `log(msg)` | `→ void` | — | narrator line during the run |
|
|
37
|
+
| `workflow(name, args?)` | inline sub-workflow | — | one level only |
|
|
38
|
+
| `args` | global | — | structured input passed at launch |
|
|
39
|
+
| `budget` | global | — | `budget.total` (null if unset), `budget.spent()`, `budget.remaining()` |
|
|
40
|
+
|
|
41
|
+
`agent()` opts: `schema`, `label`, `phase`, `model`, `effort` (`low…max`), `isolation: "worktree"`
|
|
42
|
+
(safe parallel file writes), `agentType` (e.g. `'general-purpose'`).
|
|
43
|
+
|
|
44
|
+
**`parallel` vs `pipeline`**: barrier only when stage N genuinely needs ALL of stage N-1 (dedup,
|
|
45
|
+
early-exit on zero, cross-item comparison). Otherwise `pipeline` — no wasted wall-clock.
|
|
46
|
+
|
|
47
|
+
## Reusable quality patterns
|
|
48
|
+
|
|
49
|
+
| Pattern | When |
|
|
50
|
+
|---|---|
|
|
51
|
+
| fan-out → reduce → synthesize | the base skeleton — gather then compile |
|
|
52
|
+
| adversarial verify | N skeptics prompted to REFUTE a finding; keep only if a majority survive |
|
|
53
|
+
| perspective-diverse verify | a distinct lens per verifier (correctness / security / perf / repro) |
|
|
54
|
+
| judge panel / tournament | N attempts from different angles, scored by judges, synthesize the winner |
|
|
55
|
+
| loop-until-dry | keep spawning finders until K rounds surface nothing new (dedupe vs a `seen` set) |
|
|
56
|
+
| multi-modal sweep | parallel agents each searching a different way (by-container, by-content, by-time) |
|
|
57
|
+
| completeness critic | a final agent asking "what's missing?" → next round of work |
|
|
58
|
+
| deep-research pipeline | scope → fan-out searches → fetch → vote per claim → synthesize cited report |
|
|
59
|
+
|
|
60
|
+
## Per-mode → engine + pattern (team-lead modes)
|
|
61
|
+
|
|
62
|
+
| Mode | Engine | Pattern |
|
|
63
|
+
|---|---|---|
|
|
64
|
+
| brainstorm | Agent Teams (tmux steering) | perspective-diverse verify — advocate / critic / pragmatist fan out → synthesize |
|
|
65
|
+
| plan | Agent Teams (PM + Architect) | fan-out then reduce — PM specs while Architect explores (~30s overlap) → one plan |
|
|
66
|
+
| implement | Agent Teams outer; inner Workflow ×1 for a ≥25 same-shape domain batch | contract-first phasing; opt-in fan-out inside a batch-shaped domain |
|
|
67
|
+
| review | `sw:code-reviewer` (unchanged) | adversarial verify / completeness critic — N reviewers + self-critique |
|
|
68
|
+
| research | Dynamic Workflow (pipeline) when multi-source; Agent Teams for 2-3 steerable researchers | deep-research pipeline, results off-context |
|
|
69
|
+
| test | Dynamic Workflow when many independent same-shape tests; Agent Teams when layers have setup deps | multi-modal sweep / loop-until-dry |
|
|
70
|
+
|
|
71
|
+
## Nesting law (boxed)
|
|
72
|
+
|
|
73
|
+
```
|
|
74
|
+
LEGAL: team-lead (orchestrator, NOT a Workflow) → Task member → Workflow ×1 → leaves (none)
|
|
75
|
+
LEGAL: top-level Workflow (team-lead fires it directly for pure batch work)
|
|
76
|
+
ILLEGAL: Workflow leaf → Workflow() (throws)
|
|
77
|
+
ILLEGAL: team-lead rewritten AS a Workflow (members become leaves, lose the right to fan out)
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
For pure batch-class work prefer ONE top-level Workflow with `parallel()` over the items (one
|
|
81
|
+
budget, one scheduler) instead of N domain agents each launching their own.
|
|
82
|
+
|
|
83
|
+
## Config schema — `quality.workflows`
|
|
84
|
+
|
|
85
|
+
Absent or `enabled:false` ⇒ classic Agent-Teams behavior (default-off, non-destructive).
|
|
86
|
+
|
|
87
|
+
```json
|
|
88
|
+
{
|
|
89
|
+
"quality": {
|
|
90
|
+
"workflows": {
|
|
91
|
+
"enabled": false,
|
|
92
|
+
"maxConcurrentWorkflows": 1,
|
|
93
|
+
"perRunTokenBudget": 250000,
|
|
94
|
+
"maxSubagentsPerWorkflow": 16,
|
|
95
|
+
"batchShapeThreshold": 25,
|
|
96
|
+
"agentBorrow": { "enabled": false },
|
|
97
|
+
"stuckDetection": {
|
|
98
|
+
"workflowNoProgressMin": 20,
|
|
99
|
+
"workflowTotalStuckMin": 60
|
|
100
|
+
},
|
|
101
|
+
"telemetry": { "logBatchRouteActivations": true }
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
| Key | Default | Purpose |
|
|
108
|
+
|---|---|---|
|
|
109
|
+
| `enabled` | `false` | master switch; false ⇒ never auto-route to Workflow, never honor the borrow |
|
|
110
|
+
| `maxConcurrentWorkflows` | `1` | caps N-fold token stacking when multiple domains qualify |
|
|
111
|
+
| `perRunTokenBudget` | `250000` | ceiling per Workflow run; a projected batch over this must split or go sequential |
|
|
112
|
+
| `maxSubagentsPerWorkflow` | `16` | per-Workflow concurrency (runtime hard max is 16) |
|
|
113
|
+
| `batchShapeThreshold` | `25` | min same-shape independent tasks before a domain may borrow Workflow |
|
|
114
|
+
| `agentBorrow.enabled` | `false` | opt-in inner borrow (Agent-Teams member → Workflow ×1) |
|
|
115
|
+
| `stuckDetection.workflow*` | 20 / 60 min | extended windows while an agent is `state=workflow-delegating` (§8b) |
|
|
116
|
+
| `telemetry.logBatchRouteActivations` | `true` | log batch-route firings so keep-vs-reposition is re-decidable on real data |
|
|
117
|
+
|
|
118
|
+
## Triggers
|
|
119
|
+
|
|
120
|
+
`ultracode` keyword or `/effort ultracode` ⇒ xhigh + auto workflow orchestration. Otherwise team-lead
|
|
121
|
+
§0.4 auto-routes by work shape — it **never** requires the user to say "use a workflow".
|
|
122
|
+
|
|
123
|
+
## When NOT to use a Workflow
|
|
124
|
+
|
|
125
|
+
Dependency-laden feature work (sequential cross-domain deps defeat fan-out), <25 tasks, or
|
|
126
|
+
single-domain work — use Agent Teams or inline instead. Workflow fan-out buys ~zero speedup on the
|
|
127
|
+
median increment (10-20 tasks, 2-3 domains, frontend ⇐ OpenAPI ⇐ schema).
|
|
128
|
+
|
|
129
|
+
## Ship order (why default-off matters)
|
|
130
|
+
|
|
131
|
+
The enhancement is only non-destructive because every new path is gated on `quality.workflows`,
|
|
132
|
+
which is **absent by default**. The intended activation sequence, if/when enabled in a config:
|
|
133
|
+
|
|
134
|
+
1. Set `quality.workflows.enabled` + budget guards (`perRunTokenBudget`, `maxConcurrentWorkflows`).
|
|
135
|
+
2. Confirm §8b Workflow-Aware Stuck Detection is live (it ships with this skill).
|
|
136
|
+
3. Only then set `agentBorrow.enabled` (the inner borrow) — never before guards 1–2.
|
|
137
|
+
4. Route pure batch-class work (migrations, audits) to a SINGLE top-level Workflow, not N nested.
|
|
138
|
+
5. Keep `telemetry.logBatchRouteActivations` on so the keep-vs-reposition question is re-decidable
|
|
139
|
+
on real data (analytics is currently empty — this decision rests on architecture, not usage).
|
|
140
|
+
|
|
141
|
+
> Deferred to a separate telemetry-backed increment (NOT this change): consolidating the `team-*`
|
|
142
|
+
> sibling skills (`team-build` already deprecated, `team-merge` clones the closure phase) and
|
|
143
|
+
> retiring generic modes to Workflow patterns. Correct in direction, but non-additive and unsupported
|
|
144
|
+
> by telemetry today.
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--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-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}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-900:oklch(39.6% .141 25.723);--color-red-950:oklch(25.8% .092 26.042);--color-orange-400:oklch(75% .183 55.934);--color-orange-500:oklch(70.5% .213 47.604);--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-yellow-400:oklch(85.2% .199 91.936);--color-green-400:oklch(79.2% .209 151.711);--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-emerald-600:oklch(59.6% .145 163.225);--color-cyan-400:oklch(78.9% .154 211.53);--color-cyan-500:oklch(71.5% .143 215.221);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--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-indigo-600:oklch(51.1% .262 276.966);--color-violet-400:oklch(70.2% .183 293.541);--color-violet-500:oklch(60.6% .25 292.717);--color-rose-200:oklch(89.2% .058 10.001);--color-rose-300:oklch(81% .117 11.638);--color-rose-400:oklch(71.2% .194 13.428);--color-rose-500:oklch(64.5% .246 16.439);--color-rose-600:oklch(58.6% .253 17.585);--color-rose-700:oklch(51.4% .222 16.935);--color-rose-900:oklch(41% .159 10.272);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-gray-950:oklch(13% .028 261.692);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-wider:.05em;--leading-tight:1.25;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--animate-spin:spin 1s linear infinite;--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:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing) * 0)}.top-0{top:calc(var(--spacing) * 0)}.top-0\.5{top:calc(var(--spacing) * .5)}.top-1\/2{top:50%}.top-full{top:100%}.right-2{right:calc(var(--spacing) * 2)}.bottom-full{bottom:100%}.left-0\.5{left:calc(var(--spacing) * .5)}.left-1\/2{left:50%}.left-2\.5{left:calc(var(--spacing) * 2.5)}.left-\[18px\]{left:18px}.z-10{z-index:10}.z-50{z-index:50}.mx-3{margin-inline:calc(var(--spacing) * 3)}.mx-auto{margin-inline:auto}.my-2{margin-block:calc(var(--spacing) * 2)}.-mt-px{margin-top:-1px}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.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)}.mr-1{margin-right:calc(var(--spacing) * 1)}.mb-0\.5{margin-bottom:calc(var(--spacing) * .5)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.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)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.ml-1{margin-left:calc(var(--spacing) * 1)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-4{margin-left:calc(var(--spacing) * 4)}.ml-6{margin-left:calc(var(--spacing) * 6)}.ml-10{margin-left:calc(var(--spacing) * 10)}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.h-0\.5{height:calc(var(--spacing) * .5)}.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-8{height:calc(var(--spacing) * 8)}.h-12{height:calc(var(--spacing) * 12)}.h-14{height:calc(var(--spacing) * 14)}.h-24{height:calc(var(--spacing) * 24)}.h-40{height:calc(var(--spacing) * 40)}.h-64{height:calc(var(--spacing) * 64)}.h-\[18px\]{height:18px}.h-full{height:100%}.h-screen{height:100vh}.max-h-32{max-height:calc(var(--spacing) * 32)}.max-h-40{max-height:calc(var(--spacing) * 40)}.max-h-48{max-height:calc(var(--spacing) * 48)}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-\[400px\]{max-height:400px}.min-h-\[2px\]{min-height:2px}.min-h-\[400px\]{min-height:400px}.min-h-screen{min-height:100vh}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-2{width:calc(var(--spacing) * 2)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-8{width:calc(var(--spacing) * 8)}.w-9{width:calc(var(--spacing) * 9)}.w-10{width:calc(var(--spacing) * 10)}.w-12{width:calc(var(--spacing) * 12)}.w-14{width:calc(var(--spacing) * 14)}.w-16{width:calc(var(--spacing) * 16)}.w-24{width:calc(var(--spacing) * 24)}.w-28{width:calc(var(--spacing) * 28)}.w-48{width:calc(var(--spacing) * 48)}.w-56{width:calc(var(--spacing) * 56)}.w-full{width:100%}.max-w-48{max-width:calc(var(--spacing) * 48)}.max-w-\[120px\]{max-width:120px}.max-w-\[180px\]{max-width:180px}.max-w-\[200px\]{max-width:200px}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-\[18px\]{min-width:18px}.min-w-\[60px\]{min-width:60px}.flex-1{flex:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.table-fixed{table-layout:fixed}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.-rotate-90{rotate:-90deg}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-\[1fr\,80px\,80px\,120px\]{grid-template-columns:1fr,80px,80px,120px}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.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:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-px{gap:1px}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.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-gray-800\/50>:not(:last-child)){border-color:#1e293980}@supports (color:color-mix(in lab,red,red)){:where(.divide-gray-800\/50>:not(:last-child)){border-color:color-mix(in oklab,var(--color-gray-800) 50%,transparent)}}.self-center{align-self:center}.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}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.border{border-style:var(--tw-border-style);border-width:1px}.border-4{border-style:var(--tw-border-style);border-width:4px}.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-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.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\/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\/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-cyan-500\/20{border-color:#00b7d733}@supports (color:color-mix(in lab,red,red)){.border-cyan-500\/20{border-color:color-mix(in oklab,var(--color-cyan-500) 20%,transparent)}}.border-emerald-500{border-color:var(--color-emerald-500)}.border-emerald-500\/20{border-color:#00bb7f33}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/20{border-color:color-mix(in oklab,var(--color-emerald-500) 20%,transparent)}}.border-emerald-500\/30{border-color:#00bb7f4d}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/30{border-color:color-mix(in oklab,var(--color-emerald-500) 30%,transparent)}}.border-gray-600{border-color:var(--color-gray-600)}.border-gray-700{border-color:var(--color-gray-700)}.border-gray-700\/50{border-color:#36415380}@supports (color:color-mix(in lab,red,red)){.border-gray-700\/50{border-color:color-mix(in oklab,var(--color-gray-700) 50%,transparent)}}.border-gray-800{border-color:var(--color-gray-800)}.border-gray-800\/50{border-color:#1e293980}@supports (color:color-mix(in lab,red,red)){.border-gray-800\/50{border-color:color-mix(in oklab,var(--color-gray-800) 50%,transparent)}}.border-indigo-500{border-color:var(--color-indigo-500)}.border-indigo-500\/20{border-color:#625fff33}@supports (color:color-mix(in lab,red,red)){.border-indigo-500\/20{border-color:color-mix(in oklab,var(--color-indigo-500) 20%,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\/50{border-color:#625fff80}@supports (color:color-mix(in lab,red,red)){.border-indigo-500\/50{border-color:color-mix(in oklab,var(--color-indigo-500) 50%,transparent)}}.border-red-900\/40{border-color:#82181a66}@supports (color:color-mix(in lab,red,red)){.border-red-900\/40{border-color:color-mix(in oklab,var(--color-red-900) 40%,transparent)}}.border-rose-500{border-color:var(--color-rose-500)}.border-rose-500\/20{border-color:#ff235733}@supports (color:color-mix(in lab,red,red)){.border-rose-500\/20{border-color:color-mix(in oklab,var(--color-rose-500) 20%,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\/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-rose-700{border-color:var(--color-rose-700)}.border-transparent{border-color:#0000}.border-t-gray-800{border-top-color:var(--color-gray-800)}.border-l-amber-500{border-left-color:var(--color-amber-500)}.border-l-blue-500{border-left-color:var(--color-blue-500)}.border-l-rose-500{border-left-color:var(--color-rose-500)}.bg-amber-400{background-color:var(--color-amber-400)}.bg-amber-500{background-color:var(--color-amber-500)}.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\/20{background-color:#f99c0033}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/20{background-color:color-mix(in oklab,var(--color-amber-500) 20%,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-blue-500{background-color:var(--color-blue-500)}.bg-blue-500\/10{background-color:#3080ff1a}@supports (color:color-mix(in lab,red,red)){.bg-blue-500\/10{background-color:color-mix(in oklab,var(--color-blue-500) 10%,transparent)}}.bg-blue-500\/20{background-color:#3080ff33}@supports (color:color-mix(in lab,red,red)){.bg-blue-500\/20{background-color:color-mix(in oklab,var(--color-blue-500) 20%,transparent)}}.bg-blue-600{background-color:var(--color-blue-600)}.bg-blue-700{background-color:var(--color-blue-700)}.bg-cyan-500{background-color:var(--color-cyan-500)}.bg-cyan-500\/10{background-color:#00b7d71a}@supports (color:color-mix(in lab,red,red)){.bg-cyan-500\/10{background-color:color-mix(in oklab,var(--color-cyan-500) 10%,transparent)}}.bg-cyan-500\/15{background-color:#00b7d726}@supports (color:color-mix(in lab,red,red)){.bg-cyan-500\/15{background-color:color-mix(in oklab,var(--color-cyan-500) 15%,transparent)}}.bg-cyan-500\/20{background-color:#00b7d733}@supports (color:color-mix(in lab,red,red)){.bg-cyan-500\/20{background-color:color-mix(in oklab,var(--color-cyan-500) 20%,transparent)}}.bg-cyan-500\/60{background-color:#00b7d799}@supports (color:color-mix(in lab,red,red)){.bg-cyan-500\/60{background-color:color-mix(in oklab,var(--color-cyan-500) 60%,transparent)}}.bg-emerald-400{background-color:var(--color-emerald-400)}.bg-emerald-500{background-color:var(--color-emerald-500)}.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-600\/20{background-color:#00976733}@supports (color:color-mix(in lab,red,red)){.bg-emerald-600\/20{background-color:color-mix(in oklab,var(--color-emerald-600) 20%,transparent)}}.bg-gray-500{background-color:var(--color-gray-500)}.bg-gray-500\/10{background-color:#6a72821a}@supports (color:color-mix(in lab,red,red)){.bg-gray-500\/10{background-color:color-mix(in oklab,var(--color-gray-500) 10%,transparent)}}.bg-gray-500\/20{background-color:#6a728233}@supports (color:color-mix(in lab,red,red)){.bg-gray-500\/20{background-color:color-mix(in oklab,var(--color-gray-500) 20%,transparent)}}.bg-gray-600{background-color:var(--color-gray-600)}.bg-gray-700{background-color:var(--color-gray-700)}.bg-gray-700\/50{background-color:#36415380}@supports (color:color-mix(in lab,red,red)){.bg-gray-700\/50{background-color:color-mix(in oklab,var(--color-gray-700) 50%,transparent)}}.bg-gray-800{background-color:var(--color-gray-800)}.bg-gray-800\/20{background-color:#1e293933}@supports (color:color-mix(in lab,red,red)){.bg-gray-800\/20{background-color:color-mix(in oklab,var(--color-gray-800) 20%,transparent)}}.bg-gray-800\/30{background-color:#1e29394d}@supports (color:color-mix(in lab,red,red)){.bg-gray-800\/30{background-color:color-mix(in oklab,var(--color-gray-800) 30%,transparent)}}.bg-gray-800\/40{background-color:#1e293966}@supports (color:color-mix(in lab,red,red)){.bg-gray-800\/40{background-color:color-mix(in oklab,var(--color-gray-800) 40%,transparent)}}.bg-gray-800\/50{background-color:#1e293980}@supports (color:color-mix(in lab,red,red)){.bg-gray-800\/50{background-color:color-mix(in oklab,var(--color-gray-800) 50%,transparent)}}.bg-gray-900{background-color:var(--color-gray-900)}.bg-gray-900\/50{background-color:#10182880}@supports (color:color-mix(in lab,red,red)){.bg-gray-900\/50{background-color:color-mix(in oklab,var(--color-gray-900) 50%,transparent)}}.bg-gray-900\/60{background-color:#10182899}@supports (color:color-mix(in lab,red,red)){.bg-gray-900\/60{background-color:color-mix(in oklab,var(--color-gray-900) 60%,transparent)}}.bg-gray-950{background-color:var(--color-gray-950)}.bg-green-400{background-color:var(--color-green-400)}.bg-indigo-400{background-color:var(--color-indigo-400)}.bg-indigo-500{background-color:var(--color-indigo-500)}.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\/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-indigo-500\/40{background-color:#625fff66}@supports (color:color-mix(in lab,red,red)){.bg-indigo-500\/40{background-color:color-mix(in oklab,var(--color-indigo-500) 40%,transparent)}}.bg-indigo-500\/60{background-color:#625fff99}@supports (color:color-mix(in lab,red,red)){.bg-indigo-500\/60{background-color:color-mix(in oklab,var(--color-indigo-500) 60%,transparent)}}.bg-indigo-600{background-color:var(--color-indigo-600)}.bg-orange-500\/15{background-color:#fe6e0026}@supports (color:color-mix(in lab,red,red)){.bg-orange-500\/15{background-color:color-mix(in oklab,var(--color-orange-500) 15%,transparent)}}.bg-orange-500\/20{background-color:#fe6e0033}@supports (color:color-mix(in lab,red,red)){.bg-orange-500\/20{background-color:color-mix(in oklab,var(--color-orange-500) 20%,transparent)}}.bg-red-400{background-color:var(--color-red-400)}.bg-red-500{background-color:var(--color-red-500)}.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-950\/30{background-color:#4608094d}@supports (color:color-mix(in lab,red,red)){.bg-red-950\/30{background-color:color-mix(in oklab,var(--color-red-950) 30%,transparent)}}.bg-rose-400{background-color:var(--color-rose-400)}.bg-rose-500{background-color:var(--color-rose-500)}.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\/70{background-color:#ff2357b3}@supports (color:color-mix(in lab,red,red)){.bg-rose-500\/70{background-color:color-mix(in oklab,var(--color-rose-500) 70%,transparent)}}.bg-rose-600{background-color:var(--color-rose-600)}.bg-rose-600\/20{background-color:#e7004433}@supports (color:color-mix(in lab,red,red)){.bg-rose-600\/20{background-color:color-mix(in oklab,var(--color-rose-600) 20%,transparent)}}.bg-rose-900\/30{background-color:#8b08364d}@supports (color:color-mix(in lab,red,red)){.bg-rose-900\/30{background-color:color-mix(in oklab,var(--color-rose-900) 30%,transparent)}}.bg-violet-500\/20{background-color:#8d54ff33}@supports (color:color-mix(in lab,red,red)){.bg-violet-500\/20{background-color:color-mix(in oklab,var(--color-violet-500) 20%,transparent)}}.bg-white{background-color:var(--color-white)}.bg-yellow-400{background-color:var(--color-yellow-400)}.bg-gradient-to-br{--tw-gradient-position:to bottom right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-amber-500\/10{--tw-gradient-from:#f99c001a}@supports (color:color-mix(in lab,red,red)){.from-amber-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-amber-500) 10%, transparent)}}.from-amber-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-cyan-500\/10{--tw-gradient-from:#00b7d71a}@supports (color:color-mix(in lab,red,red)){.from-cyan-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-cyan-500) 10%, transparent)}}.from-cyan-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-emerald-500\/10{--tw-gradient-from:#00bb7f1a}@supports (color:color-mix(in lab,red,red)){.from-emerald-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-emerald-500) 10%, transparent)}}.from-emerald-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-indigo-500\/10{--tw-gradient-from:#625fff1a}@supports (color:color-mix(in lab,red,red)){.from-indigo-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-indigo-500) 10%, transparent)}}.from-indigo-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-rose-500\/10{--tw-gradient-from:#ff23571a}@supports (color:color-mix(in lab,red,red)){.from-rose-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-rose-500) 10%, transparent)}}.from-rose-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-amber-500\/5{--tw-gradient-to:#f99c000d}@supports (color:color-mix(in lab,red,red)){.to-amber-500\/5{--tw-gradient-to:color-mix(in oklab, var(--color-amber-500) 5%, transparent)}}.to-amber-500\/5{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-cyan-500\/5{--tw-gradient-to:#00b7d70d}@supports (color:color-mix(in lab,red,red)){.to-cyan-500\/5{--tw-gradient-to:color-mix(in oklab, var(--color-cyan-500) 5%, transparent)}}.to-cyan-500\/5{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-emerald-500\/5{--tw-gradient-to:#00bb7f0d}@supports (color:color-mix(in lab,red,red)){.to-emerald-500\/5{--tw-gradient-to:color-mix(in oklab, var(--color-emerald-500) 5%, transparent)}}.to-emerald-500\/5{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-indigo-500\/5{--tw-gradient-to:#625fff0d}@supports (color:color-mix(in lab,red,red)){.to-indigo-500\/5{--tw-gradient-to:color-mix(in oklab, var(--color-indigo-500) 5%, transparent)}}.to-indigo-500\/5{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-rose-500\/5{--tw-gradient-to:#ff23570d}@supports (color:color-mix(in lab,red,red)){.to-rose-500\/5{--tw-gradient-to:color-mix(in oklab, var(--color-rose-500) 5%, transparent)}}.to-rose-500\/5{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.p-1{padding:calc(var(--spacing) * 1)}.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-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.px-1{padding-inline:calc(var(--spacing) * 1)}.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-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.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-8{padding-block:calc(var(--spacing) * 8)}.py-16{padding-block:calc(var(--spacing) * 16)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-8{padding-left:calc(var(--spacing) * 8)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[8px\]{font-size:8px}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.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-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.break-words{overflow-wrap:break-word}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-300{color:var(--color-amber-300)}.text-amber-400{color:var(--color-amber-400)}.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-blue-400{color:var(--color-blue-400)}.text-cyan-400{color:var(--color-cyan-400)}.text-emerald-400{color:var(--color-emerald-400)}.text-emerald-500{color:var(--color-emerald-500)}.text-gray-100{color:var(--color-gray-100)}.text-gray-200{color:var(--color-gray-200)}.text-gray-300{color:var(--color-gray-300)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-indigo-400{color:var(--color-indigo-400)}.text-orange-400{color:var(--color-orange-400)}.text-red-400{color:var(--color-red-400)}.text-rose-300{color:var(--color-rose-300)}.text-rose-400{color:var(--color-rose-400)}.text-rose-400\/60{color:#ff667f99}@supports (color:color-mix(in lab,red,red)){.text-rose-400\/60{color:color-mix(in oklab,var(--color-rose-400) 60%,transparent)}}.text-rose-400\/80{color:#ff667fcc}@supports (color:color-mix(in lab,red,red)){.text-rose-400\/80{color:color-mix(in oklab,var(--color-rose-400) 80%,transparent)}}.text-violet-400{color:var(--color-violet-400)}.text-white{color:var(--color-white)}.capitalize{text-transform:capitalize}.uppercase{text-transform:uppercase}.italic{font-style:italic}.line-through{text-decoration-line:line-through}.underline{text-decoration-line:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.placeholder-gray-500::placeholder{color:var(--color-gray-500)}.placeholder-gray-600::placeholder{color:var(--color-gray-600)}.opacity-0{opacity:0}.opacity-25{opacity:.25}.opacity-60{opacity:.6}.opacity-75{opacity:.75}.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)}.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-amber-500\/50{--tw-ring-color:#f99c0080}@supports (color:color-mix(in lab,red,red)){.ring-amber-500\/50{--tw-ring-color:color-mix(in oklab, var(--color-amber-500) 50%, 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)}}.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,)}.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-opacity{transition-property:opacity;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-200{--tw-duration:.2s;transition-duration:.2s}.duration-500{--tw-duration:.5s;transition-duration:.5s}@media(hover:hover){.group-hover\:bg-rose-400:is(:where(.group):hover *){background-color:var(--color-rose-400)}.group-hover\:text-gray-400:is(:where(.group):hover *){color:var(--color-gray-400)}.group-hover\:text-white:is(:where(.group):hover *){color:var(--color-white)}.group-hover\:opacity-100:is(:where(.group):hover *),.group-hover\/item\:opacity-100:is(:where(.group\/item):hover *){opacity:1}.hover\:border-amber-500\/30:hover{border-color:#f99c004d}@supports (color:color-mix(in lab,red,red)){.hover\:border-amber-500\/30:hover{border-color:color-mix(in oklab,var(--color-amber-500) 30%,transparent)}}.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-emerald-500\/50:hover{border-color:#00bb7f80}@supports (color:color-mix(in lab,red,red)){.hover\:border-emerald-500\/50:hover{border-color:color-mix(in oklab,var(--color-emerald-500) 50%,transparent)}}.hover\:border-gray-600:hover{border-color:var(--color-gray-600)}.hover\:border-gray-700:hover{border-color:var(--color-gray-700)}.hover\:border-indigo-500\/30:hover{border-color:#625fff4d}@supports (color:color-mix(in lab,red,red)){.hover\:border-indigo-500\/30:hover{border-color:color-mix(in oklab,var(--color-indigo-500) 30%,transparent)}}.hover\:bg-emerald-600\/40:hover{background-color:#00976766}@supports (color:color-mix(in lab,red,red)){.hover\:bg-emerald-600\/40:hover{background-color:color-mix(in oklab,var(--color-emerald-600) 40%,transparent)}}.hover\:bg-gray-600:hover{background-color:var(--color-gray-600)}.hover\:bg-gray-700:hover{background-color:var(--color-gray-700)}.hover\:bg-gray-800:hover{background-color:var(--color-gray-800)}.hover\:bg-gray-800\/20:hover{background-color:#1e293933}@supports (color:color-mix(in lab,red,red)){.hover\:bg-gray-800\/20:hover{background-color:color-mix(in oklab,var(--color-gray-800) 20%,transparent)}}.hover\:bg-gray-800\/30:hover{background-color:#1e29394d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-gray-800\/30:hover{background-color:color-mix(in oklab,var(--color-gray-800) 30%,transparent)}}.hover\:bg-gray-800\/50:hover{background-color:#1e293980}@supports (color:color-mix(in lab,red,red)){.hover\:bg-gray-800\/50:hover{background-color:color-mix(in oklab,var(--color-gray-800) 50%,transparent)}}.hover\:bg-gray-800\/80:hover{background-color:#1e2939cc}@supports (color:color-mix(in lab,red,red)){.hover\:bg-gray-800\/80:hover{background-color:color-mix(in oklab,var(--color-gray-800) 80%,transparent)}}.hover\:bg-indigo-500:hover{background-color:var(--color-indigo-500)}.hover\:bg-indigo-500\/60:hover{background-color:#625fff99}@supports (color:color-mix(in lab,red,red)){.hover\:bg-indigo-500\/60:hover{background-color:color-mix(in oklab,var(--color-indigo-500) 60%,transparent)}}.hover\:bg-rose-500:hover{background-color:var(--color-rose-500)}.hover\:bg-rose-600\/40:hover{background-color:#e7004466}@supports (color:color-mix(in lab,red,red)){.hover\:bg-rose-600\/40:hover{background-color:color-mix(in oklab,var(--color-rose-600) 40%,transparent)}}.hover\:text-amber-300:hover{color:var(--color-amber-300)}.hover\:text-emerald-300:hover{color:var(--color-emerald-300)}.hover\:text-gray-200:hover{color:var(--color-gray-200)}.hover\:text-gray-300:hover{color:var(--color-gray-300)}.hover\:text-indigo-300:hover{color:var(--color-indigo-300)}.hover\:text-rose-200:hover{color:var(--color-rose-200)}.hover\:text-rose-300:hover{color:var(--color-rose-300)}.hover\:text-rose-400:hover{color:var(--color-rose-400)}.hover\:text-white:hover{color:var(--color-white)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-80:hover{opacity:.8}}.focus\:border-gray-600:focus{border-color:var(--color-gray-600)}.focus\:border-indigo-500:focus{border-color:var(--color-indigo-500)}.focus\:ring-1:focus{--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\:ring-indigo-500:focus{--tw-ring-color:var(--color-indigo-500)}.focus\:ring-indigo-500\/30:focus{--tw-ring-color:#625fff4d}@supports (color:color-mix(in lab,red,red)){.focus\:ring-indigo-500\/30:focus{--tw-ring-color:color-mix(in oklab, var(--color-indigo-500) 30%, transparent)}}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:text-gray-700:disabled{color:var(--color-gray-700)}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}@media(min-width:48rem){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media(min-width:64rem){.lg\:col-span-2{grid-column:span 2/span 2}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:#374151;border-radius:3px}::-webkit-scrollbar-thumb:hover{background:#4b5563}@keyframes slideIn{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}.animate-slide-in{animation:.2s ease-out slideIn}@keyframes pulse-dot{0%,to{opacity:1}50%{opacity:.4}}.animate-pulse-dot{animation:2s ease-in-out infinite pulse-dot}@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-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"<length-percentage>";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"<length-percentage>";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"<length-percentage>";inherits:false;initial-value:100%}@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-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}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}
|