@m0xoo/openboard 1.0.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.
Files changed (26) hide show
  1. package/README.md +99 -0
  2. package/bin/openboard.js +93 -0
  3. package/package.json +33 -0
  4. package/packages/client/dist/assets/index-CAahrBYB.css +1 -0
  5. package/packages/client/dist/assets/index-CvvU24UX.js +145 -0
  6. package/packages/client/dist/index.html +15 -0
  7. package/packages/server/dist/agents/agent-queue.js +175 -0
  8. package/packages/server/dist/agents/agent-runner.js +18 -0
  9. package/packages/server/dist/agents/agent.interface.js +1 -0
  10. package/packages/server/dist/agents/codereview.agent.js +132 -0
  11. package/packages/server/dist/agents/dummy.agent.js +49 -0
  12. package/packages/server/dist/agents/opencode.agent.js +214 -0
  13. package/packages/server/dist/agents/opencode.events.js +398 -0
  14. package/packages/server/dist/db/database.js +159 -0
  15. package/packages/server/dist/index.js +66 -0
  16. package/packages/server/dist/repositories/board.repository.js +56 -0
  17. package/packages/server/dist/repositories/column-config.repository.js +30 -0
  18. package/packages/server/dist/repositories/column.repository.js +36 -0
  19. package/packages/server/dist/repositories/comment.repository.js +35 -0
  20. package/packages/server/dist/repositories/ticket.repository.js +158 -0
  21. package/packages/server/dist/routes/boards.router.js +33 -0
  22. package/packages/server/dist/routes/column-config.router.js +42 -0
  23. package/packages/server/dist/routes/columns.router.js +45 -0
  24. package/packages/server/dist/routes/tickets.router.js +88 -0
  25. package/packages/server/dist/sse.js +43 -0
  26. package/packages/server/dist/types.js +2 -0
