@kmugalkhod/lightcode 0.17.3 → 0.18.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +197 -197
- package/assets/web/index-e40p9zj3.css +1 -0
- package/assets/web/index-h22g370d.js +183 -0
- package/assets/web/index.html +23 -23
- package/cli.js +5243 -4663
- package/package.json +1 -1
- package/server.js +941 -183
- package/assets/grammars/c/highlights.scm +0 -341
- package/assets/grammars/c/tree-sitter-c.wasm +0 -0
- package/assets/grammars/cpp/highlights.scm +0 -74
- package/assets/grammars/cpp/tree-sitter-cpp.wasm +0 -0
- package/assets/grammars/css/highlights.scm +0 -109
- package/assets/grammars/css/tree-sitter-css.wasm +0 -0
- package/assets/grammars/go/highlights.scm +0 -123
- package/assets/grammars/go/tree-sitter-go.wasm +0 -0
- package/assets/grammars/html/highlights.scm +0 -7
- package/assets/grammars/html/tree-sitter-html.wasm +0 -0
- package/assets/grammars/json/highlights.scm +0 -38
- package/assets/grammars/json/tree-sitter-json.wasm +0 -0
- package/assets/grammars/python/highlights.scm +0 -443
- package/assets/grammars/python/tree-sitter-python.wasm +0 -0
- package/assets/grammars/rust/highlights.scm +0 -159
- package/assets/grammars/rust/tree-sitter-rust.wasm +0 -0
- package/assets/grammars/yaml/highlights.scm +0 -99
- package/assets/grammars/yaml/tree-sitter-yaml.wasm +0 -0
- package/assets/web/index-7ve7dt7b.css +0 -1
- package/assets/web/index-n2g1090y.js +0 -171
package/README.md
CHANGED
|
@@ -1,197 +1,197 @@
|
|
|
1
|
-
# Lightcode
|
|
2
|
-
|
|
3
|
-
A personal AI coding agent with terminal and localhost browser interfaces.
|
|
4
|
-
Lightcode pairs an OpenTUI client and a React browser workspace with one local
|
|
5
|
-
Hono API server, persistent SQLite sessions, a
|
|
6
|
-
permission-gated tool suite (files, shell, git, web, MCP), and tiered context
|
|
7
|
-
optimization that keeps long sessions inside the model's context window
|
|
8
|
-
without ever losing history.
|
|
9
|
-
|
|
10
|
-
## Install
|
|
11
|
-
|
|
12
|
-
```bash
|
|
13
|
-
npm install -g @kmugalkhod/lightcode
|
|
14
|
-
lightcode # terminal UI
|
|
15
|
-
lightcode web # browser UI on 127.0.0.1
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
Works on macOS (Apple Silicon and Intel), Linux, and Windows. Bun ships with
|
|
19
|
-
the package, so there's nothing else to install — the first `lightcode` run
|
|
20
|
-
uses the bundled runtime automatically (and reuses a system Bun if you already
|
|
21
|
-
have one). The published package is scoped as `@kmugalkhod/lightcode`; the
|
|
22
|
-
command it installs is `lightcode`.
|
|
23
|
-
|
|
24
|
-
The two interfaces share the same local sessions, history, provider settings,
|
|
25
|
-
and agent engine. `lightcode web` opens a dedicated loopback-only server and
|
|
26
|
-
launches your browser. Opening a project uses the host folder chooser first:
|
|
27
|
-
the Windows or macOS system dialog, then Zenity or KDialog on Linux when
|
|
28
|
-
available in a graphical session. If the system chooser is unavailable or
|
|
29
|
-
cannot open—including Linux without Zenity or KDialog—Lightcode falls back to
|
|
30
|
-
an authenticated in-app browser rooted at Home, Desktop, Documents, Downloads,
|
|
31
|
-
and Projects. That bounded browser is also available as a secondary project
|
|
32
|
-
action. The local server—not the browser page—receives and
|
|
33
|
-
canonicalizes the selected path, rejects filesystem, drive, and UNC share
|
|
34
|
-
roots, and grants only the chosen project; cancelling leaves the current
|
|
35
|
-
workspace unchanged. The per-launch browser credential stays in the URL
|
|
36
|
-
fragment and current tab and is never passed to agent subprocesses.
|
|
37
|
-
|
|
38
|
-
The browser rail stays focused on projects and sessions. Agents, Skills, MCP,
|
|
39
|
-
Plugins, and deeper customization remain managed through the terminal
|
|
40
|
-
interface for now.
|
|
41
|
-
|
|
42
|
-
The first browser release runs one Lightcode interface at a time: press Ctrl+C
|
|
43
|
-
to stop the TUI or browser server before switching. Sessions remain available
|
|
44
|
-
when you reopen them in the other interface. Use `lightcode web --no-open` on
|
|
45
|
-
headless systems; set `LIGHTCODE_WEB_PORT` to choose its starting port.
|
|
46
|
-
|
|
47
|
-
## Quick start (from source)
|
|
48
|
-
|
|
49
|
-
```bash
|
|
50
|
-
bun install
|
|
51
|
-
bun run cli:dev # starts the TUI; it boots the server automatically
|
|
52
|
-
bun run web:build && bun apps/cli/src/index.tsx web # browser UI from source
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
Lightcode is aware of the directory you launch it in: each turn it reads the
|
|
56
|
-
project's shape (top-level files and git branch/status), uses root `AGENTS.md`
|
|
57
|
-
instructions with `CLAUDE.md` as a fallback, and loads nested instructions only
|
|
58
|
-
when related paths are accessed. `README.md` remains ordinary project context,
|
|
59
|
-
not privileged instructions.
|
|
60
|
-
|
|
61
|
-
On first run Lightcode walks you through provider setup (Anthropic,
|
|
62
|
-
OpenRouter, OpenCode Zen, or any OpenAI-compatible endpoint) and stores the
|
|
63
|
-
API key in `~/.lightcode/credentials.json`. Environment variables such as
|
|
64
|
-
`ANTHROPIC_API_KEY` always take precedence.
|
|
65
|
-
|
|
66
|
-
## Commands
|
|
67
|
-
|
|
68
|
-
```bash
|
|
69
|
-
bun run cli:dev # TUI (auto-starts the server)
|
|
70
|
-
bun run web:dev # asset-only browser dev server (no agent API proxy)
|
|
71
|
-
bun run web:build # build the browser assets
|
|
72
|
-
bun run server:dev # API server alone, watch mode
|
|
73
|
-
bun run typecheck # TypeScript + tool schema preflight
|
|
74
|
-
bun test # test suite
|
|
75
|
-
bun run build # build the publishable package into dist/
|
|
76
|
-
bun run release # verify + build + npm pack (--publish to release)
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
## Configuration
|
|
80
|
-
|
|
81
|
-
Settings merge from `~/.lightcode/settings.json`, then
|
|
82
|
-
`.lightcode/settings.json` in the project, then `LIGHTCODE_*` environment
|
|
83
|
-
variables. Notable keys:
|
|
84
|
-
|
|
85
|
-
| Key | Purpose |
|
|
86
|
-
| --- | --- |
|
|
87
|
-
| `provider`, `model`, `baseUrl` | Provider selection and model id |
|
|
88
|
-
| `defaultMode` | `build` or `plan` |
|
|
89
|
-
| `permissionMode`, `permissions` | Tool permission policy |
|
|
90
|
-
| `context.compactAtFraction` | Context compaction threshold (default 0.8) |
|
|
91
|
-
| `context.pruneAtFraction` | Tool-output pruning threshold (default 0.6) |
|
|
92
|
-
| `context.contextWindowOverride` | Override the model context window |
|
|
93
|
-
| `webSearch.backend` | `auto`, `provider`, `brave`, `tavily`, or `disabled` |
|
|
94
|
-
| `webSearch.maxResults`, `webSearch.maxUsesPerTurn` | Bound search results and per-turn search usage |
|
|
95
|
-
| `maxRetries` | Provider-call retries for transient errors (default 5) |
|
|
96
|
-
| `autoContinue.stallTimeoutSeconds` | Abort+retry a byte-silent stream (default 300; raise for very slow reasoning models) |
|
|
97
|
-
| `autoContinue.maxErrorRetries` | Auto-resends before surfacing a stream error (default 8) |
|
|
98
|
-
| `LIGHTCODE_DESKTOP_PATH`, `LIGHTCODE_DOCUMENTS_PATH`, `LIGHTCODE_DOWNLOADS_PATH`, `LIGHTCODE_PROJECTS_PATH` | Optional absolute overrides for the secure common-location fallback; they do not change the host-native picker |
|
|
99
|
-
|
|
100
|
-
The local companion server listens on `127.0.0.1:4983` (uncommon on purpose —
|
|
101
|
-
port 3000 belongs to the apps you build). Override with `PORT` for the server
|
|
102
|
-
and `LIGHTCODE_API_URL` for the CLI. Runtime model switching: `/model` in the
|
|
103
|
-
TUI lists every OpenRouter model and persists the choice to
|
|
104
|
-
`~/.lightcode/settings.json`. Diagnostics: `GET /diagnostics/connectivity`
|
|
105
|
-
probes the provider endpoint, and daily JSONL logs live under the Lightcode
|
|
106
|
-
data directory (`logs/`).
|
|
107
|
-
|
|
108
|
-
## Office networks and certificates
|
|
109
|
-
|
|
110
|
-
Lightcode uses the same standard enterprise configuration described in
|
|
111
|
-
[OpenCode's network documentation](https://opencode.ai/docs/network/):
|
|
112
|
-
`HTTPS_PROXY`, `HTTP_PROXY`, `NO_PROXY`, and `NODE_EXTRA_CA_CERTS`.
|
|
113
|
-
Local CLI/server connections bypass the proxy automatically.
|
|
114
|
-
The npm launcher on Windows also imports trusted roots from both LocalMachine
|
|
115
|
-
and CurrentUser stores when no explicit CA file is configured. Its export is
|
|
116
|
-
isolated per launch and limited to ten seconds.
|
|
117
|
-
|
|
118
|
-
If your office inspects HTTPS traffic, use the company CA bundle supplied by
|
|
119
|
-
your IT team (PEM format):
|
|
120
|
-
|
|
121
|
-
```bash
|
|
122
|
-
export NODE_EXTRA_CA_CERTS=/absolute/path/company-ca.pem
|
|
123
|
-
lightcode
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
`LIGHTCODE_CA_CERTS` and `SSL_CERT_FILE` are also supported for Lightcode's
|
|
127
|
-
provider, model catalog, connectivity probe, and web-tool requests. Explicit
|
|
128
|
-
bundles extend the public trust roots using
|
|
129
|
-
[Bun's TLS fetch options](https://bun.sh/docs/runtime/networking/fetch).
|
|
130
|
-
Certificate verification remains enabled. Untrusted, expired, and mismatched
|
|
131
|
-
certificates report an actionable error instead of triggering repeated chat
|
|
132
|
-
retries. Restart Lightcode after changing network configuration. Subprocesses
|
|
133
|
-
and external MCP programs use their own runtime's certificate settings; use
|
|
134
|
-
`NODE_EXTRA_CA_CERTS` when those runtimes support it.
|
|
135
|
-
|
|
136
|
-
OpenAI-compatible endpoints can run without an API key, including local model
|
|
137
|
-
servers. Supply their `/v1` base URL and exact model ID. Model compatibility
|
|
138
|
-
still depends on the endpoint implementing the supported API and the model
|
|
139
|
-
being capable of tool use; an arbitrary model name alone cannot guarantee that.
|
|
140
|
-
|
|
141
|
-
## Context optimization
|
|
142
|
-
|
|
143
|
-
Long sessions stay healthy through three tiers: real-usage-calibrated token
|
|
144
|
-
estimation, free pruning of stale tool outputs and duplicate file reads, and
|
|
145
|
-
LLM-written summaries once the compaction threshold is crossed (with an
|
|
146
|
-
extractive fallback when the model is unreachable). The full conversation is
|
|
147
|
-
always preserved in SQLite — compaction only changes what the model sees.
|
|
148
|
-
Use `/compact` in a chat to compact manually.
|
|
149
|
-
|
|
150
|
-
## Skills
|
|
151
|
-
|
|
152
|
-
Skills are reusable instruction files the agent can load on demand — a recipe
|
|
153
|
-
for a recurring task (writing a PR description, cutting a release, following a
|
|
154
|
-
review checklist). Each skill is a `SKILL.md` file with frontmatter:
|
|
155
|
-
|
|
156
|
-
```markdown
|
|
157
|
-
---
|
|
158
|
-
name: pr-description
|
|
159
|
-
description: Write a clear PR title and description from the diff.
|
|
160
|
-
---
|
|
161
|
-
|
|
162
|
-
# Instructions the agent follows when this skill is loaded…
|
|
163
|
-
```
|
|
164
|
-
|
|
165
|
-
Lightcode discovers installed skills automatically, first match wins (project
|
|
166
|
-
overrides user), in this order:
|
|
167
|
-
|
|
168
|
-
1. `.lightcode/skills/<name>/SKILL.md` — project-local
|
|
169
|
-
2. `.agents/skills/<name>/SKILL.md` — project-local (fallback)
|
|
170
|
-
3. Project `.claude/skills`, `.codex/skills`, and `.opencode/skills`
|
|
171
|
-
4. User `~/.lightcode/skills`, `~/.agents/skills`, and `~/.claude/skills`
|
|
172
|
-
5. `$CODEX_HOME/skills` (defaults to `~/.codex/skills`, including `.system`)
|
|
173
|
-
6. `$XDG_CONFIG_HOME/opencode/skills` (defaults to `~/.config/opencode/skills`)
|
|
174
|
-
7. Additional roots in `LIGHTCODE_SKILL_PATHS` (colon-separated on Unix,
|
|
175
|
-
semicolon-separated on Windows). Use this for other installations or
|
|
176
|
-
plugin skill directories you want to make available.
|
|
177
|
-
|
|
178
|
-
Each turn the agent is told which skills are available (name + description), so
|
|
179
|
-
just ask it to "use the pr-description skill" (or mention the skill by name) and
|
|
180
|
-
it loads the instructions via the `skill` tool and follows them. Run `/skills`
|
|
181
|
-
in the TUI to list what's installed. The agent can select relevant skills for
|
|
182
|
-
ordinary tasks without you naming one. YAML frontmatter supports quoted and
|
|
183
|
-
multiline `name`/`description` fields. Supporting files can be loaded through
|
|
184
|
-
the `skill` tool's `resource` argument, relative to the skill directory.
|
|
185
|
-
Discovery follows installation symlinks, skips broken/unreadable/malformed
|
|
186
|
-
entries, and refreshes within 30 seconds. Scans are bounded to eight directory
|
|
187
|
-
levels and 2,000 directories per root; individual files are limited to 1 MiB.
|
|
188
|
-
Discovery does not execute skill scripts or override tool permissions.
|
|
189
|
-
|
|
190
|
-
## Workspaces
|
|
191
|
-
|
|
192
|
-
- `apps/cli` — OpenTUI React terminal interface
|
|
193
|
-
- `apps/web` — React localhost browser interface
|
|
194
|
-
- `apps/server` — Hono API server (sessions, streaming, diagnostics)
|
|
195
|
-
- `packages/ai` — agent core: tools, permissions, context engine, config
|
|
196
|
-
- `packages/db` — Prisma + local SQLite storage
|
|
197
|
-
- `packages/shared` — logging, errors, version
|
|
1
|
+
# Lightcode
|
|
2
|
+
|
|
3
|
+
A personal AI coding agent with terminal and localhost browser interfaces.
|
|
4
|
+
Lightcode pairs an OpenTUI client and a React browser workspace with one local
|
|
5
|
+
Hono API server, persistent SQLite sessions, a
|
|
6
|
+
permission-gated tool suite (files, shell, git, web, MCP), and tiered context
|
|
7
|
+
optimization that keeps long sessions inside the model's context window
|
|
8
|
+
without ever losing history.
|
|
9
|
+
|
|
10
|
+
## Install
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
npm install -g @kmugalkhod/lightcode
|
|
14
|
+
lightcode # terminal UI
|
|
15
|
+
lightcode web # browser UI on 127.0.0.1
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Works on macOS (Apple Silicon and Intel), Linux, and Windows. Bun ships with
|
|
19
|
+
the package, so there's nothing else to install — the first `lightcode` run
|
|
20
|
+
uses the bundled runtime automatically (and reuses a system Bun if you already
|
|
21
|
+
have one). The published package is scoped as `@kmugalkhod/lightcode`; the
|
|
22
|
+
command it installs is `lightcode`.
|
|
23
|
+
|
|
24
|
+
The two interfaces share the same local sessions, history, provider settings,
|
|
25
|
+
and agent engine. `lightcode web` opens a dedicated loopback-only server and
|
|
26
|
+
launches your browser. Opening a project uses the host folder chooser first:
|
|
27
|
+
the Windows or macOS system dialog, then Zenity or KDialog on Linux when
|
|
28
|
+
available in a graphical session. If the system chooser is unavailable or
|
|
29
|
+
cannot open—including Linux without Zenity or KDialog—Lightcode falls back to
|
|
30
|
+
an authenticated in-app browser rooted at Home, Desktop, Documents, Downloads,
|
|
31
|
+
and Projects. That bounded browser is also available as a secondary project
|
|
32
|
+
action. The local server—not the browser page—receives and
|
|
33
|
+
canonicalizes the selected path, rejects filesystem, drive, and UNC share
|
|
34
|
+
roots, and grants only the chosen project; cancelling leaves the current
|
|
35
|
+
workspace unchanged. The per-launch browser credential stays in the URL
|
|
36
|
+
fragment and current tab and is never passed to agent subprocesses.
|
|
37
|
+
|
|
38
|
+
The browser rail stays focused on projects and sessions. Agents, Skills, MCP,
|
|
39
|
+
Plugins, and deeper customization remain managed through the terminal
|
|
40
|
+
interface for now.
|
|
41
|
+
|
|
42
|
+
The first browser release runs one Lightcode interface at a time: press Ctrl+C
|
|
43
|
+
to stop the TUI or browser server before switching. Sessions remain available
|
|
44
|
+
when you reopen them in the other interface. Use `lightcode web --no-open` on
|
|
45
|
+
headless systems; set `LIGHTCODE_WEB_PORT` to choose its starting port.
|
|
46
|
+
|
|
47
|
+
## Quick start (from source)
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
bun install
|
|
51
|
+
bun run cli:dev # starts the TUI; it boots the server automatically
|
|
52
|
+
bun run web:build && bun apps/cli/src/index.tsx web # browser UI from source
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Lightcode is aware of the directory you launch it in: each turn it reads the
|
|
56
|
+
project's shape (top-level files and git branch/status), uses root `AGENTS.md`
|
|
57
|
+
instructions with `CLAUDE.md` as a fallback, and loads nested instructions only
|
|
58
|
+
when related paths are accessed. `README.md` remains ordinary project context,
|
|
59
|
+
not privileged instructions.
|
|
60
|
+
|
|
61
|
+
On first run Lightcode walks you through provider setup (Anthropic,
|
|
62
|
+
OpenRouter, OpenCode Zen, or any OpenAI-compatible endpoint) and stores the
|
|
63
|
+
API key in `~/.lightcode/credentials.json`. Environment variables such as
|
|
64
|
+
`ANTHROPIC_API_KEY` always take precedence.
|
|
65
|
+
|
|
66
|
+
## Commands
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
bun run cli:dev # TUI (auto-starts the server)
|
|
70
|
+
bun run web:dev # asset-only browser dev server (no agent API proxy)
|
|
71
|
+
bun run web:build # build the browser assets
|
|
72
|
+
bun run server:dev # API server alone, watch mode
|
|
73
|
+
bun run typecheck # TypeScript + tool schema preflight
|
|
74
|
+
bun test # test suite
|
|
75
|
+
bun run build # build the publishable package into dist/
|
|
76
|
+
bun run release # verify + build + npm pack (--publish to release)
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Configuration
|
|
80
|
+
|
|
81
|
+
Settings merge from `~/.lightcode/settings.json`, then
|
|
82
|
+
`.lightcode/settings.json` in the project, then `LIGHTCODE_*` environment
|
|
83
|
+
variables. Notable keys:
|
|
84
|
+
|
|
85
|
+
| Key | Purpose |
|
|
86
|
+
| --- | --- |
|
|
87
|
+
| `provider`, `model`, `baseUrl` | Provider selection and model id |
|
|
88
|
+
| `defaultMode` | `build` or `plan` |
|
|
89
|
+
| `permissionMode`, `permissions` | Tool permission policy |
|
|
90
|
+
| `context.compactAtFraction` | Context compaction threshold (default 0.8) |
|
|
91
|
+
| `context.pruneAtFraction` | Tool-output pruning threshold (default 0.6) |
|
|
92
|
+
| `context.contextWindowOverride` | Override the model context window |
|
|
93
|
+
| `webSearch.backend` | `auto`, `provider`, `brave`, `tavily`, or `disabled` |
|
|
94
|
+
| `webSearch.maxResults`, `webSearch.maxUsesPerTurn` | Bound search results and per-turn search usage |
|
|
95
|
+
| `maxRetries` | Provider-call retries for transient errors (default 5) |
|
|
96
|
+
| `autoContinue.stallTimeoutSeconds` | Abort+retry a byte-silent stream (default 300; raise for very slow reasoning models) |
|
|
97
|
+
| `autoContinue.maxErrorRetries` | Auto-resends before surfacing a stream error (default 8) |
|
|
98
|
+
| `LIGHTCODE_DESKTOP_PATH`, `LIGHTCODE_DOCUMENTS_PATH`, `LIGHTCODE_DOWNLOADS_PATH`, `LIGHTCODE_PROJECTS_PATH` | Optional absolute overrides for the secure common-location fallback; they do not change the host-native picker |
|
|
99
|
+
|
|
100
|
+
The local companion server listens on `127.0.0.1:4983` (uncommon on purpose —
|
|
101
|
+
port 3000 belongs to the apps you build). Override with `PORT` for the server
|
|
102
|
+
and `LIGHTCODE_API_URL` for the CLI. Runtime model switching: `/model` in the
|
|
103
|
+
TUI lists every OpenRouter model and persists the choice to
|
|
104
|
+
`~/.lightcode/settings.json`. Diagnostics: `GET /diagnostics/connectivity`
|
|
105
|
+
probes the provider endpoint, and daily JSONL logs live under the Lightcode
|
|
106
|
+
data directory (`logs/`).
|
|
107
|
+
|
|
108
|
+
## Office networks and certificates
|
|
109
|
+
|
|
110
|
+
Lightcode uses the same standard enterprise configuration described in
|
|
111
|
+
[OpenCode's network documentation](https://opencode.ai/docs/network/):
|
|
112
|
+
`HTTPS_PROXY`, `HTTP_PROXY`, `NO_PROXY`, and `NODE_EXTRA_CA_CERTS`.
|
|
113
|
+
Local CLI/server connections bypass the proxy automatically.
|
|
114
|
+
The npm launcher on Windows also imports trusted roots from both LocalMachine
|
|
115
|
+
and CurrentUser stores when no explicit CA file is configured. Its export is
|
|
116
|
+
isolated per launch and limited to ten seconds.
|
|
117
|
+
|
|
118
|
+
If your office inspects HTTPS traffic, use the company CA bundle supplied by
|
|
119
|
+
your IT team (PEM format):
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
export NODE_EXTRA_CA_CERTS=/absolute/path/company-ca.pem
|
|
123
|
+
lightcode
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
`LIGHTCODE_CA_CERTS` and `SSL_CERT_FILE` are also supported for Lightcode's
|
|
127
|
+
provider, model catalog, connectivity probe, and web-tool requests. Explicit
|
|
128
|
+
bundles extend the public trust roots using
|
|
129
|
+
[Bun's TLS fetch options](https://bun.sh/docs/runtime/networking/fetch).
|
|
130
|
+
Certificate verification remains enabled. Untrusted, expired, and mismatched
|
|
131
|
+
certificates report an actionable error instead of triggering repeated chat
|
|
132
|
+
retries. Restart Lightcode after changing network configuration. Subprocesses
|
|
133
|
+
and external MCP programs use their own runtime's certificate settings; use
|
|
134
|
+
`NODE_EXTRA_CA_CERTS` when those runtimes support it.
|
|
135
|
+
|
|
136
|
+
OpenAI-compatible endpoints can run without an API key, including local model
|
|
137
|
+
servers. Supply their `/v1` base URL and exact model ID. Model compatibility
|
|
138
|
+
still depends on the endpoint implementing the supported API and the model
|
|
139
|
+
being capable of tool use; an arbitrary model name alone cannot guarantee that.
|
|
140
|
+
|
|
141
|
+
## Context optimization
|
|
142
|
+
|
|
143
|
+
Long sessions stay healthy through three tiers: real-usage-calibrated token
|
|
144
|
+
estimation, free pruning of stale tool outputs and duplicate file reads, and
|
|
145
|
+
LLM-written summaries once the compaction threshold is crossed (with an
|
|
146
|
+
extractive fallback when the model is unreachable). The full conversation is
|
|
147
|
+
always preserved in SQLite — compaction only changes what the model sees.
|
|
148
|
+
Use `/compact` in a chat to compact manually.
|
|
149
|
+
|
|
150
|
+
## Skills
|
|
151
|
+
|
|
152
|
+
Skills are reusable instruction files the agent can load on demand — a recipe
|
|
153
|
+
for a recurring task (writing a PR description, cutting a release, following a
|
|
154
|
+
review checklist). Each skill is a `SKILL.md` file with frontmatter:
|
|
155
|
+
|
|
156
|
+
```markdown
|
|
157
|
+
---
|
|
158
|
+
name: pr-description
|
|
159
|
+
description: Write a clear PR title and description from the diff.
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
# Instructions the agent follows when this skill is loaded…
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
Lightcode discovers installed skills automatically, first match wins (project
|
|
166
|
+
overrides user), in this order:
|
|
167
|
+
|
|
168
|
+
1. `.lightcode/skills/<name>/SKILL.md` — project-local
|
|
169
|
+
2. `.agents/skills/<name>/SKILL.md` — project-local (fallback)
|
|
170
|
+
3. Project `.claude/skills`, `.codex/skills`, and `.opencode/skills`
|
|
171
|
+
4. User `~/.lightcode/skills`, `~/.agents/skills`, and `~/.claude/skills`
|
|
172
|
+
5. `$CODEX_HOME/skills` (defaults to `~/.codex/skills`, including `.system`)
|
|
173
|
+
6. `$XDG_CONFIG_HOME/opencode/skills` (defaults to `~/.config/opencode/skills`)
|
|
174
|
+
7. Additional roots in `LIGHTCODE_SKILL_PATHS` (colon-separated on Unix,
|
|
175
|
+
semicolon-separated on Windows). Use this for other installations or
|
|
176
|
+
plugin skill directories you want to make available.
|
|
177
|
+
|
|
178
|
+
Each turn the agent is told which skills are available (name + description), so
|
|
179
|
+
just ask it to "use the pr-description skill" (or mention the skill by name) and
|
|
180
|
+
it loads the instructions via the `skill` tool and follows them. Run `/skills`
|
|
181
|
+
in the TUI to list what's installed. The agent can select relevant skills for
|
|
182
|
+
ordinary tasks without you naming one. YAML frontmatter supports quoted and
|
|
183
|
+
multiline `name`/`description` fields. Supporting files can be loaded through
|
|
184
|
+
the `skill` tool's `resource` argument, relative to the skill directory.
|
|
185
|
+
Discovery follows installation symlinks, skips broken/unreadable/malformed
|
|
186
|
+
entries, and refreshes within 30 seconds. Scans are bounded to eight directory
|
|
187
|
+
levels and 2,000 directories per root; individual files are limited to 1 MiB.
|
|
188
|
+
Discovery does not execute skill scripts or override tool permissions.
|
|
189
|
+
|
|
190
|
+
## Workspaces
|
|
191
|
+
|
|
192
|
+
- `apps/cli` — OpenTUI React terminal interface
|
|
193
|
+
- `apps/web` — React localhost browser interface
|
|
194
|
+
- `apps/server` — Hono API server (sessions, streaming, diagnostics)
|
|
195
|
+
- `packages/ai` — agent core: tools, permissions, context engine, config
|
|
196
|
+
- `packages/db` — Prisma + local SQLite storage
|
|
197
|
+
- `packages/shared` — logging, errors, version
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/app/geist-latin.woff2)format(woff2)}:root{--buncss-light: ;--buncss-dark:initial;color-scheme:dark;font-synthesis:none;--base:#0d1117;--panel:#121820;--elevated:#18212b;--inset:#10151c;--border:#273241;--border-soft:#202a36;--accent:#f2a65a;--accent-soft:#33260f;--accent-text:#f6c99a;--text:#eef3f8;--text-secondary:#b6c2cf;--text-muted:#7f8d9d;--success:#8bd49c;--warning:#e5c07b;--error:#f28b82;--info:#9cbdfd;--mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-family:Geist Variable,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}*{box-sizing:border-box}html,body,#root{width:100%;height:100%;margin:0}body{overflow:hidden;background:var(--base);color:var(--text);text-rendering:optimizeLegibility;min-width:320px;font-size:14px;line-height:1.5}button,textarea,input,select{color:inherit;font:inherit}button,select,label,summary{-webkit-tap-highlight-color:transparent}button{border:0}button:not(:disabled),select:not(:disabled),summary{cursor:pointer}label:has(input:not(:disabled)){cursor:pointer}button:disabled,select:disabled,textarea:disabled,input:disabled{cursor:not-allowed;opacity:.5}:focus-visible{outline:2px solid var(--accent);outline-offset:2px}::selection{color:var(--text);background:#67421e}.sr-only{position:absolute;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0}.app-shell{display:grid;grid-template-columns:280px minmax(0,1fr);background:var(--panel);width:100%;height:100dvh}.session-rail{position:relative;z-index:30;display:flex;overflow:hidden;background:var(--base);border-right:1px solid var(--border);flex-direction:column;min-width:0;height:100%}.rail-header{display:flex;border-bottom:1px solid var(--border-soft);justify-content:space-between;align-items: center;min-height:58px;padding:0 16px}.brand-lockup{display:flex;color:var(--text);letter-spacing:-.01em;align-items: center;gap:9px;font-size:15px;font-weight:670}.brand-mark,.new-session-mark,.empty-mark,.authorization-mark{display:inline-flex;color:var(--accent);justify-content:center;align-items: center}.brand-mark{background:var(--accent-soft);border:1px solid #57402a;border-radius:8px;width:27px;height:27px}.rail-actions{display:grid;gap:7px;padding:14px 12px 12px}.new-session-button,.project-button{display:flex;border:1px solid var(--border);background:var(--panel);color:var(--text-secondary);text-align:left;border-radius:9px;align-items: center;gap:9px;width:100%;min-height:36px;padding:7px 10px;transition:background-color .16s ease-out,border-color .16s ease-out,color .16s ease-out}.new-session-button:hover:not(:disabled),.project-button:hover:not(:disabled){background:var(--elevated);color:var(--text);border-color:#3b495b}.new-session-button kbd{color:var(--text-muted);font-family:var(--mono);margin-left:auto;font-size:11px;font-weight:500}.project-button{color:var(--text-muted);background:0 0;border-color:#0000}.project-button-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0}.rail-section-heading{display:flex;color:var(--text-muted);letter-spacing:.055em;text-transform:uppercase;justify-content:space-between;align-items: center;padding:7px 15px;font-size:11px;font-weight:650}.session-list{overflow-y:auto;flex:1;min-height:80px;padding:2px 8px 18px}.session-item{position:relative;display:flex;color:var(--text-secondary);text-align:left;background:0 0;border-radius:8px;align-items: center;gap:9px;width:100%;min-height:58px;padding:8px 9px;transition:background-color .16s ease-out,color .16s ease-out}.session-item:hover{background:var(--panel);color:var(--text)}.session-item.active{background:var(--elevated);color:var(--text)}.session-marker{background:var(--border);border-radius:50%;flex:none;width:5px;height:5px}.session-item.active .session-marker{background:var(--accent)}.session-copy{display:grid;gap:2px;min-width:0}.session-copy strong{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px;font-weight:590}.session-copy small{color:var(--text-muted);font-size:11px}.rail-state{display:flex;border:1px solid var(--border-soft);color:var(--text-muted);border-radius:9px;align-items: flex-start;gap:10px;margin:7px;padding:12px}.rail-state p{margin:0;font-size:12px}.session-skeleton,.folder-skeleton,.conversation-skeleton{display:grid;gap:12px;padding:12px}.session-skeleton span,.folder-skeleton span,.conversation-skeleton span{display:block;background:var(--elevated);animation:skeleton-pulse 1.4s ease-in-out infinite alternate;border-radius:4px;height:10px}.session-skeleton span:first-child{width:82%}.session-skeleton span:nth-child(2){width:74%}.session-skeleton span:nth-child(3){width:68%}.session-skeleton span:nth-child(4){width:61%}.folder-skeleton span:first-child{width:58%}.folder-skeleton span:nth-child(2){width:71%}.folder-skeleton span:nth-child(3){width:84%}.folder-skeleton span:nth-child(4){width:67%}.folder-skeleton span:nth-child(5){width:79%}.folder-skeleton span:nth-child(6){width:62%}.folder-skeleton span:nth-child(7){width:75%}@keyframes skeleton-pulse{0%{opacity:.45}to{opacity:.95}}.workspace-main{display:flex;overflow:hidden;background:var(--panel);flex-direction:column;min-width:0;min-height:0}.workspace-ribbon{position:relative;z-index:10;display:flex;border-top:2px solid var(--accent);color:var(--accent-text);background:#211a13;border-bottom:1px solid #493522;align-items: center;gap:9px;min-height:56px;padding:6px 14px}.workspace-path{display:flex;color:inherit;text-align:left;background:0 0;border-radius:8px;align-items: center;gap:8px;min-width:180px;max-width:min(42vw,560px);padding:5px 7px}.workspace-path:hover{background:#2c2117}.workspace-icon{display:inline-flex;color:var(--accent);align-items: center}.workspace-path-copy{display:grid;gap:0;min-width:0}.workspace-path-copy strong,.workspace-path-copy small{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.workspace-path-copy strong{color:var(--text);font-size:13px;font-weight:650}.workspace-path-copy small{color:#be9e7e;font-family:var(--mono);font-size:10px}.ribbon-status,.ribbon-model{display:flex;color:#d8b38d;white-space:nowrap;align-items: center;gap:7px;font-size:12px}.live-dot{display:inline-block;background:#6f665d;border-radius:50%;flex:none;width:7px;height:7px}.live-dot.active,.agent-working .live-dot{background:var(--accent);animation:live-pulse 1.1s ease-out infinite alternate}@keyframes live-pulse{0%{opacity:.55}to{opacity:1}}.ribbon-spacer{flex:1}.ribbon-model{overflow:hidden;color:#b69778;text-overflow:ellipsis;max-width:190px}.ribbon-select{position:relative;display:flex;color:var(--accent-text);background:#2b2016;border:1px solid #59412b;border-radius:7px;align-items: center;gap:6px;height:32px;padding:0 7px}.ribbon-select select{position:absolute;z-index:1;appearance:none;outline:0;color:inherit;opacity:0;background:0 0;border:0;width:100%;height:100%;font-size:12px;inset:0}.ribbon-select>svg,.ribbon-select-value{pointer-events:none}.ribbon-select-value{white-space:nowrap;min-width:0}.ribbon-select.disabled{opacity:.55}.ribbon-select select:focus-visible{outline:0}.ribbon-select:focus-within{outline:2px solid var(--accent);outline-offset:2px}.chat-surface{position:relative;display:flex;overflow:hidden;flex-direction:column;flex:1;min-width:0;min-height:0}.chat-with-changes{display:flex;flex:1;min-height:0}.changes-toggle{position:absolute;z-index:5;display:inline-flex;border:1px solid var(--border);background:var(--elevated);color:var(--text-secondary);border-radius:8px;align-items: center;gap:6px;min-height:30px;padding:4px 10px;font-size:12px;top:10px;right:14px}.changes-toggle:hover,.changes-toggle.active{color:var(--accent-text);border-color:#62472d}.changes-count{background:var(--accent-soft);color:var(--accent-text);font-family:var(--mono);border-radius:999px;padding:0 6px;font-size:10px}.changes-panel{display:flex;border-left:1px solid var(--border);background:var(--base);flex-direction:column;flex:none;width:min(460px,38vw);min-width:320px;min-height:0}@media (max-width:1099px){.changes-panel{position:fixed;z-index:75;width:min(460px,100vw);min-width:0;inset:0 0 0 auto;box-shadow:-18px 0 44px #00000080}}.changes-panel-header{display:flex;border-bottom:1px solid var(--border-soft);align-items: center;gap:8px;min-height:50px;padding:8px 10px 8px 14px}.changes-panel-header h2{display:flex;color:var(--text);align-items: center;gap:7px;margin:0;font-size:13px;font-weight:650}.changes-branch{overflow:hidden;color:var(--text-muted);font-family:var(--mono);text-overflow:ellipsis;white-space:nowrap;margin-right:auto;font-size:11px}.changes-list{overflow-y:auto;list-style:none;flex:none;max-height:42%;margin:0;padding:6px}.changes-row{display:grid;grid-template-columns:20px minmax(0,1fr)auto;color:var(--text-secondary);text-align:left;background:0 0;border-radius:7px;align-items: center;gap:8px;width:100%;min-height:40px;padding:5px 8px}.changes-row:hover,.changes-row.selected{background:var(--elevated);color:var(--text)}.change-kind{font-family:var(--mono);text-align:center;font-size:11px;font-weight:700}.change-kind.created,.change-kind.untracked{color:var(--success)}.change-kind.modified,.change-kind.renamed{color:var(--warning)}.change-kind.deleted{color:var(--error)}.changes-path{display:grid;min-width:0}.changes-path strong,.changes-path small{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.changes-path strong{font-size:12px;font-weight:600}.changes-path small{color:var(--text-muted);font-family:var(--mono);font-size:10px}.changes-stats{display:inline-flex;font-family:var(--mono);gap:6px;font-size:10px}.changes-stats .added{color:var(--success)}.changes-stats .removed{color:var(--error)}.changes-diff{overflow:auto;border-top:1px solid var(--border-soft);flex:1;min-height:0;padding:10px}.changes-diff .diff-view{font-family:var(--mono);white-space:pre;margin:0;font-size:11px;line-height:1.55}.changes-state,.changes-hint{display:flex;color:var(--text-muted);align-items: center;gap:8px;margin:0;padding:14px;font-size:12px}.changes-state p{margin:0}.conversation-scroll{overflow-y:auto;overscroll-behavior:contain;scrollbar-gutter:stable;flex:1;min-height:0}.conversation-column{width:min(100%,1040px);margin:0 auto;padding-inline-start:28px;padding-inline-end:28px}.conversation-scroll>.conversation-column{display:flex;flex-direction:column;min-height:100%;padding-top:32px;padding-bottom:28px}.conversation-empty{display:grid;justify-items:start;width:min(100%,610px);margin:auto;padding:48px 0 92px}.empty-mark{background:var(--accent-soft);border:1px solid #62472d;border-radius:12px;width:43px;height:43px;margin-bottom:20px}.conversation-empty h1,.new-session-title h1,.authorization-gate h1{color:var(--text);letter-spacing:-.025em;margin:0;font-size:25px;font-weight:650;line-height:1.2}.conversation-empty p{color:var(--text-secondary);max-width:58ch;margin:12px 0 0;font-size:15px}.chat-message{display:grid;grid-template-columns:minmax(0,1fr);border-bottom:1px solid var(--border-soft);content-visibility:auto;contain-intrinsic-size:auto 180px;gap:12px;padding:24px 0 27px}.chat-message>header{display:flex;color:var(--text-muted);align-items: center;gap:7px;height:26px;font-size:12px;font-weight:640}.streaming-message-text p{white-space:pre-wrap}.role-mark{display:inline-flex;border:1px solid var(--border);background:var(--inset);border-radius:7px;justify-content:center;align-items: center;width:24px;height:24px}.role-assistant .role-mark{color:var(--success);border-color:#2d4a35}.role-user .role-mark{color:var(--info);border-color:#354561}.message-parts{min-width:0}.message-text{color:var(--text);font-size:15px;line-height:1.72}.message-text p{white-space:normal;overflow-wrap:anywhere;max-width:72ch;margin:0 0 15px}.message-text p:last-child{margin-bottom:0}.message-text :-webkit-any(h1,h2,h3,h4,h5,h6){color:var(--text);letter-spacing:-.018em;max-width:46ch;margin:28px 0 12px;font-size:22px;font-weight:680;line-height:1.3}.message-text :-moz-any(h1,h2,h3,h4,h5,h6){color:var(--text);letter-spacing:-.018em;max-width:46ch;margin:28px 0 12px;font-size:22px;font-weight:680;line-height:1.3}.message-text :is(h1,h2,h3,h4,h5,h6){color:var(--text);letter-spacing:-.018em;max-width:46ch;margin:28px 0 12px;font-size:22px;font-weight:680;line-height:1.3}.message-text h2{font-size:20px}.message-text :-webkit-any(h3,h4,h5,h6){font-size:17px}.message-text :-moz-any(h3,h4,h5,h6){font-size:17px}.message-text :is(h3,h4,h5,h6){font-size:17px}.message-text>:first-child{margin-top:0}.message-text>:last-child{margin-bottom:0}.message-parts>.message-text+.message-text{margin-top:20px}.message-text li>p{margin-bottom:8px}.message-text hr{border:0;border-top:1px solid var(--border);margin-block-start:24px;margin-block-end:24px}.message-text .task-list-item{list-style:none}.message-text input[type=checkbox]{accent-color:var(--accent);margin-right:8px}.markdown-table-scroll{overflow-x:auto;border:1px solid var(--border);border-radius:8px;max-width:100%;margin-block-start:20px;margin-block-end:20px}.markdown-table-scroll table{border-collapse:collapse;text-align:left;width:100%;font-size:14px;line-height:1.6}.markdown-table-scroll :-webkit-any(th,td){vertical-align:top;border-bottom:1px solid var(--border-soft);overflow-wrap:anywhere;min-width:120px;padding:12px 16px}.markdown-table-scroll :-moz-any(th,td){vertical-align:top;border-bottom:1px solid var(--border-soft);overflow-wrap:anywhere;min-width:120px;padding:12px 16px}.markdown-table-scroll :is(th,td){vertical-align:top;border-bottom:1px solid var(--border-soft);overflow-wrap:anywhere;min-width:120px;padding:12px 16px}.markdown-table-scroll th{background:var(--inset);color:var(--text-secondary);font-weight:600}.markdown-table-scroll tr:last-child td{border-bottom:0}.completed-tools{color:var(--text-muted);margin-block-start:0;margin-block-end:0;font-size:12px}.completed-tools>summary{display:flex;list-style:none;align-items: center;gap:8px;width:-moz-fit-content;width:fit-content;min-height:44px}.completed-tools>summary::-webkit-details-marker{display:none}.completed-tools>summary>svg:first-child{color:var(--success)}.completed-tools[open]>summary>svg:last-child{transform:rotate(180deg)}.message-text ul,.message-text ol{max-width:72ch;margin:0 0 15px;padding-left:22px}.message-text li+li{margin-top:4px}.message-text blockquote{border-left:2px solid var(--accent);color:var(--text-secondary);white-space:pre-wrap;max-width:72ch;margin:12px 0 15px;padding-left:13px}.message-text a{color:var(--info);text-underline-offset:2px}.inline-code,.message-text :not(pre)>code{border:1px solid var(--border-soft);background:var(--inset);color:#dce6ef;font-family:var(--mono);overflow-wrap:anywhere;border-radius:5px;padding:1px 5px;font-size:.9em}.code-block{overflow:hidden;border:1px solid var(--border);background:var(--inset);border-radius:11px;margin:14px 0 18px}.code-header{display:flex;border-bottom:1px solid var(--border-soft);color:var(--text-muted);font-family:var(--mono);justify-content:space-between;align-items: center;min-height:34px;padding:0 12px;font-size:11px}.code-header button{color:var(--text-secondary);font-family:inherit;font-size:inherit;background:0 0;min-height:44px}.code-block pre,.tool-details pre,.authorization-gate pre{overflow:auto;font-family:var(--mono);white-space:pre-wrap;overflow-wrap:anywhere;margin:0;font-size:12px;line-height:1.65}.code-block pre{color:#dce6ef;white-space:pre;overflow-wrap:normal;padding:14px 16px 17px}.reasoning-part{color:var(--text-muted);margin:0 0 12px;font-size:12px}.reasoning-part summary{color:var(--text-secondary);align-content: center;width:max-content;min-height:44px}.reasoning-part p{white-space:pre-wrap;margin:8px 0 0}.tool-event{overflow:hidden;border:1px solid var(--border);background:var(--inset);border-radius:11px;margin:10px 0}.tool-event[open]{background:#111820}.tool-event summary{display:flex;list-style:none;align-items: center;gap:10px;min-height:48px;padding:8px 12px}.tool-event summary::-webkit-details-marker{display:none}.tool-event summary>svg:last-child{margin-left:auto;transition:transform .16s ease-out}.tool-event[open] summary>svg:last-child{transform:rotate(180deg)}.tool-state-mark{display:inline-flex;background:var(--elevated);color:var(--text-muted);border-radius:7px;justify-content:center;align-items: center;width:26px;height:26px}.state-output-available .tool-state-mark{color:var(--success)}.state-output-error .tool-state-mark{color:var(--error)}.state-approval-requested .tool-state-mark{color:var(--warning)}.tool-summary-copy{display:grid;min-width:0}.tool-summary-copy strong{color:var(--text-secondary);font-size:12px;font-weight:610}.tool-summary-copy small{overflow:hidden;color:var(--text-muted);font-family:var(--mono);text-overflow:ellipsis;white-space:nowrap;font-size:10px}.tool-details{display:grid;gap:12px;padding:0 12px 13px 48px}.tool-badge{background:var(--elevated);color:var(--text-secondary);font-family:var(--mono);white-space:nowrap;border-radius:6px;flex:none;margin-left:auto;padding:2px 7px;font-size:10px}.tool-badge.failed{color:var(--error)}.tool-event summary>.tool-badge+svg:last-child{margin-left:0}.tool-view{display:grid;gap:6px;min-width:0}.tool-view-path,.tool-view-note{color:var(--text-muted);font-family:var(--mono);overflow-wrap:anywhere;font-size:11px}.tool-view-list{display:grid;overflow:auto;color:var(--text-secondary);font-family:var(--mono);list-style:none;gap:2px;max-height:240px;margin:0;padding:0;font-size:11px}.tool-view-list li{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tool-details pre.diff-view{white-space:pre;overflow-wrap:normal}.diff-line.added{color:var(--success);background:#8bd49c14}.diff-line.removed{color:var(--error);background:#f28b8214}.diff-line.hunk{color:var(--info)}.diff-line.meta{color:var(--text-muted)}.tool-details pre.command-line{color:var(--text)}.tool-details pre.command-output.failed{border-color:#f28b8259}.tool-event .tool-raw summary{display:inline-flex;color:var(--text-muted);cursor:pointer;min-height:32px;padding:0;font-size:11px}.tool-raw{display:grid;gap:10px}.tool-raw>div>span,.tool-details>div>span{display:block;color:var(--text-muted);letter-spacing:.04em;text-transform:uppercase;margin-bottom:4px;font-size:10px;font-weight:650}.tool-details pre{border:1px solid var(--border-soft);background:var(--base);color:var(--text-secondary);border-radius:7px;max-height:280px;padding:10px}.source-link,.attachment-line{display:flex;color:var(--info);text-decoration:none;align-items: center;gap:7px;width:max-content;max-width:100%;margin:8px 0;font-size:12px}.source-link span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.source-link:not(.static):hover{text-decoration:underline}.source-link.static,.attachment-line{color:var(--text-muted)}.agent-working{display:flex;color:var(--text-muted);align-items: center;gap:9px;padding:17px 128px 0;font-size:12px}.conversation-controls{position:relative;z-index:4;background:var(--panel);flex:none;padding:0 0 10px}.inline-error,.new-session-error{display:flex;color:#f2aaa3;background:#261719;border:1px solid #603638;border-radius:8px;align-items: center;gap:9px;margin-bottom:8px;padding:9px 11px;font-size:12px}.inline-error span{flex:1}.inline-error button{color:var(--text);background:0 0;font-weight:620}.approval-dock,.prompt-dock{overflow:hidden;background:#211a13;border:1px solid #62472d;border-radius:11px;margin-bottom:8px}.approval-row{display:grid;grid-template-columns:auto minmax(0,1fr)auto;align-items: center;gap:11px;padding:12px}.approval-row+.approval-row{border-top:1px solid #493522}.approval-icon{display:inline-flex;color:var(--warning)}.approval-row strong,.prompt-dock strong{color:var(--text);font-size:12px}.approval-row p,.prompt-dock p{color:var(--text-secondary);margin:1px 0;font-size:12px}.approval-row small{color:#b39272;font-size:10px}.approval-actions,.project-browser-actions,.prompt-options,.prompt-custom{display:flex;align-items: center;gap:7px}.primary-button,.secondary-button{display:inline-flex;border-radius:8px;justify-content:center;align-items: center;gap:7px;min-height:36px;padding:7px 12px;font-size:12px;font-weight:650}.primary-button{background:var(--accent);color:#23170c}.primary-button:hover:not(:disabled){background:#ffc077}.secondary-button{border:1px solid var(--border);background:var(--elevated);color:var(--text-secondary)}.secondary-button:hover:not(:disabled){color:var(--text);border-color:#3e4b5d}.compact-primary{min-height:32px;padding:5px 10px}.prompt-dock{display:grid;gap:10px;padding:12px}.prompt-custom input{border:1px solid var(--border);outline:0;background:var(--inset);border-radius:7px;flex:1;min-width:0;min-height:34px;padding:6px 9px}.prompt-custom input:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.composer,.starter-composer{overflow:hidden;background:var(--inset);border:1px solid #3c495a;border-radius:13px;transition:border-color .16s ease-out,background-color .16s ease-out}.command-composer-shell{position:relative}.slash-command-menu{position:absolute;z-index:45;overflow:hidden;background:#11171e;border:1px solid #344151;border-radius:11px;bottom:calc(100% + 8px);left:0;right:0;box-shadow:0 16px 38px #0000006b}.slash-command-menu-header{display:flex;border-bottom:1px solid var(--border-soft);color:var(--text-muted);letter-spacing:.02em;text-transform:uppercase;justify-content:space-between;align-items: center;gap:12px;min-height:34px;padding:7px 10px 6px 12px;font-size:10px}.slash-command-menu-header span:last-child{letter-spacing:0;text-transform:none}.slash-command-menu kbd{border:1px solid var(--border);background:var(--elevated);color:var(--text-secondary);font:inherit;border-radius:4px;padding:1px 4px}.slash-command-options{overflow-y:auto;overscroll-behavior:contain;max-height:min(390px,48dvh);padding:5px}.slash-command-option{display:grid;grid-template-columns:27px minmax(0,1fr)auto;color:var(--text-secondary);text-align:left;background:0 0;border-radius:7px;align-items: center;gap:8px;width:100%;min-height:49px;padding:6px 9px}.appearance-starter .slash-command-options{max-height:min(310px,34dvh)}.appearance-starter .slash-command-menu{top:calc(100% + 8px);bottom:auto}.slash-command-option:hover,.slash-command-option.selected{color:var(--text);background:#1b2631}.slash-command-option.selected{box-shadow:inset 2px 0 0 var(--accent)}.slash-command-icon{display:grid;border:1px solid var(--border-soft);background:var(--inset);color:var(--text-muted);border-radius:6px;place-items: center;width:26px;height:26px}.slash-command-copy{display:grid;gap:2px;min-width:0}.slash-command-copy>span{display:flex;align-items:baseline;gap:7px;min-width:0}.slash-command-copy code{color:var(--accent-text);font-size:12px;font-weight:650}.slash-command-copy small,.slash-command-enter{color:var(--text-muted);font-size:10px}.slash-command-copy>small{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.slash-command-enter{opacity:0}.slash-command-option.selected .slash-command-enter{opacity:1}.slash-command-empty{color:var(--text-muted);text-align:center;padding:18px 12px;font-size:12px}.slash-command-empty code{color:var(--accent-text)}.command-result{display:grid;grid-template-columns:26px minmax(0,1fr)auto;overflow-y:auto;border:1px solid var(--border);background:var(--elevated);color:var(--text-secondary);border-radius:9px;align-items: start;gap:8px;max-height:min(250px,36dvh);margin-bottom:7px;padding:9px 9px 9px 10px}.command-result.tone-success{border-color:#315446}.command-result.tone-error{border-color:#674244}.command-result-icon{display:grid;color:var(--accent-text);place-items: center;width:24px;height:24px}.command-result.tone-success .command-result-icon{color:#8bd6ac}.command-result.tone-error .command-result-icon{color:#f4aaa3}.command-result>div{min-width:0}.command-result strong{display:block;color:var(--text);font-size:11px}.command-result p{color:var(--text-secondary);overflow-wrap:anywhere;white-space:pre-wrap;margin:3px 0 0;font:10.5px/1.5 ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace}.command-result>button{display:grid;color:var(--text-muted);border-radius:6px;place-items: center;width:28px;height:28px}.command-result>button:hover{background:var(--inset);color:var(--text)}.composer:focus-within,.starter-composer:focus-within{border-color:var(--accent);background:#11171e}.composer.disabled{opacity:.72}.composer textarea,.starter-composer textarea{display:block;resize:none;outline:0;color:var(--text);field-sizing:content;background:0 0;border:0;width:100%;min-height:62px;max-height:220px;padding:14px 16px 6px;line-height:1.55}.composer textarea::placeholder,.starter-composer textarea::placeholder,.prompt-custom input::placeholder{color:var(--text-muted);opacity:1}.composer-toolbar,.starter-toolbar{display:flex;align-items: center;min-height:40px;padding:4px 7px 7px 13px}.composer-toolbar>span,.starter-toolbar>span{display:flex;color:var(--text-muted);align-items: center;gap:7px;font-size:11px}.composer-toolbar>span small,.starter-toolbar>span small{color:var(--text-muted);font-size:10px}.send-button,.abort-button{display:inline-flex;border-radius:8px;justify-content:center;align-items: center;gap:6px;min-height:31px;margin-left:auto}.send-button{background:var(--accent);color:#20150b;width:31px}.send-button:hover:not(:disabled){background:#ffc077}.abort-button{color:#f4aaa3;background:#29191b;border:1px solid #674244;padding:5px 9px;font-size:11px}.composer-hint{display:flex;color:var(--text-muted);justify-content:space-between;align-items: center;gap:12px;padding:6px 2px 0;font-size:10px}.context-meter{display:inline-flex;font-family:var(--mono);white-space:nowrap;align-items: center;gap:6px;margin-left:auto}.context-meter-bar{position:relative;overflow:hidden;background:var(--border-soft);border-radius:999px;width:44px;height:4px}.context-meter-bar>span{position:absolute;border-radius:inherit;background:var(--text-muted);inset:0 auto 0 0}.context-meter.warning{color:var(--warning)}.context-meter.warning .context-meter-bar>span{background:var(--warning)}.context-meter.critical{color:var(--error)}.context-meter.critical .context-meter-bar>span{background:var(--error)}.new-session-surface{display:grid;overflow-y:auto;flex:1;place-items: center;min-height:0;padding:32px}.new-session-inner{width:min(100%,780px);padding-block-start:32px;padding-block-end:32px}.new-session-title{display:flex;align-items: center;gap:14px;margin-bottom:24px}.new-session-mark{background:var(--accent-soft);border:1px solid #62472d;border-radius:12px;width:44px;height:44px}.new-session-title>div{flex:1;min-width:0}.new-session-title h1{letter-spacing:-.03em;text-wrap:balance;overflow-wrap:anywhere;font-size:clamp(27px,3vw,38px);font-weight:550}.new-session-project-controls{display:grid;justify-items:start;gap:5px;margin-top:9px}.new-session-project-button{display:flex;border:1px solid var(--border);background:var(--inset);color:var(--text-secondary);text-align:left;border-radius:9px;align-items: center;gap:10px;width:min(100%,560px);max-width:100%;min-height:48px;padding:8px 11px}.new-session-project-button:hover:not(:disabled){background:var(--elevated);color:var(--text);border-color:#4b3b2b}.new-session-project-button>span:not(.inline-spinner){display:grid;flex:1;min-width:0}.new-session-project-button strong,.new-session-project-button small{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.new-session-project-button strong{color:var(--text);font-size:13px;font-weight:650}.new-session-project-button small{color:var(--text-muted);font-size:12px}.inline-spinner{display:inline-block;animation:spin .8s linear infinite;border:2px solid;border-top-color:#0000;border-radius:50%;flex:none;width:14px;height:14px}.starter-composer textarea{min-height:116px;padding-top:17px;font-size:15px}.button-loading{animation:spin .8s linear infinite;border:2px solid #6b4622;border-top-color:#20150b;border-radius:50%;width:13px;height:13px}@keyframes spin{to{transform:rotate(360deg)}}.new-session-error{margin-top:9px;margin-bottom:0}.starter-suggestions{display:flex;flex-wrap:wrap;gap:7px;margin-top:12px}.starter-suggestions button{display:inline-flex;border:1px solid var(--border-soft);color:var(--text-muted);background:0 0;border-radius:8px;align-items: center;gap:8px;min-height:44px;padding:6px 10px;font-size:12px}.starter-suggestions button:hover:not(:disabled){border-color:var(--border);background:var(--inset);color:var(--text-secondary)}.starter-description{color:var(--text-secondary);margin:12px 0 22px;font-size:15px;line-height:1.6}.new-session-title{align-items: flex-start;gap:18px}.new-session-mark{flex-shrink:0;margin-top:3px}.session-search,.model-search{display:flex;border:1px solid var(--border);color:var(--text-muted);background:var(--inset);border-radius:8px;align-items: center;gap:8px;min-height:44px;padding:0 10px}.session-search{margin:2px 14px 18px}.session-search:focus-within,.model-search:focus-within{border-color:var(--accent)}.session-search input,.model-search input{outline:none;background:0 0;border:0;width:100%;min-width:0;padding:10px 0;font-size:13px}.session-search kbd{font:10px var(--mono);flex-shrink:0}.rail-footer{display:flex;border-top:1px solid var(--border-soft);color:var(--text-secondary);align-items: center;gap:10px;padding:20px 16px;font-size:11px}.rail-footer small{display:block;color:var(--text-muted);margin-top:3px;font-size:10px}.rail-state button{background:var(--elevated);border-radius:6px;min-height:36px;padding:6px 14px}.composer-command-trigger{display:inline-flex;color:var(--text-secondary);background:0 0;border-radius:6px;align-items: center;gap:7px;min-height:36px;padding:5px 8px;font-size:12px}.composer-command-trigger:hover{background:var(--elevated);color:var(--text)}.composer-command-trigger kbd{color:var(--text-muted);font:11px var(--mono);margin-left:4px}.composer-toolbar .draft-status,.starter-toolbar .draft-status{flex:1;justify-content:flex-end;font-size:11px}.starter-footnote{display:flex;color:var(--text-muted);align-items: center;gap:8px;margin-top:22px;font-size:12px}.recent-sessions{margin-top:38px}.recent-sessions-heading{display:flex;justify-content:space-between;align-items: center;gap:12px;margin-bottom:8px}.recent-sessions-heading h2{color:var(--text-secondary);margin:0;font-size:13px;font-weight:550}.recent-sessions-heading button{display:flex;color:var(--text-muted);background:0 0;align-items: center;gap:5px;min-height:36px;font-size:12px}.recent-session{display:flex;border-top:1px solid var(--border-soft);text-align:left;color:var(--text-muted);background:0 0;align-items: center;gap:14px;width:100%;min-height:68px;padding:12px 4px}.recent-session:hover{background:var(--inset);color:var(--text)}.recent-session>span{flex:1;min-width:0}.recent-session strong,.recent-session small{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.recent-session strong{color:var(--text);font-size:14px;font-weight:500}.recent-session small{font:11px var(--mono);margin-top:4px}.recent-session time{white-space:nowrap;font-size:11px}.ribbon-model{cursor:pointer;background:0 0;border-radius:6px;padding:7px 9px}.ribbon-model:hover:not(:disabled){background:var(--elevated);color:var(--text)}.ribbon-model>span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ribbon-model>svg{flex-shrink:0}.composer-session-context{display:flex;flex:1;align-items: center;gap:12px;min-width:0;margin-left:8px}.composer-session-trigger{display:inline-flex;color:var(--text-secondary);background:0 0;border-radius:6px;align-items: center;gap:6px;min-height:36px;padding:5px 8px;font-size:12px}.composer-session-trigger:hover,.composer-session-trigger[aria-expanded=true]{background:var(--elevated);color:var(--text)}.composer-session-status{color:var(--text-muted);min-width:min-content;font-size:11px}.composer-session-status:-webkit-any(.status-working,.status-input-needed){color:var(--accent-text)}.composer-session-status:-moz-any(.status-working,.status-input-needed){color:var(--accent-text)}.composer-session-status:is(.status-working,.status-input-needed){color:var(--accent-text)}.composer-session-status.status-error{color:var(--error)}.composer-session-panel{position:absolute;z-index:44;overflow:auto;border:1px solid var(--border);background:var(--panel);color:var(--text-secondary);border-radius:12px;max-height:min(240px,45dvh);padding:16px 20px;bottom:calc(100% + 8px);left:0;right:0}.composer-session-panel h2{color:var(--text);overflow-wrap:anywhere;margin:0 0 8px;font-size:15px;font-weight:550}.composer-session-panel p{margin:4px 0 0;font-size:12px}@media (max-width:400px){.composer-command-trigger{padding-inline-start:4px;padding-inline-end:4px}.composer-command-trigger>svg,.composer-command-trigger>kbd{display:none}}.jump-to-latest{display:flex;border:1px solid var(--border);background:var(--elevated);color:var(--text-secondary);border-radius:20px;align-items: center;gap:7px;min-height:36px;margin:0 auto 12px;padding:6px 14px;font-size:12px}.model-picker{overflow:hidden;border:1px solid var(--border);background:var(--panel);color:var(--text);border-radius:14px;width:min(560px,100% - 32px);max-height:calc(100dvh - 48px);padding:0}.model-picker::backdrop{background:#000000a6}.model-picker-content{display:flex;flex-direction:column;max-height:calc(100dvh - 50px);padding:24px}.model-picker header{display:flex;justify-content:space-between;align-items: flex-start;gap:16px;margin-bottom:20px}.model-picker h2{letter-spacing:-.035em;margin:0;font-size:23px;font-weight:550}.model-picker header p{color:var(--text-muted);margin:6px 0 0;font-size:12px}.model-search{flex-shrink:0}.model-list{overflow-y:auto;min-height:100px;margin:16px -8px}.model-option{display:flex;text-align:left;background:0 0;border-radius:8px;align-items: center;gap:16px;width:100%;min-height:64px;padding:12px}.model-option:hover:not(:disabled){background:var(--elevated)}.model-option.selected{background:var(--accent-soft);color:var(--accent-text)}.model-option>span:first-child{flex:1;min-width:0}.model-option strong,.model-option small{display:block;overflow-wrap:anywhere}.model-option strong{font-size:14px;font-weight:550}.model-option small{font:11px var(--mono);color:var(--text-muted);margin-top:4px}.model-option.selected small{color:var(--accent-text)}.model-capability{white-space:nowrap;font-size:11px}.model-picker footer{display:flex;border-top:1px solid var(--border);color:var(--text-muted);flex-shrink:0;justify-content:space-between;align-items: center;gap:10px;padding-top:16px;font-size:11px}.model-list-empty,.model-picker-error{color:var(--text-secondary);padding:12px;font-size:13px}.model-picker-error{color:var(--error)}@media (max-width:760px){.composer-session-context{gap:6px;margin-left:0}.composer-session-trigger{min-height:44px;padding-inline-start:6px;padding-inline-end:6px}.composer-session-trigger>svg:first-child{display:none}.composer-session-panel{padding:16px}.new-session-title{gap:12px}.new-session-mark{display:none}.new-session-inner{padding-block-start:8px;padding-block-end:8px}.starter-description{font-size:14px}.recent-session{gap:10px}.recent-session time{white-space:normal;text-align:right;max-width:80px}.model-picker-content{padding:18px}.model-capability{white-space:normal;text-align:right;max-width:76px}}.authorization-gate{display:grid;background:var(--base);align-content: center;justify-items:start;width:min(100% - 40px,560px);height:100%;margin:0 auto}.authorization-mark{background:var(--accent-soft);border:1px solid #62472d;border-radius:13px;width:48px;height:48px;margin-bottom:22px}.authorization-gate p{color:var(--text-secondary);margin:13px 0 17px;font-size:15px}.authorization-gate pre{border:1px solid var(--border);background:var(--inset);color:var(--accent-text);border-radius:9px;min-width:190px;padding:11px 14px}.authorization-gate small{color:var(--text-muted);max-width:58ch;margin-top:13px}.project-browser-backdrop{position:fixed;z-index:80;display:grid;background:#06090dc7;place-items: center;padding:24px;inset:0}.project-browser{display:grid;grid-template-rows:auto auto minmax(0,1fr)auto;overflow:hidden;background:var(--panel);border:1px solid #3c495a;border-radius:14px;width:min(100%,1040px);height:min(700px,100dvh - 48px);box-shadow:0 24px 64px #0000008c}.pb-header{display:flex;justify-content:space-between;align-items: flex-start;gap:12px;padding:16px 18px 12px}.pb-header h1{letter-spacing:-.015em;margin:0;font-size:17px;font-weight:660}.pb-header p{color:var(--text-muted);margin:3px 0 0;font-size:12px}.pb-toolbar{display:flex;border-bottom:1px solid var(--border-soft);align-items: center;gap:8px;padding:0 14px 12px 12px}.pb-address{display:flex;overflow-x:auto;border:1px solid var(--border);background:var(--inset);color:var(--text-muted);white-space:nowrap;scrollbar-width:none;border-radius:8px;flex:auto;align-items: center;gap:1px;min-width:0;min-height:34px;padding:2px 6px;font-size:12px}.pb-crumb-group{display:inline-flex;align-items: center}.pb-crumb{color:var(--text-secondary);background:0 0;border-radius:5px;padding:4px 6px}.pb-crumb.home{display:inline-flex;color:var(--text-muted);padding:4px 5px}.pb-crumb:hover:not(:disabled){background:var(--elevated);color:var(--text)}.pb-crumb[aria-current=location]{color:var(--text);font-weight:600}.pb-crumb-label{color:var(--text-secondary);padding:0 6px}.pb-filter{display:flex;border:1px solid var(--border);background:var(--inset);color:var(--text-muted);border-radius:8px;flex:0 0 220px;align-items: center;gap:7px;min-height:34px;padding:0 10px}.pb-filter:focus-within{border-color:#62472d}.pb-filter input{outline:0;color:var(--text);font:inherit;background:0 0;border:0;width:100%;min-width:0;font-size:12px}.pb-main{display:grid;grid-template-columns:210px minmax(0,1fr);min-height:0}.pb-sidebar{display:flex;overflow-y:auto;border-right:1px solid var(--border-soft);background:var(--base);flex-direction:column;gap:1px;min-height:0;padding:10px 8px}.pb-sidebar h2{color:var(--text-muted);letter-spacing:.06em;text-transform:uppercase;margin:12px 8px 4px;font-size:10.5px;font-weight:650}.pb-side-item{display:flex;color:var(--text-secondary);text-align:left;background:0 0;border-radius:7px;align-items: center;gap:9px;min-height:32px;padding:5px 9px;font-size:12.5px}.pb-side-item>span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pb-side-item>svg{color:var(--text-muted);flex:none}.pb-side-item:hover:not(:disabled){background:var(--elevated);color:var(--text)}.pb-side-item.active{background:var(--accent-soft);color:var(--accent-text)}.pb-side-item.active>svg{color:var(--accent-text)}.pb-side-item.missing{opacity:.5;text-decoration:line-through}.pb-content{overflow-y:auto;min-height:0;padding:10px 12px}.pb-list{display:grid;align-content: start;gap:1px}.pb-list.loading{opacity:.55;pointer-events:none}.pb-row{display:flex;color:var(--text-muted);border-radius:7px;align-items: center;gap:6px;padding-right:8px}.pb-row:hover,.pb-row:focus-within{background:var(--elevated)}.pb-row-main{display:flex;color:var(--text-secondary);text-align:left;background:0 0;border-radius:7px;flex:auto;align-items: center;gap:10px;min-width:0;min-height:36px;padding:6px 10px;font-size:13px}.pb-row-main>svg{color:var(--accent-text);flex:none}.pb-row:hover .pb-row-main{color:var(--text)}.pb-row-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pb-row-main .entry-note{margin-left:auto}.pb-row-open{border:1px solid var(--border);background:var(--panel);color:var(--text-secondary);opacity:0;border-radius:6px;flex:none;padding:3px 11px;font-size:11.5px}.pb-row:hover .pb-row-open,.pb-row:focus-within .pb-row-open{opacity:1}.pb-row-open:hover:not(:disabled){color:var(--accent-text);border-color:#62472d}.pb-row.file .pb-row-main,.pb-row.file .pb-row-main>svg{color:var(--text-muted)}@media (hover:none){.pb-row-open{opacity:1}}.pb-home{display:grid;gap:22px;padding:6px 4px}.pb-home h2{color:var(--text-muted);letter-spacing:.06em;text-transform:uppercase;margin:0 0 9px;font-size:10.5px;font-weight:650}.pb-cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:8px}.pb-card{display:flex;border:1px solid var(--border);background:var(--inset);color:var(--text-secondary);text-align:left;border-radius:10px;align-items: center;gap:11px;min-width:0;padding:11px 12px}.pb-card>svg{color:var(--accent-text);flex:none}.pb-card>span{display:grid;gap:2px;min-width:0}.pb-card strong{overflow:hidden;color:var(--text);text-overflow:ellipsis;white-space:nowrap;font-size:13px;font-weight:600}.pb-card small{overflow:hidden;color:var(--text-muted);font-family:var(--mono);text-overflow:ellipsis;white-space:nowrap;font-size:10.5px}.pb-card:hover:not(:disabled),.pb-tile:hover:not(:disabled){background:var(--elevated);border-color:#4a5a6e}.pb-tiles{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:8px}.pb-tile{display:grid;border:1px solid var(--border);background:var(--inset);color:var(--text-secondary);text-align:left;border-radius:10px;justify-items:start;gap:3px;min-width:0;padding:12px}.pb-tile>svg{color:var(--accent-text);margin-bottom:6px}.pb-tile strong{color:var(--text);font-size:13px;font-weight:600}.pb-tile small{overflow:hidden;color:var(--text-muted);font-family:var(--mono);text-overflow:ellipsis;white-space:nowrap;max-width:100%;font-size:10px}.pb-tile.missing{opacity:.55;border-style:dashed}.pb-footer{display:flex;border-top:1px solid var(--border-soft);background:var(--base);justify-content:space-between;align-items: center;gap:16px;min-height:60px;padding:10px 14px 10px 16px}.pb-footer.has-root-confirmation{min-height:74px}.pb-footer-info{display:grid;gap:5px;min-width:0}.pb-footer .selected-path{max-width:440px}.pb-view-options{display:flex;gap:14px}.project-browser-backdrop.compact{padding:0}.compact .project-browser{border:0;border-radius:0;width:100%;height:100dvh}.compact .pb-main{grid-template-columns:minmax(0,1fr);grid-template-rows:auto minmax(0,1fr)}.compact .pb-sidebar{overflow-x:auto;overflow-y:hidden;border-right:0;border-bottom:1px solid var(--border-soft);flex-direction:row;gap:6px;padding:8px}.compact .pb-sidebar h2{display:none}.compact .pb-side-item{border:1px solid var(--border);flex:none;min-height:40px}.compact .pb-toolbar{flex-wrap:wrap}.compact .pb-filter{flex:100%;min-height:40px}.compact .pb-row-main{min-height:44px}.compact .pb-footer{flex-direction:column;align-items:stretch;gap:8px}.compact .project-browser-actions{flex-wrap:wrap;justify-content:flex-end}.compact .pb-footer .selected-path{max-width:100%}.compact .project-browser .icon-button{width:44px;height:44px}.icon-button{display:inline-flex;color:var(--text-muted);background:0 0;border-radius:8px;justify-content:center;align-items: center;width:34px;height:34px}.icon-button:hover:not(:disabled){background:var(--elevated);color:var(--text)}.icon-button.compact{width:28px;height:28px}.picker-fallback-notice{display:grid;grid-template-columns:auto minmax(0,1fr)auto;border:1px solid var(--border);background:var(--inset);color:var(--text-secondary);border-radius:9px;align-items: center;gap:10px;margin:2px 2px 8px;padding:10px 12px}.picker-fallback-notice.info>svg{color:var(--info)}.picker-fallback-notice.error>svg{color:var(--error)}.picker-fallback-notice>span{display:grid;min-width:0}.picker-fallback-notice strong{color:var(--text);font-size:12px}.picker-fallback-notice small{color:var(--text-muted);font-size:11px}.picker-fallback-actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:7px}.picker-pending-banner{position:fixed;z-index:90;display:grid;grid-template-columns:auto minmax(0,1fr)auto;border:1px solid var(--border);background:var(--elevated);color:var(--accent-text);border-radius:10px;align-items: center;gap:10px;width:min(440px,100vw - 32px);padding:10px 12px;bottom:16px;right:16px;box-shadow:0 12px 32px #00000073}.picker-pending-banner>span:not(.inline-spinner){display:grid;gap:3px;min-width:0}.picker-pending-banner strong{color:var(--text);font-size:12px}.picker-pending-banner small{color:var(--text-muted);font-size:11px;line-height:1.45}.launch-folder-offer{display:flex;border:1px solid var(--border);background:var(--inset);border-radius:10px;flex-wrap:wrap;justify-content:space-between;align-items: center;gap:10px 14px;padding:10px 12px}.launch-folder-offer>span{display:grid;flex:220px;gap:2px;min-width:0}.launch-folder-offer strong{overflow:hidden;color:var(--text);font-family:var(--mono);text-overflow:ellipsis;white-space:nowrap;font-size:12px}.launch-folder-offer small{color:var(--text-muted);font-size:11px}.launch-folder-offer .launch-folder-broad{color:var(--warning)}.starter-recent-projects{display:flex;flex-wrap:wrap;align-items: center;gap:6px}.starter-recent-projects small{color:var(--text-muted);margin-right:4px;font-size:11px}.starter-recent-projects button{display:inline-flex;overflow:hidden;border:1px solid var(--border);background:var(--inset);color:var(--text-secondary);text-overflow:ellipsis;white-space:nowrap;border-radius:999px;align-items: center;gap:6px;max-width:220px;min-height:32px;padding:4px 11px;font-size:12px}.starter-recent-projects button:hover:not(:disabled){color:var(--text);border-color:#3e4b5d}.folder-loading-status{position:sticky;z-index:2;display:flex;border:1px solid var(--border-soft);background:color-mix(in srgb,var(--panel)92%,transparent);color:var(--text-muted);backdrop-filter:blur(6px);border-radius:7px;align-items: center;gap:8px;min-height:36px;margin:0 2px 6px;padding:7px 10px;font-size:11px;top:0}.entry-note{color:var(--text-muted);font-family:var(--mono);font-size:10px}.browser-state{display:grid;color:var(--text-muted);text-align:center;align-content: center;justify-items:center;min-height:220px;padding:28px}.browser-state h2{color:var(--text);margin:13px 0 3px;font-size:15px;font-weight:640}.browser-state p{max-width:50ch;margin:0 0 14px;font-size:12px}.error-state>svg{color:var(--error)}.load-more-button{border:1px solid var(--border);background:var(--inset);color:var(--text-secondary);border-radius:8px;min-height:38px;margin:9px}.checkbox-control{display:flex;color:var(--text-muted);white-space:nowrap;align-items: center;gap:8px;font-size:11px}.checkbox-control input{accent-color:var(--accent);width:15px;height:15px}.broad-root-warning{display:grid;grid-template-columns:auto minmax(180px,1fr);color:var(--warning);align-items: start;gap:2px 8px;max-width:520px;font-size:11px}.broad-root-warning>svg{margin-top:1px}.broad-root-warning button{grid-column:2;color:var(--text-secondary);text-decoration:underline;background:0 0;width:max-content;padding:1px 0;font-size:11px}.project-browser-actions{justify-content:flex-end;min-width:0}.selected-path{overflow:hidden;color:var(--text-muted);font-family:var(--mono);text-overflow:ellipsis;white-space:nowrap;max-width:310px;font-size:10px}.rail-scrim,.mobile-only{display:none}@media (max-width:980px){.ribbon-model{max-width:150px}.workspace-path{max-width:34vw}.permission-select{max-width:112px}}@media (max-width:760px){.app-shell{display:block}.mobile-only{display:inline-flex}.session-rail{position:fixed;z-index:70;visibility:hidden;width:min(86vw,310px);transition:transform .19s cubic-bezier(.16,1,.3,1),visibility 0s linear .19s;inset:0 auto 0 0;transform:translate(-102%)}.session-rail.open{visibility:visible;transition-delay:0s;transform:translate(0)}.rail-scrim{position:fixed;z-index:60;display:block;background:#05080cb3;width:100%;height:100%;inset:0}.workspace-main{width:100%;height:100dvh}.workspace-ribbon{display:grid;grid-template-columns:44px minmax(0,1fr)auto auto;gap:5px;padding-inline-start:8px;padding-inline-end:8px}.ribbon-menu{color:var(--accent-text);flex:none}.ribbon-menu,.rail-header .icon-button,.send-button{width:44px;min-width:44px;height:44px;min-height:44px}.project-button,.new-session-button{width:100%;min-height:44px}.ribbon-select{min-height:44px}.workspace-path{flex:1;min-width:0;max-width:none;min-height:44px}.workspace-ribbon>.ribbon-menu{grid-area:1/1}.workspace-ribbon>.workspace-path{grid-area:1/2/2/-1}.workspace-ribbon>.ribbon-model{grid-area:2/1/3/3;min-width:0;max-width:none;min-height:44px}.workspace-ribbon>.ribbon-select{grid-area:2/3;min-width:72px}.workspace-ribbon>.permission-select{grid-area:2/4;min-width:64px}.composer-command-trigger,.recent-sessions-heading button,.jump-to-latest,.model-picker .icon-button{min-height:44px}.model-picker .icon-button{min-width:44px}.approval-actions button,.prompt-options button,.prompt-custom button,.prompt-custom input,.command-result>button,.abort-button,.starter-suggestions button{min-height:44px}.command-result>button{width:44px;min-width:44px}.workspace-path-copy small,.ribbon-status,.ribbon-spacer{display:none}.conversation-column{padding-inline-start:16px;padding-inline-end:16px}.slash-command-menu-header span:last-child{display:none}.slash-command-option{min-height:52px}.conversation-scroll>.conversation-column{padding-top:14px;padding-bottom:18px}.chat-message{grid-template-columns:1fr;gap:10px;padding-block-start:19px;padding-block-end:22px}.chat-message>header{height:auto}.agent-working{padding-left:0}.composer-hint span:last-child{display:none}.approval-row{grid-template-columns:auto minmax(0,1fr)}.approval-actions{grid-column:2;justify-content:flex-start}.new-session-surface{align-items: start;padding:52px 16px 24px}.new-session-inner{transform:none}.new-session-title h1{font-size:28px}.new-session-title{align-items: flex-start}.new-session-project-button{min-height:44px}.starter-suggestions{display:grid}}@media (max-width:460px){.workspace-ribbon{min-height:52px}.ribbon-select{height:44px;padding-inline-start:5px;padding-inline-end:5px}.ribbon-select>svg:first-of-type{display:none}.conversation-column{padding-inline-start:11px;padding-inline-end:11px}.composer-hint{display:none}.conversation-controls{padding-bottom:7px}.approval-actions,.prompt-options{flex-direction:column;align-items:stretch}.primary-button,.secondary-button{width:100%}.project-browser-actions{flex-wrap:wrap}}.workspace-controls{display:flex;color:var(--text-secondary);align-items: center;gap:4px;min-width:0}.workspace-controls-agent{flex:0 auto;margin-right:8px}.workspace-controls .ribbon-model{color:var(--text-secondary);min-width:0;max-width:200px;min-height:36px;font-family:inherit}.workspace-controls .ribbon-select{color:var(--text-secondary);background:0 0;border:0;height:36px;font-size:12px}.workspace-controls .ribbon-select:hover:not(.disabled){background:var(--elevated)}.workspace-controls .permission-select{color:var(--accent-text)}.workspace-controls .workspace-path{color:var(--text-secondary);gap:6px;min-width:0;max-width:240px;min-height:28px;padding:2px 4px}.workspace-controls .workspace-path strong{color:inherit;font-size:11px;font-weight:500}.workspace-controls .workspace-path:hover{background:var(--elevated)}.workspace-controls .workspace-icon{color:inherit}.workspace-controls .ribbon-status{color:var(--text-muted);font-size:11px}.composer-hint{align-items: center}.starter-project-context{display:flex;justify-content:space-between;align-items: center;gap:8px;margin-top:4px}@media (max-width:1100px){.composer-toolbar,.starter-toolbar{flex-wrap:wrap}.workspace-controls-agent{flex:1 0 100%;margin:0}.workspace-controls-agent .ribbon-model{max-width:140px}.workspace-controls-agent .ribbon-select>svg:first-of-type{display:none}}@media (max-width:760px){.composer-toolbar,.starter-toolbar{flex-wrap:wrap}.workspace-controls-agent{flex:1 0 100%;margin:0}.workspace-controls-agent .ribbon-model{flex:1;max-width:none;min-height:44px}.workspace-controls-agent .ribbon-select{min-width:44px;min-height:44px}.workspace-controls-project{flex:1}.workspace-controls-project .workspace-path{max-width:220px;min-height:44px}.workspace-controls-project .ribbon-status{display:flex;margin-left:auto}.workspace-controls-project .ribbon-menu{color:var(--text-secondary)}.composer-hint{display:flex;padding-top:0}.composer-hint>span{display:none}.starter-project-context{flex-wrap:wrap}}@media (prefers-reduced-motion:reduce){*,*:before,*:after{scroll-behavior:auto!important;animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}
|