tycono 0.1.29 → 0.1.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +61 -18
- package/package.json +8 -4
- package/src/api/src/engine/runners/claude-cli.ts +4 -2
- package/src/api/src/routes/knowledge.ts +4 -4
- package/src/api/src/routes/speech.ts +198 -18
- package/src/web/dist/assets/index-BUQBF_9Z.css +1 -0
- package/src/web/dist/assets/index-bBNMD9Hr.js +100 -0
- package/src/web/dist/assets/{preview-app-LDESpiII.js → preview-app-BXTCBNgF.js} +1 -1
- package/src/web/dist/index.html +2 -2
- package/src/web/dist/assets/index-BdKLLYdc.css +0 -1
- package/src/web/dist/assets/index-CgztWO_G.js +0 -100
package/LICENSE
CHANGED
package/README.md
CHANGED
|
@@ -1,6 +1,27 @@
|
|
|
1
|
-
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src=".github/assets/hero-office.png" alt="Tycono — AI Office" width="640" />
|
|
3
|
+
</p>
|
|
2
4
|
|
|
3
|
-
>
|
|
5
|
+
<h1 align="center">tycono</h1>
|
|
6
|
+
|
|
7
|
+
<p align="center">
|
|
8
|
+
<strong>Build an AI company. Watch them work.</strong>
|
|
9
|
+
</p>
|
|
10
|
+
|
|
11
|
+
<p align="center">
|
|
12
|
+
<a href="https://www.npmjs.com/package/tycono"><img src="https://img.shields.io/npm/v/tycono.svg" alt="npm version" /></a>
|
|
13
|
+
<a href="https://github.com/seongsu-kang/tycono/blob/main/LICENSE"><img src="https://img.shields.io/npm/l/tycono.svg" alt="license" /></a>
|
|
14
|
+
<a href="https://www.npmjs.com/package/tycono"><img src="https://img.shields.io/node/v/tycono.svg" alt="node version" /></a>
|
|
15
|
+
</p>
|
|
16
|
+
|
|
17
|
+
<p align="center">
|
|
18
|
+
<a href="https://tycono.ai">Website</a> ·
|
|
19
|
+
<a href="#quick-start">Quick Start</a> ·
|
|
20
|
+
<a href="#how-it-works">How It Works</a> ·
|
|
21
|
+
<a href="CONTRIBUTING.md">Contributing</a>
|
|
22
|
+
</p>
|
|
23
|
+
|
|
24
|
+
---
|
|
4
25
|
|
|
5
26
|
**tycono** is an open-source platform that lets you create and run an AI-powered organization. Define roles (CTO, PM, Engineer...), assign them AI agents, and watch them collaborate through a real-time dashboard.
|
|
6
27
|
|
|
@@ -13,15 +34,29 @@ npx tycono
|
|
|
13
34
|
|
|
14
35
|
That's it. A setup wizard guides you through creating your company, then your browser opens to a live dashboard showing your AI team at work.
|
|
15
36
|
|
|
37
|
+
## Why Tycono?
|
|
38
|
+
|
|
39
|
+
| | Single AI Agent | Tycono |
|
|
40
|
+
|---|---|---|
|
|
41
|
+
| **Structure** | One agent, one context | Multiple roles with org hierarchy |
|
|
42
|
+
| **Knowledge** | Loses context between sessions | Persistent, file-based knowledge system (AKB) |
|
|
43
|
+
| **Authority** | Can do anything | Scoped — each role has boundaries |
|
|
44
|
+
| **Delegation** | Manual prompt chaining | Automatic dispatch through org chart |
|
|
45
|
+
| **Visibility** | Terminal output | Real-time isometric office dashboard |
|
|
46
|
+
|
|
16
47
|
## What You Get
|
|
17
48
|
|
|
18
49
|
- **Role-based AI agents** — Each role has its own persona, authority scope, and knowledge boundaries
|
|
19
50
|
- **Org hierarchy** — Roles report to each other. CTO dispatches to Engineers. PM coordinates with Design.
|
|
20
|
-
- **Real-time dashboard** — Watch your AI team work in an isometric office
|
|
51
|
+
- **Real-time dashboard** — Watch your AI team work in an isometric pixel-art office
|
|
21
52
|
- **Knowledge management** — Automatic document routing, cross-linking, and Hub-based organization
|
|
22
53
|
- **Local-first** — Everything runs on your machine. Your data stays yours.
|
|
23
54
|
- **BYOK** — Bring your own Anthropic API key. No middleman.
|
|
24
55
|
|
|
56
|
+
<p align="center">
|
|
57
|
+
<img src=".github/assets/sidepanel-chat.png" alt="Tycono Dashboard" width="640" />
|
|
58
|
+
</p>
|
|
59
|
+
|
|
25
60
|
## Requirements
|
|
26
61
|
|
|
27
62
|
- Node.js >= 18
|
|
@@ -29,14 +64,14 @@ That's it. A setup wizard guides you through creating your company, then your br
|
|
|
29
64
|
|
|
30
65
|
## Team Templates
|
|
31
66
|
|
|
32
|
-
During setup, pick a template:
|
|
67
|
+
During setup, pick a template or build your own:
|
|
33
68
|
|
|
34
|
-
| Template | Roles |
|
|
35
|
-
|
|
36
|
-
| **Startup** | CTO + PM + Engineer |
|
|
37
|
-
| **Research** | Lead Researcher + Analyst + Writer |
|
|
38
|
-
| **Agency** | Creative Director + Designer + Developer |
|
|
39
|
-
| **Custom** | Start
|
|
69
|
+
| Template | Roles | Best For |
|
|
70
|
+
|----------|-------|----------|
|
|
71
|
+
| **Startup** | CTO + PM + Engineer | Product development |
|
|
72
|
+
| **Research** | Lead Researcher + Analyst + Writer | Analysis & reports |
|
|
73
|
+
| **Agency** | Creative Director + Designer + Developer | Client projects |
|
|
74
|
+
| **Custom** | Start empty, hire as you go | Full control |
|
|
40
75
|
|
|
41
76
|
## How It Works
|
|
42
77
|
|
|
@@ -54,25 +89,26 @@ Every role has:
|
|
|
54
89
|
- `profile.md` — Public-facing description
|
|
55
90
|
- `journal/` — Work history
|
|
56
91
|
|
|
57
|
-
##
|
|
92
|
+
## Your Company Structure
|
|
58
93
|
|
|
59
94
|
```
|
|
60
95
|
your-company/
|
|
61
|
-
├── CLAUDE.md ← AI entry point
|
|
96
|
+
├── CLAUDE.md ← AI entry point (auto-managed)
|
|
62
97
|
├── company/ ← Mission, vision, values
|
|
63
98
|
├── roles/ ← AI role definitions
|
|
64
99
|
├── projects/ ← Product specs and tasks
|
|
65
100
|
├── architecture/ ← Technical decisions
|
|
66
|
-
├── operations/ ← Standups, decisions
|
|
67
|
-
|
|
101
|
+
├── operations/ ← Standups, decisions, waves
|
|
102
|
+
├── knowledge/ ← Domain knowledge
|
|
103
|
+
└── .tycono/ ← Config and preferences
|
|
68
104
|
```
|
|
69
105
|
|
|
70
106
|
## CLI Usage
|
|
71
107
|
|
|
72
108
|
```bash
|
|
73
|
-
tycono # Start server + open dashboard
|
|
74
|
-
tycono --help
|
|
75
|
-
tycono --version
|
|
109
|
+
npx tycono # Start server + open dashboard
|
|
110
|
+
npx tycono --help # Show help
|
|
111
|
+
npx tycono --version # Show version
|
|
76
112
|
```
|
|
77
113
|
|
|
78
114
|
## Environment Variables
|
|
@@ -103,10 +139,17 @@ npm run typecheck
|
|
|
103
139
|
|
|
104
140
|
See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.
|
|
105
141
|
|
|
142
|
+
## Get Help
|
|
143
|
+
|
|
144
|
+
- [GitHub Issues](https://github.com/seongsu-kang/tycono/issues) — Bug reports and feature requests
|
|
145
|
+
- [GitHub Discussions](https://github.com/seongsu-kang/tycono/discussions) — Questions and ideas
|
|
146
|
+
|
|
106
147
|
## License
|
|
107
148
|
|
|
108
149
|
[MIT](LICENSE)
|
|
109
150
|
|
|
110
151
|
---
|
|
111
152
|
|
|
112
|
-
|
|
153
|
+
<p align="center">
|
|
154
|
+
<sub>Built with tycono. An AI company that builds itself.</sub>
|
|
155
|
+
</p>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tycono",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.30",
|
|
4
4
|
"description": "Build an AI company. Watch them work.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -45,16 +45,20 @@
|
|
|
45
45
|
},
|
|
46
46
|
"keywords": [
|
|
47
47
|
"ai",
|
|
48
|
+
"tycono",
|
|
48
49
|
"company",
|
|
49
50
|
"organization",
|
|
50
51
|
"roles",
|
|
51
52
|
"claude",
|
|
52
|
-
"agent"
|
|
53
|
+
"agent",
|
|
54
|
+
"multi-agent",
|
|
55
|
+
"agentic",
|
|
56
|
+
"local-first"
|
|
53
57
|
],
|
|
54
58
|
"license": "MIT",
|
|
55
59
|
"repository": {
|
|
56
60
|
"type": "git",
|
|
57
|
-
"url": "git+https://github.com/seongsu-kang/
|
|
61
|
+
"url": "git+https://github.com/seongsu-kang/tycono.git"
|
|
58
62
|
},
|
|
59
|
-
"homepage": "https://github.com/seongsu-kang/
|
|
63
|
+
"homepage": "https://github.com/seongsu-kang/tycono#readme"
|
|
60
64
|
}
|
|
@@ -163,8 +163,10 @@ export class ClaudeCliRunner implements ExecutionRunner {
|
|
|
163
163
|
mcpServers: {
|
|
164
164
|
playwright: {
|
|
165
165
|
type: 'stdio',
|
|
166
|
-
command:
|
|
167
|
-
args:
|
|
166
|
+
command: process.env.PLAYWRIGHT_MCP_PATH || 'npx',
|
|
167
|
+
args: process.env.PLAYWRIGHT_MCP_PATH
|
|
168
|
+
? ['--output-dir', runnerOutputDir]
|
|
169
|
+
: ['@anthropic-ai/mcp-playwright', '--output-dir', runnerOutputDir],
|
|
168
170
|
},
|
|
169
171
|
},
|
|
170
172
|
});
|
|
@@ -206,8 +206,8 @@ knowledgeRouter.put('/{*path}', (req: Request, res: Response, next: NextFunction
|
|
|
206
206
|
return;
|
|
207
207
|
}
|
|
208
208
|
|
|
209
|
-
const absPath = path.
|
|
210
|
-
if (!absPath.startsWith(companyRoot())) {
|
|
209
|
+
const absPath = path.resolve(companyRoot(), docId);
|
|
210
|
+
if (!absPath.startsWith(companyRoot() + path.sep) && absPath !== companyRoot()) {
|
|
211
211
|
res.status(403).json({ error: 'Forbidden' });
|
|
212
212
|
return;
|
|
213
213
|
}
|
|
@@ -248,8 +248,8 @@ knowledgeRouter.delete('/{*path}', (req: Request, res: Response, next: NextFunct
|
|
|
248
248
|
return;
|
|
249
249
|
}
|
|
250
250
|
|
|
251
|
-
const absPath = path.
|
|
252
|
-
if (!absPath.startsWith(companyRoot())) {
|
|
251
|
+
const absPath = path.resolve(companyRoot(), docId);
|
|
252
|
+
if (!absPath.startsWith(companyRoot() + path.sep) && absPath !== companyRoot()) {
|
|
253
253
|
res.status(403).json({ error: 'Forbidden' });
|
|
254
254
|
return;
|
|
255
255
|
}
|
|
@@ -3,25 +3,187 @@
|
|
|
3
3
|
*
|
|
4
4
|
* POST /api/speech/chat — History-aware channel conversation.
|
|
5
5
|
* AI reads channel history and responds in character.
|
|
6
|
-
* Uses Haiku for
|
|
6
|
+
* Uses Haiku with AKB tool-use for grounded, context-aware chat.
|
|
7
7
|
*/
|
|
8
8
|
import { Router, Request, Response, NextFunction } from 'express';
|
|
9
9
|
import fs from 'node:fs';
|
|
10
10
|
import path from 'node:path';
|
|
11
|
+
import { glob } from 'glob';
|
|
11
12
|
import { COMPANY_ROOT, readFile, fileExists, listFiles } from '../services/file-reader.js';
|
|
12
13
|
import { buildOrgTree } from '../engine/index.js';
|
|
13
14
|
import { parseMarkdownTable, extractBoldKeyValues } from '../services/markdown-parser.js';
|
|
14
|
-
import {
|
|
15
|
+
import {
|
|
16
|
+
AnthropicProvider, ClaudeCliProvider,
|
|
17
|
+
type LLMProvider, type ToolDefinition, type LLMMessage, type LLMResponse, type MessageContent,
|
|
18
|
+
} from '../engine/llm-adapter.js';
|
|
15
19
|
import { TokenLedger } from '../services/token-ledger.js';
|
|
16
20
|
import { readConfig } from '../services/company-config.js';
|
|
17
21
|
import { calcLevel } from '../utils/role-level.js';
|
|
18
22
|
|
|
19
23
|
export const speechRouter = Router();
|
|
20
24
|
|
|
25
|
+
/* ══════════════════════════════════════════════════
|
|
26
|
+
* AKB Tools — Let chat roles explore company knowledge
|
|
27
|
+
* ══════════════════════════════════════════════════ */
|
|
28
|
+
|
|
29
|
+
const MAX_TOOL_ROUNDS = 2;
|
|
30
|
+
const MAX_FILE_CHARS = 1500; // truncate large files
|
|
31
|
+
|
|
32
|
+
const AKB_TOOLS: ToolDefinition[] = [
|
|
33
|
+
{
|
|
34
|
+
name: 'search_akb',
|
|
35
|
+
description: 'Search the company knowledge base (AKB) for keywords. Returns matching file paths and snippets. Use to find decisions, journals, projects, waves, standups, or any company knowledge.',
|
|
36
|
+
input_schema: {
|
|
37
|
+
type: 'object' as const,
|
|
38
|
+
properties: {
|
|
39
|
+
query: { type: 'string', description: 'Search keywords (e.g. "landing deploy", "refactoring decision", "Store Import")' },
|
|
40
|
+
path: { type: 'string', description: 'Optional subdirectory to search in (e.g. "operations/decisions", "projects", "knowledge"). Defaults to entire AKB.' },
|
|
41
|
+
},
|
|
42
|
+
required: ['query'],
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
name: 'read_file',
|
|
47
|
+
description: 'Read a specific file from the AKB. Use after search_akb to read full content of interesting files.',
|
|
48
|
+
input_schema: {
|
|
49
|
+
type: 'object' as const,
|
|
50
|
+
properties: {
|
|
51
|
+
path: { type: 'string', description: 'File path relative to AKB root (e.g. "operations/decisions/008-repo-structure.md", "projects/projects.md")' },
|
|
52
|
+
},
|
|
53
|
+
required: ['path'],
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
name: 'list_files',
|
|
58
|
+
description: 'List files in a directory. Useful to discover what exists (e.g. "operations/waves/", "roles/engineer/journal/").',
|
|
59
|
+
input_schema: {
|
|
60
|
+
type: 'object' as const,
|
|
61
|
+
properties: {
|
|
62
|
+
path: { type: 'string', description: 'Directory path relative to AKB root (e.g. "operations/standups", "roles/pm/journal")' },
|
|
63
|
+
pattern: { type: 'string', description: 'Glob pattern (default: "*.md")' },
|
|
64
|
+
},
|
|
65
|
+
required: ['path'],
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
];
|
|
69
|
+
|
|
70
|
+
function executeAkbTool(name: string, input: Record<string, unknown>): string {
|
|
71
|
+
try {
|
|
72
|
+
switch (name) {
|
|
73
|
+
case 'search_akb': {
|
|
74
|
+
const query = String(input.query || '');
|
|
75
|
+
const searchPath = input.path ? String(input.path) : '';
|
|
76
|
+
const searchDir = path.resolve(COMPANY_ROOT, searchPath);
|
|
77
|
+
|
|
78
|
+
if (!fs.existsSync(searchDir)) return `Directory not found: ${searchPath || '/'}`;
|
|
79
|
+
|
|
80
|
+
// Find all .md files, then grep for query keywords
|
|
81
|
+
const mdFiles = glob.sync('**/*.md', { cwd: searchDir, nodir: true }).slice(0, 100);
|
|
82
|
+
const keywords = query.toLowerCase().split(/\s+/).filter(Boolean);
|
|
83
|
+
const results: string[] = [];
|
|
84
|
+
|
|
85
|
+
for (const file of mdFiles) {
|
|
86
|
+
const fullPath = path.join(searchDir, file);
|
|
87
|
+
const content = fs.readFileSync(fullPath, 'utf-8');
|
|
88
|
+
const lower = content.toLowerCase();
|
|
89
|
+
const matchCount = keywords.filter(k => lower.includes(k)).length;
|
|
90
|
+
if (matchCount >= Math.max(1, Math.ceil(keywords.length * 0.5))) {
|
|
91
|
+
// Extract a relevant snippet (first matching line + context)
|
|
92
|
+
const lines = content.split('\n');
|
|
93
|
+
let snippet = '';
|
|
94
|
+
for (let i = 0; i < lines.length; i++) {
|
|
95
|
+
const ll = lines[i].toLowerCase();
|
|
96
|
+
if (keywords.some(k => ll.includes(k))) {
|
|
97
|
+
snippet = lines.slice(Math.max(0, i - 1), i + 3).join('\n').slice(0, 200);
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
const relPath = searchPath ? `${searchPath}/${file}` : file;
|
|
102
|
+
results.push(`📄 ${relPath} (${matchCount}/${keywords.length} keywords)\n${snippet}`);
|
|
103
|
+
}
|
|
104
|
+
if (results.length >= 8) break;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
return results.length > 0
|
|
108
|
+
? results.join('\n\n')
|
|
109
|
+
: `No results for "${query}" in ${searchPath || 'AKB'}`;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
case 'read_file': {
|
|
113
|
+
const filePath = String(input.path || '');
|
|
114
|
+
const absolute = path.resolve(COMPANY_ROOT, filePath);
|
|
115
|
+
if (!fs.existsSync(absolute)) return `File not found: ${filePath}`;
|
|
116
|
+
const content = fs.readFileSync(absolute, 'utf-8');
|
|
117
|
+
return content.length > MAX_FILE_CHARS
|
|
118
|
+
? content.slice(0, MAX_FILE_CHARS) + `\n\n... (truncated, ${content.length} chars total)`
|
|
119
|
+
: content;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
case 'list_files': {
|
|
123
|
+
const dirPath = String(input.path || '');
|
|
124
|
+
const pat = String(input.pattern || '*.md');
|
|
125
|
+
const absolute = path.resolve(COMPANY_ROOT, dirPath);
|
|
126
|
+
if (!fs.existsSync(absolute)) return `Directory not found: ${dirPath}`;
|
|
127
|
+
const files = glob.sync(pat, { cwd: absolute, nodir: true }).sort();
|
|
128
|
+
return files.length > 0
|
|
129
|
+
? files.map(f => `- ${dirPath}/${f}`).join('\n')
|
|
130
|
+
: `No files matching "${pat}" in ${dirPath}`;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
default:
|
|
134
|
+
return `Unknown tool: ${name}`;
|
|
135
|
+
}
|
|
136
|
+
} catch (err) {
|
|
137
|
+
return `Error: ${err instanceof Error ? err.message : String(err)}`;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Run mini agent loop: LLM call → tool use → LLM call → ... → final text.
|
|
143
|
+
* Max MAX_TOOL_ROUNDS rounds of tool use, then force a text response.
|
|
144
|
+
*/
|
|
145
|
+
async function chatWithTools(
|
|
146
|
+
provider: LLMProvider,
|
|
147
|
+
systemPrompt: string,
|
|
148
|
+
initialMessages: LLMMessage[],
|
|
149
|
+
useTools: boolean,
|
|
150
|
+
): Promise<{ text: string; totalUsage: { inputTokens: number; outputTokens: number } }> {
|
|
151
|
+
const messages: LLMMessage[] = [...initialMessages];
|
|
152
|
+
const totalUsage = { inputTokens: 0, outputTokens: 0 };
|
|
153
|
+
const tools = useTools ? AKB_TOOLS : undefined;
|
|
154
|
+
|
|
155
|
+
for (let round = 0; round <= MAX_TOOL_ROUNDS; round++) {
|
|
156
|
+
const response = await provider.chat(systemPrompt, messages, tools);
|
|
157
|
+
totalUsage.inputTokens += response.usage.inputTokens;
|
|
158
|
+
totalUsage.outputTokens += response.usage.outputTokens;
|
|
159
|
+
|
|
160
|
+
// Check if there are tool calls
|
|
161
|
+
const toolCalls = response.content.filter(c => c.type === 'tool_use');
|
|
162
|
+
const textParts = response.content.filter(c => c.type === 'text').map(c => (c as { type: 'text'; text: string }).text);
|
|
163
|
+
|
|
164
|
+
if (toolCalls.length === 0 || round === MAX_TOOL_ROUNDS) {
|
|
165
|
+
// No tool calls or max rounds reached — return text
|
|
166
|
+
return { text: textParts.join('').trim(), totalUsage };
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// Execute tool calls and build tool results
|
|
170
|
+
messages.push({ role: 'assistant', content: response.content });
|
|
171
|
+
|
|
172
|
+
const toolResults: MessageContent[] = toolCalls.map(tc => {
|
|
173
|
+
const call = tc as { type: 'tool_use'; id: string; name: string; input: Record<string, unknown> };
|
|
174
|
+
const result = executeAkbTool(call.name, call.input);
|
|
175
|
+
return { type: 'tool_result' as any, tool_use_id: call.id, content: result } as any;
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
messages.push({ role: 'user', content: toolResults });
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
return { text: '', totalUsage };
|
|
182
|
+
}
|
|
183
|
+
|
|
21
184
|
/**
|
|
22
185
|
* Build a compact company context for chat system prompts.
|
|
23
|
-
*
|
|
24
|
-
* Kept brief to minimize Haiku token cost.
|
|
186
|
+
* Provides a seed overview — the agent can dig deeper via AKB tools.
|
|
25
187
|
*/
|
|
26
188
|
function buildCompanyContext(): string {
|
|
27
189
|
const parts: string[] = [];
|
|
@@ -316,10 +478,27 @@ ${relContext}
|
|
|
316
478
|
|
|
317
479
|
${roleStyle}
|
|
318
480
|
|
|
481
|
+
AKB EXPLORATION (IMPORTANT):
|
|
482
|
+
You have tools to search and read the company knowledge base (AKB). Use them to ground your conversation in REAL company context.
|
|
483
|
+
Before responding, consider: "Is there something in our AKB that relates to this conversation?"
|
|
484
|
+
- search_akb: Search for keywords across the AKB (decisions, projects, journals, waves, standups)
|
|
485
|
+
- read_file: Read a specific file for details
|
|
486
|
+
- list_files: Discover what files exist in a directory
|
|
487
|
+
|
|
488
|
+
Useful paths to explore:
|
|
489
|
+
- operations/decisions/ — CEO decisions (what was decided and why)
|
|
490
|
+
- operations/waves/ — Work dispatches (what CEO asked teams to do)
|
|
491
|
+
- operations/standups/ — Daily standups (what everyone reported)
|
|
492
|
+
- projects/ — Active projects and their tasks
|
|
493
|
+
- roles/${roleId}/journal/ — Your own work journal
|
|
494
|
+
- knowledge/ — Domain knowledge
|
|
495
|
+
|
|
496
|
+
You don't need to search every time. But when the conversation touches on company work, decisions, or direction, DO search to find real facts rather than making up generic discussion.
|
|
497
|
+
|
|
319
498
|
CONVERSATION RULES:
|
|
320
499
|
1. Stay deeply in character — your expertise, vocabulary, and concerns should be DISTINCT from other roles.
|
|
321
500
|
2. Keep it to 1-3 sentences. No walls of text.
|
|
322
|
-
3. Be SPECIFIC. Reference actual projects, files, tools, metrics, or decisions — never vague platitudes.
|
|
501
|
+
3. Be SPECIFIC. Reference actual projects, files, tools, metrics, or decisions from the AKB — never vague platitudes.
|
|
323
502
|
4. Do NOT just agree with everyone. Real teams have different perspectives:
|
|
324
503
|
- If you genuinely disagree, say so (respectfully but firmly)
|
|
325
504
|
- If someone oversimplifies your domain, push back with specifics
|
|
@@ -340,39 +519,40 @@ ANTI-PATTERNS (never do these):
|
|
|
340
519
|
- Using the same emoji pattern as the previous speaker
|
|
341
520
|
- Restating the consensus without adding anything new
|
|
342
521
|
- Meta-commentary about the conversation itself ("wow we actually agreed")
|
|
343
|
-
- Generic statements that any role could say — speak from YOUR expertise
|
|
522
|
+
- Generic statements that any role could say — speak from YOUR expertise
|
|
523
|
+
- Talking about vague "refactoring" or "metrics" without referencing actual company work`;
|
|
344
524
|
|
|
345
525
|
const provider = getLLM();
|
|
346
|
-
|
|
526
|
+
|
|
527
|
+
// Use tool-based agent loop (AnthropicProvider supports tools; ClaudeCliProvider falls back to no-tools)
|
|
528
|
+
const useTools = provider instanceof AnthropicProvider;
|
|
529
|
+
const { text: raw, totalUsage } = await chatWithTools(
|
|
530
|
+
provider,
|
|
347
531
|
systemPrompt,
|
|
348
532
|
[{ role: 'user', content: historyText }],
|
|
533
|
+
useTools,
|
|
349
534
|
);
|
|
350
535
|
|
|
351
|
-
const
|
|
352
|
-
.filter(c => c.type === 'text')
|
|
353
|
-
.map(c => (c as { type: 'text'; text: string }).text)
|
|
354
|
-
.join('')
|
|
355
|
-
.trim()
|
|
356
|
-
.replace(/^["']|["']$/g, '');
|
|
536
|
+
const cleaned = raw.replace(/^["']|["']$/g, '');
|
|
357
537
|
|
|
358
538
|
// Filter out CLI noise and [SILENT]
|
|
359
|
-
const message = (
|
|
539
|
+
const message = (cleaned === '[SILENT]' || cleaned.startsWith('Error: Reached max turns') || !cleaned) ? '' : cleaned;
|
|
360
540
|
|
|
361
541
|
// Record usage in token ledger (category: chat)
|
|
362
|
-
if (
|
|
542
|
+
if (totalUsage) {
|
|
363
543
|
getLedger().record({
|
|
364
544
|
ts: new Date().toISOString(),
|
|
365
545
|
jobId: `chat-${channelId}`,
|
|
366
546
|
roleId,
|
|
367
547
|
model: process.env.SPEECH_MODEL || 'claude-haiku-4-5-20251001',
|
|
368
|
-
inputTokens:
|
|
369
|
-
outputTokens:
|
|
548
|
+
inputTokens: totalUsage.inputTokens ?? 0,
|
|
549
|
+
outputTokens: totalUsage.outputTokens ?? 0,
|
|
370
550
|
});
|
|
371
551
|
}
|
|
372
552
|
|
|
373
553
|
res.json({
|
|
374
554
|
message,
|
|
375
|
-
tokens:
|
|
555
|
+
tokens: totalUsage,
|
|
376
556
|
});
|
|
377
557
|
} catch (err) {
|
|
378
558
|
next(err);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
/*! tailwindcss v4.2.1 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-ease:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-200:oklch(88.5% .062 18.334);--color-red-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-700:oklch(50.5% .213 27.518);--color-red-800:oklch(44.4% .177 26.899);--color-red-900:oklch(39.6% .141 25.723);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-700:oklch(55.5% .163 48.998);--color-green-300:oklch(87.1% .15 154.449);--color-green-400:oklch(79.2% .209 151.711);--color-green-600:oklch(62.7% .194 149.214);--color-green-800:oklch(44.8% .119 151.328);--color-green-900:oklch(39.3% .095 152.535);--color-cyan-300:oklch(86.5% .127 207.078);--color-blue-400:oklch(70.7% .165 254.624);--color-purple-400:oklch(71.4% .203 305.504);--color-gray-50:oklch(98.5% .002 247.839);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-md:28rem;--container-xl:36rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-black:900;--tracking-tight:-.025em;--tracking-wide:.025em;--tracking-wider:.05em;--leading-relaxed:1.625;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--ease-in-out:cubic-bezier(.4, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing) * 0)}.start{inset-inline-start:var(--spacing)}.start\!{inset-inline-start:var(--spacing)!important}.end{inset-inline-end:var(--spacing)}.-top-2{top:calc(var(--spacing) * -2)}.top-0{top:calc(var(--spacing) * 0)}.top-1\.5{top:calc(var(--spacing) * 1.5)}.top-1\/2{top:50%}.top-3{top:calc(var(--spacing) * 3)}.top-16{top:calc(var(--spacing) * 16)}.top-\[5\%\]{top:5%}.top-full{top:100%}.right-0{right:calc(var(--spacing) * 0)}.right-2{right:calc(var(--spacing) * 2)}.right-3{right:calc(var(--spacing) * 3)}.right-4{right:calc(var(--spacing) * 4)}.bottom-0{bottom:calc(var(--spacing) * 0)}.-left-2{left:calc(var(--spacing) * -2)}.-left-\[5px\]{left:-5px}.left-0{left:calc(var(--spacing) * 0)}.left-1\/2{left:50%}.left-2{left:calc(var(--spacing) * 2)}.z-10{z-index:10}.z-40{z-index:40}.z-50{z-index:50}.z-\[1\]{z-index:1}.z-\[44\]{z-index:44}.z-\[45\]{z-index:45}.z-\[60\]{z-index:60}.z-\[61\]{z-index:61}.z-\[62\]{z-index:62}.z-\[63\]{z-index:63}.z-\[70\]{z-index:70}.z-\[80\]{z-index:80}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.mx-1{margin-inline:calc(var(--spacing) * 1)}.mx-auto{margin-inline:auto}.my-0\.5{margin-block:calc(var(--spacing) * .5)}.my-1{margin-block:calc(var(--spacing) * 1)}.my-2{margin-block:calc(var(--spacing) * 2)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mt-auto{margin-top:auto}.mr-1\.5{margin-right:calc(var(--spacing) * 1.5)}.mb-0\.5{margin-bottom:calc(var(--spacing) * .5)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-5{margin-bottom:calc(var(--spacing) * 5)}.ml-0\.5{margin-left:calc(var(--spacing) * .5)}.ml-1{margin-left:calc(var(--spacing) * 1)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-3{margin-left:calc(var(--spacing) * 3)}.ml-6{margin-left:calc(var(--spacing) * 6)}.ml-auto{margin-left:auto}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-3{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.h-0{height:calc(var(--spacing) * 0)}.h-1{height:calc(var(--spacing) * 1)}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-10{height:calc(var(--spacing) * 10)}.h-28{height:calc(var(--spacing) * 28)}.h-32{height:calc(var(--spacing) * 32)}.h-40{height:calc(var(--spacing) * 40)}.h-\[85vh\]{height:85vh}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-32{max-height:calc(var(--spacing) * 32)}.max-h-40{max-height:calc(var(--spacing) * 40)}.max-h-60{max-height:calc(var(--spacing) * 60)}.max-h-\[60px\]{max-height:60px}.max-h-\[80vh\]{max-height:80vh}.max-h-\[90vh\]{max-height:90vh}.max-h-\[120px\]{max-height:120px}.max-h-\[160px\]{max-height:160px}.max-h-\[300px\]{max-height:300px}.max-h-\[400px\]{max-height:400px}.min-h-0{min-height:calc(var(--spacing) * 0)}.min-h-\[240px\]{min-height:240px}.min-h-\[280px\]{min-height:280px}.min-h-\[400px\]{min-height:400px}.w-0{width:calc(var(--spacing) * 0)}.w-1{width:calc(var(--spacing) * 1)}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-2{width:calc(var(--spacing) * 2)}.w-3{width:calc(var(--spacing) * 3)}.w-6{width:calc(var(--spacing) * 6)}.w-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-10{width:calc(var(--spacing) * 10)}.w-16{width:calc(var(--spacing) * 16)}.w-20{width:calc(var(--spacing) * 20)}.w-24{width:calc(var(--spacing) * 24)}.w-\[10px\]{width:10px}.w-\[50px\]{width:50px}.w-\[280px\]{width:280px}.w-\[480px\]{width:480px}.w-\[520px\]{width:520px}.w-\[560px\]{width:560px}.w-\[700px\]{width:700px}.w-\[720px\]{width:720px}.w-\[960px\]{width:960px}.w-full{width:100%}.w-px{width:1px}.max-w-\[85\%\]{max-width:85%}.max-w-\[95vw\]{max-width:95vw}.max-w-\[180px\]{max-width:180px}.max-w-\[200px\]{max-width:200px}.max-w-\[240px\]{max-width:240px}.max-w-\[400px\]{max-width:400px}.max-w-\[1100px\]{max-width:1100px}.max-w-full{max-width:100%}.max-w-md{max-width:var(--container-md)}.max-w-xl{max-width:var(--container-xl)}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-\[200px\]{min-width:200px}.flex-1{flex:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-col-resize{cursor:col-resize}.cursor-pointer{cursor:pointer}.resize{resize:both}.resize-none{resize:none}.resize-y{resize:vertical}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-px{gap:1px}:where(.space-y-0>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 0) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 0) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-y-1{row-gap:calc(var(--spacing) * 1)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-t-lg{border-top-left-radius:var(--radius-lg);border-top-right-radius:var(--radius-lg)}.rounded-tl-sm{border-top-left-radius:var(--radius-sm)}.rounded-tr-sm{border-top-right-radius:var(--radius-sm)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-l-\[3px\]{border-left-style:var(--tw-border-style);border-left-width:3px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-\[var\(--accent\)\]{border-color:var(--accent)}.border-\[var\(--meeting-blue\)\]{border-color:var(--meeting-blue)}.border-\[var\(--terminal-border\)\]{border-color:var(--terminal-border)}.border-\[var\(--terminal-code-border\)\]{border-color:var(--terminal-code-border)}.border-gray-300{border-color:var(--color-gray-300)}.border-gray-600{border-color:var(--color-gray-600)}.border-green-600{border-color:var(--color-green-600)}.border-green-800\/30{border-color:#0166304d}@supports (color:color-mix(in lab,red,red)){.border-green-800\/30{border-color:color-mix(in oklab,var(--color-green-800) 30%,transparent)}}.border-purple-400\/20{border-color:#c07eff33}@supports (color:color-mix(in lab,red,red)){.border-purple-400\/20{border-color:color-mix(in oklab,var(--color-purple-400) 20%,transparent)}}.border-red-200{border-color:var(--color-red-200)}.border-red-300{border-color:var(--color-red-300)}.border-red-400{border-color:var(--color-red-400)}.border-red-800\/30{border-color:#9f07124d}@supports (color:color-mix(in lab,red,red)){.border-red-800\/30{border-color:color-mix(in oklab,var(--color-red-800) 30%,transparent)}}.border-white\/5{border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.border-white\/5{border-color:color-mix(in oklab,var(--color-white) 5%,transparent)}}.border-white\/10{border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.border-white\/10{border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.border-white\/15{border-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){.border-white\/15{border-color:color-mix(in oklab,var(--color-white) 15%,transparent)}}.border-white\/20{border-color:#fff3}@supports (color:color-mix(in lab,red,red)){.border-white\/20{border-color:color-mix(in oklab,var(--color-white) 20%,transparent)}}.border-white\/40{border-color:#fff6}@supports (color:color-mix(in lab,red,red)){.border-white\/40{border-color:color-mix(in oklab,var(--color-white) 40%,transparent)}}.border-t-white{border-top-color:var(--color-white)}.bg-\[\#111\]{background-color:#111}.bg-\[var\(--accent\)\]\/10{background-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.bg-\[var\(--accent\)\]\/10{background-color:color-mix(in oklab,var(--accent) 10%,transparent)}}.bg-\[var\(--desk-wood\)\]{background-color:var(--desk-wood)}.bg-\[var\(--floor-light\)\]{background-color:var(--floor-light)}.bg-\[var\(--hud-bg\)\]{background-color:var(--hud-bg)}.bg-\[var\(--hud-bg-alt\)\]{background-color:var(--hud-bg-alt)}.bg-\[var\(--meeting-blue\)\]{background-color:var(--meeting-blue)}.bg-\[var\(--terminal-bg\)\]{background-color:var(--terminal-bg)}.bg-\[var\(--terminal-bg-deeper\)\]{background-color:var(--terminal-bg-deeper)}.bg-\[var\(--terminal-border\)\]{background-color:var(--terminal-border)}.bg-\[var\(--terminal-border-hover\)\]{background-color:var(--terminal-border-hover)}.bg-\[var\(--terminal-inline-bg\)\]{background-color:var(--terminal-inline-bg)}.bg-\[var\(--terminal-surface\)\]{background-color:var(--terminal-surface)}.bg-\[var\(--terminal-surface-light\)\]{background-color:var(--terminal-surface-light)}.bg-\[var\(--terminal-text-secondary\)\]{background-color:var(--terminal-text-secondary)}.bg-\[var\(--wall\)\]{background-color:var(--wall)}.bg-amber-400{background-color:var(--color-amber-400)}.bg-amber-700{background-color:var(--color-amber-700)}.bg-black\/20{background-color:#0003}@supports (color:color-mix(in lab,red,red)){.bg-black\/20{background-color:color-mix(in oklab,var(--color-black) 20%,transparent)}}.bg-black\/30{background-color:#0000004d}@supports (color:color-mix(in lab,red,red)){.bg-black\/30{background-color:color-mix(in oklab,var(--color-black) 30%,transparent)}}.bg-black\/40{background-color:#0006}@supports (color:color-mix(in lab,red,red)){.bg-black\/40{background-color:color-mix(in oklab,var(--color-black) 40%,transparent)}}.bg-blue-400\/10{background-color:#54a2ff1a}@supports (color:color-mix(in lab,red,red)){.bg-blue-400\/10{background-color:color-mix(in oklab,var(--color-blue-400) 10%,transparent)}}.bg-gray-100{background-color:var(--color-gray-100)}.bg-gray-800{background-color:var(--color-gray-800)}.bg-green-400{background-color:var(--color-green-400)}.bg-green-400\/10{background-color:#05df721a}@supports (color:color-mix(in lab,red,red)){.bg-green-400\/10{background-color:color-mix(in oklab,var(--color-green-400) 10%,transparent)}}.bg-green-900\/20{background-color:#0d542b33}@supports (color:color-mix(in lab,red,red)){.bg-green-900\/20{background-color:color-mix(in oklab,var(--color-green-900) 20%,transparent)}}.bg-green-900\/30{background-color:#0d542b4d}@supports (color:color-mix(in lab,red,red)){.bg-green-900\/30{background-color:color-mix(in oklab,var(--color-green-900) 30%,transparent)}}.bg-purple-400{background-color:var(--color-purple-400)}.bg-red-50{background-color:var(--color-red-50)}.bg-red-400{background-color:var(--color-red-400)}.bg-red-900\/10{background-color:#82181a1a}@supports (color:color-mix(in lab,red,red)){.bg-red-900\/10{background-color:color-mix(in oklab,var(--color-red-900) 10%,transparent)}}.bg-red-900\/20{background-color:#82181a33}@supports (color:color-mix(in lab,red,red)){.bg-red-900\/20{background-color:color-mix(in oklab,var(--color-red-900) 20%,transparent)}}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.bg-white\/5{background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.bg-white\/5{background-color:color-mix(in oklab,var(--color-white) 5%,transparent)}}.bg-white\/10{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.bg-white\/10{background-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.bg-white\/15{background-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){.bg-white\/15{background-color:color-mix(in oklab,var(--color-white) 15%,transparent)}}.bg-white\/20{background-color:#fff3}@supports (color:color-mix(in lab,red,red)){.bg-white\/20{background-color:color-mix(in oklab,var(--color-white) 20%,transparent)}}.bg-white\/60{background-color:#fff9}@supports (color:color-mix(in lab,red,red)){.bg-white\/60{background-color:color-mix(in oklab,var(--color-white) 60%,transparent)}}.bg-gradient-to-l{--tw-gradient-position:to left in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-\[var\(--terminal-bg-deeper\)\]{--tw-gradient-from:var(--terminal-bg-deeper);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-transparent{--tw-gradient-to:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:calc(var(--spacing) * 1)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-8{padding-block:calc(var(--spacing) * 8)}.pt-1\.5{padding-top:calc(var(--spacing) * 1.5)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-2\.5{padding-top:calc(var(--spacing) * 2.5)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pb-0\.5{padding-bottom:calc(var(--spacing) * .5)}.pb-1{padding-bottom:calc(var(--spacing) * 1)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-5{padding-bottom:calc(var(--spacing) * 5)}.pl-2{padding-left:calc(var(--spacing) * 2)}.pl-3{padding-left:calc(var(--spacing) * 3)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:var(--font-mono)}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[0\.9em\]{font-size:.9em}.text-\[8px\]{font-size:8px}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-black{--tw-font-weight:var(--font-weight-black);font-weight:var(--font-weight-black)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-\[\#E57373\]{color:#e57373}.text-\[var\(--active-green\)\]{color:var(--active-green)}.text-\[var\(--desk-dark\)\]{color:var(--desk-dark)}.text-\[var\(--terminal-text\)\]{color:var(--terminal-text)}.text-\[var\(--terminal-text-muted\)\]{color:var(--terminal-text-muted)}.text-\[var\(--terminal-text-secondary\)\]{color:var(--terminal-text-secondary)}.text-amber-300\/90{color:#ffd236e6}@supports (color:color-mix(in lab,red,red)){.text-amber-300\/90{color:color-mix(in oklab,var(--color-amber-300) 90%,transparent)}}.text-amber-400{color:var(--color-amber-400)}.text-amber-400\/70{color:#fcbb00b3}@supports (color:color-mix(in lab,red,red)){.text-amber-400\/70{color:color-mix(in oklab,var(--color-amber-400) 70%,transparent)}}.text-blue-400\/80{color:#54a2ffcc}@supports (color:color-mix(in lab,red,red)){.text-blue-400\/80{color:color-mix(in oklab,var(--color-blue-400) 80%,transparent)}}.text-cyan-300\/70{color:#53eafdb3}@supports (color:color-mix(in lab,red,red)){.text-cyan-300\/70{color:color-mix(in oklab,var(--color-cyan-300) 70%,transparent)}}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-800{color:var(--color-gray-800)}.text-green-300{color:var(--color-green-300)}.text-green-300\/90{color:#7bf1a8e6}@supports (color:color-mix(in lab,red,red)){.text-green-300\/90{color:color-mix(in oklab,var(--color-green-300) 90%,transparent)}}.text-green-400{color:var(--color-green-400)}.text-green-400\/70{color:#05df72b3}@supports (color:color-mix(in lab,red,red)){.text-green-400\/70{color:color-mix(in oklab,var(--color-green-400) 70%,transparent)}}.text-green-400\/80{color:#05df72cc}@supports (color:color-mix(in lab,red,red)){.text-green-400\/80{color:color-mix(in oklab,var(--color-green-400) 80%,transparent)}}.text-purple-400\/50{color:#c07eff80}@supports (color:color-mix(in lab,red,red)){.text-purple-400\/50{color:color-mix(in oklab,var(--color-purple-400) 50%,transparent)}}.text-purple-400\/70{color:#c07effb3}@supports (color:color-mix(in lab,red,red)){.text-purple-400\/70{color:color-mix(in oklab,var(--color-purple-400) 70%,transparent)}}.text-red-200\/70{color:#ffcacab3}@supports (color:color-mix(in lab,red,red)){.text-red-200\/70{color:color-mix(in oklab,var(--color-red-200) 70%,transparent)}}.text-red-200\/80{color:#ffcacacc}@supports (color:color-mix(in lab,red,red)){.text-red-200\/80{color:color-mix(in oklab,var(--color-red-200) 80%,transparent)}}.text-red-300{color:var(--color-red-300)}.text-red-400{color:var(--color-red-400)}.text-red-400\/80{color:#ff6568cc}@supports (color:color-mix(in lab,red,red)){.text-red-400\/80{color:color-mix(in oklab,var(--color-red-400) 80%,transparent)}}.text-red-500{color:var(--color-red-500)}.text-red-700{color:var(--color-red-700)}.text-red-800{color:var(--color-red-800)}.text-white{color:var(--color-white)}.text-white\/30{color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.text-white\/30{color:color-mix(in oklab,var(--color-white) 30%,transparent)}}.text-white\/40{color:#fff6}@supports (color:color-mix(in lab,red,red)){.text-white\/40{color:color-mix(in oklab,var(--color-white) 40%,transparent)}}.text-white\/50{color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.text-white\/50{color:color-mix(in oklab,var(--color-white) 50%,transparent)}}.text-white\/60{color:#fff9}@supports (color:color-mix(in lab,red,red)){.text-white\/60{color:color-mix(in oklab,var(--color-white) 60%,transparent)}}.text-white\/70{color:#ffffffb3}@supports (color:color-mix(in lab,red,red)){.text-white\/70{color:color-mix(in oklab,var(--color-white) 70%,transparent)}}.text-white\/80{color:#fffc}@supports (color:color-mix(in lab,red,red)){.text-white\/80{color:color-mix(in oklab,var(--color-white) 80%,transparent)}}.text-white\/90{color:#ffffffe6}@supports (color:color-mix(in lab,red,red)){.text-white\/90{color:color-mix(in oklab,var(--color-white) 90%,transparent)}}.capitalize{text-transform:capitalize}.uppercase{text-transform:uppercase}.italic{font-style:italic}.underline{text-decoration-line:underline}.underline-offset-2{text-underline-offset:2px}.placeholder-white\/25::placeholder{color:#ffffff40}@supports (color:color-mix(in lab,red,red)){.placeholder-white\/25::placeholder{color:color-mix(in oklab,var(--color-white) 25%,transparent)}}.accent-green-600{accent-color:var(--color-green-600)}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.opacity-\[0\.06\]{opacity:.06}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[-4px_0_20px_rgba\(0\,0\,0\,0\.4\)\]{--tw-shadow:-4px 0 20px var(--tw-shadow-color,#0006);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}@media(hover:hover){.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}.group-hover\/name\:opacity-60:is(:where(.group\/name):hover *){opacity:.6}}.placeholder\:text-\[var\(--terminal-text-muted\)\]::placeholder{color:var(--terminal-text-muted)}@media(hover:hover){.hover\:border-\[var\(--accent\)\]\/50:hover{border-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.hover\:border-\[var\(--accent\)\]\/50:hover{border-color:color-mix(in oklab,var(--accent) 50%,transparent)}}.hover\:border-white\/20:hover{border-color:#fff3}@supports (color:color-mix(in lab,red,red)){.hover\:border-white\/20:hover{border-color:color-mix(in oklab,var(--color-white) 20%,transparent)}}.hover\:bg-\[var\(--desk-wood\)\]:hover{background-color:var(--desk-wood)}.hover\:bg-\[var\(--terminal-inline-bg\)\]:hover{background-color:var(--terminal-inline-bg)}.hover\:bg-\[var\(--terminal-surface\)\]:hover{background-color:var(--terminal-surface)}.hover\:bg-\[var\(--terminal-surface-light\)\]:hover{background-color:var(--terminal-surface-light)}.hover\:bg-black\/30:hover{background-color:#0000004d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-black\/30:hover{background-color:color-mix(in oklab,var(--color-black) 30%,transparent)}}.hover\:bg-gray-50:hover{background-color:var(--color-gray-50)}.hover\:bg-gray-700:hover{background-color:var(--color-gray-700)}.hover\:bg-white\/5:hover{background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/5:hover{background-color:color-mix(in oklab,var(--color-white) 5%,transparent)}}.hover\:bg-white\/10:hover{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/10:hover{background-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.hover\:bg-white\/30:hover{background-color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/30:hover{background-color:color-mix(in oklab,var(--color-white) 30%,transparent)}}.hover\:bg-white\/\[0\.02\]:hover{background-color:#ffffff05}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/\[0\.02\]:hover{background-color:color-mix(in oklab,var(--color-white) 2%,transparent)}}.hover\:text-\[var\(--terminal-text\)\]:hover{color:var(--terminal-text)}.hover\:text-\[var\(--terminal-text-secondary\)\]:hover{color:var(--terminal-text-secondary)}.hover\:text-gray-600:hover{color:var(--color-gray-600)}.hover\:text-green-300:hover{color:var(--color-green-300)}.hover\:text-white:hover{color:var(--color-white)}.hover\:text-white\/70:hover{color:#ffffffb3}@supports (color:color-mix(in lab,red,red)){.hover\:text-white\/70:hover{color:color-mix(in oklab,var(--color-white) 70%,transparent)}}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-70:hover{opacity:.7}.hover\:opacity-90:hover{opacity:.9}.hover\:opacity-100:hover{opacity:1}}.focus\:border-\[var\(--terminal-border-hover\)\]:focus{border-color:var(--terminal-border-hover)}.focus\:border-white\/25:focus{border-color:#ffffff40}@supports (color:color-mix(in lab,red,red)){.focus\:border-white\/25:focus{border-color:color-mix(in oklab,var(--color-white) 25%,transparent)}}.focus\:bg-white\/30:focus{background-color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.focus\:bg-white\/30:focus{background-color:color-mix(in oklab,var(--color-white) 30%,transparent)}}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}@media(min-width:40rem){.sm\:flex{display:flex}.sm\:inline{display:inline}}@media(min-width:48rem){.md\:flex{display:flex}}}:root{--floor-light:#dfe6ee;--floor-dark:#cdd6e0;--wall:var(--terminal-bg,#eef1f7);--wall-shadow:#b0b8c8;--desk-wood:#4a5568;--desk-dark:#374151;--office-border:var(--terminal-border,#cbd5e1);--office-surface:var(--hud-bg-alt,#e8ecf4);--office-code-bg:var(--hud-bg,#edf0f7);--monitor-glow:#60a5fa;--active-green:#34d399;--idle-amber:#fbbf24;--offline-grey:#9ca3af;--meeting-blue:#3b82f6;--accent:#6366f1;--color-cto:#1565c0;--color-cbo:#e65100;--color-pm:#2e7d32;--color-engineer:#4a148c;--color-designer:#ad1457;--color-qa:#00695c;--pixel-border:#4a5568;--pixel-font:"Courier New", monospace;--terminal-bg:#1e1e2e;--terminal-bg-deeper:#181825;--terminal-surface:var(--hud-bg-alt,#252536);--terminal-surface-light:#2d2d40;--terminal-border:#b4c8f014;--terminal-border-hover:#b4c8f02e;--terminal-text:#ebf0ffeb;--terminal-text-secondary:#c8d2f099;--terminal-text-muted:#b4c3e659;--terminal-scrollbar:#b4c8f01a;--terminal-scrollbar-hover:#b4c8f038;--hud-bg:#1a1a2a;--hud-bg-alt:#232335;--hud-border:#b4c8f01a;--terminal-code-bg:#181825;--terminal-code-text:#89b4fa;--terminal-code-border:#b4c8f00f;--terminal-inline-bg:#b4c8f014}body{background:var(--floor-dark);height:100dvh;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;overflow:hidden}#root{flex-direction:column;height:100dvh;display:flex}@keyframes status-pulse{0%,to{box-shadow:0 0 6px #4caf5099}50%{box-shadow:0 0 14px #4caf50e6}}.status-dot-active{animation:2s ease-in-out infinite status-pulse}@keyframes monitor-glow{0%,to{box-shadow:0 0 6px #4a9eff4d}50%{box-shadow:0 0 10px #4a9eff99}}.monitor-active{animation:3s ease-in-out infinite monitor-glow}.side-panel{transition:transform .3s,right .3s;transform:translate(100%)}.side-panel.open{transform:translate(0)}.side-panel:not(.resizing){transition:transform .3s,right .3s,width .2s}.dimmer{opacity:0;pointer-events:none;transition:opacity .3s,right .3s}.dimmer.open{opacity:1;pointer-events:auto}@keyframes pixel-bounce{0%,to{transform:translateY(0)}50%{transform:translateY(-3px)}}@keyframes pixel-float{0%,to{opacity:1;transform:translateY(0)}50%{opacity:.6;transform:translateY(-6px)}}.pixel-card{background:var(--hud-bg-alt);border:3px solid var(--pixel-border);font-family:var(--pixel-font);cursor:pointer;image-rendering:pixelated;flex-direction:column;transition:border-color .15s;display:flex}.pixel-card:hover{border-color:var(--accent);z-index:10}.pixel-card.working{border-color:#ffd600;box-shadow:0 0 12px #ffd60040}.pixel-card--featured{border-width:3px;box-shadow:0 2px 12px #00000026}.pixel-card--featured .pixel-card-hdr{padding:6px 12px;font-size:10px}.pixel-card--featured .pixel-card-task{font-size:9px}.pixel-card-hdr{color:#fff;text-shadow:1px 1px #0006;flex-shrink:0;justify-content:space-between;align-items:center;padding:5px 10px;font-size:9px;font-weight:900;display:flex}.pixel-card-hdr .lvl{background:#0000004d;padding:0 4px;font-size:8px}.pixel-card-body{background:var(--terminal-surface);border-top:2px solid var(--pixel-border);border-bottom:2px solid var(--pixel-border);justify-content:center;align-items:flex-end;height:86px;padding-bottom:2px;display:flex;position:relative;overflow:hidden}.pixel-card--featured .pixel-card-body{height:100px}.pixel-desk{z-index:3;background:#6b5b4b;border:2px solid #4b3b2b;border-top-color:#8b7b6b;width:50%;height:12px;position:absolute;bottom:6px}.pixel-desk:before{content:"";background:#111;border:2px solid #333;width:14px;height:9px;position:absolute;top:-9px;left:50%;transform:translate(-50%)}.pixel-sprite{z-index:2;font-size:28px;animation:1s steps(2,end) infinite pixel-bounce}.pixel-card-body canvas{z-index:1;margin-bottom:-4px;position:relative}.pixel-status-dot{border:2px solid #fff;width:7px;height:7px;position:absolute;bottom:6px;left:6px}.pixel-card-task{font-size:8px;font-family:var(--pixel-font);color:var(--terminal-text-secondary);border-top:1px solid var(--pixel-border);flex-shrink:0;align-items:flex-start;gap:4px;min-height:28px;padding:5px 10px;display:flex}.pixel-card-task-icon{flex-shrink:0;line-height:1.4}.pixel-card-task-text{-webkit-line-clamp:2;-webkit-box-orient:vertical;line-height:1.4;display:-webkit-box;overflow:hidden}.pixel-card--featured .pixel-card-task{min-height:32px;font-size:9px}.pixel-card--hire{border-style:dashed;border-color:var(--pixel-border);cursor:pointer;justify-content:center;align-items:center;transition:border-color .15s,opacity .15s;display:flex}.pixel-card--hire:hover{border-color:var(--accent);opacity:.9}.pixel-card--hire-inner{flex-direction:column;align-items:center;gap:4px;padding:12px;display:flex}.pixel-card--hire-icon{color:var(--terminal-text-muted);font-size:20px;line-height:1}.pixel-card--hire-label{font-size:8px;font-family:var(--pixel-font);color:var(--terminal-text-muted);letter-spacing:1px;font-weight:900}.facility-card-compact{background:var(--hud-bg-alt);border:2px solid var(--pixel-border);font-family:var(--pixel-font);cursor:pointer;flex-direction:column;transition:border-color .15s;display:flex}.facility-card-compact:hover{border-color:var(--accent)}.fcc-hdr{color:#fff;text-shadow:1px 1px #0006;letter-spacing:1px;padding:3px 8px;font-size:8px;font-weight:900}.fcc-canvas{background:var(--terminal-surface);border-top:2px solid var(--pixel-border);justify-content:center;align-items:center;padding:4px 0;display:flex;overflow:hidden}.fcc-canvas canvas{max-height:64px}.fcc-body{border-top:2px solid var(--pixel-border);flex-direction:column;gap:2px;padding:6px 8px;display:flex}.fcc-desc{color:var(--terminal-text-secondary);opacity:.7;margin-bottom:2px;font-size:7px}.fcc-title{color:var(--terminal-text);font-size:9px;font-weight:900}.fcc-meta{color:var(--terminal-text-secondary);font-size:8px}.fcc-item{color:var(--terminal-text-secondary);white-space:nowrap;text-overflow:ellipsis;font-size:7px;overflow:hidden}.pixel-section-label{font-size:9px;font-weight:900;font-family:var(--pixel-font);text-transform:uppercase;letter-spacing:2px;color:var(--terminal-text-secondary);padding:0 2px}.office-board{transition:transform .2s}.office-board:hover{transform:translateY(-2px)}@keyframes cursor-blink{0%,to{opacity:1}50%{opacity:0}}.typing-cursor{animation:.8s step-end infinite cursor-blink}@keyframes subtle-float{0%,to{transform:translateY(0)}50%{transform:translateY(-2px)}}.meeting-room:hover{animation:2s ease-in-out infinite subtle-float}@keyframes wave-pulse{0%,to{box-shadow:0 0 #b71c1c66}50%{box-shadow:0 0 0 6px #b71c1c00}}.wave-btn{animation:3s ease-in-out infinite wave-pulse}@keyframes wave-edge-flow{0%{stroke-dashoffset:20px}to{stroke-dashoffset:0}}.wave-edge-flow{animation:1s linear infinite wave-edge-flow}@keyframes toast-in{0%{opacity:0;transform:translate(120%)}to{opacity:1;transform:translate(0)}}@keyframes toast-out{0%{opacity:1;transform:translate(0)}to{opacity:0;transform:translate(120%)}}.toast-enter{animation:.3s ease-out forwards toast-in}.toast-exit{animation:.3s ease-in forwards toast-out}.floor-grid{background-image:repeating-conic-gradient(var(--floor-light) 0% 25%,var(--floor-dark) 0% 50%);background-size:28px 28px}.floor-grid:after{content:"";pointer-events:none;z-index:0;background:repeating-linear-gradient(0deg,#0000 0,#0000 3px,#00000008 3px,#00000008 4px);position:absolute;top:0;right:0;bottom:0;left:0}.office-markdown p{margin:.35em 0}.office-markdown ul,.office-markdown ol{margin:.35em 0;padding-left:1.25em}.office-markdown li{margin:.2em 0}.office-markdown h1,.office-markdown h2,.office-markdown h3,.office-markdown h4,.office-markdown h5,.office-markdown h6{color:var(--terminal-text);margin:.6em 0 .3em;font-weight:700}.office-markdown h1{font-size:1.15em}.office-markdown h2{border-bottom:1px solid var(--office-border);padding-bottom:.2em;font-size:1.05em}.office-markdown h3{font-size:.95em}.office-markdown strong{color:var(--terminal-text)}.office-markdown a{color:var(--accent);text-decoration:underline}.office-markdown blockquote{border-left:3px solid var(--office-border);color:var(--terminal-text-muted);margin:.5em 0;padding-left:.75em}.office-markdown hr{border:none;border-top:1px solid var(--office-border);margin:.6em 0}.office-table{border-collapse:collapse;width:100%;font-size:.85em}.office-table th,.office-table td{border:1px solid var(--office-border);text-align:left;padding:.35em .6em}.office-table th{background:var(--office-surface);color:var(--terminal-text);font-weight:600}.office-table td{color:var(--terminal-text-secondary)}.office-code-block{background:var(--office-code-bg);border:1px solid var(--office-border);border-radius:8px;overflow:hidden}.office-code-block pre{margin:0}.office-code-block code{color:var(--terminal-text-secondary);font-family:SF Mono,Fira Code,monospace}.terminal-resize-handle:hover{background:var(--terminal-border-hover)}.terminal-scrollbar::-webkit-scrollbar{width:6px}.terminal-scrollbar::-webkit-scrollbar-track{background:0 0}.terminal-scrollbar::-webkit-scrollbar-thumb{background:var(--terminal-scrollbar);border-radius:3px}.terminal-scrollbar::-webkit-scrollbar-thumb:hover{background:var(--terminal-scrollbar-hover)}.terminal-tab-scroll::-webkit-scrollbar{height:2px}.terminal-tab-scroll::-webkit-scrollbar-track{background:0 0}.terminal-tab-scroll::-webkit-scrollbar-thumb{background:var(--terminal-scrollbar);border-radius:1px}.terminal-markdown p{margin:.25em 0}.terminal-markdown ul,.terminal-markdown ol{margin:.25em 0;padding-left:1.25em}.terminal-markdown li{margin:.15em 0}.terminal-markdown h1,.terminal-markdown h2,.terminal-markdown h3,.terminal-markdown h4,.terminal-markdown h5,.terminal-markdown h6{color:var(--terminal-text);margin:.5em 0 .25em;font-weight:700}.terminal-markdown h1{font-size:1.1em}.terminal-markdown h2{font-size:1em}.terminal-markdown h3{font-size:.95em}.terminal-markdown strong{color:#ebf0fff2}.terminal-markdown a{color:#89b4fa;text-decoration:underline}.terminal-markdown blockquote{border-left:3px solid var(--terminal-border-hover);color:var(--terminal-text-secondary);margin:.5em 0;padding-left:.75em}.terminal-markdown hr{border:none;border-top:1px solid var(--terminal-border);margin:.75em 0}.terminal-inline-code{background:var(--terminal-inline-bg);border-radius:3px;padding:.15em .35em;font-family:SF Mono,Fira Code,monospace;font-size:.9em}.terminal-code-block{background:var(--terminal-code-bg);border:1px solid var(--terminal-code-border);border-radius:8px;overflow:hidden}.terminal-code-block pre{margin:0}.terminal-code-block code{color:var(--terminal-code-text);font-family:SF Mono,Fira Code,monospace}.terminal-table{border-collapse:collapse;width:100%;font-size:.85em}.terminal-table th,.terminal-table td{border:1px solid var(--terminal-border);text-align:left;padding:.35em .5em}.terminal-table th{color:var(--terminal-text);background:#ffebcd0d;font-weight:600}.terminal-table td{color:var(--terminal-text-secondary)}.stream-activity-log{border:1px solid var(--terminal-border);background:var(--terminal-bg-deeper);border-radius:8px;margin-bottom:8px;overflow:hidden}.stream-activity-header{cursor:pointer;-webkit-user-select:none;user-select:none;background:#b4c8f008;align-items:center;gap:6px;padding:6px 10px;display:flex}.stream-activity-pulse{background:#60a5fa;border-radius:50%;flex-shrink:0;width:6px;height:6px;animation:1.5s ease-in-out infinite status-pulse-blue;display:inline-block}@keyframes status-pulse-blue{0%,to{box-shadow:0 0 4px #60a5fa80}50%{box-shadow:0 0 10px #60a5fae6}}.stream-activity-summary{font-size:11px;font-family:var(--pixel-font);color:var(--terminal-text-secondary);font-weight:700}.stream-activity-events{flex-direction:column;gap:1px;max-height:280px;padding:4px 10px 8px;display:flex;overflow-y:auto}.stream-event-thinking{border-left:3px solid #a855f780;padding:4px 0 4px 8px;animation:.15s ease-out stream-event-in}.stream-event-thinking-header{cursor:pointer;align-items:center;gap:5px;display:flex}.stream-event-thinking-icon{opacity:.7;background:#a855f7;border-radius:50%;flex-shrink:0;width:6px;height:6px;display:inline-block}.stream-event-thinking-label{color:#c084fc;font-size:11px;font-weight:700;font-family:var(--pixel-font)}.stream-event-thinking-toggle{color:var(--terminal-text-muted);font-size:9px}.stream-event-thinking-content{color:var(--terminal-text-secondary);white-space:pre-wrap;word-break:break-word;max-height:100px;margin-top:4px;padding-left:2px;font-size:11px;line-height:1.5;overflow-y:auto}.stream-event-tool{flex-wrap:wrap;align-items:baseline;gap:4px;padding:3px 0;animation:.15s ease-out stream-event-in;display:flex}.stream-event-tool-badge{font-size:10px;font-weight:700;font-family:var(--pixel-font);color:#89b4fa;background:#89b4fa1f;border:1px solid #89b4fa40;border-radius:3px;flex-shrink:0;padding:1px 6px;line-height:1.5;display:inline-block}.stream-event-tool-path{color:var(--terminal-text-secondary);text-overflow:ellipsis;white-space:nowrap;max-width:280px;font-family:SF Mono,Fira Code,monospace;font-size:10px;overflow:hidden}.stream-event-tool-toggle{color:var(--terminal-text-muted);cursor:pointer;flex-shrink:0;font-size:9px}.stream-event-tool-detail{width:100%;color:var(--terminal-text-muted);white-space:pre-wrap;word-break:break-all;max-height:60px;margin-top:2px;padding-left:8px;font-family:SF Mono,Fira Code,monospace;font-size:9px;overflow-y:auto}.stream-event-dispatch{align-items:baseline;gap:6px;padding:3px 0;animation:.15s ease-out stream-event-in;display:flex}.stream-event-dispatch-badge{font-size:10px;font-weight:700;font-family:var(--pixel-font);color:#fbbf24;background:#fbbf241f;border:1px solid #fbbf2440;border-radius:3px;flex-shrink:0;padding:1px 6px;line-height:1.5;display:inline-block}.stream-event-dispatch-task{color:var(--terminal-text-secondary);text-overflow:ellipsis;white-space:nowrap;font-size:10px;overflow:hidden}.stream-event-dispatch-progress{border-left:2px solid #fbbf2444;align-items:baseline;gap:6px;padding:2px 0 2px 12px;animation:.15s ease-out stream-event-in;display:flex}.stream-event-dispatch-progress-role{font-size:9px;font-weight:700;font-family:var(--pixel-font);color:#fbbf24;opacity:.7;flex-shrink:0}.stream-event-dispatch-progress-status{color:var(--terminal-text-muted);font-size:10px;font-style:italic}.stream-event-dispatch-progress-done{color:#4ade80;font-size:9px;font-weight:600}.stream-event-dispatch-progress-error{color:#f87171;font-size:9px;font-weight:600}@keyframes stream-event-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.td-scene{justify-content:center;align-items:center;width:100%;height:100%;display:flex;position:relative;overflow:hidden}.td-wrap{display:inline-block;position:relative}.td-canvas{image-rendering:pixelated;cursor:pointer}.td-overlay{pointer-events:none;width:100%;height:100%;position:absolute;top:0;left:0;overflow:hidden}.td-nametag{letter-spacing:.5px;color:#fff;text-shadow:0 1px 2px #000000e6;white-space:nowrap;opacity:.9;align-items:center;gap:2px;font-family:Courier New,monospace;font-size:9px;font-weight:700;display:flex;position:absolute;transform:translate(-50%)}.td-dot{border-radius:50%;flex-shrink:0;width:6px;height:6px;display:inline-block}.td-bubble{color:#ccc;white-space:normal;word-break:break-word;-webkit-line-clamp:2;text-overflow:ellipsis;background:#0f0f19eb;border:1px solid #ffffff14;border-radius:8px;-webkit-box-orient:vertical;max-width:220px;padding:3px 8px;font-family:Courier New,monospace;font-size:9px;line-height:1.4;display:-webkit-box;position:absolute;overflow:hidden;transform:translate(-50%)}.td-bubble:after{content:"";border-top:4px solid #0f0f19eb;border-left:4px solid #0000;border-right:4px solid #0000;position:absolute;bottom:-4px;left:50%;transform:translate(-50%)}.td-facility-label{letter-spacing:.5px;color:#fffc;white-space:nowrap;cursor:pointer;pointer-events:auto;background:#0000008c;border:1px solid #ffffff1a;border-radius:3px;padding:1px 5px;font-family:Courier New,monospace;font-size:8px;font-weight:700;transition:all .15s;position:absolute;transform:translate(-50%)}.td-facility-label:hover,.td-facility-label--hover{color:#fff;text-shadow:0 0 6px #fff6;background:#000000bf;border-color:#ffffff4d}@keyframes td-pulse{0%,to{opacity:1}50%{opacity:.4}}.td-edit-btn{color:#8b949e;font-family:var(--pixel-font);cursor:pointer;image-rendering:auto;background:#141923d9;border:2px solid #8b949e4d;align-items:center;gap:4px;padding:6px 12px;font-size:10px;font-weight:900;transition:border-color .2s,color .2s,background .2s;display:flex;position:absolute;bottom:12px;left:12px}.td-edit-btn:hover{color:#fbbf24;border-color:#fbbf2499}.td-edit-btn--active{color:#3b82f6;background:#3b82f626;border-color:#3b82f6b3}.td-edit-btn__icon{font-size:14px;line-height:1}.td-scene--editing:after{content:"";pointer-events:none;z-index:50;border:4px solid #fbbf2499;animation:1.8s ease-in-out infinite edit-border-pulse;position:absolute;top:0;right:0;bottom:0;left:0}@keyframes edit-border-pulse{0%,to{border-color:#fbbf2466}50%{border-color:#fbbf24d9}}.td-edit-banner{color:#fbbf24;letter-spacing:2px;z-index:51;pointer-events:none;text-shadow:0 1px 3px #00000080;background:#fbbf2433;border:2px solid #fbbf24b3;border-radius:4px;padding:6px 24px;font-size:12px;font-weight:700;animation:1.8s ease-in-out infinite edit-banner-pulse;position:absolute;top:10px;left:50%;transform:translate(-50%)}.td-edit-banner__icon{margin-right:4px;font-size:14px}@keyframes edit-banner-pulse{0%,to{opacity:.7}50%{opacity:1}}.td-palette{image-rendering:auto;background:#141923e6;border:2px solid #8b949e4d;gap:2px;padding:4px 6px;display:flex;position:absolute;bottom:12px;left:50%;transform:translate(-50%)}.td-palette__item{cursor:pointer;background:0 0;border:1px solid #0000;justify-content:center;align-items:center;width:28px;height:28px;font-size:14px;transition:background .15s,border-color .15s;display:flex}.td-palette__item:hover{background:#ffffff1a;border-color:#fbbf2480}.td-palette__item--active{background:#3b82f640;border-color:#3b82f6b3}.theme-dropup{background:var(--hud-bg);border:2px solid var(--pixel-border);z-index:60;border-radius:6px;gap:4px;padding:6px 8px;display:flex;position:absolute;bottom:calc(100% + 8px);left:50%;transform:translate(-50%);box-shadow:0 -4px 16px #00000080}.theme-dropup__item{cursor:pointer;background:0 0;border:2px solid #0000;border-radius:4px;flex-direction:column;align-items:center;gap:3px;padding:4px 6px;transition:border-color .15s,background .15s;display:flex}.theme-dropup__item:hover{background:#ffffff0d;border-color:#fff3}.theme-dropup__item--active{border-color:var(--accent);background:#ffffff14}.theme-dropup__swatch{border:1px solid #ffffff26;border-radius:3px;gap:2px;padding:3px 5px;display:flex}.theme-dropup__name{font-size:11px}.td-hire-btn{color:#8b949e;font-family:var(--pixel-font);cursor:pointer;image-rendering:auto;background:#141923d9;border:2px dashed #8b949e66;align-items:center;gap:4px;padding:6px 12px;font-size:10px;font-weight:900;transition:border-color .2s,color .2s,background .2s;display:flex;position:absolute;bottom:12px;right:12px}.td-hire-btn:hover{color:#58a6ff;background:#141923f2;border-color:#58a6ff99}.td-hire-btn__icon{font-size:14px;line-height:1}.view-toggle-btn{font-family:var(--pixel-font);cursor:pointer;border:2px solid var(--pixel-border);background:var(--hud-bg-alt);color:var(--terminal-text);padding:2px 8px;font-size:10px;font-weight:900;transition:background .15s,border-color .15s}.view-toggle-btn.active{background:var(--terminal-bg);border-color:var(--terminal-border-hover);color:var(--active-green)}.customize-overlay{z-index:200;background:#000000a6;justify-content:center;align-items:center;animation:.15s ease-out customizeFadeIn;display:flex;position:fixed;top:0;right:0;bottom:0;left:0}@keyframes customizeFadeIn{0%{opacity:0}to{opacity:1}}.customize-modal{background:var(--hud-bg,#1a1a2a);border:3px solid var(--pixel-border,#4a5568);width:580px;max-width:95vw;max-height:90vh;font-family:var(--pixel-font);flex-direction:column;animation:.2s ease-out customizeSlideIn;display:flex}@keyframes customizeSlideIn{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.customize-header{border-bottom:2px solid var(--pixel-border);background:var(--hud-bg-alt,#232335);justify-content:space-between;align-items:center;padding:0;display:flex}.customize-tabs{gap:0;display:flex}.customize-tab{font-family:var(--pixel-font);cursor:pointer;color:var(--terminal-text-secondary);background:0 0;border:none;border-bottom:2px solid #0000;padding:8px 16px;font-size:11px;font-weight:900;transition:all .15s}.customize-tab:hover{color:var(--terminal-text)}.customize-tab.active{color:var(--accent,#6366f1);border-bottom-color:var(--accent,#6366f1)}.customize-close{font-family:var(--pixel-font);cursor:pointer;width:32px;height:32px;color:var(--terminal-text-secondary);background:0 0;border:none;justify-content:center;align-items:center;margin-right:4px;font-size:12px;font-weight:900;display:flex}.customize-close:hover{color:#ef4444}.customize-body{flex:1;gap:20px;padding:16px;display:flex;overflow-y:auto}.customize-preview{flex-direction:column;align-items:center;gap:10px;min-width:140px;display:flex}.customize-preview-bg{background:var(--terminal-bg,#1e1e2e);border:2px solid var(--pixel-border);justify-content:center;align-items:center;padding:12px 16px 8px;display:flex}.customize-preview-name{color:var(--terminal-text);text-align:center;font-size:10px;font-weight:900}.customize-preview-actions{gap:6px;display:flex}.customize-colors{flex-direction:column;flex:1;gap:10px;min-width:0;display:flex}.customize-row{flex-direction:column;gap:4px;display:flex}.customize-row-header{align-items:center;gap:8px;display:flex}.customize-row-label{color:var(--terminal-text-secondary);min-width:44px;font-size:10px;font-weight:900}.customize-row-current{border:2px solid var(--pixel-border);width:14px;height:14px}.customize-swatches{flex-wrap:wrap;gap:4px;display:flex}.customize-swatch{border:2px solid var(--pixel-border);cursor:pointer;width:22px;height:22px;padding:0;transition:transform .1s,outline-color .1s}.customize-swatch:hover{z-index:1;transform:scale(1.15)}.customize-btn{font-family:var(--pixel-font);cursor:pointer;color:var(--terminal-text-secondary);border:2px solid var(--pixel-border);background:0 0;padding:4px 10px;font-size:10px;font-weight:900;transition:all .15s}.customize-btn--random{background:var(--accent);color:#fff;border-color:var(--accent)}.customize-btn--random:hover{opacity:.85}.customize-btn--reset{color:var(--terminal-text-secondary);background:0 0}.customize-btn--reset:hover{color:var(--terminal-text)}.customize-btn--cancel{color:var(--terminal-text-secondary);background:0 0}.customize-btn--save{background:var(--active-green,#34d399);color:#000;border-color:var(--active-green)}.customize-btn--save:hover{opacity:.85}.customize-footer{border-top:2px solid var(--pixel-border);justify-content:flex-end;gap:8px;padding:10px 16px;display:flex}.customize-themes{grid-template-columns:repeat(3,1fr);gap:12px;width:100%;display:grid}.customize-theme-card{border:2px solid var(--pixel-border);cursor:pointer;font-family:var(--pixel-font);background:0 0;flex-direction:column;gap:6px;padding:0;transition:all .15s;display:flex}.customize-theme-card:hover{border-color:var(--terminal-text-secondary)}.customize-theme-card.active{border-color:var(--accent);box-shadow:0 0 8px var(--accent,#6366f1) 44}.customize-theme-preview{border:1px solid var(--pixel-border);flex-direction:column;height:64px;display:flex;overflow:hidden}.customize-theme-name{color:var(--terminal-text);text-align:center;padding:4px;font-size:10px;font-weight:900}.theme-btn{font-family:var(--pixel-font);cursor:pointer;border:2px solid var(--pixel-border);background:var(--hud-bg-alt);color:var(--terminal-text-secondary);padding:2px 6px;font-size:10px;font-weight:900;transition:all .15s}.theme-btn:hover{color:var(--terminal-text);border-color:var(--terminal-text-secondary)}.side-panel-chat{--terminal-bg:#f8f9fa;--terminal-bg-deeper:#f0f1f3;--terminal-surface:#fff;--terminal-surface-light:#eef0f4;--terminal-border:#00000014;--terminal-border-hover:#00000029;--terminal-text:#1a1a2e;--terminal-text-secondary:#1e28508c;--terminal-text-muted:#1e28504d;--terminal-scrollbar:#0000000f;--terminal-scrollbar-hover:#00000024;--terminal-code-bg:#f0f1f3;--terminal-code-text:#1565c0;--terminal-code-border:#0000000f;--terminal-inline-bg:#f0f1f3}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"<length-percentage>";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"<length-percentage>";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"<length-percentage>";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}
|