@openboard/start 1.0.24 â 1.0.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -1
- package/package.json +2 -1
- package/packages/client/dist/assets/index-CIdk7SfN.css +1 -0
- package/packages/client/dist/assets/index-Cpmwbh7h.js +203 -0
- package/packages/client/dist/index.html +2 -2
- package/packages/server/dist/agents/opencode.events.js +45 -19
- package/packages/server/dist/index.js +2 -0
- package/packages/server/dist/routes/system.router.js +173 -0
- package/packages/client/dist/assets/index-B5k_YB6Y.css +0 -1
- package/packages/client/dist/assets/index-D6WEx7Lr.js +0 -173
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
<title>OpenBoard</title>
|
|
7
7
|
<meta name="description" content="A local project management board â create boards, columns, and tickets." />
|
|
8
8
|
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
|
9
|
-
<script type="module" crossorigin src="/assets/index-
|
|
10
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
9
|
+
<script type="module" crossorigin src="/assets/index-Cpmwbh7h.js"></script>
|
|
10
|
+
<link rel="stylesheet" crossorigin href="/assets/index-CIdk7SfN.css">
|
|
11
11
|
</head>
|
|
12
12
|
<body>
|
|
13
13
|
<div id="root"></div>
|
|
@@ -142,16 +142,16 @@ sessionID, ticket, agentUrl, config, activeSessions, worktreePath, originalWorks
|
|
|
142
142
|
const latestSession = sessionsForColumn[sessionsForColumn.length - 1];
|
|
143
143
|
const hasError = latestSession?.status === 'blocked';
|
|
144
144
|
if (!hasError) {
|
|
145
|
-
// Mark the ticket as done now that the agent session finished processing
|
|
146
|
-
ticketRepository.updateAgentSession(ticket.id, {
|
|
147
|
-
column_id: ticket.column_id,
|
|
148
|
-
agent_type: agentType,
|
|
149
|
-
status: 'done',
|
|
150
|
-
port: 4096,
|
|
151
|
-
url: agentUrl,
|
|
152
|
-
total_cost: rawSessionCost > 0 ? Number(rawSessionCost.toFixed(4)) : undefined
|
|
153
|
-
});
|
|
154
145
|
if (agentType === 'code_review') {
|
|
146
|
+
// Mark the ticket as done now that the agent session finished processing
|
|
147
|
+
ticketRepository.updateAgentSession(ticket.id, {
|
|
148
|
+
column_id: ticket.column_id,
|
|
149
|
+
agent_type: agentType,
|
|
150
|
+
status: 'done',
|
|
151
|
+
port: 4096,
|
|
152
|
+
url: agentUrl,
|
|
153
|
+
total_cost: rawSessionCost > 0 ? Number(rawSessionCost.toFixed(4)) : undefined
|
|
154
|
+
});
|
|
155
155
|
try {
|
|
156
156
|
// Find out if the PR was approved or changes requested
|
|
157
157
|
const latestTicket = ticketRepository.findById(ticket.id) || ticket;
|
|
@@ -266,7 +266,7 @@ sessionID, ticket, agentUrl, config, activeSessions, worktreePath, originalWorks
|
|
|
266
266
|
prUrl = prOut.trim();
|
|
267
267
|
updateSessionComment(`đ **Pull Request Created**\n\nThe agent has proposed the following changes in a PR. Check it out:\n${prUrl}${rawSessionCost > 0 ? `\n\n**Total Cost:** $${rawSessionCost.toFixed(4)}` : ''}`, 'pr');
|
|
268
268
|
}
|
|
269
|
-
// Add PR URL to the active agent session
|
|
269
|
+
// Add PR URL to the active agent session and mark as done
|
|
270
270
|
ticketRepository.updateAgentSession(ticket.id, {
|
|
271
271
|
column_id: ticket.column_id,
|
|
272
272
|
agent_type: 'opencode',
|
|
@@ -276,24 +276,50 @@ sessionID, ticket, agentUrl, config, activeSessions, worktreePath, originalWorks
|
|
|
276
276
|
pr_url: prUrl,
|
|
277
277
|
total_cost: rawSessionCost > 0 ? Number(rawSessionCost.toFixed(4)) : undefined
|
|
278
278
|
});
|
|
279
|
+
// Move ticket to the configured destination column (if set)
|
|
280
|
+
if (config.on_finish_column_id) {
|
|
281
|
+
console.log(`[opencode-agent] Moving ticket ${ticket.id} to column ${config.on_finish_column_id}`);
|
|
282
|
+
const moved = ticketRepository.move(ticket.id, config.on_finish_column_id, 0);
|
|
283
|
+
if (moved) {
|
|
284
|
+
// Trigger via the queue so concurrency/priority rules are respected
|
|
285
|
+
agentQueue.evaluateColumnQueue(config.on_finish_column_id);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
279
288
|
}
|
|
280
289
|
else {
|
|
281
290
|
console.log(`[opencode-agent] No changes to push for ticket ${ticket.id}.`);
|
|
282
291
|
updateSessionComment(`âšī¸ **Task Completed (No Changes)**\n\nThe agent finished the task but did not make any code changes.${rawSessionCost > 0 ? `\n\n**Total Cost:** $${rawSessionCost.toFixed(4)}` : ''}`, 'status');
|
|
292
|
+
// Mark as done even if no changes
|
|
293
|
+
ticketRepository.updateAgentSession(ticket.id, {
|
|
294
|
+
column_id: ticket.column_id,
|
|
295
|
+
agent_type: 'opencode',
|
|
296
|
+
status: 'done',
|
|
297
|
+
port: 4096,
|
|
298
|
+
url: agentUrl,
|
|
299
|
+
total_cost: rawSessionCost > 0 ? Number(rawSessionCost.toFixed(4)) : undefined
|
|
300
|
+
});
|
|
301
|
+
// Still move to the next column if no changes (assumed done)
|
|
302
|
+
if (config.on_finish_column_id) {
|
|
303
|
+
console.log(`[opencode-agent] Moving ticket ${ticket.id} to column ${config.on_finish_column_id}`);
|
|
304
|
+
const moved = ticketRepository.move(ticket.id, config.on_finish_column_id, 0);
|
|
305
|
+
if (moved) {
|
|
306
|
+
agentQueue.evaluateColumnQueue(config.on_finish_column_id);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
283
309
|
}
|
|
284
310
|
}
|
|
285
311
|
catch (error) {
|
|
286
312
|
console.error(`[opencode-agent] Failed to create PR for ticket ${ticket.id}`, error);
|
|
287
313
|
updateSessionComment(`â **Failed to Create PR**\n\nThe agent finished the task, but an error occurred while pushing changes or creating the PR:\n\`\`\`\n${error.message}\n\`\`\``, 'status');
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
}
|
|
314
|
+
// Mark as blocked due to PR failure
|
|
315
|
+
ticketRepository.updateAgentSession(ticket.id, {
|
|
316
|
+
column_id: ticket.column_id,
|
|
317
|
+
agent_type: 'opencode',
|
|
318
|
+
status: 'blocked',
|
|
319
|
+
port: 4096,
|
|
320
|
+
url: agentUrl,
|
|
321
|
+
error_message: `PR creation failed: ${error.message}`
|
|
322
|
+
});
|
|
297
323
|
}
|
|
298
324
|
} // End of agentType === 'opencode' block
|
|
299
325
|
}
|
|
@@ -5,6 +5,7 @@ import { boardsRouter } from './routes/boards.router.js';
|
|
|
5
5
|
import { columnsRouter } from './routes/columns.router.js';
|
|
6
6
|
import { ticketsRouter } from './routes/tickets.router.js';
|
|
7
7
|
import { columnConfigRouter } from './routes/column-config.router.js';
|
|
8
|
+
import { systemRouter } from './routes/system.router.js';
|
|
8
9
|
import { sseManager } from './sse.js';
|
|
9
10
|
import path from 'path';
|
|
10
11
|
import { fileURLToPath } from 'url';
|
|
@@ -49,6 +50,7 @@ async function start() {
|
|
|
49
50
|
app.use('/api/boards/:boardId/columns', columnsRouter);
|
|
50
51
|
app.use('/api/boards/:boardId/tickets', ticketsRouter);
|
|
51
52
|
app.use('/api/boards/:boardId/columns', columnConfigRouter);
|
|
53
|
+
app.use('/api/system', systemRouter);
|
|
52
54
|
app.get('/api/health', (_req, res) => res.json({ status: 'ok' }));
|
|
53
55
|
// Serve the built client
|
|
54
56
|
const clientExtPath = path.join(__dirname, '../../client/dist');
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import { Router } from 'express';
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import os from 'os';
|
|
5
|
+
import fg from 'fast-glob';
|
|
6
|
+
import { normalizePathForOS } from '../utils/os.js';
|
|
7
|
+
const router = Router();
|
|
8
|
+
async function getWindowsDrives() {
|
|
9
|
+
const drives = [];
|
|
10
|
+
const alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
|
11
|
+
for (const letter of alphabet) {
|
|
12
|
+
const drive = `${letter}:`;
|
|
13
|
+
try {
|
|
14
|
+
fs.accessSync(drive + path.sep);
|
|
15
|
+
drives.push(drive);
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
// Drive not accessible or doesn't exist
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return drives;
|
|
22
|
+
}
|
|
23
|
+
router.get('/browse', async (req, res) => {
|
|
24
|
+
let currentPath = normalizePathForOS(req.query.path || '');
|
|
25
|
+
try {
|
|
26
|
+
if (!currentPath && process.platform === 'win32') {
|
|
27
|
+
const drives = await getWindowsDrives();
|
|
28
|
+
const entries = drives.map(drive => ({
|
|
29
|
+
name: drive,
|
|
30
|
+
path: drive + '\\',
|
|
31
|
+
isRepo: false,
|
|
32
|
+
hasSrc: false,
|
|
33
|
+
hasPublic: false,
|
|
34
|
+
isDir: true
|
|
35
|
+
}));
|
|
36
|
+
res.json({ currentPath: '', entries });
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
if (!currentPath) {
|
|
40
|
+
currentPath = '/';
|
|
41
|
+
}
|
|
42
|
+
const items = await fs.promises.readdir(currentPath, { withFileTypes: true });
|
|
43
|
+
const entries = [];
|
|
44
|
+
for (const item of items) {
|
|
45
|
+
if (!item.isDirectory())
|
|
46
|
+
continue;
|
|
47
|
+
const fullPath = path.join(currentPath, item.name);
|
|
48
|
+
let isRepo = false;
|
|
49
|
+
let hasSrc = false;
|
|
50
|
+
let hasPublic = false;
|
|
51
|
+
try {
|
|
52
|
+
const subItems = await fs.promises.readdir(fullPath);
|
|
53
|
+
isRepo = subItems.includes('.git');
|
|
54
|
+
hasSrc = subItems.includes('src');
|
|
55
|
+
hasPublic = subItems.includes('public');
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
// Ignore errors (e.g. permission denied)
|
|
59
|
+
}
|
|
60
|
+
entries.push({
|
|
61
|
+
name: item.name,
|
|
62
|
+
path: fullPath,
|
|
63
|
+
isRepo,
|
|
64
|
+
hasSrc,
|
|
65
|
+
hasPublic,
|
|
66
|
+
isDir: true
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
// Sorting: Repos first, then alphabetical
|
|
70
|
+
entries.sort((a, b) => {
|
|
71
|
+
if (a.isRepo && !b.isRepo)
|
|
72
|
+
return -1;
|
|
73
|
+
if (!a.isRepo && b.isRepo)
|
|
74
|
+
return 1;
|
|
75
|
+
return a.name.localeCompare(b.name);
|
|
76
|
+
});
|
|
77
|
+
res.json({ currentPath, entries });
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
res.status(500).json({ error: error.message });
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
router.get('/search', async (req, res) => {
|
|
84
|
+
const query = (req.query.query || '').toLowerCase();
|
|
85
|
+
const basePath = normalizePathForOS(req.query.basePath || '');
|
|
86
|
+
if (!query || !basePath) {
|
|
87
|
+
res.json([]);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
try {
|
|
91
|
+
const items = await fs.promises.readdir(basePath, { withFileTypes: true });
|
|
92
|
+
const results = [];
|
|
93
|
+
for (const item of items) {
|
|
94
|
+
if (!item.isDirectory())
|
|
95
|
+
continue;
|
|
96
|
+
if (item.name.toLowerCase().includes(query)) {
|
|
97
|
+
const fullPath = path.join(basePath, item.name);
|
|
98
|
+
let isRepo = false;
|
|
99
|
+
let hasSrc = false;
|
|
100
|
+
let hasPublic = false;
|
|
101
|
+
try {
|
|
102
|
+
const subItems = await fs.promises.readdir(fullPath);
|
|
103
|
+
isRepo = subItems.includes('.git');
|
|
104
|
+
hasSrc = subItems.includes('src');
|
|
105
|
+
hasPublic = subItems.includes('public');
|
|
106
|
+
}
|
|
107
|
+
catch { }
|
|
108
|
+
results.push({
|
|
109
|
+
name: item.name,
|
|
110
|
+
path: fullPath,
|
|
111
|
+
isRepo,
|
|
112
|
+
hasSrc,
|
|
113
|
+
hasPublic,
|
|
114
|
+
isDir: true
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
res.json(results);
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
res.status(500).json({ error: error.message });
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
router.get('/search/global', async (req, res) => {
|
|
125
|
+
const query = (req.query.query || '').toLowerCase();
|
|
126
|
+
if (!query || query.length < 2) {
|
|
127
|
+
res.json([]);
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
try {
|
|
131
|
+
// Start search from home directory
|
|
132
|
+
const homeDir = os.homedir();
|
|
133
|
+
// Use fast-glob to find directories matching query
|
|
134
|
+
// Limit depth and results for performance
|
|
135
|
+
const pattern = `*${query}*`;
|
|
136
|
+
const matches = await fg(pattern, {
|
|
137
|
+
cwd: homeDir,
|
|
138
|
+
onlyDirectories: true,
|
|
139
|
+
unique: true,
|
|
140
|
+
absolute: true,
|
|
141
|
+
deep: 3, // Depth limit
|
|
142
|
+
ignore: ['**/node_modules/**', '**/.*/**']
|
|
143
|
+
});
|
|
144
|
+
const results = [];
|
|
145
|
+
const limitedMatches = matches.slice(0, 50); // Result limit
|
|
146
|
+
for (const fullPath of limitedMatches) {
|
|
147
|
+
const name = path.basename(fullPath);
|
|
148
|
+
let isRepo = false;
|
|
149
|
+
let hasSrc = false;
|
|
150
|
+
let hasPublic = false;
|
|
151
|
+
try {
|
|
152
|
+
const subItems = await fs.promises.readdir(fullPath);
|
|
153
|
+
isRepo = subItems.includes('.git');
|
|
154
|
+
hasSrc = subItems.includes('src');
|
|
155
|
+
hasPublic = subItems.includes('public');
|
|
156
|
+
}
|
|
157
|
+
catch { }
|
|
158
|
+
results.push({
|
|
159
|
+
name,
|
|
160
|
+
path: fullPath,
|
|
161
|
+
isRepo,
|
|
162
|
+
hasSrc,
|
|
163
|
+
hasPublic,
|
|
164
|
+
isDir: true
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
res.json(results);
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
res.status(500).json({ error: error.message });
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
export { router as systemRouter };
|
|
@@ -1 +0,0 @@
|
|
|
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_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}
|