@openboard/start 1.0.2

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 (30) hide show
  1. package/README.md +110 -0
  2. package/bin/openboard.js +116 -0
  3. package/package.json +35 -0
  4. package/packages/client/dist/assets/index-CIdk7SfN.css +1 -0
  5. package/packages/client/dist/assets/index-HJtFAWwr.js +203 -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 +113 -0
  11. package/packages/server/dist/agents/dummy.agent.js +49 -0
  12. package/packages/server/dist/agents/opencode.agent.js +184 -0
  13. package/packages/server/dist/agents/opencode.events.js +348 -0
  14. package/packages/server/dist/db/database.js +176 -0
  15. package/packages/server/dist/gh-worker.js +82 -0
  16. package/packages/server/dist/index.js +81 -0
  17. package/packages/server/dist/repositories/board.repository.js +72 -0
  18. package/packages/server/dist/repositories/column-config.repository.js +30 -0
  19. package/packages/server/dist/repositories/column.repository.js +36 -0
  20. package/packages/server/dist/repositories/comment.repository.js +35 -0
  21. package/packages/server/dist/repositories/ticket.repository.js +171 -0
  22. package/packages/server/dist/routes/boards.router.js +33 -0
  23. package/packages/server/dist/routes/column-config.router.js +44 -0
  24. package/packages/server/dist/routes/columns.router.js +45 -0
  25. package/packages/server/dist/routes/system.router.js +173 -0
  26. package/packages/server/dist/routes/tickets.router.js +88 -0
  27. package/packages/server/dist/sse.js +43 -0
  28. package/packages/server/dist/types.js +2 -0
  29. package/packages/server/dist/utils/opencode.js +11 -0
  30. package/packages/server/dist/utils/os.js +73 -0
