@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.
@@ -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-D6WEx7Lr.js"></script>
10
- <link rel="stylesheet" crossorigin href="/assets/index-B5k_YB6Y.css">
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 so the UI displays the code review button
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
- // Move ticket to the configured destination column (if set)
290
- if (config.on_finish_column_id) {
291
- console.log(`[opencode-agent] Moving ticket ${ticket.id} to column ${config.on_finish_column_id}`);
292
- const moved = ticketRepository.move(ticket.id, config.on_finish_column_id, 0);
293
- if (moved) {
294
- // Trigger via the queue so concurrency/priority rules are respected
295
- agentQueue.evaluateColumnQueue(config.on_finish_column_id);
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}