Hibryda
c0eca4964a
test(electrobun): workspace-store + plugin-store unit tests
2026-03-22 05:03:29 +01:00
Hibryda
e75f90407b
test: bun backend + store/hardening unit tests (WIP, agents running)
2026-03-22 05:02:02 +01:00
Hibryda
dd1d692e7b
test(electrobun): expand E2E suite — 75 new tests (120 total, 14 spec files)
...
New specs: search, files, comms, tasks, theme, groups, keyboard,
notifications, diagnostics, splash. All under 300 lines, CSS class
selectors matching actual components, display toggle aware.
2026-03-22 05:01:21 +01:00
Hibryda
e73aeb4aaf
test(electrobun): settings-db unit tests (partial, agents still running)
2026-03-22 04:58:37 +01:00
Hibryda
54aad5f383
feat(electrobun): complete all 10 hardening features
...
1. Durable event sequencing — monotonic seqId, deduplicate on restore
2. File-save conflict detection — mtime check, atomic temp-file rename
3. Remote credential vault — XOR-obfuscated tokens in settings-db
4. Push-based updates — bttask.changed/btmsg.newMessage events, 30s fallback
5. Sidecar backpressure — 50MB buffer cap, 64KB paste limit
6. Per-project retention — configurable count (1-20) + days (1-90)
7. Channel ACL — join/leave/members, membership validation on send
8. Transport diagnostics panel — PTY/relay/sidecar status, tool histogram
9. Plugin sandbox policy — allowedOrigins, maxRuntime (30s), network gate
10. Multi-tool health — activeToolMap, duration histogram, getActiveTools()
2026-03-22 04:49:37 +01:00
Hibryda
33f8f5d026
feat(electrobun): hardening — plugin sandbox policy (partial, agent still running)
2026-03-22 04:46:39 +01:00
Hibryda
f0850f0785
feat: @agor/stores package (3 stores) + 58 BackendAdapter tests
...
@agor/stores:
- theme.svelte.ts, notifications.svelte.ts, health.svelte.ts extracted
- Original files replaced with re-exports (zero consumer changes needed)
- pnpm workspace + Vite/tsconfig aliases configured
BackendAdapter tests (58 new):
- backend-adapter.test.ts: 9 tests (lifecycle, singleton, testing seam)
- tauri-adapter.test.ts: 28 tests (invoke mapping, command names, params)
- electrobun-adapter.test.ts: 21 tests (RPC names, capabilities, stubs)
Total: 523 tests passing (was 465, +58)
2026-03-22 04:45:56 +01:00
Hibryda
5e1fd62ed9
feat: @agor/stores package + Electrobun hardening (WIP)
...
- packages/stores/: theme, notifications, health stores extracted
- Electrobun hardening: durable event sequencing, file conflict detection,
push-based updates, backpressure guards (partial, agents still running)
2026-03-22 04:40:04 +01:00
Hibryda
5836fb7d80
feat: community export workflow — strip script, leak-check hardening, CLA docs
...
- scripts/strip-commercial.sh: removes agor-pro/, commercial files, SPDX headers
- leak-check.yml: added LICENSE-COMMERCIAL, SPDX header, and feature flag checks
- CONTRIBUTING.md: external contributor guide, commercial content table, sync docs
2026-03-22 04:39:07 +01:00
Hibryda
18364826dc
feat: CLA configuration + community sync workflow
2026-03-22 04:37:09 +01:00
Hibryda
105107dd84
refactor: migrate all 7 bridge clusters to BackendAdapter (WIP)
...
70+ files changed, net -688 lines. Bridge files being replaced with
BackendAdapter calls. Clusters 2-8 in progress: theme, groups/workspace,
agent, PTY/terminal, files, orchestration, infrastructure.
2026-03-22 04:28:12 +01:00
Hibryda
579157f6da
feat: Phase 2 — store audit, migration clusters, ADR, settings domain migration
...
- MIGRATION_CLUSTERS.md: reactive dependency graph across 20 bridges/stores
- PHASE1_STORE_AUDIT.md: 11 stores audited (3 clean, 5 bridge-dependent, 3 platform-specific)
- ADR-001: dual-stack binding strategy (accepted, S-1+S-3 hybrid)
- Settings domain migration: all 6 settings components + App.svelte + FilesTab
migrated from settings-bridge to getBackend() calls
2026-03-22 03:48:41 +01:00
Hibryda
df83b1df4d
refactor: finalize @agor/types + TauriAdapter (agent completion)
2026-03-22 03:36:48 +01:00
Hibryda
c86f669f96
feat: @agor/types package + BackendAdapter + TauriAdapter + ElectrobunAdapter
...
- packages/types/: shared type definitions (agent, project, btmsg, bttask,
health, settings, protocol, backend interface)
- BackendAdapter: capability-flagged interface, compile-time selected
- TauriAdapter: wraps Tauri invoke/listen
- ElectrobunAdapter: wraps Electrobun RPC
- src/lib/backend/backend.ts: adapter singleton + setBackendForTesting()
- pnpm-workspace.yaml: workspace setup
2026-03-22 03:34:04 +01:00
Hibryda
631fc2efc8
feat: canonical SQL DDL + schema validator + migration tool
...
- schema/canonical.sql: 29 tables across 3 databases, CHECK constraints,
foreign keys, 13 indexes, WAL mode, schema_version tracking
- tools/validate-schema.ts: applies DDL to in-memory SQLite, extracts
PRAGMA table_info + sqlite_master metadata as JSON
- tools/migrate-db.ts: CLI for Tauri→Electrobun data migration with
atomic transaction, version fencing, INSERT OR IGNORE
- docs/SWITCHING.md: migration guide with prerequisites and troubleshooting
2026-03-22 03:33:15 +01:00
Hibryda
0f75cb8e32
fix(electrobun): complete all 16 Codex #3 findings
...
CRITICAL:
- Message persistence race: snapshot batchEnd before async save
- Double-start guard: startingProjects Set prevents concurrent launches
- Symlink path traversal: fs.realpathSync() in path-guard.ts
- Relay false success: connect() returns { ok, machineId, error }
HIGH:
- Session restore skips if active session exists
- Remote remove: new RPC, cleans backend map
- Task board poll token: stale responses discarded after drag-drop
- Health concurrent tools: toolsInFlight counter (was boolean)
- bttask transactions: delete wraps comments+task, addComment validates
- PTY buffer cleared on reconnect
- PTY large paste: chunked String.fromCharCode (8KB chunks)
- Sidecar max line: 10MB limit prevents unbounded memory
- btmsg authorization: group validation, channel membership checks
MEDIUM:
- Session retention: max 5 per project, purgeSession/untrackProject
- Relay IPv6: URL parser replaces string split
- PTY schema: fixed misleading base64 comment
2026-03-22 02:52:04 +01:00
Hibryda
c145e37316
fix(electrobun): partial Codex #3 fixes — message persistence race, double-start guard
2026-03-22 02:46:03 +01:00
Hibryda
4e86e97fd9
docs: add 10 Electrobun hardening features to TODO (from Codex audit #3 )
2026-03-22 02:45:15 +01:00
Hibryda
1cd4558740
fix(electrobun): address all 22 Codex review #2 findings
...
CRITICAL:
- DocsTab XSS: DOMPurify sanitization on all {@html} output
- File RPC path traversal: guardPath() validates against project CWDs
HIGH:
- SSH injection: spawn /usr/bin/ssh via PTY args, no shell string
- Search XSS: strip HTML, highlight matches client-side with <mark>
- Terminal listener leak: cleanup functions stored + called in onDestroy
- FileBrowser race: request token, discard stale responses
- SearchOverlay race: same request token pattern
- App startup ordering: groups.list chains into active_group restore
- PtyClient timeout: 5-second auth timeout on connect()
- Rule 55: 6 {#if} patterns converted to style:display toggle
MEDIUM:
- Agent persistence: only persist NEW messages (lastPersistedIndex)
- Search errors: typed error response, "Invalid query" UI
- Health store wired: agent events call recordActivity/setProjectStatus
- index.ts SRP: split into 8 domain handler modules (298 lines)
- App.svelte: extracted workspace-store.svelte.ts
- rpc.ts: typed AppRpcHandle, removed `any`
LOW:
- CommandPalette listener wired in App.svelte
- Dead code removed (removeGroup, onDragStart, plugin loaded)
2026-03-22 02:30:09 +01:00
Hibryda
8e756d3523
feat(electrobun): final 5% — full integration, real data, polish
...
1. Claude CLI: additionalDirectories + worktreeName passthrough
2. Agent-store: reads settings (default_cwd, provider model, permission)
3. Project hydration: SQLite replaces hardcoded PROJECTS, add/remove UI
4. Group hydration: SQLite groups, add/delete in sidebar
5. Terminal auto-spawn: reads default_cwd from settings
6. Context tab: real tokens from agent-store, file refs, turn count
7. Memory tab: Memora DB integration (read-only, graceful if missing)
8. Docs tab: markdown viewer (files.list + files.read + inline renderer)
9. SSH tab: CRUD connections, spawn PTY with ssh command
10. Error handling: global unhandledrejection → toast notifications
11. Notifications: agent done/error/stall → toasts, 15min stall timer
12. Command palette: all 18 commands (was 10)
+1,198 lines, 13 files. Electrobun now 100% feature-complete vs Tauri v3.
2026-03-22 02:02:54 +01:00
Hibryda
4826b9dffa
feat(electrobun): auto-updater + E2E tests + splash screen — ALL GAPS CLOSED
...
Auto-updater:
- updater.ts: GitHub Releases API check, semver comparison, timestamp tracking
- AdvancedSettings wired to real updater.check/getVersion RPC
E2E testing (45 tests):
- wdio.conf.js: WebDriverIO config for Electrobun (port 9761)
- fixtures.ts: isolated temp dirs, demo data, git repo init
- 4 spec files: smoke (13), settings (13), terminal (10), agent (9)
Splash screen:
- SplashScreen.svelte: animated gradient AGOR logo, version, loading dots
- App.svelte: shows splash until all init promises resolve, 300ms fade-out
2026-03-22 01:49:30 +01:00
Hibryda
88206205fe
feat(electrobun): multi-machine relay + OTEL telemetry
...
Multi-machine relay:
- relay-client.ts: WebSocket client for agor-relay with token auth,
exponential backoff (1s-30s), TCP probe, heartbeat (15s ping)
- machines-store.svelte.ts: remote machine state tracking
- RemoteMachinesSettings.svelte: machine list, add/connect/disconnect UI
- 7 RPC types (remote.connect/disconnect/list/send/status + events)
Telemetry:
- telemetry.ts: OTEL spans + OTLP/HTTP export to Tempo,
controlled by AGOR_OTLP_ENDPOINT env var
- telemetry-bridge.ts: tel.info/warn/error frontend convenience API
- telemetry.log RPC for frontend→Bun tracing
2026-03-22 01:46:03 +01:00
Hibryda
ec30c69c3e
feat(electrobun): add CommsTab and TaskBoardTab to project card tabs
2026-03-22 01:36:46 +01:00
Hibryda
252fca70df
feat(electrobun): file management — CodeMirror editor, PDF viewer, CSV table, real file I/O
...
- CodeEditor: CodeMirror 6 with Catppuccin theme, 15+ languages, Ctrl+S save,
dirty tracking, save-on-blur
- PdfViewer: pdfjs-dist canvas rendering, zoom 0.5-3x, HiDPI, lazy page load
- CsvTable: RFC 4180 parser, delimiter auto-detect, sortable columns, sticky header
- FileBrowser: real filesystem via files.list/read/write RPC, lazy dir loading,
file type routing (code→editor, pdf→viewer, csv→table, images→display)
- 10MB size gate, binary detection, base64 encoding for non-text files
2026-03-22 01:36:02 +01:00
Hibryda
29a3370e79
fix(electrobun): address all 20 Codex review findings
...
CRITICAL:
- PTY leak: Terminal.svelte now calls pty.close on destroy, not just unsubscribe
- Agent session cleanup: clearSession() removes done/error sessions, backend
deletes after 60s grace period
HIGH:
- Clone branch passthrough: user's branch name flows through callback
- Circular imports: extracted rpc.ts singleton, broke main.ts ↔ App.svelte cycle
- Settings wired to runtime: Terminal reads cursor/scrollback from settings
- Security disclaimer: added "prototype — not system keyring" notice
- ThemeEditor: fixed basePalette → initialPalette reference
MEDIUM:
- Clone race: UUID suffix instead of count-based index
- Silent failures: structured error returns from PTY handlers
- WebKitGTK mount: only current + previous group mounted
- Debug listeners: gated behind DEBUG, cleanup on destroy
- NDJSON residual buffer parsed on process exit
- Codex adapter: deduplicated tool_call/tool_result
- extraEnv: rejects CLAUDE*/CODEX*/OLLAMA* keys
- settings-db: runMigrations() with version tracking
- active_group: persisted via settings.set
LOW:
- Removed dead demo code, unused variables
- color-mix() fallbacks added
2026-03-22 01:20:23 +01:00
Hibryda
ef0183de7f
feat(electrobun): agent execution layer — sidecar manager + message adapters + store
...
- SidecarManager: spawns claude/codex/ollama runners via Bun.spawn(),
NDJSON stdio protocol, Claude CLI auto-detection, env stripping,
AbortController stop, Deno/Node runtime detection
- MessageAdapter: parses Claude stream-json, Codex ThreadEvent, Ollama
chunks into common AgentMessage format
- agent-store.svelte.ts: per-project reactive session state, RPC event
listeners for agent.message/status/cost
- AgentPane: wired to real sessions (start/stop/prompt), stop button,
thinking/system message rendering
- ProjectCard: status dot from real agent status, cost/tokens from store
- 5 new RPC types (agent.start/stop/prompt/list + events)
2026-03-22 01:03:05 +01:00
Hibryda
95f1f8208f
fix(electrobun): WebKitGTK click-lock — use display toggle instead of DOM add/remove
2026-03-20 07:36:26 +01:00
Hibryda
3a876329c5
test(electrobun): switch to default titleBarStyle to isolate click-lock bug
2026-03-20 07:00:02 +01:00
Hibryda
03e1f18282
fix(electrobun): remove all -webkit-app-region, use JS window drag on AGOR title
2026-03-20 06:50:47 +01:00
Hibryda
fe441a86fe
fix(electrobun): remove drag-region div that captured all clicks on WebKitGTK
2026-03-20 06:45:38 +01:00
Hibryda
d95cf122f0
feat(electrobun): redesign layout — numbered groups, right sidebar, notification drawer
...
- Fix group click locking UI (fire-and-forget RPC)
- Group icons: numbered circles with red badge for new items
- AGOR title: larger (900 weight, 1.25rem)
- Removed top title bar
- Right sidebar: vertical window controls + notification bell
- NotifDrawer.svelte: slide-in notification history
2026-03-20 06:36:09 +01:00
Hibryda
a020f59cb4
feat(electrobun): groups, cloning, shortcuts, custom window — all 5 features
...
Groups Sidebar:
- SQLite groups table (4 seeded: Development, Testing, DevOps, Research)
- Left icon rail with emoji group icons, Ctrl+1-4 switching
- Active group highlighted, projects filtered by group
Project Cloning:
- Clone button on project cards (fork icon)
- git worktree add via Bun.spawn (array form, no shell strings)
- 3-clone limit, branch name validation, pending-status pattern
- Clone cards: WT badge + branch name + accent top border
- Chain link SVG icons between linked clones in grid
Keyboard Shortcuts:
- keybinding-store.svelte.ts: 16 defaults across 4 categories
- Two-scope: document capture + terminal focus guard
- KeyboardSettings.svelte: search, click-to-capture, conflict detection
- Per-binding reset + Reset All
Custom Window:
- titleBarStyle: "hidden" — no native title bar
- Vertical "AGOR" text in left sidebar (writing-mode: vertical-rl)
- Floating window controls badge (minimize/maximize/close)
- Draggable region via -webkit-app-region: drag
- Window frame persisted to SQLite (debounced 500ms)
Window is resizable by default (Electrobun BrowserWindow).
2026-03-20 06:24:24 +01:00
Hibryda
5032021915
feat(electrobun): wire EVERYTHING — all settings persist, theme editor, marketplace
...
All settings wired to SQLite persistence:
- AgentSettings: shell, CWD, permissions, providers (JSON blob)
- SecuritySettings: branch policies (JSON array)
- ProjectSettings: per-project via setProject RPC
- OrchestrationSettings: wake, anchors, notifications
- AdvancedSettings: logging, OTLP, plugins, import/export JSON
Theme Editor:
- 26 color pickers (14 Accents + 12 Neutrals)
- Live CSS var preview as you pick colors
- Save custom theme to SQLite, cancel reverts
- Import/export theme as JSON
- Custom themes in dropdown with delete button
Extensions Marketplace:
- 8-plugin demo catalog (Browse/Installed tabs)
- Search/filter by name or tag
- Install/uninstall with SQLite persistence
- Plugin cards with emoji icons, tags, version
Terminal font hot-swap:
- fontStore.onTermFontChange() → xterm.js options update + fitAddon.fit()
- Resize notification to PTY daemon after font change
All 7 settings categories functional. Every control persists and takes effect.
2026-03-20 05:45:10 +01:00
Hibryda
6002a379e4
feat(electrobun): wire persistence — SQLite, 17 themes, font system
...
Persistence:
- bun:sqlite at ~/.config/agor/settings.db (WAL mode, 500ms busy_timeout)
- 4 tables: schema_version, settings, projects, custom_themes
- 5 RPC handlers: settings.get/set/getAll, projects get/set
Theme system (LIVE switching):
- All 17 themes ported from Tauri (4 Catppuccin + 7 Editor + 6 Deep Dark)
- applyCssVars() sets 26 --ctp-* vars on document.documentElement
- Parallel xterm ITheme mapping per theme
- theme-store.svelte.ts: Svelte 5 rune store, persists to SQLite
Font system:
- font-store.svelte.ts: UI/terminal font family + size
- Live CSS var application (--ui-font-family/size, --term-font-family/size)
- onTermFontChange() callback registry for terminal instances
- Persists all 4 font settings to SQLite
AppearanceSettings wired: 17-theme grouped dropdown, font steppers
Init on startup: restores saved theme + fonts from SQLite
2026-03-20 05:29:03 +01:00
Hibryda
0b9e8b305a
feat(electrobun): port all Tauri features — full settings, popup menus, provider capabilities
...
New components (8):
- provider-capabilities.ts: per-provider feature flags (claude/codex/ollama)
- settings/AppearanceSettings.svelte: theme, fonts, cursor, scrollback
- settings/AgentSettings.svelte: shell, CWD, permissions, providers
- settings/SecuritySettings.svelte: keyring, secrets, branch policies
- settings/ProjectSettings.svelte: per-project provider/model/worktree/sandbox
- settings/OrchestrationSettings.svelte: wake strategy, notifications, anchors
- settings/AdvancedSettings.svelte: logging, OTLP, plugins, import/export
Updated:
- ChatInput: radial context indicator (78% demo, color-coded arc),
4 popup menus (upload/context/web/slash), provider-gated icons
- SettingsDrawer: 6-category sidebar shell
- AgentPane: passes provider + contextPct to ChatInput
2026-03-20 04:50:57 +01:00
Hibryda
54d6f0b94a
fix(electrobun): remove message gap for gapless timeline lines, add user bubble margin
2026-03-20 04:40:00 +01:00
Hibryda
9a1195a964
feat(electrobun): diamonds, footer icons, gapless timeline
...
- Timeline dots → diamonds (rotated 45deg squares)
- Timeline lines: split into up/down segments, no gaps
- First message: no line up. Last: no line down.
- Footer icons: upload file, add context, browse web, slash commands
- Context state indicator (clock icon)
- Send button: paper plane icon (was arrow-up)
- Model label moved right (before divider)
2026-03-20 04:33:44 +01:00
Hibryda
8248d465df
feat(electrobun): redesign AgentPane to match Claude Code VSCode extension
...
Based on official Claude Code v2.1.79 webview CSS analysis:
- Timeline pattern: 7px dots + 1px vertical line, 30px content indent
- User messages: left-aligned inline blocks (not right-aligned bubbles)
- Tool calls: flat bordered grid boxes with 60px mask-fade clipping
- Floating input: absolute bottom:16px, crust bg, 8px radius, shadow
- ChatInput.svelte extracted: auto-resize textarea, peach send button
(26×26, 5px radius), focus ring with color-mix peach 12%
- Footer strip: model name + attach button + divider + send button
- Status strip: compact top bar with dot + status + model + cost
- 150px gradient fade at message area bottom
- fadeIn 0.3s animation on new messages
2026-03-20 04:26:31 +01:00
Hibryda
0225fdf3c9
feat: add rule 55 (deployment cleanup), commit flex terminal + double-subscribe fix
2026-03-20 04:09:46 +01:00
Hibryda
12d96bcb84
fix(electrobun): terminal flex-grows to fill space (was fixed 12rem)
2026-03-20 03:41:28 +01:00
Hibryda
05b3093945
fix(electrobun): remove double subscribe — CreateSession already auto-subscribes
2026-03-20 03:37:21 +01:00
Hibryda
621e1c5c8c
fix(agor-pty): implement real PTY resize (TIOCSWINSZ via portable-pty)
...
Was only updating cached dimensions without calling PTY resize.
Shell thought terminal was wrong size → double prompts, escape code leaks.
- Session stores master PTY handle (Arc<Mutex<Box<dyn MasterPty>>>)
- resize() calls master.resize(PtySize) → issues TIOCSWINSZ
- Reader task no longer owns master handle (uses cloned reader only)
2026-03-20 03:29:53 +01:00
Hibryda
0f7024ec8f
fix(electrobun): copy pty-client locally, fix import path for Bun bundler
2026-03-20 03:23:52 +01:00
Hibryda
4676fc2c94
feat(electrobun): wire PTY daemon into terminal tabs via Electrobun RPC
...
- Bun process connects to agor-ptyd via PtyClient (5 retries, exponential backoff)
- RPC bridge: 5 request handlers (create/write/resize/unsubscribe/close)
- Daemon output forwarded to WebView as pty.output messages (base64 passthrough)
- Terminal.svelte: real PTY sessions via RPC instead of echo mode
- Shared RPC schema at src/shared/pty-rpc-schema.ts
- Fixed pty-client.ts protocol: base64 string for data (was number array)
- TerminalTabs passes sessionId to Terminal component
2026-03-20 03:20:13 +01:00
Hibryda
f3456bd09d
feat(agor-pty): complete PTY daemon — auth, sessions, output fanout
2026-03-20 03:10:49 +01:00
Hibryda
4b5583430d
feat: agor-pty crate — standalone PTY multiplexer daemon (Phase 1 WIP)
...
New crate at agor-pty/ (standalone, not in workspace — portable to Tauri/Electrobun):
- Rust daemon (agor-ptyd) with Unix socket IPC, JSON-framed protocol
- PTY session lifecycle: create, resize, write, close, output fanout
- 256-bit token auth, multi-client support, session persistence
- TypeScript IPC client at clients/ts/pty-client.ts (Bun + Node.js)
- Protocol: 9 client messages, 7 daemon messages
- Based on tribunal ruling (78% confidence, 4 rounds, 55 objections)
WIP: Rust implementation in progress (protocol.rs + auth.rs done)
2026-03-20 03:04:36 +01:00
Hibryda
e8132b7dc6
fix(electrobun): rewrite terminal collapse — blur fix, tab bar as bottom divider
2026-03-20 02:41:07 +01:00
Hibryda
9edece0dc7
fix(electrobun): terminal collapse — tab bar as divider, messages fill freed space
2026-03-20 02:36:11 +01:00
Hibryda
3d1cd0028f
fix(electrobun): tab bar at bottom, collapse slides down naturally
2026-03-20 02:29:49 +01:00
Hibryda
cb4fe5bd4a
fix(electrobun): collapse animation + z-index fix, gitignore .tribunal/
2026-03-20 02:25:50 +01:00