package/README.md ADDED
@@ -0,0 +1,110 @@
1
+ # Openboard: The AI Agent Orchestration Board
2
+ A unified board to orchestrate AI agents that plan, code, review, and test.
3
+
4
+ ![Openboard Screenshot](./screenshot.png)
5
+
6
+
7
+ 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.
8
+
9
+ ## Why Openboard? Managing Coding Agents
10
+
11
+ We use a Kanban board as the central nervous system for AI agents for several key reasons:
12
+
13
+ - **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.
14
+ - **Task Decomposition**: Complex software engineering tasks can be broken down into smaller, manageable tickets, allowing multiple agents to work in parallel on different components.
15
+ - **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.
16
+ - **Prioritization**: Easily reorder tickets in the backlog to direct the agents' focus to the most critical tasks first.
17
+ - **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).
18
+
19
+ ## How Agents Work: Git Worktrees & GitHub CLI
20
+
21
+ To allow multiple agents to work in parallel without tripping over each other, Openboard leverages **Git Worktrees** and the **GitHub CLI (`gh`)**.
22
+
23
+ - **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.
24
+ - **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.
25
+
26
+ ## QuickStart
27
+
28
+ Make sure you have [opencode](https://github.com/google-deepmind/opencode), [Node.js](https://nodejs.org/), [Git](https://git-scm.com/downloads), and [GitHub CLI](https://cli.github.com/) installed.
29
+ Your folder should already have `git init` and a GitHub repo configured.
30
+
31
+ ```
32
+ npx @openboard/start
33
+ ```
34
+
35
+ ## Tech Stack
36
+
37
+ ### Frontend (`packages/client`)
38
+ - **Framework:** React with Vite
39
+ - **Language:** TypeScript
40
+ - **Styling:** CSS Modules, Global CSS variables
41
+ - **Routing:** React Router DOM
42
+ - **Interactions:** `@dnd-kit` for drag-and-drop
43
+ - **Icons:** Lucide React
44
+
45
+ ### Backend (`packages/server`)
46
+ - **Runtime:** Node.js
47
+ - **Framework:** Express
48
+ - **Language:** TypeScript
49
+ - **Database:** SQLite (via `sql.js`)
50
+ - **Real-time:** Server-Sent Events (SSE)
51
+
52
+ ## Prerequisites
53
+
54
+ Before running Openboard, ensure you have the following installed on your system:
55
+
56
+ - **[Node.js](https://nodejs.org/)** (v18 or newer recommended) & npm
57
+ - **[Git](https://git-scm.com/)**: Required for agents to manage versions and worktrees. Ensure `git` is available in your PATH.
58
+ - **[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.
59
+
60
+ ## Getting Started
61
+
62
+ 1. **Install dependencies**
63
+
64
+ Run this command in the root directory. This will install dependencies for both the client and server workspaces:
65
+ ```bash
66
+ npm install
67
+ ```
68
+
69
+ 2. **Environment Variables**
70
+
71
+ Navigate to the `packages/client` directory and copy the example environment file:
72
+ ```bash
73
+ cp packages/client/.env.example packages/client/.env
74
+ ```
75
+
76
+ 3. **Start the development servers**
77
+
78
+ Start both the frontend and backend simultaneously using concurrently:
79
+ ```bash
80
+ npm run dev
81
+ ```
82
+
83
+ - The **client** will be available at: [http://localhost:5173](http://localhost:5173)
84
+ - The **server** will run on: [http://localhost:3001](http://localhost:3001)
85
+
86
+ 4. **Build and Run for Production**
87
+
88
+ To build both the client and server for a production environment:
89
+ ```bash
90
+ npm run build
91
+ ```
92
+ To start the production servers simultaneously:
93
+ ```bash
94
+ npm run start
95
+ ```
96
+ Or use `npm run prod` to build and start in one command.
97
+
98
+ ## Project Structure
99
+
100
+ ```text
101
+ openboard/
102
+ ├── package.json # Root workspace configuration
103
+ ├── packages/
104
+ │ ├── client/ # React frontend application
105
+ │ │ ├── src/ # Components, Context, Styles
106
+ │ │ └── package.json
107
+ │ └── server/ # Express backend application
108
+ │ ├── src/ # Routes, Database logic, SSE, Agent logic
109
+ │ └── package.json
110
+ ```
@@ -0,0 +1,116 @@
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
+
79
+ // Give the server a moment to start
80
+ setTimeout(async () => {
81
+ const currentPath = process.cwd();
82
+ // We use fetch since the server is running in this process or another
83
+ try {
84
+ const res = await fetch(`http://localhost:${process.env.PORT}/api/boards`);
85
+ if (res.ok) {
86
+ const boards = await res.json();
87
+ // Find board with this path. Normalize windows paths for comparison.
88
+ const normalize = (p) => p.replace(/\\/g, '/').toLowerCase();
89
+ const board = boards.find(b => b.path && normalize(b.path) === normalize(currentPath));
90
+
91
+ const open = (await import('open')).default;
92
+ const url = board ? `http://localhost:${process.env.PORT}/boards/${board.id}` : `http://localhost:${process.env.PORT}/`;
93
+ console.log(`[openboard] Opening browser to ${url}`);
94
+ await open(url);
95
+ }
96
+ } catch (e) {
97
+ console.error('[openboard] Could not detect board or open browser:', e);
98
+ }
99
+ }, 1000);
100
+
101
+ } catch (e) {
102
+ console.error('[openboard] Error starting server. Did you run `npm run build`? Full Error:', e);
103
+ if (opencodeProcess) opencodeProcess.kill();
104
+ process.exit(1);
105
+ }
106
+
107
+ process.on('SIGINT', () => {
108
+ if (opencodeProcess) opencodeProcess.kill();
109
+ process.exit(0);
110
+ });
111
+ }
112
+
113
+ main().catch(err => {
114
+ console.error(err);
115
+ process.exit(1);
116
+ });
package/package.json ADDED
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "@openboard/start",
3
+ "version": "1.0.2",
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
+ "fast-glob": "^3.3.3",
32
+ "open": "^11.0.0",
33
+ "sql.js": "^1.12.0"
34
+ }
35
+ }
@@ -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_1lvei_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_1lvei_1 .15s ease}@keyframes _fadeIn_1lvei_1{0%{opacity:0}to{opacity:1}}._modal_1lvei_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_1lvei_1 .15s cubic-bezier(.16,1,.3,1);display:flex;flex-direction:column}@keyframes _slideIn_1lvei_1{0%{transform:translateY(-16px);opacity:0}to{transform:translateY(0);opacity:1}}._header_1lvei_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_1lvei_99 h2{margin:0;font-size:var(--text-lg);font-weight:600;color:var(--color-text-primary)}._closeBtn_1lvei_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_1lvei_129:hover{background:var(--color-surface-2);color:var(--color-text-primary)}._content_1lvei_167{padding:var(--space-8);display:flex;flex-direction:column;gap:var(--space-6)}._field_1lvei_181{display:flex;flex-direction:column;gap:var(--space-2)}._field_1lvei_181 label{font-size:var(--text-xs);font-weight:500;color:var(--color-text-muted);text-transform:uppercase;letter-spacing:.06em}._input_1lvei_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_1lvei_209:focus{outline:none;border-color:var(--color-accent)}._workspacesSection_1lvei_241{display:flex;flex-direction:column;gap:var(--space-4)}._sectionHeader_1lvei_253{display:flex;justify-content:space-between;align-items:center}._sectionHeader_1lvei_253 h3{margin:0;font-size:var(--text-xs);font-weight:500;color:var(--color-text-muted);text-transform:uppercase;letter-spacing:.06em}._addBtn_1lvei_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_1lvei_283:hover{background:color-mix(in srgb,var(--color-accent) 10%,transparent)}._workspaceList_1lvei_321{display:flex;flex-direction:column;gap:var(--space-3)}._workspaceRow_1lvei_333{display:flex;gap:var(--space-2);align-items:center}._select_1lvei_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_1lvei_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_1lvei_365:focus-within{border-color:var(--color-accent)}._pathInputWrapper_1lvei_365 svg{color:var(--color-text-muted)}._pathInput_1lvei_365{flex:1;padding:var(--space-2) 0;background:transparent;border:none;font-size:var(--text-sm);color:var(--color-text-primary)}._pathInput_1lvei_365:focus{outline:none}._removeBtn_1lvei_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_1lvei_431:hover{background:color-mix(in srgb,var(--color-error) 12%,transparent);color:var(--color-error)}._footer_1lvei_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_1lvei_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_1lvei_487:hover{background:var(--color-surface-2)}._saveBtn_1lvei_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_1lvei_519:hover:not(:disabled){opacity:.85}._saveBtn_1lvei_519:disabled{opacity:.4;cursor:not-allowed}._pathPickerTrigger_1lvei_561{display:flex;align-items:center;gap:var(--space-3);padding:var(--space-3) var(--space-4);background:var(--color-surface-2);border:1px solid var(--color-border);border-radius:var(--radius-md);cursor:pointer;transition:border-color var(--transition-fast),background var(--transition-fast)}._pathPickerTrigger_1lvei_561:hover{border-color:var(--color-border-hover);background:var(--color-surface-3)}._pathValue_1lvei_595{font-size:var(--text-sm);color:var(--color-text-primary);font-family:var(--font-mono);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}._pathPlaceholder_1lvei_613{font-size:var(--text-sm);color:var(--color-text-muted)}._folderIcon_1lvei_623{color:var(--color-text-muted);flex-shrink:0}._overlay_civm0_1{position:fixed;top:0;left:0;right:0;bottom:0;background:#0006;display:flex;align-items:center;justify-content:center;z-index:1000;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}._modal_civm0_15{background:var(--color-bg);width:600px;max-width:90vw;max-height:80vh;border-radius:var(--radius-lg);border:1px solid var(--color-border);display:flex;flex-direction:column;box-shadow:var(--shadow-lg);overflow:hidden}._header_civm0_28{padding:var(--space-4);display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid var(--color-border)}._header_civm0_28 h2{margin:0;font-size:var(--text-lg);font-weight:600;color:var(--color-text-primary)}._closeBtn_civm0_43{background:transparent;border:none;color:var(--color-text-secondary);cursor:pointer;padding:var(--space-1);border-radius:var(--radius-sm);display:flex}._closeBtn_civm0_43:hover{background:var(--color-surface-2);color:var(--color-text-primary)}._content_civm0_58{padding:var(--space-4);display:flex;flex-direction:column;gap:var(--space-4);overflow:hidden}._searchContainer_civm0_66{display:flex;flex-direction:column;gap:var(--space-3)}._searchWrapper_civm0_72{position:relative;display:flex;align-items:center}._searchIcon_civm0_78{position:absolute;left:var(--space-3);color:var(--color-text-muted)}._searchInput_civm0_84{width:100%;background:var(--color-surface-2);border:1px solid var(--color-border);border-radius:var(--radius-md);padding:var(--space-2) var(--space-3) var(--space-2) var(--space-8);color:var(--color-text-primary);font-size:var(--text-base);outline:none}._searchInput_civm0_84:focus{border-color:var(--color-accent)}._searchModeSwitch_civm0_99{display:flex;background:var(--color-surface-2);padding:2px;border-radius:var(--radius-md);gap:2px}._searchModeSwitch_civm0_99 button{flex:1;padding:var(--space-1) var(--space-3);border:none;background:transparent;color:var(--color-text-muted);font-size:var(--text-xs);font-weight:500;cursor:pointer;border-radius:calc(var(--radius-md) - 2px);transition:all var(--transition-fast)}._searchModeSwitch_civm0_99 button._activeMode_civm0_120{background:var(--color-bg);color:var(--color-text-primary);box-shadow:var(--shadow-sm)}._section_civm0_126{display:flex;flex-direction:column;gap:var(--space-2)}._sectionTitle_civm0_132{font-size:var(--text-xs);font-weight:600;color:var(--color-text-muted);text-transform:uppercase;letter-spacing:.05em;margin-bottom:var(--space-1)}._list_civm0_141{display:flex;flex-direction:column}._item_civm0_146{display:flex;align-items:center;gap:var(--space-3);padding:var(--space-2);border-radius:var(--radius-md);cursor:pointer;transition:background var(--transition-fast)}._item_civm0_146:hover{background:var(--color-surface-2)}._itemIcon_civm0_160{display:flex;align-items:center;justify-content:center}._itemPath_civm0_166{font-size:var(--text-base);color:var(--color-text-secondary);font-family:var(--font-mono);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}._itemPath_civm0_166 strong{color:var(--color-text-primary)}._footer_civm0_179{padding:var(--space-4);border-top:1px solid var(--color-border);display:flex;justify-content:flex-end;gap:var(--space-3)}._cancelBtn_civm0_187{background:transparent;border:1px solid var(--color-border);color:var(--color-text-primary);padding:var(--space-2) var(--space-4);border-radius:var(--radius-md);cursor:pointer;font-size:var(--text-sm)}._saveBtn_civm0_197{background:var(--color-accent);border:none;color:var(--color-text-on-accent);padding:var(--space-2) var(--space-4);border-radius:var(--radius-md);cursor:pointer;font-size:var(--text-sm);font-weight:500}._saveBtn_civm0_197:hover{background:var(--color-accent-hover)}._saveBtn_civm0_197:disabled{opacity:.5;cursor:not-allowed}._breadcrumb_civm0_217{display:flex;align-items:center;flex-wrap:wrap;gap:var(--space-1);font-size:var(--text-sm);color:var(--color-text-secondary);margin-bottom:var(--space-2)}._breadcrumbUnit_civm0_227{display:inline-flex;align-items:center;gap:var(--space-1)}._breadcrumbItem_civm0_233{cursor:pointer;line-height:1}._breadcrumbItem_civm0_233:hover{color:var(--color-text-primary);text-decoration:underline}._breadcrumbSeparator_civm0_243{color:var(--color-text-muted);flex-shrink:0}._gitIcon_civm0_248{color:var(--color-success)}._srcIcon_civm0_249{color:var(--color-accent)}._publicIcon_civm0_250{color:var(--color-priority-low)}._folderIcon_civm0_251{color:var(--color-text-muted)}._loading_civm0_253{padding:var(--space-4);text-align:center;color:var(--color-text-muted);font-size:var(--text-sm)}._divider_civm0_260{display:flex;align-items:center;gap:var(--space-4);margin:var(--space-4) 0 var(--space-2);color:var(--color-text-muted);font-size:var(--text-xs);font-weight:600;text-transform:uppercase;letter-spacing:.05em}._divider_civm0_260:after{content:"";flex:1;height:1px;background:var(--color-border)}._divider_civm0_260 span{flex-shrink:0}._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_mtqwy_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;position:relative}._card_mtqwy_1:hover{background:var(--color-surface-3);border-color:var(--color-border-hover);box-shadow:var(--shadow-sm)}._card_mtqwy_1._dragging_mtqwy_37{box-shadow:var(--shadow-md);cursor:grabbing}._needsApprovalCard_mtqwy_47{border-color:#f59e0b99!important;background:linear-gradient(to bottom right,rgba(245,158,11,.05),var(--color-surface-2))!important;animation:_pulseBorder_mtqwy_1 2s infinite ease-in-out}._needsApprovalCard_mtqwy_47:hover{border-color:#f59e0b!important;background:linear-gradient(to bottom right,rgba(245,158,11,.08),var(--color-surface-3))!important}@keyframes _pulseBorder_mtqwy_1{0%{box-shadow:0 0 #f59e0b66}70%{box-shadow:0 0 0 6px #f59e0b00}to{box-shadow:0 0 #f59e0b00}}._title_mtqwy_97{font-size:var(--text-sm);font-weight:500;color:var(--color-text-primary);line-height:var(--line-height-tight);margin-bottom:var(--space-1)}._titleWithPr_mtqwy_113{padding-right:64px}._prButtonOverlay_mtqwy_121{position:absolute;top:var(--space-2);right:var(--space-2);z-index:10}._description_mtqwy_135{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_mtqwy_159{display:flex;align-items:center;justify-content:space-between;margin-top:var(--space-2)}._left_mtqwy_173{display:flex;align-items:center;gap:var(--space-2)}._inspectBtn_mtqwy_185{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_mtqwy_209{color:var(--color-accent);background:rgba(var(--color-accent-rgb),.1)}._processingBtn_mtqwy_209:hover{background:rgba(var(--color-accent-rgb),.2)}._doneBtn_mtqwy_227{color:#10b981;background:#10b9811a}._doneBtn_mtqwy_227:hover{background:#10b98133}._blockedBtn_mtqwy_245{color:#ef4444;background:#ef44441a}._blockedBtn_mtqwy_245:hover{background:#ef444433}._needsApprovalBtn_mtqwy_263{color:#f59e0b;background:#f59e0b1a}._needsApprovalBtn_mtqwy_263:hover{background:#f59e0b33}._processingIcon_mtqwy_281{animation:_pulse_mtqwy_1 2s infinite ease-in-out}@keyframes _pulse_mtqwy_1{0%{opacity:.4}50%{opacity:1}to{opacity:.4}}._overlay_x7g1n_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_x7g1n_1 .15s ease}@keyframes _fadeIn_x7g1n_1{0%{opacity:0}to{opacity:1}}._modal_x7g1n_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_x7g1n_1 .15s cubic-bezier(.16,1,.3,1)}._content_x7g1n_75{overflow-y:auto;flex:1}@keyframes _slideIn_x7g1n_1{0%{transform:translateY(-16px);opacity:0}to{transform:translateY(0);opacity:1}}._header_x7g1n_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_x7g1n_127{display:flex;align-items:center;gap:var(--space-2)}._statusBadge_x7g1n_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_x7g1n_151._processing_x7g1n_175{color:var(--color-accent);background:rgba(var(--color-accent-rgb),.1)}._statusBadge_x7g1n_151._processing_x7g1n_175:hover{background:rgba(var(--color-accent-rgb),.2)}._statusBadge_x7g1n_151._done_x7g1n_193{color:#10b981;background:#10b9811a}._statusBadge_x7g1n_151._done_x7g1n_193:hover{background:#10b98133}._statusBadge_x7g1n_151._blocked_x7g1n_211{color:#ef4444;background:#ef44441a}._statusBadge_x7g1n_151._blocked_x7g1n_211:hover{background:#ef444433}._statusBadge_x7g1n_151._needsApproval_x7g1n_229{color:#f59e0b;background:#f59e0b1a}._statusBadge_x7g1n_151._needsApproval_x7g1n_229:hover{background:#f59e0b33}._costBadge_x7g1n_247{font-size:.7rem;color:var(--color-text-muted);background:var(--color-surface-3);padding:0 4px;border-radius:4px;margin-left:2px;font-weight:600}._columnTag_x7g1n_267{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_x7g1n_287{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_x7g1n_287:hover{background:var(--color-surface-2);color:var(--color-text-primary)}._headerRight_x7g1n_319{display:flex;align-items:center;gap:var(--space-3)}._sessionBtn_x7g1n_331{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_x7g1n_331:hover{background:var(--color-surface-3);color:var(--color-text-primary);border-color:var(--color-border-hover)}._body_x7g1n_373{padding:var(--space-8);display:flex;flex-direction:column}._titleInput_x7g1n_385{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_x7g1n_385:focus{background:var(--color-surface-2);outline:none}._titleInput_x7g1n_385::placeholder{color:var(--color-text-muted)}._descInput_x7g1n_433{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_x7g1n_433:focus{background:var(--color-surface-2);outline:none}._descInput_x7g1n_433::placeholder{color:var(--color-text-muted)}._section_x7g1n_481{padding:var(--space-6) var(--space-8);border-top:1px solid var(--color-border)}._sectionLabel_x7g1n_491{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_x7g1n_511{display:flex;gap:var(--space-2);flex-wrap:wrap}._priorityBtn_x7g1n_523{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_x7g1n_523:hover{border-color:var(--priority-color);color:var(--priority-color)}._priorityBtn_x7g1n_523._selected_x7g1n_553{background:color-mix(in srgb,var(--priority-color) 15%,transparent);border-color:var(--priority-color);color:var(--priority-color)}._footer_x7g1n_565{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_x7g1n_583{display:flex;gap:var(--space-2)}._deleteBtn_x7g1n_593{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_x7g1n_593:hover{background:color-mix(in srgb,var(--color-error) 12%,transparent);color:var(--color-error)}._cancelBtn_x7g1n_625{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_x7g1n_625:hover{background:var(--color-surface-2)}._saveBtn_x7g1n_653{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_x7g1n_653:hover:not(:disabled){opacity:.85}._saveBtn_x7g1n_653:disabled{opacity:.4;cursor:not-allowed}._commentsSection_x7g1n_691{padding:var(--space-8);border-top:1px solid var(--color-border);display:flex;flex-direction:column;gap:var(--space-6)}._commentList_x7g1n_707{display:flex;flex-direction:column;gap:12px;max-height:250px;overflow-y:auto;padding-right:4px}._comment_x7g1n_691{background:var(--color-surface-2);padding:var(--space-4) var(--space-5);border-radius:var(--radius-lg);border:1px solid var(--color-border)}._commentHeader_x7g1n_739{display:flex;justify-content:space-between;align-items:center;margin-bottom:var(--space-1);font-size:var(--text-xs)}._commentAuthor_x7g1n_755{font-weight:600;color:var(--color-text-main);display:flex;align-items:center;gap:4px}._botIcon_x7g1n_771{color:var(--color-accent)}._commentDate_x7g1n_779{color:var(--color-text-muted)}._commentContent_x7g1n_787{font-size:.875rem;line-height:1.5;word-break:break-word}._commentContent_x7g1n_787 p{margin:.5em 0}._commentContent_x7g1n_787 p:first-child{margin-top:0}._commentContent_x7g1n_787 p:last-child{margin-bottom:0}._commentContent_x7g1n_787 code{background:rgba(var(--color-accent-rgb),.1);color:var(--color-accent);padding:.2em .4em;border-radius:var(--radius-sm);font-size:.9em;font-family:inherit}._commentContent_x7g1n_787 pre{background:var(--color-surface-3);padding:var(--space-4);border-radius:var(--radius-md);overflow-x:auto;margin:var(--space-3) 0;border:1px solid var(--color-border)}._commentContent_x7g1n_787 pre code{background:transparent;color:inherit;padding:0;border-radius:0;font-size:.85em;font-family:monospace}._commentContent_x7g1n_787 ul,._commentContent_x7g1n_787 ol{margin:.5em 0;padding-left:1.25em}._commentContent_x7g1n_787 li{margin:.25em 0}._noComments_x7g1n_895{text-align:center;padding:24px;color:var(--color-text-muted);font-size:.875rem;font-style:italic}._addComment_x7g1n_911{display:flex;gap:8px;margin-top:8px}._commentInput_x7g1n_923{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_x7g1n_923:focus{border-color:var(--color-accent)}._sendBtn_x7g1n_955{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_x7g1n_955:disabled{opacity:.5;cursor:not-allowed}._sendBtn_x7g1n_955:not(:disabled):hover{opacity:.9}._agentHistoryList_x7g1n_1001{display:flex;flex-direction:column;gap:var(--space-3);margin-top:var(--space-3)}._historyHeader_x7g1n_1015{display:flex;justify-content:space-between;align-items:center;margin-bottom:var(--space-2)}._historyHeader_x7g1n_1015 ._sectionLabel_x7g1n_491{margin-bottom:0}._historyTotalCost_x7g1n_1037{font-size:var(--text-xs);font-weight:600;color:var(--color-text-secondary);background:var(--color-surface-3);padding:2px 8px;border-radius:var(--radius-full);border:1px solid var(--color-border)}._historyItem_x7g1n_1057{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)}._historyMain_x7g1n_1077{display:flex;align-items:flex-start;justify-content:space-between}._historyDetails_x7g1n_1089{display:flex;flex-direction:column;gap:4px}._historyStatusAndCost_x7g1n_1101{display:flex;flex-direction:column;align-items:flex-end;gap:4px}._historyCol_x7g1n_1115{font-size:var(--text-sm);font-weight:500;color:var(--color-text-primary)}._historyStatus_x7g1n_1101{font-size:var(--text-xs);font-weight:600;text-transform:uppercase;letter-spacing:.05em;padding:2px 6px;border-radius:var(--radius-sm)}._historyStatus_x7g1n_1101._processing_x7g1n_175{background:rgba(var(--color-accent-rgb),.15);color:var(--color-accent)}._historyStatus_x7g1n_1101._done_x7g1n_193{background:#10b98126;color:#10b981}._historyStatus_x7g1n_1101._blocked_x7g1n_211{background:#ef444426;color:#ef4444}._historyStatus_x7g1n_1101._needs_approval_x7g1n_1175{background:#f59e0b26;color:#f59e0b}._historyCost_x7g1n_1185{font-size:.8rem;font-weight:600;color:var(--color-text-muted);font-family:var(--font-mono)}._historyLinks_x7g1n_1199{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-3)}._historyLink_x7g1n_1199{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_x7g1n_1199:hover{opacity:.8;text-decoration:underline}._historyError_x7g1n_1247{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}