Files
AgentCompany/docs/03-research-analyst-findings.md
T

4.8 KiB

Phase 2: ResearchAnalyst Findings

Sources

Electron Security Requirements

From current Electron guidance, AgentCompany must treat desktop privilege as a first-order security boundary:

  • load only local packaged content in the main renderer
  • keep nodeIntegration disabled
  • keep contextIsolation enabled
  • keep renderer sandboxing enabled where feasible
  • expose a minimal preload API through contextBridge
  • validate IPC sender and payloads
  • restrict navigation and new window creation
  • avoid file:// in production and prefer a custom protocol
  • define a restrictive CSP
  • never expose shell or filesystem primitives wholesale to renderer code

Runtime Version Decision

  • Initial architecture research targeted Electron 41.0.0.
  • Build verification on March 12, 2026 found better-sqlite3@12.6.2 failing native rebuild against Electron 41.0.0 / Node 24.14.0.
  • The implementation baseline is therefore pinned to Electron 39.8.0 for now.

Why this downgrade is deliberate:

  • Electron 39.8.0 is still a stable release line as of March 12, 2026.
  • It preserves the existing SQLite storage implementation without forcing a same-phase storage rewrite.
  • The downgrade is narrower in scope than replacing persistence with a different driver while the product shell, IPC, and orchestration layers are still being completed.

Upgrade condition:

  • Revisit Electron 41.x after the SQLite layer is migrated to a compatible runtime path or the upstream native module supports the newer V8 ABI cleanly.

Secret Storage Findings

  • safeStorage is main-process only and uses OS-backed cryptography semantics.
  • macOS: keychain-backed, app-specific protection
  • Windows: DPAPI-backed, user-scope protection
  • Linux: backend varies; it can degrade to basic_text

Product implication:

  • AgentCompany should use safeStorage when encryption is available.
  • On Linux, the app must surface the selected backend and explicitly fall back to an app-local encrypted vault when the selected backend is basic_text or unavailable.

Background Processing Findings

  • utilityProcess.fork() provides a Chromium-managed child process with Node enabled and message ports available.
  • It is appropriate for orchestration work that should not block the renderer and should stay separate from window lifecycle concerns.

Product implication:

  • Use a utility process for the orchestration core, run queue, workspace locks, and connector process supervision.
  • Keep UI projection in renderer, privileged OS coordination in main, and long-running execution in the utility process.

Packaging And Updater Findings

  • electron-builder supports cross-platform packaging with:
    • macOS: dmg plus zip
    • Windows: nsis
    • Linux: AppImage and optional deb/rpm variants
  • Auto-update via electron-updater relies on generated metadata files such as latest.yml.
  • macOS auto-update requires a signed app.
  • Windows signing is also supported and should be treated as a release requirement.

Product implication:

  • Package targets should default to DMG/ZIP, NSIS, and AppImage.
  • Update checks must be opt-in/disableable by user setting, as required by the PRD.
  • Signing configuration should be environment-driven and absent values must not block local development.

Desktop UX Research Conclusions

  • Desktop-first operators need split-pane information density, not a marketing-site layout.
  • Keyboard navigation, command surfaces, and context-preserving utility drawers matter more than route purity.
  • File reveal, open folder, drag/drop, and copy path are standard desktop affordances and should be first-class actions.

Connector Research Conclusions

  • The current Paperclip repo already contains strong local connector patterns for Codex, Claude Code, Gemini CLI, and OpenCode.
  • Kimi Code is a real official CLI offering, but its desktop integration contract requires explicit treatment instead of assuming parity with the existing adapters.

Implementation decision:

  • Reuse the established adapter contract ideas from current Paperclip for supported local connectors.
  • Represent advanced capability differences explicitly in the connector registry and task/run UX.