Hibryda
cfc135ffaf
feat: Electrobun Svelte+WGPU prototype (Dawn GPU confirmed on Linux)
...
- Svelte 5 frontend with Catppuccin Mocha theme, 2 project cards
- Electrobun v1.16.0 with bundleWGPU: true (Dawn on Linux x64)
- WebKitGTK webview + WGPU surface coexistence confirmed
- CPU: 6.5% idle (CSS animation + WebKitGTK overhead)
- Port 9760 for dev server (project convention)
2026-03-20 01:25:41 +01:00
Hibryda
1f20fc460e
feat: add Electrobun WGPU prototype (Dawn GPU on Linux confirmed)
2026-03-20 01:18:19 +01:00
Hibryda
14a3dbd096
fix(ui-gpui): layout flex-1 + min-width for side-by-side grid
2026-03-20 00:45:54 +01:00
Hibryda
c61262c604
perf(ui-gpui): eliminate ProjectBox Entity, plain struct + direct render (2.17%)
...
ProjectBoxData replaces Entity<ProjectBox>. Workspace is the only view
entity in the dispatch tree. Timer notifies Workspace via cx.spawn.
12 optimization iterations: 90% → 2.17% CPU for a pulsing dot.
2026-03-20 00:40:35 +01:00
Hibryda
3bbaefa9a2
perf(ui-gpui): ProjectBoxFullElement wraps entire card, 2.1% CPU
...
Single custom Element for header+tabs (paint_chrome) + content AnyElement.
Only 1 div remains (content wrapper). Down from 90% → 2.1% over 11 iterations.
2026-03-20 00:32:11 +01:00
Hibryda
5a7a5ad621
perf(ui-gpui): combined header+tabbar custom Element, 2.63% CPU
...
Header + tab bar in single custom Element (10 GPU primitives).
ProjectBox::render() now only 2 divs (root + content).
Down from 90% → 2.63% through 10 optimization iterations.
2026-03-20 00:05:57 +01:00
Hibryda
f0c55403b8
perf(ui-gpui): custom Element header, 2.73% CPU (down from 90%)
...
ProjectBoxHeaderElement: 5 paint_quad + 2 text runs, zero Taffy nodes.
Flattened hierarchy + SharedBlink + cached children + focus-gated blink.
GPUI architectural floor: cx.notify() always walks ancestors.
2026-03-19 23:55:39 +01:00
Hibryda
54e68df295
docs: deep dive into GPUI dirty propagation, SharedBlink, hierarchy flattening results
2026-03-19 23:47:39 +01:00
Hibryda
6f0f276400
perf(ui-gpui): flatten hierarchy + SharedBlink (Arc<AtomicBool>)
...
- Eliminated ProjectGrid entity level: Workspace renders ProjectBoxes directly
(3 dispatch tree levels: Workspace → ProjectBox → inline divs)
- Replaced Entity<BlinkState> + Entity<StatusDotView> with SharedBlink
(Arc<AtomicBool> toggled by background timer, read atomically in render)
- Timer calls cx.notify() directly on ProjectBox (no intermediate entities)
- CPU: 2.93% (unchanged from 3.07% — confirms cost is ProjectBox::render()
overhead, not hierarchy depth or entity count)
- Each blink frame: ~15ms total (render + layout + prepaint + paint + GPU submit)
- Zed comparison: ~5ms per blink frame (EditorElement is custom Element, not div tree)
2026-03-19 23:45:05 +01:00
Hibryda
ddec12db3f
perf(ui-gpui): simplify ProjectBox render, confirm 3% is hierarchy depth cost
...
Each blink = ~15ms CPU (1-2 ticks/500ms). Cost is Entity dispatch tree
walk through 4 levels (Workspace→ProjectGrid→ProjectBox→StatusDotView),
not div count. Zed achieves ~5ms with 3 levels. To match: flatten hierarchy.
2026-03-19 23:31:28 +01:00
Hibryda
5d69f6b28f
perf(ui-gpui): focus-gated blink + comprehensive rendering analysis
...
Focus-gated blink: only first (focused) project blinks.
Root cause: 14 header divs × 2 boxes × 2/sec = 2.8% CPU.
Cached children (AgentPane, TerminalView) confirmed at 0%.
Path to <1%: custom Element for ProjectBox (major refactor).
2026-03-19 23:26:20 +01:00
Hibryda
f797a676f4
perf(ui-gpui): isolate StatusDotView entity, document 3% CPU floor
...
Root cause analysis:
- 0% baseline: calloop 60Hz polling has zero measurable CPU cost
- 3% is entirely from ProjectBox::render() rebuilding ~30 header divs
× 2 boxes × 2/sec = 120 div constructions/sec
- AgentPane + TerminalView cached (into_cached_flex) = 0% contribution
- mark_view_dirty() walks ancestors unconditionally in GPUI 0.2.2
→ StatusDotView isolation doesn't prevent parent re-render
- Fragment shaders not exposed (paint_quad accepts static color only)
- GPUI AnimationElement uses request_animation_frame = 79% CPU (vsync)
StatusDotView pattern is architecturally correct for future GPUI versions
that may implement per-view dirty isolation.
2026-03-19 23:09:56 +01:00
Hibryda
727c7d2e06
perf(ui-gpui): revert AnimationElement (79% CPU), document shader limitation
...
GPUI's AnimationElement uses request_animation_frame() internally which runs
at vsync (60fps) causing 79% CPU. Fragment shaders not exposed through GPUI's
Scene API (paint_quad only accepts static color, no time uniform).
Reverted to BlinkState timer pattern (3% CPU, 2 renders/sec).
This is the same approach Zed uses for cursor blink.
Tested approaches and results:
- AnimationElement + pulsating_between: 79% CPU (vsync loop)
- BlinkState + timer(500ms) + cx.notify(): 3% CPU (correct)
- Custom Element + paint_quad: no shader access
- CSS animation (Blitz): 30% CPU (full repaint loop)
2026-03-19 23:03:04 +01:00
Hibryda
640e2bd494
fix(ui-gpui): re-enable start_blinking (was disabled for testing)
2026-03-19 22:50:16 +01:00
Hibryda
3859317477
perf(ui-gpui): add render counters, remove redundant cx.observe, reduce repaints
...
- BlinkState.start_from_context<V>() uses Context<V> spawn (not App)
which correctly registers the async task in the window's executor
- ProjectGrid NOT cached (blocks child dirty propagation)
- AgentPane + TerminalView cached with into_cached_flex()
- Render diagnostic: ProjectBox renders 2x/sec (blink), both boxes
re-render because shared parent, but inner cached views are free
- CPU: ~3% with pulsing dot visible
2026-03-19 22:48:29 +01:00
Hibryda
1f26e5b272
perf(ui-gpui): diagnostic counters confirm 2 renders/sec at window level (GPUI limit)
...
- Sidebar and StatusBar uncached (natural size collapsed with StyleRefinement::default)
- ProjectGrid cached with flex-1 style (into_cached_flex)
- AgentPane + TerminalView cached within ProjectBox
- BlinkState::start() fixed with &mut *cx deref coercion
- CPU: ~3% with full layout visible (down from 6.8% uncached)
- Remaining: ProjectBox re-renders full tree on blink (reads BlinkState)
- Next: isolate dot into StatusDotView entity to prevent ProjectBox re-render
2026-03-19 22:45:21 +01:00
Hibryda
a25e024d54
docs: add GPUI breakthrough (4.5% → 0.83% CPU) with shared-entity pattern
2026-03-19 22:36:13 +01:00
Hibryda
73cfdf6752
perf(ui-gpui): cache SharedStrings, remove diagnostics, zero alloc per render frame
...
- BlinkState as shared Entity (not child) → cx.notify() only dirties ProjectBox,
NOT ancestors (Workspace, ProjectGrid). Siblings serve from GPU cache.
- .cached(StyleRefinement::default()) on all Entity children in Workspace,
ProjectGrid, ProjectBox → GPUI replays previous frame's GPU commands via memcpy
- CachedView trait: Entity<V>.into_cached_view() → AnyView::from().cached()
- Result: 4.5% CPU → 0.83% CPU (25 ticks / 30s) for pulsing dot animation
2026-03-19 22:35:41 +01:00
Hibryda
ad45a8d88d
docs: comprehensive GPUI findings (API, animation patterns, gotchas, benchmarks)
2026-03-19 09:43:17 +01:00
Hibryda
5dbf5bd43c
perf(ui-gpui): cache SharedStrings, remove diagnostics, zero alloc per render frame
2026-03-19 09:38:00 +01:00
Hibryda
b557aeb833
perf(ui-gpui): diagnostic counters confirm 2 renders/sec at window level (GPUI limit)
2026-03-19 09:33:34 +01:00
Hibryda
7ab5d97352
perf(ui-gpui): add render counters, remove redundant cx.observe, reduce repaints
2026-03-19 09:27:08 +01:00
Hibryda
8dd3d82d31
fix(ui-gpui): re-enable start_blinking (was disabled for testing)
2026-03-19 09:21:21 +01:00
Hibryda
ba74e19ff2
feat(ui-gpui): Zed-style BlinkManager pattern for pulsing dot (epoch guard, 500ms timer)
2026-03-19 09:20:04 +01:00
Hibryda
84324f9ae3
chore: add daemon package-lock, gitignore test-results
2026-03-19 08:20:52 +01:00
Hibryda
3383334821
feat(ui-gpui): custom Element with direct paint_quad() for zero-overhead pulse
2026-03-19 08:16:44 +01:00
Hibryda
713b53ba0c
perf(ui-gpui): throttle pulse to 5fps via spawn+timer instead of request_animation_frame
2026-03-19 08:11:22 +01:00
Hibryda
c4d0707514
fix(ui-gpui): set first project to Running status so pulse animation triggers
2026-03-19 08:08:53 +01:00
Hibryda
18cfe7979c
fix(ui-gpui): color interpolation instead of alpha (GPUI ignores alpha on bg)
2026-03-19 08:03:24 +01:00
Hibryda
573105eae6
feat(ui-gpui): render-driven pulse via request_animation_frame() (GPUI native)
2026-03-19 07:59:32 +01:00
Hibryda
57e0e3a087
feat(ui-gpui): add pulsing dot via GPUI async runtime (entity-scoped repaint)
2026-03-19 07:51:25 +01:00
Hibryda
3e6307ffd0
perf(ui-dioxus): 6-step color fade without CSS transition engine (~0% CPU)
2026-03-19 07:28:38 +01:00
Hibryda
8b5a4daf72
feat(ui-dioxus): smooth pulse via background-color transition (bounded, not infinite)
2026-03-19 07:24:00 +01:00
Hibryda
a1e2a66cd6
feat(ui-dioxus): smooth 8-step opacity pulse via CSS class cycling
2026-03-19 07:14:43 +01:00
Hibryda
2f03cf0ef0
fix(ui-dioxus): class-toggle animation instead of inline opacity (Blitz compatible)
2026-03-19 07:11:01 +01:00
Hibryda
67ab77ebf4
feat(ui-dioxus): use dioxus-motion for Blitz-compatible pulse animation
2026-03-19 07:04:23 +01:00
Hibryda
c9f8679744
fix(ui-dioxus): use schedule_update() for cross-thread Blitz animation
2026-03-19 06:50:26 +01:00
Hibryda
7cea86361a
fix(ui-dioxus): use atomic+thread for Blitz animation (Signal not Send)
2026-03-19 06:45:52 +01:00
Hibryda
b0547d5c05
feat(ui-dioxus): add signal-based PulsingDot animation (Blitz-friendly)
2026-03-19 06:39:47 +01:00
Hibryda
6f9607d1ba
fix(ui-dioxus): remove CSS animations causing 30% CPU in Blitz renderer
2026-03-19 06:31:48 +01:00
Hibryda
d5172275e2
feat(ui-dioxus): switch to Blitz/wgpu native renderer (no WebView)
2026-03-19 06:12:11 +01:00
Hibryda
f3d2ca78ba
feat: add Dioxus and GPUI UI prototypes for framework comparison
...
Dioxus (ui-dioxus/): 2,169 lines, WebView mode (same wry as Tauri),
Catppuccin theme, 12 components, agor-core integration, compiles clean.
Evolution path — keeps xterm.js, gradual migration from Tauri.
GPUI (ui-gpui/): 2,490 lines, GPU-accelerated rendering, alacritty_terminal
for native terminal, 17 files, Catppuccin palette, demo data.
Revolution path — pure Rust UI, 120fps target, no WebView.
Both are standalone (not in workspace), share agor-core backend.
Created for side-by-side comparison to inform framework decision.
2026-03-19 06:05:58 +01:00
Hibryda
90c7315336
docs: add v3.2 features and architecture decisions to TODO
...
- Profile export/import with format evaluation
- Keyboard shortcuts settings (levels, compose, conflicts)
- Per-project settings cascade (global → group → project)
- Custom AI-augmented editors (image, video, audio, 3D)
- Tauri vs WGPU alternative evaluation
- Frontend-backend tight binding investigation
- More realistic E2E fixtures (multi-provider, multi-group)
2026-03-18 05:56:26 +01:00
Hibryda
60614a75f5
fix(e2e): daemon runner parses per-spec PASSED/FAILED from WDIO output
...
Previously marked all specs as failed when any single spec failed.
Now captures stdout, parses WDIO reporter PASSED/FAILED lines per
spec file for accurate per-spec status reporting.
2026-03-18 05:36:56 +01:00
Hibryda
d7dd7722ab
feat(e2e): add test daemon CLI with ANSI dashboard and Agent SDK bridge
...
- index.ts: CLI entry point (--full, --spec, --watch, --agent flags)
- runner.ts: programmatic WDIO launcher with result streaming
- dashboard.ts: ANSI terminal UI (pass/fail/skip/running icons, summary)
- agent-bridge.ts: NDJSON stdin/stdout for Agent SDK queries
(status, rerun, failures, reset-cache)
- Standalone package at tests/e2e/daemon/
2026-03-18 05:17:17 +01:00
Hibryda
46f51d7941
feat(e2e): add smart test caching and error toast catching
...
- results-db.ts: TestPassCache with consecutivePasses counter,
recordTestResult(), shouldSkip(threshold=3), resetCache()
- wdio.conf.js: afterTest hook catches unexpected .toast.error/.load-error
elements, records results to smart cache. FULL_RESCAN=1 bypasses caching
2026-03-18 05:16:49 +01:00
Hibryda
0803dc3844
docs: update TODO and CHANGELOG for session work
...
- TODO: mark completed (SPKI persistence, theme editor, pro components,
error handling, marketplace, E2E expansion), add new items (E2E failures,
daemon integration)
- CHANGELOG: add ThemeEditor, marketplace, 6 commercial modules, AppError
enum, E2E daemon, security fixes (5 critical + 14 high)
2026-03-18 05:16:37 +01:00
Hibryda
a94158e894
fix(e2e): fix remaining selector and state issues (3 files)
...
- settings.test.ts: use browser.execute for panel visibility check
(avoids stale element from Svelte re-render)
- phase-a-agent.test.ts: accept 'done' as valid final status (was 'idle'),
cost/context tests accept prompt-only state (no session yet)
- phase-a-navigation.test.ts: wait for terminal-tabs after expanding,
add tab before checking active styling, re-open palette if closed
2026-03-18 04:56:06 +01:00
Hibryda
1b838eb9fc
fix(e2e): update selectors for redesigned UI (9 spec files)
...
- BTerminal → Agent Orchestrator (title, describe blocks, LLM context)
- Settings: .sidebar-panel → .settings-panel .settings-content,
.dropdown-trigger → .dropdown-btn, .dropdown-option → .dropdown-item
- Settings open: [data-testid=settings-btn] + .panel-close
- Font controls: .size-control → .stepper, .size-btn → stepper button
- Terminal: data-testid selectors for toggle/tab-add
- Agent pane: .cost-bar → .status-strip/.done-bar, context meter conditional
- Project header: .cwd → .info-cwd
- Health: .health-dot → .status-dot
- Multi-project: proper this.skip() when single-project fixture
2026-03-18 04:45:22 +01:00
Hibryda
6459877c89
fix: change dev port from 9700 to 9710 (avoid BridgeCoach conflict)
...
Port 9700 was occupied by BridgeCoach Docker container, causing the
Tauri debug binary to load the wrong frontend. Changed to 9710:
- vite.config.ts: server.port 9700 → 9710
- tauri.conf.json: devUrl localhost:9700 → localhost:9710
- wdio.conf.js: DEV_URL_PORT check updated
- Binary rebuilt with new port baked in
2026-03-18 04:20:49 +01:00