* feat(den): add org-managed llm provider library
Let Den admins curate shared providers and models with encrypted credentials, then let the app connect through the existing add-provider flow. This keeps org-wide model access consistent without requiring per-user OAuth setup.
* docs(den): prefer longer db encryption keys
* fix(den): pass db encryption key through local dev
---------
Co-authored-by: src-opn <src-opn@users.noreply.github.com>
* feat(app): add React markdown and transcript parity
Render React session messages with a proper markdown stack, Solid-style user and assistant layouts, and structured tool-call cards so the React path matches the existing transcript experience more closely.
* feat(app): drive React sessions through useChat streaming
Move the React session path to a custom useChat transport backed by the existing OpenCode event stream so transcript state, sending, and streaming are owned by React instead of snapshot polling.
* fix(app): remount React session island per chat
Reset the React session surface when the workspace or session changes so an in-flight useChat stream from one chat cannot continue writing into another chat after a switch.
* fix(app): scope React stream deltas to one session
Reject message.part.delta updates that do not belong to the active session so concurrent OpenCode event streams cannot interleave transcript text across chats in the React session surface.
* fix(app): cache React transcript state per session
Persist streamed UI messages in TanStack query cache per workspace/session so revisiting a running chat shows the last known partial transcript instead of starting empty on remount.
* feat(app): keep React session state in shared sync cache
Move React session transcript ownership out of the mounted chat view by sharing one query client across islands and applying workspace event updates into per-session query cache, mirroring the global sync pattern used by OpenCode.
* fix(app): keep React session sync alive across chat switches
Mount the workspace-scoped React session sync above the per-chat session island so switching chats no longer tears down the event subscription that keeps transcript state updating in the background.
* Revert "fix(app): keep React session sync alive across chat switches"
This reverts commit 15f37a09c1.
* Revert "feat(app): keep React session state in shared sync cache"
This reverts commit 49df59d6ef.
* fix(app): keep React session streams alive across switches
Move React session streaming state into a shared app-level runtime backed by one query client and a workspace-scoped event sync reducer so leaving and returning to a running session restores the current transcript instead of showing an empty pane or leaking between chats.
* fix(app): preserve beginning of streamed text across session switches
Create text parts on first delta arrival instead of silently dropping deltas that arrive before the part shell exists, and ensure the message shell is present before appending any delta. This fixes the bug where switching away from a streaming session and coming back would show only later lines, missing the beginning of the response.
* fix(app): preserve streamed text when re-selecting a busy session
When switching back to a session that is still streaming, the server snapshot returns empty text for in-progress parts. The reconcile call in selectSession was overwriting the locally accumulated text with that empty snapshot. Now both the Solid and React paths preserve the longer local text when the session status is busy.
Shift startup/loading control to TS with explicit boot phases, cached->live sidebar transitions, and startup trace markers while reducing Rust-side blocking in workspace and orchestrator status paths to improve macOS responsiveness during boot and workspace switching.
Made-with: Cursor
* feat(server): add workspace session read APIs
Expose workspace-scoped session list, detail, message, and snapshot reads so the client can fetch session data without depending on activation choreography.
* feat(app): route mounted session reads through OpenWork APIs
Use the new workspace-scoped session read endpoints for mounted OpenWork clients so the current frontend stops depending on direct session proxy reads for list, detail, message, and todo loading.
* feat(app): add React read-only session transcript
Introduce a feature-gated React island for the session transcript so we can replace the session surface incrementally while keeping the Solid shell intact.
* feat(app): add React session composer surface
Extend the feature-gated React session island to own its draft, prompt send, stop flow, and snapshot polling so the session body can evolve independently from the Solid composer.
* feat(app): add React session transition model
Keep the React session surface stable during session switches by tracking rendered vs intended session state and exposing a developer debug panel for render-source and transition inspection.
* docs(prd): add React migration plan to repo
Copy the incremental React adoption PRD into the OpenWork repo so the migration plan lives next to the implementation and PR branch.
* docs(prd): sync full React migration plan
Replace the shortened repo copy with the full incremental React adoption PRD so the implementation branch and product plan stay in sync.
* feat(desktop): add React session launch modes
Add dedicated Tauri dev and debug-build entrypoints for the React session path and honor a build-time React session flag before local storage so the alternate shell is easy to launch and reproduce.
* fix(app): fall back to legacy mounted session reads
Keep the new app working against older OpenWork servers by falling back to the original mounted OpenCode session reads when the workspace-scoped session read APIs are unavailable.
* Revert "fix(i18n/zh): cleanups to Chinese translations (#1341)"
This reverts commit 03ee1f2f0e.
* Revert "feat(i18n): add Thai language + missing translations for all other locales (#1339)"
This reverts commit db0f94e36a.
* Revert "feat(i18n): extract en translations — session area (#1249)"
This reverts commit 3271af47b4.
* Revert "feat(i18n): extract en translations — pages (#1250)"
This reverts commit e006acade6.
* Revert "feat(i18n): extract en translations — context/lib/misc (#1251)"
This reverts commit c349413f09.
* fix(docs): restore migrated share skill links
Republish the example skill bundles on share.openworklabs.com so the docs point at live imports again, and align share bundle examples with the current publisher host.
* fix(server): use canonical shared bundle data urls
Rebuild trusted share fetch URLs to the share service's canonical /b/:id/data endpoint and cover the path with the live provider-config-helper bundle URL.
- Add solid-devtools Vite plugin with locator (jsx/component locations) and
@solid-devtools/overlay, loaded before render in dev only.
- Treat baseline message fetch as complete for empty transcripts so
ensureSessionLoaded does not refetch on every prefetch/subagent ensure.
- When streaming delivers the first rows while non-idle, sync the batched
message list immediately so the blueprint empty state does not flash.
Made-with: Cursor
* feat(ui): add shared seeded paper gradients
Centralize the Paper mesh and grain wrappers so React and Solid apps can reuse the same deterministic seed-based visuals without repeating shader config. Add a standalone demo surface and update existing consumers so the shared package is easier to validate and evolve.
* fix(ui): resolve shared package from source
Point the shared UI package exports at source files so Next builds do not depend on a prebuilt dist directory. Add Next transpilation for @openwork/ui in Landing and Den Web so monorepo and Vercel builds resolve the package consistently.
---------
Co-authored-by: src-opn <src-opn@users.noreply.github.com>
Developer mode already emitted useful workspace/session/perf logs, but they
mostly lived in the console and only a subset made it into exportable debug
artifacts. That made it hard to collect a clean report from users when chasing
racy workspace bugs.
Add a shared dev-log buffer, feed it from the existing app/workspace/session
and perf debug emitters, surface the log stream in Settings > Debug, and make
it copyable/exportable alongside the existing runtime debug report.
Break assistant text into stable blocks so streaming stays responsive and tool-created files surface as openable transcript cards instead of getting buried in prose.
* refactor(workspace): keep selection separate from activation
* refactor(session): create tasks in an explicit workspace
* refactor(session): address runtime actions by workspace
The server compares session.directory with strict equality, but call sites
could silently pick the wrong path formatter (normalizeDirectoryQueryPath
vs toSessionTransportDirectory) — producing forward-slash paths on Windows
where the server stores native backslashes.
Changes:
- Add TransportDirectory branded type so the compiler rejects raw strings
where a transport-formatted directory is expected.
- Fix connections/store.ts: switch path discovery from normalizeDirectoryQueryPath
to toSessionTransportDirectory — this value feeds mcp.status/disconnect calls
that use the same exact-match semantics (latent Windows bug).
- Fix workspace.ts: remote directory discovery now goes through
toSessionTransportDirectory (caught by the branded type at compile time).
- Mark normalizeDirectoryQueryPath with JSDoc deprecation for server-query use.
- Add round-trip invariant and idempotency tests that assert create-path
equals list-path for both Unix and Windows directory formats.