@galaxyproject/olit 0.0.0

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.
Files changed (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +188 -0
  3. package/package.json +61 -0
  4. package/static/InterVariable-Italic.woff2 +0 -0
  5. package/static/InterVariable.woff2 +0 -0
  6. package/static/JetBrainsMono-Bold.woff2 +0 -0
  7. package/static/JetBrainsMono-BoldItalic.woff2 +0 -0
  8. package/static/JetBrainsMono-Italic.woff2 +0 -0
  9. package/static/JetBrainsMono-Regular.woff2 +0 -0
  10. package/static/index.css +1 -0
  11. package/static/index.html +13 -0
  12. package/static/index.js +4024 -0
  13. package/static/logo.svg +31 -0
  14. package/static/olit.xml +98 -0
  15. package/static/pyodide/README.md +62 -0
  16. package/static/pyodide/annotated_types-0.7.0-py3-none-any.whl +0 -0
  17. package/static/pyodide/attrs-25.2.0-py3-none-any.whl +0 -0
  18. package/static/pyodide/console-v2.html +393 -0
  19. package/static/pyodide/console.html +305 -0
  20. package/static/pyodide/ffi.d.ts +1130 -0
  21. package/static/pyodide/galaxy-charts-e7348f1e5617.js +38078 -0
  22. package/static/pyodide/galaxy-ops-6b6069501426.js +9476 -0
  23. package/static/pyodide/jsonschema-4.23.0-py3-none-any.whl +0 -0
  24. package/static/pyodide/jsonschema_specifications-2024.10.1-py3-none-any.whl +0 -0
  25. package/static/pyodide/llm-fetch.js +16 -0
  26. package/static/pyodide/micropip-0.11.1-py3-none-any.whl +0 -0
  27. package/static/pyodide/numpy-2.2.5-cp313-cp313-pyemscripten_2025_0_wasm32.whl +0 -0
  28. package/static/pyodide/olit-0.0.0-07b000ed515e9-py3-none-any.whl +0 -0
  29. package/static/pyodide/package.json +126 -0
  30. package/static/pyodide/pandas-2.3.3-cp313-cp313-pyemscripten_2025_0_wasm32.whl +0 -0
  31. package/static/pyodide/pydantic-2.12.5-py3-none-any.whl +0 -0
  32. package/static/pyodide/pydantic_core-2.41.5-cp313-cp313-pyemscripten_2025_0_wasm32.whl +0 -0
  33. package/static/pyodide/pyodide-lock.json +1 -0
  34. package/static/pyodide/pyodide-worker.js +120 -0
  35. package/static/pyodide/pyodide.asm.js +15 -0
  36. package/static/pyodide/pyodide.asm.wasm +0 -0
  37. package/static/pyodide/pyodide.d.ts +1699 -0
  38. package/static/pyodide/pyodide.js +6 -0
  39. package/static/pyodide/pyodide.js.map +7 -0
  40. package/static/pyodide/pyodide.mjs +4 -0
  41. package/static/pyodide/pyodide.mjs.map +7 -0
  42. package/static/pyodide/pyrsistent-0.20.0-cp313-cp313-pyemscripten_2025_0_wasm32.whl +0 -0
  43. package/static/pyodide/python_dateutil-2.9.0.post0-py2.py3-none-any.whl +0 -0
  44. package/static/pyodide/python_stdlib.zip +0 -0
  45. package/static/pyodide/pytz-2025.2-py2.py3-none-any.whl +0 -0
  46. package/static/pyodide/pyyaml-6.0.2-cp313-cp313-pyemscripten_2025_0_wasm32.whl +0 -0
  47. package/static/pyodide/referencing-0.36.2-py3-none-any.whl +0 -0
  48. package/static/pyodide/rpds_py-0.30.0-cp313-cp313-pyemscripten_2025_0_wasm32.whl +0 -0
  49. package/static/pyodide/six-1.17.0-py2.py3-none-any.whl +0 -0
  50. package/static/pyodide/typing_extensions-4.15.0-py3-none-any.whl +0 -0
  51. package/static/pyodide/typing_inspection-0.4.2-py3-none-any.whl +0 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024-2026 Galaxy Project contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,188 @@
1
+ # Olit: A Browser-Native AI Co-Scientist for Galaxy
2
+
3
+ Olit is an AI co-scientist that runs directly inside Galaxy, in the web browser.
4
+
5
+ It can inspect histories and datasets, plan analyses, search for and run Galaxy tools and workflows, follow their execution, inspect results, perform local computation, create visualizations and other artifacts, and continue working from what it finds.
6
+
7
+ **The browser runs the agent; Galaxy runs the science.**
8
+
9
+ Galaxy provides the computational environment: datasets, tools, workflows, jobs, histories, and provenance. Lightweight Python runs locally through Pyodide. The agent uses the researcher's active Galaxy session, and model credentials remain in the browser.
10
+
11
+ No separate agent server or per-user compute container is required.
12
+
13
+ ## Why Olit?
14
+
15
+ Galaxy already provides AI capabilities for tasks such as chat, error analysis, and tool recommendation. Olit explores a different question:
16
+
17
+ > **Can an open-ended AI co-scientist operate Galaxy directly from the browser, using Galaxy itself as its computational environment?**
18
+
19
+ A research question can become a multi-step Galaxy analysis. Olit can inspect the available data, develop a plan, select and configure tools, submit jobs and workflows, wait for their results, inspect the outputs, and continue the analysis based on what it finds.
20
+
21
+ Scientific computation remains in Galaxy. Tools, parameters, inputs, outputs, and provenance remain part of the normal Galaxy research record rather than moving into a separate agent environment.
22
+
23
+ ## Architecture
24
+
25
+ ```mermaid
26
+ flowchart TB
27
+ UI["Orbit's Chat Interface"]
28
+
29
+ subgraph Olit
30
+ UI
31
+ Brain["Olit's Pyodide Brain"]
32
+ Skill["Galaxy Skills"]
33
+ Ops["Galaxy MCP"]
34
+ State["State"]
35
+ BrowserState["Browser Storage"]
36
+ Notebook["Galaxy Notebook"]
37
+ Session["Visualization Session"]
38
+ end
39
+
40
+ Model["LLM Provider"]
41
+ GalaxyApi["Galaxy's API"]
42
+
43
+ UI --> Brain
44
+ Brain --> Skill
45
+ Brain --> Ops
46
+ Brain --> State
47
+ State --> BrowserState
48
+ State --> Notebook
49
+ State --> Session
50
+ Brain --> Model
51
+ Ops --> GalaxyApi
52
+ ```
53
+
54
+ ## Olit and Orbit
55
+
56
+ [Orbit](https://github.com/galaxyproject/loom) is Galaxy's flagship AI environment and the main functional reference for Olit. Orbit pioneered the AI co-scientist model for Galaxy: an open-ended agent that can plan analyses, work with Galaxy tools and workflows, inspect results, and continue a research process over multiple steps.
57
+
58
+ Olit explores how that model translates to a browser-native architecture. Its name reflects that lineage, in a relationship similar in spirit to JupyterLab and JupyterLite: the research experience is adapted to a different runtime environment.
59
+
60
+ | | Orbit | Olit |
61
+ | --- | --- | --- |
62
+ | Agent runtime | Local/server Python | Browser / Pyodide |
63
+ | Scientific computation | Local environment + Galaxy | Galaxy |
64
+ | Shell | Available | None |
65
+ | Filesystem | Local filesystem | Galaxy data + browser storage |
66
+ | Galaxy access | MCP | Active Galaxy session |
67
+ | Deployment | Agent environment | Galaxy visualization plugin |
68
+ | Per-user agent backend | Required | None |
69
+
70
+ The architectures have different capability envelopes. Orbit provides a shell, local processes, unrestricted networking, and a conventional filesystem. Olit investigates what an AI co-scientist can do when the browser provides the agent runtime and Galaxy provides the scientific computational environment.
71
+
72
+ ## Galaxy as the computational environment
73
+
74
+ Olit's constraints are deliberate.
75
+
76
+ Scientific analyses execute as normal Galaxy jobs and workflows. Inputs and outputs remain Galaxy datasets and collections. Galaxy records the tools, parameters, inputs, outputs, and provenance of the analysis.
77
+
78
+ Pyodide complements that remote computation with local Python for lightweight exploration and intermediate computation. Browser storage provides local agent state, while persistent research outputs can be represented using Galaxy-native artifacts.
79
+
80
+ The result is a division of responsibilities:
81
+
82
+ - **Galaxy** provides scientific tools, workflows, data, jobs, provenance, and persistent research outputs.
83
+ - **Pyodide** provides lightweight local Python computation.
84
+ - **The browser** provides the agent runtime, interface, local state, networking, and model connection.
85
+
86
+ Olit therefore does not introduce another general-purpose computational environment alongside Galaxy.
87
+
88
+ ## Inside Galaxy
89
+
90
+ Olit is built as an application on Galaxy's Charts visualization plugin framework.
91
+
92
+ Galaxy visualization plugins are not limited to plots and viewers: they can be complete browser applications with access to Galaxy data and services. Olit uses that existing extension point to deliver an AI co-scientist inside the Galaxy interface.
93
+
94
+ Because Olit is served by Galaxy, it is same-origin with the Galaxy API and can operate through the researcher's active session. In normal embedded operation, this avoids a local proxy, a separate agent process, or a long-lived Galaxy API key held by another service.
95
+
96
+ The Python agent runs in a Web Worker through Pyodide. The surrounding TypeScript application connects the interface, browser runtime, model provider, and active Galaxy session. Model credentials remain in the browser rather than being held by a separate Olit backend.
97
+
98
+ This allows Olit to be distributed through Galaxy's existing visualization infrastructure without requiring a separate agent service.
99
+
100
+ `LAYOUT.md` maps the repository and its major components.
101
+
102
+ ## Running it
103
+
104
+ Install dependencies once:
105
+
106
+ ```bash
107
+ npm install
108
+ ```
109
+
110
+ Then start the development environment:
111
+
112
+ ```bash
113
+ npm run dev
114
+ ```
115
+
116
+ The first run builds the Pyodide assets and the Olit brain wheel and can take several minutes.
117
+
118
+ To serve what is already built:
119
+
120
+ ```bash
121
+ npx vite
122
+ ```
123
+
124
+ Changes under `brain/` require rebuilding the wheel and restarting the development server:
125
+
126
+ ```bash
127
+ npm run build:olit
128
+ ```
129
+
130
+ ### Against the stub
131
+
132
+ The end-to-end stub requires neither Galaxy nor a model. See `e2e/README.md`.
133
+
134
+ ```bash
135
+ node e2e/stub.cjs &
136
+ GALAXY_ROOT=http://127.0.0.1:8099 \
137
+ LLM_PROVIDER=local \
138
+ LLM_ROOT=http://127.0.0.1:8099 \
139
+ LLM_PATH=/v1 \
140
+ LLM_MODEL=stub-model \
141
+ LLM_CONTEXT_WINDOW=40000 \
142
+ npm run dev
143
+ ```
144
+
145
+ ### Against Galaxy and a model
146
+
147
+ ```bash
148
+ GALAXY_ROOT=http://127.0.0.1:8080 \
149
+ GALAXY_KEY=<galaxy-api-key> \
150
+ LLM_PROVIDER=gemini \
151
+ LLM_KEY="$GEMINI_KEY" \
152
+ LLM_MODEL=gemini-3.7-flash \
153
+ npm run dev
154
+ ```
155
+
156
+ `LLM_PROVIDER` names an entry in `brain/olit/substrate/llm/providers.py`, which defines the endpoint, context window, and rate limit. Set `LLM_ROOT` and `LLM_PATH` for an endpoint the registry does not contain.
157
+
158
+ `GALAXY_KEY` is needed during local development because Vite serves Olit outside Galaxy, where the Galaxy session cookie does not apply.
159
+
160
+ Leave `LLM_PROVIDER` unset to use the provider picker. This is the production path: the model key remains in the browser worker and never enters the Python agent.
161
+
162
+ ## Tests
163
+
164
+ ```bash
165
+ npm test
166
+ ```
167
+
168
+ This runs Vitest, pytest, TypeScript type checking, vendored-file verification, and the end-to-end drives.
169
+
170
+ To inspect the surface exposed to the agent:
171
+
172
+ ```bash
173
+ npm run describe
174
+ ```
175
+
176
+ This reports the tools and parameters exposed to the agent, the Galaxy queries they construct, guards that can refuse calls, and the sampling and loop policies.
177
+
178
+ ## Scope
179
+
180
+ Olit deliberately does not reproduce a general-purpose local computing environment.
181
+
182
+ `run_python` executes inside Pyodide. Submitted code is asynchronous, so top-level `await` and `pyfetch` work, but networking follows browser security rules: CORS-enabled APIs are accessible; arbitrary network resources are not.
183
+
184
+ For research requiring a shell, unrestricted networking, local software installation, or a full filesystem, Orbit provides the appropriate execution environment.
185
+
186
+ Olit instead tests a different architectural proposition:
187
+
188
+ > **Galaxy is the computational environment. The browser is the agent runtime.**
package/package.json ADDED
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "@galaxyproject/olit",
3
+ "version": "0.0.0",
4
+ "type": "module",
5
+ "license": "MIT",
6
+ "files": [
7
+ "static"
8
+ ],
9
+ "scripts": {
10
+ "build": "npm run build:pyodide && npm run build:skills && npm run build:providers && npm run build:ops && npm run build:olit && vite build",
11
+ "build:olit": "cd brain && rm -rf build dist olit.egg-info && SOURCE_DATE_EPOCH=315532800 python -m build --wheel && cd .. && node scripts/stamp_wheel.js && mkdir -p static/pyodide && rm -f static/pyodide/olit-*.whl && cp brain/dist/olit-*.whl static/pyodide/",
12
+ "build:ops": "node scripts/install_ops.js",
13
+ "build:providers": "python3 scripts/dump_providers.py",
14
+ "build:pyodide": "node scripts/install_pyodide.js",
15
+ "build:skills": "node scripts/install_skills.js",
16
+ "describe": "python3 contract/describe.py --root .",
17
+ "dev": "npm run build && vite",
18
+ "galaxy-mcp-docs": "python3 scripts/capture_galaxy_mcp_docs.py",
19
+ "lint:js": "prettier --config ./prettier.config.js --check './*.{js,ts,json}' 'src/**/*.{js,ts,json,css}'",
20
+ "lint:contract": "python3 -m black --check --config brain/pyproject.toml contract && ruff check --config brain/pyproject.toml contract",
21
+ "lint:scripts": "python3 -m black --check --config brain/pyproject.toml scripts && ruff check --config brain/pyproject.toml scripts",
22
+ "lint:python": "cd brain && python -m black --check . && ruff check .",
23
+ "prettier": "prettier --config ./prettier.config.js --write './*.{js,ts,json}' 'src/**/*.{js,ts,json,css}'",
24
+ "preview": "vite preview",
25
+ "stale": "node scripts/check_stale.js",
26
+ "test": "npm run test:unit && npm run test:python && npm run test:contract && npm run lint:python && npm run lint:contract && npm run lint:scripts && npm run lint:js && npm run typecheck && npm run typecheck:python && npm run vendored && npm run test:e2e",
27
+ "test:e2e": "bash e2e/run-all.sh",
28
+ "test:contract": "python3 -m pytest contract/tests -v -r s --import-mode=importlib",
29
+ "test:python": "cd brain && python -m pytest tests/ -v -r s --import-mode=importlib",
30
+ "test:ui": "vitest --ui",
31
+ "test:unit": "vitest run",
32
+ "test:watch": "vitest --watch",
33
+ "typecheck": "tsc --noEmit",
34
+ "vendored": "python3 scripts/check_vendored.py",
35
+ "galaxy-ops-registry": "node scripts/capture_galaxy_ops_registry.mjs",
36
+ "typecheck:python": "cd brain && python -m mypy olit ../contract ../scripts"
37
+ },
38
+ "dependencies": {
39
+ "@galaxyproject/galaxy-ops": "https://github.com/guerler/galaxy-mcp/releases/download/ops-v0.3.0-fork.1/galaxyproject-galaxy-ops-0.3.0-fork.1.tgz",
40
+ "galaxy-charts": "^0.1.16",
41
+ "mermaid": "^11.16.1",
42
+ "vega": "^5.30.0",
43
+ "vega-embed": "^6.26.0",
44
+ "vega-lite": "^5.21.0"
45
+ },
46
+ "devDependencies": {
47
+ "@types/dompurify": "^3.0.5",
48
+ "@types/node": "^22.9.0",
49
+ "dompurify": "^3.4.1",
50
+ "galaxy-charts-xml-parser": "^1.0.3",
51
+ "happy-dom": "^20.0.11",
52
+ "marked": "^18.0.0",
53
+ "playwright": "^1.62.1",
54
+ "prettier": "^3.7.4",
55
+ "pyodide": "^0.29.0",
56
+ "typescript": "^5.9.3",
57
+ "vite": "^7.3.0",
58
+ "vite-plugin-static-copy": "^3.1.4",
59
+ "vitest": "^4.0.16"
60
+ }
61
+ }
Binary file
Binary file
@@ -0,0 +1 @@
1
+ @font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(./InterVariable.woff2) format("woff2")}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(./InterVariable-Italic.woff2) format("woff2")}@font-face{font-family:JetBrains Mono;font-style:normal;font-weight:400;font-display:swap;src:url(./JetBrainsMono-Regular.woff2) format("woff2")}@font-face{font-family:JetBrains Mono;font-style:italic;font-weight:400;font-display:swap;src:url(./JetBrainsMono-Italic.woff2) format("woff2")}@font-face{font-family:JetBrains Mono;font-style:normal;font-weight:700;font-display:swap;src:url(./JetBrainsMono-Bold.woff2) format("woff2")}@font-face{font-family:JetBrains Mono;font-style:italic;font-weight:700;font-display:swap;src:url(./JetBrainsMono-BoldItalic.woff2) format("woff2")}:root{color-scheme:dark;--galaxy-primary: #25537b;--galaxy-dark: #2c3143;--galaxy-dark-mid: #3c435c;--galaxy-gold: #ffd700;--galaxy-gold-dark: #d19e00;--masthead: #2c3143;--masthead-text: #f0f2f8;--masthead-hover: #ffd700;--masthead-height: 40px;--bg: #2c3143;--bg-surface: #343a50;--bg-deep: #232838;--bg-hover: #3c435c;--bg-chat: #2c3143;--bg-artifact: #2c3143;--bg-inset: rgba(255, 255, 255, .06);--bg-base: rgba(0, 0, 0, .03);--bg-subtle: rgba(255, 255, 255, .04);--bg-subtle-hover: rgba(255, 255, 255, .1);--bg-selected: rgba(255, 255, 255, .15);--text: #f0f2f8;--text-dim: rgba(248, 250, 252, .45);--text-bright: #f8fafc;--text-muted-on-masthead: rgba(255, 255, 255, .7);--text-subtle-on-masthead: rgba(255, 255, 255, .6);--accent-surface: var(--galaxy-primary);--accent-surface-border: rgba(255, 255, 255, .08);--accent-surface-text: var(--text-bright);--accent: #ffd700;--accent-light: #ffd700;--accent-bg: rgba(255, 215, 0, .15);--accent-hover: #d19e00;--user-message-bg: var(--accent-surface);--user-message-border: var(--accent-surface-border);--user-message-text: var(--accent-surface-text);--activity-bg: var(--masthead);--activity-border: var(--border-strong);--activity-shell-text: var(--masthead-text);--activity-header-button-text: var(--text-subtle-on-masthead);--shell-tool-start-text: #80c3ea;--shell-status-text: var(--galaxy-gold-dark);--shell-stdout-text: var(--text-muted-on-masthead);--success: #4ade80;--success-bg: rgba(74, 222, 128, .15);--warning: #fbbf24;--error: #f87171;--error-bg: rgba(248, 113, 113, .12);--border: rgba(255, 255, 255, .08);--border-strong: rgba(255, 255, 255, .15);--border-subtle: rgba(255, 255, 255, .04);--bg-stripe: rgba(255, 255, 255, .02);--shadow: rgba(0, 0, 0, .4);--shadow-soft: rgba(0, 0, 0, .3);--modal-scrim: rgba(20, 25, 40, .6);--danger-bg: #7a2027;--danger-bg-hover: #8d2731;--danger-border: #a13038;--radius: 6px;--font: "JetBrains Mono", Monaco, Menlo, Consolas, "Courier New", monospace;--font-sans: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;--footer-ctrl-height: 24px;--footer-ctrl-padding-x: 10px;--footer-ctrl-radius: var(--radius);--footer-ctrl-font-size: 11px;--footer-control-text: var(--text-dim);--footer-control-hover-text: var(--text);--footer-control-hover-bg: var(--bg-subtle-hover);--footer-highlight: var(--accent);--footer-highlight-border: var(--accent);--footer-highlight-bg: var(--accent-bg);--footer-highlight-text: var(--galaxy-dark)}:root[data-theme=light]{color-scheme:light;--masthead: #25537b;--masthead-text: #f8fafc;--masthead-hover: #ffd700;--bg: #f6f8fb;--bg-surface: #ffffff;--bg-deep: #e8edf5;--bg-hover: #e1e8f2;--bg-chat: #f6f8fb;--bg-artifact: #ffffff;--bg-inset: rgba(31, 41, 55, .06);--bg-base: rgba(31, 41, 55, .035);--bg-subtle: rgba(31, 41, 55, .055);--bg-subtle-hover: rgba(31, 41, 55, .1);--bg-selected: rgba(31, 41, 55, .14);--text: #1f2937;--text-dim: rgba(31, 41, 55, .62);--text-bright: #111827;--text-muted-on-masthead: rgba(248, 250, 252, .78);--text-subtle-on-masthead: rgba(248, 250, 252, .68);--accent-surface: #dbeafe;--accent-surface-border: #bfdbfe;--accent-surface-text: #1e3a5f;--accent: #b77900;--accent-light: #d19e00;--accent-bg: rgba(209, 158, 0, .14);--accent-hover: #8a5a00;--user-message-bg: var(--accent-surface);--user-message-border: var(--accent-surface-border);--user-message-text: var(--accent-surface-text);--activity-bg: var(--accent-surface);--activity-border: var(--accent-surface-border);--activity-shell-text: var(--accent-surface-text);--activity-header-button-text: var(--text-dim);--shell-tool-start-text: #155e8c;--shell-status-text: #7a5c00;--shell-stdout-text: #3d5678;--success: #17803d;--success-bg: rgba(23, 128, 61, .12);--warning: #b77900;--error: #c03434;--error-bg: rgba(192, 52, 52, .1);--border: rgba(31, 41, 55, .12);--border-strong: rgba(31, 41, 55, .22);--border-subtle: rgba(31, 41, 55, .08);--bg-stripe: rgba(31, 41, 55, .035);--shadow: rgba(31, 41, 55, .18);--shadow-soft: rgba(31, 41, 55, .16);--modal-scrim: rgba(15, 23, 42, .28);--danger-bg: #c03434;--danger-bg-hover: #a82d2d;--danger-border: #9f2a2a;--footer-control-text: rgba(255, 255, 255, .82);--footer-control-hover-text: #ffffff;--footer-control-hover-bg: rgba(219, 234, 254, .16);--footer-highlight: #60a5fa;--footer-highlight-border: rgba(147, 197, 253, .85);--footer-highlight-bg: rgba(96, 165, 250, .24);--footer-highlight-text: #ffffff}*{margin:0;padding:0;box-sizing:border-box}html,body{height:100%;overflow:hidden;background:var(--bg);color:var(--text);font-family:var(--font-sans);font-size:14px;line-height:1.5}*:focus-visible{outline:2px solid var(--accent);outline-offset:2px;border-radius:3px}a{color:var(--accent);text-decoration:underline;text-decoration-color:#ffd70066;text-underline-offset:2px;transition:color .15s,text-decoration-color .15s}a:hover{color:var(--accent-hover);text-decoration-color:var(--accent-hover)}a:visited{color:var(--accent)}#app{display:flex;flex-direction:column;height:100vh;width:100vw}#app-main{display:flex;flex:1;min-height:0;width:100%}#update-banner{display:flex;align-items:center;flex-wrap:wrap;gap:12px;padding:6px 12px;background:var(--accent-bg);color:var(--text-bright);border-bottom:1px solid var(--border-strong);font-family:var(--font-sans);font-size:12px;flex:0 0 auto}#update-banner .update-banner-fallback{flex:1 1 100%;display:flex;align-items:center;gap:8px;color:var(--text-dim)}#update-banner .update-banner-fallback-url{font-family:var(--font-mono, monospace);color:var(--accent);-webkit-user-select:all;user-select:all;word-break:break-all}#update-banner.hidden{display:none}#update-banner .update-banner-text{flex:1}#update-banner-version{font-weight:600;color:var(--accent)}#update-banner .update-banner-link{background:none;border:1px solid var(--accent);color:var(--accent);padding:2px 8px;border-radius:var(--radius);cursor:pointer;font:inherit}#update-banner .update-banner-link:hover{background:var(--accent);color:var(--bg-deep)}#update-banner .update-banner-dismiss{background:none;border:none;color:var(--text-dim);cursor:pointer;font-size:16px;line-height:1;padding:0 4px}#update-banner .update-banner-dismiss:hover{color:var(--text-bright)}#bypass-banner{display:flex;align-items:center;justify-content:center;padding:6px 12px;background:#6e0d0d;color:#fff;border-bottom:1px solid #b91c1c;font-family:var(--font-sans);font-size:12px;font-weight:600;flex:0 0 auto}#bypass-banner.hidden{display:none}#sandbox-banner{display:flex;align-items:center;justify-content:center;padding:4px 12px;background:var(--bg-surface);color:var(--text-dim);border-bottom:1px solid var(--border);font-family:var(--font-sans);font-size:12px;font-weight:500;flex:0 0 auto}#sandbox-banner.hidden{display:none}body.platform-darwin #update-banner,body.platform-darwin #bypass-banner,body.platform-darwin #sandbox-banner,body.platform-darwin #whatsnew-banner{-webkit-app-region:drag}body.platform-darwin #update-banner,body.platform-darwin #whatsnew-banner{padding-left:78px}body.platform-darwin #update-banner button,body.platform-darwin #update-banner a,body.platform-darwin #bypass-banner button,body.platform-darwin #bypass-banner a,body.platform-darwin #sandbox-banner button,body.platform-darwin #sandbox-banner a,body.platform-darwin #whatsnew-banner button,body.platform-darwin #whatsnew-banner a{-webkit-app-region:no-drag}.pane{display:flex;flex-direction:column;overflow:hidden}#chat-pane{flex:0 0 55%;min-width:300px;background:var(--bg-chat)}#artifact-pane{flex:1;min-width:280px;background:var(--bg-artifact)}#divider{width:4px;cursor:col-resize;background:var(--border);transition:background .15s;flex-shrink:0}#divider:hover,#divider.dragging{background:var(--accent-light)}body.artifact-collapsed #artifact-pane,body.artifact-collapsed #divider{display:none}body.artifact-collapsed #chat-pane{flex:1 1 100%}#files-pane{flex:0 0 240px;min-width:160px;overflow:hidden;background:var(--bg-deep);border-right:1px solid var(--border)}#files-divider{width:4px;cursor:col-resize;background:var(--border);transition:background .15s;flex-shrink:0}#files-divider:hover,#files-divider.dragging{background:var(--accent-light)}body.files-collapsed #files-pane,body.files-collapsed #files-divider{display:none}#files-title{justify-content:space-between;padding:0 10px;text-transform:none;letter-spacing:normal}.files-title-label{font-weight:600;font-size:12px;letter-spacing:.5px;text-transform:uppercase}.files-title-actions{display:flex;align-items:center;gap:4px}.files-header-btn{background:transparent;border:1px solid transparent;color:var(--masthead-text);opacity:.7;border-radius:4px;padding:3px 5px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:opacity .15s,background .15s,color .15s,border-color .15s}.files-header-btn:hover{opacity:1;background:var(--bg-subtle-hover)}.files-header-btn.active{opacity:1;color:var(--accent);border-color:var(--accent);background:var(--accent-bg)}#files-tree{flex:1;overflow-y:auto;overflow-x:hidden;padding:4px 0;font-family:var(--font-sans);font-size:12px;color:var(--text)}#files-tree::-webkit-scrollbar{width:6px}#files-tree::-webkit-scrollbar-thumb{background:var(--border-strong);border-radius:3px}.files-tree-node{display:flex;align-items:center;gap:6px;padding:3px 10px;cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap;line-height:1.4;border-radius:3px;margin:0 4px}.files-tree-node:hover{background:var(--bg-surface)}.files-tree-node.selected{background:var(--accent-bg);color:var(--text-bright)}.files-tree-icon{flex-shrink:0;width:16px;text-align:center;font-size:12px}.files-tree-name{flex:1;overflow:hidden;text-overflow:ellipsis}.files-tree-size{flex-shrink:0;margin-left:6px;color:var(--text-dim);font-size:10px;font-variant-numeric:tabular-nums}.files-tree-children{display:block}.files-tree-children.hidden{display:none}.files-tree-ctx-menu{position:fixed;z-index:1000;min-width:180px;background:var(--bg-surface);border:1px solid var(--border-strong);border-radius:4px;box-shadow:0 4px 16px var(--shadow);padding:4px 0;font-family:var(--font-sans);font-size:12px}.files-tree-ctx-item{display:block;width:100%;text-align:left;background:transparent;border:0;color:var(--text);padding:6px 12px;cursor:pointer;font:inherit}.files-tree-ctx-item:hover{background:var(--accent-bg);color:var(--accent)}.files-tree-empty{padding:12px 14px;color:var(--text-dim);font-size:11px;font-style:italic}.chat-copy-btn{position:fixed;z-index:200;display:inline-flex;align-items:center;gap:5px;padding:4px 10px;font-size:12px;font-family:var(--font-sans);background:var(--bg-surface);color:var(--text);border:1px solid var(--border-strong);border-radius:var(--radius);cursor:pointer;box-shadow:0 2px 8px var(--shadow);transition:background .1s,color .1s;white-space:nowrap}.chat-copy-btn:hover{background:var(--bg-hover);border-color:var(--accent);color:var(--accent)}.pane-title-btn{appearance:none;background:transparent;border:1px solid transparent;color:var(--masthead-text);opacity:.6;border-radius:4px;padding:3px 6px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;transition:opacity .15s,color .15s,border-color .15s,background .15s}.pane-title-btn:hover{opacity:1;background:var(--bg-subtle-hover)}body:not(.files-collapsed) #files-toggle,body:not(.artifact-collapsed) #artifact-toggle{opacity:1;color:var(--accent);border-color:var(--accent);background:var(--accent-bg)}:root[data-theme=light] body:not(.files-collapsed) #files-toggle,:root[data-theme=light] body:not(.artifact-collapsed) #artifact-toggle{color:#fff;border-color:#fff}.file-viewer-root{display:flex;flex-direction:column;height:100%;width:100%}.file-viewer-toolbar{display:flex;align-items:center;gap:8px;padding:6px 10px;border-bottom:1px solid var(--border);background:var(--bg-surface);font-size:12px;flex-shrink:0}.file-viewer-filename{font-family:var(--font);font-weight:600;color:var(--text-bright);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0}.file-viewer-btn{background:transparent;border:1px solid var(--border);color:var(--text);border-radius:var(--radius);padding:3px 10px;font-size:11px;cursor:pointer;font-family:var(--font-sans);transition:color .15s,border-color .15s,background .15s}.file-viewer-btn:hover:not(:disabled){color:var(--accent);border-color:var(--accent)}.file-viewer-btn.active{color:var(--accent);border-color:var(--accent);background:var(--accent-bg)}.file-viewer-btn:disabled{opacity:.4;cursor:not-allowed}.file-viewer-status{font-size:11px;color:var(--text-dim);min-width:80px;text-align:right}.file-viewer-status.dirty{color:var(--warning)}.file-viewer-status.error{color:var(--error)}.file-viewer-status.saved{color:var(--success)}.file-viewer-body{flex:1;min-height:0;overflow:hidden;position:relative;display:flex;flex-direction:column}.file-viewer-editor{flex:1;width:100%;min-height:0;padding:12px;border:0;background:var(--bg-deep);color:var(--text);font-family:var(--font);font-size:12px;line-height:1.5;resize:none;outline:none;white-space:pre;overflow:auto;tab-size:2}.file-viewer-editor.hidden{display:none}.file-viewer-editor:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.file-viewer-preview{flex:1;overflow-y:auto;padding:16px}.file-viewer-preview.hidden{display:none}.file-viewer-html-preview{padding:0;overflow:hidden;background:#fff}.file-viewer-html-frame{width:100%;height:100%;border:0;background:#fff;display:block}.file-viewer-image-wrap{flex:1;overflow:auto;padding:16px;display:flex;align-items:flex-start;justify-content:center;background:var(--bg-deep)}.file-viewer-image-wrap img{max-width:100%;height:auto;background:#fff;border-radius:4px}.file-viewer-pdf-wrap{flex:1;overflow:hidden;display:flex;background:var(--bg-deep)}.file-viewer-pdf-wrap embed{flex:1;border:0;background:#fff}.file-viewer-binary,.file-viewer-error{padding:24px;color:var(--text-dim);font-size:13px;font-family:var(--font-sans)}.file-viewer-error{color:var(--error)}.file-viewer-preview-banner{background:var(--accent-bg);border-bottom:1px solid var(--accent);padding:8px 12px;font-size:12px;color:var(--text);flex-shrink:0}.file-viewer-preview-text{flex:1;width:100%;margin:0;padding:12px;background:var(--bg-deep);color:var(--text);font-family:var(--font);font-size:12px;line-height:1.5;white-space:pre;overflow:auto;tab-size:2}.status-dot:before{content:"";width:8px;height:8px;border-radius:50%;flex-shrink:0}.status-dot-connected:before{background:var(--success, #4ade80);box-shadow:0 0 4px var(--success, #4ade80)}.status-dot-disconnected:before{background:var(--error, #f87171)}.status-dot-label{white-space:nowrap}.pane-title{display:flex;align-items:center;justify-content:center;height:var(--masthead-height);min-height:var(--masthead-height);padding:0 16px;border-bottom:1px solid var(--border);background:var(--masthead);color:var(--masthead-text);font-family:var(--font-sans);font-weight:600;font-size:13px;letter-spacing:.5px;text-transform:uppercase;-webkit-app-region:drag}.pane-title button,.pane-title input,.pane-title select,.pane-title a,.pane-title .pane-title-actions,.pane-title .files-title-actions{-webkit-app-region:no-drag}body.platform-darwin #files-title{padding-left:78px}.pane-title-with-controls{justify-content:space-between;padding:0 8px}.pane-title-with-controls .pane-title-label{flex:1}.orbit-title-brand{display:flex;align-items:center;justify-content:center;gap:8px;min-width:0;height:100%}.orbit-title-logo{display:block;width:auto;max-width:72px;height:18px;object-fit:contain}.orbit-title-text{line-height:1;white-space:nowrap}#app-footer{display:flex;align-items:center;gap:8px;padding:0 12px;height:34px;min-height:34px;border-top:1px solid var(--border);background:var(--masthead);color:var(--masthead-text);flex-shrink:0}.footer-control{display:inline-flex;align-items:center;gap:6px;height:var(--footer-ctrl-height);padding:0 var(--footer-ctrl-padding-x);border-radius:var(--footer-ctrl-radius);border:1px solid var(--border);background:var(--bg-subtle);color:var(--footer-control-text);font-family:var(--font);font-size:var(--footer-ctrl-font-size);font-weight:500;white-space:nowrap;appearance:none;transition:background .15s,color .15s,border-color .15s}.footer-control.is-interactive{cursor:pointer}.footer-control.is-interactive:hover{background:var(--footer-control-hover-bg);color:var(--footer-control-hover-text);border-color:var(--border-strong)}.status-badge.running{color:var(--footer-highlight-text);border-color:var(--footer-highlight-border);background:var(--footer-highlight-bg)}.status-badge.error{color:#ff817b;border-color:#e31a1e66;background:#e31a1e33}.status-badge.thinking{color:var(--footer-highlight-text);border-color:var(--footer-highlight-border);background:var(--footer-highlight-bg);animation:blink 1.5s step-end infinite}.agent-heartbeat{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--text-dim);margin-left:-4px;margin-right:4px;align-self:center;flex-shrink:0;transition:background .4s}.agent-heartbeat.pulse{background:var(--footer-highlight);animation:heartbeat-pulse .8s ease-out}@keyframes heartbeat-pulse{0%{background:var(--footer-highlight);transform:scale(1.6);box-shadow:0 0 4px var(--footer-highlight)}to{background:var(--text-dim);transform:scale(1);box-shadow:0 0 0 transparent}}#model-indicator{font-family:var(--font)}#model-indicator:hover{color:var(--footer-highlight);border-color:var(--footer-highlight-border)}.status-dot-connected{color:var(--footer-control-hover-text)}#agent-status{margin-right:auto;max-width:25%;min-width:0;overflow-x:auto;scrollbar-width:none}#agent-status::-webkit-scrollbar{display:none}#usage-tokens{white-space:nowrap}#usage-cost{padding-left:6px;border-left:1px solid var(--border-strong);color:var(--footer-highlight);white-space:nowrap}#usage-cost.hidden,#context-fill.hidden{display:none}#context-fill-track{display:inline-block;width:42px;height:6px;border-radius:3px;background:var(--bg-selected);overflow:hidden}#context-fill-bar{display:block;height:100%;width:0%;border-radius:3px;background:var(--footer-highlight);transition:width .2s}#context-fill-pct{white-space:nowrap}#context-fill.warn #context-fill-bar{background:var(--galaxy-gold-dark)}#context-fill.warn{color:var(--galaxy-gold-dark)}#context-fill.danger #context-fill-bar{background:#ff817b}#context-fill.danger{color:#ff817b}.footer-control-segmented{padding:0;gap:0;overflow:hidden}.footer-control-segmented .exec-mode-btn{appearance:none;background:transparent;border:0;color:var(--footer-control-text);font:inherit;height:100%;padding:0 10px;cursor:pointer;transition:background .15s,color .15s}.footer-control-segmented .exec-mode-btn:hover:not(.active){color:var(--footer-control-hover-text);background:var(--footer-control-hover-bg)}.footer-control-segmented .exec-mode-btn.active{background:var(--footer-highlight);color:var(--footer-highlight-text);font-weight:600}#cwd-bar{min-width:0}#cwd-path{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;direction:rtl;text-align:left;max-width:260px}.cwd-change-btn{appearance:none;background:transparent;border:0;color:var(--footer-control-text);padding:0;margin-left:2px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;transition:color .15s}.cwd-change-btn:hover{color:var(--footer-highlight)}#messages{flex:1;overflow-y:auto;padding:16px;display:flex;flex-direction:column;gap:12px}#messages>*{flex-shrink:0}#messages::-webkit-scrollbar{width:6px}#messages::-webkit-scrollbar-thumb{background:var(--border-strong);border-radius:3px}.message{padding:10px 14px;border-radius:var(--radius);max-width:100%;animation:fade-up .2s ease}.message.user{background:var(--user-message-bg);border:1px solid var(--user-message-border);align-self:flex-end;max-width:85%;color:var(--user-message-text);white-space:pre-wrap;word-break:break-word}.user-turn{display:flex;align-items:center;gap:0;width:100%}.user-turn .message.user{align-self:auto;animation:none;margin:0;max-width:85%}.prompt-num{flex:0 0 auto;min-width:28px;height:22px;padding:0 6px;border-radius:6px;background:var(--bg-surface);border:1px solid var(--border-strong);color:var(--text-dim);font-family:var(--font);font-size:11px;font-weight:600;display:flex;align-items:center;justify-content:center;-webkit-user-select:none;user-select:none}.prompt-connector{flex:1;min-width:8px;height:1px;background:var(--border-strong);margin:0 2px}.message.assistant{background:transparent;align-self:flex-start}.message.assistant p{margin-bottom:8px}.message.assistant p:last-child{margin-bottom:0}.message.assistant code{font-family:var(--font);font-size:13px;background:var(--bg-deep);padding:1px 5px;border-radius:4px}.message.assistant pre{background:var(--bg-deep);border:1px solid var(--border);border-radius:var(--radius);padding:12px;overflow-x:auto;margin:8px 0}.message.assistant pre code{background:transparent;padding:0}.message.assistant:not(.system-info) h1,.message.assistant:not(.system-info) h2,.message.assistant:not(.system-info) h3,.message.assistant:not(.system-info) h4{margin:14px 0 6px;color:var(--text-bright);font-weight:600;line-height:1.3}.message.assistant:not(.system-info) h1{font-size:18px}.message.assistant:not(.system-info) h2{font-size:16px}.message.assistant:not(.system-info) h3{font-size:14px}.message.assistant:not(.system-info) h4{font-size:13px;color:var(--text)}.message.assistant:not(.system-info) ul,.message.assistant:not(.system-info) ol{margin:6px 0 10px;padding-left:22px}.message.assistant:not(.system-info) li{margin:3px 0;padding-left:2px}.message.assistant:not(.system-info) li>p{margin:0}.message.assistant:not(.system-info) strong{color:var(--text-bright)}.message.assistant:not(.system-info) blockquote{margin:8px 0;padding:4px 12px;border-left:3px solid var(--border);color:var(--text-dim);font-style:italic}.message.assistant:not(.system-info) hr{border:none;border-top:1px solid var(--border);margin:14px 0}.message.assistant:not(.system-info) table{width:100%;border-collapse:collapse;margin:10px 0;font-family:var(--font);font-size:12px;font-variant-numeric:tabular-nums;display:block;overflow-x:auto}.message.assistant:not(.system-info) table th,.message.assistant:not(.system-info) table td{padding:6px 10px;border:1px solid var(--border);text-align:left;vertical-align:top}.message.assistant:not(.system-info) table th{background:var(--bg-deep);color:var(--text-dim);font-weight:600;font-size:11px;text-transform:uppercase;letter-spacing:.3px;white-space:nowrap}.message.assistant:not(.system-info) table tbody tr:nth-child(2n) td{background:var(--bg-stripe)}.message.assistant:not(.system-info) table tbody tr:hover td{background:var(--bg-hover)}.message.assistant:not(.system-info) table code{font-size:11.5px;padding:0 3px}.message.system-info{background:var(--bg-surface);border:1px solid var(--border);border-radius:var(--radius);color:var(--text);font-size:13px;line-height:1.6}.message.system-info h3{font-size:13px;font-weight:700;color:var(--text-bright);margin:0 0 6px}.message.system-info ul{margin:4px 0 12px;padding-left:20px}.message.system-info li{margin:3px 0}.message.system-info code{font-family:var(--font);font-size:12px;background:var(--bg-deep);padding:1px 5px;border-radius:3px;color:var(--accent)}.message.system-info .help-example{background:var(--bg-deep);border:1px solid var(--border);border-radius:var(--radius);padding:10px 14px;margin:6px 0;font-size:12px;line-height:1.5;color:var(--text);font-style:italic}.message.system-info .cost-breakdown table{width:100%;border-collapse:collapse;margin:6px 0 10px;font-family:var(--font);font-size:12px;font-variant-numeric:tabular-nums;display:block;overflow-x:auto}.message.system-info .cost-breakdown table th,.message.system-info .cost-breakdown table td{padding:6px 10px;border:1px solid var(--border);text-align:left;vertical-align:top}.message.system-info .cost-breakdown table th{background:var(--bg-deep);color:var(--text-dim);font-weight:600;font-size:11px;text-transform:uppercase;letter-spacing:.3px;white-space:nowrap}.message.system-info .cost-breakdown table tbody tr:nth-child(2n) td{background:var(--bg-stripe)}.message.system-info .cost-breakdown table code{font-family:var(--font);font-size:11.5px;padding:0 3px;background:var(--bg-deep);border-radius:3px;color:var(--accent)}.cost-append-btn{margin-top:4px;padding:5px 12px;font-family:var(--font);font-size:12px;color:var(--text);background:var(--bg-deep);border:1px solid var(--border);border-radius:var(--radius);cursor:pointer}.cost-append-btn:hover:not(:disabled){background:var(--bg-hover);border-color:var(--accent)}.cost-append-btn:disabled{opacity:.6;cursor:default}.thinking-indicator{color:var(--text-dim);font-size:13px}.thinking-dots span{animation:thinking-bounce 1.4s infinite;display:inline-block;font-weight:700;font-size:18px;line-height:1}.thinking-dots span:nth-child(2){animation-delay:.2s}.thinking-dots span:nth-child(3){animation-delay:.4s}@keyframes thinking-bounce{0%,60%,to{transform:translateY(0);opacity:.4}30%{transform:translateY(-4px);opacity:1}}.cursor-blink{display:inline-block;width:8px;height:16px;background:var(--accent);margin-left:2px;vertical-align:text-bottom;animation:blink 1s step-end infinite}.tool-card{background:var(--bg-surface);border:1px solid var(--border);border-radius:var(--radius);margin:6px 0;overflow:hidden;flex-shrink:0}.tool-card-header{display:flex;align-items:center;gap:8px;padding:6px 12px;cursor:pointer;font-size:12px;color:var(--text-dim)}.tool-card-header:hover{background:var(--bg-hover)}.tool-status{width:8px;height:8px;border-radius:50%;flex-shrink:0}.tool-status.running{background:var(--accent-light);animation:blink 1s step-end infinite}.tool-status.done{background:var(--success)}.tool-status.error{background:var(--error)}.tool-card-body{display:none;padding:8px 12px;border-top:1px solid var(--border);font-family:var(--font);font-size:12px;color:var(--text-dim);max-height:200px;overflow-y:auto;white-space:pre-wrap}.tool-card.expanded .tool-card-body{display:block}#input-area{display:flex;flex-direction:column;align-items:stretch;gap:8px;padding:12px 16px 6px;border-top:1px solid var(--border);background:var(--bg);position:relative}.queued-panel{background:var(--bg-surface);border:1px solid var(--border-strong);border-radius:var(--radius);overflow:hidden}.queued-panel-header{display:flex;align-items:center;justify-content:space-between;min-height:28px;gap:8px;padding:4px 6px 4px 10px}.queued-toggle,.queued-clear,.queued-remove{font:inherit;border:0;background:transparent;color:inherit}.queued-toggle{display:inline-flex;align-items:center;gap:6px;min-width:0;color:var(--accent);cursor:pointer;font-family:var(--font);font-size:11px;font-weight:700}.queued-clear{flex-shrink:0;color:var(--text-dim);cursor:pointer;font-size:11px;padding:2px 6px;border-radius:3px}.queued-clear:hover{color:var(--text-bright);background:var(--bg-hover)}.queued-list{border-top:1px solid var(--border)}.queued-row{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:8px;min-height:28px;padding:4px 8px 4px 10px;color:var(--text);font-family:var(--font);font-size:11px;line-height:1.3}.queued-row+.queued-row{border-top:1px solid var(--border)}.queued-position{color:var(--text-dim)}.queued-preview{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.queued-remove{width:20px;height:20px;border-radius:3px;color:var(--text-dim);cursor:pointer;font-size:16px;line-height:1}.queued-remove:hover{color:var(--text-bright);background:var(--bg-hover)}.composer-row{display:flex;align-items:flex-end;gap:8px;width:100%}#slash-popup{position:absolute;bottom:calc(100% + 6px);left:0;right:0;max-height:240px;overflow-y:auto;background:var(--bg-surface);border:1px solid var(--border-strong);border-radius:var(--radius);box-shadow:0 4px 16px var(--shadow);font-size:12px;z-index:50}#slash-popup.hidden{display:none}.slash-popup-item{display:flex;gap:12px;align-items:baseline;padding:6px 12px;cursor:pointer;color:var(--text);border-bottom:1px solid var(--border-subtle)}.slash-popup-item:last-child{border-bottom:0}.slash-popup-item:hover,.slash-popup-item.active{background:var(--bg-hover)}.slash-popup-item .slash-popup-name{font-family:var(--font);font-weight:600;color:var(--accent);flex-shrink:0}.slash-popup-item .slash-popup-usage{font-family:var(--font);color:var(--text-dim);font-size:11px;flex-shrink:0}.slash-popup-item .slash-popup-desc{color:var(--text);flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}#input-hint{display:flex;align-items:center;gap:8px;padding:0 16px 10px;background:var(--bg);font-size:11px;color:var(--text-dim);line-height:1.4}#input-hint>span{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#input-hint code{font-family:var(--font);background:var(--bg-surface);border:1px solid var(--border);padding:0 5px;border-radius:3px;color:var(--accent);font-size:10px}#activity-view{display:flex;flex-direction:column;height:100%;padding:0;background:var(--activity-bg);overflow:hidden}#activity-shell-section{flex:0 0 60%;display:flex;flex-direction:column;min-height:0;border-bottom:2px solid var(--activity-border);background:var(--activity-bg);color:var(--activity-shell-text);overflow:hidden}#activity-proc-section{flex:1 1 40%;display:flex;flex-direction:column;min-height:0;background:var(--activity-bg);color:var(--text);overflow:hidden}#activity-galaxy-section{flex:0 0 auto;display:flex;flex-direction:column;background:var(--activity-bg);color:var(--text);overflow:hidden;max-height:40%}#activity-galaxy-section.hidden{display:none}#galaxy-invocations-body{overflow-y:auto;padding:6px 12px 8px}#activity-galaxy-history-section{flex:0 0 auto;display:flex;flex-direction:column;background:var(--activity-bg);color:var(--text);overflow:hidden}#activity-galaxy-history-section.hidden{display:none}#galaxy-history-body{padding:6px 12px 8px}.galaxy-history-row{display:flex;align-items:baseline;gap:8px;font-size:12px}.galaxy-history-link{color:var(--accent);text-decoration:none;font-weight:600;cursor:pointer}.galaxy-history-link:hover{text-decoration:underline}.galaxy-history-meta{color:var(--text-dim);font-size:11px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.galaxy-invocation-row{padding:6px 0;border-bottom:1px solid var(--border)}.galaxy-invocation-row:last-child{border-bottom:0}.galaxy-invocation-head{display:flex;align-items:baseline;gap:8px;font-size:12px}.galaxy-invocation-label{flex:1;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.galaxy-invocation-counts{color:var(--text-dim);font-size:11px;font-variant-numeric:tabular-nums;white-space:nowrap}.galaxy-invocation-bar{margin-top:4px;height:4px;background:var(--bg-subtle-hover);border-radius:2px;overflow:hidden}.galaxy-invocation-bar-fill{height:100%;background:var(--accent);transition:width .3s}.galaxy-invocation-row.failed .galaxy-invocation-bar-fill{background:var(--error)}.galaxy-invocation-row.completed .galaxy-invocation-bar-fill{background:var(--success)}.galaxy-invocation-meta{margin-top:2px;font-size:10px;color:var(--text-dim)}#galaxy-invocations-count{background:var(--accent);color:var(--galaxy-dark);padding:0 6px;border-radius:8px;font-size:10px;font-weight:700}#galaxy-invocations-count.zero{background:var(--bg-deep);color:var(--text-dim)}.activity-section-header{display:flex;align-items:center;gap:8px;padding:4px 12px;background:var(--bg-subtle);color:var(--text-dim);font-size:10px;text-transform:uppercase;letter-spacing:.5px;flex-shrink:0}.activity-section-header>span{flex:1}.activity-section-header button{background:none;border:1px solid var(--border-strong);color:var(--activity-header-button-text);font-family:var(--font-sans);font-size:10px;padding:1px 6px;border-radius:3px;cursor:pointer}.activity-section-header button:hover{background:var(--bg-subtle-hover);color:var(--masthead-hover);border-color:var(--masthead-hover)}#proc-monitor-count{background:var(--accent);color:var(--galaxy-dark);padding:0 6px;border-radius:8px;font-weight:700;margin-left:4px}#proc-monitor-count.zero{background:var(--bg-deep);color:var(--text-dim)}#proc-monitor-body{flex:1;overflow-y:auto}#proc-monitor-table{width:100%;border-collapse:collapse;font-family:var(--font);font-size:11px}#proc-monitor-table thead th{position:sticky;top:0;background:var(--bg-deep);color:var(--text-dim);text-align:left;padding:4px 8px;font-weight:600;border-bottom:1px solid var(--border)}#proc-monitor-table td{padding:3px 8px;border-bottom:1px solid var(--border-subtle)}#proc-monitor-table tr:hover td{background:var(--bg-subtle)}#proc-monitor-table .col-cmd{color:var(--text);max-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:100%}#proc-monitor-table .col-num{text-align:right;color:var(--text-dim)}.empty-procs{padding:12px;color:var(--text-dim);font-size:11px;text-align:center;font-style:italic}#agent-shell-body{flex:1;overflow-y:auto;padding:6px 12px;white-space:pre-wrap;word-break:break-word;line-height:1.45;font-family:var(--font);font-size:11px}#agent-shell-body::-webkit-scrollbar{width:6px}#agent-shell-body::-webkit-scrollbar-thumb{background:var(--bg-selected);border-radius:3px}.shell-line{display:block;padding:1px 0}.shell-line.shell-tool-start{color:var(--shell-tool-start-text)}.shell-line.shell-tool-end{color:var(--success);padding-left:16px}.shell-line.shell-tool-error{color:var(--error);padding-left:16px}.shell-line.shell-status{color:var(--shell-status-text)}.shell-line.shell-info{color:var(--text-dim)}.shell-line.shell-stdout{color:var(--shell-stdout-text);padding-left:16px;font-size:10px}#input{flex:1;background:var(--bg);color:var(--text);border:1px solid var(--border);border-radius:var(--radius);padding:10px 14px;font-family:var(--font-sans);font-size:14px;line-height:1.4;resize:none;max-height:150px;outline:none;transition:border-color .15s}#input:focus{border-color:var(--accent-light);box-shadow:0 0 0 2px var(--accent-bg)}#input::placeholder{color:var(--text-dim)}#send-btn,#abort-btn{background:var(--accent);color:var(--galaxy-dark);border:1px solid transparent;border-radius:var(--radius);width:36px;height:36px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:opacity .15s;flex-shrink:0}#send-btn{align-self:stretch;width:auto;height:auto;aspect-ratio:1}#send-btn:hover,#abort-btn:hover{opacity:.85}:root[data-theme=light] #send-btn{background:#fff;color:var(--galaxy-primary);border-color:var(--accent)}#abort-btn{background:var(--error);width:auto;gap:6px;padding:0 14px;font-size:13px;font-weight:600}.hidden{display:none!important}.welcome-modal{width:540px;max-width:90vw}.welcome-intro{color:var(--text-dim);margin-bottom:16px;line-height:1.5}.welcome-details{margin-top:16px;border:1px solid var(--border);border-radius:var(--radius);padding:8px 12px}.welcome-details summary{cursor:pointer;color:var(--text);font-weight:600;font-size:13px;padding:4px 0}.welcome-details[open] summary{margin-bottom:8px;border-bottom:1px solid var(--border);padding-bottom:8px}.welcome-hint{color:var(--text-dim);font-size:11px;margin-top:8px;font-style:italic}.welcome-error{color:var(--error);font-size:12px}.prefs-galaxy-error{color:var(--error);font-size:12px;min-height:14px}.prefs-galaxy-actions{margin-top:6px}.prefs-galaxy-actions.hidden{display:none}.required{color:var(--error);font-size:11px;font-weight:400;margin-left:6px}.modal-overlay{position:fixed;inset:0;background:var(--modal-scrim);display:flex;align-items:center;justify-content:center;z-index:1000;animation:fade-up .15s ease}.modal{background:var(--bg);border:1px solid var(--border);border-radius:8px;box-shadow:0 10px 40px var(--shadow-soft);width:560px;max-width:90vw;max-height:85vh;display:flex;flex-direction:column;overflow:hidden}.modal-header{display:flex;align-items:center;justify-content:space-between;padding:14px 20px;background:var(--masthead);color:var(--masthead-text)}.modal-header h2{font-size:15px;font-weight:700;letter-spacing:.3px;margin:0}.modal-close{background:none;border:none;color:var(--masthead-text);font-size:22px;line-height:1;cursor:pointer;padding:0 6px;opacity:.7;transition:opacity .15s,color .15s}.modal-close:hover{opacity:1;color:var(--accent)}.modal-body{flex:1;overflow-y:auto;padding:16px 20px}.prefs-section{margin-bottom:20px;padding-bottom:16px;border-bottom:1px solid var(--border)}.prefs-section:last-child{border-bottom:none;margin-bottom:0;padding-bottom:0}.prefs-section h3{font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.5px;color:var(--accent);margin:0 0 12px}.prefs-row{display:flex;align-items:center;gap:12px;margin-bottom:10px}.prefs-row label{flex:0 0 130px;font-size:12px;color:var(--text-dim);text-align:right}.prefs-row input[type=text],.prefs-row input[type=password],.prefs-row select,.prefs-row textarea{flex:1;padding:6px 10px;background:var(--bg);border:1px solid var(--border);border-radius:4px;color:var(--text);font-family:var(--font-sans);font-size:13px;outline:none;transition:border-color .15s,box-shadow .15s}.prefs-row textarea{resize:vertical;min-height:80px;font-family:var(--font-sans);line-height:1.4}.prefs-row input:focus,.prefs-row select:focus,.prefs-row textarea:focus{border-color:var(--accent-light);box-shadow:0 0 0 2px var(--accent-bg)}.report-account-note{background:var(--accent-bg);border:1px solid var(--accent);border-radius:4px;padding:10px 12px;margin-bottom:16px;font-size:12px;line-height:1.5;color:var(--text)}.report-options{display:flex;gap:16px;font-size:12px;color:var(--text);margin-top:8px}.report-options label{display:flex;align-items:center;gap:6px;cursor:pointer}.report-disclosure{margin-top:8px;font-size:12px;color:var(--text-dim)}.report-disclosure summary{cursor:pointer;color:var(--text)}.report-disclosure p{margin-top:6px;line-height:1.5}.report-success{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;padding:32px 20px;text-align:center}.report-success-check{width:48px;height:48px;border-radius:50%;background:var(--success-bg);color:var(--success);font-size:26px;line-height:48px}.report-success-text{font-size:15px;font-weight:600;color:var(--text)}.prefs-row-with-btn{display:flex;flex:1;gap:8px}.prefs-row-with-btn input{flex:1}.prefs-row-with-btn .plan-btn{padding:6px 14px;font-size:12px}.prefs-help{font-size:12px;color:var(--text-dim);margin:0 0 12px;line-height:1.5}.prefs-help code{font-family:var(--font);background:var(--bg-deep);padding:1px 5px;border-radius:3px;font-size:11px}.prefs-table{width:100%;border-collapse:collapse;margin-bottom:8px;font-size:12px}.prefs-table th{text-align:left;font-weight:600;color:var(--text-dim);font-size:11px;text-transform:uppercase;letter-spacing:.3px;padding:6px;border-bottom:1px solid var(--border)}.prefs-table td{padding:4px 6px;vertical-align:middle}.prefs-table input[type=text]{width:100%;background:var(--bg-deep);color:var(--text);border:1px solid var(--border);border-radius:4px;padding:4px 8px;font-family:var(--font-sans);font-size:12px}.prefs-table input[type=text]:focus{outline:none;border-color:var(--accent-light)}.prefs-table .prefs-skills-name{width:18%}.prefs-table .prefs-skills-url{width:50%}.prefs-table .prefs-skills-branch{width:12%}.prefs-table .prefs-skills-enabled{width:8%;text-align:center}.prefs-table .prefs-skills-actions{width:12%;text-align:right}.prefs-skills-actions .plan-btn{padding:4px 10px;font-size:11px}.prefs-skills-empty{text-align:center;color:var(--text-dim);font-style:italic;padding:16px 8px;font-size:12px}.prefs-hint{margin-top:-4px;align-items:flex-start}.prefs-hint-text{font-size:11px;color:var(--text-dim);line-height:1.5;padding:4px 0}.api-key-status{font-size:11px;line-height:1.5;padding:4px 0;color:var(--text-dim)}.api-key-status.checking{color:var(--text-dim)}.api-key-status.stored{color:var(--success)}.api-key-status.valid{color:#2ea043}.api-key-status.invalid{color:#f85149}.prefs-oauth-status{font-size:12px;color:var(--text-dim);display:inline-flex;align-items:center;margin-right:8px}.prefs-oauth-status.signed-in{color:#2ea043}.modal-footer{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:12px 20px;border-top:1px solid var(--border);background:var(--bg-surface)}#prefs-restart-note{font-size:11px;color:var(--text-dim);font-style:italic}.modal-actions{display:flex;gap:8px}.modal-actions .plan-btn{padding:6px 18px;font-size:12px}.modal-actions .plan-btn.danger{background:var(--danger-bg);color:#fff;border-color:var(--danger-border)}.modal-actions .plan-btn.danger:hover{background:var(--danger-bg-hover)}.plan-btn{background:var(--bg-surface);color:var(--text);border:1px solid var(--border-strong);border-radius:var(--radius);padding:6px 14px;font:inherit;font-size:12px;cursor:pointer;transition:background .15s,border-color .15s,color .15s;white-space:nowrap}.plan-btn:hover:not(:disabled){border-color:var(--accent);color:var(--accent)}.plan-btn:disabled{opacity:.5;cursor:not-allowed}.plan-btn.primary,.plan-btn.execute{background:var(--accent);color:var(--galaxy-dark);border-color:var(--accent)}.plan-btn.primary:hover:not(:disabled),.plan-btn.execute:hover:not(:disabled){background:var(--accent-hover);border-color:var(--accent-hover);color:var(--galaxy-dark)}#artifact-content{flex:1;overflow:hidden;position:relative}#notebook-view,#activity-view{position:absolute;inset:0;overflow-y:auto;padding:16px}#file-view{position:absolute;inset:0;overflow:hidden}#notebook-view.hidden,#activity-view.hidden,#file-view.hidden{display:none}#notebook-view::-webkit-scrollbar,#activity-view::-webkit-scrollbar,#file-view::-webkit-scrollbar{width:6px}#notebook-view::-webkit-scrollbar-thumb,#activity-view::-webkit-scrollbar-thumb,#file-view::-webkit-scrollbar-thumb{background:var(--border-strong);border-radius:3px}.pane-tabs{justify-content:flex-start;gap:4px;padding:0 16px;text-transform:none;letter-spacing:normal;overflow:hidden}.pane-tab{appearance:none;background:transparent;border:0;color:var(--masthead-text);opacity:.55;font:inherit;font-weight:600;font-size:13px;letter-spacing:.3px;padding:0 12px;height:100%;cursor:pointer;border-bottom:2px solid transparent;margin-bottom:-1px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pane-tab:hover{opacity:.85}.pane-tab.active{opacity:1;border-bottom-color:var(--accent)}.pane-tab[hidden]{display:none}.pane-tab-closeable{display:inline-flex;align-items:center;gap:6px}.pane-tab-close{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;border-radius:50%;font-size:16px;line-height:1;font-weight:400;color:var(--text-subtle-on-masthead);cursor:pointer;transition:background .15s,color .15s}.pane-tab-close:hover{background:var(--bg-selected);color:var(--masthead-text)}.activity-timeline{display:flex;flex-direction:column;gap:6px;font-family:var(--font-mono, ui-monospace, SFMono-Regular, Menlo, monospace);font-size:12px}.activity-event{border:1px solid var(--border);border-radius:6px;background:var(--bg-surface);padding:8px 10px}.activity-event-header{display:flex;align-items:baseline;gap:8px;cursor:pointer;-webkit-user-select:none;user-select:none}.activity-event-time{color:var(--text-dim);font-variant-numeric:tabular-nums;min-width:12ch}.activity-event-kind{color:var(--accent);font-weight:600}.activity-event-source{color:var(--text-dim);margin-left:auto;font-style:italic}.activity-event-body{margin:6px 0 0;padding:6px 8px;background:var(--bg-base);border-radius:4px;white-space:pre-wrap;word-break:break-word;color:var(--text)}.activity-event-body.hidden{display:none}.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;box-sizing:border-box;min-height:100%;max-width:520px;margin:0 auto;color:var(--text-dim);font-size:14px;text-align:center;padding:24px 16px;line-height:1.5}.empty-state p{margin:0}.empty-state code{background:var(--bg-inset);padding:1px 5px;border-radius:3px;font-family:JetBrains Mono,monospace;font-size:12px}.notify-preformatted{white-space:pre-wrap;font-family:JetBrains Mono,monospace;font-size:12.5px;line-height:1.5}.notify-marker{display:inline-flex;align-items:center;gap:2px}.notify-marker-emoji{font-size:13px;line-height:1}.notify-marker-svg{display:none;vertical-align:-2px}.notify-marker-warning{color:var(--warning)}.notify-marker-error{color:var(--error)}.no-emoji .notify-marker-emoji{display:none}.no-emoji .notify-marker-svg{display:inline-block}.ext-message{margin-bottom:12px;line-height:1.5}.ext-input{width:100%;padding:8px 10px;font:inherit;background:var(--bg-inset);border:1px solid var(--border);border-radius:4px;color:var(--text, inherit);box-sizing:border-box}.ext-input:focus{outline:none;border-color:var(--accent)}.ext-options{display:flex;flex-direction:column;gap:4px;max-height:320px;overflow-y:auto}.ext-option{padding:8px 10px;border-radius:4px;cursor:pointer;border:1px solid transparent;background:var(--bg-inset)}.ext-option:hover,.ext-option.focused{background:var(--accent-bg);border-color:var(--accent)}@keyframes fade-up{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes blink{50%{opacity:0}}.result-block{margin-bottom:16px;padding:12px;background:var(--bg-surface);border:1px solid var(--border);border-radius:var(--radius);animation:fade-up .2s ease}.result-markdown{font-family:var(--font-sans);font-size:13px;line-height:1.6;color:var(--text)}.result-markdown p{margin:6px 0}.result-markdown h1,.result-markdown h2,.result-markdown h3{margin:12px 0 6px;color:var(--text-bright)}.result-markdown h1{font-size:16px}.result-markdown h2{font-size:14px}.result-markdown h3{font-size:13px}.result-markdown code{font-family:var(--font);font-size:12px;background:var(--bg-deep);padding:1px 4px;border-radius:3px}.result-markdown pre{background:var(--bg-deep);border:1px solid var(--border);border-radius:4px;padding:10px;overflow-x:auto;margin:8px 0}.result-markdown pre code{background:transparent;padding:0}.result-markdown ul,.result-markdown ol{margin:6px 0;padding-left:24px}.result-markdown li{margin:3px 0;padding-left:2px}.result-markdown ul ul,.result-markdown ul ol,.result-markdown ol ul,.result-markdown ol ol{margin:2px 0}.result-markdown strong{color:var(--text-bright)}.result-markdown table{width:100%;border-collapse:collapse;font-family:var(--font);font-size:12px;margin:8px 0}.result-markdown th,.result-markdown td{padding:6px 10px;border:1px solid var(--border);text-align:left}.result-markdown th{background:var(--bg-deep);color:var(--text-dim);font-weight:600;font-size:11px;text-transform:uppercase;letter-spacing:.3px}.result-markdown tbody tr:hover{background:var(--bg-hover)}.result-markdown img,.message.assistant img,.plan-rendered img{max-width:100%;height:auto;display:block;margin:8px 0}.team-dispatch-card{margin:6px 0;border:1px solid var(--border);border-radius:var(--radius);overflow:hidden}.team-dispatch-header{width:100%;text-align:left;background:var(--bg-hover);border:none;color:var(--text);padding:6px 10px;cursor:pointer;font:inherit}.team-dispatch-body{padding:6px 10px;background:var(--bg-surface)}.team-dispatch-body.hidden{display:none}.team-turn{margin:6px 0}.team-turn-meta{font-size:11px;color:var(--text-dim);font-family:var(--font)}.team-turn-content{white-space:pre-wrap;font:inherit;margin:2px 0 8px}.plan-draft-card{margin:8px 0;border:1px solid var(--accent);border-radius:var(--radius);background:var(--accent-bg);overflow:hidden}.plan-draft-card-header{padding:6px 12px;font-size:12px;font-weight:600;color:var(--accent);background:var(--bg-hover);border-bottom:1px solid var(--accent);text-transform:uppercase;letter-spacing:.04em}.plan-draft-card-body{padding:8px 12px}.plan-draft-card-body>:first-child{margin-top:0}.plan-draft-card-body>:last-child{margin-bottom:0}.plan-draft-card-body h1{font-size:15px;margin:0 0 6px;color:var(--text)}.plan-draft-card-body ul{padding-left:18px}.plan-draft-card-actions{display:flex;gap:6px;padding:6px 12px 10px;border-top:1px dashed var(--border)}.plan-draft-card.approved .plan-draft-card-header:after{content:" · approved";color:var(--text-dim);text-transform:none;letter-spacing:0;font-weight:400}.plan-draft-card.rejected{opacity:.6}.plan-draft-card.rejected .plan-draft-card-header:after{content:" · rejected";color:var(--text-dim);text-transform:none;letter-spacing:0;font-weight:400}.param-form-card{margin:8px 0;border:1px solid var(--border);border-radius:var(--radius);background:var(--bg-surface);overflow:hidden}.param-form-header{padding:10px 12px;border-bottom:1px solid var(--border);background:var(--bg-hover)}.param-form-title{font-family:var(--font-sans);font-size:13px;font-weight:700;color:var(--text-bright)}.param-form-desc{margin-top:4px;font-size:12px;color:var(--text-dim);line-height:1.4}.param-form-group{padding:10px 12px;border-bottom:1px dashed var(--border)}.param-form-group:last-of-type{border-bottom:none}.param-form-group-title{font-family:var(--font-sans);font-size:12px;font-weight:700;color:var(--accent);text-transform:uppercase;letter-spacing:.5px;margin-bottom:4px}.param-form-group-desc{font-size:11px;color:var(--text-dim);margin-bottom:8px;line-height:1.4}.param-form-row{display:grid;grid-template-columns:minmax(160px,1fr) minmax(120px,1fr);gap:10px;padding:6px 0;align-items:start}.param-form-label-wrap{min-width:0}.param-form-label{display:block;font-size:12px;font-weight:600;color:var(--text);cursor:default}.param-form-used-by{font-size:10px;color:var(--text-dim);font-family:var(--font);margin-top:1px}.param-form-help{font-size:11px;color:var(--text-dim);margin-top:3px;line-height:1.35}.param-form-input-wrap{min-width:0}.param-form-input{width:100%;background:var(--bg-deep);border:1px solid var(--border);color:var(--text);padding:5px 8px;border-radius:4px;font-family:var(--font);font-size:12px}.param-form-input:focus{outline:none;border-color:var(--accent);background:var(--bg)}.param-form-actions{display:flex;justify-content:flex-end;gap:8px;padding:10px 12px;background:var(--bg-hover);border-top:1px solid var(--border)}.param-form-submit{white-space:nowrap}.file-viewer-stale-banner{display:flex;align-items:center;gap:8px;padding:6px 10px;background:#ffd7001f;border-bottom:1px solid var(--accent);font-size:11px;color:var(--text-bright);flex-shrink:0}.file-viewer-stale-banner span{flex:1}.file-viewer-stale-banner .file-viewer-btn{font-size:10px;padding:2px 8px}body.remote-mode #files-pane,body.remote-mode #files-divider,body.remote-mode #files-toggle,body.remote-mode #files-show-hidden,body.remote-mode #files-refresh{display:none!important}body.remote-mode #prefs-section-galaxy,body.remote-mode #prefs-section-analysis{display:none}body.remote-mode #welcome-overlay,body.remote-mode #update-banner,body.remote-mode #report-issue-btn,body.remote-mode #exec-mode-toggle,body.remote-mode #cwd-bar,body.remote-mode #prefs-section-appearance,body.remote-mode #prefs-section-llm,body.remote-mode #prefs-section-skills,body.remote-mode #prefs-section-safety,body.remote-desktop #exec-mode-toggle,body.remote-desktop #sandbox-banner,body.remote-desktop #prefs-section-safety,body.remote-desktop #prefs-section-analysis{display:none!important}#whatsnew-banner{display:flex;align-items:center;gap:12px;padding:6px 12px;background:var(--accent-bg);color:var(--text-bright);border-bottom:1px solid var(--border-strong);font-family:var(--font-sans);font-size:12px;flex:0 0 auto}#whatsnew-banner.hidden{display:none}#whatsnew-banner .wn-banner-text{flex:1}#whatsnew-banner-version{font-weight:600;color:var(--accent)}#whatsnew-banner .wn-banner-link{background:none;border:1px solid var(--accent);color:var(--accent);padding:2px 8px;border-radius:var(--radius);cursor:pointer;font:inherit}#whatsnew-banner .wn-banner-link:hover{background:var(--accent);color:var(--bg-deep)}#whatsnew-banner .wn-banner-dismiss{background:none;border:none;color:var(--text-dim);cursor:pointer;font-size:16px;line-height:1;padding:0 4px}#whatsnew-banner .wn-banner-dismiss:hover{color:var(--text-bright)}.whatsnew-entry{margin-bottom:16px}.whatsnew-entry:last-child{margin-bottom:0}.whatsnew-entry h3{font-size:13px;font-weight:700;margin:0 0 6px;color:var(--accent)}.whatsnew-entry ul{margin:0;padding-left:18px}.whatsnew-entry li{margin:2px 0}.cred-field{margin-bottom:14px;display:flex;flex-direction:column;gap:6px}.cred-field label{font-size:13px;font-weight:500}.cred-field select,.cred-field input{padding:8px 10px;border:1px solid var(--border);border-radius:6px;background:var(--bg-inset);color:var(--text);font:inherit}.cred-field input::placeholder{color:var(--text-dim)}.cred-field select option{background:var(--bg-surface);color:var(--text)}.cred-note{margin:0;font-size:12px;color:var(--text-dim)}.cred-optional{font-weight:400;font-size:12px;color:var(--text-dim)}.cred-row{display:flex;gap:8px;align-items:center}.cred-row input{flex:1}.cred-error{min-height:18px;font-size:13px;color:var(--error)}#usage-bar{margin-left:auto}
@@ -0,0 +1,13 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>olit</title>
7
+ <script type="module" crossorigin src="./index.js"></script>
8
+ <link rel="stylesheet" crossorigin href="./index.css">
9
+ </head>
10
+ <body>
11
+ <div id="app"></div>
12
+ </body>
13
+ </html>