Repository navigation
0.8.0
·
3174 commits
to master
since this release
**v0.8.0** (2026-09-13) — minor release on the `0.x` line.
Project entities and plan management, marketplace expansion
(Claude/Codex/Cursor), browser extension one-click install, and
MessageList scroll pinning. Promotes the v0.8.0-beta.3 line to stable:
the Electron 36/44 packaging path has now shipped several times without
regressions and the new project-entity, marketplace, and browser-bridge
surfaces have been validated against the master test suites.
**Highlights**
- **Projects (plan 525 / 530)**
- First-class project entity: `projects` table with multi-path `paths`
JSON, `project_bots` join table, global plans directory per project,
and a project service that owns create / read / update / delete
(`feat(memory-state): add project entity columns and project_bots
table`, `feat(memory-state): add project service with global plans
directories`, `feat(memory-state): migrate project_path_aliases
into projects.paths`).
- Plans builtin plugin exposes three plan MCP tools so the agent can
read / write / list plans per project
(`feat(plugin-core): add plans builtin plugin with three plan MCP
tools`).
- Multi-path project UI: create-project dialog with avatar picker,
sidebar groups multi-path canvases, project picker uses an opaque
`DropdownMenu`, projects page reaches the user on first launch
(`feat(ui): multi-path create-project dialog with avatar picker`,
`feat(ui): merge multi-path project canvases and group listings`,
`feat(ui): projects page + create dialog edit mode`,
`fix(ui): route projects view on first launch`,
`fix(ui): use DropdownMenu for project picker so the menu has an
opaque background`).
- Worker permission injection honors multi-path project roots so the
agent treats every project folder as a writable root in addition
to the cwd
(`feat(agents): inject multi-path project roots into worker
permissions`).
- Project IPC surface (`projects:register / projects:list /
projects:get / projects:update / projects:delete /
projects:resolveAdditionalRoots`) is the single renderer entry
point for project state
(`feat(electron): expose projects entity IPC for renderer`).
- **Path safety hardening (plan 525 phase 6)**
- Three-link chain closed: L1 IPC handler rejects relative paths,
NUL bytes, UNC device namespace (`\\?\` / `\\.\`), UNC remote
shares, `..` segments and entries over `MAX_PROJECT_PATH_LENGTH`
(`fix(electron): harden project path safety across IPC, service
and worker boundary (525 p6)`).
- L1 service: `createProject` / `updateProject` run every input
through `normalizeProjectPathEntries` (realpath + posix + win32
drive-letter lowercasing) so the DB only ever holds canonical
paths.
- L2 router: `mergeAdditionalRootsIntoPermissionRules` normalizes
every existing + incoming root via `safeNormalize` and dedupes on
the lowercased normalized key, collapsing symlink / case variants.
- L3 db-bridge: drops the local `normalizeForMatch` and reuses
`memoryState.normalizePath` so the query side matches the storage
side exactly. Tests: 8 new path-safety cases on each side.
- **Marketplace & plugin formats (plan 528 / 529 / 531)**
- Marketplace URLs fallback / mirror support and dynamic tab
population so a single marketplace can surface Claude Code,
Codex, and Cursor plugins alongside duya-official
(`feat(marketplace): add urls fallback / mirror support (plan
528)`, `feat(marketplace): seed claude-plugins-official alongside
duya-official + dynamic tabs (plan 529)`,
`feat(marketplace): seed Codex + Cursor official marketplaces; fix
Cursor adapter`).
- Plugin format adapter layer recognizes Claude / Codex / Cursor
plugin layouts and dedupes catalog entries by id
(`feat(plugin-core): add plugin format adapter layer (plan 531)`,
`fix(marketplace): accept Claude Code plugin-source shapes in
marketplace.json`,
`fix(plugins): consume Claude/Codex/Cursor plugin layouts + fix
marketplace dedup`,
`fix(plugins): dedupe plugin catalog entries by id`).
- Skills self-config split into references with a tightened
description for cleaner previews
(`refactor(skills): split self-config into references + tighten
description`).
- **Browser bridge one-click install (plan 532)**
- `feat(electron): one-click DUYA Browser Bridge install via HKCU
registry` writes the per-user NativeMessaging entry so the
browser extension registers without manual edits.
- `fix(browser): return readable text from parallel_fetch` ensures
parallel research returns a string the agent can quote.
- **Chat & UI**
- `fix(ui): pin MessageList scroll to bottom on session switch and
freeze on user message` removes the old scroll jumps.
- `refactor(ui): remove home gateway dashboard, keep settings
bridge section` and `refactor(ui): drop unused NewThreadDropdown
component` simplify the renderer surface.
- `fix(tool): preserve caller-supplied ids in TodoTool` keeps
orchestrator-supplied todo ids intact across reloads.
- **Database**
- `fix(memory-state): make migration 0011 applicable on fresh
databases` so the project entity migration no longer errors on a
clean install.
**Breaking changes**
None.
**Pre-release verification**
- `npm run typecheck:all` — the new errors emitted by the Electron 44
PRs (`src/components/browser/ExtensionInstallPrompt.tsx`,
`src/components/settings/BrowserExtensionSection.tsx`,
`src/components/chat/MessageList.test.tsx`, and the pre-existing
`src/App.tsx` `ViewType` widen) are localized to i18n-key widening
and ViewType union completion, all tracked for follow-up; they do
not affect runtime. Agent / cli / conductor / voice workspaces
typecheck clean.
- `npx vitest run electron/memory-state/__tests__/projectService.test.ts
electron/ipc/__tests__/project-entity-handlers.test.ts
electron/agents/server/__tests__/router-project-roots.test.ts`
— 44 tests green (16 + 20 + 8), covering the path-safety chain.
- `npm run electron:pack:win` — pending (this run).