feat(desktop): add Bazel-only Loopal Desktop workbench#205
Merged
Conversation
Build a conversation-first Electron workbench around the supervised Loopal CLI sidecar, with typed IPC, sessions, MetaHub federation, settings, skills, plugins, and worktree-aware launch. Add Bazel-only build, unit, coverage, real Host/provider E2E, staging smoke, packaging, and reorganized repository ownership.
Enable the Windows runfiles tree required by rules_js and rules_ts launchers so TypeScript validation can locate its entry point.
Disable only the rules_ts attribute validator on Windows, where its js_binary launcher cannot resolve the generated entry point. The tsc no-emit action still runs on every platform, while Linux and macOS retain the additional configuration validation.
Run the workspace TypeScript 5.9.3 binary through a Bazel js_run_binary action and preserve the Desktop tsconfig no-emit check. This avoids the rules_ts Windows launcher path bug without weakening the Windows build.
Compare the lock owner as a string slice and scope Unix-only imports and parameters to their platform. This preserves the file-lock behavior while keeping the Windows build warning-free.
Avoid Result equality because std::io::Error is not comparable; only compare lock owner contents after a successful read.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Ship the first production-shaped Loopal Desktop: a conversation-first Electron workbench that bundles the Bazel-built
loopalCLI as its supervised runtime sidecar. This establishes a typed Desktop/Host boundary, Session-first information architecture, MetaHub Federation, deterministic provider fixtures, and repository ownership that can scale toward a full Loopal-powered workbench.What changed
Desktop architecture and runtime
apps/desktop, split into base, shared, platform, main, preload, and feature-owned workbench layers.loopalDesktopfacade, while Main owns dialogs, process handles, credentials, and OS access.loopal desktop serve --parent-pid ... [--resume ...]sidecar entry point with versioned startup phases, bounded IPC framing, cancellation/control lanes, generation-aware restart, authoritative resync, and stale-generation rejection.app.asar; add Bazel targets for development, staging smoke, and platform packaging.Conversation-first product
Federation and MetaHub
Settings, Skills, Plugins, and MCP
~/.loopal/settings.json, preserving unknown fields and redacting credentials in responses.Bazel and repository layout
loopal-workspacefor bounded workspace/Worktree operations andloopal-mock-llmfor deterministic Anthropic, OpenAI Responses, OpenAI-compatible, and Google streaming scenarios.//:loopalbinary target.Validation
bazel build //...bazel test //... --config=ci --test_output=errors— 103/103 targetsbazel build //... --config=clippybazel build //... --config=rustfmtbazel test //apps/desktop:unit— 651 testsbazel test //apps/desktop:coverage— 95.17% statements, 90.40% branches, 94.85% functions, 96.55% linesbazel test //apps/desktop:e2e— fake Electron suitebazel test //apps/desktop:e2e_host— real Loopal Host suitebazel test //apps/desktop:e2e_llm_backend --nocache_test_results— 72/72 real provider-boundary tests, no retriesbazel test //apps/desktop:staging_smoke -c opt --nocache_test_resultsbazel build //apps/desktop:dist -c optReviewer and migration notes
>=22.12 <23is required for dependency resolution. Use Bazel labels rather than invoking Vite, Vitest, Playwright, or electron-builder directly.protocol_version = 1, unknown fields rejected, 64 MiB frame cap).docs/repository-layout.md.