feat: ship headless follow-up capabilities - #38
Conversation
There was a problem hiding this comment.
Pull request overview
This PR rolls up the “headless follow-up” work across protocol, client, web, and desktop layers by adding revision-gated file writes, a full host capability explorer, and an encrypted offline projection cache (including IPC plumbing) to improve offline startup and reduce data-loss/conflict risk.
Changes:
- Adds projection cache IPC channels with strict payload validation and size bounds, plus encrypted desktop persistence and preload/IPC wiring.
- Introduces revision-pinned file editing/saving in the web Files pane, including conflict handling and action availability gating.
- Adds a Settings “Host capabilities” explorer that renders the full decoded catalog with safe metadata hygiene and clearer waiting/unavailable states.
Reviewed changes
Copilot reviewed 34 out of 34 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| packages/protocol/test/desktop-ipc.test.ts | Adds boundary tests for projection-cache IPC payload validation and size/version constraints. |
| packages/protocol/src/desktop-ipc.ts | Defines projection-cache IPC request/response types, channels, and strict decoders. |
| packages/client/test/projection.test.ts | Adjusts projection cache save/drain expectations during dispose/flush. |
| packages/client/src/projection.ts | Ensures coalesced cache saves still drain even after disposal begins. |
| packages/client/src/projection-cache.ts | Centralizes MAX_PROJECTION_CACHE_BYTES via protocol export. |
| packages/client/src/desktop-runtime.ts | Awaits projection hydration earlier in desktop startup sequence. |
| packages/client/src/desktop-runtime-contracts.ts | Extends shell port contract with projection cache load/save. |
| apps/web/test/panes-live.test.ts | Adds/extends tests for revision-gated file writes in live inspector flows. |
| apps/web/test/panes-files.test.ts | Adds inspector-store draft/edit/save/conflict tests and controller write plumbing. |
| apps/web/test/live-settings-screen.test.ts | Tests catalog explorer inputs across waiting/unavailable/ready settings states. |
| apps/web/test/live-composer.test.ts | Tests hydration from shell projection cache and skipping saves when unavailable. |
| apps/web/test/catalog-explorer.test.ts | New tests for catalog explorer grouping, hygiene, and no truncation. |
| apps/web/src/platform/live-workspace.ts | Preserves cached host grouping via placeholder host rows when metadata is absent. |
| apps/web/src/platform/desktop-runtime.ts | Wires shell projection cache into controller via a ProjectionCacheStore adapter. |
| apps/web/src/features/settings/UnavailableSettingsWorkspace.tsx | Renders the catalog explorer in unavailable settings states when host identity is known. |
| apps/web/src/features/settings/SettingsWorkspace.tsx | Renders the catalog explorer in the ready settings workspace. |
| apps/web/src/features/settings/settings-presentation.ts | Implements catalog explorer state derivation with safe metadata filtering and grouping. |
| apps/web/src/features/settings/settings-presentation.test.ts | Adds tests for catalog explorer state derivation and state labeling. |
| apps/web/src/features/settings/LiveSettingsScreen.tsx | Threads derived catalog explorer input into settings workspaces. |
| apps/web/src/features/settings/live-screen-model.ts | Tracks catalog frame in ready state and derives explorer input for non-ready states. |
| apps/web/src/features/settings/CatalogExplorerBlock.tsx | New UI component to render catalog explorer groups/entries and non-ready states. |
| apps/web/src/features/session-runtime/live-runtime.ts | Tightens session attach behavior to require authoritative target-host binding. |
| apps/web/src/features/panes/model.ts | Adds fileWrite action availability to the inspector action model. |
| apps/web/src/features/panes/live-inspector.ts | Implements files.write availability gating and revision-pinned preview/save handling. |
| apps/web/src/features/panes/inspector-store.ts | Adds file drafts, edit/save/discard actions, and resolves save outcomes into UI state. |
| apps/web/src/features/panes/fixtures.ts | Updates fixture controller to support draft/save outcomes in sample mode. |
| apps/web/src/features/panes/FilesPane.tsx | Adds editor UI with Save/Discard and Ctrl/Cmd+S support plus conflict/error messaging. |
| apps/desktop/test/stores-lifecycle.test.ts | Adds tests for encrypted projection cache store behavior and concurrency serialization. |
| apps/desktop/test/lifecycle-runtime.test.ts | Ensures projection cache is created once post-readiness and reused across windows. |
| apps/desktop/test/ipc-lifecycle.test.ts | Adds IPC routing proof for projection cache load/save via the trusted runtime service. |
| apps/desktop/src/stores.ts | Adds ElectronProjectionCacheStore with safeStorage encryption + bounded ciphertext validation. |
| apps/desktop/src/preload.ts | Exposes projection cache IPC bridge methods with decode validation. |
| apps/desktop/src/lifecycle.ts | Instantiates and injects a single projection cache runtime into IPC runtimes. |
| apps/desktop/src/ipc.ts | Adds IPC handlers for projection cache load/save with strict request/response decoding. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: e307f9dc53
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Summary
Rolls the completed work from #35, #36, and #34 onto
mainwithout carrying the old feature branch history.Verification
pnpm checkThe broad desktop suite will run in CI on the repository-required Node 24 runtime.