* 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
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.
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
* feat(workspace): add Share modal in workspace menu
* feat(workspace): share workspace from session view
* feat(workspace): store OpenWork token per workspace
* feat(workspace): scope OpenWork sharing via /w/:id mounts
Type / at the start of an empty input to trigger a command picker popup.
Commands are fetched from the OpenCode SDK (command.list()) and displayed
with fuzzy filtering via fuzzysort. Keyboard navigation (arrows, tab,
enter, escape) works like the existing @-mention popup.
Selecting a command inserts /<name> into the editor so the user can
add arguments. On submit, text starting with / is detected and routed
through session.command() instead of session.promptAsync().
Changes:
- types.ts: add SlashCommandOption type and command field on ComposerDraft
- composer.tsx: slash detection, popup UI, keyboard nav, command selection
- session.tsx: pass listCommands prop through to Composer
- app.tsx: add listCommands(), route command drafts via session.command()
- scripts/release/prepare.mjs: bump, lockfile, review, commit, tag
- scripts/release/ship.mjs: push tag + dev, print GHA URLs
- Both support --dry-run for safe testing
- Add pnpm aliases: release:prepare, release:ship, etc.
The publish-npm job now depends on release-openwrk-sidecars so the
openwrk-vX.Y.Z GitHub release exists before 'pnpm --filter openwrk
publish' runs. Uses always() with explicit result checks so the job
still runs when sidecars are skipped (publish_sidecars=false).
- Remove inline todo list from top of message scroll area
- Add collapsible todo panel docked above the composer (Codex-style)
- Collapsed: summary line with task count, click to expand
- Expanded: full task list with max-height scroll
- Fix 'Jump to latest' button to appear at bottom-right instead of center
- Move tasks/workspaces to left sidebar, automations/skills/apps to right
- Rename Sessions to Tasks throughout
- Add + button on workspace hover for new task creation
- Empty state transforms to '+ New task' on hover
- Make selected button variant black/dark grey for clear contrast