open-coleslaw 0.3.2 → 0.5.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/README.md +99 -78
- package/dist/{chunk-GFILTXTU.js → chunk-IQPO75GF.js} +12 -1
- package/dist/chunk-IQPO75GF.js.map +1 -0
- package/dist/{db-S2POLBQM.js → db-62WVGYCE.js} +2 -2
- package/dist/index.js +807 -1631
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/assets/department-config.json +13 -7
- package/src/assets/meeting-types.json +39 -20
- package/src/assets/worker-profiles.json +5 -11
- package/dist/chunk-GFILTXTU.js.map +0 -1
- /package/dist/{db-S2POLBQM.js.map → db-62WVGYCE.js.map} +0 -0
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
**Just type your prompt. Like coleslaw — it's already prepared, just scoop and eat.**
|
|
4
4
|
|
|
5
|
-
Open Coleslaw is a multi-agent orchestrator plugin for Claude Code. It gives you an entire AI engineering team —
|
|
5
|
+
Open Coleslaw is a multi-agent orchestrator plugin for Claude Code. It gives you an entire AI engineering team — planner, architect, engineer, verifier, product manager, researcher — that organizes itself, runs real round-robin meetings, only ends a meeting when everyone actually agrees, and executes in MVP-sized cycles.
|
|
6
6
|
|
|
7
7
|
Zero commands to memorize. Zero tools to call manually. Your AI team is already hired.
|
|
8
8
|
|
|
@@ -14,18 +14,21 @@ You type a prompt like *"Build me a balance game app"*. That's it.
|
|
|
14
14
|
You: "Build me a balance game app"
|
|
15
15
|
|
|
16
16
|
→ Orchestrator dispatched (Agent tool)
|
|
17
|
-
→
|
|
18
|
-
→
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
17
|
+
→ Kickoff meeting: planner breaks it into ordered MVPs
|
|
18
|
+
→ For each MVP:
|
|
19
|
+
→ Design meeting: round-robin, consensus-based termination
|
|
20
|
+
→ PRD meeting minutes saved to docs/open-coleslaw/
|
|
21
|
+
→ Plan Mode activated — you review the implementation plan
|
|
22
|
+
→ You approve
|
|
23
|
+
→ Workers write the code in parallel
|
|
24
|
+
→ Verifier runs tests/build
|
|
25
|
+
→ Pass → next MVP · Fail → verify-retry meeting
|
|
26
|
+
→ All MVPs done → final report
|
|
24
27
|
```
|
|
25
28
|
|
|
26
29
|
You never call a tool. You never pick a department. You never manage an agent. The orchestrator handles everything — including entering **Plan Mode** so you can review the implementation plan in the native UI before any code is written.
|
|
27
30
|
|
|
28
|
-
Meeting minutes are saved to `docs/open-coleslaw/` in your project, so you
|
|
31
|
+
Meeting minutes are saved to `docs/open-coleslaw/` in your project, so they persist even if you `/compact` or `/clear` your Claude Code context between MVPs.
|
|
29
32
|
|
|
30
33
|
## Installation
|
|
31
34
|
|
|
@@ -46,105 +49,123 @@ Start a new session and type anything:
|
|
|
46
49
|
Design a REST API for a todo app
|
|
47
50
|
```
|
|
48
51
|
|
|
49
|
-
You should see the orchestrator agent being dispatched and a meeting starting automatically.
|
|
52
|
+
You should see the orchestrator agent being dispatched and a kickoff meeting starting automatically.
|
|
50
53
|
|
|
51
54
|
## The Pipeline
|
|
52
55
|
|
|
53
|
-
Every request follows this flow.
|
|
56
|
+
Every request follows this flow.
|
|
54
57
|
|
|
55
58
|
```
|
|
56
|
-
Prompt
|
|
59
|
+
Prompt
|
|
60
|
+
→ Orchestrator
|
|
61
|
+
→ Kickoff meeting (planner breaks request into MVPs)
|
|
62
|
+
→ for each MVP:
|
|
63
|
+
Design meeting → consensus → Minutes → Plan Mode → Approve → Workers → Verify
|
|
64
|
+
→ Final report
|
|
57
65
|
```
|
|
58
66
|
|
|
59
|
-
|
|
60
|
-
2. **Meeting convened** — leaders discuss via Agent tool
|
|
61
|
-
3. **PRD minutes saved** — to `docs/open-coleslaw/` in your project
|
|
62
|
-
4. **Plan Mode activated** — implementation plan presented in native Plan Mode UI
|
|
63
|
-
5. **You review and approve** — or request changes (chains a follow-up meeting)
|
|
64
|
-
6. **Implementer agents dispatched** — write code following the approved plan
|
|
65
|
-
7. **Results reported** — final output delivered to you
|
|
67
|
+
Verification failure on an MVP doesn't abort the cycle — it opens a focused `verify-retry` meeting and re-plans the fix.
|
|
66
68
|
|
|
67
|
-
|
|
69
|
+
When the whole cycle ends the orchestrator touches a marker file, and the `Stop` hook checks your context usage. If you're over ~30%, it suggests running `/compact` or `/clear` before the next task. Minutes on disk mean you lose nothing.
|
|
70
|
+
|
|
71
|
+
## The Agent Cast
|
|
68
72
|
|
|
69
73
|
```
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
74
|
+
┌─────────────────┐
|
|
75
|
+
│ Orchestrator │ ← Your proxy
|
|
76
|
+
│ (claude-opus) │
|
|
77
|
+
└────────┬────────┘
|
|
78
|
+
│
|
|
79
|
+
(Kickoff → per-MVP loop)
|
|
80
|
+
│
|
|
81
|
+
┌─────────────┼─────────────────────────────┐
|
|
82
|
+
▼ ▼ ▼ ▼
|
|
83
|
+
┌─────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
|
|
84
|
+
│ Planner │ │ Architect│ │ Engineer │ │ Verifier │ dynamically convened +
|
|
85
|
+
│(chair) │ │ │ │ │ │ │ product-manager / researcher
|
|
86
|
+
└─────────┘ └──────────┘ └──────────┘ └──────────┘
|
|
87
|
+
│
|
|
88
|
+
Plan Mode → User approves
|
|
89
|
+
│
|
|
90
|
+
┌─────────────┼─────────────┐
|
|
91
|
+
▼ ▼ ▼
|
|
92
|
+
┌────────┐ ┌────────┐ ┌────────┐
|
|
93
|
+
│Worker 1│ │Worker 2│ │Worker N│ ← Parallel implementation
|
|
94
|
+
└────────┘ └────────┘ └────────┘
|
|
95
|
+
│
|
|
96
|
+
Verifier runs tests
|
|
97
|
+
/ \
|
|
98
|
+
Pass Fail → verify-retry meeting
|
|
99
|
+
↓
|
|
100
|
+
Next MVP (or done)
|
|
85
101
|
```
|
|
86
102
|
|
|
87
|
-
**
|
|
103
|
+
**7 Specialists**: Planner, Architect, Engineer, Verifier, Product Manager, Researcher, plus Worker (parallelized).
|
|
104
|
+
|
|
105
|
+
The **planner always attends** — they chair the meeting, run the round-robin, and drive consensus. Other specialists are convened dynamically based on the task.
|
|
106
|
+
|
|
107
|
+
## Meetings That Actually End on Agreement
|
|
108
|
+
|
|
109
|
+
Rounds are not fixed. After every round the planner asks each participant AGREE or DISAGREE. The meeting only proceeds to synthesis when everyone agrees. If round 10 passes without consensus, the planner escalates via `@mention` for you to decide.
|
|
88
110
|
|
|
89
|
-
|
|
111
|
+
This is deliberately slower than a fixed-round meeting — but each MVP ends with a real decision, not a paper one.
|
|
90
112
|
|
|
91
113
|
## What's Inside
|
|
92
114
|
|
|
93
|
-
###
|
|
115
|
+
### 15 MCP Tools (orchestrator calls these — you never do)
|
|
94
116
|
|
|
95
117
|
| Tool | What It Does |
|
|
96
118
|
|------|-------------|
|
|
97
|
-
| `start-meeting` | Creates a meeting record
|
|
98
|
-
| `add-transcript` | Saves a
|
|
99
|
-
| `generate-minutes` |
|
|
100
|
-
| `get-meeting-status` |
|
|
101
|
-
| `get-minutes` | Retrieves
|
|
102
|
-
| `
|
|
103
|
-
| `execute-tasks` | Returns structured task list for implementer agents |
|
|
119
|
+
| `start-meeting` | Creates a meeting record (kickoff / design / verify-retry) |
|
|
120
|
+
| `add-transcript` | Saves a speaker's turn |
|
|
121
|
+
| `generate-minutes` | Writes PRD minutes from transcripts |
|
|
122
|
+
| `get-meeting-status` | Reads meeting progress |
|
|
123
|
+
| `get-minutes` | Retrieves full / summary / tasks-only minutes |
|
|
124
|
+
| `execute-tasks` | Returns the structured task list from minutes for worker dispatch |
|
|
104
125
|
| `get-task-report` | Shows execution results per department |
|
|
105
|
-
| `get-agent-tree` | Displays the
|
|
106
|
-
| `respond-to-mention` |
|
|
107
|
-
| `get-mentions` | Lists pending @mention
|
|
108
|
-
| `cancel-meeting` | Stops a meeting and cascades to
|
|
126
|
+
| `get-agent-tree` | Displays the agent hierarchy (bookkeeping) |
|
|
127
|
+
| `respond-to-mention` | Resolves a pending decision escalated by an agent |
|
|
128
|
+
| `get-mentions` | Lists pending @mention decisions |
|
|
129
|
+
| `cancel-meeting` | Stops a meeting and cascades to workers |
|
|
109
130
|
| `list-meetings` | Shows meeting history |
|
|
110
131
|
| `create-capability` | Self-extends the plugin with new hooks/skills |
|
|
111
|
-
| `get-cost-summary` | Tracks
|
|
112
|
-
| `chain-meeting` | Links meetings —
|
|
132
|
+
| `get-cost-summary` | Tracks spend per agent/meeting/department |
|
|
133
|
+
| `chain-meeting` | Links meetings — previous minutes feed the next |
|
|
113
134
|
|
|
114
|
-
###
|
|
135
|
+
### 8 Agents (dispatched via the Agent tool)
|
|
115
136
|
|
|
116
137
|
| Agent | Role |
|
|
117
138
|
|-------|------|
|
|
118
|
-
| `orchestrator` | Your proxy — manages the
|
|
119
|
-
| `
|
|
120
|
-
| `
|
|
121
|
-
| `
|
|
122
|
-
| `
|
|
123
|
-
| `
|
|
124
|
-
| `
|
|
139
|
+
| `orchestrator` | Your proxy — manages the kickoff + per-MVP cycles |
|
|
140
|
+
| `planner` | Runs the meeting, chairs rounds, checks consensus, synthesises minutes |
|
|
141
|
+
| `architect` | System design, API contracts, schemas |
|
|
142
|
+
| `engineer` | Implementation feasibility, code quality |
|
|
143
|
+
| `verifier` | Testing strategy at design time; tests/build at verify time |
|
|
144
|
+
| `product-manager` | Requirements, user stories, prioritisation |
|
|
145
|
+
| `researcher` | Codebase exploration, prior art, library comparison |
|
|
146
|
+
| `worker` | Writes code (N workers in parallel) |
|
|
125
147
|
|
|
126
148
|
### 7 Skills
|
|
127
149
|
|
|
128
150
|
| Skill | Purpose |
|
|
129
151
|
|-------|---------|
|
|
130
|
-
| `using-open-coleslaw` |
|
|
152
|
+
| `using-open-coleslaw` | Injected at session start — ensures all requests go through the pipeline |
|
|
131
153
|
| `meeting` | Dispatches the orchestrator for the meeting → plan → implement flow |
|
|
132
154
|
| `status` | Shows active meetings, agents, pending mentions |
|
|
133
|
-
| `dashboard` | Opens the real-time
|
|
155
|
+
| `dashboard` | Opens the real-time dashboard |
|
|
134
156
|
| `mention` | Handles pending @mention decisions |
|
|
135
157
|
| `agents` | Shows the agent hierarchy tree |
|
|
136
158
|
| `minutes` | Browses past meeting minutes |
|
|
137
159
|
|
|
138
|
-
### Real-Time Dashboard
|
|
160
|
+
### Real-Time Meeting Dashboard
|
|
139
161
|
|
|
140
|
-
A
|
|
162
|
+
A live meeting viewer at `http://localhost:35143`:
|
|
141
163
|
|
|
142
|
-
-
|
|
143
|
-
-
|
|
144
|
-
-
|
|
145
|
-
-
|
|
146
|
-
-
|
|
147
|
-
- Duplicate project names get auto-numbered: `project`, `project (1)`
|
|
164
|
+
- **Current meeting as a thread** — speakers post comments, consensus stances are shown inline
|
|
165
|
+
- **MVP progress panel** — which MVPs are pending / in-progress / done
|
|
166
|
+
- **User comment box** — type a note straight into the meeting from the browser; the orchestrator picks it up at the next round boundary (file-queue routed to `docs/open-coleslaw/.pending-comments.jsonl`)
|
|
167
|
+
- **Terminal comments also work** — if you prompt Claude Code while a meeting is in progress, your prompt becomes a user turn in the thread
|
|
168
|
+
- Per-project tabs (multiple terminals → multiple tabs); duplicate names auto-number: `project`, `project (1)`
|
|
148
169
|
|
|
149
170
|
### Self-Extending
|
|
150
171
|
|
|
@@ -154,10 +175,10 @@ Ask for a workflow that doesn't exist yet, and the orchestrator creates it — n
|
|
|
154
175
|
|
|
155
176
|
| Tier | Model | Role |
|
|
156
177
|
|------|-------|------|
|
|
157
|
-
| Orchestrator | claude-opus
|
|
158
|
-
| Leader | claude-sonnet
|
|
159
|
-
| Worker | claude-sonnet
|
|
160
|
-
| Research Worker | claude-haiku
|
|
178
|
+
| Orchestrator | claude-opus (1M context) | Full-picture routing, delegation, judgment |
|
|
179
|
+
| Leader (specialists) | claude-sonnet | Meetings, technical decisions |
|
|
180
|
+
| Worker | claude-sonnet | Code, implementation |
|
|
181
|
+
| Research Worker | claude-haiku | Quick lookups, exploration |
|
|
161
182
|
|
|
162
183
|
## Philosophy
|
|
163
184
|
|
|
@@ -168,10 +189,10 @@ Coleslaw is a side dish that's already made. You don't prepare it — you just e
|
|
|
168
189
|
### Key Decisions
|
|
169
190
|
|
|
170
191
|
- **The Orchestrator is your proxy, not a CEO.** You are the decision-maker. The orchestrator acts on your behalf but escalates important choices via @mention.
|
|
171
|
-
- **
|
|
172
|
-
- **
|
|
173
|
-
- **
|
|
174
|
-
- **Agents check before they code.** Every
|
|
192
|
+
- **Kickoff first.** Every non-trivial request starts by breaking itself into ordered MVPs.
|
|
193
|
+
- **Consensus, not round count.** A meeting ends when everyone actually agrees (or you are asked to break a tie).
|
|
194
|
+
- **Minutes are the real artifact.** They survive `/compact` and `/clear` — your Claude Code context is disposable.
|
|
195
|
+
- **Agents check before they code.** Every specialist reads the project's state before proposing anything.
|
|
175
196
|
|
|
176
197
|
## Development
|
|
177
198
|
|
|
@@ -184,7 +205,7 @@ npm run build
|
|
|
184
205
|
# Run with mock agents (no Claude CLI needed)
|
|
185
206
|
COLESLAW_MOCK=1 node dist/index.js
|
|
186
207
|
|
|
187
|
-
# Run tests
|
|
208
|
+
# Run tests
|
|
188
209
|
npm test
|
|
189
210
|
|
|
190
211
|
# Type check
|
|
@@ -86,6 +86,17 @@ var MIGRATIONS = [
|
|
|
86
86
|
event_type TEXT NOT NULL,
|
|
87
87
|
payload TEXT NOT NULL,
|
|
88
88
|
created_at INTEGER NOT NULL
|
|
89
|
+
)`,
|
|
90
|
+
`CREATE TABLE IF NOT EXISTS mvps (
|
|
91
|
+
id TEXT PRIMARY KEY,
|
|
92
|
+
kickoff_meeting_id TEXT NOT NULL,
|
|
93
|
+
title TEXT NOT NULL,
|
|
94
|
+
goal TEXT NOT NULL,
|
|
95
|
+
status TEXT NOT NULL DEFAULT 'pending' CHECK(status IN ('pending', 'in-progress', 'done', 'blocked')),
|
|
96
|
+
order_index INTEGER NOT NULL,
|
|
97
|
+
design_meeting_id TEXT,
|
|
98
|
+
created_at INTEGER NOT NULL,
|
|
99
|
+
completed_at INTEGER
|
|
89
100
|
)`
|
|
90
101
|
];
|
|
91
102
|
function applyMigrations(database) {
|
|
@@ -132,4 +143,4 @@ export {
|
|
|
132
143
|
getDb,
|
|
133
144
|
closeDb
|
|
134
145
|
};
|
|
135
|
-
//# sourceMappingURL=chunk-
|
|
146
|
+
//# sourceMappingURL=chunk-IQPO75GF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/storage/db.ts"],"sourcesContent":["import Database from 'better-sqlite3';\nimport type { Database as DatabaseType } from 'better-sqlite3';\nimport { mkdirSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\n\nconst DB_DIR = join(homedir(), '.open-coleslaw');\nconst DB_PATH = join(DB_DIR, 'data.db');\n\nlet db: DatabaseType | null = null;\n\nconst MIGRATIONS: string[] = [\n `CREATE TABLE IF NOT EXISTS agents (\n id TEXT PRIMARY KEY,\n tier TEXT NOT NULL CHECK(tier IN ('orchestrator', 'leader', 'worker')),\n role TEXT NOT NULL,\n department TEXT NOT NULL,\n parent_id TEXT,\n meeting_id TEXT,\n status TEXT NOT NULL DEFAULT 'idle',\n current_task TEXT,\n session_id TEXT,\n spawned_at INTEGER NOT NULL,\n completed_at INTEGER,\n cost_usd REAL DEFAULT 0\n )`,\n\n `CREATE TABLE IF NOT EXISTS meetings (\n id TEXT PRIMARY KEY,\n topic TEXT NOT NULL,\n agenda TEXT NOT NULL,\n participant_ids TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'pending',\n phase TEXT NOT NULL DEFAULT 'orchestrator-phase',\n started_at INTEGER,\n completed_at INTEGER,\n initiated_by TEXT NOT NULL\n )`,\n\n `CREATE TABLE IF NOT EXISTS transcript_entries (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n meeting_id TEXT NOT NULL,\n speaker_id TEXT NOT NULL,\n speaker_role TEXT NOT NULL,\n agenda_item_index INTEGER,\n round_number INTEGER,\n content TEXT NOT NULL,\n token_count INTEGER DEFAULT 0,\n created_at INTEGER NOT NULL\n )`,\n\n `CREATE TABLE IF NOT EXISTS minutes (\n id TEXT PRIMARY KEY,\n meeting_id TEXT NOT NULL UNIQUE,\n format TEXT NOT NULL DEFAULT 'prd',\n content TEXT NOT NULL,\n action_items TEXT NOT NULL DEFAULT '[]',\n created_at INTEGER NOT NULL\n )`,\n\n `CREATE TABLE IF NOT EXISTS workers (\n id TEXT PRIMARY KEY,\n leader_id TEXT NOT NULL,\n meeting_id TEXT NOT NULL,\n task_description TEXT NOT NULL,\n task_type TEXT,\n status TEXT NOT NULL DEFAULT 'pending',\n input_context TEXT,\n output_result TEXT,\n error_message TEXT,\n dependencies TEXT NOT NULL DEFAULT '[]',\n spawned_at INTEGER NOT NULL,\n completed_at INTEGER,\n cost_usd REAL DEFAULT 0\n )`,\n\n `CREATE TABLE IF NOT EXISTS mentions (\n id TEXT PRIMARY KEY,\n meeting_id TEXT NOT NULL,\n agenda_item TEXT,\n summary TEXT NOT NULL,\n options TEXT NOT NULL DEFAULT '[]',\n urgency TEXT NOT NULL DEFAULT 'advisory',\n status TEXT NOT NULL DEFAULT 'pending',\n user_decision TEXT,\n user_reasoning TEXT,\n created_at INTEGER NOT NULL,\n resolved_at INTEGER\n )`,\n\n `CREATE TABLE IF NOT EXISTS events (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n event_type TEXT NOT NULL,\n payload TEXT NOT NULL,\n created_at INTEGER NOT NULL\n )`,\n\n `CREATE TABLE IF NOT EXISTS mvps (\n id TEXT PRIMARY KEY,\n kickoff_meeting_id TEXT NOT NULL,\n title TEXT NOT NULL,\n goal TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'pending' CHECK(status IN ('pending', 'in-progress', 'done', 'blocked')),\n order_index INTEGER NOT NULL,\n design_meeting_id TEXT,\n created_at INTEGER NOT NULL,\n completed_at INTEGER\n )`,\n];\n\nfunction applyMigrations(database: DatabaseType): void {\n database.exec(`\n CREATE TABLE IF NOT EXISTS _migrations (\n id INTEGER PRIMARY KEY,\n applied_at INTEGER NOT NULL\n )\n `);\n\n const applied = new Set(\n database\n .prepare('SELECT id FROM _migrations')\n .all()\n .map((row) => (row as { id: number }).id)\n );\n\n const applyMigration = database.transaction(() => {\n for (let i = 0; i < MIGRATIONS.length; i++) {\n if (!applied.has(i)) {\n database.exec(MIGRATIONS[i]);\n database\n .prepare('INSERT INTO _migrations (id, applied_at) VALUES (?, ?)')\n .run(i, Date.now());\n }\n }\n });\n\n applyMigration();\n}\n\nexport function getDb(): DatabaseType {\n if (db) {\n return db;\n }\n\n if (!existsSync(DB_DIR)) {\n mkdirSync(DB_DIR, { recursive: true });\n }\n\n db = new Database(DB_PATH);\n db.pragma('journal_mode = WAL');\n db.pragma('foreign_keys = ON');\n\n applyMigrations(db);\n\n return db;\n}\n\nexport function closeDb(): void {\n if (db) {\n db.close();\n db = null;\n }\n}\n"],"mappings":";;;AAAA,OAAO,cAAc;AAErB,SAAS,WAAW,kBAAkB;AACtC,SAAS,YAAY;AACrB,SAAS,eAAe;AAExB,IAAM,SAAS,KAAK,QAAQ,GAAG,gBAAgB;AAC/C,IAAM,UAAU,KAAK,QAAQ,SAAS;AAEtC,IAAI,KAA0B;AAE9B,IAAM,aAAuB;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWF;AAEA,SAAS,gBAAgB,UAA8B;AACrD,WAAS,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,GAKb;AAED,QAAM,UAAU,IAAI;AAAA,IAClB,SACG,QAAQ,4BAA4B,EACpC,IAAI,EACJ,IAAI,CAAC,QAAS,IAAuB,EAAE;AAAA,EAC5C;AAEA,QAAM,iBAAiB,SAAS,YAAY,MAAM;AAChD,aAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AAC1C,UAAI,CAAC,QAAQ,IAAI,CAAC,GAAG;AACnB,iBAAS,KAAK,WAAW,CAAC,CAAC;AAC3B,iBACG,QAAQ,wDAAwD,EAChE,IAAI,GAAG,KAAK,IAAI,CAAC;AAAA,MACtB;AAAA,IACF;AAAA,EACF,CAAC;AAED,iBAAe;AACjB;AAEO,SAAS,QAAsB;AACpC,MAAI,IAAI;AACN,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,WAAW,MAAM,GAAG;AACvB,cAAU,QAAQ,EAAE,WAAW,KAAK,CAAC;AAAA,EACvC;AAEA,OAAK,IAAI,SAAS,OAAO;AACzB,KAAG,OAAO,oBAAoB;AAC9B,KAAG,OAAO,mBAAmB;AAE7B,kBAAgB,EAAE;AAElB,SAAO;AACT;AAEO,SAAS,UAAgB;AAC9B,MAAI,IAAI;AACN,OAAG,MAAM;AACT,SAAK;AAAA,EACP;AACF;","names":[]}
|