Open Science v0.10.1
Branch any conversation into a fresh session, search GitHub for skills by keyword, import and export specialist packages, and keep oversized data files out of model context — while a provider turn-adapter pattern unifies how each agent framework drives the session lifecycle and a module-first application-command architecture makes the IPC surface independently testable.
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.1 is a patch release on top of v0.10.0. It brings the ability to branch a conversation's active message path into a new session, search public GitHub repositories for skills by keyword, import and export specialist profiles as versioned packages with safe contribution workflows, and see session-age metadata in the project file library. Under the hood it keeps oversized text files and compute datasets on managed disk instead of eagerly inlining them into the model context, deduplicates replayed branch events so edited branches do not collect ghost messages, preserves reviewer correction provenance against the durable conversation graph, and assigns resumed Codex prompt responses to the correct runtime segment — while a broad ownership refactor introduces a provider turn-adapter interface (Claude, Codex, OpenCode each owning their generation, presentation, resume, and handoff lifecycle), a module-first application-command architecture routing every IPC call through typed, independently testable owners, and CI validation that selects checks by owning module with fail-closed classification.
✨ Highlights
- Branch a conversation into a new session. A split Send control now offers a Branch in new session action for any conversational session, immediately creating a local pending session that copies only the source session's active message path and uses the submitted prompt as the new title. Creation failures are retryable in the new session and never mutate or roll back the source. Artifacts, project files, and notebook state remain owned by the source session, and missing preview metadata is resolved through one batched descriptor call rather than by duplicating records. (#715)
- Search GitHub skills by keyword. The skill import flow now accepts free-text keywords alongside explicit repository references. Keyword input searches public GitHub repositories, returns matching metadata, and lets the user scan a selected repository for Skill folders. Repository matches collapse to keep the list manageable, with prominent controls to expand them again, and the actions are clarified as Find skills and Scan for skills. (#732)
- Specialist package import/export. Specialist profiles can now be exported and imported as versioned packages through secure ZIP and directory flows, with archive limits, validation diagnostics, preview, install, overwrite confirmation, cancellation, report saving, and atomic rollback. Safe deletion checks linked-skill ownership before removing a specialist. (#687)
- Oversized file context protection. Large text files and compute datasets (for example, an 18 MB CSV) now stay on managed disk instead of being eagerly inlined into the model context. The prompt carries a bounded preview plus a local-file descriptor so the agent can still read the full file through notebook or shell execution, but downstream adapters can no longer overflow the model context by decoding the entire attachment. (#719)
🚀 New Features
- Branch in new session — an integrated split Send control adds a Branch in new session action that creates a local pending session from the source session's active message path, uses the submitted prompt as the new title, and reuses the existing bounded ACP replay path for text, images, and upload references. Creation failures remain retryable and never mutate or roll back the source session. Artifacts and notebook state stay owned by the source; missing preview metadata is resolved through one batched artifact descriptor call instead of by copying artifact records. (#715)
- GitHub skill search by keyword — the skill import flow now routes free-text keywords through a public GitHub repository search while preserving
owner/repo,owner/repo@ref, andgithub.comURL input. Repository matches collapse when scanning for Skill folders, with prominent controls to show or hide them again. Actions are clarified as Find skills and Scan for skills, repositories are visually separated from discovered Skills, and selection controls are in a dedicated toolbar. Stale responses and GitHub rate-limit errors are handled. (#732) - Specialist contribution channels — versioned specialist package types, manifests, and templates support secure ZIP and directory import/export with archive limits, validation diagnostics, Finder-created ZIP support, preview, install, overwrite confirmation, cancellation, report saving, and atomic rollback. Safe specialist deletion checks linked-skill ownership and protection before removal. The contribution APIs are exposed through the preload bridge and renderer contract catalog, and the Settings UI, renderer stores, and IPC handlers are extended. (#687)
- Session-age metadata in artifact list — the project file library's list view now shows compact relative time (for example,
1 · 15h ago) next to each session header, so users can see when a session was last active without opening it. Session headers use a default cursor while preserving expand/collapse behavior, and the previous file-count fallback applies when timing data is unavailable. (#683)
🔧 Improvements
- A provider turn-adapter interface lets each agent framework (Claude Code, Codex, OpenCode) own its backend generation state, session presentation, resume policy, generation activity, and handoff continuity behind a shared contract, so framework-specific lifecycle logic is isolated and testable instead of interleaved with the session core. (#724, #727, #728, #729, #731, #733, #734)
- A module-first application-command architecture routes every IPC call through typed, independently testable command owners across the ACP runtime, notebook runtime, general runtime, settings, storage, preview, uploads, security, compute, permission, host, content, and main composition layers — replacing captured dispatch with direct command invocation on the web target. (#686, #688–#710, #714, #716, #718, #720)
- CI validation now selects checks based on the owning module rather than file-level patterns, classifying ownership from trusted inputs and failing closed to the full plan for unknown files. Full local verification is required only for cross-module, shared-contract, global-input, or unclassifiable changes. The renderer surface matrix is included in the interface-contract baseline, and Release/Nightly typechecks are consolidated into a single reusable verification job. (#685, #684, #700)
- The README receives SEO and GEO polish, with stale sections removed. (#730)
🐛 Bug Fixes
- Replayed branch message deduplication — when switching from an interrupted conversation to an edited message branch, assistant events owned by the original branch are no longer replayed onto the edited branch, preventing mixed messages and duplicate Completed/Usage footers. Events are now deduplicated against the durable conversation graph by bounded event ID and prompt message ID before mutating the active flat projection. (#712)
- Image filtering on text-only session replay — images are filtered out when replaying a text-only session during branch creation, preventing broken image references from appearing in the new session. (#713)
- Branch controls positioning — message branch controls are pinned below the chat bubble instead of overflowing the message area, so the controls stay visible and usable on all message lengths. (#711)
- Reviewer correction provenance — reviewer-owned correction prompts now materialize the durable conversation graph before the correction turn, so artifact finalization can bind to the correct frame and branch instead of failing closed on a mismatched root. (#725)
- Codex prompt-runtime ownership after resume — after a detached Codex session resumes, the agent response is assigned to the runtime segment of its
responseToMessageIdprompt instead of the latest segment, preventing artifact finalization from rejecting the durable ownership proof when the active segment changes between prompt projection and terminal agent message. (#706) - Renderer prompt controls stripped from ACP — prompt controls are no longer forwarded to the ACP layer, preventing framework adapters from receiving renderer-internal state. (#692)
- DOM async iterable type coverage — web type definitions now include DOM async iterables, preventing type-check failures for stream-based browser APIs. (#717)
📦 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 and branching into a new session; selectable Claude Code, OpenCode, and Codex agent frameworks behind a shared provider turn-adapter interface; 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 and keyword search from GitHub URLs; permissioned scientific connectors; opt-in review and bounded correction; personal specialist agent profiles with scoped capabilities, conversational customization, immediate in-flight handoff, and package import/export; 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
- feat(project-files): show session age in artifact list by @ewen-poch in #683
- refactor(preload): adapt core renderer contracts by @ewen-poch in #684
- test(transport): certify renderer surface contracts by @ewen-poch in #685
- refactor(main): add application command router by @ewen-poch in #686
- feat(specialists): add specialist contribution channels by @ewen-poch in #687
- refactor(acp): define application commands by @ewen-poch in #688
- refactor(runtime): define application commands by @ewen-poch in #689
- refactor(notebook): define application commands by @ewen-poch in #690
- refactor(security): own caller lifecycle leases by @ewen-poch in #691
- fix(acp): strip renderer prompt controls by @ewen-poch in #692
- refactor(compute): define permission-aware commands by @ewen-poch in #693
- refactor(settings): define core application commands by @ewen-poch in #694
- refactor(settings): define runtime application commands by @ewen-poch in #695
- refactor(uploads): bind writers to caller leases by @ewen-poch in #696
- refactor(settings): define integration application commands by @ewen-poch in #697
- refactor(content): register data application commands by @ewen-poch in #698
- refactor(host): register review and platform commands by @ewen-poch in #699
- ci(verification): implement module-first validation by @ewen-poch in #700
- refactor(preview): share managed owner by @ewen-poch in #701
- refactor(uploads): add command owner by @ewen-poch in #702
- refactor(permission): share projection owner by @ewen-poch in #703
- refactor(host): share command owners by @ewen-poch in #704
- refactor(storage): share command owner by @ewen-poch in #705
- fix(artifacts): preserve prompt runtime ownership by @ewen-poch in #706
- refactor(uploads): share command owner by @ewen-poch in #707
- refactor(storage): move command owner module by @ewen-poch in #708
- refactor(storage): restore ipc module path by @ewen-poch in #709
- refactor(main): compose application command core by @ewen-poch in #710
- fix(workspace): pin message branch controls below bubble by @ewen-poch in #711
- fix(conversation): ignore replayed Branch message events by @ewen-poch in #712
- fix(workspace): filter images when replaying text-only sessions by @ewen-poch in #713
- refactor(main): wire application command owners by @ewen-poch in #714
- feat(workspace): add branch in new session by @ewen-poch in #715
- refactor(web): use direct application commands by @ewen-poch in #716
- fix(web-types): include DOM async iterables by @ewen-poch in #717
- refactor(web): remove captured IPC dispatch by @ewen-poch in #718
- fix(acp): keep large files out of model context by @ewen-poch in #719
- refactor(runtime): remove obsolete compatibility paths by @ewen-poch in #720
- refactor(acp): add Session resume policy by @ewen-poch in #723
- refactor(acp): define provider turn adapter interface by @ewen-poch in #724
- fix(reviewer): preserve correction artifact provenance by @ewen-poch in #725
- refactor(acp): add session presentation policy by @ewen-poch in #726
- refactor(acp): own backend generation state by @ewen-poch in #727
- refactor(acp): add Claude turn adapter by @ewen-poch in #728
- refactor(acp): add Codex turn adapter by @ewen-poch in #729
- docs(readme): SEO/GEO polish and stale section removal by @ewen-poch in #730
- refactor(acp): add OpenCode turn adapter by @ewen-poch in #731
- feat(skills): search GitHub skills by keyword by @ewen-poch in #732
- refactor(acp): own generation activity state by @ewen-poch in #733
- refactor(acp): own handoff continuity state by @ewen-poch in #734
Full Changelog: v0.10.0...v0.10.1