claude-cwc 0.2.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Fayzan Malik
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,218 @@
1
+ # Claude Workflow Composer
2
+
3
+ **n8n for coding agent workflows.** A visual desktop app for composing multi-agent [Claude Code](https://claude.ai/code) workflows — drag agents onto a canvas, wire handoffs, attach skills, and export a working workflow directly into your Claude installation. No YAML editing required.
4
+
5
+ > Built for the ~115k Claude Code users who are hand-wiring agent pipelines in `.md` files and wondering why there's no better way.
6
+
7
+ ---
8
+
9
+ ## The Problem
10
+
11
+ Building multi-agent workflows in Claude Code today means:
12
+
13
+ 1. Hand-writing agent `.md` files with YAML frontmatter
14
+ 2. Manually authoring orchestrator skills with `disable-model-invocation: true` and sequenced handoff prose
15
+ 3. No visual representation of the pipeline before running it
16
+ 4. No way to share a complete, working workflow with someone else
17
+ 5. No way to discover what good pipelines look like
18
+
19
+ The authoring experience is entirely text-based. You can't see what you're building until you run it.
20
+
21
+ ---
22
+
23
+ ## Quick Start
24
+
25
+ ```bash
26
+ npx claude-cwc
27
+ ```
28
+
29
+ Opens a browser at `http://localhost:3579`. No code signing, no Gatekeeper friction — paste it in a terminal and you're in.
30
+
31
+ ```bash
32
+ npx claude-cwc stop # Stop the server
33
+ ```
34
+
35
+ Or from source:
36
+
37
+ ```bash
38
+ npm run build && npm start
39
+ ```
40
+
41
+ ---
42
+
43
+ ## How It Works
44
+
45
+ ```
46
+ Drag agents onto a canvas
47
+ → Connect them with handoff arrows (author trigger conditions)
48
+ → Edit each agent's system prompt, tools, skills, and completion criteria
49
+ → Preview every file that will be written before exporting
50
+ → Export → writes agent .md files + orchestrator SKILL.md to ~/.claude/
51
+ → Invoke the workflow by name in Claude Code
52
+ ```
53
+
54
+ The exporter writes directly to `~/.claude/` (user-scoped) or `.claude/` inside any project directory (project-scoped, version-controllable). Conflict detection ensures it never touches files it doesn't own.
55
+
56
+ ### Build
57
+
58
+ Drag an **existing agent** from the sidebar (`~/.claude/agents/`) onto the canvas to create a **reference node** — it points to that agent file by slug rather than duplicating it. Drag from **"New / Blank Agent"** to create a **bespoke node** — the exporter generates a new agent file for it.
59
+
60
+ Connect nodes by dragging between handles. Each connection becomes a **handoff** with a trigger description and optional context artifacts (files, text, JSON) passed between agents. Mark any node as a **terminal** (`Complete`, `Escalated`, or `Aborted`) to define workflow end states.
61
+
62
+ Edit any node's completion criteria, tool access, skills, and system prompt in the **Node Panel**. The first node can also have a **start trigger** describing what initiates the workflow.
63
+
64
+ Real-time validation surfaces duplicate slugs, empty names, disconnected nodes, and missing completion criteria immediately in the top bar — before you export.
65
+
66
+ ### Export
67
+
68
+ Click **Export** in the top bar. Choose a target directory (`~/.claude/` or any project's `.claude/`). Review a **preview** of every file that will be written. Confirm to write.
69
+
70
+ The exporter:
71
+
72
+ - **Bespoke nodes** → writes an agent `.md` file with frontmatter (name, description, color, model, tools), system prompt, completion criteria, skill references, and an ownership comment.
73
+ - **Reference nodes** → writes nothing — the `exportedSlug` is set to the existing agent's slug so the orchestrator routes to it directly.
74
+ - **Workflow skill** → generates an orchestrator skill at `.claude/skills/<workflow-slug>/SKILL.md` with `disable-model-invocation: true`. The orchestrator body is produced by BFS-traversing the node/edge graph into natural-language steps.
75
+ - **Rename handling** → if a node was renamed, the old owned file is deleted and the new one is written.
76
+ - **Conflict detection** → every file carries an ownership HTML comment. Before overwriting or deleting, the exporter verifies ownership — it never touches files created by other workflows or by hand.
77
+
78
+ ### Run
79
+
80
+ From any Claude Code session, invoke the workflow by its skill name:
81
+
82
+ ```
83
+ /workflow-name
84
+ ```
85
+
86
+ The orchestrator skill delegates every implementation step to sub-agents via the Agent tool. Each step references an agent by name; Claude Code resolves it to the agent's `.md` file and loads its system prompt, tools, and completion criteria.
87
+
88
+ ### Delete
89
+
90
+ `POST /api/export/delete` scans every exported file, checks its ownership comment, and only removes files owned by the current workflow. Reference nodes have nothing to delete — they didn't write any files.
91
+
92
+ ---
93
+
94
+ ## Features
95
+
96
+ - **Visual canvas** — React Flow with background grid, minimap, zoom controls, and drag-to-connect
97
+ - **Left sidebar** — My Agents (searchable, draggable from `~/.claude/agents/`) and Skills (searchable, draggable onto selected nodes)
98
+ - **Right panels** — Node Editor (name, description, criteria, tools, skills, system prompt, terminal type) and Edge Editor (trigger, label, context artifacts)
99
+ - **Export modal** — target selection, full file preview, warning display before writing anything
100
+ - **Auto-save** — 500ms debounced save to `~/.cwc/workflows/`, no manual saving needed
101
+ - **Recent files** — home screen shows last 10 workflows, persisted to `~/.cwc/recents.json`
102
+ - **Markdown preview** — click any agent or skill card to view its source file
103
+ - **Open in editor** — view any agent or skill file in your system editor
104
+ - **Claude Code detection** — warns on startup if `~/.claude/` is missing
105
+
106
+ ---
107
+
108
+ ## Architecture
109
+
110
+ ```
111
+ Client (React + React Flow) Server (Express :3579)
112
+ ┌─────────────────────────┐ ┌─────────────────────┐
113
+ │ TemplatePicker │ ──► │ /api/workflows │
114
+ │ TopBar │ ◄── │ /api/recents │
115
+ │ Sidebar (Agents/Skills) │ ──► │ /api/agents │
116
+ │ Canvas (React Flow) │ ──► │ /api/skills │
117
+ │ NodePanel / EdgePanel │ ──► │ /api/export │
118
+ │ ExportFlow (modal) │ ──► │ /api/export/preview │
119
+ │ useWorkflow (reducer) │ │ /api/export/delete │
120
+ │ useAutoSave (debounced) │ │ /api/health │
121
+ └─────────────────────────┘ └─────────────────────┘
122
+
123
+
124
+ Core Library ┌─────────────────────┐
125
+ │ bfs.ts │
126
+ │ conflict-detector.ts │
127
+ │ exporter.ts │
128
+ │ file-writer.ts │
129
+ │ prose-generator.ts │
130
+ │ skill-resolver.ts │
131
+ │ slugify.ts │
132
+ └─────────────────────┘
133
+
134
+ Storage:
135
+ ~/.cwc/
136
+ recents.json Recent file paths (max 10)
137
+ workflows/ Saved .cwc workflow files
138
+ server.pid PID of running server
139
+ ~/.claude/
140
+ agents/*.md Agent definitions (read + written)
141
+ skills/*/SKILL.md User skills (read by sidebar)
142
+ plugins/cache/... Plugin skills (read by sidebar)
143
+ ```
144
+
145
+ ---
146
+
147
+ ## Key Concepts
148
+
149
+ | Concept | Description |
150
+ |---|---|
151
+ | **CwcFile** | JSON file format (`.cwc`) representing a full workflow: metadata, nodes, edges |
152
+ | **Bespoke node** | A node whose agent definition is authored in the UI — exporter writes a new `.md` file |
153
+ | **Reference node** | A node with an `agentRef` slug pointing to an existing agent on disk — exporter writes nothing |
154
+ | **Handoff** | A directed edge with a trigger description and optional context artifacts |
155
+ | **Terminal edge** | An edge with no target node — marks a workflow end state (complete/escalated/aborted) |
156
+ | **Ownership comment** | HTML comment appended to every exported file: `<!-- cwc:node:<id>:workflow:<id> -->` |
157
+ | **Orchestrator skill** | The workflow skill generated on export — a Claude Code skill that delegates via Agent tool |
158
+ | **Conflict detection** | Reads the ownership comment from a file on disk to determine if this workflow can safely overwrite/delete it |
159
+
160
+ ---
161
+
162
+ ## Why Open Source
163
+
164
+ This tool has filesystem access to `~/.claude/`. Open source is the trust model — no data leaves your machine, no cloud dependency. The local Node.js server is the entire backend. You can read every line of code that touches your files.
165
+
166
+ ---
167
+
168
+ ## Competitive Landscape
169
+
170
+ | Tool | What It Does | Gap |
171
+ |---|---|---|
172
+ | [claude-studio](https://dev.to/zagentz/claude-studio-a-visual-orchestration-platform-for-claude-code-multi-agent-workflows-5g0p) | Visual DAG management + CLAUDE.md sync | Management, not authoring; no export to skill orchestrators |
173
+ | [wshobson/agents](https://github.com/wshobson/agents) | 191-agent registry across harnesses | Registry only — no visual composer |
174
+ | [jeremylongshore/claude-code-plugins-plus-skills](https://github.com/jeremylongshore/claude-code-plugins-plus-skills) | 2,810 skills + CLI + marketplace | Registry + CLI — no authoring canvas |
175
+ | Langflow / n8n | Visual AI/automation builders | General-purpose; not coding-agent-specific |
176
+
177
+ The authoring gap — visually composing a Claude Code multi-agent workflow from blank canvas to working exported files — is currently unoccupied.
178
+
179
+ ---
180
+
181
+ ## Development
182
+
183
+ ```bash
184
+ npm run dev:server # Watch-mode server compilation
185
+ npm run dev:client # Vite dev server with HMR (port 5173, proxies /api to :3579)
186
+ npm test # Run all tests (Vitest)
187
+ npm run typecheck # Type-check server + client
188
+ npm run build # Production build (server + client)
189
+ ```
190
+
191
+ ### Tests
192
+
193
+ 89 tests across 16 files covering:
194
+
195
+ - **BFS traversal**: linear chains, back-edges, fan-out, multi-root, terminal edges
196
+ - **Prose generation**: start triggers, bold wrapping, context artifacts, Oxford comma, back-edge ordering
197
+ - **File writer**: frontmatter, skills block, ownership comments, workflow skill generation
198
+ - **Exporter**: full integration with real temp filesystem, rename cleanup, skill resolution, re-export, conflict warnings
199
+ - **Validation**: empty workflows, missing names, duplicate slugs, disconnected nodes
200
+ - **Graph layout**: horizontal spacing, fan-out vertical spacing, back-edge stability
201
+ - **HTTP endpoints**: all 12 API routes tested with real server instances
202
+ - **Slugify**: special chars, truncation, hyphen collapse, empty input
203
+ - **Conflict detection**: owned, foreign, absent, malformed states
204
+ - **Skill resolution**: namespaced (plugin) and non-namespaced (user) skill lookup
205
+
206
+ ---
207
+
208
+ ## Contributing
209
+
210
+ PRs welcome. The codebase is TypeScript end-to-end (client + server + core library). Run `npm test` and `npm run typecheck` before submitting.
211
+
212
+ If you build a workflow you're proud of, share the `.cwc` file — that's how the community library grows.
213
+
214
+ ---
215
+
216
+ ## License
217
+
218
+ MIT
@@ -0,0 +1,82 @@
1
+ #!/usr/bin/env node
2
+ import * as fs from 'node:fs/promises';
3
+ import * as path from 'node:path';
4
+ import * as os from 'node:os';
5
+ import * as child_process from 'node:child_process';
6
+ import { fileURLToPath } from 'node:url';
7
+ import open from 'open';
8
+ const PORT = 3579;
9
+ const CWC_DIR = path.join(os.homedir(), '.cwc');
10
+ const PID_FILE = path.join(CWC_DIR, 'server.pid');
11
+ async function isRunning(pid) {
12
+ try {
13
+ process.kill(pid, 0);
14
+ return true;
15
+ }
16
+ catch {
17
+ return false;
18
+ }
19
+ }
20
+ async function readPid() {
21
+ try {
22
+ const raw = await fs.readFile(PID_FILE, 'utf-8');
23
+ const pid = parseInt(raw.trim(), 10);
24
+ return isNaN(pid) ? null : pid;
25
+ }
26
+ catch {
27
+ return null;
28
+ }
29
+ }
30
+ async function writePid(pid) {
31
+ await fs.mkdir(CWC_DIR, { recursive: true });
32
+ await fs.writeFile(PID_FILE, String(pid), 'utf-8');
33
+ }
34
+ async function stopServer() {
35
+ const pid = await readPid();
36
+ if (pid && await isRunning(pid)) {
37
+ process.kill(pid, 'SIGTERM');
38
+ console.log(`CWC server (PID ${pid}) stopped.`);
39
+ }
40
+ else {
41
+ console.log('CWC server is not running.');
42
+ }
43
+ try {
44
+ await fs.unlink(PID_FILE);
45
+ }
46
+ catch { /* already gone */ }
47
+ }
48
+ async function startServer() {
49
+ const existingPid = await readPid();
50
+ if (existingPid && await isRunning(existingPid)) {
51
+ process.kill(existingPid, 'SIGTERM');
52
+ try {
53
+ await fs.unlink(PID_FILE);
54
+ }
55
+ catch { /* already gone */ }
56
+ await new Promise((r) => setTimeout(r, 300));
57
+ }
58
+ // dist/src/server/start.js — relative to dist/bin/cwc.js
59
+ const serverEntry = path.join(path.dirname(fileURLToPath(import.meta.url)), '..', 'src', 'server', 'start.js');
60
+ const child = child_process.spawn(process.execPath, [serverEntry, String(PORT)], {
61
+ detached: true,
62
+ stdio: 'ignore',
63
+ });
64
+ child.unref();
65
+ if (child.pid === undefined) {
66
+ console.error('Failed to spawn CWC server process.');
67
+ process.exit(1);
68
+ }
69
+ const pid = child.pid;
70
+ await writePid(pid);
71
+ console.log(`CWC server started (PID ${pid}) at http://localhost:${PORT}`);
72
+ // Brief wait for server readiness, then open browser
73
+ await new Promise((r) => setTimeout(r, 800));
74
+ await open(`http://localhost:${PORT}`);
75
+ }
76
+ const [, , command] = process.argv;
77
+ if (command === 'stop') {
78
+ await stopServer();
79
+ }
80
+ else {
81
+ await startServer();
82
+ }
@@ -0,0 +1 @@
1
+ .template-picker{max-width:520px;margin:0 auto;padding:var(--space-3xl) var(--space-xl);display:flex;flex-direction:column;justify-content:center;min-height:100vh;position:relative;isolation:isolate}.template-picker:before{content:"";position:fixed;top:0;right:0;bottom:0;left:0;background-image:radial-gradient(oklch(.47 .2 255 / .04) 1px,transparent 1px);background-size:24px 24px;pointer-events:none;z-index:-2}.template-picker:after{content:"";position:fixed;top:0;right:0;bottom:0;left:0;pointer-events:none;z-index:-1;background:radial-gradient(600px circle at 30% 25%,oklch(.47 .2 255 / .06) 0%,transparent 60%),radial-gradient(500px circle at 70% 75%,oklch(.65 .18 160 / .04) 0%,transparent 60%);animation:ambient-orbit 20s var(--ease-out-expo) infinite alternate}@keyframes ambient-orbit{0%{background:radial-gradient(600px circle at 30% 25%,oklch(.47 .2 255 / .06) 0%,transparent 60%),radial-gradient(500px circle at 70% 75%,oklch(.65 .18 160 / .04) 0%,transparent 60%)}50%{background:radial-gradient(650px circle at 60% 40%,oklch(.47 .2 255 / .07) 0%,transparent 60%),radial-gradient(450px circle at 30% 70%,oklch(.65 .18 160 / .05) 0%,transparent 60%)}to{background:radial-gradient(550px circle at 70% 30%,oklch(.47 .2 255 / .06) 0%,transparent 60%),radial-gradient(600px circle at 40% 80%,oklch(.65 .18 160 / .04) 0%,transparent 60%)}}.template-picker__header{text-align:center;margin-bottom:var(--space-2xl);animation:fade-in-up .5s var(--ease-out-expo) both}.template-picker__logo{display:flex;justify-content:center;margin-bottom:var(--space-lg);animation:scale-in .4s var(--ease-out-expo) .1s both}.template-picker__logo svg{color:var(--color-primary);width:36px;height:36px}.template-picker__title{font-family:var(--font-display);font-size:var(--text-3xl);font-weight:700;margin:0 0 var(--space-sm);color:var(--color-text);letter-spacing:-.03em}.template-picker__subtitle{font-size:var(--text-base);color:var(--color-text-secondary);line-height:1.6;max-width:380px;margin:0 auto}.template-picker__tabs{display:flex;gap:0;border-bottom:1px solid var(--color-border);margin-bottom:var(--space-xl);animation:fade-in-up .4s var(--ease-out-expo) .15s both}.template-picker__tab{display:flex;align-items:center;gap:6px;background:none;border:none;border-bottom:2px solid transparent;margin-bottom:-1px;padding:10px 20px;font-size:var(--text-sm);font-weight:500;font-family:var(--font-display);color:var(--color-text-tertiary);cursor:pointer;transition:color var(--transition-fast),border-color var(--transition-fast)}.template-picker__tab:hover{color:var(--color-text)}.template-picker__tab--active{color:var(--color-primary);border-bottom-color:var(--color-primary)}.template-picker__tab-badge{display:inline-flex;align-items:center;justify-content:center;background:var(--color-primary-light);color:var(--color-primary);font-size:.65rem;font-weight:600;border-radius:10px;padding:1px 7px;min-width:1.4em}.template-picker__section{margin-bottom:var(--space-xl)}.template-card{display:flex;flex-direction:column;align-items:center;text-align:center;gap:var(--space-sm);width:100%;background:var(--color-surface);border:2px dashed var(--color-border);border-radius:var(--radius-2xl);padding:var(--space-3xl) var(--space-2xl);cursor:pointer;transition:border-color var(--transition-normal),background var(--transition-normal),box-shadow var(--transition-normal),transform .2s var(--ease-out);font-family:inherit;animation:fade-in-up .5s var(--ease-out-expo) .25s both}.template-card:hover:not(:disabled){border-color:var(--color-primary);background:var(--color-primary-lighter);box-shadow:0 8px 32px var(--color-primary-ring);transform:translateY(-2px)}.template-card:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.template-card:disabled{opacity:.5;cursor:not-allowed}.template-card__icon{width:52px;height:52px;display:flex;align-items:center;justify-content:center;background:var(--color-primary-lighter);border:1px solid var(--color-primary-light);border-radius:var(--radius-xl);color:var(--color-primary);margin-bottom:var(--space-xs);transition:background var(--transition-fast),border-color var(--transition-fast)}.template-card:hover:not(:disabled) .template-card__icon{background:var(--color-primary-light);border-color:var(--color-primary)}.template-card__title{font-family:var(--font-display);font-size:var(--text-md);font-weight:600;color:var(--color-text)}.template-card__desc{font-size:var(--text-sm);color:var(--color-text-secondary);line-height:1.5;margin:0}.template-picker__empty-state{display:flex;flex-direction:column;align-items:center;gap:var(--space-sm);padding:var(--space-2xl) var(--space-lg);text-align:center;animation:fade-in-up .4s var(--ease-out-expo) both}.template-picker__empty-text{font-size:var(--text-base);color:var(--color-text-secondary);margin:0;font-weight:500}.template-picker__empty-hint{font-size:var(--text-sm);color:var(--color-text-tertiary);margin:0}.template-picker__recent-list{display:flex;flex-direction:column;gap:6px}.template-picker__recent-item{display:flex;align-items:center;gap:0;border:1px solid transparent;border-radius:var(--radius-xl);transition:border-color var(--transition-fast),background var(--transition-fast);animation:fade-in-up .35s var(--ease-out-expo) both}.template-picker__recent-item:nth-child(1){animation-delay:0s}.template-picker__recent-item:nth-child(2){animation-delay:.04s}.template-picker__recent-item:nth-child(3){animation-delay:.08s}.template-picker__recent-item:nth-child(4){animation-delay:.12s}.template-picker__recent-item:nth-child(5){animation-delay:.16s}.template-picker__recent-item:hover{border-color:var(--color-border);background:var(--color-surface-hover)}.template-picker__recent-link{flex:1;display:flex;align-items:center;gap:var(--space-md);padding:var(--space-md) var(--space-lg);background:none;border:none;cursor:pointer;font-family:inherit;text-align:left;color:var(--color-text);min-width:0}.template-picker__recent-link--static{cursor:default;pointer-events:none}.template-picker__recent-link svg{flex-shrink:0;color:var(--color-text-tertiary)}.template-picker__recent-name{font-size:var(--text-base);font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.template-picker__recent-dir{font-size:var(--text-xs);color:var(--color-text-tertiary);font-family:var(--font-mono);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-left:auto;padding-left:var(--space-sm)}.template-picker__recent-delete{flex-shrink:0;display:flex;align-items:center;justify-content:center;width:32px;height:32px;background:none;border:none;cursor:pointer;color:var(--color-text-tertiary);border-radius:var(--radius-md);margin-right:var(--space-sm);transition:color var(--transition-fast),background var(--transition-fast);opacity:0}.template-picker__recent-item:hover .template-picker__recent-delete{opacity:1}.template-picker__recent-delete:hover{color:var(--color-error);background:var(--color-error-light)}.template-picker__error{display:flex;align-items:center;gap:var(--space-sm);background:var(--color-error-light);color:var(--color-error-dark);padding:10px 14px;border-radius:var(--radius-lg);font-size:var(--text-sm);margin-bottom:var(--space-lg)}.template-picker__notice{max-width:400px;margin:0 auto;padding:var(--space-3xl);text-align:center;display:flex;flex-direction:column;align-items:center;gap:var(--space-lg)}.template-picker__notice-icon{opacity:.6}.template-picker__notice-title{font-family:var(--font-display);font-size:var(--text-xl);font-weight:600;margin:0;color:var(--color-text)}.template-picker__notice-desc{font-size:var(--text-base);color:var(--color-text-secondary);margin:0;line-height:1.6}.template-picker__notice-desc code{background:var(--color-primary-light);color:var(--color-primary);border-radius:var(--radius-sm);padding:2px 6px;font-size:.85em;font-family:var(--font-mono)}.template-picker__recent-info{display:flex;flex-direction:column;gap:2px;flex:1;min-width:0}.template-picker__recent-meta{font-size:11px;color:var(--color-text-tertiary)}.template-picker__recent-item--confirming{background:var(--color-surface-raised, #f9f9f9)}.template-picker__confirm-delete{display:flex;align-items:center;gap:6px;padding:0 8px;flex-shrink:0}.template-picker__confirm-msg{font-size:12px;color:var(--color-text-secondary)}.template-picker__confirm-btn{font-size:12px;padding:3px 8px;border-radius:4px;cursor:pointer;border:1px solid transparent}.template-picker__confirm-btn--yes{background:var(--color-error, #e53e3e);color:#fff;border-color:var(--color-error, #e53e3e)}.template-picker__confirm-btn--no{background:transparent;color:var(--color-text-secondary);border-color:var(--color-border)}.react-flow{direction:ltr;--xy-edge-stroke-default: #b1b1b7;--xy-edge-stroke-width-default: 1;--xy-edge-stroke-selected-default: #555;--xy-connectionline-stroke-default: #b1b1b7;--xy-connectionline-stroke-width-default: 1;--xy-attribution-background-color-default: rgba(255, 255, 255, .5);--xy-minimap-background-color-default: #fff;--xy-minimap-mask-background-color-default: rgba(240, 240, 240, .6);--xy-minimap-mask-stroke-color-default: transparent;--xy-minimap-mask-stroke-width-default: 1;--xy-minimap-node-background-color-default: #e2e2e2;--xy-minimap-node-stroke-color-default: transparent;--xy-minimap-node-stroke-width-default: 2;--xy-background-color-default: transparent;--xy-background-pattern-dots-color-default: #91919a;--xy-background-pattern-lines-color-default: #eee;--xy-background-pattern-cross-color-default: #e2e2e2;background-color:var(--xy-background-color, var(--xy-background-color-default));--xy-node-color-default: inherit;--xy-node-border-default: 1px solid #1a192b;--xy-node-background-color-default: #fff;--xy-node-group-background-color-default: rgba(240, 240, 240, .25);--xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(0, 0, 0, .08);--xy-node-boxshadow-selected-default: 0 0 0 .5px #1a192b;--xy-node-border-radius-default: 3px;--xy-handle-background-color-default: #1a192b;--xy-handle-border-color-default: #fff;--xy-selection-background-color-default: rgba(0, 89, 220, .08);--xy-selection-border-default: 1px dotted rgba(0, 89, 220, .8);--xy-controls-button-background-color-default: #fefefe;--xy-controls-button-background-color-hover-default: #f4f4f4;--xy-controls-button-color-default: inherit;--xy-controls-button-color-hover-default: inherit;--xy-controls-button-border-color-default: #eee;--xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, .08);--xy-edge-label-background-color-default: #ffffff;--xy-edge-label-color-default: inherit;--xy-resize-background-color-default: #3367d9}.react-flow.dark{--xy-edge-stroke-default: #3e3e3e;--xy-edge-stroke-width-default: 1;--xy-edge-stroke-selected-default: #727272;--xy-connectionline-stroke-default: #b1b1b7;--xy-connectionline-stroke-width-default: 1;--xy-attribution-background-color-default: rgba(150, 150, 150, .25);--xy-minimap-background-color-default: #141414;--xy-minimap-mask-background-color-default: rgba(60, 60, 60, .6);--xy-minimap-mask-stroke-color-default: transparent;--xy-minimap-mask-stroke-width-default: 1;--xy-minimap-node-background-color-default: #2b2b2b;--xy-minimap-node-stroke-color-default: transparent;--xy-minimap-node-stroke-width-default: 2;--xy-background-color-default: #141414;--xy-background-pattern-dots-color-default: #777;--xy-background-pattern-lines-color-default: #777;--xy-background-pattern-cross-color-default: #777;--xy-node-color-default: #f8f8f8;--xy-node-border-default: 1px solid #3c3c3c;--xy-node-background-color-default: #1e1e1e;--xy-node-group-background-color-default: rgba(240, 240, 240, .25);--xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(255, 255, 255, .08);--xy-node-boxshadow-selected-default: 0 0 0 .5px #999;--xy-handle-background-color-default: #bebebe;--xy-handle-border-color-default: #1e1e1e;--xy-selection-background-color-default: rgba(200, 200, 220, .08);--xy-selection-border-default: 1px dotted rgba(200, 200, 220, .8);--xy-controls-button-background-color-default: #2b2b2b;--xy-controls-button-background-color-hover-default: #3e3e3e;--xy-controls-button-color-default: #f8f8f8;--xy-controls-button-color-hover-default: #fff;--xy-controls-button-border-color-default: #5b5b5b;--xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, .08);--xy-edge-label-background-color-default: #141414;--xy-edge-label-color-default: #f8f8f8}.react-flow__background{background-color:var(--xy-background-color-props, var(--xy-background-color, var(--xy-background-color-default)));pointer-events:none;z-index:-1}.react-flow__container{position:absolute;width:100%;height:100%;top:0;left:0}.react-flow__pane{z-index:1}.react-flow__pane.draggable{cursor:grab}.react-flow__pane.dragging{cursor:grabbing}.react-flow__pane.selection{cursor:pointer}.react-flow__viewport{transform-origin:0 0;z-index:2;pointer-events:none}.react-flow__renderer{z-index:4}.react-flow__selection{z-index:6}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible{outline:none}.react-flow__edge-path{stroke:var(--xy-edge-stroke, var(--xy-edge-stroke-default));stroke-width:var(--xy-edge-stroke-width, var(--xy-edge-stroke-width-default));fill:none}.react-flow__connection-path{stroke:var(--xy-connectionline-stroke, var(--xy-connectionline-stroke-default));stroke-width:var(--xy-connectionline-stroke-width, var(--xy-connectionline-stroke-width-default));fill:none}.react-flow .react-flow__edges{position:absolute}.react-flow .react-flow__edges svg{overflow:visible;position:absolute;pointer-events:none}.react-flow__edge{pointer-events:visibleStroke}.react-flow__edge.selectable{cursor:pointer}.react-flow__edge.animated path{stroke-dasharray:5;animation:dashdraw .5s linear infinite}.react-flow__edge.animated path.react-flow__edge-interaction{stroke-dasharray:none;animation:none}.react-flow__edge.inactive{pointer-events:none}.react-flow__edge.selected,.react-flow__edge:focus,.react-flow__edge:focus-visible{outline:none}.react-flow__edge.selected .react-flow__edge-path,.react-flow__edge.selectable:focus .react-flow__edge-path,.react-flow__edge.selectable:focus-visible .react-flow__edge-path{stroke:var(--xy-edge-stroke-selected, var(--xy-edge-stroke-selected-default))}.react-flow__edge-textwrapper{pointer-events:all}.react-flow__edge .react-flow__edge-text{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__arrowhead polyline{stroke:var(--xy-edge-stroke, var(--xy-edge-stroke-default))}.react-flow__arrowhead polyline.arrowclosed{fill:var(--xy-edge-stroke, var(--xy-edge-stroke-default))}.react-flow__connection{pointer-events:none}.react-flow__connection .animated{stroke-dasharray:5;animation:dashdraw .5s linear infinite}svg.react-flow__connectionline{z-index:1001;overflow:visible;position:absolute}.react-flow__nodes{pointer-events:none;transform-origin:0 0}.react-flow__node{position:absolute;-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:all;transform-origin:0 0;box-sizing:border-box;cursor:default}.react-flow__node.selectable{cursor:pointer}.react-flow__node.draggable{cursor:grab;pointer-events:all}.react-flow__node.draggable.dragging{cursor:grabbing}.react-flow__nodesselection{z-index:3;transform-origin:left top;pointer-events:none}.react-flow__nodesselection-rect{position:absolute;pointer-events:all;cursor:grab}.react-flow__handle{position:absolute;pointer-events:none;min-width:5px;min-height:5px;width:6px;height:6px;background-color:var(--xy-handle-background-color, var(--xy-handle-background-color-default));border:1px solid var(--xy-handle-border-color, var(--xy-handle-border-color-default));border-radius:100%}.react-flow__handle.connectingfrom{pointer-events:all}.react-flow__handle.connectionindicator{pointer-events:all;cursor:crosshair}.react-flow__handle-bottom{top:auto;left:50%;bottom:0;transform:translate(-50%,50%)}.react-flow__handle-top{top:0;left:50%;transform:translate(-50%,-50%)}.react-flow__handle-left{top:50%;left:0;transform:translate(-50%,-50%)}.react-flow__handle-right{top:50%;right:0;transform:translate(50%,-50%)}.react-flow__edgeupdater{cursor:move;pointer-events:all}.react-flow__pane.selection .react-flow__panel{pointer-events:none}.react-flow__panel{position:absolute;z-index:5;margin:15px}.react-flow__panel.top{top:0}.react-flow__panel.bottom{bottom:0}.react-flow__panel.top.center,.react-flow__panel.bottom.center{left:50%;transform:translate(-15px) translate(-50%)}.react-flow__panel.left{left:0}.react-flow__panel.right{right:0}.react-flow__panel.left.center,.react-flow__panel.right.center{top:50%;transform:translateY(-15px) translateY(-50%)}.react-flow__attribution{font-size:10px;background:var(--xy-attribution-background-color, var(--xy-attribution-background-color-default));padding:2px 3px;margin:0}.react-flow__attribution a{text-decoration:none;color:#999}@keyframes dashdraw{0%{stroke-dashoffset:10}}.react-flow__edgelabel-renderer{position:absolute;width:100%;height:100%;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;left:0;top:0}.react-flow__viewport-portal{position:absolute;width:100%;height:100%;left:0;top:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__minimap{background:var( --xy-minimap-background-color-props, var(--xy-minimap-background-color, var(--xy-minimap-background-color-default)) )}.react-flow__minimap-svg{display:block}.react-flow__minimap-mask{fill:var( --xy-minimap-mask-background-color-props, var(--xy-minimap-mask-background-color, var(--xy-minimap-mask-background-color-default)) );stroke:var( --xy-minimap-mask-stroke-color-props, var(--xy-minimap-mask-stroke-color, var(--xy-minimap-mask-stroke-color-default)) );stroke-width:var( --xy-minimap-mask-stroke-width-props, var(--xy-minimap-mask-stroke-width, var(--xy-minimap-mask-stroke-width-default)) )}.react-flow__minimap-node{fill:var( --xy-minimap-node-background-color-props, var(--xy-minimap-node-background-color, var(--xy-minimap-node-background-color-default)) );stroke:var( --xy-minimap-node-stroke-color-props, var(--xy-minimap-node-stroke-color, var(--xy-minimap-node-stroke-color-default)) );stroke-width:var( --xy-minimap-node-stroke-width-props, var(--xy-minimap-node-stroke-width, var(--xy-minimap-node-stroke-width-default)) )}.react-flow__background-pattern.dots{fill:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-dots-color-default)) )}.react-flow__background-pattern.lines{stroke:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-lines-color-default)) )}.react-flow__background-pattern.cross{stroke:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-cross-color-default)) )}.react-flow__controls{display:flex;flex-direction:column;box-shadow:var(--xy-controls-box-shadow, var(--xy-controls-box-shadow-default))}.react-flow__controls.horizontal{flex-direction:row}.react-flow__controls-button{display:flex;justify-content:center;align-items:center;height:26px;width:26px;padding:4px;border:none;background:var(--xy-controls-button-background-color, var(--xy-controls-button-background-color-default));border-bottom:1px solid var( --xy-controls-button-border-color-props, var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default)) );color:var( --xy-controls-button-color-props, var(--xy-controls-button-color, var(--xy-controls-button-color-default)) );cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__controls-button svg{width:100%;max-width:12px;max-height:12px;fill:currentColor}.react-flow__edge.updating .react-flow__edge-path{stroke:#777}.react-flow__edge-text{font-size:10px}.react-flow__node.selectable:focus,.react-flow__node.selectable:focus-visible{outline:none}.react-flow__node-input,.react-flow__node-default,.react-flow__node-output,.react-flow__node-group{padding:10px;border-radius:var(--xy-node-border-radius, var(--xy-node-border-radius-default));width:150px;font-size:12px;color:var(--xy-node-color, var(--xy-node-color-default));text-align:center;border:var(--xy-node-border, var(--xy-node-border-default));background-color:var(--xy-node-background-color, var(--xy-node-background-color-default))}.react-flow__node-input.selectable:hover,.react-flow__node-default.selectable:hover,.react-flow__node-output.selectable:hover,.react-flow__node-group.selectable:hover{box-shadow:var(--xy-node-boxshadow-hover, var(--xy-node-boxshadow-hover-default))}.react-flow__node-input.selectable.selected,.react-flow__node-input.selectable:focus,.react-flow__node-input.selectable:focus-visible,.react-flow__node-default.selectable.selected,.react-flow__node-default.selectable:focus,.react-flow__node-default.selectable:focus-visible,.react-flow__node-output.selectable.selected,.react-flow__node-output.selectable:focus,.react-flow__node-output.selectable:focus-visible,.react-flow__node-group.selectable.selected,.react-flow__node-group.selectable:focus,.react-flow__node-group.selectable:focus-visible{box-shadow:var(--xy-node-boxshadow-selected, var(--xy-node-boxshadow-selected-default))}.react-flow__node-group{background-color:var(--xy-node-group-background-color, var(--xy-node-group-background-color-default))}.react-flow__nodesselection-rect,.react-flow__selection{background:var(--xy-selection-background-color, var(--xy-selection-background-color-default));border:var(--xy-selection-border, var(--xy-selection-border-default))}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible,.react-flow__selection:focus,.react-flow__selection:focus-visible{outline:none}.react-flow__controls-button:hover{background:var( --xy-controls-button-background-color-hover-props, var(--xy-controls-button-background-color-hover, var(--xy-controls-button-background-color-hover-default)) );color:var( --xy-controls-button-color-hover-props, var(--xy-controls-button-color-hover, var(--xy-controls-button-color-hover-default)) )}.react-flow__controls-button:disabled{pointer-events:none}.react-flow__controls-button:disabled svg{fill-opacity:.4}.react-flow__controls-button:last-child{border-bottom:none}.react-flow__controls.horizontal .react-flow__controls-button{border-bottom:none;border-right:1px solid var( --xy-controls-button-border-color-props, var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default)) )}.react-flow__controls.horizontal .react-flow__controls-button:last-child{border-right:none}.react-flow__resize-control{position:absolute}.react-flow__resize-control.left,.react-flow__resize-control.right{cursor:ew-resize}.react-flow__resize-control.top,.react-flow__resize-control.bottom{cursor:ns-resize}.react-flow__resize-control.top.left,.react-flow__resize-control.bottom.right{cursor:nwse-resize}.react-flow__resize-control.bottom.left,.react-flow__resize-control.top.right{cursor:nesw-resize}.react-flow__resize-control.handle{width:5px;height:5px;border:1px solid #fff;border-radius:1px;background-color:var(--xy-resize-background-color, var(--xy-resize-background-color-default));translate:-50% -50%}.react-flow__resize-control.handle.left{left:0;top:50%}.react-flow__resize-control.handle.right{left:100%;top:50%}.react-flow__resize-control.handle.top{left:50%;top:0}.react-flow__resize-control.handle.bottom{left:50%;top:100%}.react-flow__resize-control.handle.top.left,.react-flow__resize-control.handle.bottom.left{left:0}.react-flow__resize-control.handle.top.right,.react-flow__resize-control.handle.bottom.right{left:100%}.react-flow__resize-control.line{border-color:var(--xy-resize-background-color, var(--xy-resize-background-color-default));border-width:0;border-style:solid}.react-flow__resize-control.line.left,.react-flow__resize-control.line.right{width:1px;transform:translate(-50%);top:0;height:100%}.react-flow__resize-control.line.left{left:0;border-left-width:1px}.react-flow__resize-control.line.right{left:100%;border-right-width:1px}.react-flow__resize-control.line.top,.react-flow__resize-control.line.bottom{height:1px;transform:translateY(-50%);left:0;width:100%}.react-flow__resize-control.line.top{top:0;border-top-width:1px}.react-flow__resize-control.line.bottom{border-bottom-width:1px;top:100%}.react-flow__edge-textbg{fill:var(--xy-edge-label-background-color, var(--xy-edge-label-background-color-default))}.react-flow__edge-text{fill:var(--xy-edge-label-color, var(--xy-edge-label-color-default))}.canvas-wrapper{flex:1;height:100%;position:relative}.canvas-wrapper:focus{outline:none}.workflow-node{position:relative;background:var(--color-surface);border:1.5px solid var(--color-border);border-radius:var(--radius-xl);padding:16px 16px 12px;min-width:180px;max-width:240px;box-shadow:var(--shadow-sm);font-size:var(--text-sm);cursor:pointer;transition:border-color var(--transition-fast),box-shadow var(--transition-fast),transform .15s var(--ease-out);overflow:hidden;animation:scale-in .25s var(--ease-out-expo) both}.workflow-node:hover{box-shadow:var(--shadow-md)}.workflow-node--selected{border-color:var(--node-accent, var(--color-primary));box-shadow:0 0 0 2px var(--color-primary-ring),var(--shadow-md);transform:translateY(-1px)}.workflow-node--warning{border-color:var(--color-warning)}.workflow-node--error{border-color:var(--color-error)}.workflow-node--ref{border-style:dashed;background:var(--color-surface-secondary)}.workflow-node--ref .workflow-node__accent{opacity:.6}.workflow-node__accent{position:absolute;top:0;left:var(--space-md);right:var(--space-md);height:2px;background:var(--node-accent, var(--color-primary));border-radius:0 0 2px 2px}.workflow-node--warning .workflow-node__accent{background:var(--color-warning)}.workflow-node--error .workflow-node__accent{background:var(--color-error)}.workflow-node__header{margin-bottom:6px}.workflow-node__name-row{display:flex;align-items:center;gap:6px}.workflow-node__name{font-family:var(--font-display);font-weight:600;font-size:var(--text-sm);color:var(--color-text);flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.workflow-node__status-badge{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;border-radius:50%;font-size:10px;font-weight:700;flex-shrink:0}.workflow-node__status-badge--warning{background:var(--color-warning-light);color:var(--color-warning-dark)}.workflow-node__status-badge--error{background:var(--color-error-light);color:var(--color-error-dark)}.workflow-node__desc{color:var(--color-text-secondary);font-size:var(--text-xs);margin-bottom:8px;line-height:1.45;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}.workflow-node__skills{display:flex;flex-wrap:wrap;gap:4px;margin-bottom:8px}.workflow-node__skill-chip{display:inline-block;font-size:.5625rem;font-family:var(--font-mono);font-weight:500;padding:1px 6px;border-radius:var(--radius-sm);background:color-mix(in srgb,var(--node-accent, var(--color-primary)) 12%,transparent);color:var(--node-accent, var(--color-primary));border:1px solid color-mix(in srgb,var(--node-accent, var(--color-primary)) 25%,transparent);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.workflow-node__footer{display:flex;align-items:center;justify-content:flex-start}.workflow-node__slug{color:var(--color-text-tertiary);font-size:.625rem;font-family:var(--font-mono)}.workflow-node__ref-indicator{display:inline-flex;align-items:center;font-size:.5625rem;font-weight:700;text-transform:uppercase;letter-spacing:.04em;padding:1px 6px;border-radius:var(--radius-sm);background:var(--color-primary-light);color:var(--color-primary);flex-shrink:0}.react-flow__controls{box-shadow:var(--shadow-md);border-radius:var(--radius-lg);border:1px solid var(--color-border);overflow:hidden}.react-flow__controls-button{width:28px;height:28px;border-bottom:1px solid var(--color-border);fill:var(--color-text-secondary);transition:background var(--transition-fast)}.react-flow__controls-button:hover{background:var(--color-surface-hover)}.react-flow__edge-path{stroke:var(--color-border-hover);stroke-width:1.5;transition:stroke var(--transition-fast)}.react-flow__edge.selected .react-flow__edge-path{stroke:var(--color-primary);stroke-width:2}.react-flow__edge:hover .react-flow__edge-path{stroke:var(--color-primary)}.react-flow__edge-textbg{fill:var(--color-surface)}.react-flow__edge-text{font-size:10px;fill:var(--color-text-tertiary);font-family:var(--font-sans)}.react-flow__minimap{border-radius:var(--radius-lg);border:1px solid var(--color-border);box-shadow:var(--shadow-md);overflow:hidden}.react-flow__background{background:var(--color-surface-secondary)}.markdown-viewer-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:#0009;display:flex;align-items:center;justify-content:center;z-index:1000;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);animation:overlay-fade-in .2s var(--ease-out) both}.markdown-viewer{background:#06090f;border:1px solid oklch(.22 .015 255);border-radius:var(--radius-2xl);width:min(720px,90vw);max-height:80vh;display:flex;flex-direction:column;overflow:hidden;box-shadow:0 20px 60px #0000004d;animation:scale-in .25s var(--ease-out-expo) both}.markdown-viewer__header{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;border-bottom:1px solid oklch(.22 .015 255);flex-shrink:0}.markdown-viewer__title{font-family:var(--font-display);font-size:var(--text-base);font-weight:600;color:#d3d8de;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;margin-right:12px}.markdown-viewer__actions{display:flex;gap:8px;flex-shrink:0}.markdown-viewer__open-btn{font-size:var(--text-sm);padding:4px 12px;font-weight:500;font-family:var(--font-display);background:var(--color-primary);color:var(--color-text-inverse);border:none;border-radius:var(--radius-md);cursor:pointer;transition:opacity var(--transition-fast)}.markdown-viewer__open-btn:hover{opacity:.85}.markdown-viewer__close-btn{display:flex;align-items:center;justify-content:center;width:26px;height:26px;background:none;border:none;color:#7c8186;cursor:pointer;border-radius:var(--radius-sm);transition:color var(--transition-fast),background var(--transition-fast)}.markdown-viewer__close-btn:hover{color:#d3d8de;background:#ffffff14}.markdown-viewer__body{overflow-y:auto;flex:1;padding:0}.markdown-viewer__pre{margin:0;padding:16px;font-family:var(--font-mono);font-size:var(--text-sm);line-height:1.6;color:#d3d8de;white-space:pre-wrap;word-break:break-word}.markdown-viewer__loading,.markdown-viewer__error{padding:24px 16px;font-size:var(--text-sm);color:#7c8186;text-align:center}.markdown-viewer__error{color:var(--color-error)}.my-agents{display:flex;flex-direction:column;flex:1;overflow:hidden}.my-agents__search-wrap{padding:var(--space-sm);border-bottom:1px solid var(--color-border)}.my-agents__search{width:100%;padding:7px 10px;border:1px solid var(--color-border);border-radius:var(--radius-md);font-size:var(--text-sm);outline:none;background:var(--color-surface-secondary);color:var(--color-text);transition:border-color var(--transition-fast),background var(--transition-fast)}.my-agents__search:focus{border-color:var(--color-primary);background:var(--color-surface)}.my-agents__list{overflow-y:auto;flex:1;padding:var(--space-sm);display:flex;flex-direction:column;gap:4px}.my-agents__status{padding:var(--space-xl) var(--space-sm);font-size:var(--text-sm);color:var(--color-text-tertiary);text-align:center;line-height:1.5}.my-agents__status--error{color:var(--color-error)}.my-agents__group{display:flex;flex-direction:column;gap:4px;margin-bottom:var(--space-sm)}.my-agents__group-label{font-size:.625rem;font-weight:600;color:var(--color-text-tertiary);text-transform:uppercase;letter-spacing:.06em;padding:4px 2px 2px}.my-agents__card{background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-xl);padding:10px 12px;cursor:grab;-webkit-user-select:none;user-select:none;transition:border-color var(--transition-fast),box-shadow var(--transition-fast),background var(--transition-fast),transform .1s var(--ease-out)}.my-agents__card:hover{background:var(--color-primary-lighter);border-color:var(--color-primary);box-shadow:0 2px 8px var(--color-primary-ring);transform:translateY(-1px)}.my-agents__card:active{cursor:grabbing;transform:scale(.98)}.my-agents__name{display:block;font-size:var(--text-sm);font-weight:600;color:var(--color-text);margin-bottom:3px}.my-agents__desc{font-size:var(--text-xs);color:var(--color-text-secondary);margin:0 0 4px;line-height:1.4;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}.my-agents__slug{font-size:.625rem;color:var(--color-text-tertiary);font-family:var(--font-mono)}.skills-panel{display:flex;flex-direction:column;flex:1;overflow:hidden}.skills-panel__search-wrap{padding:var(--space-sm);border-bottom:1px solid var(--color-border)}.skills-panel__search{width:100%;padding:7px 10px;border:1px solid var(--color-border);border-radius:var(--radius-md);font-size:var(--text-sm);outline:none;background:var(--color-surface-secondary);color:var(--color-text);transition:border-color var(--transition-fast),background var(--transition-fast)}.skills-panel__search:focus{border-color:var(--color-primary);background:var(--color-surface)}.skills-panel__list{overflow-y:auto;flex:1;padding:var(--space-sm);display:flex;flex-direction:column;gap:4px}.skills-panel__status{padding:var(--space-xl) var(--space-sm);font-size:var(--text-sm);color:var(--color-text-tertiary);text-align:center;line-height:1.5}.skills-panel__status--error{color:var(--color-error)}.skills-panel__group{display:flex;flex-direction:column;gap:4px;margin-bottom:var(--space-sm)}.skills-panel__group-label{font-size:.625rem;font-weight:600;color:var(--color-text-tertiary);text-transform:uppercase;letter-spacing:.06em;padding:4px 2px 2px}.skills-panel__card{background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-xl);padding:10px 12px;cursor:grab;-webkit-user-select:none;user-select:none;transition:border-color var(--transition-fast),box-shadow var(--transition-fast),background var(--transition-fast),transform .1s var(--ease-out)}.skills-panel__card:hover{background:var(--color-primary-lighter);border-color:var(--color-primary);box-shadow:0 2px 8px var(--color-primary-ring);transform:translateY(-1px)}.skills-panel__card:active{cursor:grabbing;transform:scale(.98)}.skills-panel__name{display:block;font-size:var(--text-sm);font-weight:600;color:var(--color-text);margin-bottom:3px}.skills-panel__desc{font-size:var(--text-xs);color:var(--color-text-secondary);margin:0 0 4px;line-height:1.4;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}.skills-panel__slug{font-size:.625rem;color:var(--color-text-tertiary);font-family:var(--font-mono)}.discover{display:flex;flex-direction:column;flex:1;overflow:hidden}.discover__intro{padding:var(--space-sm);font-size:var(--text-xs);color:var(--color-text-secondary);line-height:1.5;border-bottom:1px solid var(--color-border)}.discover__intro code{font-family:var(--font-mono);font-size:.7rem;background:var(--color-surface-secondary);padding:1px 4px;border-radius:var(--radius-sm)}.discover__list{overflow-y:auto;flex:1;padding:var(--space-sm);display:flex;flex-direction:column;gap:4px}.discover__section{display:flex;flex-direction:column;gap:4px;margin-bottom:var(--space-sm)}.discover__section-label{font-size:.625rem;font-weight:600;color:var(--color-text-tertiary);text-transform:uppercase;letter-spacing:.06em;padding:4px 2px 2px}.discover__card{display:block;background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-xl);padding:10px 12px;text-decoration:none;transition:border-color var(--transition-fast),box-shadow var(--transition-fast),background var(--transition-fast),transform .1s var(--ease-out)}.discover__card:hover{background:var(--color-primary-lighter);border-color:var(--color-primary);box-shadow:0 2px 8px var(--color-primary-ring);transform:translateY(-1px)}.discover__card:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.discover__card:active{transform:scale(.98)}.discover__card-title{display:block;font-size:var(--text-sm);font-weight:600;color:var(--color-text);margin-bottom:3px}.discover__card-desc{font-size:var(--text-xs);color:var(--color-text-secondary);margin:0 0 4px;line-height:1.4;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}.discover__card-slug{font-size:.625rem;color:var(--color-text-tertiary);font-family:var(--font-mono)}.sidebar{width:270px;min-width:270px;max-width:270px;height:100%;display:flex;flex-direction:column;border-right:1px solid var(--color-border);background:var(--color-surface);overflow:hidden;animation:slide-in-left .3s var(--ease-out-expo) both}.sidebar__tabs{display:flex;border-bottom:1px solid var(--color-border);flex-shrink:0;padding:0 var(--space-sm);padding-top:var(--space-sm);gap:2px}.sidebar__tab{flex:1;padding:8px 4px;font-size:var(--text-sm);font-weight:500;font-family:var(--font-display);color:var(--color-text-tertiary);background:none;border:none;border-bottom:2px solid transparent;cursor:pointer;transition:color var(--transition-fast),border-color var(--transition-fast)}.sidebar__tab:hover{color:var(--color-text)}.sidebar__tab--active{color:var(--color-primary);border-bottom-color:var(--color-primary)}.sidebar__content{display:flex;flex-direction:column;flex:1;overflow:hidden}.node-panel{width:320px;min-width:320px;height:100%;overflow-y:auto;background:var(--color-surface);border-left:1px solid var(--color-border);display:flex;flex-direction:column;font-size:var(--text-sm);animation:slide-in-right .25s var(--ease-out-expo) both;view-transition-name:node-panel}.node-panel__header{display:flex;align-items:center;justify-content:space-between;padding:var(--space-md) var(--space-lg);border-bottom:1px solid var(--color-border);position:sticky;top:0;background:var(--color-surface);z-index:1;gap:var(--space-sm)}.node-panel__title{font-family:var(--font-display);font-weight:600;color:var(--color-text);font-size:var(--text-md);flex:1}.node-panel__delete{display:flex;align-items:center;gap:4px;font-size:var(--text-sm);font-weight:500;padding:4px 10px;background:none;border:1px solid var(--color-error-light);color:var(--color-error);border-radius:var(--radius-md);cursor:pointer;transition:background var(--transition-fast),color var(--transition-fast)}.node-panel__delete:hover{background:var(--color-error);color:var(--color-text-inverse)}.node-panel__close{display:flex;align-items:center;justify-content:center;width:26px;height:26px;background:none;border:none;cursor:pointer;color:var(--color-text-tertiary);border-radius:var(--radius-sm);transition:color var(--transition-fast),background var(--transition-fast)}.node-panel__close:hover{color:var(--color-text);background:var(--color-surface-hover)}.node-panel__body{padding:var(--space-lg);display:flex;flex-direction:column;gap:var(--space-lg)}.node-panel__field{display:flex;flex-direction:column;gap:6px}.node-panel__label{font-weight:500;color:var(--color-text-secondary);font-size:var(--text-xs);text-transform:uppercase;letter-spacing:.05em}.node-panel__label--required{color:var(--color-primary)}.node-panel__input{border:1px solid var(--color-border);border-radius:var(--radius-md);padding:7px 10px;font-size:var(--text-sm);color:var(--color-text);background:var(--color-surface-secondary);outline:none;transition:border-color var(--transition-fast),background var(--transition-fast)}.node-panel__input:focus{border-color:var(--color-primary);background:var(--color-surface)}.node-panel__textarea{border:1px solid var(--color-border);border-radius:var(--radius-md);padding:7px 10px;font-size:var(--text-sm);color:var(--color-text);background:var(--color-surface-secondary);outline:none;resize:vertical;font-family:inherit;transition:border-color var(--transition-fast),background var(--transition-fast)}.node-panel__textarea:focus{border-color:var(--color-primary);background:var(--color-surface)}.node-panel__textarea--mono{font-family:var(--font-mono);font-size:var(--text-xs)}.node-panel__slug-preview{font-size:var(--text-xs);color:var(--color-text-tertiary)}.node-panel__slug-preview code{font-family:var(--font-mono);background:var(--color-surface-hover);padding:1px 4px;border-radius:var(--radius-sm)}.node-panel__checkboxes{display:flex;flex-wrap:wrap;gap:6px}.node-panel__checkbox-label{display:flex;align-items:center;gap:5px;font-size:var(--text-sm);color:var(--color-text-secondary);cursor:pointer;padding:4px 8px;border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-surface-secondary);transition:border-color var(--transition-fast),background var(--transition-fast)}.node-panel__checkbox-label:hover{border-color:var(--color-primary);background:var(--color-primary-light)}.node-panel__chips{display:flex;flex-wrap:wrap;gap:6px;min-height:24px}.node-panel__chip{display:inline-flex;align-items:center;gap:4px;padding:3px 10px;background:var(--color-primary-light);border:1px solid oklch(.78 .08 255);border-radius:20px;font-size:var(--text-sm);color:#003974;color:oklch(.35 .16 255)}.node-panel__chip-remove{background:none;border:none;cursor:pointer;color:var(--color-primary);font-size:14px;padding:0;line-height:1;display:flex;align-items:center;opacity:.7;transition:opacity var(--transition-fast)}.node-panel__chip-remove:hover{opacity:1}.node-panel__skill-add{display:flex;gap:6px}.node-panel__skill-add .node-panel__input{flex:1}.node-panel__btn{padding:7px 12px;background:var(--color-primary);color:var(--color-text-inverse);border:none;border-radius:var(--radius-md);font-size:var(--text-sm);font-weight:500;cursor:pointer;white-space:nowrap;transition:background var(--transition-fast)}.node-panel__btn:hover{background:var(--color-primary-hover)}.node-panel__select{border:1px solid var(--color-border);border-radius:var(--radius-md);padding:7px 28px 7px 10px;font-size:var(--text-sm);color:var(--color-text);background:var(--color-surface-secondary);outline:none;cursor:pointer;transition:border-color var(--transition-fast),background var(--transition-fast);-webkit-appearance:none;-moz-appearance:none;appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23888' d='M6 8L1 3h10z'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 10px center}.node-panel__select:focus{border-color:var(--color-primary);background-color:var(--color-surface)}.node-panel__collapsible{display:flex;align-items:center;gap:6px;background:none;border:1px solid var(--color-border);border-radius:var(--radius-md);padding:7px 10px;font-size:var(--text-sm);font-weight:500;color:var(--color-text-secondary);cursor:pointer;text-align:left;transition:border-color var(--transition-fast),background var(--transition-fast),color var(--transition-fast)}.node-panel__collapsible:hover{border-color:var(--color-primary);background:var(--color-surface-hover);color:var(--color-text)}.node-panel__ref-badge{display:flex;align-items:center;gap:6px;font-size:var(--text-xs);color:var(--color-primary);background:var(--color-primary-light);border:1px solid oklch(.78 .08 255);border-radius:var(--radius-md);padding:8px 10px;line-height:1.4}.node-panel__ref-badge code{font-family:var(--font-mono);font-size:.625rem;background:#c2daf9;padding:1px 5px;border-radius:var(--radius-sm)}.node-panel__ref-badge svg{flex-shrink:0}.edge-panel{width:320px;min-width:320px;height:100%;overflow-y:auto;background:var(--color-surface);border-left:1px solid var(--color-border);display:flex;flex-direction:column;font-size:var(--text-sm);animation:slide-in-right .25s var(--ease-out-expo) both;view-transition-name:edge-panel}.edge-panel__header{display:flex;align-items:center;justify-content:space-between;padding:var(--space-md) var(--space-lg);border-bottom:1px solid var(--color-border);position:sticky;top:0;background:var(--color-surface);z-index:1}.edge-panel__title{font-family:var(--font-display);font-weight:600;color:var(--color-text);font-size:var(--text-md)}.edge-panel__header-actions{display:flex;align-items:center;gap:var(--space-xs)}.edge-panel__delete{padding:4px 10px;background:none;border:1px solid var(--color-error, #e53e3e);color:var(--color-error, #e53e3e);border-radius:var(--radius-sm);font-size:var(--text-xs);font-weight:500;cursor:pointer;transition:background var(--transition-fast),color var(--transition-fast)}.edge-panel__delete:hover{background:var(--color-error, #e53e3e);color:#fff}.edge-panel__close{display:flex;align-items:center;justify-content:center;width:26px;height:26px;background:none;border:none;cursor:pointer;color:var(--color-text-tertiary);border-radius:var(--radius-sm);transition:color var(--transition-fast),background var(--transition-fast)}.edge-panel__close:hover{color:var(--color-text);background:var(--color-surface-hover)}.edge-panel__body{padding:var(--space-lg);display:flex;flex-direction:column;gap:var(--space-lg)}.edge-panel__field{display:flex;flex-direction:column;gap:6px}.edge-panel__label{font-weight:500;color:var(--color-text-secondary);font-size:var(--text-xs);text-transform:uppercase;letter-spacing:.05em}.edge-panel__label--required{color:var(--color-primary)}.edge-panel__input{border:1px solid var(--color-border);border-radius:var(--radius-md);padding:7px 10px;font-size:var(--text-sm);color:var(--color-text);background:var(--color-surface-secondary);outline:none;transition:border-color var(--transition-fast),background var(--transition-fast);min-width:0}.edge-panel__input:focus{border-color:var(--color-primary);background:var(--color-surface)}.edge-panel__input--flex{flex:1}.edge-panel__textarea{border:1px solid var(--color-border);border-radius:var(--radius-md);padding:7px 10px;font-size:var(--text-sm);color:var(--color-text);background:var(--color-surface-secondary);outline:none;resize:vertical;font-family:inherit;transition:border-color var(--transition-fast),background var(--transition-fast)}.edge-panel__textarea:focus{border-color:var(--color-primary);background:var(--color-surface)}.edge-panel__select{border:1px solid var(--color-border);border-radius:var(--radius-md);padding:7px 10px;font-size:var(--text-sm);color:var(--color-text);background:var(--color-surface-secondary);outline:none;cursor:pointer;transition:border-color var(--transition-fast)}.edge-panel__select:focus{border-color:var(--color-primary);background:var(--color-surface)}.edge-panel__select--sm{padding:7px 6px;font-size:var(--text-sm);min-width:72px}.edge-panel__artifacts{display:flex;flex-direction:column;gap:8px}.edge-panel__artifact{display:flex;flex-direction:column;gap:6px;padding:10px;background:var(--color-surface-secondary);border:1px solid var(--color-border);border-radius:var(--radius-lg)}.edge-panel__artifact-row{display:flex;gap:6px;align-items:center}.edge-panel__artifact-remove{display:flex;align-items:center;justify-content:center;background:none;border:none;cursor:pointer;color:var(--color-error);font-size:16px;padding:0 4px;line-height:1;opacity:.7;transition:opacity var(--transition-fast);flex-shrink:0}.edge-panel__artifact-remove:hover{opacity:1}.edge-panel__btn{padding:7px 12px;background:var(--color-primary);color:var(--color-text-inverse);border:none;border-radius:var(--radius-md);font-size:var(--text-sm);font-weight:500;cursor:pointer;transition:background var(--transition-fast)}.edge-panel__btn:hover{background:var(--color-primary-hover)}.edge-panel__btn--add{align-self:flex-start;background:var(--color-surface-hover);color:var(--color-text-secondary);border:1px solid var(--color-border)}.edge-panel__btn--add:hover{background:var(--color-primary-light);border-color:var(--color-primary);color:var(--color-primary)}.top-bar{display:flex;align-items:center;gap:var(--space-md);padding:0 var(--space-lg);height:52px;background:var(--color-surface);border-bottom:1px solid var(--color-border);flex-shrink:0;z-index:10}.top-bar__home-btn{flex-shrink:0;display:flex;align-items:center;justify-content:center;width:32px;height:32px;color:var(--color-text-secondary);background:transparent;border:1px solid transparent;border-radius:var(--radius-md);cursor:pointer;transition:background var(--transition-fast),color var(--transition-fast),border-color var(--transition-fast)}.top-bar__home-btn:hover{background:var(--color-surface-hover);color:var(--color-text);border-color:var(--color-border)}.top-bar__name-wrap{flex:1;min-width:0;display:flex;flex-direction:column;gap:0}.top-bar__name-input{width:100%;padding:0;font-family:var(--font-display);font-size:var(--text-md);font-weight:600;color:var(--color-text);background:transparent;border:none;outline:none;letter-spacing:-.01em}.top-bar__name-input::placeholder{color:var(--color-text-tertiary)}.top-bar__meta{font-size:var(--text-xs);color:var(--color-text-tertiary);font-weight:400;line-height:1}.top-bar__status{display:flex;align-items:center;gap:var(--space-sm);flex-shrink:0}.top-bar__save-indicator{display:flex;align-items:center;gap:5px;font-size:var(--text-sm);font-weight:500;padding:4px 10px;border-radius:20px;transition:color var(--transition-normal),background var(--transition-normal)}.top-bar__save-dot{width:6px;height:6px;border-radius:50%;transition:background var(--transition-normal)}.top-bar__save-indicator--saving{color:var(--color-text-secondary);background:var(--color-surface-hover)}.top-bar__save-indicator--saving .top-bar__save-dot{background:var(--color-text-tertiary);animation:top-bar-pulse 1s var(--ease-in-out) infinite}.top-bar__save-indicator--saved{color:var(--color-success);background:var(--color-success-light)}.top-bar__save-indicator--saved .top-bar__save-dot{background:var(--color-success)}@keyframes top-bar-pulse{0%,to{opacity:1}50%{opacity:.3}}.top-bar__badge{display:inline-flex;align-items:center;padding:3px 10px;font-size:var(--text-sm);font-weight:500;border-radius:20px;cursor:default;white-space:nowrap}.top-bar__help-btn{display:flex;align-items:center;justify-content:center;width:28px;height:28px;font-size:var(--text-sm);font-weight:700;font-family:var(--font-display);color:var(--color-text-secondary);background:transparent;border:1px solid var(--color-border);border-radius:50%;cursor:pointer;transition:background var(--transition-fast),color var(--transition-fast),border-color var(--transition-fast);line-height:1}.top-bar__help-btn:hover{background:var(--color-surface-hover);color:var(--color-text);border-color:var(--color-border-hover)}.top-bar__export-btn{display:flex;align-items:center;gap:6px;padding:7px 16px;font-size:var(--text-sm);font-weight:600;font-family:var(--font-display);color:var(--color-text-inverse);background:var(--color-primary);border:none;border-radius:var(--radius-md);cursor:pointer;transition:background var(--transition-fast),opacity var(--transition-fast),transform .1s var(--ease-out)}.top-bar__export-btn:hover:not(:disabled){background:var(--color-primary-hover)}.top-bar__export-btn:active:not(:disabled){transform:scale(.97)}.top-bar__export-btn:disabled{opacity:.4;cursor:not-allowed}.top-bar__badge-wrap{position:relative}.top-bar__badge{display:inline-flex;align-items:center;padding:3px 12px;font-size:var(--text-sm);font-weight:500;border-radius:20px;cursor:pointer;white-space:nowrap;border:none;font-family:inherit;transition:opacity var(--transition-fast)}.top-bar__badge:hover{opacity:.85}.top-bar__badge--warning{background:var(--color-warning-light);color:var(--color-warning-dark)}.top-bar__badge--error{background:var(--color-error-light);color:var(--color-error-dark)}.top-bar__popover{position:absolute;top:calc(100% + 8px);right:0;width:340px;max-height:320px;overflow-y:auto;background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-xl);box-shadow:var(--shadow-lg);z-index:100;animation:scale-in .15s var(--ease-out-expo) both}.top-bar__popover--error{border-color:var(--color-error-light)}.top-bar__popover--warning{border-color:var(--color-warning-light)}.top-bar__popover-heading{margin:0;padding:12px 16px 8px;font-family:var(--font-display);font-size:var(--text-sm);font-weight:600;color:var(--color-text);letter-spacing:-.01em}.top-bar__popover--error .top-bar__popover-heading{color:var(--color-error-dark)}.top-bar__popover--warning .top-bar__popover-heading{color:var(--color-warning-dark)}.top-bar__popover-list{list-style:none;margin:0;padding:0 16px 12px;display:flex;flex-direction:column;gap:6px}.top-bar__popover-item{display:flex;align-items:flex-start;gap:8px;padding:8px 10px;border-radius:var(--radius-md);font-size:var(--text-sm);line-height:1.4}.top-bar__popover--error .top-bar__popover-item{background:var(--color-error-light);color:var(--color-error-dark)}.top-bar__popover--warning .top-bar__popover-item{background:var(--color-warning-light);color:var(--color-warning-dark)}.top-bar__popover-msg{flex:1}.top-bar__popover-node{flex-shrink:0;font-size:var(--text-xs);font-family:var(--font-mono);padding:1px 6px;border-radius:var(--radius-sm);background:#ffffff80;white-space:nowrap}.top-bar__popover-actions{padding:8px 16px 12px;border-top:1px solid var(--color-border)}.top-bar__popover-dismiss{width:100%;padding:6px 12px;font-size:var(--text-sm);font-weight:500;background:var(--color-surface-hover);border:1px solid var(--color-border);border-radius:var(--radius-md);cursor:pointer;color:var(--color-text-secondary);font-family:inherit;transition:background var(--transition-fast),color var(--transition-fast)}.top-bar__popover-dismiss:hover{background:var(--color-surface-active);color:var(--color-text)}.top-bar__save-indicator--error{background:none;border:none;cursor:pointer;color:var(--color-error, #e53e3e);font-size:inherit;display:flex;align-items:center;gap:6px;padding:0}.top-bar__save-indicator--error .top-bar__save-dot{background:var(--color-error, #e53e3e)}.top-bar__rename-error{font-size:11px;color:var(--color-error, #e53e3e);margin-top:2px}.top-bar__leave-msg{font-size:13px;color:var(--color-text-secondary)}.top-bar__leave-btn{font-size:12px;padding:4px 10px;border-radius:4px;cursor:pointer;border:1px solid transparent}.top-bar__leave-btn--confirm{background:var(--color-error, #e53e3e);color:#fff;border-color:var(--color-error, #e53e3e)}.top-bar__leave-btn--cancel{background:transparent;color:var(--color-text-secondary);border-color:var(--color-border)}.export-flow-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:#00000080;display:flex;align-items:center;justify-content:center;z-index:1000;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);animation:overlay-fade-in .2s var(--ease-out) both}@keyframes overlay-fade-in{0%{opacity:0}to{opacity:1}}.export-flow-modal{position:relative;background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-2xl);padding:32px;width:500px;max-width:calc(100vw - 32px);max-height:85vh;overflow-y:auto;box-shadow:var(--shadow-xl);animation:scale-in .25s var(--ease-out-expo) both}.export-flow-modal__close{position:absolute;top:16px;right:16px;width:28px;height:28px;display:flex;align-items:center;justify-content:center;color:var(--color-text-secondary);background:transparent;border:1px solid var(--color-border);border-radius:var(--radius-md);cursor:pointer;transition:background var(--transition-fast),color var(--transition-fast)}.export-flow-modal__close:hover{background:var(--color-surface-hover);color:var(--color-text)}.export-flow-modal__title{font-family:var(--font-display);font-size:var(--text-2xl);font-weight:700;color:var(--color-text);margin:0 0 6px;letter-spacing:-.02em}.export-flow-modal__subtitle{font-size:var(--text-base);color:var(--color-text-secondary);margin:0 0 24px;line-height:1.5}.export-flow-dir{font-family:var(--font-mono);background:var(--color-surface-hover);padding:1px 5px;border-radius:var(--radius-sm);font-size:.9em}.export-flow-step{display:flex;flex-direction:column}.export-flow-step--centered{align-items:center;gap:16px;padding:32px 0}.export-flow-targets{display:grid;grid-template-columns:1fr 1fr;gap:12px}.export-flow-target-btn{display:flex;flex-direction:column;align-items:center;gap:8px;padding:28px 16px;background:var(--color-surface-hover);border:2px solid var(--color-border);border-radius:var(--radius-xl);cursor:pointer;transition:border-color var(--transition-normal),background var(--transition-normal),transform .15s var(--ease-out);text-align:center;font-family:inherit}.export-flow-target-btn:hover:not(:disabled){border-color:var(--color-primary);background:var(--color-primary-light);transform:translateY(-2px)}.export-flow-target-btn:disabled{opacity:.4;cursor:not-allowed}.export-flow-target-btn__icon{width:44px;height:44px;display:flex;align-items:center;justify-content:center;background:var(--color-primary);color:var(--color-text-inverse);border-radius:var(--radius-xl);transition:background var(--transition-fast)}.export-flow-target-btn:hover:not(:disabled) .export-flow-target-btn__icon{background:var(--color-primary-hover)}.export-flow-target-btn__label{font-family:var(--font-display);font-size:var(--text-base);font-weight:600;color:var(--color-text)}.export-flow-target-btn__path{font-size:var(--text-xs);font-family:var(--font-mono);color:var(--color-text-secondary)}.export-flow-error{display:flex;align-items:center;gap:8px;background:var(--color-error-light);color:var(--color-error-dark);padding:10px 14px;border-radius:var(--radius-lg);font-size:var(--text-sm);margin-bottom:16px}.export-flow-spinner{width:36px;height:36px;border:3px solid var(--color-border);border-top-color:var(--color-primary);border-radius:50%;animation:export-spin .7s linear infinite}@keyframes export-spin{to{transform:rotate(360deg)}}.export-flow-success-icon{display:flex;align-items:center;justify-content:center;width:48px;height:48px;background:var(--color-success-light);color:var(--color-success-dark);border-radius:50%;margin-bottom:16px}.export-flow-warnings{background:var(--color-warning-light);border:1px solid oklch(.8 .1 85);border-radius:var(--radius-lg);padding:12px 14px;margin-bottom:20px}.export-flow-warnings__label{font-size:var(--text-xs);font-weight:600;color:var(--color-warning-dark);margin:0 0 6px;text-transform:uppercase;letter-spacing:.05em}.export-flow-warnings__list{margin:0;padding-left:18px}.export-flow-warnings__list li{font-size:var(--text-sm);color:var(--color-warning-dark);margin-bottom:4px}.export-flow-warnings__list li:last-child{margin-bottom:0}.export-flow-preview-files{display:flex;flex-direction:column;gap:8px;margin-bottom:20px;max-height:300px;overflow-y:auto}.export-flow-preview-file{border:1px solid var(--color-border);border-radius:var(--radius-lg);overflow:hidden;transition:border-color var(--transition-fast)}.export-flow-preview-file:hover{border-color:var(--color-border-hover)}.export-flow-preview-file__path{display:flex;align-items:center;gap:6px;padding:8px 12px;font-size:var(--text-sm);font-family:var(--font-mono);color:var(--color-text-secondary);background:var(--color-surface-hover);cursor:pointer;-webkit-user-select:none;user-select:none;transition:background var(--transition-fast)}.export-flow-preview-file__path:hover{background:var(--color-surface-active)}.export-flow-preview-file__content{margin:0;padding:12px;font-family:var(--font-mono);font-size:var(--text-xs);line-height:1.5;color:var(--color-text);background:var(--color-surface-secondary);white-space:pre-wrap;word-break:break-word;border-top:1px solid var(--color-border);max-height:200px;overflow-y:auto}.export-flow-actions{display:flex;justify-content:flex-end;gap:10px;margin-top:4px}.export-flow-close-btn{display:flex;align-items:center;gap:6px;align-self:flex-end;padding:8px 20px;font-size:var(--text-sm);font-weight:600;font-family:var(--font-display);color:var(--color-text-inverse);background:var(--color-primary);border:none;border-radius:var(--radius-md);cursor:pointer;transition:background var(--transition-fast)}.export-flow-close-btn:hover{background:var(--color-primary-hover)}.export-flow-back-btn{padding:8px 20px;font-size:var(--text-sm);font-weight:500;color:var(--color-text-secondary);background:var(--color-surface-hover);border:1px solid var(--color-border);border-radius:var(--radius-md);cursor:pointer;transition:background var(--transition-fast),border-color var(--transition-fast)}.export-flow-back-btn:hover{background:var(--color-surface-active);border-color:var(--color-text-tertiary)}.export-flow-confirm-btn{display:flex;align-items:center;gap:6px;padding:8px 20px;font-size:var(--text-sm);font-weight:600;font-family:var(--font-display);color:var(--color-text-inverse);background:var(--color-primary);border:none;border-radius:var(--radius-md);cursor:pointer;transition:background var(--transition-fast)}.export-flow-confirm-btn:hover{background:var(--color-primary-hover)}.export-flow-danger-zone{margin-top:24px;padding-top:20px;border-top:1px solid var(--color-border);display:flex;flex-direction:column;gap:6px}.export-flow-danger-zone__label{font-size:var(--text-xs);font-weight:600;color:var(--color-error);text-transform:uppercase;letter-spacing:.05em;margin:0}.export-flow-danger-zone__desc{font-size:var(--text-sm);color:var(--color-text-tertiary);margin:0;line-height:1.4}.export-flow-delete-link{align-self:flex-start;background:none;border:none;padding:0;font-size:var(--text-sm);font-weight:500;color:var(--color-error);cursor:pointer;text-decoration:underline;text-underline-offset:2px;transition:opacity var(--transition-fast)}.export-flow-delete-link:hover{opacity:.7}.export-flow-target-btn--danger:hover:not(:disabled){border-color:var(--color-error);background:var(--color-error-light)}.export-flow-target-btn__icon--danger{background:var(--color-error)!important}.export-flow-target-btn--danger:hover:not(:disabled) .export-flow-target-btn__icon--danger{background:var(--color-error-dark, oklch(.4 .16 30))!important}.export-flow-success-icon--neutral{background:var(--color-surface-hover)!important;color:var(--color-text-secondary)!important}.export-flow-delete-list{background:var(--color-surface-hover);border:1px solid var(--color-border);border-radius:var(--radius-lg);padding:12px 14px;margin-bottom:16px}.export-flow-delete-list__label{font-size:var(--text-xs);font-weight:600;color:var(--color-text-secondary);margin:0 0 6px;text-transform:uppercase;letter-spacing:.05em}.export-flow-delete-list__items{margin:0;padding-left:18px}.export-flow-delete-list__items li{font-size:var(--text-sm);font-family:var(--font-mono);color:var(--color-text-secondary);margin-bottom:4px}.export-flow-delete-list__items li:last-child{margin-bottom:0}.help-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:#00000073;display:flex;align-items:center;justify-content:center;z-index:1000;padding:var(--space-xl);animation:help-fade-in .18s var(--ease-out) both}@keyframes help-fade-in{0%{opacity:0}to{opacity:1}}.help-modal{background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-2xl);box-shadow:var(--shadow-xl);width:100%;max-width:600px;max-height:80vh;display:flex;flex-direction:column;animation:help-slide-in .22s var(--ease-out-expo) both}@keyframes help-slide-in{0%{opacity:0;transform:translateY(12px) scale(.98)}to{opacity:1;transform:none}}.help-modal__header{display:flex;align-items:center;justify-content:space-between;padding:var(--space-xl) var(--space-xl) var(--space-md);flex-shrink:0;border-bottom:1px solid var(--color-border)}.help-modal__title{margin:0;font-size:var(--text-lg);font-family:var(--font-display);font-weight:700;letter-spacing:-.02em;color:var(--color-text)}.help-modal__close{display:flex;align-items:center;justify-content:center;width:28px;height:28px;background:transparent;border:1px solid transparent;border-radius:var(--radius-md);cursor:pointer;color:var(--color-text-tertiary);transition:background var(--transition-fast),color var(--transition-fast),border-color var(--transition-fast)}.help-modal__close:hover{background:var(--color-surface-hover);color:var(--color-text);border-color:var(--color-border)}.help-modal__body{overflow-y:auto;padding:var(--space-lg) var(--space-xl) var(--space-xl);display:flex;flex-direction:column;gap:0}.help-section{display:flex;gap:var(--space-md);padding:var(--space-lg) 0;border-bottom:1px solid var(--color-border)}.help-section:last-child{border-bottom:none;padding-bottom:0}.help-section__icon{flex-shrink:0;width:32px;height:32px;display:flex;align-items:center;justify-content:center;background:var(--color-primary-lighter);color:var(--color-primary);border-radius:var(--radius-md);margin-top:1px}.help-section__heading{margin:0 0 6px;font-size:var(--text-base);font-family:var(--font-display);font-weight:600;color:var(--color-text);letter-spacing:-.01em}.help-section__body{margin:0 0 6px;font-size:var(--text-sm);line-height:1.6;color:var(--color-text-secondary)}.help-section__body:last-child{margin-bottom:0}.help-section__body em{font-style:italic;color:var(--color-text)}.help-section__body strong{font-weight:600;color:var(--color-text)}.help-section__body code{font-family:var(--font-mono);font-size:.9em;background:var(--color-surface-hover);border:1px solid var(--color-border);border-radius:var(--radius-sm);padding:1px 5px;color:var(--color-text)}.help-section__list{margin:6px 0 0;padding-left:var(--space-lg);font-size:var(--text-sm);line-height:1.7;color:var(--color-text-secondary);display:flex;flex-direction:column;gap:2px}.help-section__list strong{font-weight:600;color:var(--color-text)}.app{height:100vh;display:flex;flex-direction:column;background:var(--color-surface);animation:app-fade-in .4s var(--ease-out-expo) both;position:relative}.app__home-help-btn{position:fixed;bottom:var(--space-xl);right:var(--space-xl);width:36px;height:36px;font-size:var(--text-md);font-weight:700;font-family:var(--font-display);color:var(--color-text-secondary);background:var(--color-surface);border:1px solid var(--color-border);border-radius:50%;cursor:pointer;box-shadow:var(--shadow-md);transition:background var(--transition-fast),color var(--transition-fast),border-color var(--transition-fast),box-shadow var(--transition-fast);display:flex;align-items:center;justify-content:center;line-height:1;z-index:50}.app__home-help-btn:hover{background:var(--color-primary-lighter);color:var(--color-primary);border-color:var(--color-primary-light);box-shadow:var(--shadow-lg)}.app--editor{flex-direction:column}.app__editor-body{display:flex;flex-direction:row;flex:1;min-height:0;position:relative}@keyframes app-fade-in{0%{opacity:0}to{opacity:1}}@keyframes slide-in-right{0%{opacity:0;transform:translate(12px)}to{opacity:1;transform:translate(0)}}@keyframes slide-in-left{0%{opacity:0;transform:translate(-12px)}to{opacity:1;transform:translate(0)}}@keyframes scale-in{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}@keyframes fade-in-up{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}@keyframes fade-out{0%{opacity:1}to{opacity:0}}::view-transition-old(node-panel),::view-transition-old(edge-panel){animation:.15s var(--ease-out-expo) both fade-out}::view-transition-new(node-panel),::view-transition-new(edge-panel){animation:.2s var(--ease-out-expo) .05s both fade-in}:root{--color-primary: oklch(.47 .2 255);--color-primary-hover: oklch(.4 .21 255);--color-primary-light: oklch(.92 .05 255);--color-primary-lighter: oklch(.96 .03 255);--color-primary-ring: oklch(.47 .2 255 / .25);--color-surface: oklch(1 0 0);--color-surface-hover: oklch(.975 .005 255);--color-surface-active: oklch(.96 .008 255);--color-surface-secondary: oklch(.972 .004 255);--color-border: oklch(.91 .006 255);--color-border-hover: oklch(.85 .008 255);--color-text: oklch(.15 .01 255);--color-text-secondary: oklch(.45 .02 255);--color-text-tertiary: oklch(.62 .015 255);--color-text-inverse: oklch(.98 0 0);--color-success: oklch(.65 .18 160);--color-success-light: oklch(.92 .06 160);--color-success-dark: oklch(.35 .12 160);--color-warning: oklch(.72 .16 85);--color-warning-light: oklch(.92 .08 85);--color-warning-dark: oklch(.45 .14 85);--color-error: oklch(.55 .2 30);--color-error-light: oklch(.92 .08 30);--color-error-dark: oklch(.4 .16 30);--font-sans: "Spline Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;--font-display: "Barlow", "Spline Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;--font-mono: "JetBrains Mono", "Menlo", "Monaco", "Consolas", monospace;--text-xs: .6875rem;--text-sm: .75rem;--text-base: .875rem;--text-md: 1rem;--text-lg: 1.125rem;--text-xl: 1.25rem;--text-2xl: 1.5rem;--text-3xl: 1.75rem;--radius-sm: 4px;--radius-md: 6px;--radius-lg: 8px;--radius-xl: 12px;--radius-2xl: 16px;--ease-out: cubic-bezier(.16, 1, .3, 1);--ease-in-out: cubic-bezier(.65, 0, .35, 1);--ease-out-expo: cubic-bezier(.19, 1, .22, 1);--shadow-sm: 0 1px 2px oklch(0 0 0 / .05);--shadow-md: 0 4px 12px oklch(0 0 0 / .08);--shadow-lg: 0 8px 30px oklch(0 0 0 / .12);--shadow-xl: 0 20px 60px oklch(0 0 0 / .15);--space-xs: 4px;--space-sm: 8px;--space-md: 12px;--space-lg: 16px;--space-xl: 24px;--space-2xl: 32px;--space-3xl: 48px;--space-4xl: 64px;--transition-fast: .15s var(--ease-out);--transition-normal: .25s var(--ease-out);--transition-slow: .4s var(--ease-out-expo)}*,*:before,*:after{box-sizing:border-box}html{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility}body{margin:0;font-family:var(--font-sans);font-size:var(--text-base);line-height:1.5;color:var(--color-text);background:var(--color-surface)}h1,h2,h3,h4,h5,h6{font-family:var(--font-display);font-weight:600;line-height:1.25}input,textarea,select,button{font-family:inherit}a{color:var(--color-primary);text-decoration:none}a:hover{text-decoration:underline}::selection{background:var(--color-primary-light);color:var(--color-primary-hover)}:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}@media (prefers-reduced-motion: reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important;scroll-behavior:auto!important}}