diff --git a/.changeset/eventstream-iterator-cancel.md b/.changeset/eventstream-iterator-cancel.md deleted file mode 100644 index b0a96e5..0000000 --- a/.changeset/eventstream-iterator-cancel.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@gemstack/ai-autopilot': patch ---- - -fix(ai-autopilot): EventStream iterators are now cancellable - -A consumer's async iterator gained a `return()` that drops its waiter from the stream and settles any pending `next()`. Previously a consumer that stopped iterating (e.g. a disconnected SSE client) left its waiter registered until the next `push`/`close`, so many short-lived consumers on an idle stream leaked. Live iteration and history replay are unchanged. diff --git a/.changeset/relay-sandbox-hardening.md b/.changeset/relay-sandbox-hardening.md deleted file mode 100644 index 473cf38..0000000 --- a/.changeset/relay-sandbox-hardening.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@gemstack/framework': patch ---- - -fix(framework): harden the run relay and workspace sandbox against resource exhaustion - -- The relay now caps how many runs it holds in memory and evicts the least-recently-used one on overflow. Because it is unauthenticated, an anonymous request to `/r//…` could previously create per-run state that was never freed; run creation is now bounded (`maxRuns`, default 200). -- A disconnected SSE viewer now cancels its stream iterator, releasing its waiter immediately instead of lingering on the stream until the next event (which may never arrive for an idle run). -- `snapshotWorkspace` checks a file's size before reading it, so a large asset in the workspace is skipped without ever being loaded into memory during a `--sandbox docker` sync. -- `relayPublisher`'s POST has a timeout, so a relay that accepts a connection but never responds can no longer hang the CLI on exit (`flush()`). diff --git a/packages/ai-autopilot/CHANGELOG.md b/packages/ai-autopilot/CHANGELOG.md index 2f4d0c2..4c5a34e 100644 --- a/packages/ai-autopilot/CHANGELOG.md +++ b/packages/ai-autopilot/CHANGELOG.md @@ -1,5 +1,13 @@ # @gemstack/ai-autopilot +## 0.9.1 + +### Patch Changes + +- 734da1a: fix(ai-autopilot): EventStream iterators are now cancellable + + A consumer's async iterator gained a `return()` that drops its waiter from the stream and settles any pending `next()`. Previously a consumer that stopped iterating (e.g. a disconnected SSE client) left its waiter registered until the next `push`/`close`, so many short-lived consumers on an idle stream leaked. Live iteration and history replay are unchanged. + ## 0.9.0 ### Minor Changes diff --git a/packages/ai-autopilot/package.json b/packages/ai-autopilot/package.json index 66e6d3a..e9140e5 100644 --- a/packages/ai-autopilot/package.json +++ b/packages/ai-autopilot/package.json @@ -1,6 +1,6 @@ { "name": "@gemstack/ai-autopilot", - "version": "0.9.0", + "version": "0.9.1", "description": "Orchestration for @gemstack/ai-sdk agents: a Supervisor that plans, dispatches subagents (bounded concurrency + budget guardrails), and synthesizes the result.", "keywords": [ "ai", diff --git a/packages/framework/CHANGELOG.md b/packages/framework/CHANGELOG.md index e12c167..4e53a2f 100644 --- a/packages/framework/CHANGELOG.md +++ b/packages/framework/CHANGELOG.md @@ -1,5 +1,19 @@ # @gemstack/framework +## 0.8.1 + +### Patch Changes + +- 734da1a: fix(framework): harden the run relay and workspace sandbox against resource exhaustion + + - The relay now caps how many runs it holds in memory and evicts the least-recently-used one on overflow. Because it is unauthenticated, an anonymous request to `/r//…` could previously create per-run state that was never freed; run creation is now bounded (`maxRuns`, default 200). + - A disconnected SSE viewer now cancels its stream iterator, releasing its waiter immediately instead of lingering on the stream until the next event (which may never arrive for an idle run). + - `snapshotWorkspace` checks a file's size before reading it, so a large asset in the workspace is skipped without ever being loaded into memory during a `--sandbox docker` sync. + - `relayPublisher`'s POST has a timeout, so a relay that accepts a connection but never responds can no longer hang the CLI on exit (`flush()`). + +- Updated dependencies [734da1a] + - @gemstack/ai-autopilot@0.9.1 + ## 0.8.0 ### Minor Changes diff --git a/packages/framework/package.json b/packages/framework/package.json index 952f9b6..11a0aa1 100644 --- a/packages/framework/package.json +++ b/packages/framework/package.json @@ -1,6 +1,6 @@ { "name": "@gemstack/framework", - "version": "0.8.0", + "version": "0.8.1", "description": "The (AI) Framework: turnkey, zero-config AI orchestration that wraps a coding-agent CLI (Claude Code) as a black box and takes you from an idea to a running app. Vite for AI.", "keywords": [ "ai",