* fix(headless): align openwrk compile path with OpenTUI Solid
Use the upstream @opentui/solid build plugin and preload/tsconfig wiring so compiled openwrk binaries keep TUI runtime compatibility instead of emitting broken React runtime behavior.
* ci: run openwrk checks on feature branch pushes
Trigger CI for fix/openwrk-react-shim and add an openwrk binary build job so bundling regressions are caught before merging to dev.
* ci: relax binary validation to runtime smoke
Use openwrk --version/--help checks instead of grepping embedded strings so the branch CI validates bundling without false failures from defensive error text.
* fix(desktop): build openwrk sidecar via headless build script
Route desktop sidecar preparation through packages/headless/script/build.ts so OpenTUI plugin settings are applied consistently and Linux CI no longer compiles openwrk with incompatible JSX defaults.
* fix(headless): disable compiled-binary TUI by default
Avoid the runtime 'React is not defined' crash in compiled openwrk builds by auto-disabling TUI in bunfs binaries and falling back to plain output.
* fix(headless): keep TUI default and harden non-TUI fallback
Default start to TUI on tty, keep serve/non-tty as plain mode, and add a bundled Solid transform path for compiled binaries while handling TUI startup failures with a plain-output fallback.
* fix(headless): warn instead of crash on opencode version mismatch for external binaries
When the desktop app spawns openwrk with --opencode-bin pointing to a
bundled binary, openwrk resolves the expected version from the latest
GitHub release. If the bundled binary is even slightly behind, the
strict assertVersionMatch throws and the daemon exits immediately,
leaving users unable to start sessions.
Downgrade the check to a warning for external (explicitly provided)
binaries so the daemon can proceed. The desktop app already validates
the binary via engine_doctor before passing it.
Fixes#121, related to #97, #98
* fix(app): stop StatusBar from overlapping sidebar and remove duplicate Settings buttons
The StatusBar used a fixed position overlay that covered sidebar Settings
buttons. Move it into document flow inside <main> so it no longer overlaps.
Remove the redundant Settings buttons from both sidebars — the StatusBar
gear icon already provides access to Settings.
macOS/Windows builds code-sign bundled sidecars after versions.json is generated, changing file bytes and breaking sha256 verification. Keep sha256 verification for Linux bundles.
* feat(openwrk): add deploy ssh adapter
Add an SSH deploy command that bootstraps openwrk on a remote Linux host via the npm tarball, optionally syncs workspace config, and starts the host under nohup with a connect artifact for pairing.
* chore(desktop): refresh Cargo.lock
Update the lockfile to match the current desktop crate version so Linux CI can run with --locked.
* feat: proxy owpenbot via openwork-server
Unify client surface by routing owpenbot through /owpenbot/* (+ /w/:id/owpenbot/*), and move QR/token flows off interactive CLI calls. Sandbox mode keeps owpenbot internal (no extra published port) while preserving health + config via the edge.
* chore(desktop): refresh Cargo.lock
Update the Tauri crate lockfile so linux CI can run with --locked.
* feat(server): add scoped tokens, inbox/outbox, toy UI, and auth hardening
- TokenService with file-based persistence (tokens.json)
- /tokens CRUD (host auth), /whoami (client auth)
- Bearer token auth accepting OPENWORK_TOKEN or scoped tokens
- POST /workspace/:id/inbox (multipart upload)
- GET /workspace/:id/artifacts, /workspace/:id/artifacts/:id
- Toy UI at /ui with SSE, prompt send, inbox upload, outbox download
- Extended GET /capabilities with schemaVersion, serverVersion, approvals info
- Updated README with all new endpoints and auth model
* feat(headless): add sandbox runtime with Docker and Apple container backends
- --sandbox none|auto|docker|container CLI flag
- --sandbox-image, --sandbox-persist-dir, --sandbox-mount options
- Mount security: allowlist, blocked patterns, symlink resolution
- Docker backend: workspace/persist volumes, sidecar staging, entrypoint
- Apple container backend: --mount type=bind for ro mounts
- Sandbox mode proxies all OpenCode access through openwork-server
- Proxy health check (waitForHealthyViaProxy) avoids SDK auth issues
- Sandbox-specific check suite (runSandboxChecks) for --check mode
- Non-fatal verifyOpenworkServer in sandbox mode for version mismatches
- Updated README with sandbox docs and mount security
* feat(packaging): add Docker/docker-compose PaaS packaging
- Dockerfile (node:22-bookworm-slim, installs openwrk via npm)
- docker-compose.yml with workspace and data volumes
- README with usage instructions
* fix(headless): define sandbox owpenbot internal health port
Avoid hard-coding 3005 so owpenbot health checks don't fail when the default port is already in use. Still supports explicit --owpenbot-health-port / OWPENBOT_HEALTH_PORT overrides.