vibeostheog 0.25.55 → 0.26.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.
- package/CHANGELOG.md +64 -1
- package/README.md +46 -21
- package/bin/setup.js +66 -27
- package/dist/assets/dashboard/assets/index-BAFoSUYT.css +1 -0
- package/dist/assets/dashboard/assets/index-BC32ZQ0q.css +1 -0
- package/dist/assets/dashboard/assets/index-BFPdi_Ph.css +1 -0
- package/dist/assets/dashboard/assets/index-BHjsjrCc.js +5 -0
- package/dist/assets/dashboard/assets/index-BUDvTrCq.css +1 -0
- package/dist/assets/dashboard/assets/index-BY7bffmm.js +3 -0
- package/dist/assets/dashboard/assets/index-BZu3dyXH.css +1 -0
- package/dist/assets/dashboard/assets/index-Brj9Ui6Z.js +3 -0
- package/dist/assets/dashboard/assets/index-C-ScsrcN.js +3 -0
- package/dist/assets/dashboard/assets/index-C5VfzSA8.js +3 -0
- package/dist/assets/dashboard/assets/index-C5tPTUjx.js +3 -0
- package/dist/assets/dashboard/assets/index-Cb3hwMDH.css +1 -0
- package/dist/assets/dashboard/assets/index-CjHF2vTf.css +1 -0
- package/dist/assets/dashboard/assets/index-CkX-loOf.js +3 -0
- package/dist/assets/dashboard/assets/index-D3bLrmaq.css +1 -0
- package/dist/assets/dashboard/assets/index-DGIMdqp_.css +1 -0
- package/dist/assets/dashboard/assets/index-DK4e4oaB.js +3 -0
- package/dist/assets/dashboard/assets/index-DhtwzMRd.js +3 -0
- package/dist/assets/dashboard/assets/index-DnK3sBqN.js +3 -0
- package/dist/assets/dashboard/assets/index-Dwg0W0mM.js +3 -0
- package/dist/assets/dashboard/assets/index-H09FCi_1.js +5 -0
- package/dist/assets/dashboard/assets/index-IZRaK1J1.js +3 -0
- package/dist/assets/dashboard/assets/index-UkrMFHPp.css +1 -0
- package/dist/assets/dashboard/assets/index-VITT_Lum.js +3 -0
- package/dist/assets/dashboard/assets/index-Xf82CCxe.css +1 -0
- package/dist/assets/dashboard/assets/index-ZWfKo4FL.js +3 -0
- package/dist/assets/dashboard/assets/index-fhy-rD-W.css +1 -0
- package/dist/assets/dashboard/assets/index-mizr4ifp.js +5 -0
- package/dist/assets/dashboard/assets/index-rDxjSA11.css +1 -0
- package/dist/assets/dashboard/assets/index-xMN9Z-Zy.js +3 -0
- package/dist/assets/dashboard/index.html +3 -1076
- package/dist/assets/dashboard/vibeos-dashboard-config.js +2 -1
- package/dist/vibeOS.js +9025 -7398
- package/package.json +1 -1
- package/scripts/deploy.mjs +12 -7
- package/scripts/lib/plugin-config.mjs +35 -0
- package/scripts/lib/vibe-tier-agents.mjs +24 -15
package/CHANGELOG.md
CHANGED
|
@@ -1,4 +1,40 @@
|
|
|
1
|
-
## 0.
|
|
1
|
+
## 0.26.0
|
|
2
|
+
- feat: add classify/escalate cascade API wiring (#398)
|
|
3
|
+
- feat: rebuild dashboard home and session workspace (#389)
|
|
4
|
+
- feat: dashboard orchestrator backend + UX overhaul + MiniLM routing (#384)
|
|
5
|
+
- feat: learned flow rules from user corrections + content-aware pattern detection
|
|
6
|
+
- feat: redesign dashboard as home-first shell
|
|
7
|
+
- feat: port orchestrator frontend from vibeOScore
|
|
8
|
+
- fix: active API health probe — no passive 60s fallback, +audit path safety
|
|
9
|
+
- fix: local cascade escalation was discarded by any backend route, resolved_tier stuck at None (#412)
|
|
10
|
+
- fix: footer tier label/depth-icon desync, silent fallback trip, broken dead imports (#411)
|
|
11
|
+
- fix: isApiFallback() never self-heals, keeping BE non-authoritative for the session (#409)
|
|
12
|
+
- fix: cascade route_path pinned at full pipeline forever, never deescalates (#407)
|
|
13
|
+
- fix: remove dead cascade fields, footer model name follows escalated tier (#406)
|
|
14
|
+
- fix: single source of truth for cascade tier + fix deescalation (#405)
|
|
15
|
+
- fix: collapse cascade tier-routing to one source of truth, fix dead loop detector (#404)
|
|
16
|
+
- fix: collapse cascade subagent routing to one source of truth (#403)
|
|
17
|
+
- fix: use pending_escalation_tier for loop_break/web_search override (#402)
|
|
18
|
+
- fix: FE consumes web_search and loop_break from BE classify response (#401)
|
|
19
|
+
- fix: wire escalation re-route and loop context consumption (#399)
|
|
20
|
+
- fix: collapse 3-painter footer architecture into 1 shared resolver + 1 degrade path (#396)
|
|
21
|
+
- fix: cascade-aware model display in footer using trinity slot models (#395)
|
|
22
|
+
- fix: move hardcoded big-pickle fallback after resolveTrinityDisplayModel in shell-env (#394)
|
|
23
|
+
- fix: stop hardcoded opencode/big-pickle fallback from overriding real model in footer (#393)
|
|
24
|
+
- fix: footer honesty — expired reroute pulse removed, cascade icon shows at depth 1 (#391)
|
|
25
|
+
- fix: preserve native opencode mode selectors (#390)
|
|
26
|
+
- fix: align fallback footer with turn truth (#388)
|
|
27
|
+
- fix: align runtime footer and cascade truth (#387)
|
|
28
|
+
- fix: footer honesty + pivot cache TTL + quality floor in syncControlSettings (#386)
|
|
29
|
+
- fix: footer alert isApiFallback, session schema tier/model, cascade a… (#385)
|
|
30
|
+
- fix: replace vitest skeletons with node:test to unbreak CI
|
|
31
|
+
- fix: global agent config, session recording, and stale opencode config
|
|
32
|
+
- fix: remove hardcoded footer mode branding
|
|
33
|
+
- fix: preserve web search shell text for api tests
|
|
34
|
+
- fix: update stale ~/.claude/ state paths to VIBEOS_HOME
|
|
35
|
+
- fix: update stale ~/.claude/ state paths to VIBEOS_HOME
|
|
36
|
+
- fix: durable dashboard snapshots + stale-proof MCP discovery (#371)
|
|
37
|
+
- fix: cascade footer shows escalated tier + correct arrow count (#370)
|
|
2
38
|
- fix: persist cascade depth from backend route so footer shows cascade icon (#369)
|
|
3
39
|
- fix: make the cascade real — canonical blackbox records, live audit trail, durable bridges (#366)
|
|
4
40
|
- fix: stop config.update/opencode.json mid-turn writes that abort OpenCode turns (#365)
|
|
@@ -18,9 +54,36 @@
|
|
|
18
54
|
- fix: force pipeline repair when manual mode pipeline is collapsed (#330)
|
|
19
55
|
- fix: force pipeline repair when manual mode pipeline is collapsed
|
|
20
56
|
- fix: footer bail-out + pipeline collapse (#329)
|
|
57
|
+
- refactor: split state.ts into modules, fix resolved_tier freeze during API fallback (#413)
|
|
58
|
+
- refactor: dedupe the 8-field loop-notice reset block in loop-state.ts (#410)
|
|
59
|
+
- refactor: delete the dead ML learned-graph and the claim-verification wrapper (#408)
|
|
60
|
+
- refactor: mode axis consolidation + footer display fixes (#383)
|
|
61
|
+
- refactor: remove dead code and toy test (post-merge cleanup)
|
|
62
|
+
- refactor: consolidate mode system to vibemax|vibeqmax|vibeultrax|vibelitex|raw
|
|
21
63
|
- refactor: split maintainability boundaries into focused modules (#358)
|
|
22
64
|
- refactor: consolidate safeJsonParse to one canonical helper (#356)
|
|
65
|
+
- docs: update README for v0.26.0 Containment of Potential; add codename mapping in release.mjs
|
|
66
|
+
- test: add cascade escalation and mode-router real tests + API shape c… (#400)
|
|
67
|
+
- test: add SPEC §14 coverage tests and fix TS loader compilation (#397)
|
|
23
68
|
- chore: untrack internal-only MD files from repo (#351)
|
|
69
|
+
Fix dashboard home hierarchy and sidebar status (#392)
|
|
70
|
+
Merge pull request #380 from DrunkkToys/refactor/learned-flow-patterns
|
|
71
|
+
Merge pull request #379 from DrunkkToys/fix/global-config-dashboard
|
|
72
|
+
Merge pull request #378 from DrunkkToys/codex/dashboard-home-mirror
|
|
73
|
+
Fix footer integration test expectations
|
|
74
|
+
Merge pull request #377 from DrunkkToys/codex/fix-vibeultrax-cheap-first-startup
|
|
75
|
+
Fix syncControlSettings fallback slot scope
|
|
76
|
+
Update README regime and feature counts
|
|
77
|
+
Fix VibeUltraX cheap-first startup routing
|
|
78
|
+
Merge pull request #376 from DrunkkToys/codex/fix-plugin-status-savings
|
|
79
|
+
Hide footer backend icon during auth fallback
|
|
80
|
+
Fix plugin registration, status fallback, and savings sync
|
|
81
|
+
Merge pull request #375 from DrunkkToys/codex/minilm-authoritative-mode
|
|
82
|
+
Use embedding selector for authoritative mode decisions
|
|
83
|
+
Merge pull request #374 from DrunkkToys/codex/unify-dashboard-fastify
|
|
84
|
+
Preserve health probe metadata in MCP status
|
|
85
|
+
Add dashboard bridge write-behind sync
|
|
86
|
+
Merge pull request #373 from DrunkkToys/codex/port-vibeoscore-orchestrator-dashboard
|
|
24
87
|
fix cascade: complex prompts at any confidence route to brain tier (#368)
|
|
25
88
|
Fix local loop authority (#367)
|
|
26
89
|
Fix mega test loader paths and spec claims (#364)
|
package/README.md
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
# vibeOS for OpenCode --
|
|
1
|
+
# vibeOS for OpenCode -- Containment of Potential v0.26.0
|
|
2
|
+
|
|
3
|
+
> **VIBEOS_HOME** = `/Users/drunkktoys/Library/Application Support/ai.opencode.desktop/vibeOS/`
|
|
4
|
+
> All runtime state files live under `$VIBEOS_HOME` (set via `VIBEOS_HOME` env var on this machine).
|
|
2
5
|
|
|
3
6
|
A quality-first control plane for AI-assisted coding.
|
|
4
7
|
|
|
@@ -51,14 +54,16 @@ The cascade shape follows the general LLM routing literature, but the live sourc
|
|
|
51
54
|
|
|
52
55
|
### VibeBoX Decision Engine
|
|
53
56
|
|
|
54
|
-
At the core of vibeOS is a real-time decision engine that classifies every user turn into one of
|
|
57
|
+
At the core of vibeOS is a real-time decision engine that classifies every user turn into one of fourteen sub-regimes:
|
|
55
58
|
|
|
56
59
|
- **INIT / DIVERGENT / EXPLORING** -- You are learning the codebase, asking questions, browsing. cheap model, relaxed enforcement. Stay out of your way.
|
|
57
|
-
- **REFINING** -- You are iterating on a solution. Default mode: VibeUltraX, auto-escalate on complexity.
|
|
60
|
+
- **REFINING / IMPLEMENTING / DESIGNING** -- You are iterating on a solution or actively building. Default mode: VibeUltraX, auto-escalate on complexity.
|
|
61
|
+
- **RESEARCH / REVIEWING** -- You are investigating, comparing, or checking work. Routing and enforcement tighten as evidence requirements increase.
|
|
58
62
|
- **CONVERGING / CLOSED** -- You are finalizing. Full quality mode, brain tier, strict enforcement and flow checks.
|
|
59
|
-
- **LOOPING** -- You are stuck. Speed mode
|
|
63
|
+
- **LOOPING / ESCALATED** -- You are stuck or the session needs intervention. Speed mode or hard escalation paths activate to break cycles.
|
|
64
|
+
- **FORENSIC / AUDIT** -- You are doing deep investigation or security-style review. Brain tier, strict enforcement, detailed verification.
|
|
60
65
|
|
|
61
|
-
|
|
66
|
+
For VibeMaX, feature extraction currently yields 14 numeric features per turn: 8 normalized metrics plus 6 raw/boolean indicators. Four escalating intervention levels prevent infinite loops. PIVOT/SWITCH detection recognizes context changes and injects scope-confirmation directives.
|
|
62
67
|
|
|
63
68
|
When the VibeBoX is disabled, a lightweight classifyTurnSimple fallback distinguishes Q&A from implementation intent using regex patterns.
|
|
64
69
|
|
|
@@ -114,7 +119,7 @@ Cache state persists across sessions in `VIBEOS_HOME/global-learning.json` with
|
|
|
114
119
|
Two complementary mechanisms manage context transitions:
|
|
115
120
|
|
|
116
121
|
**Forward pivot** -- Detects when you abruptly change topic mid-session. Uses a composite score of word-overlap distance, instruction-density delta, message-length ratio, and action-type change. Fires when `pivotScore > 0.45`. When detected:
|
|
117
|
-
1. Snapshots the current workflow (intent, files, decisions, blockers, code) to
|
|
122
|
+
1. Snapshots the current workflow (intent, files, decisions, blockers, code) to `$VIBEOS_HOME/.vibeos-pivot-cache.json`
|
|
118
123
|
2. Downgrades mode to budget (cheap tier, thinking off, relaxed enforcement)
|
|
119
124
|
3. Injects a context-shift directive into the system prompt
|
|
120
125
|
|
|
@@ -138,7 +143,7 @@ The savings are real and measurable. Every write/edit on the brain tier is inter
|
|
|
138
143
|
| Opus -> Sonnet | $0.0264 | $0.26 | $2.64 | $26.40 |
|
|
139
144
|
| Sonnet -> Haiku | $0.0044 | $0.04 | $0.44 | $4.40 |
|
|
140
145
|
|
|
141
|
-
The running total is persisted in
|
|
146
|
+
The running total is persisted in $VIBEOS_HOME/delegation-state.json and displayed in the live footer. Cache savings are tracked separately under cache_savings_usd.
|
|
142
147
|
|
|
143
148
|
### Model Tiers
|
|
144
149
|
|
|
@@ -159,8 +164,8 @@ DeepSeek Chat costs $0/turn when routed through the Direct DeepSeek provider (no
|
|
|
159
164
|
|--------|-----------------|--------------|---------|--------|
|
|
160
165
|
| VibeUltraX | 107% | 0.58x | 42% | vibe primary + tier subagents |
|
|
161
166
|
| VibeQMaX | ~100% | 0.50x | 50% | same model, framework optimizations |
|
|
162
|
-
| Raw Brain | 100% | 1.00x | - | baseline |
|
|
163
167
|
| VibeMaX | ~75% | 0.18x | 82% | trained cascade (conservative escalate) |
|
|
168
|
+
| VibeLiteX | ~40% | 0.00x | 100% | direct cheap routing |
|
|
164
169
|
| Budget | ~40% | 0.00x | 100% | direct routing |
|
|
165
170
|
|
|
166
171
|
**VibeUltraX** -- Default mode. The unified `vibe` primary starts on cheap, medium and brain run as subagents, and same-provider escalations stay in-thread. 107% quality at 58% cost.
|
|
@@ -169,16 +174,18 @@ DeepSeek Chat costs $0/turn when routed through the Direct DeepSeek provider (no
|
|
|
169
174
|
|
|
170
175
|
**VibeMaX** -- ML-optimized medium mode. Routes through v4 Flash with a random forest classifier (29 trees, gini-split, trained on telemetry) that decides each turn. ~75% quality at 18% cost.
|
|
171
176
|
|
|
177
|
+
**VibeLiteX** -- Cheap direct routing with relaxed enforcement. Ideal for exploration and Q&A.
|
|
178
|
+
|
|
172
179
|
**Budget** -- DeepSeek Chat. Direct routing. ~40% quality at zero cost.
|
|
173
180
|
|
|
174
181
|
### Mode Configuration
|
|
175
182
|
|
|
176
183
|
| Mode | Model | Thinking | Enforcement | Flow | TDD |
|
|
177
184
|
|------|-------|----------|-------------|------|-----|
|
|
178
|
-
| Raw Brain | v4 Pro | full | - | - | - |
|
|
179
185
|
| VibeQMaX | v4 Pro | full | strict | strict | quality |
|
|
180
186
|
| VibeUltraX | vibe primary + tier subagents | auto | auto | auto | auto |
|
|
181
187
|
| VibeMaX | v4 Flash (auto-escalate) | auto | auto | auto | auto |
|
|
188
|
+
| VibeLiteX | cheap | off | relaxed | audit | lazy |
|
|
182
189
|
| Speed | v4 Flash | off | relaxed | audit | lazy |
|
|
183
190
|
| Budget | DeepSeek Chat | off | relaxed | audit | lazy |
|
|
184
191
|
|
|
@@ -205,7 +212,7 @@ Stress > 1.5 escalates any regime to quality mode regardless of the above mappin
|
|
|
205
212
|
| Flow enforcer | Pattern-rule checks on write/edit. Extracts TODO/FIXME into append-only queue. |
|
|
206
213
|
| TDD enforcer | Auto-creates test skeletons for changed source. Strict mode fails TODO tests. |
|
|
207
214
|
| Pattern learner | Tracks recurring struggle/routine patterns per project, cross-project too |
|
|
208
|
-
| VibeBoX |
|
|
215
|
+
| VibeBoX | 14 sub-regimes, 14 features per turn, loop intervention, PIVOT/SWITCH detection |
|
|
209
216
|
| Stress-aware routing | Real-time stress scoring, auto-escalation, system prompt inoculation |
|
|
210
217
|
| Cache savings | Separate cache_savings_usd tracking for scratchpad cache hits |
|
|
211
218
|
| Report tools | report-save, report-list, report-read, research-audit |
|
|
@@ -226,6 +233,9 @@ Stress > 1.5 escalates any regime to quality mode regardless of the above mappin
|
|
|
226
233
|
| Pivot / counter-pivot | Detects when you switch topics mid-session (forward pivot) and when you return to a previously abandoned workflow (counter-pivot). Forward pivots snapshot the old workflow context and downgrade to budget mode. Counter-pivots restore files, decisions, blockers, and code snippets from cached workflow snapshots into the system prompt. |
|
|
227
234
|
| Deferred reports | saveReport deferred to setTimeout to avoid blocking tool output |
|
|
228
235
|
| Stress gauge footer | Live indicator in footer -- ▁▂▃▅▆█ (none/minimal/calm/elevated/high/critical) |
|
|
236
|
+
| Cascade escalation API | classifyTurn + escalateTurn endpoints wired through the cascade pipeline with real-time tier resolution |
|
|
237
|
+
| Backend-authoritative slot sync | Active API health probe syncs slot state from backend authority without passive fallback |
|
|
238
|
+
| SPEC §14 coverage | Certified test coverage for cascade tier-routing, deescalation, mode-router, and API shape compliance |
|
|
229
239
|
|
|
230
240
|
## Install
|
|
231
241
|
|
|
@@ -259,8 +269,8 @@ Local dev checkout:
|
|
|
259
269
|
| `vibe set brain\|medium\|cheap [model=<model_id>]` | Switch active model tier or override slot |
|
|
260
270
|
| `vibe brain\|medium\|cheap` | Shorthand tier switch |
|
|
261
271
|
| `vibe enable|disable` | Toggle plugin on/off |
|
|
262
|
-
| `vibe mode budget
|
|
263
|
-
| `vibe thinking full
|
|
272
|
+
| `vibe mode budget\|quality\|speed\|longrun\|auto\|balanced\|audit\|forensic\|vibeultrax\|vibeqmax\|vibemax\|vibelitex` | Set optimization mode (generic or branded) |
|
|
273
|
+
| `vibe thinking full\|brief\|off` | Reasoning depth |
|
|
264
274
|
| `vibe enforce on|off` | Toggle delegation enforcement |
|
|
265
275
|
| `vibe lock on|off` | Freeze model for session |
|
|
266
276
|
| `vibe flow on|off` | Toggle flow enforcer |
|
|
@@ -271,6 +281,7 @@ Local dev checkout:
|
|
|
271
281
|
| `vibe rebuild` | Re-detect models from all providers |
|
|
272
282
|
| `vibe project` | Per-project analytics |
|
|
273
283
|
| `vibe patterns` / `vibe patterns clear` / `vibe patterns suggest` | Pattern inspection |
|
|
284
|
+
| `vibe axis [status\|reset\|<name> <value>]` | Axis overrides for enforcement, flow, tdd, tier, thinking, context7_urgency, wbp_verbosity, websearch |
|
|
274
285
|
| `vibe todo` / `vibe todo-done <id>` / `vibe todo-sync` | View pending todos, mark done, sync flow todos |
|
|
275
286
|
| `vibe verify-claims` | Audit recent claim output against cascade evidence |
|
|
276
287
|
| `vibe diagnose` | Health check |
|
|
@@ -289,13 +300,15 @@ Local dev checkout:
|
|
|
289
300
|
|
|
290
301
|
### Architecture
|
|
291
302
|
|
|
292
|
-
vibeOS hooks into OpenCode Desktop through
|
|
303
|
+
vibeOS hooks into OpenCode Desktop through 10 extension points:
|
|
293
304
|
|
|
294
305
|
| Hook | Purpose |
|
|
295
306
|
|------|---------|
|
|
296
307
|
| experimental.text.complete | Appends footer to assistant responses |
|
|
297
308
|
| experimental.chat.messages.transform | Injects delegation protocol content |
|
|
298
309
|
| experimental.chat.system.transform | Injects cost optimization, stress inoculation, enforcement directives |
|
|
310
|
+
| experimental.chat.params | Modifies chat parameters before requests |
|
|
311
|
+
| experimental.chat.headers | Injects custom HTTP headers into chat requests |
|
|
299
312
|
| tool.execute.before | Blocks write/edit on brain tier |
|
|
300
313
|
| tool.execute.after | Injects delegation UI notes |
|
|
301
314
|
| message.updated | Fallback footer for versions without text.complete |
|
|
@@ -320,10 +333,6 @@ Core features work fully offline: model tier classification, static pricing, str
|
|
|
320
333
|
|
|
321
334
|
Remote API (api.vibetheog.com) enables: bootstrap token exchange, advanced VibeBoX with full session history, dynamic per-prompt delegation, cross-session calibration, live pricing fetch, learned subagent routing. Falls back gracefully when unreachable.
|
|
322
335
|
|
|
323
|
-
### What Is Missing For A True Session Orchestrator
|
|
324
|
-
|
|
325
|
-
The live dashboard now covers the executive Home summary, session actions, and session-scoped templates. Still missing: session versioning/undo, template versioning, batch operations, live push transport, session comparison, and export/import.
|
|
326
|
-
|
|
327
336
|
### Live Footer
|
|
328
337
|
|
|
329
338
|
The footer is the primary status line, appended to every assistant response. It surfaces model assignment, savings, mode, alerts, and session metrics in a single line.
|
|
@@ -435,19 +444,35 @@ This table is the single source of truth — `buildFooterAlert()` must match it
|
|
|
435
444
|
| Stress gauge | gaugeChar | _ | Current stress level |
|
|
436
445
|
| Vector pulse | slot | cheap | Active slot changed this turn |
|
|
437
446
|
|
|
438
|
-
Controls: `vibe status` for full state, `vibe enable/disable` to toggle. Persisted in
|
|
447
|
+
Controls: `vibe status` for full state, `vibe enable/disable` to toggle. Persisted in $VIBEOS_HOME/delegation-state.json.
|
|
439
448
|
|
|
440
449
|
### Environment Variables
|
|
441
450
|
|
|
442
451
|
| Variable | Default | Effect |
|
|
443
452
|
|----------|---------|--------|
|
|
453
|
+
| VIBEOS_HOME | ~/.vibeos | Runtime state directory |
|
|
444
454
|
| VIBEOS_API_URL | https://api.vibetheog.com | Remote API base URL |
|
|
445
455
|
| VIBEOS_API_TOKEN | unset | Remote API auth |
|
|
446
|
-
| VIBEOS_API_DISABLED | false | Invalidate alpha token |
|
|
447
456
|
| VIBEOS_API_BOOTSTRAP_TOKEN | unset | Bootstrap exchange |
|
|
448
|
-
| VIBEOS_API_ENABLED | true | Set false for local-only |
|
|
449
|
-
| CLAUDE_CREDIT_PERCENT | 100 | Credit override |
|
|
450
457
|
| VIBEOS_MCP_PORT | 3001 | MCP server port |
|
|
458
|
+
| VIBEOS_BUILD_CHANNEL | alpha | Build channel for API client |
|
|
459
|
+
| VIBEOS_DEBUG | unset | Verbose debug logging |
|
|
460
|
+
| VIBEOS_DEBUG_INTERNALS | unset | Internal state debug logging |
|
|
461
|
+
| VIBEOS_DEBUG_DELEGATION | unset | Delegation enforcer debug logging |
|
|
462
|
+
| VIBEOS_DEBUG_FOOTER | unset | Footer builder debug logging |
|
|
463
|
+
| VIBEOS_DEBUG_LOGS | unset | Flow enforcer debug logging |
|
|
464
|
+
| VIBEOS_DEBUG_STDERR | unset | Flow enforcer stderr debug logging |
|
|
465
|
+
| VIBEOS_FLOW_RULES_PATH | unset | Custom flow rules file path |
|
|
466
|
+
| VIBEOS_DASHBOARD_SYNC_MS | 20000 | Dashboard polling interval (ms) |
|
|
467
|
+
| VIBEOS_ACTIVE_PROBE_MS | 10000 | Backend health probe interval (ms) |
|
|
468
|
+
| VIBEOS_REMOTE_LATENCY_DEGRADE_MS | 800 | Latency threshold for degraded alert (ms) |
|
|
469
|
+
| VIBEOS_REMOTE_LATENCY_DEGRADE_COOLDOWN_MS | 120000 | Cooldown between degraded alerts (ms) |
|
|
470
|
+
| VIBEOS_VIBEMAX_MODEL_PATH | unset | Custom VibeMaX model path |
|
|
471
|
+
| VIBEOS_OPENCODE_DESKTOP_HOME | unset | OpenCode Desktop home override |
|
|
472
|
+
| VIBEOS_OPENCODE_HOME | unset | OpenCode config home override |
|
|
473
|
+
| VIBEOS_API_MASTER_KEY | unset | API master key for backend auth |
|
|
474
|
+
| VIBEOS_BACKEND_HEALTH_URL | unset | Custom backend health check URL |
|
|
475
|
+
| CLAUDE_CREDIT_PERCENT | 50 | Credit override percentage |
|
|
451
476
|
|
|
452
477
|
### Troubleshooting
|
|
453
478
|
|
package/bin/setup.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
// src/bin/setup.ts
|
|
4
|
-
import {
|
|
5
|
-
import { readFileSync as readFileSync2, writeFileSync as writeFileSync2, existsSync as
|
|
6
|
-
import { dirname as dirname2, resolve } from "node:path";
|
|
4
|
+
import { execFileSync } from "node:child_process";
|
|
5
|
+
import { readFileSync as readFileSync2, writeFileSync as writeFileSync2, existsSync as existsSync3, mkdirSync as mkdirSync2, renameSync as renameSync2 } from "node:fs";
|
|
6
|
+
import { dirname as dirname2, resolve as resolve2 } from "node:path";
|
|
7
7
|
import { fileURLToPath } from "node:url";
|
|
8
8
|
|
|
9
9
|
// scripts/lib/opencode-homes.mjs
|
|
@@ -28,6 +28,14 @@ var VIBE_TIER_AGENT_BY_SLOT = {
|
|
|
28
28
|
brain: "vibe-brain"
|
|
29
29
|
};
|
|
30
30
|
var VIBE_PRIMARY_AGENT = "vibe";
|
|
31
|
+
var NATIVE_OPENCODE_AGENTS = ["build", "plan", "vibe"];
|
|
32
|
+
function isNativeOpenCodeAgent(value) {
|
|
33
|
+
return NATIVE_OPENCODE_AGENTS.includes(String(value || "").trim().toLowerCase());
|
|
34
|
+
}
|
|
35
|
+
function normalizeNativeOpenCodeAgent(value, fallback = VIBE_PRIMARY_AGENT) {
|
|
36
|
+
const normalized = String(value || "").trim().toLowerCase();
|
|
37
|
+
return isNativeOpenCodeAgent(normalized) ? normalized : fallback;
|
|
38
|
+
}
|
|
31
39
|
function readJson(path) {
|
|
32
40
|
if (!existsSync(path)) return {};
|
|
33
41
|
try {
|
|
@@ -42,12 +50,11 @@ function readJson(path) {
|
|
|
42
50
|
function readTiers(home = homedir2()) {
|
|
43
51
|
return readJson(join2(process.env.VIBEOS_HOME || join2(home, ".claude"), "model-tiers.json"));
|
|
44
52
|
}
|
|
45
|
-
function primaryAgent(
|
|
46
|
-
|
|
53
|
+
function primaryAgent(existing = {}) {
|
|
54
|
+
const next = {
|
|
47
55
|
...existing && typeof existing === "object" ? existing : {},
|
|
48
56
|
description: "VibeUltraX primary agent",
|
|
49
57
|
mode: "primary",
|
|
50
|
-
model,
|
|
51
58
|
permission: {
|
|
52
59
|
read: "allow",
|
|
53
60
|
edit: "allow",
|
|
@@ -61,6 +68,8 @@ function primaryAgent(model, existing = {}) {
|
|
|
61
68
|
...existing?.permission && typeof existing.permission === "object" ? existing.permission : {}
|
|
62
69
|
}
|
|
63
70
|
};
|
|
71
|
+
delete next.model;
|
|
72
|
+
return next;
|
|
64
73
|
}
|
|
65
74
|
function tierAgent(slot, model, existing = {}) {
|
|
66
75
|
return {
|
|
@@ -88,18 +97,16 @@ function installVibeTierAgentsInConfig(config, tiers = readTiers()) {
|
|
|
88
97
|
config.$schema ||= "https://opencode.ai/config.json";
|
|
89
98
|
config.agent = config.agent && typeof config.agent === "object" ? config.agent : {};
|
|
90
99
|
let changed = false;
|
|
91
|
-
const
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
changed = true;
|
|
102
|
-
}
|
|
100
|
+
const existingPrimary = config.agent[VIBE_PRIMARY_AGENT];
|
|
101
|
+
const nextPrimary = primaryAgent(existingPrimary);
|
|
102
|
+
if (JSON.stringify(existingPrimary || null) !== JSON.stringify(nextPrimary)) {
|
|
103
|
+
config.agent[VIBE_PRIMARY_AGENT] = nextPrimary;
|
|
104
|
+
changed = true;
|
|
105
|
+
}
|
|
106
|
+
const nextDefaultAgent = normalizeNativeOpenCodeAgent(String(config.default_agent || "").trim() || VIBE_PRIMARY_AGENT);
|
|
107
|
+
if (config.default_agent !== nextDefaultAgent) {
|
|
108
|
+
config.default_agent = nextDefaultAgent;
|
|
109
|
+
changed = true;
|
|
103
110
|
}
|
|
104
111
|
for (const slot of ["cheap", "medium", "brain"]) {
|
|
105
112
|
const model = String(trinity?.[slot]?.oc || "").trim();
|
|
@@ -115,9 +122,42 @@ function installVibeTierAgentsInConfig(config, tiers = readTiers()) {
|
|
|
115
122
|
return changed;
|
|
116
123
|
}
|
|
117
124
|
|
|
125
|
+
// scripts/lib/plugin-config.mjs
|
|
126
|
+
import { existsSync as existsSync2 } from "node:fs";
|
|
127
|
+
import { resolve } from "node:path";
|
|
128
|
+
function resolveVibeOSPluginRef(home) {
|
|
129
|
+
return resolve(home, "plugins", "vibeOS.js");
|
|
130
|
+
}
|
|
131
|
+
function normalizeVibeOSPluginRefs(pluginList, canonicalPluginRef) {
|
|
132
|
+
const refs = Array.isArray(pluginList) ? pluginList : [];
|
|
133
|
+
const kept = [];
|
|
134
|
+
let hasCanonical = false;
|
|
135
|
+
for (const ref of refs) {
|
|
136
|
+
if (typeof ref !== "string") {
|
|
137
|
+
kept.push(ref);
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
if (!ref.includes("vibeOS")) {
|
|
141
|
+
kept.push(ref);
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
const normalized = resolve(ref);
|
|
145
|
+
if (normalized === canonicalPluginRef || ref === canonicalPluginRef) {
|
|
146
|
+
if (!hasCanonical) {
|
|
147
|
+
hasCanonical = true;
|
|
148
|
+
kept.push(canonicalPluginRef);
|
|
149
|
+
}
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
if (existsSync2(normalized)) continue;
|
|
153
|
+
}
|
|
154
|
+
if (!hasCanonical) kept.push(canonicalPluginRef);
|
|
155
|
+
return kept;
|
|
156
|
+
}
|
|
157
|
+
|
|
118
158
|
// src/bin/setup.ts
|
|
119
159
|
var __dirname = dirname2(fileURLToPath(import.meta.url));
|
|
120
|
-
var root =
|
|
160
|
+
var root = resolve2(__dirname, "..");
|
|
121
161
|
var args = process.argv.slice(2);
|
|
122
162
|
var command = args.find((a) => !a.startsWith("-")) ?? "setup";
|
|
123
163
|
var isInstallCommand = command === "setup" || command === "set";
|
|
@@ -136,16 +176,16 @@ writeLine();
|
|
|
136
176
|
writeLine("Installing to:");
|
|
137
177
|
for (const h of resolveOpenCodeHomes({ cwd: process.cwd() })) writeLine(" " + h);
|
|
138
178
|
writeLine();
|
|
139
|
-
var deployScript =
|
|
140
|
-
if (!
|
|
179
|
+
var deployScript = resolve2(root, "scripts", "deploy.mjs");
|
|
180
|
+
if (!existsSync3(deployScript)) {
|
|
141
181
|
console.error("Fatal: scripts/deploy.mjs not found at", deployScript);
|
|
142
182
|
process.exit(1);
|
|
143
183
|
}
|
|
144
|
-
|
|
184
|
+
execFileSync(process.execPath, [deployScript], { stdio: "inherit", cwd: process.cwd() });
|
|
145
185
|
if (isProject) {
|
|
146
|
-
const configPath =
|
|
186
|
+
const configPath = resolve2(process.cwd(), "opencode.json");
|
|
147
187
|
let config = {};
|
|
148
|
-
if (
|
|
188
|
+
if (existsSync3(configPath)) {
|
|
149
189
|
try {
|
|
150
190
|
config = JSON.parse(readFileSync2(configPath, "utf8"));
|
|
151
191
|
} catch {
|
|
@@ -156,10 +196,9 @@ if (isProject) {
|
|
|
156
196
|
if (!config.$schema) config.$schema = "https://opencode.ai/config.json";
|
|
157
197
|
if (!Array.isArray(config.plugin)) config.plugin = [];
|
|
158
198
|
const installHome = resolveOpenCodeHome({ cwd: process.cwd() });
|
|
159
|
-
const pluginRef =
|
|
160
|
-
config.plugin = config.plugin
|
|
199
|
+
const pluginRef = resolveVibeOSPluginRef(installHome);
|
|
200
|
+
config.plugin = normalizeVibeOSPluginRefs(config.plugin, pluginRef);
|
|
161
201
|
installVibeTierAgentsInConfig(config);
|
|
162
|
-
if (!config.plugin.includes(pluginRef)) config.plugin.push(pluginRef);
|
|
163
202
|
mkdirSync2(dirname2(configPath), { recursive: true });
|
|
164
203
|
const tmp = `${configPath}.tmp.${process.pid}.${Date.now()}`;
|
|
165
204
|
writeFileSync2(tmp, JSON.stringify(config, null, 2) + "\n");
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}:root{--bg:#050507;--bg-glow:rgba(88,166,255,.12);--bg-warm:rgba(255,157,61,.08);--surface:#0d1016;--surface-2:#111622;--panel:rgba(15,19,27,.88);--panel-strong:rgba(18,23,34,.96);--border:#1e2530;--border-hover:#354153;--text:#d4d4d4;--text-dim:#6a6a6a;--text-bright:#f0f0f0;--green:#3fb950;--red:#f85149;--yellow:#d29922;--accent:#58a6ff;--accent-dim:rgba(88,166,255,.08);--accent-strong:rgba(88,166,255,.18);--glow:0 24px 80px rgba(0,0,0,.45),0 0 0 1px rgba(255,255,255,.02) inset;--glow-soft:0 16px 44px rgba(0,0,0,.32),0 0 32px rgba(88,166,255,.06);--radius-lg:18px;--radius-md:12px;--radius-sm:9px;--mono:"JetBrains Mono","Fira Code","Cascadia Code","SF Mono",Menlo,monospace;--sans:-apple-system,BlinkMacSystemFont,"Segoe UI",Inter,Helvetica,Arial,sans-serif}html{font-size:13px;background:radial-gradient(circle at 18% 8%,rgba(88,166,255,.14),transparent 28%),radial-gradient(circle at 82% 6%,rgba(255,157,61,.11),transparent 26%),radial-gradient(circle at 50% 108%,rgba(63,185,80,.08),transparent 28%),var(--bg)}body{font-family:var(--sans);background:radial-gradient(circle at 20% 0%,rgba(88,166,255,.08),transparent 24%),radial-gradient(circle at 90% 10%,rgba(255,157,61,.06),transparent 24%),linear-gradient(180deg,#ffffff05,#0000),var(--bg);color:var(--text);min-height:100vh;-webkit-font-smoothing:antialiased;line-height:1.45}.app{max-width:1600px;margin:0 auto;padding:1.15rem 1.35rem}.header{display:flex;justify-content:space-between;align-items:center;padding-bottom:.5rem;margin-bottom:.75rem;border-bottom:1px solid rgba(255,255,255,.06)}.header-title{display:flex;align-items:baseline;gap:.5rem}.header-title h1{font-family:var(--sans);font-size:1.08rem;font-weight:700;color:var(--text-bright);letter-spacing:-.2px}.header-title h1:before{content:"";color:var(--red)}.header-subtitle{font-size:.72rem;color:var(--text-dim);font-family:var(--mono);margin-top:.15rem}.version{font-size:.7rem;color:var(--text-dim);font-family:var(--mono)}.header-indicators{display:flex;gap:.5rem;align-items:center}.indicator{font-family:var(--mono);font-size:.65rem;padding:1px 6px;text-transform:uppercase;font-weight:600;letter-spacing:.5px;border:1px solid rgba(255,255,255,.06);border-radius:999px;background:#ffffff05}.indicator.connected{color:var(--green)}.indicator.disconnected{color:var(--yellow)}.indicator.disabled{color:var(--red)}.indicator:before{content:"● ";font-size:.5rem}.indicator.flash:before{content:"⚡ ";font-size:.7rem}.nav-tabs{display:flex;gap:0;margin-bottom:1rem;border-bottom:1px solid var(--border)}.tab{font-family:var(--mono);background:transparent;border:none;color:var(--text-dim);padding:.4rem .75rem;cursor:pointer;font-size:.78rem;border-bottom:2px solid transparent;margin-bottom:-1px;transition:color .15s,border-color .15s;text-transform:uppercase;letter-spacing:.5px}.tab:hover{color:var(--text);border-bottom-color:var(--border-hover)}.tab.active{color:var(--text-bright);border-bottom-color:var(--green);font-weight:600}.content{display:flex;flex-direction:column;gap:.75rem}.grid-2col{display:grid;grid-template-columns:1fr 1fr;gap:.75rem}.card,.card-full{background:linear-gradient(180deg,#ffffff0a,#ffffff04),var(--panel);border:1px solid rgba(255,255,255,.06);padding:.8rem .9rem;border-radius:var(--radius-lg);box-shadow:var(--glow-soft)}.card-full{grid-column:1/-1}.card h3,.card-full h3{font-family:var(--sans);font-size:.78rem;font-weight:700;margin-bottom:.65rem;text-transform:uppercase;color:var(--text-dim);letter-spacing:1px}.card h3:before,.card-full h3:before{content:"── ";color:var(--border-hover)}.kv-table{width:100%;border-collapse:collapse;font-family:var(--mono)}.kv-table td{padding:.25rem 0;font-size:.78rem}.kv-table td:first-child{color:var(--text-dim);width:38%;white-space:nowrap}.kv-table td:last-child{color:var(--text);overflow-wrap:anywhere}.badge{display:inline-block;font-family:var(--mono);font-size:.65rem;padding:1px 5px;font-weight:600;text-transform:uppercase;letter-spacing:.5px;line-height:1.4}.badge.slot{color:var(--green)}.badge.slot:before{content:"["}.badge.slot:after{content:"]"}.badge.on{color:var(--green)}.badge.on:before{content:"["}.badge.on:after{content:"]"}.badge.off{color:var(--red)}.badge.off:before{content:"["}.badge.off:after{content:"]"}code{font-family:var(--mono);font-size:.75rem;color:var(--text-bright)}pre{font-family:var(--mono);font-size:.72rem}.credit-bar{display:inline-block;width:55px;height:6px;background:var(--border);overflow:hidden;vertical-align:middle;border:1px solid var(--border-hover)}.credit-fill{height:100%;background:var(--green);transition:width .4s ease}.credit-label{margin-left:.4rem;font-size:.7rem;font-family:var(--mono);color:var(--text-dim)}.trend{font-size:.85rem;font-family:var(--mono)}.trend-up{color:var(--green)}.trend-down{color:var(--red)}.trend-flat{color:var(--text-dim)}.bar-chart{display:flex;flex-direction:column;gap:.3rem;margin-top:.5rem}.bar-row{display:flex;align-items:center;gap:.5rem}.bar-label{width:75px;font-size:.7rem;color:var(--text-dim);text-align:right;font-family:var(--mono)}.bar-track{flex:1;height:5px;background:var(--border);overflow:hidden}.bar-fill{height:100%;background:var(--accent);transition:width .4s ease}.bar-value{width:55px;font-size:.7rem;text-align:right;font-family:var(--mono);color:var(--text-dim)}.data-table{width:100%;border-collapse:collapse;font-size:.72rem;font-family:var(--mono)}.data-table th,.data-table td{padding:.3rem .4rem;text-align:left}.data-table th{color:var(--text-dim);font-weight:600;text-transform:uppercase;letter-spacing:.5px;font-size:.65rem;border-bottom:1px solid var(--border)}.data-table td{border-bottom:1px solid var(--border);color:var(--text)}.data-table tr:hover td{background:var(--accent-dim)}.data-table td:first-child{color:var(--text-bright)}.stress-bars{display:flex;gap:2px;align-items:flex-end;min-height:28px;padding:.3rem 0}.stress-bar{font-size:1.4rem;line-height:1;font-family:var(--mono)}.muted{color:var(--text-dim);font-size:.78rem;font-family:var(--mono)}.error{color:var(--red);font-size:.75rem;font-family:var(--mono)}.sep{color:var(--text-dim);margin:.5rem 0;font-family:var(--mono);font-size:.65rem;letter-spacing:2px}.control-group{margin-bottom:.65rem}.control-group h4{font-family:var(--mono);font-size:.65rem;color:var(--text-dim);margin-bottom:.3rem;text-transform:uppercase;letter-spacing:1px;border-bottom:1px solid var(--border);padding-bottom:.15rem}.bracket-row{display:flex;gap:.6rem;flex-wrap:wrap}.bracket-btn{font-family:var(--mono);font-size:.75rem;background:transparent;border:none;color:var(--text-dim);cursor:pointer;padding:.15rem 0;transition:color .15s;letter-spacing:.3px}.bracket-btn:before{content:"["}.bracket-btn:after{content:"]"}.bracket-btn:hover{color:var(--text)}.bracket-btn.on{color:var(--green);font-weight:600}.bracket-btn.off{color:var(--red)}.bracket-btn:disabled{opacity:.3;cursor:default}.result-box{margin-top:.6rem;padding:.5rem .6rem;border:1px solid rgba(255,255,255,.08);border-left:2px solid var(--accent);font-family:var(--mono);font-size:.7rem;color:var(--text-dim);display:flex;justify-content:space-between;align-items:center;background:linear-gradient(180deg,#58a6ff0f,#ffffff05);border-radius:var(--radius-sm)}.result-box code{font-size:.7rem;color:var(--text-dim);max-width:90%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dismiss-btn{background:none;border:none;color:var(--text-dim);cursor:pointer;font-size:.85rem;padding:0 .2rem;font-family:var(--mono)}.dismiss-btn:hover{color:var(--text)}.reports-layout{display:grid;grid-template-columns:1fr 2fr;gap:.75rem;min-height:280px}.report-list{display:flex;flex-direction:column;gap:0}.report-item{padding:.4rem .5rem;cursor:pointer;border-left:2px solid transparent;transition:border-color .15s,background .15s}.report-item:hover{border-color:var(--border-hover)}.report-item.active{border-color:var(--green);background:var(--accent-dim)}.report-summary{font-family:var(--mono);font-size:.78rem;color:var(--text);margin-bottom:.2rem}.report-meta{display:flex;gap:.5rem;font-size:.65rem;color:var(--text-dim);font-family:var(--mono)}.report-type{text-transform:uppercase;letter-spacing:.5px}.report-viewer{background:var(--bg);border:1px solid var(--border);padding:.6rem .7rem;overflow:auto;min-height:200px}.report-content{font-family:var(--mono);font-size:.72rem;color:var(--text);white-space:pre-wrap;word-break:break-all}.search-hero{display:flex;justify-content:space-between;gap:.75rem;align-items:flex-start;border:1px solid rgba(255,255,255,.08);background:linear-gradient(135deg,#58a6ff1c,#ff9d3d0d 48%,#ffffff05);padding:.8rem .9rem;margin-bottom:.75rem;border-radius:var(--radius-lg);box-shadow:var(--glow-soft)}.search-hero-kicker{font-family:var(--mono);font-size:.62rem;text-transform:uppercase;color:var(--text-dim);letter-spacing:1px;margin-bottom:.2rem}.search-hero-title{font-family:var(--mono);font-size:.92rem;font-weight:700;color:var(--text-bright);margin-bottom:.25rem}.search-hero-copy{font-family:var(--mono);font-size:.72rem;line-height:1.45;color:var(--text-dim);max-width:62ch}.search-hero-meta{display:flex;gap:.35rem;flex-wrap:wrap;justify-content:flex-end}.search-stats{display:flex;gap:.35rem;flex-wrap:wrap;margin-top:.45rem}.search-answer-text{font-family:var(--mono);font-size:.72rem;line-height:1.5;color:var(--text);white-space:pre-wrap;word-break:break-word;margin:0}.search-output{display:grid;grid-template-columns:1.1fr 1.2fr;gap:.75rem;margin-top:.75rem}.search-answer,.search-results,.search-citations{background:var(--bg);border:1px solid var(--border);padding:.55rem .6rem}.search-answer h4,.search-results h4,.search-citations h4{font-family:var(--mono);font-size:.65rem;color:var(--text-dim);margin-bottom:.35rem;text-transform:uppercase;letter-spacing:1px}.search-list{display:flex;flex-direction:column;gap:.4rem}.search-item{display:block;color:inherit;text-decoration:none;border:1px solid var(--border);padding:.45rem .5rem;background:#ffffff03}.search-item:hover{border-color:var(--accent);background:var(--accent-dim)}.search-item-title{font-family:var(--mono);font-size:.74rem;color:var(--text-bright);margin-bottom:.1rem;display:flex;gap:.35rem;align-items:flex-start}.search-rank{color:var(--accent);font-weight:700}.search-item-meta,.search-item-snippet{font-family:var(--mono);font-size:.68rem;color:var(--text-dim)}.search-item-snippet{margin-top:.2rem;line-height:1.4}.citation-row{display:flex;gap:.35rem;flex-wrap:wrap;margin-bottom:.35rem}.citation-pill{display:inline-block;text-decoration:none;padding:.2rem .4rem;border:1px solid var(--border);color:var(--text);font-family:var(--mono);font-size:.65rem}.citation-pill:hover{border-color:var(--accent);color:var(--text-bright)}.blackbox-status{font-family:var(--mono);margin-top:.8rem}.blackbox-status td{font-size:.75rem}.field-label{display:block;margin:.35rem 0 .2rem;color:var(--text-dim);font-size:.65rem;text-transform:uppercase;letter-spacing:1px;font-family:var(--mono)}.text-input,.text-area{width:100%;background:var(--bg);color:var(--text-bright);border:1px solid var(--border);font-family:var(--mono);font-size:.75rem;padding:.45rem .5rem;margin-bottom:.35rem;outline:none}.text-input:focus,.text-area:focus{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent-dim)}.text-area{resize:vertical;min-height:72px}@media(max-width:900px){.grid-2col,.reports-layout,.search-output{grid-template-columns:1fr}.header{flex-direction:column;align-items:flex-start;gap:.5rem}.search-hero{flex-direction:column}.search-hero-meta{justify-content:flex-start}}.section-divider{border:none;border-top:1px solid var(--border);margin:.4rem 0;opacity:.6}.status-dot{color:var(--green);font-family:var(--mono)}.status-dot.off{color:var(--red)}.shell{display:flex;min-height:100vh;max-width:1400px;margin:0 auto}.shell .main{flex:1;min-width:0;padding:1rem 1.25rem;display:flex;flex-direction:column}.shell .main .header{margin-bottom:.5rem}.sidebar{width:230px;flex-shrink:0;border-right:1px solid var(--border);background:linear-gradient(180deg,#ffffff08,#00000014),var(--surface);padding:.75rem .5rem;display:flex;flex-direction:column;gap:2px;font-size:.78rem}.sidebar-brand{display:flex;align-items:center;gap:.6rem;padding:.25rem .4rem .8rem;border-bottom:1px solid var(--border);margin-bottom:.4rem}.sidebar-brand-mark{color:var(--red);font-size:1.05rem;font-weight:700}.sidebar-home-icon{width:32px;height:32px;display:inline-flex;align-items:center;justify-content:center;background:linear-gradient(180deg,#ff9d3d47,#ff9d3d14);border:1px solid rgba(255,157,61,.36);border-radius:11px;color:#ffb36b;box-shadow:0 12px 24px #ff9d3d14,inset 0 0 0 1px #ffffff08}.sidebar-brand-title{font-size:.84rem;color:var(--text-bright);text-transform:lowercase}.sidebar-brand-subtitle{font-size:.64rem;color:var(--text-dim);text-transform:uppercase;letter-spacing:.8px}.sidebar-column-label{display:flex;align-items:flex-start;gap:.55rem;border:1px solid rgba(255,255,255,.07);background:linear-gradient(180deg,#ffffff0a,#58a6ff12);padding:.6rem .65rem;margin:.45rem 0 .65rem;border-radius:var(--radius-md)}.sidebar-column-num,.column-badge{width:24px;height:24px;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--border-hover);border-radius:999px;background:var(--surface);color:var(--text-bright);font-size:.72rem;font-weight:700;flex-shrink:0}.sidebar-column-title{font-size:.86rem;color:var(--text-bright);font-weight:700}.sidebar-column-copy{font-size:.67rem;color:var(--text-dim);text-transform:uppercase;letter-spacing:.55px;margin-top:.15rem}.sidebar-section-label{color:var(--text-dim);text-transform:uppercase;letter-spacing:.5px;font-size:.6rem;padding:.35rem .4rem .2rem}.sidebar-section-head{display:flex;align-items:center;justify-content:space-between;margin-top:.4rem}.sidebar-item{display:block;width:100%;text-align:left;background:transparent;border:none;cursor:pointer;color:var(--text);font-family:var(--sans);font-size:.78rem;padding:.34rem .45rem;border-radius:4px}.sidebar-item:hover{background:var(--bg)}.sidebar-item.active{background:var(--accent-dim);color:var(--text-bright);border-left:2px solid var(--green)}.sidebar-item.pinned{font-weight:600}.sidebar-home-button{display:flex;align-items:center;gap:.55rem;width:100%;margin:.1rem 0 .3rem;padding:.55rem;background:linear-gradient(180deg,#ff9d3d29,#ffffff05);border:1px solid rgba(255,157,61,.28);border-radius:12px;box-shadow:var(--glow-soft)}.sidebar-home-button:hover{background:linear-gradient(180deg,#ff9d3d24,#ffffff08)}.sidebar-home-button.active{background:linear-gradient(180deg,#ff9d3d2e,#58a6ff0a);border-color:#ff9d3d61;border-left:2px solid rgba(255,157,61,.8)}.sidebar-home-button-icon{width:24px;height:24px;display:inline-flex;align-items:center;justify-content:center;border-radius:8px;background:linear-gradient(180deg,#ffffff14,#ff9d3d14);color:#ffb36b;font-size:.9rem;flex-shrink:0}.sidebar-home-button-copy{display:flex;flex-direction:column;align-items:flex-start;line-height:1.15}.sidebar-home-button-title{color:var(--text-bright);font-size:.8rem}.sidebar-home-button-subtitle{color:var(--text-dim);font-size:.62rem;text-transform:uppercase;letter-spacing:.6px;margin-top:.1rem}.sidebar-item.session{font-size:.74rem;color:var(--text-dim)}.sidebar-item.session.active{color:var(--text-bright)}.sidebar-icon{color:var(--green);margin-right:2px}.sidebar-caret{color:var(--text-dim);display:inline-block;width:.8rem}.sidebar-project-row{display:flex;align-items:center}.sidebar-project-icon{width:24px;height:24px;display:inline-flex;align-items:center;justify-content:center;border:1px solid rgba(255,255,255,.07);border-radius:7px;color:var(--text-bright);font-size:.7rem;background:linear-gradient(180deg,#ffffff0d,#ffffff05);margin-right:.3rem;flex-shrink:0}.sidebar-sessions{margin-left:.85rem;border-left:1px solid var(--border);padding-left:.2rem}.sidebar-add{background:transparent;border:1px solid var(--border);color:var(--text-dim);cursor:pointer;border-radius:3px;width:18px;height:18px;line-height:1;font-size:.85rem;flex-shrink:0}.sidebar-add:hover{color:var(--green);border-color:var(--border-hover)}.sidebar-empty{color:var(--text-dim);font-size:.68rem;padding:.2rem .5rem;font-style:italic}.sidebar-empty.sub{padding-left:.6rem}.sidebar-context-card{border:1px solid rgba(255,255,255,.06);background:linear-gradient(180deg,#ffffff05,#00000014);padding:.45rem .5rem;margin:.5rem 0 .35rem;display:flex;flex-direction:column;gap:.2rem;border-radius:var(--radius-sm)}.sidebar-context-main{font-size:.74rem;color:var(--text-bright);line-height:1.4;word-break:break-word}.sidebar-inline-link{background:transparent;border:none;color:var(--accent);cursor:pointer;text-align:left;font-family:var(--mono);font-size:.69rem;padding:0}.sidebar-inline-link:hover{text-decoration:underline}.session-pane,.project-view{display:flex;flex-direction:column;gap:.6rem;height:100%}.session-head,.project-head{display:flex;justify-content:space-between;align-items:flex-end;border-bottom:1px solid var(--border);padding-bottom:.5rem}.session-title{font-size:1rem;color:var(--text-bright);font-family:var(--mono)}.session-flow{display:flex;flex-direction:column;gap:2px;align-items:flex-end}.session-flow select,.flow-mini,.project-head select{background:var(--bg);border:1px solid var(--border);color:var(--text);font-family:var(--mono);font-size:.72rem;padding:2px 4px;border-radius:3px}.session-body{display:flex;flex-direction:column;gap:.5rem;flex:1;min-height:0}.thread{display:flex;flex-direction:column;gap:.5rem;overflow-y:auto;flex:1;padding-right:.25rem}.msg{border:1px solid rgba(255,255,255,.08);border-radius:4px;padding:.55rem .6rem;background:#ffffff05}.msg.user{border-left:2px solid var(--accent)}.msg.assistant{border-left:2px solid var(--green)}.msg.live{border-left-color:var(--yellow)}.msg-role{font-size:.6rem;text-transform:uppercase;letter-spacing:.5px;color:var(--text-dim);margin-bottom:.25rem}.msg-content{color:var(--text);white-space:pre-wrap;font-size:.8rem;line-height:1.55}.msg-content.mono{font-family:var(--mono);color:var(--text-dim);font-size:.72rem}.run-trace{display:flex;flex-direction:column;gap:2px;margin-top:.4rem}.run-step{display:flex;gap:.4rem;align-items:baseline;font-size:.72rem;padding:2px 4px;border-radius:3px;background:var(--bg)}.run-step.skipped{opacity:.5}.run-step-tool{color:var(--green);font-weight:600}.run-step.skipped .run-step-tool{color:var(--yellow)}.run-step-label{color:var(--text)}.run-step-skip{color:var(--yellow);font-style:italic}.run-step-result{color:var(--text-dim);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.run-spinner{color:var(--yellow);font-size:.72rem;margin-top:.3rem}.composer{border-top:1px solid var(--border);padding-top:.5rem;display:flex;flex-direction:column;gap:.4rem}.composer .text-area{min-height:64px}.composer-extra{font-size:.7rem;color:var(--text-dim)}.composer-extra summary{cursor:pointer;padding:.2rem 0}.composer-extra .text-area{min-height:48px;margin-top:.3rem}.composer-actions{display:flex;justify-content:space-between;align-items:center}.flow-save{background:var(--green);color:var(--bg);border:none;border-radius:3px;cursor:pointer;font-family:var(--mono);font-size:.74rem;font-weight:600;padding:.35rem .9rem}.flow-save:disabled{opacity:.4;cursor:not-allowed}.session-workspace{display:flex;flex-direction:column;gap:.85rem}.session-hero{display:flex;justify-content:space-between;gap:1rem;align-items:flex-end;border:1px solid rgba(255,255,255,.08);background:linear-gradient(135deg,#58a6ff1f,#ff9d3d0a 42%,#ffffff05);padding:.95rem 1rem;border-radius:var(--radius-lg);box-shadow:var(--glow-soft)}.session-hero-meta{display:flex;gap:.55rem;flex-wrap:wrap;font-size:.68rem;color:var(--text-dim);margin-top:.35rem}.session-hero-kpis{display:grid;grid-template-columns:repeat(3,minmax(120px,1fr));gap:.55rem;min-width:420px}.session-kpi,.session-mini-kpi,.home-op-tile{border:1px solid rgba(255,255,255,.08);background:linear-gradient(180deg,#ffffff0a,#ffffff04);padding:.55rem .6rem;display:flex;flex-direction:column;gap:.25rem;border-radius:var(--radius-md)}.session-kpi strong,.session-mini-kpi strong,.home-op-value{font-size:.82rem;color:var(--text-bright)}.session-grid-4{display:grid;grid-template-columns:.9fr 1.3fr 1fr 1fr;gap:.75rem;align-items:start}.session-column{display:flex;flex-direction:column;gap:.7rem;min-height:640px}.session-thread-column{min-width:0}.session-thread{display:flex;flex-direction:column;gap:.75rem;min-height:360px;max-height:640px;overflow-y:auto}.session-state-stack,.session-timeline,.session-notes-list,.session-plan-list{display:flex;flex-direction:column;gap:.45rem}.session-state-row,.policy-row,.session-plan-item{display:flex;justify-content:space-between;gap:.75rem;padding:.5rem .55rem;background:linear-gradient(180deg,#ffffff08,#ffffff03);border:1px solid rgba(255,255,255,.08);border-radius:10px}.session-state-row span,.policy-row span{color:var(--text-dim);text-transform:uppercase;font-size:.64rem;letter-spacing:.8px}.session-state-row strong,.policy-row strong{font-size:.76rem;color:var(--text-bright);text-align:right}.session-chip-row{display:flex;gap:.35rem;flex-wrap:wrap}.session-chip{border:1px solid var(--border);background:var(--bg);color:var(--text-dim);padding:.18rem .4rem;font-size:.66rem;text-transform:uppercase;letter-spacing:.6px}.session-state-block{display:flex;flex-direction:column;gap:.35rem}.session-copy{font-size:.76rem;line-height:1.55;color:var(--text)}.session-note-item{background:#ffffff05;border:1px solid rgba(255,255,255,.08);padding:.45rem .5rem;font-size:.74rem;line-height:1.45;color:var(--text)}.session-kpi-grid{display:grid;grid-template-columns:1fr 1fr;gap:.5rem}.session-plan-box,.policy-box,.session-search-box{border:1px solid rgba(255,255,255,.08);background:linear-gradient(180deg,#ffffff06,#0000000f);padding:.55rem .6rem;border-radius:var(--radius-md)}.session-search-results{display:flex;flex-direction:column;gap:.4rem;margin-top:.45rem}.session-plan-head{display:flex;justify-content:space-between;gap:.5rem;margin-bottom:.35rem;font-size:.74rem;color:var(--text-bright)}.mode-control-grid{display:grid;grid-template-columns:1fr 1fr;gap:.45rem}.mode-card-btn{display:flex;flex-direction:column;gap:.2rem;align-items:flex-start;text-align:left;border:1px solid rgba(255,255,255,.08);background:linear-gradient(180deg,#ffffff0a,#ffffff04);color:var(--text);padding:.55rem .6rem;cursor:pointer;font-family:var(--mono);font-size:.72rem;border-radius:12px;box-shadow:var(--glow-soft)}.mode-card-btn strong{color:var(--text-bright);font-size:.75rem}.mode-card-btn span{color:var(--text-dim);font-size:.66rem}.mode-card-btn:hover{border-color:var(--border-hover)}.mode-card-btn.active{border-color:var(--green);box-shadow:inset 0 0 0 1px #3fb95026}.mode-card-btn:disabled{opacity:.45;cursor:not-allowed}.session-action-grid{display:flex;gap:.45rem;flex-wrap:wrap}.session-plan-item{justify-content:flex-start;align-items:flex-start}.session-plan-item>span{min-width:22px;height:22px;border:1px solid var(--border);display:inline-flex;align-items:center;justify-content:center;color:var(--green);font-size:.7rem;background:var(--surface)}.home-ops-strip{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:.6rem}.home-mode-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:.75rem}.home-mode-card{display:flex;flex-direction:column;gap:.45rem;min-height:150px}.home-mode-card.active{border-color:var(--green);box-shadow:inset 0 0 0 1px #3fb95026}.home-mode-head{display:flex;justify-content:space-between;gap:.5rem;align-items:flex-start}.home-mode-name{font-size:.8rem;color:var(--text-bright)}.home-mode-pipeline{font-size:.66rem;color:var(--text-dim)}.home-mode-copy{font-size:.72rem;color:var(--text);line-height:1.5;flex:1}.home-mode-meta{display:flex;gap:.45rem;flex-wrap:wrap;font-size:.64rem;color:var(--text-dim);text-transform:uppercase;letter-spacing:.6px}.flow-editor{display:flex;flex-direction:column;gap:.5rem}.flow-toolbar{display:flex;align-items:center;gap:.5rem;flex-wrap:wrap}.flow-palette{display:flex;gap:3px;flex-wrap:wrap;flex:1}.flow-chip,.flow-pill-name{background:var(--bg);border:1px solid var(--border);color:var(--text);cursor:pointer;font-family:var(--mono);font-size:.68rem;padding:2px 6px;border-radius:3px}.flow-chip:hover{border-color:var(--green);color:var(--green)}.flow-hint{font-size:.72rem;color:var(--yellow)}.linkish,.flow-mini.link{background:transparent;border:none;color:var(--accent);cursor:pointer;font-family:var(--mono);font-size:.68rem;padding:0;text-decoration:underline}.flow-canvas{position:relative;min-height:340px;border:1px solid var(--border);border-radius:4px;background:var(--bg) repeating-linear-gradient(0deg,transparent,transparent 23px,var(--border) 24px),var(--bg) repeating-linear-gradient(90deg,transparent,transparent 23px,var(--border) 24px);background-blend-mode:normal;overflow:hidden;touch-action:none}.flow-edges{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none}.flow-empty{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);color:var(--text-dim);font-size:.75rem}.flow-node{position:absolute;background:var(--surface);border:1px solid var(--border-hover);border-radius:4px;font-size:.7rem;-webkit-user-select:none;user-select:none;box-shadow:0 1px 4px #0006}.flow-node.linking{border-color:var(--accent)}.flow-node-head{display:flex;justify-content:space-between;align-items:center;padding:3px 6px;border-bottom:1px solid var(--border);cursor:grab;background:var(--bg)}.flow-node-tool{color:var(--green);font-weight:600}.flow-node.tool-condition .flow-node-tool{color:var(--accent)}.flow-node.tool-direct .flow-node-tool{color:var(--text-dim)}.flow-node-x{background:transparent;border:none;color:var(--text-dim);cursor:pointer;font-size:.8rem;line-height:1}.flow-node-x:hover{color:var(--red)}.flow-node-body{display:flex;flex-direction:column;gap:3px;padding:4px 6px}.flow-mini{width:100%}.flow-preview{display:flex;gap:.5rem;align-items:baseline;font-size:.75rem}.flow-preview code{color:var(--green)}.flow-list-bar{display:flex;align-items:center;gap:.4rem;flex-wrap:wrap}.flow-pill{display:inline-flex;align-items:center;border:1px solid var(--border);border-radius:3px;overflow:hidden}.flow-pill.active{border-color:var(--green)}.flow-pill-name{border:none;border-radius:0}.flow-pill-x{background:transparent;border:none;color:var(--text-dim);cursor:pointer;padding:2px 5px}.flow-pill-x:hover{color:var(--red)}.mono{font-family:var(--mono)}.home-view{display:flex;flex-direction:column;gap:.9rem}.home-hero{display:flex;justify-content:space-between;gap:1rem;align-items:flex-end;border:1px solid rgba(255,255,255,.08);background:linear-gradient(135deg,#58a6ff24,#ff9d3d0d 42%,#ffffff05);padding:.95rem 1rem;border-radius:var(--radius-lg);box-shadow:var(--glow-soft)}.home-kicker{font-size:.64rem;text-transform:uppercase;letter-spacing:1px;color:var(--text-dim);margin-bottom:.25rem}.home-hero h2{font-size:1.2rem;color:var(--text-bright);margin-bottom:.2rem}.home-hero p{font-size:.76rem;color:var(--text-dim);max-width:64ch;line-height:1.5}.home-hero-actions{display:flex;gap:.45rem;align-items:center;flex-wrap:wrap}.shell-link{background:transparent;border:1px solid var(--border);color:var(--text);cursor:pointer;font-family:var(--mono);font-size:.72rem;padding:.35rem .7rem;border-radius:3px}.shell-link:hover{border-color:var(--green);color:var(--green)}.home-overview-grid,.home-detail-grid{display:grid;gap:.75rem}.home-overview-grid{grid-template-columns:1.1fr 1fr}.home-detail-grid{grid-template-columns:1.15fr .9fr;align-items:start}.home-summary-table{display:grid;grid-template-columns:1fr 1fr;gap:.35rem .9rem}.home-summary-row{display:flex;justify-content:space-between;gap:.5rem;padding:.3rem 0;border-bottom:1px solid var(--border)}.home-summary-label{color:var(--text-dim);font-size:.72rem;text-transform:uppercase;letter-spacing:.7px}.home-summary-value{color:var(--text-bright);font-size:.78rem}.home-recommendation{font-size:.84rem;line-height:1.55;color:var(--text-bright);margin-bottom:.85rem}.home-inline-grid{display:grid;grid-template-columns:1fr 1fr;gap:.65rem}.home-inline-value{font-size:.75rem;color:var(--text);line-height:1.4}.home-current-session,.home-sessions-card{grid-column:1}.home-todos-card,.home-savings-card{grid-column:2}.home-session-head{display:flex;justify-content:space-between;gap:.5rem;align-items:center;margin-bottom:.45rem}.home-session-title{font-size:.9rem;color:var(--text-bright)}.home-metric-strip{display:flex;gap:.6rem;flex-wrap:wrap;font-size:.68rem;color:var(--text-dim);margin:.4rem 0 .55rem}.home-tag-row{display:flex;gap:.35rem;flex-wrap:wrap;margin-top:.55rem}.home-tag{border:1px solid var(--border);padding:.15rem .35rem;font-size:.66rem;color:var(--text-dim);text-transform:uppercase;letter-spacing:.6px}.home-todo-list,.home-session-list{display:flex;flex-direction:column;gap:.45rem}.home-todo-item,.home-session-item{display:flex;justify-content:space-between;gap:.55rem;padding:.5rem .55rem;background:linear-gradient(180deg,#ffffff08,#ffffff03);border:1px solid rgba(255,255,255,.08);border-radius:11px}.home-todo-status{color:var(--yellow);font-size:.65rem;min-width:54px}.home-totals{display:flex;justify-content:space-between;font-size:.7rem;color:var(--text-dim);margin-top:.55rem}.home-money{font-size:1.45rem;color:var(--text-bright);font-weight:700}.home-money-sub{font-size:.72rem;color:var(--text-dim);margin-top:.2rem}.home-session-item.current{border-left:2px solid var(--green)}.home-session-item-title{font-size:.78rem;color:var(--text-bright);margin-bottom:.15rem}.home-session-item-meta{display:flex;flex-direction:column;gap:.2rem;font-size:.66rem;color:var(--text-dim);text-align:right}@media(max-width:760px){.shell{flex-direction:column}.sidebar{width:100%;border-right:none;border-bottom:1px solid var(--border)}.home-overview-grid,.home-detail-grid,.home-inline-grid,.home-summary-table{grid-template-columns:1fr}.home-current-session,.home-sessions-card,.home-todos-card,.home-savings-card{grid-column:auto}.home-hero{flex-direction:column;align-items:flex-start}}@media(max-width:1280px){.session-grid-4{grid-template-columns:1fr 1fr}.session-column{min-height:auto}.home-mode-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.home-ops-strip{grid-template-columns:repeat(3,minmax(0,1fr))}}@media(max-width:920px){.session-hero{flex-direction:column;align-items:flex-start}.session-hero-kpis{min-width:0;width:100%;grid-template-columns:1fr}.session-grid-4,.home-mode-grid,.home-ops-strip,.mode-control-grid,.session-kpi-grid{grid-template-columns:1fr}}.home-controls-strip{display:flex;gap:1.5rem;align-items:center;padding:.6rem .85rem;background:var(--surface);border:1px solid var(--border);margin-bottom:.75rem;flex-wrap:wrap}.home-controls-strip{background:linear-gradient(180deg,#ffffff08,#ffffff03);border:1px solid rgba(255,255,255,.08);border-radius:var(--radius-lg);box-shadow:var(--glow-soft)}.qc-group{display:flex;align-items:center;gap:.4rem}.qc-slot{font-family:var(--mono);font-size:.72rem;padding:2px 8px;border:1px solid var(--border);background:transparent;color:var(--text-dim);cursor:pointer}.qc-slot.active{color:var(--green);border-color:var(--green)}.qc-slot:hover{border-color:var(--border-hover);color:var(--text)}.qc-model{font-family:var(--mono);font-size:.72rem;color:var(--text)}.qc-pill{font-family:var(--mono);font-size:.68rem;padding:1px 6px;font-weight:600;text-transform:uppercase}.qc-pill.on{color:var(--green)}.qc-pill.off{color:var(--text-dim)}.create-form{display:flex;gap:4px;align-items:center;padding:4px 8px}.create-input{flex:1;font-family:var(--mono);font-size:.72rem;background:var(--bg);border:1px solid var(--accent);color:var(--text);padding:2px 4px;outline:none}.create-ok{font-family:var(--mono);font-size:.68rem;color:var(--green);background:transparent;border:1px solid var(--green);padding:1px 5px;cursor:pointer}.create-ok:disabled{opacity:.4;cursor:default}.create-cancel{background:transparent;border:none;color:var(--text-dim);cursor:pointer;font-size:.85rem;line-height:1}.sidebar-delete{background:transparent;border:none;color:var(--text-dim);cursor:pointer;font-size:.7rem;padding:0 3px;line-height:1;opacity:.4}.sidebar-delete:hover{color:var(--red);opacity:1}.sidebar-session-row{display:flex;align-items:center}.sidebar-session-row .sidebar-item{flex:1}.thread{display:flex;flex-direction:column;gap:.75rem}.msg.user{align-self:flex-end;background:var(--accent-dim);border:1px solid rgba(88,166,255,.15);margin-left:20%}.msg.assistant{align-self:flex-start;background:var(--surface);border:1px solid var(--border);margin-right:20%}.run-trace-details{margin-top:.4rem}.run-trace-details summary{font-size:.68rem;color:var(--text-dim);cursor:pointer;padding:.2rem 0;list-style:none;-webkit-user-select:none;user-select:none}.run-trace-details summary::-webkit-details-marker{display:none}.run-trace-details summary:before{content:"+ "}.run-trace-details[open] summary:before{content:"- "}@keyframes vibe-pulse{0%,to{opacity:1}50%{opacity:.3}}.run-spinner{font-size:.75rem;color:var(--accent);font-family:var(--mono);animation:vibe-pulse 1.2s infinite}.shell.shell-4col{display:flex;min-height:100vh;max-width:1600px;margin:0 auto}.workspace{flex:1;min-width:0;padding:1rem 1.1rem 1rem .9rem;display:flex;flex-direction:column;gap:.75rem}.workspace-header{margin-bottom:0}.workspace-grid{display:grid;grid-template-columns:1.05fr 1fr 1.35fr 1.1fr;gap:1rem;align-items:start}.workspace-column{min-width:0;border:1px solid rgba(255,255,255,.06);background:linear-gradient(180deg,#ffffff09,#ffffff03);padding:.2rem;border-radius:16px;box-shadow:var(--glow-soft)}.panel{padding:.8rem .85rem}.panel-head{display:flex;justify-content:space-between;gap:.75rem;align-items:flex-start;margin-bottom:.65rem}.panel-head h3{margin-bottom:.05rem;font-family:var(--sans);font-size:.98rem;font-weight:700}.panel-head-copy{color:var(--text-dim);font-size:.7rem;line-height:1.45}.panel-action{white-space:nowrap;padding:.25rem .55rem}.sidebar-home-card{border:1px solid rgba(88,166,255,.16);background:linear-gradient(180deg,#ffffff0d,#58a6ff17);padding:.6rem .65rem;margin:.45rem 0 .55rem;border-radius:var(--radius-md)}.sidebar-home-title{color:var(--text-bright);font-family:var(--sans);font-size:.92rem;line-height:1.35;margin-bottom:.2rem}.sidebar-home-copy{color:var(--text-dim);font-size:.72rem;line-height:1.45;margin-bottom:.45rem}.sidebar-home-metrics{display:flex;flex-wrap:wrap;gap:.4rem;margin-top:.35rem;font-size:.64rem;color:var(--text-dim);text-transform:uppercase;letter-spacing:.55px}.sidebar-home-metrics span{border:1px solid var(--border);padding:.14rem .35rem;background:#ffffff03}.sidebar-project-icon{width:24px;height:24px;display:inline-flex;align-items:center;justify-content:center;border:1px solid rgba(255,255,255,.07);border-radius:7px;color:var(--project-icon-fg,var(--text-bright));background:linear-gradient(180deg,#ffffff0d,#ffffff05);margin-right:.35rem;flex-shrink:0;font-size:.72rem;font-weight:700}.sidebar-project-row{display:flex;align-items:center;gap:.15rem}.sidebar-project-row .sidebar-item{flex:1}.project-sessions-panel{min-height:100%}.project-sessions-panel,.control-rail,.session-workspace{background:transparent;border:none;padding:.7rem .75rem}.project-session-list{display:flex;flex-direction:column;gap:.4rem}.project-session-link{display:flex;justify-content:space-between;align-items:center;gap:.85rem;width:100%;border:1px solid rgba(255,255,255,.08);background:linear-gradient(180deg,#ffffff08,#ffffff03);color:var(--text);padding:.65rem .7rem;cursor:pointer;font-family:var(--sans);font-size:.78rem;text-align:left;border-radius:12px}.project-session-link:hover{border-color:var(--border-hover)}.project-session-link.active{border-color:var(--green);box-shadow:inset 0 0 0 1px #3fb95026}.project-session-link.current{background:#3fb9500a}.project-session-link-title{color:var(--text-bright);line-height:1.35}.project-session-link-meta{color:var(--text-dim);font-size:.64rem;text-transform:uppercase;letter-spacing:.6px;white-space:nowrap}.control-rail{min-height:100%}.control-mode-summary{display:grid;grid-template-columns:1fr 1fr;gap:.5rem;margin-bottom:.55rem}.control-status-grid{display:grid;grid-template-columns:1fr 1fr;gap:.5rem;margin-bottom:.75rem}.control-status{border:1px solid rgba(255,255,255,.08);background:linear-gradient(180deg,#ffffff0a,#ffffff04);padding:.5rem .55rem;border-radius:12px}.control-status strong{display:block;color:var(--text-bright);font-size:.8rem;line-height:1.35}.control-flow-header,.control-kpi-strip{display:grid;grid-template-columns:1fr auto;gap:.4rem .6rem;align-items:center;margin-bottom:.45rem}.control-kpi-strip{grid-template-columns:repeat(2,minmax(0,1fr))}.control-kpi-strip>div{border:1px solid rgba(255,255,255,.08);background:linear-gradient(180deg,#ffffff0a,#ffffff04);padding:.48rem .5rem;border-radius:12px}.control-kpi-strip strong{display:block;color:var(--text-bright);font-size:.76rem}.control-flow-list{display:flex;flex-direction:column;gap:.35rem}.control-flow-step{display:flex;gap:.5rem;align-items:flex-start;border:1px solid rgba(255,255,255,.08);background:linear-gradient(180deg,#ffffff0a,#ffffff04);padding:.48rem .5rem;border-radius:12px}.control-flow-step>span{min-width:20px;height:20px;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--border);color:var(--green);font-size:.68rem;background:var(--surface)}.control-flow-step strong{color:var(--text-bright);font-size:.74rem}.control-flow-step .muted{font-size:.66rem;margin-top:.05rem}.session-hero-compact{padding:.65rem .75rem}.session-title{font-family:var(--sans);font-size:1.05rem;font-weight:700;color:var(--text-bright)}.session-mini-grid{display:grid;grid-template-columns:1fr 1fr;gap:.55rem}.session-actions-row{display:flex;gap:.45rem;flex-wrap:wrap}.session-actions-row .shell-link{padding:.3rem .55rem}.column-badge-row{display:flex;align-items:center;gap:.45rem}@media(max-width:1280px){.workspace-grid{grid-template-columns:1fr 1fr}}@media(max-width:920px){.workspace-grid,.session-mini-grid,.control-status-grid,.control-kpi-strip{grid-template-columns:1fr}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}:root{--bg:#050505;--surface:#0c0c0c;--border:#1a1a1a;--border-hover:#2a2a2a;--text:#d4d4d4;--text-dim:#6a6a6a;--text-bright:#f0f0f0;--green:#3fb950;--red:#f85149;--yellow:#d29922;--accent:#58a6ff;--accent-dim:rgba(88,166,255,.08);--mono:"JetBrains Mono","Fira Code","Cascadia Code","SF Mono",Menlo,monospace;--sans:-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif}html{font-size:13px;background:var(--bg)}body{font-family:var(--mono);background:var(--bg);color:var(--text);min-height:100vh;-webkit-font-smoothing:antialiased}.app{max-width:1100px;margin:0 auto;padding:1.25rem 1.5rem}.header{display:flex;justify-content:space-between;align-items:center;padding-bottom:.5rem;margin-bottom:.75rem;border-bottom:1px solid var(--border)}.header-title{display:flex;align-items:baseline;gap:.5rem}.header-title h1{font-family:var(--mono);font-size:1.1rem;font-weight:600;color:var(--text-bright);text-transform:lowercase;letter-spacing:-.5px}.header-title h1:before{content:"~ ";color:var(--red)}.header-subtitle{font-size:.72rem;color:var(--text-dim);font-family:var(--mono);margin-top:.15rem}.version{font-size:.7rem;color:var(--text-dim);font-family:var(--mono)}.header-indicators{display:flex;gap:.5rem;align-items:center}.indicator{font-family:var(--mono);font-size:.65rem;padding:1px 6px;text-transform:uppercase;font-weight:600;letter-spacing:.5px}.indicator.connected{color:var(--green)}.indicator.disconnected{color:var(--yellow)}.indicator.disabled{color:var(--red)}.indicator:before{content:"● ";font-size:.5rem}.indicator.flash:before{content:"⚡ ";font-size:.7rem}.nav-tabs{display:flex;gap:0;margin-bottom:1rem;border-bottom:1px solid var(--border)}.tab{font-family:var(--mono);background:transparent;border:none;color:var(--text-dim);padding:.4rem .75rem;cursor:pointer;font-size:.78rem;border-bottom:2px solid transparent;margin-bottom:-1px;transition:color .15s,border-color .15s;text-transform:uppercase;letter-spacing:.5px}.tab:hover{color:var(--text);border-bottom-color:var(--border-hover)}.tab.active{color:var(--text-bright);border-bottom-color:var(--green);font-weight:600}.content{display:flex;flex-direction:column;gap:.75rem}.grid-2col{display:grid;grid-template-columns:1fr 1fr;gap:.75rem}.card,.card-full{background:var(--surface);border:1px solid var(--border);padding:.75rem .85rem}.card-full{grid-column:1/-1}.card h3,.card-full h3{font-family:var(--mono);font-size:.7rem;font-weight:600;margin-bottom:.65rem;text-transform:uppercase;color:var(--text-dim);letter-spacing:1px}.card h3:before,.card-full h3:before{content:"── ";color:var(--border-hover)}.kv-table{width:100%;border-collapse:collapse;font-family:var(--mono)}.kv-table td{padding:.25rem 0;font-size:.78rem}.kv-table td:first-child{color:var(--text-dim);width:38%;white-space:nowrap}.kv-table td:last-child{color:var(--text);overflow-wrap:anywhere}.badge{display:inline-block;font-family:var(--mono);font-size:.65rem;padding:1px 5px;font-weight:600;text-transform:uppercase;letter-spacing:.5px;line-height:1.4}.badge.slot{color:var(--green)}.badge.slot:before{content:"["}.badge.slot:after{content:"]"}.badge.on{color:var(--green)}.badge.on:before{content:"["}.badge.on:after{content:"]"}.badge.off{color:var(--red)}.badge.off:before{content:"["}.badge.off:after{content:"]"}code{font-family:var(--mono);font-size:.75rem;color:var(--text-bright)}pre{font-family:var(--mono);font-size:.72rem}.credit-bar{display:inline-block;width:55px;height:6px;background:var(--border);overflow:hidden;vertical-align:middle;border:1px solid var(--border-hover)}.credit-fill{height:100%;background:var(--green);transition:width .4s ease}.credit-label{margin-left:.4rem;font-size:.7rem;font-family:var(--mono);color:var(--text-dim)}.trend{font-size:.85rem;font-family:var(--mono)}.trend-up{color:var(--green)}.trend-down{color:var(--red)}.trend-flat{color:var(--text-dim)}.bar-chart{display:flex;flex-direction:column;gap:.3rem;margin-top:.5rem}.bar-row{display:flex;align-items:center;gap:.5rem}.bar-label{width:75px;font-size:.7rem;color:var(--text-dim);text-align:right;font-family:var(--mono)}.bar-track{flex:1;height:5px;background:var(--border);overflow:hidden}.bar-fill{height:100%;background:var(--accent);transition:width .4s ease}.bar-value{width:55px;font-size:.7rem;text-align:right;font-family:var(--mono);color:var(--text-dim)}.data-table{width:100%;border-collapse:collapse;font-size:.72rem;font-family:var(--mono)}.data-table th,.data-table td{padding:.3rem .4rem;text-align:left}.data-table th{color:var(--text-dim);font-weight:600;text-transform:uppercase;letter-spacing:.5px;font-size:.65rem;border-bottom:1px solid var(--border)}.data-table td{border-bottom:1px solid var(--border);color:var(--text)}.data-table tr:hover td{background:var(--accent-dim)}.data-table td:first-child{color:var(--text-bright)}.stress-bars{display:flex;gap:2px;align-items:flex-end;min-height:28px;padding:.3rem 0}.stress-bar{font-size:1.4rem;line-height:1;font-family:var(--mono)}.muted{color:var(--text-dim);font-size:.78rem;font-family:var(--mono)}.error{color:var(--red);font-size:.75rem;font-family:var(--mono)}.sep{color:var(--text-dim);margin:.5rem 0;font-family:var(--mono);font-size:.65rem;letter-spacing:2px}.control-group{margin-bottom:.65rem}.control-group h4{font-family:var(--mono);font-size:.65rem;color:var(--text-dim);margin-bottom:.3rem;text-transform:uppercase;letter-spacing:1px;border-bottom:1px solid var(--border);padding-bottom:.15rem}.bracket-row{display:flex;gap:.6rem;flex-wrap:wrap}.bracket-btn{font-family:var(--mono);font-size:.75rem;background:transparent;border:none;color:var(--text-dim);cursor:pointer;padding:.15rem 0;transition:color .15s;letter-spacing:.3px}.bracket-btn:before{content:"["}.bracket-btn:after{content:"]"}.bracket-btn:hover{color:var(--text)}.bracket-btn.on{color:var(--green);font-weight:600}.bracket-btn.off{color:var(--red)}.bracket-btn:disabled{opacity:.3;cursor:default}.result-box{margin-top:.6rem;padding:.5rem .6rem;border:1px solid var(--border);border-left:2px solid var(--accent);font-family:var(--mono);font-size:.7rem;color:var(--text-dim);display:flex;justify-content:space-between;align-items:center}.result-box code{font-size:.7rem;color:var(--text-dim);max-width:90%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dismiss-btn{background:none;border:none;color:var(--text-dim);cursor:pointer;font-size:.85rem;padding:0 .2rem;font-family:var(--mono)}.dismiss-btn:hover{color:var(--text)}.reports-layout{display:grid;grid-template-columns:1fr 2fr;gap:.75rem;min-height:280px}.report-list{display:flex;flex-direction:column;gap:0}.report-item{padding:.4rem .5rem;cursor:pointer;border-left:2px solid transparent;transition:border-color .15s,background .15s}.report-item:hover{border-color:var(--border-hover)}.report-item.active{border-color:var(--green);background:var(--accent-dim)}.report-summary{font-family:var(--mono);font-size:.78rem;color:var(--text);margin-bottom:.2rem}.report-meta{display:flex;gap:.5rem;font-size:.65rem;color:var(--text-dim);font-family:var(--mono)}.report-type{text-transform:uppercase;letter-spacing:.5px}.report-viewer{background:var(--bg);border:1px solid var(--border);padding:.6rem .7rem;overflow:auto;min-height:200px}.report-content{font-family:var(--mono);font-size:.72rem;color:var(--text);white-space:pre-wrap;word-break:break-all}.search-hero{display:flex;justify-content:space-between;gap:.75rem;align-items:flex-start;border:1px solid var(--border);background:linear-gradient(180deg,#58a6ff14,#ffffff03);padding:.7rem .8rem;margin-bottom:.75rem}.search-hero-kicker{font-family:var(--mono);font-size:.62rem;text-transform:uppercase;color:var(--text-dim);letter-spacing:1px;margin-bottom:.2rem}.search-hero-title{font-family:var(--mono);font-size:.92rem;font-weight:700;color:var(--text-bright);margin-bottom:.25rem}.search-hero-copy{font-family:var(--mono);font-size:.72rem;line-height:1.45;color:var(--text-dim);max-width:62ch}.search-hero-meta{display:flex;gap:.35rem;flex-wrap:wrap;justify-content:flex-end}.search-stats{display:flex;gap:.35rem;flex-wrap:wrap;margin-top:.45rem}.search-answer-text{font-family:var(--mono);font-size:.72rem;line-height:1.5;color:var(--text);white-space:pre-wrap;word-break:break-word;margin:0}.search-output{display:grid;grid-template-columns:1.1fr 1.2fr;gap:.75rem;margin-top:.75rem}.search-answer,.search-results,.search-citations{background:var(--bg);border:1px solid var(--border);padding:.55rem .6rem}.search-answer h4,.search-results h4,.search-citations h4{font-family:var(--mono);font-size:.65rem;color:var(--text-dim);margin-bottom:.35rem;text-transform:uppercase;letter-spacing:1px}.search-list{display:flex;flex-direction:column;gap:.4rem}.search-item{display:block;color:inherit;text-decoration:none;border:1px solid var(--border);padding:.45rem .5rem;background:#ffffff03}.search-item:hover{border-color:var(--accent);background:var(--accent-dim)}.search-item-title{font-family:var(--mono);font-size:.74rem;color:var(--text-bright);margin-bottom:.1rem;display:flex;gap:.35rem;align-items:flex-start}.search-rank{color:var(--accent);font-weight:700}.search-item-meta,.search-item-snippet{font-family:var(--mono);font-size:.68rem;color:var(--text-dim)}.search-item-snippet{margin-top:.2rem;line-height:1.4}.citation-row{display:flex;gap:.35rem;flex-wrap:wrap;margin-bottom:.35rem}.citation-pill{display:inline-block;text-decoration:none;padding:.2rem .4rem;border:1px solid var(--border);color:var(--text);font-family:var(--mono);font-size:.65rem}.citation-pill:hover{border-color:var(--accent);color:var(--text-bright)}.blackbox-status{font-family:var(--mono);margin-top:.8rem}.blackbox-status td{font-size:.75rem}.field-label{display:block;margin:.35rem 0 .2rem;color:var(--text-dim);font-size:.65rem;text-transform:uppercase;letter-spacing:1px;font-family:var(--mono)}.text-input,.text-area{width:100%;background:var(--bg);color:var(--text-bright);border:1px solid var(--border);font-family:var(--mono);font-size:.75rem;padding:.45rem .5rem;margin-bottom:.35rem;outline:none}.text-input:focus,.text-area:focus{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent-dim)}.text-area{resize:vertical;min-height:72px}@media(max-width:900px){.grid-2col,.reports-layout,.search-output{grid-template-columns:1fr}.header{flex-direction:column;align-items:flex-start;gap:.5rem}.search-hero{flex-direction:column}.search-hero-meta{justify-content:flex-start}}.section-divider{border:none;border-top:1px solid var(--border);margin:.4rem 0;opacity:.6}.status-dot{color:var(--green);font-family:var(--mono)}.status-dot.off{color:var(--red)}.shell{display:flex;min-height:100vh;max-width:1400px;margin:0 auto}.shell .main{flex:1;min-width:0;padding:1rem 1.25rem;display:flex;flex-direction:column}.shell .main .header{margin-bottom:.5rem}.sidebar{width:230px;flex-shrink:0;border-right:1px solid var(--border);background:var(--surface);padding:.75rem .5rem;display:flex;flex-direction:column;gap:2px;font-size:.78rem}.sidebar-brand{display:flex;align-items:center;gap:.6rem;padding:.25rem .4rem .8rem;border-bottom:1px solid var(--border);margin-bottom:.4rem}.sidebar-brand-mark{color:var(--red);font-size:1.05rem;font-weight:700}.sidebar-brand-title{font-size:.84rem;color:var(--text-bright);text-transform:lowercase}.sidebar-brand-subtitle{font-size:.64rem;color:var(--text-dim);text-transform:uppercase;letter-spacing:.8px}.sidebar-section-label{color:var(--text-dim);text-transform:uppercase;letter-spacing:.5px;font-size:.6rem;padding:.35rem .4rem .2rem}.sidebar-section-head{display:flex;align-items:center;justify-content:space-between;margin-top:.4rem}.sidebar-item{display:block;width:100%;text-align:left;background:transparent;border:none;cursor:pointer;color:var(--text);font-family:var(--mono);font-size:.78rem;padding:.3rem .45rem;border-radius:3px}.sidebar-item:hover{background:var(--bg)}.sidebar-item.active{background:var(--accent-dim);color:var(--text-bright);border-left:2px solid var(--green)}.sidebar-item.pinned{font-weight:600}.sidebar-item.session{font-size:.74rem;color:var(--text-dim)}.sidebar-item.session.active{color:var(--text-bright)}.sidebar-icon{color:var(--green);margin-right:2px}.sidebar-caret{color:var(--text-dim);display:inline-block;width:.8rem}.sidebar-project-row{display:flex;align-items:center}.sidebar-project-icon{width:24px;height:24px;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--border);border-radius:4px;color:var(--text-bright);font-size:.7rem;background:var(--bg);margin-right:.3rem;flex-shrink:0}.sidebar-sessions{margin-left:.85rem;border-left:1px solid var(--border);padding-left:.2rem}.sidebar-add{background:transparent;border:1px solid var(--border);color:var(--text-dim);cursor:pointer;border-radius:3px;width:18px;height:18px;line-height:1;font-size:.85rem;flex-shrink:0}.sidebar-add:hover{color:var(--green);border-color:var(--border-hover)}.sidebar-empty{color:var(--text-dim);font-size:.68rem;padding:.2rem .5rem;font-style:italic}.sidebar-empty.sub{padding-left:.6rem}.sidebar-context-card{border:1px solid var(--border);background:var(--bg);padding:.45rem .5rem;margin:.5rem 0 .35rem;display:flex;flex-direction:column;gap:.2rem}.sidebar-context-main{font-size:.74rem;color:var(--text-bright);line-height:1.4;word-break:break-word}.sidebar-inline-link{background:transparent;border:none;color:var(--accent);cursor:pointer;text-align:left;font-family:var(--mono);font-size:.69rem;padding:0}.sidebar-inline-link:hover{text-decoration:underline}.session-pane,.project-view{display:flex;flex-direction:column;gap:.6rem;height:100%}.session-head,.project-head{display:flex;justify-content:space-between;align-items:flex-end;border-bottom:1px solid var(--border);padding-bottom:.5rem}.session-title{font-size:1rem;color:var(--text-bright);font-family:var(--mono)}.session-flow{display:flex;flex-direction:column;gap:2px;align-items:flex-end}.session-flow select,.flow-mini,.project-head select{background:var(--bg);border:1px solid var(--border);color:var(--text);font-family:var(--mono);font-size:.72rem;padding:2px 4px;border-radius:3px}.session-body{display:flex;flex-direction:column;gap:.5rem;flex:1;min-height:0}.thread{display:flex;flex-direction:column;gap:.5rem;overflow-y:auto;flex:1;padding-right:.25rem}.msg{border:1px solid var(--border);border-radius:4px;padding:.5rem .6rem;background:var(--surface)}.msg.user{border-left:2px solid var(--accent)}.msg.assistant{border-left:2px solid var(--green)}.msg.live{border-left-color:var(--yellow)}.msg-role{font-size:.6rem;text-transform:uppercase;letter-spacing:.5px;color:var(--text-dim);margin-bottom:.25rem}.msg-content{color:var(--text);white-space:pre-wrap;font-size:.8rem}.msg-content.mono{font-family:var(--mono);color:var(--text-dim);font-size:.72rem}.run-trace{display:flex;flex-direction:column;gap:2px;margin-top:.4rem}.run-step{display:flex;gap:.4rem;align-items:baseline;font-size:.72rem;padding:2px 4px;border-radius:3px;background:var(--bg)}.run-step.skipped{opacity:.5}.run-step-tool{color:var(--green);font-weight:600}.run-step.skipped .run-step-tool{color:var(--yellow)}.run-step-label{color:var(--text)}.run-step-skip{color:var(--yellow);font-style:italic}.run-step-result{color:var(--text-dim);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.run-spinner{color:var(--yellow);font-size:.72rem;margin-top:.3rem}.composer{border-top:1px solid var(--border);padding-top:.5rem;display:flex;flex-direction:column;gap:.4rem}.composer .text-area{min-height:64px}.composer-extra{font-size:.7rem;color:var(--text-dim)}.composer-extra summary{cursor:pointer;padding:.2rem 0}.composer-extra .text-area{min-height:48px;margin-top:.3rem}.composer-actions{display:flex;justify-content:space-between;align-items:center}.flow-save{background:var(--green);color:var(--bg);border:none;border-radius:3px;cursor:pointer;font-family:var(--mono);font-size:.74rem;font-weight:600;padding:.35rem .9rem}.flow-save:disabled{opacity:.4;cursor:not-allowed}.session-workspace{display:flex;flex-direction:column;gap:.85rem}.session-hero{display:flex;justify-content:space-between;gap:1rem;align-items:flex-end;border:1px solid var(--border);background:linear-gradient(180deg,#ffffff05,#58a6ff14);padding:.95rem 1rem}.session-hero-meta{display:flex;gap:.55rem;flex-wrap:wrap;font-size:.68rem;color:var(--text-dim);margin-top:.35rem}.session-hero-kpis{display:grid;grid-template-columns:repeat(3,minmax(120px,1fr));gap:.55rem;min-width:420px}.session-kpi,.session-mini-kpi,.home-op-tile{border:1px solid var(--border);background:var(--bg);padding:.55rem .6rem;display:flex;flex-direction:column;gap:.25rem}.session-kpi strong,.session-mini-kpi strong,.home-op-value{font-size:.82rem;color:var(--text-bright)}.session-grid-4{display:grid;grid-template-columns:.9fr 1.3fr 1fr 1fr;gap:.75rem;align-items:start}.session-column{display:flex;flex-direction:column;gap:.7rem;min-height:640px}.session-thread-column{min-width:0}.session-thread{display:flex;flex-direction:column;gap:.75rem;min-height:360px;max-height:640px;overflow-y:auto}.session-state-stack,.session-timeline,.session-notes-list,.session-plan-list{display:flex;flex-direction:column;gap:.45rem}.session-state-row,.policy-row,.session-plan-item{display:flex;justify-content:space-between;gap:.75rem;padding:.45rem .5rem;background:var(--bg);border:1px solid var(--border)}.session-state-row span,.policy-row span{color:var(--text-dim);text-transform:uppercase;font-size:.64rem;letter-spacing:.8px}.session-state-row strong,.policy-row strong{font-size:.76rem;color:var(--text-bright);text-align:right}.session-chip-row{display:flex;gap:.35rem;flex-wrap:wrap}.session-chip{border:1px solid var(--border);background:var(--bg);color:var(--text-dim);padding:.18rem .4rem;font-size:.66rem;text-transform:uppercase;letter-spacing:.6px}.session-state-block{display:flex;flex-direction:column;gap:.35rem}.session-copy{font-size:.76rem;line-height:1.55;color:var(--text)}.session-note-item{background:var(--bg);border:1px solid var(--border);padding:.45rem .5rem;font-size:.74rem;line-height:1.45;color:var(--text)}.session-kpi-grid{display:grid;grid-template-columns:1fr 1fr;gap:.5rem}.session-plan-box,.policy-box,.session-search-box{border:1px solid var(--border);background:var(--bg);padding:.55rem .6rem}.session-search-results{display:flex;flex-direction:column;gap:.4rem;margin-top:.45rem}.session-plan-head{display:flex;justify-content:space-between;gap:.5rem;margin-bottom:.35rem;font-size:.74rem;color:var(--text-bright)}.mode-control-grid{display:grid;grid-template-columns:1fr 1fr;gap:.45rem}.mode-card-btn{display:flex;flex-direction:column;gap:.2rem;align-items:flex-start;text-align:left;border:1px solid var(--border);background:var(--bg);color:var(--text);padding:.55rem .6rem;cursor:pointer;font-family:var(--mono);font-size:.72rem}.mode-card-btn strong{color:var(--text-bright);font-size:.75rem}.mode-card-btn span{color:var(--text-dim);font-size:.66rem}.mode-card-btn:hover{border-color:var(--border-hover)}.mode-card-btn.active{border-color:var(--green);box-shadow:inset 0 0 0 1px #3fb95026}.mode-card-btn:disabled{opacity:.45;cursor:not-allowed}.session-action-grid{display:flex;gap:.45rem;flex-wrap:wrap}.session-plan-item{justify-content:flex-start;align-items:flex-start}.session-plan-item>span{min-width:22px;height:22px;border:1px solid var(--border);display:inline-flex;align-items:center;justify-content:center;color:var(--green);font-size:.7rem;background:var(--surface)}.home-ops-strip{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:.6rem}.home-mode-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:.75rem}.home-mode-card{display:flex;flex-direction:column;gap:.45rem;min-height:150px}.home-mode-card.active{border-color:var(--green);box-shadow:inset 0 0 0 1px #3fb95026}.home-mode-head{display:flex;justify-content:space-between;gap:.5rem;align-items:flex-start}.home-mode-name{font-size:.8rem;color:var(--text-bright)}.home-mode-pipeline{font-size:.66rem;color:var(--text-dim)}.home-mode-copy{font-size:.72rem;color:var(--text);line-height:1.5;flex:1}.home-mode-meta{display:flex;gap:.45rem;flex-wrap:wrap;font-size:.64rem;color:var(--text-dim);text-transform:uppercase;letter-spacing:.6px}.flow-editor{display:flex;flex-direction:column;gap:.5rem}.flow-toolbar{display:flex;align-items:center;gap:.5rem;flex-wrap:wrap}.flow-palette{display:flex;gap:3px;flex-wrap:wrap;flex:1}.flow-chip,.flow-pill-name{background:var(--bg);border:1px solid var(--border);color:var(--text);cursor:pointer;font-family:var(--mono);font-size:.68rem;padding:2px 6px;border-radius:3px}.flow-chip:hover{border-color:var(--green);color:var(--green)}.flow-hint{font-size:.72rem;color:var(--yellow)}.linkish,.flow-mini.link{background:transparent;border:none;color:var(--accent);cursor:pointer;font-family:var(--mono);font-size:.68rem;padding:0;text-decoration:underline}.flow-canvas{position:relative;min-height:340px;border:1px solid var(--border);border-radius:4px;background:var(--bg) repeating-linear-gradient(0deg,transparent,transparent 23px,var(--border) 24px),var(--bg) repeating-linear-gradient(90deg,transparent,transparent 23px,var(--border) 24px);background-blend-mode:normal;overflow:hidden;touch-action:none}.flow-edges{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none}.flow-empty{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);color:var(--text-dim);font-size:.75rem}.flow-node{position:absolute;background:var(--surface);border:1px solid var(--border-hover);border-radius:4px;font-size:.7rem;-webkit-user-select:none;user-select:none;box-shadow:0 1px 4px #0006}.flow-node.linking{border-color:var(--accent)}.flow-node-head{display:flex;justify-content:space-between;align-items:center;padding:3px 6px;border-bottom:1px solid var(--border);cursor:grab;background:var(--bg)}.flow-node-tool{color:var(--green);font-weight:600}.flow-node.tool-condition .flow-node-tool{color:var(--accent)}.flow-node.tool-direct .flow-node-tool{color:var(--text-dim)}.flow-node-x{background:transparent;border:none;color:var(--text-dim);cursor:pointer;font-size:.8rem;line-height:1}.flow-node-x:hover{color:var(--red)}.flow-node-body{display:flex;flex-direction:column;gap:3px;padding:4px 6px}.flow-mini{width:100%}.flow-preview{display:flex;gap:.5rem;align-items:baseline;font-size:.75rem}.flow-preview code{color:var(--green)}.flow-list-bar{display:flex;align-items:center;gap:.4rem;flex-wrap:wrap}.flow-pill{display:inline-flex;align-items:center;border:1px solid var(--border);border-radius:3px;overflow:hidden}.flow-pill.active{border-color:var(--green)}.flow-pill-name{border:none;border-radius:0}.flow-pill-x{background:transparent;border:none;color:var(--text-dim);cursor:pointer;padding:2px 5px}.flow-pill-x:hover{color:var(--red)}.mono{font-family:var(--mono)}.home-view{display:flex;flex-direction:column;gap:.9rem}.home-hero{display:flex;justify-content:space-between;gap:1rem;align-items:flex-end;border:1px solid var(--border);background:linear-gradient(180deg,#ffffff05,#58a6ff14);padding:.95rem 1rem}.home-kicker{font-size:.64rem;text-transform:uppercase;letter-spacing:1px;color:var(--text-dim);margin-bottom:.25rem}.home-hero h2{font-size:1.2rem;color:var(--text-bright);margin-bottom:.2rem}.home-hero p{font-size:.76rem;color:var(--text-dim);max-width:64ch;line-height:1.5}.home-hero-actions{display:flex;gap:.45rem;align-items:center;flex-wrap:wrap}.shell-link{background:transparent;border:1px solid var(--border);color:var(--text);cursor:pointer;font-family:var(--mono);font-size:.72rem;padding:.35rem .7rem;border-radius:3px}.shell-link:hover{border-color:var(--green);color:var(--green)}.home-overview-grid,.home-detail-grid{display:grid;gap:.75rem}.home-overview-grid{grid-template-columns:1.1fr 1fr}.home-detail-grid{grid-template-columns:1.15fr .9fr;align-items:start}.home-summary-table{display:grid;grid-template-columns:1fr 1fr;gap:.35rem .9rem}.home-summary-row{display:flex;justify-content:space-between;gap:.5rem;padding:.3rem 0;border-bottom:1px solid var(--border)}.home-summary-label{color:var(--text-dim);font-size:.72rem;text-transform:uppercase;letter-spacing:.7px}.home-summary-value{color:var(--text-bright);font-size:.78rem}.home-recommendation{font-size:.84rem;line-height:1.55;color:var(--text-bright);margin-bottom:.85rem}.home-inline-grid{display:grid;grid-template-columns:1fr 1fr;gap:.65rem}.home-inline-value{font-size:.75rem;color:var(--text);line-height:1.4}.home-current-session,.home-sessions-card{grid-column:1}.home-todos-card,.home-savings-card{grid-column:2}.home-session-head{display:flex;justify-content:space-between;gap:.5rem;align-items:center;margin-bottom:.45rem}.home-session-title{font-size:.9rem;color:var(--text-bright)}.home-metric-strip{display:flex;gap:.6rem;flex-wrap:wrap;font-size:.68rem;color:var(--text-dim);margin:.4rem 0 .55rem}.home-tag-row{display:flex;gap:.35rem;flex-wrap:wrap;margin-top:.55rem}.home-tag{border:1px solid var(--border);padding:.15rem .35rem;font-size:.66rem;color:var(--text-dim);text-transform:uppercase;letter-spacing:.6px}.home-todo-list,.home-session-list{display:flex;flex-direction:column;gap:.45rem}.home-todo-item,.home-session-item{display:flex;justify-content:space-between;gap:.55rem;padding:.45rem .5rem;background:var(--bg);border:1px solid var(--border)}.home-todo-status{color:var(--yellow);font-size:.65rem;min-width:54px}.home-totals{display:flex;justify-content:space-between;font-size:.7rem;color:var(--text-dim);margin-top:.55rem}.home-money{font-size:1.45rem;color:var(--text-bright);font-weight:700}.home-money-sub{font-size:.72rem;color:var(--text-dim);margin-top:.2rem}.home-session-item.current{border-left:2px solid var(--green)}.home-session-item-title{font-size:.78rem;color:var(--text-bright);margin-bottom:.15rem}.home-session-item-meta{display:flex;flex-direction:column;gap:.2rem;font-size:.66rem;color:var(--text-dim);text-align:right}@media(max-width:760px){.shell{flex-direction:column}.sidebar{width:100%;border-right:none;border-bottom:1px solid var(--border)}.home-overview-grid,.home-detail-grid,.home-inline-grid,.home-summary-table{grid-template-columns:1fr}.home-current-session,.home-sessions-card,.home-todos-card,.home-savings-card{grid-column:auto}.home-hero{flex-direction:column;align-items:flex-start}}@media(max-width:1280px){.session-grid-4{grid-template-columns:1fr 1fr}.session-column{min-height:auto}.home-mode-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.home-ops-strip{grid-template-columns:repeat(3,minmax(0,1fr))}}@media(max-width:920px){.session-hero{flex-direction:column;align-items:flex-start}.session-hero-kpis{min-width:0;width:100%;grid-template-columns:1fr}.session-grid-4,.home-mode-grid,.home-ops-strip,.mode-control-grid,.session-kpi-grid{grid-template-columns:1fr}}.home-controls-strip{display:flex;gap:1.5rem;align-items:center;padding:.6rem .85rem;background:var(--surface);border:1px solid var(--border);margin-bottom:.75rem;flex-wrap:wrap}.qc-group{display:flex;align-items:center;gap:.4rem}.qc-slot{font-family:var(--mono);font-size:.72rem;padding:2px 8px;border:1px solid var(--border);background:transparent;color:var(--text-dim);cursor:pointer}.qc-slot.active{color:var(--green);border-color:var(--green)}.qc-slot:hover{border-color:var(--border-hover);color:var(--text)}.qc-model{font-family:var(--mono);font-size:.72rem;color:var(--text)}.qc-pill{font-family:var(--mono);font-size:.68rem;padding:1px 6px;font-weight:600;text-transform:uppercase}.qc-pill.on{color:var(--green)}.qc-pill.off{color:var(--text-dim)}.create-form{display:flex;gap:4px;align-items:center;padding:4px 8px}.create-input{flex:1;font-family:var(--mono);font-size:.72rem;background:var(--bg);border:1px solid var(--accent);color:var(--text);padding:2px 4px;outline:none}.create-ok{font-family:var(--mono);font-size:.68rem;color:var(--green);background:transparent;border:1px solid var(--green);padding:1px 5px;cursor:pointer}.create-ok:disabled{opacity:.4;cursor:default}.create-cancel{background:transparent;border:none;color:var(--text-dim);cursor:pointer;font-size:.85rem;line-height:1}.sidebar-delete{background:transparent;border:none;color:var(--text-dim);cursor:pointer;font-size:.7rem;padding:0 3px;line-height:1;opacity:.4}.sidebar-delete:hover{color:var(--red);opacity:1}.sidebar-session-row{display:flex;align-items:center}.sidebar-session-row .sidebar-item{flex:1}.thread{display:flex;flex-direction:column;gap:.75rem}.msg.user{align-self:flex-end;background:var(--accent-dim);border:1px solid rgba(88,166,255,.15);margin-left:20%}.msg.assistant{align-self:flex-start;background:var(--surface);border:1px solid var(--border);margin-right:20%}.run-trace-details{margin-top:.4rem}.run-trace-details summary{font-size:.68rem;color:var(--text-dim);cursor:pointer;padding:.2rem 0;list-style:none;-webkit-user-select:none;user-select:none}.run-trace-details summary::-webkit-details-marker{display:none}.run-trace-details summary:before{content:"+ "}.run-trace-details[open] summary:before{content:"- "}@keyframes vibe-pulse{0%,to{opacity:1}50%{opacity:.3}}.run-spinner{font-size:.75rem;color:var(--accent);font-family:var(--mono);animation:vibe-pulse 1.2s infinite}.shell.shell-4col{display:flex;min-height:100vh;max-width:1600px;margin:0 auto}.workspace{flex:1;min-width:0;padding:1rem 1.1rem 1rem .9rem;display:flex;flex-direction:column;gap:.75rem}.workspace-header{margin-bottom:0}.workspace-grid{display:grid;grid-template-columns:.92fr 1.24fr 1fr;gap:.75rem;align-items:start}.workspace-column{min-width:0}.panel{padding:.7rem .75rem}.panel-head{display:flex;justify-content:space-between;gap:.75rem;align-items:flex-start;margin-bottom:.65rem}.panel-head h3{margin-bottom:.15rem}.panel-head-copy{color:var(--text-dim);font-size:.7rem;line-height:1.45}.panel-action{white-space:nowrap;padding:.25rem .55rem}.sidebar-home-card{border:1px solid var(--border);background:linear-gradient(180deg,#ffffff05,#58a6ff0f);padding:.55rem .6rem;margin:.45rem 0 .55rem}.sidebar-home-title{color:var(--text-bright);font-size:.86rem;line-height:1.35;margin-bottom:.2rem}.sidebar-home-copy{color:var(--text-dim);font-size:.72rem;line-height:1.45;margin-bottom:.45rem}.sidebar-home-metrics{display:flex;flex-wrap:wrap;gap:.4rem;margin-top:.35rem;font-size:.64rem;color:var(--text-dim);text-transform:uppercase;letter-spacing:.55px}.sidebar-home-metrics span{border:1px solid var(--border);padding:.14rem .35rem;background:#ffffff03}.sidebar-project-icon{width:24px;height:24px;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--border);border-radius:4px;color:var(--project-icon-fg,var(--text-bright));background:var(--project-icon-bg,var(--bg));margin-right:.35rem;flex-shrink:0;font-size:.72rem;font-weight:700}.sidebar-project-row{display:flex;align-items:center;gap:.15rem}.sidebar-project-row .sidebar-item{flex:1}.project-sessions-panel{min-height:100%}.project-session-list{display:flex;flex-direction:column;gap:.4rem}.project-session-link{display:flex;justify-content:space-between;align-items:center;gap:.75rem;width:100%;border:1px solid var(--border);background:var(--bg);color:var(--text);padding:.55rem .6rem;cursor:pointer;font-family:var(--mono);font-size:.74rem;text-align:left}.project-session-link:hover{border-color:var(--border-hover)}.project-session-link.active{border-color:var(--green);box-shadow:inset 0 0 0 1px #3fb95026}.project-session-link.current{background:#3fb9500a}.project-session-link-title{color:var(--text-bright)}.project-session-link-meta{color:var(--text-dim);font-size:.64rem;text-transform:uppercase;letter-spacing:.6px;white-space:nowrap}.control-rail{min-height:100%}.control-status-grid{display:grid;grid-template-columns:1fr 1fr;gap:.45rem;margin-bottom:.65rem}.control-status{border:1px solid var(--border);background:var(--bg);padding:.45rem .5rem}.control-status strong{display:block;color:var(--text-bright);font-size:.78rem}.control-flow-header,.control-kpi-strip{display:grid;grid-template-columns:1fr auto;gap:.4rem .6rem;align-items:center;margin-bottom:.45rem}.control-kpi-strip{grid-template-columns:repeat(2,minmax(0,1fr))}.control-kpi-strip>div{border:1px solid var(--border);background:var(--bg);padding:.42rem .48rem}.control-kpi-strip strong{display:block;color:var(--text-bright);font-size:.76rem}.control-flow-list{display:flex;flex-direction:column;gap:.35rem}.control-flow-step{display:flex;gap:.5rem;align-items:flex-start;border:1px solid var(--border);background:var(--bg);padding:.4rem .45rem}.control-flow-step>span{min-width:20px;height:20px;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--border);color:var(--green);font-size:.68rem;background:var(--surface)}.control-flow-step strong{color:var(--text-bright);font-size:.74rem}.control-flow-step .muted{font-size:.66rem;margin-top:.05rem}.session-hero-compact{padding:.65rem .75rem}.session-mini-grid{display:grid;grid-template-columns:1fr 1fr;gap:.55rem}.session-actions-row{display:flex;gap:.45rem;flex-wrap:wrap}.session-actions-row .shell-link{padding:.3rem .55rem}@media(max-width:1280px){.workspace-grid{grid-template-columns:1fr 1fr}}@media(max-width:920px){.workspace-grid,.session-mini-grid,.control-status-grid,.control-kpi-strip{grid-template-columns:1fr}}
|