package/README.md ADDED
@@ -0,0 +1,99 @@
1
+ # Openboard: The AI Agent Orchestration Board
2
+
3
+ ![Openboard Screenshot](./screenshot.png)
4
+
5
+ Openboard is not just another Kanban board—it is an orchestration platform specifically designed to **manage, monitor, and collaborate with autonomous AI coding agents**. While it features a real-time Kanban interface built with React and Node.js, our primary focus is on providing a seamless environment for agents to pick up tasks, execute them in isolation, and submit their work.
6
+
7
+ ## Why Openboard? Managing Coding Agents
8
+
9
+ We use a Kanban board as the central nervous system for AI agents for several key reasons:
10
+
11
+ - **Visibility and Tracking**: A board provides a clear, visual representation of what each agent is currently working on, what tasks are queued, and what has been completed.
12
+ - **Task Decomposition**: Complex software engineering tasks can be broken down into smaller, manageable tickets, allowing multiple agents to work in parallel on different components.
13
+ - **State Management**: The board acts as a centralized state machine for the agents' progress. If an agent encounters an error or requires human approval, the ticket status reflects this immediately.
14
+ - **Prioritization**: Easily reorder tickets in the backlog to direct the agents' focus to the most critical tasks first.
15
+ - **Seamless Collaboration**: Facilitates handoffs between specialized agents (e.g., an architecture agent breaking down a task into tickets, which are then picked up by implementation agents).
16
+
17
+ ## How Agents Work: Git Worktrees & GitHub CLI
18
+
19
+ To allow multiple agents to work in parallel without tripping over each other, Openboard leverages **Git Worktrees** and the **GitHub CLI (`gh`)**.
20
+
21
+ - **Git Worktrees**: When an agent picks up a ticket, it doesn't just check out a branch in your main project folder. Instead, it creates an isolated feature branch and a dedicated git worktree for it. This provides the agent with its own physical directory and working tree to modify files, run tests, and commit changes comfortably, all while ensuring your main workspace remains untouched.
22
+ - **PR Generation (`gh`)**: Once the agent finishes its implementation, it uses the GitHub CLI to automatically push its branch and open a Pull Request for human review, progressing the ticket to a "Needs Approval" state on the board.
23
+
24
+ ## Tech Stack
25
+
26
+ ### Frontend (`packages/client`)
27
+ - **Framework:** React with Vite
28
+ - **Language:** TypeScript
29
+ - **Styling:** CSS Modules, Global CSS variables
30
+ - **Routing:** React Router DOM
31
+ - **Interactions:** `@dnd-kit` for drag-and-drop
32
+ - **Icons:** Lucide React
33
+
34
+ ### Backend (`packages/server`)
35
+ - **Runtime:** Node.js
36
+ - **Framework:** Express
37
+ - **Language:** TypeScript
38
+ - **Database:** SQLite (via `sql.js`)
39
+ - **Real-time:** Server-Sent Events (SSE)
40
+
41
+ ## Prerequisites
42
+
43
+ Before running Openboard, ensure you have the following installed on your system:
44
+
45
+ - **[Node.js](https://nodejs.org/)** (v18 or newer recommended) & npm
46
+ - **[Git](https://git-scm.com/)**: Required for agents to manage versions and worktrees. Ensure `git` is available in your PATH.
47
+ - **[GitHub CLI (`gh`)](https://cli.github.com/)**: Required for agents to authenticate and create Pull Requests. Ensure `gh` is available in your PATH and you are authenticated by running `gh auth login` before starting the agents.
48
+
49
+ ## Getting Started
50
+
51
+ 1. **Install dependencies**
52
+
53
+ Run this command in the root directory. This will install dependencies for both the client and server workspaces:
54
+ ```bash
55
+ npm install
56
+ ```
57
+
58
+ 2. **Environment Variables**
59
+
60
+ Navigate to the `packages/client` directory and copy the example environment file:
61
+ ```bash
62
+ cp packages/client/.env.example packages/client/.env
63
+ ```
64
+
65
+ 3. **Start the development servers**
66
+
67
+ Start both the frontend and backend simultaneously using concurrently:
68
+ ```bash
69
+ npm run dev
70
+ ```
71
+
72
+ - The **client** will be available at: [http://localhost:5173](http://localhost:5173)
73
+ - The **server** will run on: [http://localhost:3001](http://localhost:3001)
74
+
75
+ 4. **Build and Run for Production**
76
+
77
+ To build both the client and server for a production environment:
78
+ ```bash
79
+ npm run build
80
+ ```
81
+ To start the production servers simultaneously:
82
+ ```bash
83
+ npm run start
84
+ ```
85
+ Or use `npm run prod` to build and start in one command.
86
+
87
+ ## Project Structure
88
+
89
+ ```text
90
+ openboard/
91
+ ├── package.json # Root workspace configuration
92
+ ├── packages/
93
+ │ ├── client/ # React frontend application
94
+ │ │ ├── src/ # Components, Context, Styles
95
+ │ │ └── package.json
96
+ │ └── server/ # Express backend application
97
+ │ ├── src/ # Routes, Database logic, SSE, Agent logic
98
+ │ └── package.json
99
+ ```
@@ -0,0 +1,93 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { execSync, spawn } from 'child_process';
4
+ import path from 'path';
5
+ import { fileURLToPath } from 'url';
6
+
7
+ function checkDependencies() {
8
+ const deps = ['git', 'gh', 'opencode'];
9
+ for (const dep of deps) {
10
+ try {
11
+ execSync(`${dep} --version`, { stdio: 'ignore' });
12
+ } catch (err) {
13
+ console.error(`Error: Required dependency '${dep}' is not installed or not in PATH.`);
14
+ process.exit(1);
15
+ }
16
+ }
17
+ }
18
+
19
+ function startOpencode() {
20
+ console.log('[openboard] Starting opencode serve...');
21
+
22
+ // We run it detached if want, or just spawn it
23
+ const child = spawn('opencode', ['serve'], { stdio: ['ignore', 'pipe', 'pipe'] });
24
+
25
+ return new Promise((resolve, reject) => {
26
+ let output = '';
27
+ let portFound = false;
28
+
29
+ child.stdout.on('data', (data) => {
30
+ const str = data.toString();
31
+ output += str;
32
+ // opencode logs its url, e.g., "Server running at http://127.0.0.1:4096"
33
+ // Let's print opencode output for now so user can see it
34
+ process.stdout.write(`[opencode] ${str}`);
35
+
36
+ if (!portFound) {
37
+ const match = output.match(/http:\/\/.*:(\d+)/);
38
+ if (match) {
39
+ portFound = true;
40
+ process.env.OPENCODE_PORT = match[1];
41
+ console.log(`[openboard] opencode running on port ${match[1]}`);
42
+ resolve(child);
43
+ }
44
+ }
45
+ });
46
+
47
+ child.stderr.on('data', (data) => {
48
+ process.stderr.write(`[opencode ERR] ${data}`);
49
+ });
50
+
51
+ child.on('error', (err) => {
52
+ console.error('[openboard] Failed to start opencode', err);
53
+ reject(err);
54
+ });
55
+
56
+ child.on('exit', (code) => {
57
+ if (!portFound) {
58
+ reject(new Error(`opencode exited with code ${code} before printing port.`));
59
+ }
60
+ });
61
+ });
62
+ }
63
+
64
+ async function main() {
65
+ checkDependencies();
66
+ const opencodeProcess = await startOpencode();
67
+
68
+ console.log('[openboard] Starting openboard server...');
69
+ const __filename = fileURLToPath(import.meta.url);
70
+ const __dirname = path.dirname(__filename);
71
+
72
+ process.env.NODE_ENV = 'production';
73
+ process.env.PORT = process.env.PORT || '3001';
74
+
75
+ // Import the compiled server index file
76
+ try {
77
+ await import(path.join(__dirname, '../packages/server/dist/index.js'));
78
+ } catch (e) {
79
+ console.error('[openboard] Error starting server. Did you run `npm run build`? Full Error:', e);
80
+ if (opencodeProcess) opencodeProcess.kill();
81
+ process.exit(1);
82
+ }
83
+
84
+ process.on('SIGINT', () => {
85
+ if (opencodeProcess) opencodeProcess.kill();
86
+ process.exit(0);
87
+ });
88
+ }
89
+
90
+ main().catch(err => {
91
+ console.error(err);
92
+ process.exit(1);
93
+ });
package/package.json ADDED
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "@m0xoo/openboard",
3
+ "version": "1.0.0",
4
+ "type": "module",
5
+ "bin": {
6
+ "openboard": "./bin/openboard.js"
7
+ },
8
+ "files": [
9
+ "bin",
10
+ "packages/server/dist",
11
+ "packages/client/dist"
12
+ ],
13
+ "workspaces": [
14
+ "packages/server",
15
+ "packages/client"
16
+ ],
17
+ "scripts": {
18
+ "dev": "concurrently --names \"server,client\" --prefix-colors \"cyan,magenta\" \"npm run dev --workspace=packages/server\" \"npm run dev --workspace=packages/client\"",
19
+ "build": "npm run build --workspaces",
20
+ "start": "concurrently --names \"server,client\" --prefix-colors \"cyan,magenta\" \"npm run start --workspace=packages/server\" \"npm run preview --workspace=packages/client\"",
21
+ "prod": "npm run build && npm run start",
22
+ "install:all": "npm install"
23
+ },
24
+ "devDependencies": {
25
+ "concurrently": "^8.2.2"
26
+ },
27
+ "dependencies": {
28
+ "@opencode-ai/sdk": "^1.2.24",
29
+ "cors": "^2.8.5",
30
+ "express": "^4.18.3",
31
+ "sql.js": "^1.12.0"
32
+ }
33
+ }
@@ -0,0 +1 @@
1
+ @import"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap";:root,[data-theme=dark]{--color-bg: #0a0a0a;--color-surface: #111111;--color-surface-2: #1a1a1a;--color-surface-3: #222222;--color-border: rgba(255, 255, 255, .08);--color-border-hover: rgba(255, 255, 255, .16);--color-text-primary: #ededed;--color-text-secondary: #a1a1aa;--color-text-muted: #52525b;--color-text-on-accent: #ffffff;--color-accent: #5e6ad2;--color-accent-hover: #6b7ae2;--color-accent-subtle: rgba(94, 106, 210, .15);--color-priority-low: #3b82f6;--color-priority-medium: #f59e0b;--color-priority-high: #f97316;--color-priority-urgent: #ef4444;--color-success: #22c55e;--color-error: #ef4444;--shadow-sm: 0 1px 2px rgba(0, 0, 0, .5);--shadow-md: 0 4px 12px rgba(0, 0, 0, .6);--shadow-lg: 0 8px 32px rgba(0, 0, 0, .7);--scrollbar-thumb: rgba(255, 255, 255, .1);--scrollbar-track: transparent}[data-theme=light]{--color-bg: #f4f4f5;--color-surface: #ffffff;--color-surface-2: #f4f4f5;--color-surface-3: #e4e4e7;--color-border: rgba(0, 0, 0, .08);--color-border-hover: rgba(0, 0, 0, .16);--color-text-primary: #09090b;--color-text-secondary: #52525b;--color-text-muted: #a1a1aa;--color-text-on-accent: #ffffff;--color-accent: #5e6ad2;--color-accent-hover: #4f59c2;--color-accent-subtle: rgba(94, 106, 210, .1);--color-priority-low: #2563eb;--color-priority-medium: #d97706;--color-priority-high: #ea580c;--color-priority-urgent: #dc2626;--color-success: #16a34a;--color-error: #dc2626;--shadow-sm: 0 1px 2px rgba(0, 0, 0, .06);--shadow-md: 0 4px 12px rgba(0, 0, 0, .08);--shadow-lg: 0 8px 32px rgba(0, 0, 0, .12);--scrollbar-thumb: rgba(0, 0, 0, .12);--scrollbar-track: transparent}:root{--space-1: 4px;--space-2: 8px;--space-3: 12px;--space-4: 16px;--space-5: 20px;--space-6: 24px;--space-8: 32px;--space-10: 40px;--space-12: 48px;--radius-sm: 4px;--radius-md: 6px;--radius-lg: 10px;--radius-xl: 16px;--radius-full: 9999px;--font-sans: "Inter", system-ui, -apple-system, sans-serif;--font-mono: "Fira Code", "Cascadia Code", monospace;--text-xs: 11px;--text-sm: 13px;--text-base: 14px;--text-md: 15px;--text-lg: 17px;--text-xl: 20px;--text-2xl: 24px;--line-height-tight: 1.25;--line-height-normal: 1.5;--transition-fast: 80ms ease;--transition-normal: .15s ease;--transition-slow: .25s ease;--sidebar-width: 220px;--topbar-height: 48px;--column-width: 280px}*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}html{font-size:16px;-webkit-text-size-adjust:100%}body{font-family:var(--font-sans);font-size:var(--text-base);line-height:var(--line-height-normal);background-color:var(--color-bg);color:var(--color-text-primary);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;overflow:hidden}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:var(--scrollbar-track)}::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb);border-radius:var(--radius-full)}::-webkit-scrollbar-thumb:hover{background:var(--color-border-hover)}.text-primary{color:var(--color-text-primary)}.text-secondary{color:var(--color-text-secondary)}.text-muted{color:var(--color-text-muted)}.text-xs{font-size:var(--text-xs)}.text-sm{font-size:var(--text-sm)}.text-base{font-size:var(--text-base)}.text-md{font-size:var(--text-md)}.text-lg{font-size:var(--text-lg)}.font-medium{font-weight:500}.font-semibold{font-weight:600}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.flex{display:flex}.flex-col{flex-direction:column}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-1{gap:var(--space-1)}.gap-2{gap:var(--space-2)}.gap-3{gap:var(--space-3)}.gap-4{gap:var(--space-4)}.flex-1{flex:1}.min-w-0{min-width:0}.overflow-hidden{overflow:hidden}.overflow-auto{overflow:auto}.w-full{width:100%}.h-full{height:100%}button{font-family:inherit;cursor:pointer;border:none;background:none;outline:none;transition:background var(--transition-normal),color var(--transition-normal),opacity var(--transition-fast)}button:disabled{opacity:.4;cursor:not-allowed}input,textarea{font-family:inherit;color:inherit;background:none;border:none;outline:none}a{color:inherit;text-decoration:none}:focus-visible{outline:2px solid var(--color-accent);outline-offset:2px;border-radius:var(--radius-sm)}._sidebar_1y03c_1{width:var(--sidebar-width);height:100vh;background:var(--color-surface);border-right:1px solid var(--color-border);display:flex;flex-direction:column;flex-shrink:0;overflow:hidden}._header_1y03c_23{height:var(--topbar-height);display:flex;align-items:center;padding:0 var(--space-4);border-bottom:1px solid var(--color-border)}._logo_1y03c_39{display:flex;align-items:center;gap:var(--space-2);font-size:var(--text-sm);font-weight:600;color:var(--color-text-primary);letter-spacing:-.01em}._logo_1y03c_39 svg{color:var(--color-accent)}._section_1y03c_67{display:flex;align-items:center;justify-content:space-between;padding:var(--space-4) var(--space-4) var(--space-2)}._sectionLabel_1y03c_81{font-size:var(--text-xs);font-weight:500;color:var(--color-text-muted);text-transform:uppercase;letter-spacing:.06em}._newBtn_1y03c_97{width:20px;height:20px;border-radius:var(--radius-sm);display:flex;align-items:center;justify-content:center;color:var(--color-text-muted);transition:background var(--transition-normal),color var(--transition-normal)}._newBtn_1y03c_97:hover{background:var(--color-surface-2);color:var(--color-text-primary)}._nav_1y03c_129{flex:1;overflow-y:auto;padding:var(--space-1) var(--space-2)}._boardItem_1y03c_141{position:relative;border-radius:var(--radius-md);margin-bottom:1px}._boardBtn_1y03c_153{width:100%;display:flex;align-items:center;gap:var(--space-2);padding:var(--space-2) var(--space-3);border-radius:var(--radius-md);font-size:var(--text-sm);color:var(--color-text-secondary);text-align:left;transition:background var(--transition-normal),color var(--transition-normal)}._boardBtn_1y03c_153:hover{background:var(--color-surface-2);color:var(--color-text-primary)}._boardItem_1y03c_141._active_1y03c_189 ._boardBtn_1y03c_153{background:var(--color-accent-subtle);color:var(--color-text-primary)}._boardDot_1y03c_199{width:6px;height:6px;border-radius:50%;background:var(--color-text-muted);flex-shrink:0;transition:background var(--transition-normal)}._boardItem_1y03c_141._active_1y03c_189 ._boardDot_1y03c_199{background:var(--color-accent)}._actions_1y03c_225{position:absolute;right:var(--space-2);top:50%;transform:translateY(-50%);display:flex;gap:2px}._action_1y03c_225{width:22px;height:22px;display:flex;align-items:center;justify-content:center;border-radius:var(--radius-sm);color:var(--color-text-muted);transition:background var(--transition-fast),color var(--transition-fast)}._action_1y03c_225:hover{background:var(--color-surface-3);color:var(--color-text-primary)}._inlineEdit_1y03c_275{width:100%;padding:var(--space-2) var(--space-3);font-size:var(--text-sm);color:var(--color-text-primary);background:var(--color-surface-2);border-radius:var(--radius-md);border:1px solid var(--color-accent)}._overlay_1kuf8_1{position:fixed;top:0;right:0;bottom:0;left:0;background:#0009;display:flex;align-items:center;justify-content:center;z-index:100;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);animation:_fadeIn_1kuf8_1 .15s ease}@keyframes _fadeIn_1kuf8_1{0%{opacity:0}to{opacity:1}}._dialog_1kuf8_45{background:var(--color-surface-2);border:1px solid var(--color-border);border-radius:var(--radius-lg);padding:var(--space-6);max-width:340px;width:90%;box-shadow:var(--shadow-lg);animation:_slideIn_1kuf8_1 .15s ease}@keyframes _slideIn_1kuf8_1{0%{transform:translateY(-8px);opacity:0}to{transform:translateY(0);opacity:1}}._message_1kuf8_91{font-size:var(--text-sm);color:var(--color-text-secondary);line-height:var(--line-height-normal);margin-bottom:var(--space-6)}._actions_1kuf8_105{display:flex;justify-content:flex-end;gap:var(--space-2)}._cancel_1kuf8_117{padding:var(--space-2) var(--space-4);border-radius:var(--radius-md);font-size:var(--text-sm);font-weight:500;color:var(--color-text-secondary);border:1px solid var(--color-border);background:transparent;transition:background var(--transition-normal),color var(--transition-normal)}._cancel_1kuf8_117:hover{background:var(--color-surface-3);color:var(--color-text-primary)}._confirm_1kuf8_149{padding:var(--space-2) var(--space-4);border-radius:var(--radius-md);font-size:var(--text-sm);font-weight:500;color:#fff;background:var(--color-error);transition:opacity var(--transition-fast)}._confirm_1kuf8_149:hover{opacity:.85}._overlay_e33j2_1{position:fixed;top:0;right:0;bottom:0;left:0;background:#000000a6;display:flex;align-items:flex-start;justify-content:center;padding-top:80px;z-index:100;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);animation:_fadeIn_e33j2_1 .15s ease}@keyframes _fadeIn_e33j2_1{0%{opacity:0}to{opacity:1}}._modal_e33j2_47{background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-xl);width:600px;max-width:calc(100vw - 32px);max-height:calc(100vh - 120px);overflow-y:auto;box-shadow:var(--shadow-lg);animation:_slideIn_e33j2_1 .15s cubic-bezier(.16,1,.3,1);display:flex;flex-direction:column}@keyframes _slideIn_e33j2_1{0%{transform:translateY(-16px);opacity:0}to{transform:translateY(0);opacity:1}}._header_e33j2_99{display:flex;align-items:center;justify-content:space-between;padding:var(--space-6) var(--space-8);border-bottom:1px solid var(--color-border)}._header_e33j2_99 h2{margin:0;font-size:var(--text-lg);font-weight:600;color:var(--color-text-primary)}._closeBtn_e33j2_129{width:28px;height:28px;display:flex;align-items:center;justify-content:center;border-radius:var(--radius-md);color:var(--color-text-muted);background:transparent;border:none;cursor:pointer;transition:background var(--transition-fast),color var(--transition-fast)}._closeBtn_e33j2_129:hover{background:var(--color-surface-2);color:var(--color-text-primary)}._content_e33j2_167{padding:var(--space-8);display:flex;flex-direction:column;gap:var(--space-6)}._field_e33j2_181{display:flex;flex-direction:column;gap:var(--space-2)}._field_e33j2_181 label{font-size:var(--text-xs);font-weight:500;color:var(--color-text-muted);text-transform:uppercase;letter-spacing:.06em}._input_e33j2_209{width:100%;padding:var(--space-3) var(--space-4);background:var(--color-surface-2);border:1px solid var(--color-border);border-radius:var(--radius-md);font-size:var(--text-sm);color:var(--color-text-primary);transition:border-color var(--transition-fast)}._input_e33j2_209:focus{outline:none;border-color:var(--color-accent)}._workspacesSection_e33j2_241{display:flex;flex-direction:column;gap:var(--space-4)}._sectionHeader_e33j2_253{display:flex;justify-content:space-between;align-items:center}._sectionHeader_e33j2_253 h3{margin:0;font-size:var(--text-xs);font-weight:500;color:var(--color-text-muted);text-transform:uppercase;letter-spacing:.06em}._addBtn_e33j2_283{display:flex;align-items:center;gap:var(--space-1);font-size:var(--text-xs);font-weight:500;color:var(--color-accent);background:transparent;border:none;cursor:pointer;padding:var(--space-1) var(--space-2);border-radius:var(--radius-sm);transition:background var(--transition-fast)}._addBtn_e33j2_283:hover{background:color-mix(in srgb,var(--color-accent) 10%,transparent)}._workspaceList_e33j2_321{display:flex;flex-direction:column;gap:var(--space-3)}._workspaceRow_e33j2_333{display:flex;gap:var(--space-2);align-items:center}._select_e33j2_345{padding:var(--space-2) var(--space-3);background:var(--color-surface-2);border:1px solid var(--color-border);border-radius:var(--radius-md);font-size:var(--text-xs);color:var(--color-text-primary);cursor:pointer}._pathInputWrapper_e33j2_365{flex:1;display:flex;align-items:center;gap:var(--space-2);padding:0 var(--space-3);background:var(--color-surface-2);border:1px solid var(--color-border);border-radius:var(--radius-md);transition:border-color var(--transition-fast)}._pathInputWrapper_e33j2_365:focus-within{border-color:var(--color-accent)}._pathInputWrapper_e33j2_365 svg{color:var(--color-text-muted)}._pathInput_e33j2_365{flex:1;padding:var(--space-2) 0;background:transparent;border:none;font-size:var(--text-sm);color:var(--color-text-primary)}._pathInput_e33j2_365:focus{outline:none}._removeBtn_e33j2_431{width:28px;height:28px;display:flex;align-items:center;justify-content:center;border-radius:var(--radius-md);color:var(--color-text-muted);background:transparent;border:none;cursor:pointer;transition:background var(--transition-fast),color var(--transition-fast)}._removeBtn_e33j2_431:hover{background:color-mix(in srgb,var(--color-error) 12%,transparent);color:var(--color-error)}._footer_e33j2_469{display:flex;align-items:center;justify-content:flex-end;gap:var(--space-2);padding:var(--space-6) var(--space-8);border-top:1px solid var(--color-border)}._cancelBtn_e33j2_487{padding:var(--space-2) var(--space-4);border-radius:var(--radius-md);font-size:var(--text-sm);font-weight:500;color:var(--color-text-secondary);border:1px solid var(--color-border);background:transparent;cursor:pointer;transition:background var(--transition-normal)}._cancelBtn_e33j2_487:hover{background:var(--color-surface-2)}._saveBtn_e33j2_519{padding:var(--space-2) var(--space-4);border-radius:var(--radius-md);font-size:var(--text-sm);font-weight:500;color:var(--color-text-on-accent);background:var(--color-accent);border:none;cursor:pointer;transition:opacity var(--transition-fast)}._saveBtn_e33j2_519:hover:not(:disabled){opacity:.85}._saveBtn_e33j2_519:disabled{opacity:.4;cursor:not-allowed}._badge_1qhnp_1{display:inline-flex;align-items:center;border-radius:var(--radius-full);font-weight:500;background:color-mix(in srgb,var(--priority-color) 15%,transparent);color:var(--priority-color);white-space:nowrap}._sm_1qhnp_21{font-size:var(--text-xs);padding:2px 7px}._md_1qhnp_31{font-size:var(--text-sm);padding:var(--space-1) var(--space-3)}._card_9xxmw_1{background:var(--color-surface-2);border:1px solid var(--color-border);border-radius:var(--radius-md);padding:var(--space-3);cursor:pointer;transition:background var(--transition-fast),border-color var(--transition-fast),box-shadow var(--transition-fast),transform var(--transition-fast);-webkit-user-select:none;user-select:none}._card_9xxmw_1:hover{background:var(--color-surface-3);border-color:var(--color-border-hover);box-shadow:var(--shadow-sm)}._card_9xxmw_1._dragging_9xxmw_35{box-shadow:var(--shadow-md);cursor:grabbing}._needsApprovalCard_9xxmw_45{border-color:#f59e0b99!important;background:linear-gradient(to bottom right,rgba(245,158,11,.05),var(--color-surface-2))!important;animation:_pulseBorder_9xxmw_1 2s infinite ease-in-out}._needsApprovalCard_9xxmw_45:hover{border-color:#f59e0b!important;background:linear-gradient(to bottom right,rgba(245,158,11,.08),var(--color-surface-3))!important}@keyframes _pulseBorder_9xxmw_1{0%{box-shadow:0 0 #f59e0b66}70%{box-shadow:0 0 0 6px #f59e0b00}to{box-shadow:0 0 #f59e0b00}}._title_9xxmw_95{font-size:var(--text-sm);font-weight:500;color:var(--color-text-primary);line-height:var(--line-height-tight);margin-bottom:var(--space-1)}._description_9xxmw_111{font-size:var(--text-xs);color:var(--color-text-muted);line-height:var(--line-height-normal);margin-bottom:var(--space-2);display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}._footer_9xxmw_135{display:flex;align-items:center;justify-content:space-between;margin-top:var(--space-2)}._left_9xxmw_149{display:flex;align-items:center;gap:var(--space-2)}._inspectBtn_9xxmw_161{display:inline-flex;align-items:center;gap:var(--space-1);font-size:var(--text-xs);font-weight:500;padding:var(--space-1) var(--space-2);border-radius:var(--radius-sm);text-decoration:none;transition:background var(--transition-fast),color var(--transition-fast)}._processingBtn_9xxmw_185{color:var(--color-accent);background:rgba(var(--color-accent-rgb),.1)}._processingBtn_9xxmw_185:hover{background:rgba(var(--color-accent-rgb),.2)}._doneBtn_9xxmw_203{color:#10b981;background:#10b9811a}._doneBtn_9xxmw_203:hover{background:#10b98133}._blockedBtn_9xxmw_221{color:#ef4444;background:#ef44441a}._blockedBtn_9xxmw_221:hover{background:#ef444433}._needsApprovalBtn_9xxmw_239{color:#f59e0b;background:#f59e0b1a}._needsApprovalBtn_9xxmw_239:hover{background:#f59e0b33}._processingIcon_9xxmw_257{animation:_pulse_9xxmw_1 2s infinite ease-in-out}@keyframes _pulse_9xxmw_1{0%{opacity:.4}50%{opacity:1}to{opacity:.4}}._overlay_1ypt0_1{position:fixed;top:0;right:0;bottom:0;left:0;background:#000000a6;display:flex;align-items:flex-start;justify-content:center;padding-top:80px;z-index:50;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);animation:_fadeIn_1ypt0_1 .15s ease}@keyframes _fadeIn_1ypt0_1{0%{opacity:0}to{opacity:1}}._modal_1ypt0_47{background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-xl);width:600px;max-width:calc(100vw - 32px);max-height:calc(100vh - 120px);display:flex;flex-direction:column;overflow:hidden;box-shadow:var(--shadow-lg);animation:_slideIn_1ypt0_1 .15s cubic-bezier(.16,1,.3,1)}._content_1ypt0_75{overflow-y:auto;flex:1}@keyframes _slideIn_1ypt0_1{0%{transform:translateY(-16px);opacity:0}to{transform:translateY(0);opacity:1}}._header_1ypt0_109{display:flex;align-items:center;justify-content:space-between;padding:var(--space-6) var(--space-8);border-bottom:1px solid var(--color-border);flex-shrink:0}._meta_1ypt0_127{display:flex;align-items:center;gap:var(--space-2)}._statusBadge_1ypt0_151{display:flex;align-items:center;gap:4px;font-size:var(--text-xs);font-weight:500;padding:2px 8px;border-radius:var(--radius-full);text-decoration:none;transition:background var(--transition-fast),color var(--transition-fast)}._statusBadge_1ypt0_151._processing_1ypt0_175{color:var(--color-accent);background:rgba(var(--color-accent-rgb),.1)}._statusBadge_1ypt0_151._processing_1ypt0_175:hover{background:rgba(var(--color-accent-rgb),.2)}._statusBadge_1ypt0_151._done_1ypt0_193{color:#10b981;background:#10b9811a}._statusBadge_1ypt0_151._done_1ypt0_193:hover{background:#10b98133}._statusBadge_1ypt0_151._blocked_1ypt0_211{color:#ef4444;background:#ef44441a}._statusBadge_1ypt0_151._blocked_1ypt0_211:hover{background:#ef444433}._statusBadge_1ypt0_151._needsApproval_1ypt0_229{color:#f59e0b;background:#f59e0b1a}._statusBadge_1ypt0_151._needsApproval_1ypt0_229:hover{background:#f59e0b33}._columnTag_1ypt0_247{font-size:var(--text-xs);color:var(--color-text-muted);font-weight:500;background:var(--color-surface-2);border:1px solid var(--color-border);border-radius:var(--radius-full);padding:2px 8px}._closeBtn_1ypt0_267{width:28px;height:28px;display:flex;align-items:center;justify-content:center;border-radius:var(--radius-md);color:var(--color-text-muted);transition:background var(--transition-fast),color var(--transition-fast)}._closeBtn_1ypt0_267:hover{background:var(--color-surface-2);color:var(--color-text-primary)}._headerRight_1ypt0_299{display:flex;align-items:center;gap:var(--space-3)}._sessionBtn_1ypt0_311{display:inline-flex;align-items:center;gap:var(--space-1);font-size:var(--text-xs);font-weight:500;color:var(--color-text-secondary);background:var(--color-surface-2);border:1px solid var(--color-border);padding:var(--space-1) var(--space-3);border-radius:var(--radius-md);text-decoration:none;transition:all var(--transition-fast)}._sessionBtn_1ypt0_311:hover{background:var(--color-surface-3);color:var(--color-text-primary);border-color:var(--color-border-hover)}._body_1ypt0_353{padding:var(--space-8);display:flex;flex-direction:column}._titleInput_1ypt0_365{width:100%;padding:var(--space-2) var(--space-4) 2px;font-size:var(--text-xl);font-weight:600;color:var(--color-text-primary);line-height:var(--line-height-tight);background:transparent;border:none;resize:none;display:block;border-radius:var(--radius-md);transition:background var(--transition-fast)}._titleInput_1ypt0_365:focus{background:var(--color-surface-2);outline:none}._titleInput_1ypt0_365::placeholder{color:var(--color-text-muted)}._descInput_1ypt0_413{width:100%;padding:var(--space-2) var(--space-4) var(--space-3);margin-top:var(--space-1);font-size:var(--text-sm);color:var(--color-text-secondary);line-height:var(--line-height-normal);background:transparent;resize:vertical;border:none;display:block;border-radius:var(--radius-md);transition:background var(--transition-fast)}._descInput_1ypt0_413:focus{background:var(--color-surface-2);outline:none}._descInput_1ypt0_413::placeholder{color:var(--color-text-muted)}._section_1ypt0_461{padding:var(--space-6) var(--space-8);border-top:1px solid var(--color-border)}._sectionLabel_1ypt0_471{font-size:var(--text-xs);font-weight:500;color:var(--color-text-muted);text-transform:uppercase;letter-spacing:.06em;margin-bottom:var(--space-2);display:block}._priorities_1ypt0_491{display:flex;gap:var(--space-2);flex-wrap:wrap}._priorityBtn_1ypt0_503{padding:var(--space-1) var(--space-3);border-radius:var(--radius-full);font-size:var(--text-xs);font-weight:500;color:var(--color-text-secondary);border:1px solid var(--color-border);transition:all var(--transition-fast)}._priorityBtn_1ypt0_503:hover{border-color:var(--priority-color);color:var(--priority-color)}._priorityBtn_1ypt0_503._selected_1ypt0_533{background:color-mix(in srgb,var(--priority-color) 15%,transparent);border-color:var(--priority-color);color:var(--priority-color)}._footer_1ypt0_545{display:flex;align-items:center;justify-content:space-between;padding:var(--space-6) var(--space-8);border-top:1px solid var(--color-border);flex-shrink:0}._footerActions_1ypt0_563{display:flex;gap:var(--space-2)}._deleteBtn_1ypt0_573{display:flex;align-items:center;gap:var(--space-1);font-size:var(--text-sm);color:var(--color-text-muted);padding:var(--space-2) var(--space-3);border-radius:var(--radius-md);transition:background var(--transition-fast),color var(--transition-fast)}._deleteBtn_1ypt0_573:hover{background:color-mix(in srgb,var(--color-error) 12%,transparent);color:var(--color-error)}._cancelBtn_1ypt0_605{padding:var(--space-2) var(--space-4);border-radius:var(--radius-md);font-size:var(--text-sm);font-weight:500;color:var(--color-text-secondary);border:1px solid var(--color-border);transition:background var(--transition-normal)}._cancelBtn_1ypt0_605:hover{background:var(--color-surface-2)}._saveBtn_1ypt0_633{padding:var(--space-2) var(--space-4);border-radius:var(--radius-md);font-size:var(--text-sm);font-weight:500;color:var(--color-text-on-accent);background:var(--color-accent);transition:opacity var(--transition-fast)}._saveBtn_1ypt0_633:hover:not(:disabled){opacity:.85}._saveBtn_1ypt0_633:disabled{opacity:.4;cursor:not-allowed}._commentsSection_1ypt0_671{padding:var(--space-8);border-top:1px solid var(--color-border);display:flex;flex-direction:column;gap:var(--space-6)}._commentList_1ypt0_687{display:flex;flex-direction:column;gap:12px;max-height:250px;overflow-y:auto;padding-right:4px}._comment_1ypt0_671{background:var(--color-surface-2);padding:var(--space-4) var(--space-5);border-radius:var(--radius-lg);border:1px solid var(--color-border)}._commentHeader_1ypt0_719{display:flex;justify-content:space-between;align-items:center;margin-bottom:var(--space-1);font-size:var(--text-xs)}._commentAuthor_1ypt0_735{font-weight:600;color:var(--color-text-main);display:flex;align-items:center;gap:4px}._botIcon_1ypt0_751{color:var(--color-accent)}._commentDate_1ypt0_759{color:var(--color-text-muted)}._commentContent_1ypt0_767{font-size:.875rem;line-height:1.4;white-space:pre-wrap;word-break:break-word}._noComments_1ypt0_781{text-align:center;padding:24px;color:var(--color-text-muted);font-size:.875rem;font-style:italic}._addComment_1ypt0_797{display:flex;gap:8px;margin-top:8px}._commentInput_1ypt0_809{flex:1;background:var(--color-surface-2);border:1px solid var(--color-border);border-radius:var(--radius-md);padding:var(--space-3) var(--space-4);font-size:var(--text-sm);color:var(--color-text-primary);outline:none;transition:all var(--transition-fast)}._commentInput_1ypt0_809:focus{border-color:var(--color-accent)}._sendBtn_1ypt0_841{background:var(--color-accent);color:var(--color-text-on-accent);border:none;border-radius:6px;width:36px;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:opacity var(--transition-fast)}._sendBtn_1ypt0_841:disabled{opacity:.5;cursor:not-allowed}._sendBtn_1ypt0_841:not(:disabled):hover{opacity:.9}._agentHistoryList_1ypt0_887{display:flex;flex-direction:column;gap:var(--space-3);margin-top:var(--space-3)}._historyItem_1ypt0_901{background:var(--color-surface-2);border:1px solid var(--color-border);border-radius:var(--radius-md);padding:var(--space-3);display:flex;flex-direction:column;gap:var(--space-2)}._historyMeta_1ypt0_921{display:flex;align-items:center;justify-content:space-between}._historyCol_1ypt0_933{font-size:var(--text-sm);font-weight:500;color:var(--color-text-primary)}._historyStatus_1ypt0_945{font-size:var(--text-xs);font-weight:600;text-transform:uppercase;letter-spacing:.05em;padding:2px 6px;border-radius:var(--radius-sm)}._historyStatus_1ypt0_945._processing_1ypt0_175{background:rgba(var(--color-accent-rgb),.15);color:var(--color-accent)}._historyStatus_1ypt0_945._done_1ypt0_193{background:#10b98126;color:#10b981}._historyStatus_1ypt0_945._blocked_1ypt0_211{background:#ef444426;color:#ef4444}._historyStatus_1ypt0_945._needs_approval_1ypt0_993{background:#f59e0b26;color:#f59e0b}._historyLinks_1ypt0_1003{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-3)}._historyLink_1ypt0_1003{align-self:flex-start;display:inline-flex;align-items:center;gap:4px;font-size:var(--text-xs);font-weight:500;color:var(--color-accent);text-decoration:none;transition:opacity var(--transition-fast)}._historyLink_1ypt0_1003:hover{opacity:.8;text-decoration:underline}._historyError_1ypt0_1051{font-size:var(--text-xs);color:var(--color-error);background:color-mix(in srgb,var(--color-error) 10%,transparent);padding:var(--space-2);border-radius:var(--radius-sm);white-space:pre-wrap;word-break:break-all}._overlay_9jvqp_1{position:fixed;top:0;right:0;bottom:0;left:0;background:#000000a6;display:flex;align-items:flex-start;justify-content:center;padding-top:80px;z-index:50;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);animation:_fadeIn_9jvqp_1 .15s ease}@keyframes _fadeIn_9jvqp_1{0%{opacity:0}to{opacity:1}}._modal_9jvqp_47{background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-xl);width:500px;max-width:calc(100vw - 32px);box-shadow:var(--shadow-lg);animation:_slideIn_9jvqp_1 .15s cubic-bezier(.16,1,.3,1)}@keyframes _slideIn_9jvqp_1{0%{transform:translateY(-16px);opacity:0}to{transform:translateY(0);opacity:1}}._header_9jvqp_91{display:flex;align-items:center;justify-content:space-between;padding:var(--space-6) var(--space-8);border-bottom:1px solid var(--color-border);font-size:var(--text-lg);font-weight:600}._closeBtn_9jvqp_111{width:28px;height:28px;display:flex;align-items:center;justify-content:center;border-radius:var(--radius-md);color:var(--color-text-muted);transition:background var(--transition-fast),color var(--transition-fast)}._closeBtn_9jvqp_111:hover{background:var(--color-surface-2);color:var(--color-text-primary)}._body_9jvqp_143{padding:var(--space-8);display:flex;flex-direction:column;gap:var(--space-6)}._formGroup_9jvqp_157{display:flex;flex-direction:column;gap:var(--space-2)}._label_9jvqp_169{font-size:var(--text-sm);font-weight:500;color:var(--color-text-primary)}._select_9jvqp_181,._input_9jvqp_183{width:100%;background:var(--color-surface-2);border:1px solid var(--color-border);border-radius:var(--radius-md);padding:var(--space-3) var(--space-4);font-size:var(--text-sm);color:var(--color-text-primary);outline:none;transition:all var(--transition-fast)}._select_9jvqp_181:focus,._input_9jvqp_183:focus{border-color:var(--color-accent)}._footer_9jvqp_217{display:flex;align-items:center;justify-content:flex-end;padding:var(--space-6) var(--space-8);border-top:1px solid var(--color-border);gap:var(--space-3)}._cancelBtn_9jvqp_235{padding:var(--space-2) var(--space-4);border-radius:var(--radius-md);font-size:var(--text-sm);font-weight:500;color:var(--color-text-secondary);border:1px solid var(--color-border);transition:background var(--transition-normal)}._cancelBtn_9jvqp_235:hover{background:var(--color-surface-2)}._saveBtn_9jvqp_263{padding:var(--space-2) var(--space-4);border-radius:var(--radius-md);font-size:var(--text-sm);font-weight:500;color:var(--color-text-on-accent);background:var(--color-accent);transition:opacity var(--transition-fast)}._saveBtn_9jvqp_263:hover:not(:disabled){opacity:.85}._saveBtn_9jvqp_263:disabled{opacity:.4;cursor:not-allowed}._column_1sqby_1{width:var(--column-width);flex-shrink:0;display:flex;flex-direction:column;background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-lg);max-height:calc(100vh - var(--topbar-height) - 48px)}._header_1sqby_25{position:relative;padding:var(--space-3) var(--space-3) var(--space-2);border-bottom:1px solid var(--color-border);flex-shrink:0}._headerRow_1sqby_39{display:flex;align-items:center;gap:var(--space-2)}._name_1sqby_51{font-size:var(--text-sm);font-weight:600;color:var(--color-text-primary);flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._count_1sqby_73{font-size:var(--text-xs);color:var(--color-text-muted);background:var(--color-surface-2);border-radius:var(--radius-full);padding:1px 7px;font-weight:500}._headerActions_1sqby_91{display:flex;gap:2px}._iconBtn_1sqby_101{width:24px;height:24px;display:flex;align-items:center;justify-content:center;border-radius:var(--radius-sm);color:var(--color-text-muted);transition:background var(--transition-fast),color var(--transition-fast)}._iconBtn_1sqby_101:hover{background:var(--color-surface-2);color:var(--color-text-primary)}._headerInput_1sqby_133{width:100%;font-size:var(--text-sm);font-weight:600;color:var(--color-text-primary);background:var(--color-surface-2);border:1px solid var(--color-accent);border-radius:var(--radius-sm);padding:var(--space-1) var(--space-2)}._menu_1sqby_155{position:absolute;top:calc(100% + 4px);right:var(--space-2);background:var(--color-surface-2);border:1px solid var(--color-border);border-radius:var(--radius-md);box-shadow:var(--shadow-md);z-index:20;min-width:160px;overflow:hidden;animation:_menuIn_1sqby_1 .1s ease}@keyframes _menuIn_1sqby_1{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}._menuItem_1sqby_207{display:flex;align-items:center;gap:var(--space-2);width:100%;padding:var(--space-2) var(--space-3);font-size:var(--text-sm);color:var(--color-text-secondary);text-align:left;transition:background var(--transition-fast),color var(--transition-fast)}._menuItem_1sqby_207:hover{background:var(--color-surface-3);color:var(--color-text-primary)}._menuItem_1sqby_207._danger_1sqby_241:hover{background:color-mix(in srgb,var(--color-error) 12%,transparent);color:var(--color-error)}._body_1sqby_251{flex:1;overflow-y:auto;overflow-x:hidden;padding:var(--space-2);display:flex;flex-direction:column;gap:var(--space-2);min-height:80px;scroll-behavior:smooth;-webkit-overflow-scrolling:touch}._empty_1sqby_281{font-size:var(--text-xs);color:var(--color-text-muted);text-align:center;padding:var(--space-8) 0}._addTicketInput_1sqby_295{padding:2px}._ticketInput_1sqby_303{width:100%;padding:var(--space-2) var(--space-3);font-size:var(--text-sm);color:var(--color-text-primary);background:var(--color-surface-2);border:1px solid var(--color-accent);border-radius:var(--radius-md)}._addBtn_1sqby_323{display:flex;align-items:center;gap:var(--space-2);padding:var(--space-3);width:100%;font-size:var(--text-sm);color:var(--color-text-muted);border-top:1px solid var(--color-border);border-radius:0 0 var(--radius-lg) var(--radius-lg);transition:background var(--transition-fast),color var(--transition-fast);flex-shrink:0}._addBtn_1sqby_323:hover{background:var(--color-surface-2);color:var(--color-text-primary)}._botIcon_1sqby_361{color:var(--color-accent);margin-right:4px;animation:_pulse_1sqby_1 2s infinite ease-in-out}@keyframes _pulse_1sqby_1{0%{opacity:.6}50%{opacity:1}to{opacity:.6}}._settingsPanel_1sqby_401{position:absolute;top:calc(100% + 4px);left:var(--space-2);right:var(--space-2);background:var(--color-surface-2);border:1px solid var(--color-border);border-radius:var(--radius-md);box-shadow:var(--shadow-lg);z-index:30;padding:var(--space-3);display:flex;flex-direction:column;gap:var(--space-3);animation:_menuIn_1sqby_1 .15s ease-out}._settingsHeader_1sqby_435{display:flex;align-items:center;gap:var(--space-2);font-size:var(--text-xs);font-weight:700;text-transform:uppercase;letter-spacing:.5px;color:var(--color-text-muted);border-bottom:1px solid var(--color-border);padding-bottom:var(--space-2)}._settingGroup_1sqby_461{display:flex;flex-direction:column;gap:var(--space-1)}._settingLabel_1sqby_473{font-size:10px;font-weight:600;color:var(--color-text-muted)}._settingSelect_1sqby_485{width:100%;background:var(--color-surface-3);border:1px solid var(--color-border);border-radius:var(--radius-sm);padding:var(--space-1) var(--space-2);font-size:var(--text-xs);color:var(--color-text-primary);outline:none}._onFinishRow_1sqby_507{display:flex;align-items:center;gap:var(--space-1);color:var(--color-text-muted)}._wrapper_1i3ou_1{display:flex;flex-direction:column;height:100vh;overflow:hidden}._topbar_1i3ou_15{height:var(--topbar-height);display:flex;align-items:center;padding:0 var(--space-6);border-bottom:1px solid var(--color-border);flex-shrink:0;gap:var(--space-4)}._boardName_1i3ou_35{font-size:var(--text-md);font-weight:600;color:var(--color-text-primary);letter-spacing:-.01em}._spacer_1i3ou_49{flex:1}._configBtn_1i3ou_57{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:var(--radius-md);color:var(--color-text-muted);transition:all var(--transition-normal);cursor:pointer}._configBtn_1i3ou_57:hover{background:var(--color-surface-hover);color:var(--color-text-primary)}._columnsArea_1i3ou_91{display:flex;gap:var(--space-4);padding:var(--space-4) var(--space-6);overflow-x:auto;overflow-y:hidden;flex:1;align-items:flex-start}._addColBtn_1i3ou_111{display:flex;align-items:center;gap:var(--space-2);flex-shrink:0;padding:var(--space-3) var(--space-4);font-size:var(--text-sm);font-weight:500;color:var(--color-text-muted);border:1px dashed var(--color-border);border-radius:var(--radius-lg);width:180px;transition:border-color var(--transition-normal),color var(--transition-normal),background var(--transition-normal);white-space:nowrap;align-self:flex-start}._addColBtn_1i3ou_111:hover{border-color:var(--color-accent);color:var(--color-accent);background:var(--color-accent-subtle)}._newColumn_1i3ou_159{flex-shrink:0;width:200px;align-self:flex-start}._newColumnInput_1i3ou_171{width:100%;padding:var(--space-3) var(--space-4);font-size:var(--text-sm);font-weight:500;color:var(--color-text-primary);background:var(--color-surface);border:1px solid var(--color-accent);border-radius:var(--radius-lg)}._emptyView_1i3ou_195{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-4);color:var(--color-text-muted)}._emptyTitle_1i3ou_215{font-size:var(--text-lg);font-weight:600;color:var(--color-text-secondary)}._emptySubtitle_1i3ou_227{font-size:var(--text-sm);color:var(--color-text-muted);max-width:280px;text-align:center;line-height:var(--line-height-normal)}._loadingColumns_1i3ou_245{display:flex;gap:var(--space-4)}._skeleton_1i3ou_255{width:var(--column-width);height:300px;background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-lg);animation:_pulse_1i3ou_1 1.5s ease-in-out infinite}@keyframes _pulse_1i3ou_1{0%,to{opacity:1}50%{opacity:.4}}._switcher_vhltw_1{display:flex;align-items:center;gap:var(--space-1);padding:var(--space-1) var(--space-3);border-radius:var(--radius-md);font-size:var(--text-xs);font-weight:500;color:var(--color-text-muted);border:1px solid var(--color-border);transition:background var(--transition-fast),color var(--transition-fast)}._switcher_vhltw_1:hover{background:var(--color-surface-2);color:var(--color-text-primary)}._shell_8hnwn_1{display:flex;height:100vh;width:100vw;overflow:hidden}._main_8hnwn_15{flex:1;display:flex;flex-direction:column;min-width:0;overflow:hidden}._topBar_8hnwn_31{height:var(--topbar-height);display:flex;align-items:center;justify-content:flex-end;padding:0 var(--space-4);border-bottom:1px solid var(--color-border);flex-shrink:0}._spacer_8hnwn_51{flex:1}._content_8hnwn_59{flex:1;overflow:hidden;display:flex;flex-direction:column}