From 58d035bb83fba45e1f3cb275ebeb093d2eb20def Mon Sep 17 00:00:00 2001 From: jaylfc Date: Tue, 11 Aug 2026 21:48:45 +0000 Subject: [PATCH] chore(release): v1.0.0-beta.48 version bump + changelog Collate 15 changelog.d fragments into the 1.0.0-beta.48 section (merged with the direct [Unreleased] entries under single headings), bump the four version files including uv.lock's normalized 1.0.0b48. Docs-Reviewed: release version bump; no CI, packaging or contribution rule change --- CHANGELOG.md | 113 ++++++++++++++++-- changelog.d/2333-strike-quarantine-wiring.md | 5 - changelog.d/2338-hailo-hef-catalog-fixes.md | 7 -- changelog.d/2349-alias-editing.md | 6 - changelog.d/2352-memory-agent-traversal.md | 6 - changelog.d/2353-ci-node-22.md | 4 - changelog.d/2356-registry-existence-hiding.md | 7 -- changelog.d/2357-wallpaper-fit-options.md | 6 - .../2361-lists-store-cursor-rollback.md | 6 - .../2363-v1-consent-key-passthrough.md | 7 -- changelog.d/fix-auth-status-ua-symmetry.md | 9 -- changelog.d/tsk-icpt4i-agent-loop-wiring.md | 12 -- changelog.d/tsk-laezfg-secret-ignores-gate.md | 12 -- changelog.d/tsk-n3w5mh-store-wiring-gate.md | 11 -- changelog.d/tsk-ppgpln-context-window.md | 8 -- changelog.d/tsk-rl2lfb-agent-loop.md | 6 - desktop/package.json | 2 +- pyproject.toml | 2 +- tinyagentos/__init__.py | 2 +- uv.lock | 2 +- 20 files changed, 110 insertions(+), 123 deletions(-) delete mode 100644 changelog.d/2333-strike-quarantine-wiring.md delete mode 100644 changelog.d/2338-hailo-hef-catalog-fixes.md delete mode 100644 changelog.d/2349-alias-editing.md delete mode 100644 changelog.d/2352-memory-agent-traversal.md delete mode 100644 changelog.d/2353-ci-node-22.md delete mode 100644 changelog.d/2356-registry-existence-hiding.md delete mode 100644 changelog.d/2357-wallpaper-fit-options.md delete mode 100644 changelog.d/2361-lists-store-cursor-rollback.md delete mode 100644 changelog.d/2363-v1-consent-key-passthrough.md delete mode 100644 changelog.d/fix-auth-status-ua-symmetry.md delete mode 100644 changelog.d/tsk-icpt4i-agent-loop-wiring.md delete mode 100644 changelog.d/tsk-laezfg-secret-ignores-gate.md delete mode 100644 changelog.d/tsk-n3w5mh-store-wiring-gate.md delete mode 100644 changelog.d/tsk-ppgpln-context-window.md delete mode 100644 changelog.d/tsk-rl2lfb-agent-loop.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 590a05a90..4fbfdd830 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,21 +7,120 @@ Versions follow semver beta: `1.0.0-beta.N`, bumped on each dev->master promotio ## [Unreleased] -### Security - -- **Desktop deps**: bump `dompurify` 3.4.12 -> 3.4.13 (GHSA-55q2-fjhq-7xh7, - moderate) and `nanoid` 5.1.11 -> 5.1.16 (CVE-2026-67214, high) in - `desktop/package-lock.json`; lock-only, both already within the declared - ranges. Split out of Dependabot #2331, whose grouped jsdom 30 bump fails - spa-build (jsdom 30 requires Node >=22.13; CI pins Node 20). +## [1.0.0-beta.48] - 2026-08-11 ### Added +- Quarantined task cards surface their strike count and latest strike on the + task-detail response, and a lead can un-quarantine a card via + `POST /api/projects/{pid}/tasks/{tid}/unquarantine`, clearing its strikes (#2333). + +- **Hailo-10H HEF model catalog**: five NPU-accelerated model manifests + (DeepSeek-R1-Distill-Qwen 1.5B, Llama 3.2 3B, Qwen2 1.5B, Qwen2.5 1.5B, + Qwen2.5 Coder 1.5B) now resolve and install via `hailo-ollama` on + Raspberry Pi 5 + AI HAT+2, and downloaded `.hef` files show up in the + local-files and orphan scans (#2338). + +- The Agents app registry panel shows each agent's handle (alias) and lets the + owner or an admin edit it inline, saved via + `PATCH /api/agents/registry/{canonical_id}`. A leading `@` is display syntax + and is stripped before save (#2349). + +- Wallpaper fit options in Settings -> Desktop & Dock: fill, fit, stretch, + center, and tile. The choice is persisted per device (localStorage, keyed + by a locally minted device id that is never sent to the server), so each + screen keeps the fit that suits its aspect ratio (#2357). + +- **Agent loop infrastructure**: new `tinyagentos.agent_loop.AgentLoop` library + for subagent delegation and safe-point message queuing. Landed as + standalone infrastructure; wired into the chat router and taOS agent + routes in #tsk-icpt4i (#tsk-rl2lfb). + +- **CI**: store-wiring-gate workflow and `scripts/check_store_wiring.py` guard. + A PR that adds a new BaseStore subclass without wiring it into + `tinyagentos/app.py` now fails CI and names the unreachable class and file. + Routes reach stores ONLY via `request.app.state`, so an unwired store is + dead code. Only newly added classes are policed; a + `Store-Unwired-Intentionally: , ` trailer in the PR body + waives a named class for stores genuinely constructed elsewhere (tsk-n3w5mh). + - **Docs**: mechanical-simple-auditable design law added to the agent manual (`01-rules.md`), with a worked example anonymised as "an agent". Also trimmed verbose prose in the image-prompting guide to stay within the compiled manual character budget. +### Changed + +- CI's `spa-build` job runs on Node 22 (was 20, now past end-of-life). Also + unblocks the jsdom 30 upgrade, which requires Node >= 22.13 (#2353). + +- **Agent loop wiring**: `AgentLoop` is now the single per-agent serialization + owner. `AgentChatRouter` drives OpenClaw ACP turns through a per-agent + `AgentLoop` (replacing the per-agent lock) and the turn-holder drives + messages queued mid-turn at its safe point. The desktop taOS agent chat + endpoint serializes on one `AgentLoop` too -- fixing a race where two + concurrent POSTs shared the opencode session with no serialization -- + queueing concurrent messages and surfacing them in the turn-holder's stream + tail. New `GET /api/taos-agent/status` endpoint returns the desktop loop's + status scoped to state / current turn / queue depth / subagent descriptors + (subagent result/error payloads stay server-side) (#tsk-icpt4i). + +### Fixed + +- Project list entries: `get_entry` no longer reads cursor metadata after the + cursor closes, and a failed reorder now rolls back its partial updates so a + later unrelated write cannot commit a half-applied ordering (tsk-u23vjy, + fix-forward of #2183). + +- The Agent-as-a-Model surface (`GET /v1/models`, `POST /v1/chat/completions`) + is now reachable by external OpenAI-compatible clients: the auth middleware + passes exactly those two routes through to their own consent-key check + instead of rejecting every session-less caller before the handler ran. All + other `/v1` paths remain session-gated (tsk-hfs6zv). + +- **PWA refresh loop after a browser auto-update**: `/auth/status`, `/auth/me` + and the chat/canvas/terminal/web-chat WebSocket handlers now apply the same + session User-Agent binding check as the API middleware. Previously a session + created before a browser update kept reading as authenticated on + `/auth/status` while every `/api/*` call was rejected, so the desktop shell + remounted in a loop; the WebSocket endpoints conversely accepted a cookie + the APIs refused. + +- **Catalog manifests' `context_window` was silently dropped**: `AppManifest` + declared no `context_window` field and `from_dict` never read the YAML + value, so every manifest loaded as 0 and the chat context-window budget code + always fell back to the 4000-token "unknown window" default. The field now + loads onto `AppManifest` (0 reserved for unknown), so real windows -- e.g. + rkllm 4096, qwen 32768 -- drive the #1740 budget math. (#2338, #1740) + +### Security + +- Memory routes reject any `agent` value that is not a single plain path + component (separators, `.`/`..`, NUL all 400): the caller-controlled name + becomes a filesystem path component of the qmd `dbPath`, and a traversal + value could previously address SQLite files outside `agent-memory/` (#2352). + +- All owner-gated agent-registry routes are now existence-hiding: a caller who + does not own an agent gets the same 404 as a nonexistent id, on the + scope-request create/approve/deny routes and on registry PATCH, revoke, + rotate-tokens, and org update. Previously a 403-vs-404 difference disclosed + whether an agent id existed (issue #2106, reported by hognek) (#2356). + +- **CI**: `secret-ignores-gate` workflow and `scripts/check_secret_ignores.py` now + assert, on push to `master`/`dev`/`release/*` and on PRs to those branches, that the + committed `.gitignore` still contains every secret-protection rule (`*.key`, + `*.p8`, `identity.json`, `*credentials.json`, `*creds*.json`, the `*_private.*` key + shapes, `secrets/`, `data/hub/`, and more) and that known secret-shaped paths + are all reported ignored by `git check-ignore`. Closes the "promotion must be + verified, not assumed" gap from #2171/#2173. Removing any one pattern is + proven to fail the gate by a parametrized test (tsk-laezfg). + +- **Desktop deps**: bump `dompurify` 3.4.12 -> 3.4.13 (GHSA-55q2-fjhq-7xh7, + moderate) and `nanoid` 5.1.11 -> 5.1.16 (CVE-2026-67214, high) in + `desktop/package-lock.json`; lock-only, both already within the declared + ranges. Split out of Dependabot #2331, whose grouped jsdom 30 bump fails + spa-build (jsdom 30 requires Node >=22.13; CI pins Node 20). + ## [1.0.0-beta.47] - 2026-08-09 ### Added diff --git a/changelog.d/2333-strike-quarantine-wiring.md b/changelog.d/2333-strike-quarantine-wiring.md deleted file mode 100644 index 43e1e759a..000000000 --- a/changelog.d/2333-strike-quarantine-wiring.md +++ /dev/null @@ -1,5 +0,0 @@ -### Added - -- Quarantined task cards surface their strike count and latest strike on the - task-detail response, and a lead can un-quarantine a card via - `POST /api/projects/{pid}/tasks/{tid}/unquarantine`, clearing its strikes (#2333). diff --git a/changelog.d/2338-hailo-hef-catalog-fixes.md b/changelog.d/2338-hailo-hef-catalog-fixes.md deleted file mode 100644 index d2c1e20c2..000000000 --- a/changelog.d/2338-hailo-hef-catalog-fixes.md +++ /dev/null @@ -1,7 +0,0 @@ -### Added - -- **Hailo-10H HEF model catalog**: five NPU-accelerated model manifests - (DeepSeek-R1-Distill-Qwen 1.5B, Llama 3.2 3B, Qwen2 1.5B, Qwen2.5 1.5B, - Qwen2.5 Coder 1.5B) now resolve and install via `hailo-ollama` on - Raspberry Pi 5 + AI HAT+2, and downloaded `.hef` files show up in the - local-files and orphan scans (#2338). diff --git a/changelog.d/2349-alias-editing.md b/changelog.d/2349-alias-editing.md deleted file mode 100644 index ba503c7c0..000000000 --- a/changelog.d/2349-alias-editing.md +++ /dev/null @@ -1,6 +0,0 @@ -### Added - -- The Agents app registry panel shows each agent's handle (alias) and lets the - owner or an admin edit it inline, saved via - `PATCH /api/agents/registry/{canonical_id}`. A leading `@` is display syntax - and is stripped before save (#2349). diff --git a/changelog.d/2352-memory-agent-traversal.md b/changelog.d/2352-memory-agent-traversal.md deleted file mode 100644 index a00b3385a..000000000 --- a/changelog.d/2352-memory-agent-traversal.md +++ /dev/null @@ -1,6 +0,0 @@ -### Security - -- Memory routes reject any `agent` value that is not a single plain path - component (separators, `.`/`..`, NUL all 400): the caller-controlled name - becomes a filesystem path component of the qmd `dbPath`, and a traversal - value could previously address SQLite files outside `agent-memory/` (#2352). diff --git a/changelog.d/2353-ci-node-22.md b/changelog.d/2353-ci-node-22.md deleted file mode 100644 index 618584cf8..000000000 --- a/changelog.d/2353-ci-node-22.md +++ /dev/null @@ -1,4 +0,0 @@ -### Changed - -- CI's `spa-build` job runs on Node 22 (was 20, now past end-of-life). Also - unblocks the jsdom 30 upgrade, which requires Node >= 22.13 (#2353). diff --git a/changelog.d/2356-registry-existence-hiding.md b/changelog.d/2356-registry-existence-hiding.md deleted file mode 100644 index 7ce8f5f25..000000000 --- a/changelog.d/2356-registry-existence-hiding.md +++ /dev/null @@ -1,7 +0,0 @@ -### Security - -- All owner-gated agent-registry routes are now existence-hiding: a caller who - does not own an agent gets the same 404 as a nonexistent id, on the - scope-request create/approve/deny routes and on registry PATCH, revoke, - rotate-tokens, and org update. Previously a 403-vs-404 difference disclosed - whether an agent id existed (issue #2106, reported by hognek) (#2356). diff --git a/changelog.d/2357-wallpaper-fit-options.md b/changelog.d/2357-wallpaper-fit-options.md deleted file mode 100644 index bd50e3030..000000000 --- a/changelog.d/2357-wallpaper-fit-options.md +++ /dev/null @@ -1,6 +0,0 @@ -### Added - -- Wallpaper fit options in Settings → Desktop & Dock: fill, fit, stretch, - center, and tile. The choice is persisted per device (localStorage, keyed - by a locally minted device id that is never sent to the server), so each - screen keeps the fit that suits its aspect ratio (#2357). diff --git a/changelog.d/2361-lists-store-cursor-rollback.md b/changelog.d/2361-lists-store-cursor-rollback.md deleted file mode 100644 index 080159d0d..000000000 --- a/changelog.d/2361-lists-store-cursor-rollback.md +++ /dev/null @@ -1,6 +0,0 @@ -### Fixed - -- Project list entries: `get_entry` no longer reads cursor metadata after the - cursor closes, and a failed reorder now rolls back its partial updates so a - later unrelated write cannot commit a half-applied ordering (tsk-u23vjy, - fix-forward of #2183). diff --git a/changelog.d/2363-v1-consent-key-passthrough.md b/changelog.d/2363-v1-consent-key-passthrough.md deleted file mode 100644 index a78d184d0..000000000 --- a/changelog.d/2363-v1-consent-key-passthrough.md +++ /dev/null @@ -1,7 +0,0 @@ -### Fixed - -- The Agent-as-a-Model surface (`GET /v1/models`, `POST /v1/chat/completions`) - is now reachable by external OpenAI-compatible clients: the auth middleware - passes exactly those two routes through to their own consent-key check - instead of rejecting every session-less caller before the handler ran. All - other `/v1` paths remain session-gated (tsk-hfs6zv). diff --git a/changelog.d/fix-auth-status-ua-symmetry.md b/changelog.d/fix-auth-status-ua-symmetry.md deleted file mode 100644 index 4c8bb7c50..000000000 --- a/changelog.d/fix-auth-status-ua-symmetry.md +++ /dev/null @@ -1,9 +0,0 @@ -### Fixed - -- **PWA refresh loop after a browser auto-update**: `/auth/status`, `/auth/me` - and the chat/canvas/terminal/web-chat WebSocket handlers now apply the same - session User-Agent binding check as the API middleware. Previously a session - created before a browser update kept reading as authenticated on - `/auth/status` while every `/api/*` call was rejected, so the desktop shell - remounted in a loop; the WebSocket endpoints conversely accepted a cookie - the APIs refused. diff --git a/changelog.d/tsk-icpt4i-agent-loop-wiring.md b/changelog.d/tsk-icpt4i-agent-loop-wiring.md deleted file mode 100644 index 30d57e50c..000000000 --- a/changelog.d/tsk-icpt4i-agent-loop-wiring.md +++ /dev/null @@ -1,12 +0,0 @@ -### Changed - -- **Agent loop wiring**: `AgentLoop` is now the single per-agent serialization - owner. `AgentChatRouter` drives OpenClaw ACP turns through a per-agent - `AgentLoop` (replacing the per-agent lock) and the turn-holder drives - messages queued mid-turn at its safe point. The desktop taOS agent chat - endpoint serializes on one `AgentLoop` too — fixing a race where two - concurrent POSTs shared the opencode session with no serialization — - queueing concurrent messages and surfacing them in the turn-holder's stream - tail. New `GET /api/taos-agent/status` endpoint returns the desktop loop's - status scoped to state / current turn / queue depth / subagent descriptors - (subagent result/error payloads stay server-side) (#tsk-icpt4i). diff --git a/changelog.d/tsk-laezfg-secret-ignores-gate.md b/changelog.d/tsk-laezfg-secret-ignores-gate.md deleted file mode 100644 index a65337acb..000000000 --- a/changelog.d/tsk-laezfg-secret-ignores-gate.md +++ /dev/null @@ -1,12 +0,0 @@ -### Security - -- **CI**: `secret-ignores-gate` workflow and `scripts/check_secret_ignores.py` now - assert, on push to `master`/`dev`/`release/*` and on PRs to those branches, that the - committed `.gitignore` still contains every secret-protection rule (`*.key`, - `*.p8`, `identity.json`, `*credentials.json`, `*creds*.json`, the `*_private.*` key - shapes, `secrets/`, `data/hub/`, and more) and that known secret-shaped paths - (`data/hub/identity.json`, `foo.key`, `creds.json`, `x.p8`, `y_credentials.json`, - ...) are all reported ignored by `git check-ignore`. Closes the "promotion must be - verified, not assumed" gap from #2171/#2173: a `.gitignore` conflict resolution can - quietly drop a key-material rule while every test stays green. Removing any one - pattern is proven to fail the gate by a parametrized test. diff --git a/changelog.d/tsk-n3w5mh-store-wiring-gate.md b/changelog.d/tsk-n3w5mh-store-wiring-gate.md deleted file mode 100644 index b0bf0a7cc..000000000 --- a/changelog.d/tsk-n3w5mh-store-wiring-gate.md +++ /dev/null @@ -1,11 +0,0 @@ -### Added - -- **CI**: store-wiring-gate workflow and `scripts/check_store_wiring.py` guard. - A PR that adds a new BaseStore subclass without wiring it into - `tinyagentos/app.py` now fails CI and names the unreachable class and file. - Routes reach stores ONLY via `request.app.state`, so an unwired store is - dead code. Start with a NAME-LEVEL check (class name appears in the lifespan - file). Only newly added classes are policed; pre-existing orphans are not - flagged. A `Store-Unwired-Intentionally: , ` trailer in the - PR body waives a named class and logs it, for stores genuinely constructed - elsewhere (tests, CLI, workers). diff --git a/changelog.d/tsk-ppgpln-context-window.md b/changelog.d/tsk-ppgpln-context-window.md deleted file mode 100644 index 3ff41ec0b..000000000 --- a/changelog.d/tsk-ppgpln-context-window.md +++ /dev/null @@ -1,8 +0,0 @@ -### Fixed - -- **Catalog manifests' `context_window` was silently dropped**: `AppManifest` - declared no `context_window` field and `from_dict` never read the YAML - value, so every manifest loaded as 0 and the chat context-window budget code - always fell back to the 4000-token "unknown window" default. The field now - loads onto `AppManifest` (0 reserved for unknown), so real windows — e.g. - rkllm 4096, qwen 32768 — drive the #1740 budget math. (#2338, #1740) diff --git a/changelog.d/tsk-rl2lfb-agent-loop.md b/changelog.d/tsk-rl2lfb-agent-loop.md deleted file mode 100644 index feeca9733..000000000 --- a/changelog.d/tsk-rl2lfb-agent-loop.md +++ /dev/null @@ -1,6 +0,0 @@ -### Added - -- **Agent loop infrastructure**: new `tinyagentos.agent_loop.AgentLoop` library - for subagent delegation and safe-point message queuing. Landed as - standalone infrastructure; wired into the chat router and taOS agent - routes in #tsk-icpt4i (#tsk-rl2lfb). diff --git a/desktop/package.json b/desktop/package.json index ad583b429..32187a70a 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -1,7 +1,7 @@ { "name": "tinyagentos-desktop", "private": true, - "version": "1.0.0-beta.47", + "version": "1.0.0-beta.48", "type": "module", "scripts": { "dev": "vite", diff --git a/pyproject.toml b/pyproject.toml index 271d9fe9a..82de8626d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "tinyagentos" -version = "1.0.0-beta.47" +version = "1.0.0-beta.48" description = "Self-hosted AI agent memory system for low-power hardware" license = { file = "LICENSE" } # Upper-capped at <3.14 because litellm (the proxy extra, the agent/model proxy diff --git a/tinyagentos/__init__.py b/tinyagentos/__init__.py index 76a4dd6a0..b910d6c70 100644 --- a/tinyagentos/__init__.py +++ b/tinyagentos/__init__.py @@ -1 +1 @@ -__version__ = "1.0.0-beta.47" +__version__ = "1.0.0-beta.48" diff --git a/uv.lock b/uv.lock index c5f3ee940..df9735c6f 100644 --- a/uv.lock +++ b/uv.lock @@ -3063,7 +3063,7 @@ wheels = [ [[package]] name = "tinyagentos" -version = "1.0.0b47" +version = "1.0.0b48" source = { editable = "." } dependencies = [ { name = "aiosqlite" },