codex-telegram 0.5.9__tar.gz → 0.6.0__tar.gz
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.
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/PKG-INFO +1 -1
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/TELEGRAM.md +19 -2
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/WEB.md +44 -12
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/codex_telegram/__init__.py +1 -1
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/codex_telegram.egg-info/PKG-INFO +1 -1
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/codex_telegram.egg-info/SOURCES.txt +2 -2
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/utils/config.py +37 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/web/routes.py +11 -1
- codex_telegram-0.6.0/web/static/dist/assets/index-Cb6qZVCI.css +1 -0
- codex_telegram-0.6.0/web/static/dist/assets/index-wjzNlOuf.js +256 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/web/static/dist/index.html +2 -2
- codex_telegram-0.5.9/web/static/dist/assets/index-DIOICBNe.js +0 -251
- codex_telegram-0.5.9/web/static/dist/assets/index-DW1AcoLg.css +0 -1
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/LICENSE +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/MANIFEST.in +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/README.md +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/app_runtime/__init__.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/app_runtime/bootstrap.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/app_runtime/telegram_app.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/app_runtime/web_server.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/bot/__init__.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/bot/callbacks.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/bot/features_ui.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/bot/handlers.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/bot/keyboard.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/bot/projects_ui.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/bot/skills_ui.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/bot/thread_ui.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/codex/__init__.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/codex/approval_flow.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/codex/approval_guardian.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/codex/client.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/codex/client_pool.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/codex/collaboration_mode.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/codex/command_router/__init__.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/codex/command_router/common.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/codex/command_router/context.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/codex/command_router/contracts.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/codex/command_router/core.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/codex/command_router/projects.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/codex/command_router/review.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/codex/command_router/system.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/codex/command_router/threads.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/codex/commands.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/codex/event_forwarding.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/codex/events.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/codex/protocol.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/codex_telegram/cli.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/codex_telegram.egg-info/dependency_links.txt +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/codex_telegram.egg-info/entry_points.txt +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/codex_telegram.egg-info/requires.txt +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/codex_telegram.egg-info/top_level.txt +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/conf.toml.example +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/main.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/models/__init__.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/models/state.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/models/telegram_bridge.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/models/thread.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/models/user.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/pyproject.toml +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/setup.cfg +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/tests/test_approval_guardian.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/tests/test_approval_policy.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/tests/test_bootstrap_update_check.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/tests/test_callbacks_results.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/tests/test_cli_entrypoint.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/tests/test_codex_client.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/tests/test_codex_client_pool.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/tests/test_command_router.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/tests/test_guardian_config.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/tests/test_handlers_results.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/tests/test_keyboard.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/tests/test_main_approval_flow.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/tests/test_normalize.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/tests/test_pypi_check.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/tests/test_single_instance.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/tests/test_telegram_bot_config.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/tests/test_thread_history.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/tests/test_web_runtime.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/tests/test_web_server_local_command.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/utils/__init__.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/utils/approval_policy.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/utils/local_command.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/utils/logger.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/utils/normalize.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/utils/pypi_check.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/utils/single_instance.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/utils/web_config.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/web/__init__.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/web/dependencies.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/web/runtime.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/web/server.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/web/static/dist/assets/codex-telegram-icon-black.svg +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/web/static/dist/assets/codex-telegram-icon-ivory.svg +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/web/static/dist/assets/codex-telegram-login-image.png +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/web/static/dist/favicon.ico +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/web/telegram_sync.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/web/telegram_thread_selection.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/web/thread_history.py +0 -0
- {codex_telegram-0.5.9 → codex_telegram-0.6.0}/web/workspace.py +0 -0
|
@@ -24,14 +24,17 @@ Execute Codex commands using slash commands in any chat with the bot:
|
|
|
24
24
|
| `/compact <id>` | thread/compact/start | Compact conversation history |
|
|
25
25
|
| `/rollback <n>` | thread/rollback | Roll back last N turns |
|
|
26
26
|
| `/interrupt` | turn/interrupt | Interrupt running turn |
|
|
27
|
-
| `/review` | review/start | Start code review |
|
|
27
|
+
| `/review [uncommittedChanges\|baseBranch\|commit\|custom]` | review/start | Start code review |
|
|
28
28
|
| `/exec <cmd>` | command/exec | Run command |
|
|
29
29
|
| `/models` | model/list | List available models |
|
|
30
30
|
| `/features` | experimentalFeature/list + command/exec | Show beta features |
|
|
31
31
|
| `/guardian` | local config | Show guardian summary |
|
|
32
32
|
| `/modes` | collaborationMode/list | List collaboration modes |
|
|
33
33
|
| `/collab` | collaborationMode/list | List collaboration modes |
|
|
34
|
-
| `/
|
|
34
|
+
| `/mode [toggle\|plan\|build]` | - | Show or set collaboration mode |
|
|
35
|
+
| `/plan` | - | Switch collaboration mode to plan |
|
|
36
|
+
| `/build` | - | Switch collaboration mode to build (default) |
|
|
37
|
+
| `/skills [cwd]` | skills/list | List skills |
|
|
35
38
|
| `/apps` | app/list | List apps |
|
|
36
39
|
| `/mcp` | mcpServerStatus/list | List MCP servers |
|
|
37
40
|
| `/config` | config/read | Read configuration |
|
|
@@ -58,6 +61,7 @@ Configure which events to receive via `telegram.forwarding.app_server_event_allo
|
|
|
58
61
|
- Archive old threads to keep your list clean
|
|
59
62
|
- Compact conversation history to save context
|
|
60
63
|
- Rollback turns to undo mistakes
|
|
64
|
+
- Start code reviews with `/review [uncommittedChanges|baseBranch|commit|custom]`
|
|
61
65
|
|
|
62
66
|
### Project Switching
|
|
63
67
|
|
|
@@ -68,6 +72,19 @@ Manage multiple projects:
|
|
|
68
72
|
3. Use `/project <name>` to switch
|
|
69
73
|
4. Each project maintains separate thread history
|
|
70
74
|
|
|
75
|
+
### Collaboration Mode
|
|
76
|
+
|
|
77
|
+
Control how Codex approaches tasks:
|
|
78
|
+
|
|
79
|
+
| Command | Description |
|
|
80
|
+
|---------|-------------|
|
|
81
|
+
| `/mode` | Show current mode or set to `toggle`, `plan`, or `build` |
|
|
82
|
+
| `/plan` | Switch to plan mode (analyze, don't execute) |
|
|
83
|
+
| `/build` | Switch to build mode (execute changes, default) |
|
|
84
|
+
| `/modes` / `/collab` | List available collaboration modes |
|
|
85
|
+
|
|
86
|
+
Modes are session-local and persist per user. The current mode is shown in the welcome message and when switching projects.
|
|
87
|
+
|
|
71
88
|
## Configuration
|
|
72
89
|
|
|
73
90
|
### Basic Setup
|
|
@@ -47,6 +47,7 @@ The Web UI receives live updates via SSE for:
|
|
|
47
47
|
| `approval_required` | Guardian/approval needed |
|
|
48
48
|
| `file_change` | File modifications with diffs |
|
|
49
49
|
| `app_event` | Tool execution events |
|
|
50
|
+
| `user_message` | User message sent |
|
|
50
51
|
|
|
51
52
|
### Authentication
|
|
52
53
|
|
|
@@ -96,29 +97,39 @@ Guardian provides automated safety checks before approval decisions:
|
|
|
96
97
|
|
|
97
98
|
| Shortcut | Action |
|
|
98
99
|
|----------|--------|
|
|
99
|
-
| `Ctrl/Cmd + Enter` | Send message |
|
|
100
|
+
| `Ctrl/Cmd + Enter` | Send message (or Shift+Enter for newline) |
|
|
100
101
|
| `Tab` | Toggle Build/Plan mode |
|
|
102
|
+
| `Escape` | Close modals / cancel project picker |
|
|
101
103
|
|
|
102
|
-
#### Alt Key Shortcuts
|
|
104
|
+
#### Alt Key Shortcuts (when not in input)
|
|
103
105
|
|
|
104
106
|
| Shortcut | Action |
|
|
105
107
|
|----------|--------|
|
|
106
|
-
| `Alt + N` | New chat |
|
|
107
|
-
| `Alt + T` | New thread tab |
|
|
108
|
-
| `Alt + W` | Close current thread |
|
|
109
|
-
| `Alt + P` | Open project picker |
|
|
110
|
-
| `Alt + [` | Previous thread |
|
|
111
|
-
| `Alt + ]` | Next thread |
|
|
112
|
-
| `Alt + 1-9` | Switch to thread 1-9 |
|
|
113
|
-
| `Alt + V` | Toggle workspace panel |
|
|
108
|
+
| `Alt + N` | New chat (focus composer, start thread) |
|
|
109
|
+
| `Alt + T` | New thread tab (start thread) |
|
|
110
|
+
| `Alt + W` | Close current thread tab |
|
|
111
|
+
| `Alt + P` | Open project picker modal |
|
|
112
|
+
| `Alt + [` | Previous thread in project |
|
|
113
|
+
| `Alt + ]` | Next thread in project |
|
|
114
|
+
| `Alt + 1-9` | Switch to thread 1-9 in current project |
|
|
115
|
+
| `Alt + V` | Toggle workspace panel (compact layout) |
|
|
114
116
|
|
|
115
|
-
####
|
|
117
|
+
#### Ctrl/Cmd Key Shortcuts (when not in input)
|
|
116
118
|
|
|
117
119
|
| Shortcut | Action |
|
|
118
120
|
|----------|--------|
|
|
119
121
|
| `Ctrl/Cmd + B` | Switch to Build mode |
|
|
120
122
|
| `Ctrl/Cmd + Shift + P` | Switch to Plan mode |
|
|
121
123
|
|
|
124
|
+
#### Project Picker Modal
|
|
125
|
+
|
|
126
|
+
| Shortcut | Action |
|
|
127
|
+
|----------|--------|
|
|
128
|
+
| `Up/Down` | Navigate projects |
|
|
129
|
+
| `Enter` | Select project |
|
|
130
|
+
| `Esc` / `Backspace` | Close modal |
|
|
131
|
+
| `Type` | Filter projects by name/key |
|
|
132
|
+
|
|
122
133
|
## API Endpoints
|
|
123
134
|
|
|
124
135
|
### Authentication
|
|
@@ -154,6 +165,7 @@ Guardian provides automated safety checks before approval decisions:
|
|
|
154
165
|
| POST | `/api/projects` | Add project |
|
|
155
166
|
| POST | `/api/projects/select` | Switch project |
|
|
156
167
|
| POST | `/api/projects/open-thread` | Open thread in project |
|
|
168
|
+
| POST | `/api/projects/open-explorer` | Open project folder in OS file explorer |
|
|
157
169
|
|
|
158
170
|
### Workspace
|
|
159
171
|
|
|
@@ -172,7 +184,8 @@ Guardian provides automated safety checks before approval decisions:
|
|
|
172
184
|
| GET | `/api/features` | List features |
|
|
173
185
|
| POST | `/api/features/{key}` | Toggle feature |
|
|
174
186
|
| GET | `/api/models` | List models |
|
|
175
|
-
| GET | `/api/modes` | List modes |
|
|
187
|
+
| GET | `/api/modes` | List collaboration modes |
|
|
188
|
+
| GET | `/api/collab` | List collaboration modes (alias) |
|
|
176
189
|
| GET | `/api/skills` | List skills |
|
|
177
190
|
| GET | `/api/apps` | List apps |
|
|
178
191
|
| GET | `/api/mcp` | List MCP servers |
|
|
@@ -181,6 +194,25 @@ Guardian provides automated safety checks before approval decisions:
|
|
|
181
194
|
| GET | `/api/config` | Get config |
|
|
182
195
|
| POST | `/api/approvals/{id}` | Submit approval |
|
|
183
196
|
|
|
197
|
+
### Approvals
|
|
198
|
+
|
|
199
|
+
| Method | Endpoint | Description |
|
|
200
|
+
|--------|----------|-------------|
|
|
201
|
+
| GET | `/api/approvals` | List pending approval requests |
|
|
202
|
+
| POST | `/api/approvals/{request_id}` | Submit approval decision (approve|session|deny) |
|
|
203
|
+
|
|
204
|
+
### Session
|
|
205
|
+
|
|
206
|
+
| Method | Endpoint | Description |
|
|
207
|
+
|--------|----------|-------------|
|
|
208
|
+
| GET | `/api/session/summary` | Get current session state (active thread, workspace, project, mode, agents) |
|
|
209
|
+
|
|
210
|
+
### Commands
|
|
211
|
+
|
|
212
|
+
| Method | Endpoint | Description |
|
|
213
|
+
|--------|----------|-------------|
|
|
214
|
+
| POST | `/api/command` | Execute any slash command |
|
|
215
|
+
|
|
184
216
|
### Events
|
|
185
217
|
|
|
186
218
|
| Method | Endpoint | Description |
|
|
@@ -92,5 +92,5 @@ web/static/dist/index.html
|
|
|
92
92
|
web/static/dist/assets/codex-telegram-icon-black.svg
|
|
93
93
|
web/static/dist/assets/codex-telegram-icon-ivory.svg
|
|
94
94
|
web/static/dist/assets/codex-telegram-login-image.png
|
|
95
|
-
web/static/dist/assets/index-
|
|
96
|
-
web/static/dist/assets/index-
|
|
95
|
+
web/static/dist/assets/index-Cb6qZVCI.css
|
|
96
|
+
web/static/dist/assets/index-wjzNlOuf.js
|
|
@@ -712,3 +712,40 @@ def save_project_profile(key: str, name: str, path: str) -> None:
|
|
|
712
712
|
)
|
|
713
713
|
|
|
714
714
|
config_path.write_text(updated, encoding="utf-8")
|
|
715
|
+
|
|
716
|
+
|
|
717
|
+
def remove_project_profile(key: str) -> None:
|
|
718
|
+
_ensure_config_exists()
|
|
719
|
+
config_path = _get_config_path()
|
|
720
|
+
raw = config_path.read_text(encoding="utf-8")
|
|
721
|
+
parsed = tomllib.loads(raw) if raw.strip() else {}
|
|
722
|
+
|
|
723
|
+
projects = parsed.get("projects")
|
|
724
|
+
if not isinstance(projects, dict) or key not in projects:
|
|
725
|
+
raise ValueError(f"Project key '{key}' not found.")
|
|
726
|
+
|
|
727
|
+
if parsed.get("project") == key:
|
|
728
|
+
raise ValueError(f"Cannot remove the active project '{key}'. Switch to another project first.")
|
|
729
|
+
|
|
730
|
+
lines = raw.splitlines(keepends=True)
|
|
731
|
+
result: list[str] = []
|
|
732
|
+
i = 0
|
|
733
|
+
while i < len(lines):
|
|
734
|
+
line = lines[i]
|
|
735
|
+
stripped = line.strip()
|
|
736
|
+
if stripped == f"[projects.{key}]":
|
|
737
|
+
i += 1
|
|
738
|
+
while i < len(lines):
|
|
739
|
+
next_line = lines[i]
|
|
740
|
+
next_stripped = next_line.strip()
|
|
741
|
+
if next_stripped.startswith("[") and not next_stripped.startswith("[projects."):
|
|
742
|
+
break
|
|
743
|
+
if next_stripped.startswith("[projects.") and next_stripped != f"[projects.{key}]":
|
|
744
|
+
break
|
|
745
|
+
i += 1
|
|
746
|
+
continue
|
|
747
|
+
result.append(line)
|
|
748
|
+
i += 1
|
|
749
|
+
|
|
750
|
+
updated = "".join(result).rstrip() + "\n"
|
|
751
|
+
config_path.write_text(updated, encoding="utf-8")
|
|
@@ -16,7 +16,7 @@ from codex_telegram import __version__
|
|
|
16
16
|
from codex.collaboration_mode import codex_mode_name
|
|
17
17
|
from models import state
|
|
18
18
|
from models.user import user_manager
|
|
19
|
-
from utils.config import get, get_web_password, reload, save_project_profile
|
|
19
|
+
from utils.config import get, get_web_password, reload, remove_project_profile, save_project_profile
|
|
20
20
|
from utils.local_command import resolve_command_cwd
|
|
21
21
|
from utils.normalize import clamp_int, parse_bool
|
|
22
22
|
from web.dependencies import (
|
|
@@ -698,6 +698,16 @@ def register_project_routes(app: FastAPI) -> None:
|
|
|
698
698
|
raise HTTPException(status_code=400, detail=str(exc)) from exc
|
|
699
699
|
return await route_command("/projects", ["--list"], session.user_id)
|
|
700
700
|
|
|
701
|
+
@app.delete("/api/projects/{project_key}")
|
|
702
|
+
async def remove_project(project_key: str, request: Request) -> dict[str, Any]:
|
|
703
|
+
session = await session_from_request(request)
|
|
704
|
+
try:
|
|
705
|
+
remove_project_profile(project_key)
|
|
706
|
+
reload()
|
|
707
|
+
except ValueError as exc:
|
|
708
|
+
raise HTTPException(status_code=400, detail=str(exc)) from exc
|
|
709
|
+
return await route_command("/projects", ["--list"], session.user_id)
|
|
710
|
+
|
|
701
711
|
@app.post("/api/projects/select")
|
|
702
712
|
async def select_project(payload: dict[str, Any], request: Request) -> dict[str, Any]:
|
|
703
713
|
session = await session_from_request(request)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@charset "UTF-8";@import"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;700&display=swap";:root{--bg: #fdfcfc;--bg-soft: #f8f7f7;--panel: #fdfcfc;--panel-soft: #f1eeee;--border: rgba(15, 0, 0, .12);--border-strong: #646262;--text: #201d1d;--muted: #646262;--brand: #201d1d;--brand-strong: #0f0000;--accent: #007aff;--accent-hover: #0056b3;--danger: #ff3b30;--warning: #ff9f0a;--success: #30a14e;--icon-btn-active-color: #9a9898;--space-1: 4px;--space-2: 8px;--space-3: 12px;--space-4: 16px;--radius-sm: 4px;--radius-md: 4px;--radius-lg: 4px;--radius-card: 8px;--radius-modal: 12px;--radius-pill: 10px;--radius-xl: 14px;--shadow-sm: none;--shadow-md: none;--font-size-xs: 11px;--font-size-sm: 12px;--font-size-body: 13px;--font-size-md: 14px;--layer-modal: 1200;color-scheme:light}:root[data-theme=dark]{--bg: #201d1d;--bg-soft: #292525;--panel: #201d1d;--panel-soft: #302c2c;--border: rgba(253, 252, 252, .16);--border-strong: #9a9898;--text: #fdfcfc;--muted: #b7b3b3;--brand: #fdfcfc;--brand-strong: #f1eeee;--accent: #5fa8ff;--accent-hover: #8bc0ff;--danger: #ff6961;--warning: #ffb340;--success: #4bd66f;--icon-btn-active-color: #7e7b7b;color-scheme:dark}*{box-sizing:border-box}html{background:var(--bg)}body{margin:0;color:var(--text);background:var(--bg);font-family:JetBrains Mono,IBM Plex Mono,ui-monospace,SFMono-Regular,Consolas,monospace;font-size:14px;line-height:1.5;height:100vh;overflow:hidden}button,input,textarea,select{font-family:inherit;color:inherit}button,input,textarea,select{border-radius:var(--radius-sm)}button:focus-visible,textarea:focus-visible,select:focus-visible,[tabindex]:focus-visible{outline:2px solid var(--accent);outline-offset:2px}input:focus,input:focus-visible{outline:none}*{scrollbar-width:thin;scrollbar-color:var(--border-strong) transparent}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--border-strong);border-radius:3px}::-webkit-scrollbar-thumb:hover{background:var(--muted)}.app{display:flex;height:100vh;overflow:hidden}.sidebar{width:300px;border-right:1px solid var(--border);background:linear-gradient(180deg,#181f2cf5,#121823f5);padding:0 2px 0 16px;overflow:hidden;flex:0 0 auto;display:flex;flex-direction:column;min-height:0;box-shadow:inset -1px 0 #ffffff0a;position:relative;z-index:4}.sidebar-content{display:flex;flex:1;min-height:0;flex-direction:column;overflow-y:auto;padding-top:0;padding-bottom:16px}.sidebar.collapsed{padding:12px 8px;overflow:hidden}.sidebar-resizer{width:2px;cursor:col-resize;background:transparent;border-right:none}.sidebar-resizer-collapsed{width:0;pointer-events:none}.sidebar-resizer:hover,.sidebar-resizer.active{background:transparent}.brand{font-size:19px;font-weight:800;margin-bottom:14px;letter-spacing:.4px;text-transform:uppercase;color:#9ed7ff;font-family:JetBrains Mono,IBM Plex Mono,ui-monospace,monospace;display:flex;align-items:center;gap:8px}.sidebar-brand-logo{width:48px;height:48px;flex:0 0 auto;object-fit:contain}.sidebar-header-row{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:12px;container-type:inline-size;position:sticky;top:0;z-index:2;background:var(--panel);padding-top:16px}@container (max-width: 230px){.sidebar-header-row .brand span{display:none}}.sidebar-header-row .brand{margin-bottom:0;flex:1;min-width:0;overflow:hidden}.sidebar-header-row .brand span{white-space:nowrap;min-width:0;overflow:hidden;flex-shrink:1}.sidebar-top-actions{display:flex;align-items:center;gap:8px;flex:0 0 auto}.menu{display:flex;flex-direction:column;gap:8px;margin-bottom:16px}.menu button{padding:10px 12px;border:1px solid var(--border);background:var(--panel);border-radius:0;text-align:left;cursor:pointer}.panel{background:linear-gradient(180deg,#19202df5,#141b26fa);border:1px solid var(--border);border-radius:0;padding:12px;margin-bottom:12px;box-shadow:var(--shadow-sm)}.sidebar-content>.panel:last-child{margin-bottom:0}.panel h3{margin:0 0 10px;font-size:var(--font-size-body);letter-spacing:.4px;text-transform:uppercase;color:var(--muted)}.panel-head{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:10px}.panel-head h3{margin:0}.panel-note{margin-bottom:10px;font-size:var(--font-size-sm);line-height:1.5;color:var(--muted)}.ui-empty-state{color:var(--muted)}.ui-empty-state-notice{line-height:1.5}.thread-list{max-height:230px;overflow-y:auto;overflow-x:hidden}.threads-panel{flex:1;display:flex;flex-direction:column;min-height:0}.threads-panel .thread-list{flex:1;max-height:none;min-height:0}.sidebar-footer{flex-shrink:0;padding-top:12px;padding-bottom:16px;display:flex;align-items:center;gap:8px}.sidebar.collapsed .sidebar-footer{padding-top:0;margin-top:auto}.sidebar.collapsed .sidebar-settings-btn{min-width:0}.sidebar-collapsed-header{display:flex;align-items:center;justify-content:center;width:100%;height:36px;margin-bottom:8px}.sidebar-expand-btn{min-width:0}.sidebar-toggle-btn{display:inline-flex;align-items:center;justify-content:center;min-height:36px;min-width:36px;padding:0 6px;border:0;background:transparent;color:var(--muted);cursor:pointer;border-radius:var(--radius-sm)}.sidebar-toggle-btn:hover{background:var(--panel-soft);border-radius:var(--radius-card);padding:0 4px}.sidebar-toggle-btn svg{width:16px;height:16px;flex-shrink:0;fill:none;stroke:currentColor}.sidebar-top-actions .ui-icon-button{border:0;background:transparent}.sidebar-top-actions .ui-icon-button:hover:not(:disabled){border:0}.sidebar-top-actions .ui-icon-button:focus-visible{outline:none}.sidebar-top-actions .notify-toggle:hover,.sidebar-top-actions .theme-toggle:hover{background:var(--panel-soft);border-radius:var(--radius-card)}.sidebar-top-actions .sidebar-toggle-btn:hover{background:var(--panel-soft);border-radius:var(--radius-card);padding:0 4px}.sidebar-top-actions .notify-toggle.on{background:transparent;border-color:transparent}.sidebar-settings-btn{flex:1;min-height:36px;display:inline-flex;align-items:center;gap:8px;padding:0 8px;border:0;background:transparent;color:var(--muted);font:inherit;font-size:var(--font-size-body);text-align:left;cursor:pointer;border-radius:var(--radius-sm);transition:color .14s ease,background .14s ease}.sidebar-settings-btn:hover{color:var(--text);background:var(--bg-soft)}.sidebar.collapsed .sidebar-settings-btn:hover{border-radius:var(--radius-card)}.sidebar-settings-btn.active{color:var(--text);background:var(--panel-soft)}.sidebar-settings-btn svg{width:16px;height:16px;flex-shrink:0}.sidebar.collapsed .sidebar-settings-btn{flex:0 0 auto;padding:0;min-width:28px;justify-content:center}.sidebar-settings-popover{position:fixed;z-index:1210;padding:12px;background:var(--bg);border:1px solid var(--border);border-radius:var(--radius-pill);box-shadow:0 4px 24px #0000002e,0 1px 6px #0000001f;overflow:visible}.thread-item{width:100%;max-width:100%;min-width:0;text-align:left;border:0;background:transparent;border-radius:0;padding:9px 10px;margin-bottom:0;cursor:pointer;position:relative;overflow:hidden}.thread-item:hover{background:var(--bg-soft)}.thread-item:disabled{opacity:.55;cursor:not-allowed}.thread-item.active{background:#15223199;box-shadow:inset 0 -3px 0 0 var(--accent)}.project-list{display:flex;flex-direction:column;gap:6px}.project-item{margin-bottom:0}.thread-title{font-weight:600;font-size:var(--font-size-body);margin-bottom:2px;overflow-wrap:anywhere}.project-item .thread-title{display:flex;align-items:center;gap:6px}.thread-sub{font-size:var(--font-size-xs);color:var(--muted);word-break:break-all;overflow-wrap:anywhere}.project-pill,.panel-toggle{display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--border);border-radius:0;font-size:var(--font-size-xs);line-height:1}.project-pill{padding:3px 7px;background:#2563eb1a;color:var(--accent)}.panel-toggle{min-height:28px;padding:10px;background:#122030eb;color:var(--text);cursor:pointer;transition:transform .12s ease,background .16s ease,border-color .16s ease}.projects-section{position:sticky;top:64px;z-index:1;background:var(--panel);margin-bottom:12px}.projects-section>.panel-head{padding-right:4px;border-radius:var(--radius-sm);transition:background-color .1s}.projects-section>.panel-head:hover{background:var(--bg-soft)}.projects-toggle{display:inline-flex;align-items:center;gap:4px;border:0;background:transparent;cursor:pointer;padding:0 0 0 6px;margin-left:0;color:inherit}.projects-toggle-label{padding-right:6px;font-size:var(--font-size-body);font-weight:600;color:var(--muted)}.projects-toggle-chevron{flex-shrink:0;display:inline-flex;color:var(--muted)}.projects-toggle-chevron svg{width:14px;height:14px}.projects-busy-note{font-size:var(--font-size-xs);color:var(--muted);margin-left:6px}.project-flat-list{display:flex;flex-direction:column;gap:2px}.project-context-menu{position:fixed;min-width:192px;background:var(--panel);border:1px solid var(--border);border-radius:var(--radius-sm);box-shadow:0 4px 16px #0000002e;padding:4px 0;z-index:1300}.project-context-menu-item{display:flex;align-items:center;gap:8px;width:100%;padding:7px 14px;border:0;border-radius:0;background:transparent;color:var(--text);font-size:var(--font-size-body);text-align:left;cursor:pointer;justify-content:flex-start}.ui-icon-button.project-context-menu-item{border:0;background:transparent;color:var(--text)}.ui-icon-button.project-context-menu-item:hover:not(:disabled){background:var(--bg-soft);border:0}.ui-icon-button.project-context-menu-item:focus-visible{outline:none}.project-context-menu-item svg{width:14px;height:14px;flex-shrink:0;fill:none;stroke:currentColor;color:var(--muted)}.project-context-menu-item span{flex:1;text-align:left}.projects-dropdown{display:inline-flex;align-items:center}.projects-dropdown-toggle{display:inline-flex;align-items:center;gap:4px;border:0;background:transparent;cursor:pointer;padding:6px 10px;margin-left:4px;color:var(--muted);font-size:var(--font-size-body);font-weight:600;border-radius:var(--radius-sm)}.projects-dropdown-toggle:hover{background:var(--bg-soft);color:var(--text)}.projects-dropdown-label{padding-right:4px}.projects-dropdown-toggle svg{width:14px;height:14px}.projects-dropdown-menu{min-width:160px;background:var(--panel);border:1px solid var(--border);border-radius:var(--radius-sm);box-shadow:0 4px 16px #0000002e;padding:4px 0;margin-top:4px}.projects-dropdown-item{display:flex;align-items:center;gap:8px;width:100%;padding:7px 14px;border:0;border-radius:0;background:transparent;color:var(--text);font-size:var(--font-size-body);text-align:left;cursor:pointer}.projects-dropdown-item:hover{background:var(--bg-soft)}.projects-dropdown-item svg{width:14px;height:14px;flex-shrink:0;fill:none;stroke:currentColor;color:var(--muted)}.modal-field{margin-bottom:16px}.modal-field label{display:block;font-size:var(--font-size-sm);font-weight:600;color:var(--text);margin-bottom:6px}.add-project-input{width:100%}.modal-hint{display:block;font-size:var(--font-size-xs);color:var(--muted);margin-top:4px}.modal-error{color:var(--danger);font-size:var(--font-size-sm);margin-bottom:12px;padding:8px 12px;background:#ef44441a;border:1px solid rgba(239,68,68,.3);border-radius:var(--radius-sm)}.project-flat-item{display:flex;align-items:center;gap:2px;padding-right:4px;border-radius:var(--radius-sm)}.project-flat-item:hover{background:var(--bg-soft)}.project-name-group{flex:1;min-width:0;display:flex;align-items:center;gap:4px;position:relative}.project-badge-d{flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;border-radius:3px;background:var(--accent);color:#fff;font-size:10px;font-weight:700;line-height:1}.project-base-name{flex:1;min-width:0;overflow:hidden;display:flex;align-items:center;gap:6px;padding:7px 6px;background:transparent;border:0;color:var(--text);font-size:var(--font-size-body);cursor:pointer;text-align:left;border-radius:var(--radius-sm)}.project-base-name:disabled{opacity:.55;cursor:not-allowed}.project-name-spacer{flex:1;align-self:stretch;border:0;background:transparent;padding:0;cursor:pointer;min-width:0}.project-base-name svg{width:14px;height:14px;flex-shrink:0;fill:none;stroke:currentColor;color:var(--muted)}.project-name-text{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.project-action-btn{flex-shrink:0;width:26px;height:26px;padding:0;display:inline-flex;align-items:center;justify-content:center;background:transparent;border:0;color:var(--muted);cursor:pointer;border-radius:var(--radius-sm);opacity:0;pointer-events:none;transition:opacity .1s}.project-flat-item:hover .project-action-btn,.project-session-header:hover .project-action-btn,.project-action-btn:focus-visible,.projects-section>.panel-head:hover .projects-header-dropdown .project-action-btn,.projects-header-dropdown .project-action-btn[aria-expanded=true]{opacity:1;pointer-events:auto}.ui-icon-button.project-action-btn{border:0}.ui-icon-button.project-action-btn:hover:not(:disabled){background:transparent;border:0}.ui-icon-button.project-action-btn:focus-visible{outline:none}.project-action-btn:disabled{opacity:.4;cursor:not-allowed}.project-action-btn svg{width:16px;height:16px;fill:none;stroke:currentColor}.project-flat-item{margin-bottom:2px}.project-session-row{display:flex;flex-direction:column;border-left:3px solid transparent;margin-bottom:2px;border-radius:var(--radius-sm)}.project-session-row.active{color:var(--text)}.project-session-row.state-running .project-session-name svg{color:var(--accent)}.project-session-row.state-running .project-session-title{color:var(--accent)}.project-session-header:hover{background:var(--bg-soft);border-radius:var(--radius-sm)}.project-session-row.state-unread{font-weight:600}.project-session-row.state-unread .project-session-name svg{color:var(--success)}.project-session-row.state-unread .project-session-title{color:var(--success)}.project-session-row.state-failed .project-session-name svg{color:var(--danger)}.project-session-row.state-failed .project-session-title{color:var(--danger)}.project-session-row.state-cancelled .project-session-name svg{color:var(--muted)}.project-session-row.state-cancelled .project-session-title{color:var(--muted)}.project-session-header{display:flex;align-items:center;min-height:34px;gap:2px;padding-right:4px}.project-session-name{flex:1;min-width:0;overflow:hidden;display:flex;align-items:center;gap:6px;text-align:left;background:transparent;border:0;padding:7px 30px 7px 4px;cursor:pointer;color:var(--text);font-size:var(--font-size-body)}.project-session-name svg{width:14px;height:14px;flex-shrink:0;fill:none;stroke:currentColor;color:var(--muted)}.project-session-name:disabled{opacity:.55;cursor:not-allowed}.project-session-toggle{position:absolute;right:0;top:0;bottom:0;width:26px;background:transparent;border:0;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--muted);z-index:1}.project-session-toggle svg{width:14px;height:14px}.project-thread-list{padding-left:12px;padding-bottom:4px}.panel-toggle:hover:not(:disabled){background:#182c43f5;border-color:#3f556f;transform:translateY(-1px)}.panel-toggle.active{background:#14635c57;border-color:#2ec4b670;color:#bff6ef}.meta-line{font-size:var(--font-size-sm);color:var(--muted);margin-top:6px}.meta-value{font-size:var(--font-size-sm);word-break:break-all}.agent-item{display:flex;justify-content:space-between;border:1px solid var(--border);border-radius:0;padding:7px 8px;font-size:var(--font-size-sm);width:100%;align-items:center;gap:8px}.agent-item.on{background:#14635c57;border-color:#2ec4b670;color:#bff6ef}.agent-item.off{background:#0b1420db;color:var(--muted)}.agent-item.clickable{cursor:pointer;transition:transform .16s ease,box-shadow .16s ease,border-color .16s ease}.agent-item.clickable:hover:not(:disabled){transform:translateY(-1px);box-shadow:0 10px 20px #02081452;border-color:#3f556f}.agent-item.static{cursor:default}.agent-item:disabled{opacity:.7}.agent-list{display:flex;flex-direction:column;gap:6px}.agent-row{display:flex;gap:6px;align-items:stretch}.agent-settings-btn{display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--border);background:#122030eb;color:var(--text);border-radius:0;width:36px;min-width:36px;padding:0;cursor:pointer;font-size:var(--font-size-sm)}.agent-settings-icon{width:14px;height:14px;fill:none;stroke:currentColor;flex:0 0 auto}.agent-settings-btn svg{width:14px;height:14px;fill:none;stroke:currentColor;flex:0 0 auto}.agent-settings-btn:hover:not(:disabled){background:#182c43f5;border-color:#3f556f}.agent-settings-btn:disabled{opacity:.65;cursor:not-allowed}.agent-error{margin-top:10px;color:var(--danger);font-size:var(--font-size-sm)}.agent-settings-card{margin-top:12px;padding-top:12px;border-top:1px solid #2a3b50}.agent-settings-head{display:flex;justify-content:space-between;align-items:center;gap:8px;margin-bottom:10px;font-size:var(--font-size-body)}.agent-status-chip{display:inline-flex;align-items:center;border-radius:0;padding:4px 8px;font-size:var(--font-size-xs);border:1px solid var(--border)}.agent-status-chip.on{background:#14635c57;border-color:#2ec4b670;color:#bff6ef}.agent-status-chip.off{background:#0b1420db;color:var(--muted)}.agent-settings-form{display:flex;flex-direction:column;gap:10px}.ui-form-field{display:flex;flex-direction:column;gap:6px}.ui-form-field-label{font-size:var(--font-size-sm);color:var(--muted)}.agent-field-textarea{min-height:240px;resize:vertical;border:1px solid var(--border);border-radius:0;padding:10px 12px;background:#0e1724;color:var(--text);font:12px/1.5 ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,monospace}.ui-form-field-help{font-size:var(--font-size-xs);color:var(--muted)}.agent-settings-actions{display:flex;justify-content:flex-end;gap:8px}.agent-settings-action{width:36px;min-width:36px;height:36px;display:inline-flex;align-items:center;justify-content:center;border:none;background:transparent;color:var(--muted);border-radius:0;cursor:pointer;transition:color .16s ease}.agent-settings-action svg{width:16px;height:16px;fill:none;stroke:currentColor}.agent-settings-action-primary{color:var(--brand)}.agent-settings-action:hover:not(:disabled){border-radius:var(--radius-card);background:var(--panel-soft)}.agent-settings-action:active:not(:disabled){color:var(--icon-btn-active-color);background:transparent}.agent-settings-action:disabled{opacity:.65;cursor:not-allowed}.agent-settings-empty{font-size:var(--font-size-sm);color:var(--muted)}.agent-settings-summary{border:1px solid var(--border);border-radius:0;background:#0e1724eb;padding:10px 12px}.agent-settings-summary-title{font-size:var(--font-size-sm);font-weight:600;color:var(--text)}.agent-settings-summary-actions{display:flex;flex-wrap:wrap;gap:8px;margin-top:8px;font-size:var(--font-size-xs);color:var(--muted)}.agent-settings-summary-list{display:flex;flex-direction:column;gap:6px;margin-top:8px}.agent-settings-summary-item{display:flex;justify-content:space-between;gap:12px;font-size:var(--font-size-sm);color:var(--muted)}.agent-settings-summary-footer{display:flex;justify-content:flex-end;margin-top:10px}.agent-settings-inline-btn{display:inline-flex;align-items:center;gap:8px;border:1px solid var(--border);background:#122030eb;color:var(--text);border-radius:0;padding:7px 12px;cursor:pointer;font-size:var(--font-size-sm);transition:transform .12s ease,background .16s ease,border-color .16s ease}.agent-settings-inline-btn svg{width:14px;height:14px;fill:none;stroke:currentColor;flex:0 0 auto}.agent-settings-inline-btn:hover:not(:disabled){background:#182c43f5;border-color:#3f556f;transform:translateY(-1px)}.agent-settings-inline-btn.active{background:#14635c57;border-color:#2ec4b670;color:#bff6ef}.agent-settings-inline-btn:disabled{opacity:.65;cursor:not-allowed}.setting-toggle{flex-shrink:0;width:36px;height:20px;border-radius:var(--radius-pill);border:0;background:var(--border-strong, #3f556f);cursor:pointer;position:relative;padding:0;transition:background .2s ease}.setting-toggle:after{content:"";position:absolute;top:2px;left:2px;width:16px;height:16px;border-radius:50%;background:#fff;transition:transform .2s ease;box-shadow:0 1px 3px #0000004d}.setting-toggle.on{background:#2563eb}.setting-toggle.on:after{transform:translate(16px)}.setting-toggle:disabled{opacity:.5;cursor:not-allowed}.guardian-section{padding:2px 0 12px;border-bottom:1px solid var(--border)}.guardian-section .panel-head{margin-bottom:8px}.guardian-toggle{display:inline-flex;align-items:center;gap:4px;border:0;background:transparent;cursor:pointer;padding:0 0 0 6px;color:inherit;flex:1;min-width:0}.guardian-toggle-label{font-size:var(--font-size-body);font-weight:600;color:var(--text);padding-right:6px}.guardian-toggle-chevron{flex-shrink:0;display:inline-flex;color:var(--muted)}.guardian-toggle-chevron svg{width:14px;height:14px}.guardian-settings-body{padding:4px 0 0 6px;display:flex;flex-direction:column;gap:10px}.setting-dropdown{position:relative}.setting-dropdown-trigger{width:100%;display:flex;align-items:center;gap:8px;min-height:36px;padding:8px 14px;border:1px solid transparent;background:var(--bg-soft);color:var(--text);font:inherit;font-size:var(--font-size-body);text-align:left;cursor:pointer;border-radius:var(--radius-xl);transition:border-color .14s ease,background .14s ease,box-shadow .14s ease}.setting-dropdown-trigger:hover:not(:disabled){border-color:var(--border-strong)}.setting-dropdown-trigger.open{border-color:var(--border-strong);box-shadow:0 0 0 2px color-mix(in srgb,var(--border-strong) 16%,transparent)}.setting-dropdown-trigger:disabled{opacity:.55;cursor:not-allowed}.setting-dropdown-value{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text)}.setting-dropdown-chevron{flex-shrink:0;display:inline-flex;color:var(--muted)}.setting-dropdown-chevron svg{width:14px;height:14px}.setting-dropdown-menu{position:absolute;top:calc(100% + 4px);left:0;right:0;z-index:300;background:var(--panel);border:1px solid var(--border);border-radius:var(--radius-xl);box-shadow:0 12px 30px #00000038;overflow:hidden;padding:5px}.setting-dropdown-item{width:100%;display:flex;align-items:center;justify-content:space-between;gap:12px;min-height:38px;padding:9px 12px;border:0;background:transparent;color:var(--text);font:inherit;font-size:var(--font-size-body);text-align:left;cursor:pointer;border-radius:var(--radius-pill);transition:background .1s}.setting-dropdown-item:hover,.setting-dropdown-item:focus-visible{background:var(--bg-soft);outline:none}.setting-dropdown-item.selected{color:var(--text)}.setting-dropdown-check{color:var(--text);font-size:15px;font-weight:600;flex-shrink:0;line-height:1}.setting-dropdown-check svg{width:14px;height:14px}.sidebar-settings-popover{overflow:visible}.sidebar-agents-panel{min-width:280px;display:flex;flex-direction:column;gap:10px}.enabled-agents-list{padding-bottom:12px;border-bottom:1px solid var(--border)}.running-subagents-section{padding:2px 0 12px 6px;border-bottom:1px solid var(--border)}.running-subagents-head{display:flex;align-items:center;justify-content:space-between;gap:12px}.running-subagents-toggle{display:inline-flex;align-items:center;gap:8px;min-width:0;padding:0;border:0;background:transparent;color:var(--text);cursor:pointer;font:inherit}.running-subagents-title{font-size:var(--font-size-body);font-weight:600}.running-subagents-chevron{flex:0 0 auto;display:inline-flex;color:var(--muted)}.running-subagents-chevron svg{width:14px;height:14px}.running-subagents-count{flex:0 0 auto;color:var(--muted);font-size:var(--font-size-xs)}.running-subagents-list{display:flex;flex-direction:column;gap:2px;margin-top:8px}.running-subagent-item{min-height:38px;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:6px 0;background:transparent}.running-subagent-identity{min-width:0;display:flex;flex-direction:column;gap:2px}.running-subagent-name{overflow:hidden;color:var(--text);font-size:var(--font-size-sm);text-overflow:ellipsis;white-space:nowrap}.running-subagent-role{overflow:hidden;color:var(--muted);font-size:var(--font-size-xs);text-overflow:ellipsis;white-space:nowrap}.running-subagent-status{flex:0 0 auto;display:inline-flex;align-items:center;gap:6px;color:var(--muted);font-size:var(--font-size-xs)}.running-subagent-status-dot{width:7px;height:7px;flex:0 0 auto;border-radius:50%;background:var(--success)}.guardian-rules-section{padding:2px 0 0 6px}.guardian-rules-head{display:flex;align-items:center;justify-content:space-between;gap:12px}.guardian-rules-head h3{margin:0;color:var(--text);font-size:var(--font-size-body);font-weight:600;letter-spacing:0;text-transform:none}.guardian-rules-status{color:var(--muted);font-size:var(--font-size-xs)}.guardian-rules-actions{display:flex;flex-wrap:wrap;gap:6px 12px;margin-top:10px;color:var(--muted);font-size:var(--font-size-xs)}.guardian-rules-actions span{display:inline-flex;align-items:center;gap:4px}.guardian-rules-actions strong{color:var(--text);font-weight:600}.guardian-rules-empty{margin:10px 0 0;color:var(--muted);font-size:var(--font-size-sm)}.workspace-right-sidebar{flex:0 0 auto;display:flex;flex-direction:column;height:100%;border-left:1px solid var(--border);background:var(--panel);overflow:hidden}.workspace-right-sidebar.closed{width:44px;align-items:center;padding-top:12px}.workspace-panel-closed-header{display:flex;align-items:center;justify-content:center;width:100%;height:36px;margin-bottom:8px}.workspace-right-sidebar .workspace-panel{border:none;box-shadow:none}.workspace-right-sidebar .workspace-panel.desktop{margin-top:0;height:100%}.workspace-right-resizer{width:12px;flex:0 0 12px;margin:0 -6px;position:relative;z-index:5;cursor:col-resize;touch-action:none;background:transparent;border-left:1px solid transparent}.workspace-right-resizer:hover,.workspace-right-resizer.active{background:var(--panel-soft);border-left-color:var(--border-strong)}.app.workspace-expanded .main,.app.workspace-expanded .workspace-right-resizer{display:none}.app.workspace-expanded .workspace-right-sidebar{flex:1 1 auto}.app.workspace-expanded .workspace-right-sidebar .workspace-panel{flex:1 1 auto;width:auto;min-width:0;max-width:none}.app.workspace-expanded .workspace-right-sidebar .workspace-panel.desktop{height:100%}.guardian-rules-footer{margin-top:12px}.guardian-rules-configure{width:100%;min-height:36px;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:8px 12px;border:1px solid var(--border);border-radius:var(--radius-pill);background:transparent;color:var(--text);cursor:pointer;font:inherit;font-size:var(--font-size-sm);transition:background .14s ease,border-color .14s ease}.guardian-rules-configure:hover:not(:disabled),.guardian-rules-configure.active{background:var(--bg-soft);border-color:var(--border-strong)}.guardian-rules-configure:disabled{opacity:.55;cursor:not-allowed}.guardian-rules-configure svg{width:14px;height:14px}.main{flex:1;display:flex;flex-direction:column;min-width:0;min-height:0;overflow:hidden;padding:14px;position:relative}.workspace-layout{flex:1;min-width:0;min-height:0;display:flex;gap:14px;align-items:stretch}.center-pane{flex:1;min-width:0;min-height:0;display:flex;flex-direction:column}.workspace-panel{width:520px;min-width:340px;max-width:900px;min-height:0;border:1px solid var(--border);border-radius:0;background:linear-gradient(180deg,#0d1623f5,#0a121efa);box-shadow:var(--shadow-sm);display:flex;flex-direction:column;overflow:hidden;flex:0 0 auto}.workspace-panel-shell{position:relative;flex:0 0 auto;height:100%;min-height:0;display:flex;align-self:stretch}.workspace-panel-rail{width:40px;height:40px;flex:0 0 40px;align-self:flex-start;display:flex;align-items:center;justify-content:center;border:1px solid var(--border);border-radius:0;background:var(--panel);box-shadow:var(--shadow-sm)}.workspace-panel-rail-toggle{width:40px;height:40px;border:0;background:transparent;color:var(--text);cursor:pointer}.workspace-panel-rail-toggle svg{width:18px;height:18px}.chat-header{min-height:44px;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:0 10px 0 14px;border-bottom:1px solid var(--border);background:var(--panel)}.chat-header-title{min-width:0;margin:0;color:var(--text);font-size:var(--font-size-md);font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;cursor:context-menu}.chat-header-add,.session-tab-close,.session-tab-add{flex:0 0 auto;border-color:transparent;background:transparent;color:var(--muted)}.chat-header-add:hover:not(:disabled),.session-tab-close:hover:not(:disabled),.session-tab-add:hover:not(:disabled){border-color:var(--border);background:var(--bg-soft);color:var(--text)}.project-session-title{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.app,.main,.workspace-layout,.center-pane{background:var(--bg)}.sidebar{background:var(--panel);border-color:var(--border);box-shadow:none}.brand{color:var(--text);font-size:16px;font-weight:700;letter-spacing:0;display:flex;align-items:center;gap:8px}.panel,.agent-settings-card,.agent-settings-summary{background:transparent;border-color:var(--border);border-radius:0;box-shadow:none}.panel h3,.panel-head h3,.agent-settings-summary-title{font-size:var(--font-size-body);letter-spacing:0;text-transform:uppercase}.thread-item,.project-item,.agent-item,.project-pill,.panel-toggle,.agent-settings-btn,.agent-settings-inline-btn,.notify-toggle,.theme-toggle{background:transparent;border-color:var(--border);border-radius:var(--radius-sm);box-shadow:none;color:var(--text)}.thread-item:hover,.project-item:hover,.agent-item.clickable:hover:not(:disabled),.panel-toggle:hover:not(:disabled),.agent-settings-btn:hover:not(:disabled),.agent-settings-inline-btn:hover:not(:disabled){background:var(--bg-soft);border-color:var(--border-strong);transform:none}.notify-toggle:hover,.theme-toggle:hover{background:var(--bg-soft);border-color:var(--border-strong);border-radius:var(--radius-card);transform:none}.thread-item.active,.panel-toggle.active,.agent-settings-inline-btn.active,.notify-toggle.on{background:var(--panel-soft);border-color:var(--text);color:var(--text)}.agent-item.on,.agent-status-chip.on{background:color-mix(in srgb,var(--success) 12%,transparent);border-color:var(--success);color:var(--text)}.agent-item.off,.agent-status-chip.off{background:transparent;border-color:var(--border);color:var(--muted)}.threads-section{margin-bottom:12px}.threads-toggle{display:inline-flex;align-items:center;gap:4px;border:0;background:transparent;cursor:pointer;padding:0 0 0 6px;color:inherit}.threads-toggle-label{font-size:var(--font-size-body);font-weight:600;color:var(--muted);padding-right:6px}.threads-toggle-chevron{flex-shrink:0;display:inline-flex;color:var(--muted)}.threads-toggle-chevron svg{width:14px;height:14px}.threads-list{display:flex;flex-direction:column;gap:4px;padding-top:6px}.thread-tab-item{min-width:0;min-height:34px;display:flex;align-items:center;border:0;border-radius:var(--radius-sm);background:transparent;color:var(--text);font-size:var(--font-size-body);margin-bottom:2px}.telegram-thread-badge{width:16px;height:16px;flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;border-radius:3px;background:var(--accent);color:#fff;font-size:10px;font-weight:700;line-height:1}.thread-tab-item:hover{background:var(--bg-soft)}.thread-tab-item.active{background:var(--bg-soft);color:var(--text)}.thread-tab-item.state-running .session-tab-title{color:var(--accent)}.thread-tab-item.state-completed .session-tab-title{color:var(--success)}.thread-tab-item.state-failed .session-tab-title{color:var(--danger)}.thread-tab-item.state-cancelled .session-tab-title{color:var(--warning)}.thread-tab-item.unread{font-weight:600}.session-tab-main{flex:1;min-width:0;align-self:stretch;display:flex;align-items:center;gap:6px;border:0;padding:7px 6px;background:transparent;color:inherit;text-align:left;cursor:pointer}.session-tab-title{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.session-tab-dot{width:7px;height:7px;flex:0 0 auto;background:var(--success)}.thread-tab-item.state-failed .session-tab-dot{background:var(--danger)}.thread-tab-item.state-cancelled .session-tab-dot{background:var(--warning)}.session-tab-close{width:26px;height:26px;margin-right:3px;opacity:0;pointer-events:none;transition:opacity .1s}.thread-tab-item:hover .session-tab-close{opacity:1;pointer-events:auto}.ui-icon-button.session-tab-close{border:0}.ui-icon-button.session-tab-close:hover:not(:disabled){background:transparent;border:0}.ui-icon-button.session-tab-close:focus-visible{outline:none}.session-tab-add{width:100%;min-height:32px}.threads-compose-btn{flex-shrink:0;width:26px;height:26px;padding:0;display:inline-flex;align-items:center;justify-content:center;background:transparent;border:0;color:var(--muted);cursor:pointer;border-radius:var(--radius-sm);opacity:0;pointer-events:none;transition:opacity .1s}.threads-section .panel-head:hover .threads-compose-btn{opacity:1;pointer-events:auto}.ui-icon-button.threads-compose-btn{border:0}.ui-icon-button.threads-compose-btn:hover:not(:disabled){background:transparent;border:0}.ui-icon-button.threads-compose-btn:focus-visible{outline:none}.threads-compose-btn:disabled{opacity:.4;cursor:not-allowed}.threads-compose-btn svg{width:16px;height:16px;fill:none;stroke:currentColor}.notify-toggle{height:34px;border:1px solid var(--border);border-radius:0;background:var(--panel-soft);color:var(--text);display:inline-flex;align-items:center;gap:8px;padding:0 10px;cursor:pointer}.notify-toggle svg{width:16px;height:16px;fill:none;stroke:currentColor}.notify-toggle.on{border-color:var(--success)}.notify-toggle.mobile{width:36px;min-width:36px;padding:0;justify-content:center}.notify-toggle.mobile span{display:none}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;background:color-mix(in srgb,var(--text) 36%,transparent);display:flex;align-items:center;justify-content:center;z-index:1200;padding:16px;-webkit-backdrop-filter:none;backdrop-filter:none}.modal-card{width:fit-content;min-width:min(420px,100vw - 32px);max-width:min(680px,100vw - 32px);background:var(--panel);border:1px solid var(--border-strong);border-radius:20px;box-shadow:none;padding:16px;color:var(--text)}.ui-modal-backdrop{z-index:var(--layer-modal);background:color-mix(in srgb,var(--text) 36%,transparent);-webkit-backdrop-filter:none;backdrop-filter:none}.ui-modal-card{background:var(--panel);border:1px solid var(--border-strong);border-radius:20px;box-shadow:none;color:var(--text)}.ui-button{border-radius:var(--radius-sm);padding:12px 14px;cursor:pointer;box-shadow:none;font-family:inherit;transition:background .16s ease,border-color .16s ease,color .16s ease}.ui-button:disabled{cursor:not-allowed;opacity:.58}.ui-button-primary{border:1px solid var(--brand);background:var(--brand);color:var(--bg)}.ui-button-primary:hover:not(:disabled){background:var(--brand-strong);border-color:var(--brand-strong)}.ui-button-secondary,.ui-button-ghost{border:1px solid var(--border);background:transparent;color:var(--text)}.ui-button-secondary:hover:not(:disabled),.ui-button-ghost:hover:not(:disabled){background:var(--bg-soft);border-color:var(--border-strong)}.ui-input,.ui-textarea,.ui-select,.project-picker-input{width:100%;padding:10px 12px;border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--bg-soft);color:var(--text);font-size:var(--font-size-md);outline:none;box-shadow:none}.ui-textarea{resize:vertical}.ui-textarea:focus,.ui-select:focus{background:var(--panel);border-color:var(--text);box-shadow:none}.ui-input:focus,.project-picker-input:focus{background:var(--panel);box-shadow:none}.ui-input:disabled,.ui-textarea:disabled,.ui-select:disabled{opacity:.65;cursor:not-allowed}.ui-badge,.project-picker-badge{display:inline-flex;align-items:center;justify-content:center;border-radius:var(--radius-sm);padding:2px 6px;font-size:10px;line-height:1.2;font-family:inherit}.ui-badge-neutral{background:var(--panel-soft);color:var(--muted)}.ui-badge-accent{background:var(--text);color:var(--bg)}.ui-icon-button{display:inline-flex;align-items:center;justify-content:center;border:0;border-radius:var(--radius-sm);background:transparent;color:var(--muted);cursor:pointer;font-family:inherit;transition:background .16s ease,color .16s ease,opacity .16s ease}.ui-icon-button:disabled{cursor:not-allowed;opacity:.5}.ui-icon-button:hover:not(:disabled){background:var(--panel-soft)}.ui-icon-button:active:not(:disabled){color:var(--icon-btn-active-color);background:transparent}.ui-icon-button.is-active{color:var(--text)}.modal-header{display:flex;align-items:center;justify-content:space-between;padding:14px 20px}.modal-header-title{font-weight:700;font-size:16px;color:var(--brand)}.modal-close-btn{background:transparent;border:none;cursor:pointer;color:var(--muted);font-size:20px;line-height:1;padding:0 4px}.modal-close-btn:hover{color:var(--text)}.modal-divider{height:1px;background:var(--border);margin:0 20px}.modal-body{padding:20px}.modal-title{font-weight:700;color:var(--text);margin-bottom:8px}.modal-desc{color:var(--muted);margin-bottom:14px}.modal-actions{display:flex;gap:12px;flex-wrap:nowrap}.modal-actions .ui-button{flex:0 0 auto;white-space:nowrap;height:44px;border-radius:var(--radius-modal)}.project-picker-modal{width:min(480px,100vw - 32px);padding:0;max-height:70vh;display:flex;flex-direction:column;background:var(--panel);border:1px solid var(--border-strong);border-radius:20px;box-shadow:none;color:var(--text)}.project-picker-search{padding:12px;border-bottom:1px solid var(--border)}.project-picker-list{overflow-y:auto;max-height:400px}.project-picker-empty{padding:24px;text-align:center;color:var(--muted)}.project-picker-item{width:100%;display:flex;align-items:center;gap:8px;padding:10px 12px;background:transparent;border:none;border-radius:0;cursor:pointer;text-align:left;transition:background .1s}.project-picker-item:hover,.project-picker-item.selected{background:var(--bg-soft);color:var(--text)}.project-picker-name{font-weight:500;flex:1}.project-picker-key{font-size:var(--font-size-sm);color:var(--muted)}.project-picker-footer{padding:8px 12px;border-top:1px solid var(--border);display:flex;gap:16px;font-size:var(--font-size-sm);color:var(--muted)}.open-in-telegram-modal{width:min(420px,100vw - 32px);padding:16px;display:flex;flex-direction:column;gap:12px}.open-in-telegram-existing{display:flex;flex-direction:column;gap:4px;min-width:0;padding:10px 12px;background:var(--bg-soft);color:var(--muted);font-size:var(--font-size-sm);margin-bottom:14px}.open-in-telegram-existing-label{font-weight:600}.open-in-telegram-existing-value{display:flex;align-items:baseline;gap:6px;min-height:0;color:var(--text)}.open-in-telegram-existing-id{flex:0 0 auto;color:var(--muted);font-family:ui-monospace,monospace}.open-in-telegram-existing-title,.open-in-telegram-target{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.open-in-telegram-target{color:var(--text);font-size:var(--font-size-body);font-weight:600;margin-bottom:14px}.open-in-telegram-error{color:var(--danger);font-size:var(--font-size-sm);line-height:1.5;margin-bottom:14px}.open-in-telegram-actions{justify-content:flex-end}.shortcut-modal{width:min(600px,100vw - 32px);max-height:80vh;display:flex;flex-direction:column;padding:0;background:var(--panel);border:1px solid var(--border-strong);border-radius:20px;box-shadow:none;color:var(--text)}.shortcut-modal-header{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--border)}.shortcut-modal-header h2{margin:0;font-size:18px;font-weight:600}.shortcut-modal-close{background:transparent;border:1px solid var(--border);border-radius:var(--radius-sm);font-size:24px;cursor:pointer;color:var(--text);padding:0 4px;line-height:1;font-family:inherit}.shortcut-modal-close:hover{background:var(--bg-soft);border-color:var(--border-strong)}.shortcut-modal-content{overflow-y:auto;padding:16px 20px;display:grid;grid-template-columns:1fr 1fr;gap:20px}.shortcut-section h3{margin:0 0 10px;font-size:var(--font-size-body);font-weight:600;color:var(--brand);text-transform:uppercase;letter-spacing:.05em}.shortcut-list{display:flex;flex-direction:column;gap:6px}.shortcut-item{display:flex;align-items:center;justify-content:space-between;padding:6px 0;background:transparent;border-radius:0}.shortcut-desc{font-size:var(--font-size-md);color:var(--text)}.shortcut-modal-footer{padding:12px 20px;border-top:1px solid var(--border);font-size:var(--font-size-sm);color:var(--muted);text-align:center}kbd{display:inline-block;padding:3px 7px;font-size:var(--font-size-sm);font-family:inherit;color:var(--text);background:var(--panel-soft);border:1px solid var(--border);border-radius:var(--radius-sm);box-shadow:none;margin:0 2px}.workspace-panel-resizer{width:6px;position:absolute;top:0;bottom:0;left:-6px;cursor:col-resize;background:transparent;border-left:1px solid transparent;z-index:1}.workspace-panel-resizer:hover,.workspace-panel-resizer.active{background:linear-gradient(180deg,#253346eb,#1b2739f5);border-left-color:#3b516b}.workspace-panel-head{padding:14px 14px 10px;display:flex;align-items:center;justify-content:space-between;gap:10px;border-bottom:1px solid rgba(36,53,72,.92)}.workspace-panel-title{font-size:var(--font-size-sm);font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:#8eb5de}.workspace-panel-subtitle{margin-top:4px;font-size:var(--font-size-body);color:var(--text);word-break:break-word}.workspace-refresh{width:36px;height:36px;border-radius:0;border:1px solid var(--border);background:#0c1420db;color:var(--text);display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.workspace-refresh svg{width:16px;height:16px;fill:none;stroke:currentColor}.workspace-refresh:hover{background:#132134f0;border-color:#516a8acc}.workspace-tree{flex:1;min-height:0;overflow:auto;padding:8px 8px 14px}.workspace-tree-node{min-width:max-content}.workspace-tree-item{width:max-content;min-width:100%;border:0;background:transparent;border-radius:0;display:flex;align-items:center;gap:6px;min-height:23px;padding:1px 8px;color:var(--text);cursor:pointer;text-align:left}.workspace-tree-item:hover{background:#182538e0}.workspace-tree-item.selected{background:#1c385cc7}.workspace-tree-icon{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center}.workspace-tree-icon.caret{width:14px;color:#8ea2c0}.workspace-tree-icon.glyph{width:16px;color:#9bb2d1}.workspace-tree-icon svg{width:16px;height:16px;fill:none;stroke:currentColor}.workspace-tree-label{flex:0 0 auto;min-width:0;overflow:visible;text-overflow:clip;white-space:nowrap;font-size:var(--font-size-body)}.workspace-tree-label-compact{font-weight:600;letter-spacing:-.01em}.workspace-panel.desktop{margin-top:12px;height:calc(100% - 12px)}.workspace-sidebar-topbar{min-height:48px;display:flex;align-items:center;gap:8px;padding:8px 10px;border-bottom:1px solid var(--border);background:var(--panel)}.workspace-file-tabs{flex:1;min-width:0;display:flex;align-items:center}.workspace-file-tab{max-width:100%;min-height:34px;display:inline-flex;align-items:center;gap:8px;padding:0 12px;border:1px solid transparent;border-radius:var(--radius-modal);background:transparent;color:var(--muted);font-size:var(--font-size-body);white-space:nowrap}.workspace-file-tab.active{border-color:var(--border);background:var(--bg-soft);color:var(--text)}.workspace-file-tab-icon{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;color:currentColor}.workspace-file-tab-icon svg{width:16px;height:16px;fill:none;stroke:currentColor}.workspace-file-tab-label{min-width:0;overflow:hidden;text-overflow:ellipsis}.workspace-panel-collapse{flex:0 0 auto;width:32px;height:32px;display:inline-flex;align-items:center;justify-content:center;border:0;border-radius:var(--radius-card);background:transparent;color:var(--muted);cursor:pointer}.workspace-panel-collapse:hover{background:var(--panel-soft)}.workspace-panel-collapse svg{width:16px;height:16px}.workspace-sidebar-body{flex:1;min-width:0;min-height:0;display:flex;flex-direction:row;background:var(--panel)}.workspace-structure-panel{flex:0 1 auto;min-width:140px;min-height:0;display:flex;flex-direction:column;background:var(--panel)}.workspace-structure-resizer{flex:0 0 8px;border-left:1px solid var(--border);background:var(--panel);cursor:col-resize;touch-action:none}.workspace-structure-resizer:hover,.workspace-structure-resizer.active,.workspace-structure-resizer:focus-visible{background:var(--panel-soft);border-left-color:var(--border-strong)}.workspace-preview-pane{flex:1 1 auto;min-width:140px}.workspace-structure-head{min-height:56px;display:flex;align-items:center;justify-content:space-between;gap:10px;padding:10px 10px 8px;border-bottom:1px solid var(--border)}.workspace-structure-title{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text);font-size:var(--font-size-body);font-weight:600}.workspace-structure-subtitle{margin-top:2px;color:var(--muted);font-size:var(--font-size-xs)}.workspace-unified-head{min-height:48px;display:flex;align-items:center;justify-content:space-between;gap:10px;padding:8px 10px;border-bottom:1px solid var(--border);background:var(--panel)}.workspace-unified-head-path{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--muted);font-size:var(--font-size-sm)}.workspace-unified-head-actions{flex:0 0 auto;display:flex;align-items:center;gap:6px;margin-left:auto}.workspace-unified-action{width:32px;height:32px;padding:0;display:inline-flex;align-items:center;justify-content:center;border:0;border-radius:var(--radius-sm);background:transparent;color:var(--muted);cursor:pointer;transition:color .16s ease}.workspace-unified-action svg{width:16px;height:16px;fill:none;stroke:currentColor}.workspace-unified-expand svg{fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}.workspace-unified-action:hover{background:var(--panel-soft);border-radius:var(--radius-card)}.workspace-unified-action:active:not(:disabled){color:var(--icon-btn-active-color);background:transparent}.workspace-unified-action.active{color:var(--text)}.workspace-file-viewer{display:flex;flex-direction:column;overflow:hidden;background:var(--panel)}.workspace-tree-badge{flex:0 0 auto;min-width:24px;padding:2px 6px;border-radius:0;background:#202d3fdb;font-size:var(--font-size-xs);font-weight:700;text-align:center}.workspace-tree-item.status-m .workspace-tree-label,.workspace-tree-item.status-m .workspace-tree-badge{color:#b86a00}.workspace-tree-item.status-a .workspace-tree-label,.workspace-tree-item.status-a .workspace-tree-badge{color:#0a7a51}.workspace-tree-item.status-r .workspace-tree-label,.workspace-tree-item.status-r .workspace-tree-badge{color:#1864b8}.workspace-tree-item.status-d .workspace-tree-label,.workspace-tree-item.status-d .workspace-tree-badge,.workspace-tree-item.deleted .workspace-tree-label,.workspace-tree-item.deleted .workspace-tree-badge{color:#b42318}.workspace-tree-item.status-untracked .workspace-tree-label,.workspace-tree-item.status-untracked .workspace-tree-badge{color:#7a4cb3}.workspace-tree-group{margin-bottom:12px;padding-bottom:6px;border-bottom:1px solid rgba(36,53,72,.9)}.workspace-tree-group-label{padding:4px 8px 8px;font-size:var(--font-size-xs);font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:var(--muted)}.workspace-panel-state{padding:10px 8px;color:var(--muted);font-size:var(--font-size-sm);line-height:1.5}.workspace-preview-shell{margin-top:12px;min-height:0;flex:0 0 auto;display:flex;flex-direction:column}.workspace-preview-panel{min-height:0;height:100%;max-height:none;border:1px solid rgba(68,101,140,.82);border-radius:0;background:linear-gradient(180deg,#0d1623f5,#0a121efa);box-shadow:var(--shadow-sm);overflow:hidden;display:flex;flex-direction:column}.workspace-preview-backdrop{z-index:1250}.workspace-preview-modal{position:relative;width:min(860px,100vw - 32px);height:min(560px,100vh - 32px);max-width:calc(100vw - 32px);max-height:calc(100vh - 32px);padding:0;overflow:hidden;-webkit-user-select:text;user-select:text}.workspace-preview-modal.resizing{-webkit-user-select:none;user-select:none}.workspace-preview-panel.diff-mode{max-height:none}.workspace-preview-inline{flex:1;min-width:0;min-height:0;width:100%;height:100%;border:0;border-radius:0;box-shadow:none}.workspace-preview-head{display:flex;align-items:center;justify-content:flex-start;gap:10px;flex-wrap:wrap;padding:12px 14px;border-bottom:1px solid rgba(36,53,72,.92)}.workspace-preview-copy{min-width:0}.workspace-preview-title{font-size:var(--font-size-sm);font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:#8eb5de}.workspace-preview-path{margin-top:4px;font-size:var(--font-size-body);color:var(--text);word-break:break-word}.workspace-preview-actions{display:flex;align-items:center;gap:8px;margin-left:auto;flex-shrink:0}.workspace-preview-action{width:36px;height:36px;padding:0;display:inline-flex;align-items:center;justify-content:center}.workspace-preview-action svg{width:16px;height:16px;fill:none;stroke:currentColor}.workspace-preview-close{border:1px solid var(--border);background:#0c1420db;color:var(--text);border-radius:0;cursor:pointer}.workspace-preview-close:hover{background:#132134f0;border-color:#516a8acc}.workspace-preview-empty,.workspace-preview-note{padding:14px;color:var(--muted);font-size:var(--font-size-sm)}.workspace-file-viewer>.workspace-preview-empty{flex:1;min-height:0;display:flex;align-items:center;justify-content:center}.workspace-preview-body{flex:1 1 auto;min-width:0;min-height:0;overflow:auto;padding-right:12px;padding-bottom:12px}.workspace-preview-resizer{position:absolute;z-index:3}.workspace-preview-resizer-width{top:48px;right:-1px;width:12px;bottom:12px;cursor:ew-resize}.workspace-preview-resizer-height{left:12px;right:12px;bottom:-1px;height:12px;cursor:ns-resize}.workspace-preview-resizer-width:hover,.workspace-preview-resizer-width:active,.workspace-preview-resizer-height:hover,.workspace-preview-resizer-height:active{background:linear-gradient(180deg,#253346fa,#1b2739fa)}.workspace-preview-resizer-width:before{content:"";position:absolute;left:50%;top:50%;width:4px;height:88px;transform:translate(-50%,-50%);border-radius:999px;background:linear-gradient(180deg,transparent 0%,rgba(142,181,222,.95) 18%,rgba(189,219,255,.98) 50%,rgba(142,181,222,.95) 82%,transparent 100%);box-shadow:0 0 0 1px #060c1647,0 0 12px #8db5de29}.workspace-preview-resizer-height:before{content:"";position:absolute;left:50%;top:50%;width:88px;max-width:calc(100% - 24px);height:4px;transform:translate(-50%,-50%);border-radius:999px;background:linear-gradient(90deg,transparent 0%,rgba(142,181,222,.95) 18%,rgba(189,219,255,.98) 50%,rgba(142,181,222,.95) 82%,transparent 100%);box-shadow:0 0 0 1px #060c1647,0 0 12px #8db5de29}.workspace-preview-resizer-width:after,.workspace-preview-resizer-height:after{content:"";position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);border-radius:999px;border:1px solid rgba(8,15,24,.18);box-shadow:0 0 0 1px #ffffff14,inset 0 0 0 1px #ffffff0d}.workspace-preview-resizer-width:after{width:10px;height:28px}.workspace-preview-resizer-height:after{width:28px;height:10px}.workspace-file-code{margin:0;border:0;border-radius:0;width:max-content;min-width:100%;min-height:100%;overflow:visible}.composer-workspace-toggle{border:1px solid var(--border);background:#0c1420db;color:var(--text)}.composer-workspace-toggle:hover{border-color:#516a8acc;background:#132134f0;transform:translateY(-1px)}.composer-workspace-toggle.active{background:#2ec4b629;border-color:#2ec4b657;color:#9be8df}.composer-workspace-toggle svg{width:20px;height:20px}.agent-floating-settings{z-index:1215}.agent-floating-settings-card{width:520px;min-width:360px;max-width:min(720px,100vw - 80px);min-height:280px;max-height:calc(100vh - 120px);border:1px solid var(--border);border-radius:var(--radius-pill);background:var(--bg-soft);color:var(--text);box-shadow:var(--shadow-md);padding:14px;overflow:auto;resize:both}.agent-floating-settings .agent-field-textarea{min-height:360px;background:var(--panel-soft);color:var(--text)}.agent-floating-settings-close{display:inline-flex;align-items:center;justify-content:center;border:none;background:transparent;color:var(--muted);border-radius:0;padding:4px 6px;cursor:pointer}.agent-floating-settings-close svg{width:16px;height:16px;fill:none;stroke:currentColor}.agent-floating-settings-close:hover:not(:disabled){background:var(--panel-soft);border-radius:var(--radius-card)}.agent-floating-settings-close:active:not(:disabled){color:var(--icon-btn-active-color)}.agent-floating-settings-close:disabled{opacity:.65;cursor:not-allowed}.agent-floating-settings-note{font-size:var(--font-size-xs);color:var(--muted);border-top:1px solid var(--border);padding-top:10px}.topbar-leading{display:flex;align-items:center;gap:8px;min-width:0;flex-wrap:wrap}.topbar{background:#141b26eb;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);padding:10px 14px;display:flex;justify-content:flex-start;align-items:center;border:1px solid var(--border);border-radius:0;box-shadow:var(--shadow-sm)}.topbar-brand{display:inline-flex;align-items:center;min-height:34px;padding:0 2px;font-size:var(--font-size-body);font-weight:700;letter-spacing:.05em;text-transform:uppercase;color:#9ed7ff;font-family:JetBrains Mono,IBM Plex Mono,ui-monospace,monospace}.menu-toggle,.theme-toggle{display:inline-flex;align-items:center;justify-content:center;gap:8px;border:1px solid var(--border);background:#0c1420db;color:var(--text);border-radius:0;min-height:34px;padding:0 10px;cursor:pointer;line-height:1;font-size:var(--font-size-body);font-weight:500;white-space:nowrap;transition:transform .12s ease,background .16s ease,border-color .16s ease}.theme-toggle{background:transparent;border-radius:var(--radius-card)}.menu-toggle svg,.theme-toggle svg{width:16px;height:16px;fill:none;stroke:currentColor;flex:0 0 auto}.notify-toggle.icon-only,.theme-toggle.icon-only,.menu-toggle.icon-only{width:34px;min-width:34px;height:34px;padding:0;justify-content:center}.notify-toggle.icon-only span,.theme-toggle.icon-only span,.menu-toggle.icon-only span,.mobile-main-actions{display:none}.menu-toggle:hover{background:#132134f0;border-color:#516a8acc;transform:translateY(-1px)}.topbar-actions{display:flex;align-items:center;gap:10px}.sidebar-backdrop{display:none}.theme-toggle:hover{background:var(--bg-soft);border-color:var(--border-strong);transform:translateY(-1px)}.workspace-panel,.workspace-preview-panel,.workspace-preview-modal{background:var(--panel);border-color:var(--border);border-radius:0;box-shadow:none}.workspace-panel-head,.workspace-preview-head{background:var(--panel);border-color:var(--border)}.workspace-panel-title,.workspace-preview-title{color:var(--text);font-size:var(--font-size-body);letter-spacing:0;text-transform:none}.workspace-panel-title:before{content:none}.workspace-panel-head{min-height:48px;padding:10px 12px}.workspace-panel-subtitle{margin-top:2px;font-size:var(--font-size-xs)}.workspace-filter-wrap{padding:10px 10px 6px}.workspace-filter-input{width:100%;min-height:36px;padding:0 12px;border:1px solid var(--border);border-radius:var(--radius-modal);background:var(--panel);color:var(--text);font:inherit;font-size:var(--font-size-body)}.workspace-filter-input::placeholder{color:var(--muted)}.workspace-filter-input:focus{outline:none;border-color:var(--border-strong);background:var(--panel)}.workspace-tree{background:var(--panel);padding-top:6px}.workspace-tree-item{border-radius:0;color:var(--text)}.workspace-tree-item:hover{background:var(--bg-soft)}.workspace-tree-item.selected{background:var(--panel-soft);box-shadow:inset 2px 0 0 var(--text)}.workspace-tree-icon,.workspace-tree-badge,.workspace-panel-subtitle,.workspace-preview-path,.workspace-tree-icon.caret,.workspace-tree-icon.glyph{color:var(--muted)}.workspace-tree-badge{background:var(--panel-soft)}.workspace-tree-group{border-color:var(--border)}.workspace-refresh,.workspace-preview-action{background:transparent;border-color:transparent;border-radius:var(--radius-sm);color:var(--muted)}.workspace-refresh:hover,.workspace-preview-action:hover{background:var(--panel-soft);border-color:transparent}.workspace-preview-body,.file-change-code{background:var(--bg-soft);border-color:var(--border);box-shadow:none}.file-change-code{border:none}.file-change-code-row{border-color:var(--border)}.workspace-panel-resizer:hover,.workspace-panel-resizer.active,.workspace-preview-resizer-width:hover,.workspace-preview-resizer-width:active,.workspace-preview-resizer-height:hover,.workspace-preview-resizer-height:active{background:var(--panel-soft);border-color:var(--border-strong)}.menu-toggle{background:transparent;border-color:var(--border);border-radius:var(--radius-sm);color:var(--text)}.menu-toggle:hover{background:var(--bg-soft);border-color:var(--border-strong);transform:none}.chat{flex:1;overflow:auto;padding:24px 18px 14px;min-height:0;margin:12px 0;border:0;border-radius:0;background:repeating-linear-gradient(0deg,rgba(255,255,255,.02) 0,rgba(255,255,255,.02) 1px,transparent 1px,transparent 24px),linear-gradient(180deg,#101621b8,#0d121c94);box-shadow:none}.approval-stack{position:sticky;top:0;z-index:3;display:flex;flex-direction:column;gap:10px;margin-bottom:14px;padding-bottom:6px}.msg-row{display:flex;width:100%;margin-bottom:10px}.msg-row.user{justify-content:flex-end}.msg-row.assistant{justify-content:flex-start}.msg-row.system{justify-content:center}.msg-row.file-panel{display:block}.msg{position:relative;width:min(78%,760px);max-width:min(78%,760px);padding:10px 14px 11px;border-radius:0;white-space:pre-wrap;box-shadow:0 6px 16px #0208144d;border:1px solid var(--border)}.msg:before{display:none}.msg-body{font-size:var(--font-size-md);line-height:1.5}.msg-meta{margin-top:8px;font-size:var(--font-size-xs);line-height:1.4;opacity:.72;word-break:break-all}.msg-label{margin-bottom:8px;font-size:var(--font-size-xs);font-weight:700;letter-spacing:.08em;text-transform:uppercase;opacity:.72}.msg.assistant.subagent{background:#222c3cf5;border-color:#3a4658;color:#d4deed}.msg.assistant.kind-plan{background:linear-gradient(180deg,#4e3f14e6,#423611f0);border-color:#e1bc5c80;color:#ffe9b8}.msg.assistant.kind-plan .msg-label{color:#f4c66c}.msg.system{width:min(72%,560px);max-width:min(72%,560px);text-align:center;color:var(--muted);background:#1b2434e6;border:1px solid var(--border);border-radius:0;padding:9px 14px;box-shadow:none}.msg.system:before{display:none}.msg.system .msg-body{font-size:var(--font-size-sm)}.msg.system .msg-meta{margin-top:6px;font-size:10px}.msg.system.kind-plan_checklist{width:min(72%,640px);max-width:min(72%,640px);text-align:left;border-radius:0;padding:12px 14px;background:#1a2638eb;border-color:#8ab1d673;color:#b8d1ee}.msg.system.kind-plan_checklist .msg-body{font-size:var(--font-size-sm);line-height:1.6}.msg.system.kind-plan_checklist .msg-label{color:#426b96;opacity:.92}.file-change-panel{width:100%;border:1px solid var(--border);border-radius:0;background:linear-gradient(180deg,#161e2cf5,#121925fa);box-shadow:0 10px 22px #02081447;overflow:hidden}.file-change-panel-scroll{max-height:calc(14.5em + 84px);overflow:auto}.file-change-entry{padding:14px 16px 16px;border-top:1px solid rgba(125,156,196,.18)}.file-change-entry:first-child{border-top:0}.file-change-summary{white-space:pre-wrap;font-size:var(--font-size-body);line-height:1.55;color:#b9cde8}.file-change-label{margin-bottom:8px;font-size:var(--font-size-xs);font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:#7fa5d4}.file-change-files{margin-top:10px;font-size:var(--font-size-sm);line-height:1.5;color:#9eb6d4;white-space:pre-wrap}.event-panel-details{margin-top:10px;font-size:var(--font-size-sm);color:#9eb6d4}.event-panel-details summary{cursor:pointer;-webkit-user-select:none;user-select:none}.file-change-entry.kind-reasoning{background:linear-gradient(180deg,#4a4122c7,#3d361dd1)}.file-change-entry.kind-web_search{background:linear-gradient(180deg,#18365cc7,#142d4ed1)}.file-change-entry.kind-image_generation{background:linear-gradient(180deg,#124a46c7,#0f3c38d1)}.file-change-code{margin:12px 0 0;border-radius:0;border:none;background:#0d1726;color:#dce9fb;font-size:var(--font-size-sm);line-height:1.45;overflow:auto;font-family:SFMono-Regular,Consolas,Liberation Mono,monospace}.file-change-code-row{display:grid;grid-template-columns:56px 56px minmax(0,1fr);align-items:start}.file-change-code-row:first-child{border-radius:0}.file-change-code-row:last-child{border-radius:0}.file-change-code-row.type-add{background:#e6ffec}.file-change-code-row.type-del{background:#ffebe9}.file-change-code-row.type-hunk,.file-change-code-row.type-meta{background:#dff0ff}.file-change-code-line,.file-change-code-text{display:block;padding:6px 10px}.file-change-code-line{color:#7e97b4;text-align:right;-webkit-user-select:none;user-select:none;border-right:1px solid rgba(125,156,196,.18)}.file-change-code-text{white-space:pre;overflow-x:auto}.chat{background:var(--bg);border:0;border-radius:0;box-shadow:none}.msg{max-width:min(860px,92%);background:transparent;border:none;border-radius:var(--radius-card);box-shadow:none;color:var(--text)}.msg:before{color:var(--muted);font-weight:700}.msg.user{width:auto;background:#e4e1e1;border:none;color:var(--text)}.msg.user:before{content:"[you]"}.msg.assistant{background:#e4e1e1;border:none}.msg.assistant:before{content:"[codex]"}.msg.assistant.subagent:before{content:"[agent]"}.msg.assistant.kind-plan,.msg.system.kind-plan_checklist{background:var(--bg-soft);border-color:var(--border-strong)}.msg.system{background:var(--bg-soft);border:none;border-radius:var(--radius-pill);color:var(--muted)}.msg.system:before{content:"[system]"}.msg-label,.file-change-label{color:var(--text);font-family:inherit;letter-spacing:0;text-transform:uppercase}.msg-meta,.file-change-files{color:var(--muted)}.file-change-panel,.file-change-entry,.event-panel-details{background:var(--panel);border-color:var(--border);border-radius:0;box-shadow:none}.file-change-entry.kind-reasoning,.file-change-entry.kind-web_search,.file-change-entry.kind-image_generation{background:var(--bg-soft)}.file-change-code{background:var(--text);border-color:var(--text);color:var(--bg)}.file-change-code-line{color:var(--muted);border-color:color-mix(in srgb,var(--bg) 18%,transparent)}.msg.assistant .msg-body{white-space:normal}.msg.assistant .msg-body>*:first-child{margin-top:0}.msg.assistant .msg-body>*:last-child{margin-bottom:0}.msg.assistant .msg-body p{margin:0 0 .6em}.msg.assistant .msg-body h1,.msg.assistant .msg-body h2,.msg.assistant .msg-body h3{margin:.9em 0 .4em;font-weight:700;line-height:1.3}.msg.assistant .msg-body h1{font-size:1.2em}.msg.assistant .msg-body h2{font-size:1.1em}.msg.assistant .msg-body h3{font-size:1em}.msg.assistant .msg-body ul,.msg.assistant .msg-body ol{margin:.3em 0 .6em;padding-left:1.4em}.msg.assistant .msg-body li{margin-bottom:.2em}.msg.assistant .msg-body strong{font-weight:700}.msg.assistant .msg-body em{font-style:italic}.msg.assistant .msg-body a{color:var(--accent, #4fc3f7);text-decoration:underline}.msg.assistant .msg-body blockquote{margin:.5em 0;padding:.3em 0 .3em .8em;border-left:3px solid var(--border-strong, #4a5568);color:var(--muted)}.msg.assistant .msg-body code{font-family:SFMono-Regular,Consolas,Liberation Mono,monospace;font-size:.88em;padding:1px 5px;border-radius:3px;background:color-mix(in srgb,currentColor 10%,transparent)}.msg.assistant .msg-body pre{margin:.5em 0 .8em;border-radius:4px;border:1px solid var(--border);background:var(--text);overflow:auto}.msg.assistant .msg-body pre code{display:block;padding:10px 12px;background:transparent;color:var(--bg);font-size:var(--font-size-sm);line-height:1.5;white-space:pre}.msg.assistant .msg-body table{border-collapse:collapse;margin:.5em 0 .8em;font-size:var(--font-size-body)}.msg.assistant .msg-body table th,.msg.assistant .msg-body table td{padding:5px 10px;border:1px solid var(--border)}.msg.assistant .msg-body table th{font-weight:700}:root[data-theme=dark] .msg.user{background:var(--panel-soft)}:root[data-theme=dark] .msg.assistant{background:var(--panel-soft)}.composer{position:relative;background:#0a111cd1;padding:10px;box-shadow:var(--shadow-sm)}.composer-inner{max-width:820px;margin:0 auto;border:1px solid var(--border);border-radius:var(--radius-modal);display:flex;gap:8px;align-items:flex-start}.input-wrap{position:relative;flex:1}.composer-left-group{display:flex;align-items:center;gap:4px;flex:0 0 auto}.composer-input-shell{display:flex;align-items:stretch;border:1px solid var(--border);border-radius:var(--radius-pill);background:#0e1724;transition:border-color .16s ease,box-shadow .16s ease}.composer-input-shell:focus-within{border-color:#5d81b2;box-shadow:0 0 0 3px #7bb4ff2e}.composer-plan-chip{display:inline-flex;align-items:center;gap:4px;padding:4px 9px;font-size:var(--font-size-xs);font-weight:700;letter-spacing:.5px;border-radius:6px;border:none;cursor:pointer;background:none;color:var(--muted);transition:color .14s ease,background .14s ease,border-radius .14s ease;white-space:nowrap;line-height:1.4}.composer-plan-chip:hover:not(:disabled){border:none;background:var(--panel-soft);border-radius:999px;color:var(--text)}.composer-plan-chip:disabled{opacity:.55;cursor:not-allowed}.composer textarea{width:100%;min-height:36px;max-height:180px;resize:none;overflow:auto;border:0;border-radius:0;padding:8px 10px;background:transparent;color:var(--text)}.composer textarea:focus{outline:none}.composer-action{width:40px;min-width:40px;height:40px;display:inline-flex;align-items:center;justify-content:center;border-radius:0;cursor:pointer;transition:transform .12s ease,box-shadow .16s ease,background .16s ease,border-color .16s ease;flex:0 0 auto}.composer-action svg{width:16px;height:16px;fill:none;stroke:currentColor}.composer-send{border:none;background:var(--brand);color:#fff}.composer-send:hover{background:var(--brand-strong);transform:translateY(-1px)}.composer-stop{border:1px solid rgba(255,139,128,.35);background:#73252838;color:var(--danger)}.composer-stop:hover{background:#8b2c3052;border-color:#ff8b8080;transform:translateY(-1px)}.composer-new-chat{border:none;background:transparent;color:var(--muted)}.composer-new-chat:hover:not(:disabled){border:none;background:transparent;color:var(--text);transform:none}.composer-new-chat svg{width:18px;height:18px}.slash-panel{position:absolute;left:0;right:0;bottom:calc(100% + 8px);max-height:230px;overflow:auto;border:1px solid var(--border);background:#0e1724;border-radius:0;box-shadow:var(--shadow-md);padding:6px;z-index:20}.slash-item{width:100%;text-align:left;border:1px solid transparent;background:transparent;border-radius:0;padding:8px 10px;cursor:pointer}.slash-item:hover,.slash-item.active{background:#1c786c2e;border-color:#36c7bb47}.activity-indicator{max-width:820px;margin:0 auto 12px;padding:0 6px;font-size:var(--font-size-sm);color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.composer-activity-indicator{position:absolute;left:12px;right:12px;bottom:calc(100% + 8px);z-index:4;margin:0 auto;padding:8px 12px;border:1px solid rgba(43,63,84,.95);border-radius:0;background:#0a111cf0;box-shadow:0 14px 28px #0208124d;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);pointer-events:none}.composer{background:var(--bg);padding:10px 0 12px;box-shadow:none}.composer-inner{background:var(--bg-soft);border-radius:var(--radius-modal);box-shadow:none;flex-direction:column;align-items:stretch;gap:0}.composer-input-shell{background:transparent;border:none;border-radius:var(--radius-modal) var(--radius-modal) 0 0;box-shadow:none;padding:10px 12px 4px}.composer-input-shell:focus-within{background:transparent;border:none;box-shadow:none}.composer-bottom-bar{display:flex;align-items:center;justify-content:space-between;padding:4px 8px 8px;border-radius:0 0 var(--radius-modal) var(--radius-modal)}.composer-right-group{display:flex;align-items:center}.composer textarea{background:transparent;color:var(--text);font-family:inherit}.composer textarea::placeholder{color:var(--muted)}.composer-action,.composer-workspace-toggle{background:transparent;border-color:var(--border);border-radius:var(--radius-sm);box-shadow:none;color:var(--text)}.composer-action:hover,.composer-workspace-toggle:hover{background:var(--panel-soft);border-color:var(--border-strong);transform:none}.composer-workspace-toggle.active{background:var(--panel-soft);border-color:var(--text);color:var(--text)}.composer-new-chat{border:none;background:transparent;color:var(--muted);box-shadow:none}.composer-new-chat:hover:not(:disabled){border:none;background:var(--panel-soft);color:var(--text);transform:none;border-radius:50%}.composer-action.composer-send{background:var(--text);border:none;border-radius:50%;color:var(--bg);width:36px;min-width:36px;height:36px}.composer-action.composer-send svg{fill:none;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round}.composer-action.composer-send:hover{background:var(--muted);border:none;color:var(--bg);transform:none}.composer-stop{background:transparent;border-color:var(--danger);color:var(--danger)}.slash-panel{background:var(--panel);border-color:var(--border-strong);border-radius:var(--radius-sm);box-shadow:none}.slash-item{border-radius:0}.slash-item:hover,.slash-item.active{background:var(--bg-soft)}.activity-indicator,.composer-activity-indicator{color:var(--muted)}.composer-activity-indicator{background:var(--panel);border-color:var(--border);border-radius:var(--radius-sm);box-shadow:none;-webkit-backdrop-filter:none;backdrop-filter:none}.login{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));min-height:100vh}.login-form-panel,.login-visual-panel{display:flex;align-items:center;justify-content:center}.login-form-panel{min-width:0;padding:24px;background:#fbfaf9}.login-visual-panel{min-width:0;overflow:hidden;background:#faf8f4}.login-visual-image{width:80%;height:80%;object-fit:contain;object-position:center}.login-card{width:min(480px,92vw);background:linear-gradient(180deg,#121c2af5,#0a121ef5);border:1px solid var(--border);border-radius:0;padding:20px;box-shadow:var(--shadow-md)}.login-card-head{display:flex;justify-content:space-between;align-items:flex-start;gap:14px;margin-bottom:16px}.login-copy h2{margin:0 0 8px}.login-copy p{margin:0;color:var(--muted)}.login-copy p:not(.login-tagline){font-size:var(--font-size-sm)}.login-tagline{font-size:var(--font-size-md);font-weight:600;color:var(--text);margin-bottom:4px!important}.login-card input{width:100%;margin-bottom:10px;border:1px solid var(--border);border-radius:0;padding:10px;background:#0e1724;color:var(--text)}.login-card input::placeholder{color:var(--muted)}.login-actions{display:flex;justify-content:flex-end}.login-error{color:var(--danger)}.approval{border:1px solid rgba(228,174,69,.4);background:#38280ee0;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);border-radius:0;padding:10px;box-shadow:0 10px 24px #0e090247}.approval-title{font-size:var(--font-size-body);font-weight:700;margin-bottom:6px}.approval-actions{display:flex;gap:8px;margin-top:8px}.login{background:var(--bg)}.login-card{background:var(--panel);border:1px solid var(--border-strong);border-radius:var(--radius-card);box-shadow:none}.login-copy h2{display:flex;align-items:center;gap:8px;font-size:20px;letter-spacing:0}.login-brand-icon{width:48px;height:48px;flex:0 0 auto;object-fit:contain}.login-card input{background:var(--bg-soft);border-color:var(--border);border-radius:var(--radius-sm);color:var(--text)}.login-card input:focus{background:var(--panel)}.login-actions .primary{background:var(--text);border-color:var(--text);border-radius:var(--radius-sm);box-shadow:none;color:var(--bg)}.login-actions .primary:hover{background:var(--brand-strong);box-shadow:none;transform:none}.approval-actions .secondary{background:transparent;border-color:var(--border);border-radius:var(--radius-sm);box-shadow:none;color:var(--text)}.approval-actions .danger{background:transparent;border-color:var(--danger);border-radius:var(--radius-sm);box-shadow:none;color:var(--danger)}.approval{background:var(--panel);border:1px solid var(--warning);border-radius:var(--radius-sm);box-shadow:none;-webkit-backdrop-filter:none;backdrop-filter:none}.approval-title:before{content:"[!] ";color:var(--warning)}:root[data-theme=dark] body,:root[data-theme=dark] .app,:root[data-theme=dark] .main,:root[data-theme=dark] .center-pane,:root[data-theme=dark] .workspace-layout,:root[data-theme=dark] .chat{background:var(--bg)}:root[data-theme=dark] .sidebar,:root[data-theme=dark] .panel,:root[data-theme=dark] .chat-header,:root[data-theme=dark] .login-card,:root[data-theme=dark] .modal-card,:root[data-theme=dark] .ui-modal-card,:root[data-theme=dark] .workspace-panel,:root[data-theme=dark] .workspace-preview-modal,:root[data-theme=dark] .approval,:root[data-theme=dark] .file-change-panel,:root[data-theme=dark] .file-change-entry{background:var(--panel);border-color:var(--border);color:var(--text)}:root[data-theme=dark] .workspace-preview-panel{background:var(--bg-soft);border-color:var(--border);color:var(--text)}:root[data-theme=dark] .composer{background:var(--bg);border-color:var(--border);color:var(--text)}:root[data-theme=dark] .msg.user,:root[data-theme=dark] .msg.assistant{background:#4f4b4b;border-color:var(--border);color:var(--text)}:root[data-theme=dark] .thread-item:hover,:root[data-theme=dark] .project-item:hover,:root[data-theme=dark] .agent-item.clickable:hover:not(:disabled),:root[data-theme=dark] .workspace-tree-item:hover,:root[data-theme=dark] .slash-item:hover,:root[data-theme=dark] .slash-item.active,:root[data-theme=dark] .project-picker-item:hover,:root[data-theme=dark] .project-picker-item.selected{background:var(--bg-soft)}:root[data-theme=dark] .thread-item.active,:root[data-theme=dark] .thread-tab-item.active,:root[data-theme=dark] .workspace-tree-item.selected,:root[data-theme=dark] .composer-mode.mode-plan,:root[data-theme=dark] .composer-workspace-toggle.active,:root[data-theme=dark] .msg.user{background:var(--panel-soft);border-color:var(--border-strong);color:var(--text)}:root[data-theme=dark] .ui-input,:root[data-theme=dark] .ui-textarea,:root[data-theme=dark] .ui-select,:root[data-theme=dark] .project-picker-input,:root[data-theme=dark] .login-card input,:root[data-theme=dark] .slash-panel{background:var(--bg-soft);border-color:var(--border);color:var(--text)}:root[data-theme=dark] .composer-inner{background:var(--bg-soft)}:root[data-theme=dark] .composer-input-shell,:root[data-theme=dark] .composer-bottom-bar,:root[data-theme=dark] .composer .ui-textarea,:root[data-theme=dark] .composer textarea{background:transparent}:root[data-theme=dark] .ui-textarea:focus,:root[data-theme=dark] .ui-select:focus,:root[data-theme=dark] .composer-input-shell:focus-within{background:#292525;border-color:transparent}:root[data-theme=dark] .agent-floating-settings .ui-textarea:focus{outline:none;border-color:var(--border);background:var(--panel-soft);box-shadow:none}:root[data-theme=dark] .ui-input:focus,:root[data-theme=dark] .project-picker-input:focus,:root[data-theme=dark] .login-card input:focus{background:var(--panel)}:root[data-theme=dark] .primary,:root[data-theme=dark] .ui-button-primary{background:var(--text);border-color:var(--text);color:var(--bg)}:root[data-theme=dark] .secondary,:root[data-theme=dark] .ui-button-secondary,:root[data-theme=dark] .ui-button-ghost,:root[data-theme=dark] .composer-action,:root[data-theme=dark] .composer-new-chat{background:transparent;border-color:var(--border);color:var(--text)}:root[data-theme=dark] .workspace-refresh,:root[data-theme=dark] .workspace-preview-action{background:transparent;border-color:transparent;color:var(--muted)}:root[data-theme=dark] .ui-icon-button,:root[data-theme=dark] .theme-toggle,:root[data-theme=dark] .notify-toggle{background:transparent;color:var(--muted)}:root[data-theme=dark] .ui-icon-button:hover:not(:disabled),:root[data-theme=dark] .notify-toggle:hover:not(:disabled),:root[data-theme=dark] .theme-toggle:hover:not(:disabled),:root[data-theme=dark] .workspace-refresh:hover:not(:disabled),:root[data-theme=dark] .workspace-preview-action:hover:not(:disabled){background:var(--panel-soft)}:root[data-theme=dark] .ui-icon-button.project-action-btn:hover:not(:disabled),:root[data-theme=dark] .ui-icon-button.session-tab-close:hover:not(:disabled),:root[data-theme=dark] .ui-icon-button.threads-compose-btn:hover:not(:disabled){background:transparent}:root[data-theme=dark] .ui-icon-button:active:not(:disabled),:root[data-theme=dark] .notify-toggle:active:not(:disabled),:root[data-theme=dark] .theme-toggle:active:not(:disabled),:root[data-theme=dark] .workspace-refresh:active:not(:disabled),:root[data-theme=dark] .workspace-preview-action:active:not(:disabled){color:var(--icon-btn-active-color);background:transparent}:root[data-theme=dark] .ui-icon-button.is-active{color:var(--text)}:root[data-theme=dark] .composer-action.composer-send{background:var(--text);border-color:transparent;color:var(--bg)}:root[data-theme=dark] .composer-action.composer-send:hover{background:var(--muted);border-color:transparent;color:var(--bg)}:root[data-theme=dark] .composer-new-chat:hover:not(:disabled){background:#3a3636;border-radius:50%}:root[data-theme=dark] .file-change-code{background:#0d1117;border:none;color:var(--text)}:root[data-theme=dark] .file-change-code-row.type-add{background:#2ea04326}:root[data-theme=dark] .file-change-code-row.type-del{background:#f8514926}:root[data-theme=dark] .file-change-code-row.type-hunk,:root[data-theme=dark] .file-change-code-row.type-meta{background:#4f8cc926}:root[data-theme=dark] .login-form-panel{background:#201d1d}:root[data-theme=dark] .login-visual-panel{background:#27221e}:root[data-theme=light] body,:root[data-theme=light] .app,:root[data-theme=light] .main,:root[data-theme=light] .center-pane,:root[data-theme=light] .workspace-layout,:root[data-theme=light] .chat{background:var(--bg)}:root[data-theme=light] .sidebar,:root[data-theme=light] .panel,:root[data-theme=light] .chat-header,:root[data-theme=light] .composer,:root[data-theme=light] .login-card,:root[data-theme=light] .modal-card,:root[data-theme=light] .ui-modal-card,:root[data-theme=light] .workspace-panel,:root[data-theme=light] .workspace-preview-modal,:root[data-theme=light] .approval,:root[data-theme=light] .file-change-panel,:root[data-theme=light] .file-change-entry{background:var(--panel);border-color:var(--border);color:var(--text)}:root[data-theme=light] .workspace-preview-panel{background:var(--bg-soft);border-color:var(--border);color:var(--text)}:root[data-theme=light] .msg.assistant{background:#f4f1f1;border-color:var(--border);color:var(--text)}:root[data-theme=light] .file-change-code{background:#fff;border:none;color:var(--text)}:root[data-theme=light] .agent-floating-settings .ui-textarea:focus{outline:none;border-color:var(--border);background:var(--panel-soft);box-shadow:none}:root[data-theme=light] .workspace-preview-body .file-change-code{background:var(--panel-soft)}:root[data-theme=light] .ui-icon-button,:root[data-theme=light] .theme-toggle,:root[data-theme=light] .notify-toggle{color:var(--muted)}:root[data-theme=light] .agent-settings-action-primary{color:var(--muted)}:root[data-theme=light] .composer-action.composer-send{color:var(--bg)}:root[data-theme=light] .composer-action.composer-send:hover{background:var(--muted);color:var(--bg)}@media (max-width: 1200px){.workspace-layout{flex-direction:column}.workspace-panel{width:100%;max-width:none;min-width:0;max-height:280px}.workspace-panel-resizer{display:none}.workspace-panel-shell{width:100%}.workspace-panel.desktop{display:none}.workspace-panel.compact{margin-top:12px}}@media (max-width: 900px){.app{position:relative}.sidebar{position:fixed;top:0;left:0;width:min(84vw,360px);height:100vh;max-width:100%;border-right:1px solid var(--border);border-bottom:0;transform:translate(-100%);transition:transform .22s ease;box-shadow:none}.sidebar.open{transform:translate(0)}.sidebar.collapsed{padding:16px;overflow:auto}.sidebar-footer{padding-bottom:4px}.sidebar-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:3;display:block;border:0;padding:0;background:transparent;pointer-events:none;transition:background .22s ease}.sidebar-backdrop.open{background:color-mix(in srgb,var(--text) 36%,transparent);pointer-events:auto}.sidebar-resizer{display:none}.chat{padding:20px 10px 14px}.topbar{gap:10px;flex-wrap:wrap}.mobile-main-actions{display:flex;align-items:center;margin-bottom:8px}.chat-header{min-height:42px}.topbar-leading,.topbar-actions{width:100%}.topbar-leading{justify-content:flex-start}.main{padding:10px}.workspace-layout{gap:10px}.workspace-panel{max-height:240px}.agent-floating-settings{position:static;width:100%;margin-top:12px}.agent-floating-settings-card{width:100%;min-width:0;max-width:100%;max-height:none;resize:vertical}.topbar-actions{justify-content:flex-start}.login{grid-template-columns:1fr}.login-form-panel{min-height:100vh}.login-visual-panel,.theme-toggle span{display:none}.msg{width:92%;max-width:92%}.msg.system{width:94%;max-width:94%}.composer-mode{min-width:74px;padding:7px 8px}}.toast-notification{position:fixed;top:16px;right:16px;display:flex;align-items:flex-start;gap:10px;background:#f5f1f1;border:1px solid rgba(0,0,0,.1);border-radius:var(--radius-card);padding:12px 14px;min-width:260px;max-width:340px;z-index:9999;animation:toastSlideIn .25s ease-out,toastSlideOut .25s ease-in 4.75s forwards}:root[data-theme=dark] .toast-notification{background:#302c2c;border-color:#ffffff14}.toast-icon{flex-shrink:0;margin-top:1px;display:flex}.ui-toast-success .toast-icon{color:var(--success)}.ui-toast-error .toast-icon{color:var(--danger)}.ui-toast-warning .toast-icon{color:var(--warning)}.ui-toast-info .toast-icon{color:var(--accent)}.toast-body{flex:1;min-width:0;display:flex;flex-direction:column;gap:3px}.toast-message{color:#201d1d;font-size:var(--font-size-body);font-weight:500}.toast-user-prompt{font-size:var(--font-size-xs);color:#201d1d8c;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.toast-close{flex-shrink:0;background:none;border:none;padding:0;cursor:pointer;color:#201d1d73;display:flex;align-items:center;margin-top:1px}.toast-close:hover{color:#201d1d}:root[data-theme=dark] .toast-message{color:#fdfcfc}:root[data-theme=dark] .toast-user-prompt{color:#fdfcfc8c}:root[data-theme=dark] .toast-close{color:#fdfcfc73}:root[data-theme=dark] .toast-close:hover{color:#fdfcfc}@keyframes toastSlideIn{0%{opacity:0;transform:translate(100%)}to{opacity:1;transform:translate(0)}}@keyframes toastSlideOut{0%{opacity:1;transform:translate(0)}to{opacity:0;transform:translate(100%)}}
|