Skip to content

OpenAgentic desktop app (Tauri) + wizard install step#192

Open
agentic-work wants to merge 1 commit into
mainfrom
desktop-app
Open

OpenAgentic desktop app (Tauri) + wizard install step#192
agentic-work wants to merge 1 commit into
mainfrom
desktop-app

Conversation

@agentic-work

@agentic-work agentic-work commented Jul 13, 2026

Copy link
Copy Markdown
Owner

Native macOS Tauri 2 + React desktop client for the OpenAgentic platform, in the openagentics.io green/glass design language. Thin client over the platform's shipped protocols — chat/code/flows plus a local-workspace bridge.

Surfaces

  • Chat — NDJSON streaming timeline, HITL approval sheets, crash-safe turn resume via the durable ring-buffer tail, session sidebar (rename/search).
  • Code — the agenticode agent bundled binary-only as a loopback-locked Tauri sidecar (openagentic edition); stream-json renderer with permission gates and diff cards. No agenticode source in this tree.
  • Flows — run + observe workflows; live NDJSON run log with async-poll fallback and optional run-input.
  • Local-executor bridge — platform chat gets read/write/list/search/run hands on a trusted workspace, behind a canonicalized-under-root Rust security boundary (component-wise, symlink-escape + new-file-write covered, 8 cargo path-safety tests).

Platform integration

  • Auth mints and keychains a user-bound oa_ API key; the login JWT is never persisted.
  • Surfaces stay mounted across rail switches (a running code turn survives tabbing away); keyboard shortcuts + command palette, offline banner with backoff, dock badge while streaming, and per-visibility modal key-gating so a backgrounded consent gate can't be resolved by a keystroke meant for the visible surface.
  • Wizard: install.sh stays TUI/CLI-first and gains a macOS Desktop app step that builds → validates → installs to /Applications → opens after the stack is healthy. PTY harness covers it (and fixes a pre-existing Node 26 + Ink keypress stall).
  • CORS for the Tauri webview is handled by (1) the wizard writing ALLOWED_ORIGINS=tauri://localhost,http://tauri.localhost and (2) the app's plugin-http transport sending no browser Origin header (so the API's !origin branch admits it). The shared fastify-config default also carries the origins for the factory used in tests.

Quality

Built subagent-driven: every task adversarially reviewed on a fresh agent + a whole-branch review. 297 desktop unit tests + 10 cargo tests green; app builds, installs to /Applications, and launches on macOS arm64. Each wire path (auth/chat/code/flows/local-executor) verified headlessly against a live stack.

Merge & review notes

  • Single clean commit — no proprietary content, no committed binaries (the agenticode sidecar + ripgrep are staged at build time into gitignored paths).
  • Interactive click-through checklist (sign-in, tool approval, kill-mid-turn resume, code edit, flows run, workspace hands) is tracked separately for manual QA.

🤖 Generated with Claude Code

Native macOS Tauri 2 + React desktop client for the OpenAgentic platform,
in the openagentics.io green/glass design language.

Surfaces:
- Chat: NDJSON streaming timeline, HITL approval sheets, crash-safe turn
  resume via the durable ring-buffer tail, session sidebar with rename/search.
- Code: the agenticode agent bundled binary-only as a loopback-locked sidecar
  (openagentic edition; nothing proprietary in this tree), stream-json render
  with permission gates and diff cards.
- Flows: run + observe workflows, live NDJSON run log with async-poll fallback.
- Local-executor bridge: platform chat gets read/write/list/search/run hands on
  a trusted workspace behind a canonicalized-under-root Rust security boundary.

Auth mints and keychains a user-bound oa_ API key (never persists the JWT).
Surfaces stay mounted across rail switches so a running turn survives; keyboard
shortcuts, command palette, offline banner, dock badge, and per-visibility modal
key-gating round out the UX.

Wizard: install.sh stays TUI/CLI-first and gains a macOS "Desktop app" step that
builds, validates, installs to /Applications, and opens the app after the stack
is healthy; PTY harness covers it (and fixes a pre-existing Node 26 + Ink
keypress stall).

CORS for the Tauri webview is handled by the wizard writing ALLOWED_ORIGINS
(tauri://localhost, http://tauri.localhost) plus the app's plugin-http transport
sending no browser Origin header; the shared fastify config default also carries
the origins for the factory used in tests.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@agentic-work

Copy link
Copy Markdown
Owner Author

Heads-up for maintainers, unrelated to this PR's code: the no-explicit-any ratchet (changed files, gate) job appears broken on the current runners. GitHub is force-running the pinned actions/checkout@v4/setup-node@v4 on Node 24 (Node 20 deprecation), and the ratchet's pinned @typescript-eslint/parser@7 fails to load there (TypeError: … reading 'BarBarToken' in typescript-estree), so eslint exits non-zero and xargs returns 123 the moment the job has any services/** file to lint — regardless of whether the file contains any.

Evidence: the file this PR originally tripped it on (services/openagentic-api/src/server.ts) has zero any type annotations, and lints clean (exit 0) under the same eslint@8.57.1 + parser@7 rule when a compatible typescript peer is present. So it's a toolchain-load failure in the gate, not a real violation. Likely fixes: bump the ratchet's @typescript-eslint/* to v8 (Node 24-compatible) and/or pin typescript in the temp install.

This PR sidesteps it by keeping its only runtime services/** change (a defense-in-depth CORS default in server.ts) out — the desktop CORS path relies on ALLOWED_ORIGINS + the no-Origin plugin-http transport instead — so the gate has no services/** non-test file to lint and passes.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant