Commit Graph

426 Commits

Author SHA1 Message Date
ben
366bc36d55 feat(agent-lab): multi-instance host + Agent Lab Toy UI (#504)
* feat(agent-lab): add instance manager CLI

* fix(server): block opencode permission replies for non-owners

* feat(toy-ui): add share + checkpoints

* feat(agent-lab): add entrypoints and scheduler sync

* feat(server): add agentlab automations and skill delete

* feat(toy-ui): add agent lab panels
2026-02-08 13:58:50 -08:00
Benjamin Shafii
4b0f8195ca chore: bump version to 0.11.34 2026-02-07 18:31:25 -08:00
Benjamin Shafii
c59ca5080d fix(app): stop sidebar refresh loop when baseUrl missing 2026-02-07 18:28:39 -08:00
Benjamin Shafii
186cd8bb47 chore: bump version to 0.11.33 2026-02-07 18:18:38 -08:00
Benjamin Shafii
a9ece9860b Revert "fix(app): fix memory leaks, environment compatibility, and error recovery (#493)"
This reverts commit 7989e1a064.
2026-02-07 18:17:25 -08:00
Benjamin Shafii
504cad09c3 fix(desktop): persist openwrk opencode auth
Write opencode basic-auth credentials to the openwrk data dir so the UI can reconnect after app relaunches when openwrk is still running.
2026-02-07 18:13:46 -08:00
Benjamin Shafii
39effc3d7f chore: bump version to 0.11.32 2026-02-07 18:02:00 -08:00
ben
b15e1f3550 revert: remove deploy ssh + owpenbot operator TUI (#502)
* Revert "feat(owpenbot): add operator TUI (#501)"

This reverts commit a48578d331.

* Revert "feat(openwrk): add deploy ssh adapter (#500)"

This reverts commit 4ee56922a1.

* fix(owpenbot): guard health timer cleanup

Keep owpenbot TypeScript builds green after reverting the operator TUI by avoiding clearInterval(null).
2026-02-07 17:51:30 -08:00
ben
a48578d331 feat(owpenbot): add operator TUI (#501)
* fix(owpenbot): guard health timer cleanup

Avoid calling clearInterval with a null timer so TypeScript builds stay green.

* feat(owpenbot): add operator TUI

Add a TTY-first interactive menu that talks to the owpenbot health API (direct or via openwork-server proxy) for QR, token, groups, and bindings management.

* chore(desktop): refresh Cargo.lock

Update the lockfile to match the current desktop crate version so Linux CI can run with --locked.

* fix(owpenbot): require client token for proxy TUI

When using openwork-server proxy mode, include a Bearer client token for /owpenbot/health while still supporting host-token for admin endpoints.
2026-02-07 17:19:07 -08:00
ben
4ee56922a1 feat(openwrk): add deploy ssh adapter (#500)
* 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.
2026-02-07 17:09:43 -08:00
Benjamin Shafii
4aff31862c chore(desktop): sync Cargo.lock version
Keep the Tauri desktop lockfile consistent with the current OpenWork version.
2026-02-07 16:20:16 -08:00
Benjamin Shafii
da5e267133 chore(desktop): isolate dev app state
Run tauri dev with a separate bundle identifier and OPENWRK_DATA_DIR so dev and production can run side-by-side without clobbering app data or openwrk state.
2026-02-07 16:20:09 -08:00
Benjamin Shafii
a9bf20d4e1 chore(debug): tie workspace switch logs to developer mode
Use the existing Developer Mode toggle to enable WSDBG tracing instead of a separate localStorage flag.
2026-02-07 15:57:59 -08:00
Benjamin Shafii
353a4e2e15 chore(debug): add workspace switch tracing
Gate verbose logs behind openwork.debug.workspaceSwitch to capture timing, session list counts, and sidebar refresh behavior during remote->local switches.
2026-02-07 15:55:29 -08:00
Benjamin Shafii
0aaa9c19dc fix(app): reduce sidebar session refresh thrash
Limit sidebar session list payload and avoid refreshing remote workspaces when only local engine auth/baseUrl changes (common on remote->local switches).
2026-02-07 15:50:28 -08:00
ben
f9a2809f96 feat: proxy owpenbot via openwork-server (#499)
* 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.
2026-02-07 15:44:12 -08:00
Benjamin Shafii
be366f4a45 fix(app): scope session listing to workspace
Avoid fetching the global session list on workspace switches by passing directory/roots to session.list; reduces UI hangs and memory churn.
2026-02-07 15:43:29 -08:00
IanShaw
7989e1a064 fix(app): fix memory leaks, environment compatibility, and error recovery (#493)
* fix(app): 修复内存泄漏、环境兼容性和错误恢复

- 新增 session 缓存清理机制,防止长时间运行内存无限增长
  - pruneSessionCaches: 按有效 session 列表裁剪缓存
  - removeSessionCaches: 删除单个 session 时精确清理关联数据
  - clearSessionCaches: workspace 切换/断连时全量清空
  - reloadDetectionSet 设置 5000 上限防止膨胀
- AbortSignal.timeout polyfill 兼容旧版 WebView/Electron
  - 健康检查完成后清理定时器避免泄漏
- MediaQueryList 旧版 API 降级兼容 (addListener/removeListener)
- 顶层 ErrorBoundary 防止未捕获渲染错误导致白屏

* fix(app): simplify reload detection and harden external links

---------

Co-authored-by: Benjamin Shafii <ben@prologe.io>
2026-02-07 15:15:37 -08:00
ben
b53d791bea feat(app): redesign tool call steps UI for cleaner, more compact display (#498)
- Replace flat step list with compact single-line rows featuring status dots,
  tool-type-specific icons (read/edit/search/terminal/etc), and truncated details
- Add classifyTool() for semantic tool categorization and icon mapping
- Improve summarizeStep() to extract filenames, commands, and patterns
  instead of dumping raw output with line numbers
- Replace bordered card container with clean left-border-line expand panel
- Show step count badge in collapsed state ('N steps')
- Add running state indicator with pulse animation
- Use ChevronRight rotate animation instead of ChevronDown for expand/collapse
- Extract StepsContainer as reusable component for both cluster and inline steps
- Filter out raw file content markers (<file> 00001|) from detail text
- Parse 'Success. Updated...' messages to show just the filename
2026-02-07 14:56:36 -08:00
Benjamin Shafii
744d1277e8 chore: bump version to 0.11.31 2026-02-07 14:55:01 -08:00
ben
10213763a1 fix(app): restore Plugins tab in dashboard sidebar (#497)
The Plugins nav item was dropped during the DLS alignment refactor (bd6062c).
The PluginsView component and tab routing were still wired correctly --
only the sidebar and mobile bottom-nav buttons were missing.

- Add Plugins button to right sidebar (between Skills and Apps)
- Add Plugins button to mobile bottom nav (5-col grid)
- Import Cpu icon from lucide-solid (same icon used before removal)
2026-02-07 14:11:41 -08:00
Benjamin Shafii
c9e6aee058 chore: bump version to 0.11.30 2026-02-07 13:10:49 -08:00
TY
8e42fc549b fix: allow data:image/* URLs in markdown renderer (#491)
The isSafeUrl function was blocking all data: URLs including
data:image/jpeg;base64,... returned by AI image generation models.
This caused markdown images like ![image](data:image/jpeg;base64,...)
to render with empty src, showing only the alt text 'Image'.

Now data:image/* URIs are whitelisted while other data: schemes
(e.g. data:text/html) remain blocked to prevent XSS.

Co-authored-by: taoyuan <taoyuan@gmail.com>
2026-02-07 13:06:06 -08:00
TY
6120ad5b56 fix: prevent Enter key during IME composition from triggering actions (#492)
When using an IME (e.g. Chinese, Japanese, Korean input methods), pressing
Enter to confirm character conversion was incorrectly triggering form
submissions, message sends, and other actions.

Changes across 10 files:

- composer.tsx: triple-check IME state (event.isComposing + manual
  compositionstart/end flag + keyCode === 229) with addEventListener
  binding to work around SolidJS event delegation limitations
- model-picker-modal.tsx: guard Enter for model selection
- question-modal.tsx: guard Enter for option/custom input (2 handlers)
- rename-session-modal.tsx: guard Enter for session rename
- rename-workspace-modal.tsx: guard Enter for workspace rename
- dashboard.tsx: guard Enter for workspace/session list items (3 handlers)
- session.tsx: guard Enter for workspace/session list items (3 handlers)
- proto-v1-ux.tsx: guard Enter for expandable section toggle
- skills.tsx: guard Enter for skill card activation
- onboarding.tsx: guard Enter for directory path input

Co-authored-by: taoyuan <taoyuan@gmail.com>
2026-02-07 13:03:03 -08:00
ben
f3da381606 feat: minimal container sandbox + server tokens + toy UI (#494)
* 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
2026-02-07 13:01:15 -08:00
ben
cba77fa04f fix(owpenbot): lazy WhatsApp onboarding and REST pairing (#496)
- Default WhatsApp to disabled unless creds/config enable it\n- Never print QR codes from bridge startup (printQr=false)\n- Lazy-load WhatsApp adapter to avoid Bun ws warnings when disabled\n- Add REST endpoints: GET /whatsapp/qr, GET/POST /config/whatsapp-enabled\n- Only print CLI command hints in interactive TTY mode
2026-02-07 13:01:06 -08:00
ben
541d7ff392 fix(headless): pick random owpenbot health port by default (#495)
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.
2026-02-07 11:21:09 -08:00
Benjamin Shafii
a0d5021de8 chore: update Cargo.lock for 0.11.29 2026-02-07 00:05:48 -08:00
Benjamin Shafii
25200fa0e3 chore: bump version to 0.11.29 2026-02-07 00:04:38 -08:00
ben
b2a006f338 fix(workspace): avoid UI stalls when switching (#489) 2026-02-06 23:40:40 -08:00
Benjamin Shafii
ffe6fee8cb feat(landing): add enterprise page and booking link 2026-02-06 21:26:55 -08:00
Benjamin Shafii
85005c1127 chore: bump version to 0.11.28 2026-02-06 21:20:19 -08:00
ben
265ed971b5 fix(owpenbot): make token saves fast and resilient (#488)
* fix(owpenbot): make token saves fast and resilient

Persist Telegram/Slack tokens even when owpenbot is offline, bound adapter restarts to avoid long hangs, and refresh UI status with apply warnings.

* chore: update Cargo.lock

Keep desktop Cargo.lock in sync with the crate version so CI cargo --locked passes.
2026-02-06 21:18:45 -08:00
Benjamin Shafii
7b8e7b0352 chore: bump version to 0.11.27 2026-02-06 18:57:45 -08:00
ben
a898405889 chore(plugins): drop opencode-browser from suggested defaults (#487) 2026-02-06 18:56:06 -08:00
Benjamin Shafii
bf5a0bff86 fix(composer): restore agent dropdown
Bring back the composer agent picker dropdown wired to the SDK-backed agent list, so users can select an agent without relying on @mentions.
2026-02-06 18:42:28 -08:00
Benjamin Shafii
7026ca5d73 fix(workspaces): make workspace switches less disruptive
Keep the dashboard stable when switching workspaces by preventing implicit session navigation during connect/reconnect flows. Delay the switch overlay to avoid flashes on fast switches and reuse an existing local host when bouncing remote<->local.
2026-02-06 18:28:45 -08:00
Benjamin Shafii
6f98092b0c chore: bump version to 0.11.26 2026-02-06 16:58:06 -08:00
Benjamin Shafii
267082ab48 fix(workspaces): scope sidebar tasks and restore local switching
Filter sidebar sessions by workspace root so local workspaces don't show identical task lists. Also start the local host engine when switching from a remote workspace back to local, and hide the session count badge to prevent header overflow.
2026-02-06 16:56:29 -08:00
Benjamin Shafii
311d862e87 chore: bump version to 0.11.25 2026-02-06 14:53:26 -08:00
ben
9b87ccaba7 feat: multi-workspace hosting + workspace-scoped tasks sidebar (#485)
* feat(server): expose all workspaces and support mounted baseUrl

* feat(ui): keep tasks visible across workspaces

* feat(desktop): default engine runtime to openwrk

* feat(owpenbot): route chats by directory bindings
2026-02-06 14:49:17 -08:00
Benjamin Shafii
7a26fd29f1 chore: bump version to 0.11.24 2026-02-06 12:53:59 -08:00
Benjamin Shafii
d6f7697086 chore: bump version to 0.11.23 2026-02-06 10:38:33 -08:00
Benjamin Shafii
609ca9c5e2 chore(build): default OpenCode to latest
Stop pinning OpenCode in package metadata and resolve the latest release during sidecar bundling/runtime, while still allowing OPENCODE_VERSION to pin for reproducible builds.
2026-02-06 10:27:40 -08:00
IanShaw
a809bb95fd fix: compress image attachments before sending to prevent UI freeze (#482)
Images are now compressed via canvas resize (max 2048px) + JPEG transcode
(quality 0.82, target <1.5MB) before base64 encoding. Uses OffscreenCanvas
when available to avoid blocking the main thread. Adds a post-encoding size
pre-check to show an explicit error instead of silently failing.

Fixes #481
2026-02-06 09:30:48 -08:00
Benjamin Shafii
d36a630096 chore: bump version to 0.11.22 2026-02-06 08:38:06 -08:00
Benjamin Shafii
6cdeacb982 feat(automations): add run action and human schedules 2026-02-06 08:31:25 -08:00
Benjamin Shafii
ed1aed068f fix(ui): improve settings contrast and session sidebar state 2026-02-06 08:31:19 -08:00
ben
081bcad71e fix(session): remove duplicate new messages indicator (#480) 2026-02-06 07:45:16 -08:00
ben
0f11673c89 feat(config): move workspace settings into Config page (#483) 2026-02-06 07:42:10 -08:00