Open Science v0.10.0
Search across your whole project from a command palette, read source code with syntax highlighting, inspect installed packages per runtime environment, import skills from GitHub in a conversation, and connect Bailian (Alibaba Cloud) as a built-in provider — while session persistence, Windows update feedback, and cross-platform path handling get harder, and agent context overhead and concurrent-session event delivery shrink.
Open Science is an open-source, model-agnostic AI workbench for scientific discovery — a self-hosted desktop app pairing a plan-and-execute agent with persistent compute, durable project/session storage, and inspectable research artifacts.
v0.10.0 is a feature release on top of v0.9.2. It brings a project-scoped command palette, code syntax highlighting in previews and notebook cells, read-only installed-package inventories per runtime environment, conversational skill imports from public GitHub URLs, direct file preview beside the session, and Bailian (Alibaba Cloud) as a built-in model provider. Under the hood it hardens session persistence against backpressured writes, adds an applying state before Windows updates so users know the app is preparing, accepts Windows drive and UNC absolute paths in local-path validation, persists context usage during graceful shutdown, preserves the specialist prefix after session adoption, and aligns Bailian reasoning capabilities with documented model profiles — while a broad ownership refactor continues to extract narrower, independently testable modules from the ACP runtime, notebook runtime, and renderer transport surface, backed by a renderer contract catalog, release-provenance enforcement, and pinned workflow dependencies.
✨ Highlights
- Project-scoped command palette. A
Cmd/Ctrl+Kpalette now searches across sessions, files, settings, and navigation targets within the active project, so jumping to a session or opening a file no longer requires leaving the keyboard. The composer placeholder advertises the platform-specific shortcut. (#640, [#653]) - Code syntax highlighting. Source files and notebook code cells now render with GitHub-style syntax highlighting through Shiki, with light/dark theme support, line numbers, and a consistent read-only line renderer shared between file previews and notebook runs. (#669)
- Installed-package inventories. Each runtime environment card in Settings gets a Packages button with a lazily fetched count badge and a dialog showing the full name/version/build/channel table, filterable by name, with loading, error-retry, and empty states. (#654)
- Conversational skill imports from GitHub. The agent can now request a skill import from a public GitHub URL — not just a session attachment — routed through the existing app-owned preview and confirmation modal before anything is written. (#673)
- Bailian (Alibaba Cloud) provider. Bailian is available as a built-in provider with China and Global DashScope regions, Anthropic Messages, OpenAI Chat Completions, and Responses support, plus a curated Qwen 3.8/3.7/3.6 and DeepSeek V4 catalog. A dedicated Bailian for Plan subscription endpoint is also included. (#658, [#672])
- Direct file preview beside the session. Uploaded and generated files can now be opened directly in the split-view preview panel from the project file library, without going through the modal. (#676)
🚀 New Features
- Project-scoped command palette — a
Cmd/Ctrl+Kpalette that searches sessions, files, settings, and navigation targets within the active project, with keyboard navigation and fuzzy matching. The composer placeholder shows the platform-specific shortcut (⌘Kon macOS,Ctrl+Kelsewhere). (#640, [#653]) - Code syntax highlighting — Python, R, JavaScript, TypeScript, CSS, and shell source files now render with Shiki-based syntax highlighting in both the file preview panel and notebook code cells, with GitHub light/dark themes, line numbers, selected-error-line styling, and a shared read-only line renderer. Large files and unsupported formats fall back to the existing plain-text path. (#669)
- Installed-package inventories per runtime environment — each runnable environment card in Settings shows a Packages button with a lazily fetched count badge, opening a dialog with env metadata, a filterable name/version table (with build/channel columns when present), and a conda/pip breakdown for conda environments. Listing dispatches on the env's language and ownership, with no renderer-supplied path probing. (#654)
- Bailian (Alibaba Cloud) provider — two provider entries: Bailian with China and Global DashScope regions, Anthropic Messages / OpenAI Chat Completions / Responses endpoints, and a curated Qwen 3.8/3.7/3.6 and DeepSeek V4 catalog with 1M context metadata; and Bailian for Plan with its Token Plan Anthropic/OpenAI endpoints and curated Qwen/GLM/DeepSeek catalog. Reasoning presets are aligned per model: Qwen 3.8 Max/Preview gets a low/medium/xhigh preset, GLM 5.2 and DeepSeek V4 Chat expose high/max, and Responses routing is model-level for standard Bailian's documented Qwen subset. (#658, [#672])
- Conversational skill imports from GitHub — the
request_skill_importMCP tool now accepts agithub_urlalongside the existing attachment source, with exactly-one-source validation. The agent can resolve a skill name or keywords through its provider-native web search, then call the tool with the resolved GitHub URL. The existing Settings repository scanner runs before approval, and every discovered skill appears in the application modal with the existing preview, preselect, and confirmation flow. (#673) - Direct file preview beside the session — uploaded and generated files can be opened directly in the split-view preview panel from the project file library, with matching two-action treatment (download plus split-view preview) in both grid and list modes, and a focus-ring fix so the file container no longer shows a green ring after a modal close. (#676)
- Diagnostic coverage for failure boundaries — per-process run IDs and a privacy-safe diagnostic operation vocabulary cover startup lifecycle, storage migration failures, session persistence recovery, updater lifecycle, renderer top-level failures, and orderly shutdown handoffs, without logging content, URLs, command lines, or paths. (#664)
🔧 Improvements
- Agent context overhead is reduced by trimming skill and notebook payloads sent to the model, lowering token consumption without changing tool or response fidelity. (#634)
- Runtime events are now processed through independent per-session ordered lanes, so a slow event in one active session no longer blocks model output from another concurrent session. Same-session events stay sequential, and an explicit drain barrier lets quit and resume wait for the right scope. (#666)
- Release workflow now validates the pushed tag's application version and
origin/mainancestry before platform builds, preventing an unverified or off-main tag from publishing. Manual dispatch remains build-only. (#663) - All 27 remaining mutable external GitHub Action references are pinned to verified commit SHAs, and the GitHub Actions Dependabot limit is raised from 0 to 2 so pinned references can receive bounded update PRs. (#668)
🐛 Bug Fixes
- Specialist prefix preservation — a session adopted by a specialist no longer loses the specialist's name prefix after the adoption completes, so the conversation title and sidebar reflect the correct identity. (#629)
- Context-usage persistence on graceful shutdown — the last known context-usage snapshot is now flushed during orderly shutdown, so the indicator survives a deliberate quit-and-relaunch instead of only an unexpected restart. (#646)
- Backpressured session write coalescing — high-frequency session mutations that arrive faster than disk writes can complete are now coalesced instead of queuing unbounded writes, preventing memory growth and write storms during fast interactive sessions. (#649)
- Compute hover submenu restoration — the composer's agent-controls menu restores the Compute hover submenu (flattened by an earlier mobile-access change), and the expand chevron is aligned with its siblings in size, position, and color. (#659)
- Windows update preparation feedback — the updater now publishes an applying state before backend teardown and locks duplicate update actions, so the user sees that the app is preparing an update instead of a silent quit. The native assisted NSIS UI is shown during file replacement, followed by a force-relaunch. (#661)
- Windows absolute path support — the local-path validator now accepts Windows drive-letter (
C:\…) and UNC (\\server\share\…) absolute paths, while still rejecting drive-relative, root-relative, and incomplete UNC forms. (#667) - Optional renderer argument shapes — two observable optional-argument shapes (missing/explicit-undefined forwarding for ACP connect/createSession and notebook-env cancel) are characterized in the renderer contract catalog so they are reviewable without silently changing Electron or Web behavior. (#678)
📦 Install
Requirements: macOS 12+ (Apple Silicon or Intel), Linux x64, or Windows 10/11 x64. On first run, the onboarding wizard checks the environment and can install and configure an app-managed agent runtime. Once installed, the app can update itself in place.
Download the appropriate package from the Assets section below:
| Platform | Package |
|---|---|
| macOS (Apple Silicon) | DMG for ARM64 |
| macOS (Intel) | DMG for x64 |
| Linux | AppImage or Debian package for x64 |
| Windows | Installer for x64 |
macOS — first launch. Official release builds are Developer ID signed and notarized by Apple, so they open like other trusted applications. A locally built copy is not notarized and may require approval through macOS Privacy & Security.
Windows — first launch (unsigned build). No Authenticode certificate yet, so SmartScreen shows a bypassable "unrecognized app" prompt (More info → Run anyway). Verify that the package came from the official release page before continuing.
Build from source instead:
npm install
npm run build:mac # or: build:linux / build:win
🧭 What's in this release (maturity)
- ✅ Implemented: a local-first desktop, localhost-web, headless, CLI, and task-SDK surface over persistent projects and sessions with selectable message branches; selectable Claude Code, OpenCode, and Codex agent frameworks; multi-provider model configuration with combined model/reasoning selection and native Responses API support for DeepSeek flash; persistent Python/R/REPL kernels and remote SSH execution with read-only installed-package inventories; immutable artifact versions with inspectable audit evidence; multi-format previews including TIFF and code syntax highlighting; file-based skills with conversational imports from GitHub URLs; permissioned scientific connectors; opt-in review and bounded correction; personal specialist agent profiles with scoped capabilities, conversational customization, and immediate in-flight handoff; scoped permission management with global, project, and session grants; conversation export as Markdown and PDF; selective session-artifact downloads; per-turn token usage; message timing metadata; completed-turn agent and model identification; context-usage persistence across restarts; a project-scoped command palette; collapsible side panels; split-view file preview beside the session; mobile remote access through Remote.It pairing; configurable storage; diagnostic coverage for user-visible failure boundaries; and installers for macOS, Windows, and Linux.
- 🚧 Partial: R remains managed-only; provider choice remains constrained by the active framework's endpoint compatibility; remote compute is SSH-only; skills remain local; specialist roles are personal-only (no cross-machine sharing); and review is opt-in and record-scoped.
- 🗺️ Roadmap: a unified model gateway, a public skills commons and cross-machine specialist sharing, Slurm/cloud-GPU execution, stronger sandboxing and credential isolation, and collaborative research workflows.
🐢 Known Limitations
- R is managed-only. A bring-your-own R interpreter path is not built yet.
- Remote compute is SSH-only. Slurm, cloud GPU, and parallel sub-agent fan-out are not built yet.
- Provider choice is per framework, not one unified gateway. The available protocol depends on the selected agent backend.
- Specialist roles are personal-only. There is no shared public commons or cross-machine specialist forking yet.
- The task SDK is a first-generation surface. Task creation, polling, and artifact retrieval work; broader orchestration remains open.
- Switching agent backends cannot transfer in-flight tool state. Existing conversation history can replay, but a running action is not migrated.
- Skills are local only. There is no shared public commons, cross-machine forking, or user-facing version pinning yet.
- The reviewer is opt-in and record-scoped. It does not replace domain-specific validation of citations, units, statistics, or methods.
- Scoped permissions cover allow-grants only. Network sandboxing, directory-level file access control, and a credential vault are not built yet.
- Windows builds are unsigned. SmartScreen may warn on first launch; official macOS builds are notarized.
- No local GPU compute backend.
- No multi-user real-time collaboration.
🙏 Acknowledgements
Thanks to @ewen-poch, @wen2zhou, @roxi3906, @LJLJ111, @daanveer-tech, and everyone in Discord, X, and Discussions.
What's Changed
- refactor(acp): extract session aggregate by @ewen-poch in https://github.com/aipoch/open-science/pull/626
- refactor(acp): extract session registry core by @ewen-poch in https://github.com/aipoch/open-science/pull/627
- refactor(acp): extract session arbitration by @ewen-poch in https://github.com/aipoch/open-science/pull/628
- fix(acp): preserve specialist prefix after adoption by @ewen-poch in https://github.com/aipoch/open-science/pull/629
- test(acp): certify session adoption compatibility by @ewen-poch in https://github.com/aipoch/open-science/pull/630
- refactor(acp): extract session interaction ownership by @ewen-poch in https://github.com/aipoch/open-science/pull/631
- refactor(notebook): extract environment operation ownership by @ewen-poch in https://github.com/aipoch/open-science/pull/632
- refactor(acp): own connection resource publication by @ewen-poch in https://github.com/aipoch/open-science/pull/633
- perf(agent-context): reduce skill and notebook payloads by @ewen-poch in https://github.com/aipoch/open-science/pull/634
- refactor(notebook): extract run terminalization owner by @ewen-poch in https://github.com/aipoch/open-science/pull/635
- refactor(acp): own connection teardown by @ewen-poch in https://github.com/aipoch/open-science/pull/636
- refactor(notebook): extract export reader by @ewen-poch in https://github.com/aipoch/open-science/pull/637
- refactor(acp): extract connection transition owner by @ewen-poch in https://github.com/aipoch/open-science/pull/638
- refactor(notebook): extract shell process adapter by @ewen-poch in https://github.com/aipoch/open-science/pull/639
- feat(global-search): add project-scoped command palette by @ewen-poch in https://github.com/aipoch/open-science/pull/640
- refactor(acp): move managed workspace into session workflow by @ewen-poch in https://github.com/aipoch/open-science/pull/641
- refactor(notebook): extract control and shell execution owner by @ewen-poch in https://github.com/aipoch/open-science/pull/642
- refactor(task): inject narrow agent execution port by @ewen-poch in https://github.com/aipoch/open-science/pull/643
- refactor(acp): extract runtime composition by @ewen-poch in https://github.com/aipoch/open-science/pull/644
- refactor(notebook): extract data execution admission by @ewen-poch in https://github.com/aipoch/open-science/pull/645
- fix(acp): persist usage during graceful shutdown by @ewen-poch in https://github.com/aipoch/open-science/pull/646
- refactor(notebook): own data execution lifecycle by @ewen-poch in https://github.com/aipoch/open-science/pull/647
- refactor(acp): extract handler application workflows by @ewen-poch in https://github.com/aipoch/open-science/pull/648
- fix(session-persistence): coalesce backpressured writes by @ewen-poch in https://github.com/aipoch/open-science/pull/649
- test(transport): certify remote acp compatibility by @ewen-poch in https://github.com/aipoch/open-science/pull/650
- refactor(notebook): extract command workflows by @ewen-poch in https://github.com/aipoch/open-science/pull/651
- refactor(notebook): extract runtime selection workflows by @ewen-poch in https://github.com/aipoch/open-science/pull/652
- feat(composer): show platform search shortcut by @ewen-poch in https://github.com/aipoch/open-science/pull/653
- feat(notebook): show installed packages for each runtime environment by @roxi3906 in https://github.com/aipoch/open-science/pull/654
- docs(readme): link website, slim badges, refresh Discord, name connectors by @daanveer-tech in https://github.com/aipoch/open-science/pull/655
- refactor(notebook): extract environment operation foundation by @ewen-poch in https://github.com/aipoch/open-science/pull/657
- feat(providers): add Bailian provider options by @ewen-poch in https://github.com/aipoch/open-science/pull/658
- fix(compute): restore hover submenu and align its chevron with siblings by @wen2zhou in https://github.com/aipoch/open-science/pull/659
- refactor(notebook): extract environment lifecycle workflows by @ewen-poch in https://github.com/aipoch/open-science/pull/660
- fix(updater): show Windows update preparation by @ewen-poch in https://github.com/aipoch/open-science/pull/661
- test(e2e): harden workspace journey coverage by @ewen-poch in https://github.com/aipoch/open-science/pull/662
- ci(release): enforce desktop release provenance by @ewen-poch in https://github.com/aipoch/open-science/pull/663
- feat(diagnostics): cover user-visible failure boundaries by @ewen-poch in https://github.com/aipoch/open-science/pull/664
- refactor(notebook): extract local RPC adapter by @ewen-poch in https://github.com/aipoch/open-science/pull/665
- perf(workspace-runtime): isolate session event drains by @ewen-poch in https://github.com/aipoch/open-science/pull/666
- fix(local-paths): support Windows absolute paths by @ewen-poch in https://github.com/aipoch/open-science/pull/667
- ci(actions): pin and maintain workflow dependencies by @ewen-poch in https://github.com/aipoch/open-science/pull/668
- feat(preview): add code syntax highlighting by @LJLJ111 in https://github.com/aipoch/open-science/pull/669
- refactor(notebook): compose application-owned runtime capabilities by @ewen-poch in https://github.com/aipoch/open-science/pull/671
- fix(providers): align Bailian reasoning capabilities by @ewen-poch in https://github.com/aipoch/open-science/pull/672
- feat(skill-import): support GitHub sources in conversations by @ewen-poch in https://github.com/aipoch/open-science/pull/673
- test(transport): characterize renderer surface contracts by @ewen-poch in https://github.com/aipoch/open-science/pull/674
- feat(files): open files in preview panel by @ewen-poch in https://github.com/aipoch/open-science/pull/676
- refactor(transport): define renderer contract catalog by @ewen-poch in https://github.com/aipoch/open-science/pull/677
- fix(transport): preserve optional renderer argument shapes by @ewen-poch in https://github.com/aipoch/open-science/pull/678
- refactor(web): adapt renderer contracts from shared catalog by @ewen-poch in https://github.com/aipoch/open-science/pull/680
Full Changelog: https://github.com/aipoch/open-science/compare/v0.9.2...v0.10.0