From c0ba4867144e778181abc333268d6df03e6fe527 Mon Sep 17 00:00:00 2001 From: Paulo Date: Thu, 20 Aug 2026 08:00:45 +0200 Subject: [PATCH] Release v0.3.0 Bump the version, lock it, and record the release in the changelog: logged-in browser sessions, installed apps mounted in the shell, one OAuth engine, and usage as a platform surface. --- CHANGELOG.md | 44 ++++++++++++++++++++++++++++++++++++++++++++ pyproject.toml | 2 +- uv.lock | 2 +- 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 892395ea..32beb070 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,50 @@ All notable changes to Druks. Versions follow [semantic versioning](https://semver.org); while Druks is pre-1.0, a minor bump may break compatibility. +## [0.3.0] — 2026-08-20 + +### Added + +- **Logged-in browser sessions.** An extension declares a browser session for a + site; the operator logs in once through a Druks-hosted browser window, and a + workflow borrows that authenticated browser. The login is encrypted, stored + the first time a run reaches for it, and reused across runs. +- **The login window is real Chrome.** It runs full Chrome over noVNC, opens on + the session's own site, sets a timezone, and does not announce itself as + automation. It can route through a configurable egress proxy, including one + that needs credentials. +- **Installed apps mount in the shell.** An app ships an ESM entry and declared + navigation, and Druks renders it inside the dashboard instead of a separate + page. A mounted app borrows the shell's components, its markdown renderer, and + its form fields, and it can draw a gate. +- **Scheduled workflows dispatch.** A schedule fires the workflow's `dispatch()` + when it declares one, so a cadence runs the same policy a manual trigger does. + +### Changed + +- **One OAuth engine.** `OauthClient` in `druks.services` runs every OAuth + exchange; the MCP client is rewired onto it, and the mint seam takes a grant + rather than a pair of callables. +- **Usage is a platform surface**, not an app you install. Quota and spend are + part of the platform. +- **One control frame across the shell.** The accent color reaches every + surface, a declared field is drawn the same way wherever it appears, and + Settings names an app the way the app switcher does. +- **An approved, clean PR merges directly** instead of looping back through the + work gate. +- **Ship's gate policy stops paying for a durable runtime** just to assert the + policy. + +### Fixed + +- **The app engine pool is sized for the run queue**, not a single request. +- **Sandbox provisioning failures retry.** A transient provisioning error is + classified as transient, so the in-run retry covers it. +- **An expired credential reads as disconnected**, not Connected. +- **A spend-controlled Codex plan reports its quota as a weekly window.** +- **An extension that declares a subject is checked at load.** A missing subject + read-side fails when the extension loads, not on the first request. + ## [0.2.0] — 2026-08-10 ### Added diff --git a/pyproject.toml b/pyproject.toml index 9e4b2290..b120e214 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "druks" -version = "0.2.0" +version = "0.3.0" description = "Autonomous software delivery; the self-hosted home for durable agent apps." readme = "README.md" license = "MIT" diff --git a/uv.lock b/uv.lock index 61092c2d..a2cac6fc 100644 --- a/uv.lock +++ b/uv.lock @@ -534,7 +534,7 @@ wheels = [ [[package]] name = "druks" -version = "0.2.0" +version = "0.3.0" source = { editable = "." } dependencies = [ { name = "alembic" },