diff --git a/.changeset/brave-pans-pay.md b/.changeset/brave-pans-pay.md deleted file mode 100644 index a845151..0000000 --- a/.changeset/brave-pans-pay.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/calm-posts-coalesce.md b/.changeset/calm-posts-coalesce.md deleted file mode 100644 index 52f9167..0000000 --- a/.changeset/calm-posts-coalesce.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"sideshow": patch ---- - -Coalesce the session-list refreshes triggered by a burst of live post events. Each post still streams into the open session independently, while sidebar metadata waits for a short quiet window and shares one request instead of fetching the full session list once per post. diff --git a/.changeset/compact-live-viewer-posts.md b/.changeset/compact-live-viewer-posts.md deleted file mode 100644 index 7954442..0000000 --- a/.changeset/compact-live-viewer-posts.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"sideshow": patch ---- - -Stop live viewer updates from downloading a post's complete revision history. Live post refetches now use an explicit compact viewer representation with current render data and a retained-version count, while the existing post detail endpoints keep returning full history. diff --git a/.changeset/curly-flies-swim.md b/.changeset/curly-flies-swim.md deleted file mode 100644 index a845151..0000000 --- a/.changeset/curly-flies-swim.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/fresh-deps-pass.md b/.changeset/fresh-deps-pass.md deleted file mode 100644 index 18ada1b..0000000 --- a/.changeset/fresh-deps-pass.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"sideshow": patch ---- - -Refresh runtime and build dependencies to patched releases so the security audit passes with no known vulnerabilities. This also moves the Cloudflare type configuration to the current package entrypoint required by the latest Wrangler release. diff --git a/.changeset/good-nails-dream.md b/.changeset/good-nails-dream.md deleted file mode 100644 index a845151..0000000 --- a/.changeset/good-nails-dream.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/jolly-dingos-spend.md b/.changeset/jolly-dingos-spend.md deleted file mode 100644 index a845151..0000000 --- a/.changeset/jolly-dingos-spend.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/narrow-session-counts.md b/.changeset/narrow-session-counts.md deleted file mode 100644 index 3069623..0000000 --- a/.changeset/narrow-session-counts.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"sideshow": patch ---- - -Make the session-list endpoint count posts through a narrow store aggregate. SQLite no longer selects or decodes post surfaces and history, while the JSON store avoids cloning and sorting posts after loading the workspace. Custom stores without the optional capability keep the existing `listPosts` fallback. diff --git a/.changeset/quick-sqlite-paths.md b/.changeset/quick-sqlite-paths.md deleted file mode 100644 index a7cf207..0000000 --- a/.changeset/quick-sqlite-paths.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"sideshow": patch ---- - -Speed up SQLite-backed workspaces by indexing session posts, recent posts, comment lookups, and session assets. diff --git a/.changeset/quiet-actors-smile.md b/.changeset/quiet-actors-smile.md deleted file mode 100644 index 0f426f0..0000000 --- a/.changeset/quiet-actors-smile.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"sideshow": patch ---- - -Align the shipped Pi extension with the current post contract: support JSON and code surfaces, require a real surface target for browser-thread replies, and remove experimental trace publishing from agent-facing schemas and guidance. diff --git a/.changeset/slim-session-hydrate.md b/.changeset/slim-session-hydrate.md deleted file mode 100644 index 44ee97d..0000000 --- a/.changeset/slim-session-hydrate.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -"sideshow": patch ---- - -Stop shipping surface bodies the viewer never reads in the session hydrate -response. Opening a session fetches `GET /api/sessions/:id/posts?hydrate=1`, -which served every post through `postDetailView` — the full current surfaces -plus every prior version's surfaces. But a sandboxed surface (`html`, `diff`, -`markdown`, `terminal`, `mermaid`, `code`) renders as an opaque-origin iframe -pointed at `/s/:id?part=N`, which fetches its own body; the viewer only ever -reads `{ id, kind, index }` to build that URL. So the hydrate response carried a -second, unread copy of every surface in the session, and it blocks the stream -from rendering. - -`?hydrate=1` now drops just the content field of sandboxed surfaces, and reduces -history surfaces to refs (history is there to size the version dropdown — -choosing an older version re-points each iframe at `?ver=N`, so past bodies are -never rendered from this payload either). Native kinds — `image`, `trace`, -`json` — do render from inline data and are untouched. Across the six largest -sessions in a real store this cut the response 95% raw / 91% gzipped. - -`GET /api/posts/:id` and the MCP `read_post` tool still return full detail; only -the session-list hydrate view changed. diff --git a/.changeset/tidy-carpets-brush.md b/.changeset/tidy-carpets-brush.md deleted file mode 100644 index a845151..0000000 --- a/.changeset/tidy-carpets-brush.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/token-keyed-frame-registry.md b/.changeset/token-keyed-frame-registry.md deleted file mode 100644 index 68eeec5..0000000 --- a/.changeset/token-keyed-frame-registry.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -"sideshow": patch ---- - -Fix surface iframes staying stuck at their seed height when a host mounts two -viewer instances into one JS realm at once (e.g. an embedding host that -cross-fades an outgoing viewer into an incoming one during an in-place -navigation). Because the engine loads as a single shared module, both instances -shared the module-level surface-frame registry (`cardEls`) and the single -`message` bridge listener. Two instances routing to the same URL rendered a -`Card` for the same post, so keying `cardEls` by post id let them clobber each -other's entry — and the outgoing instance's teardown deleted the entry the -still-visible instance needed, so its surface `resize` messages were dropped and -the frames never grew past their seed height. The shared listener had the same -hazard: `removeEventListener` on the first teardown tore it out from under the -survivor. - -`cardEls` is now keyed by a per-`Card` token (resolved by `contentWindow`, with a -new `cardForPost` for the scroll-to-card pill), and the bridge listener is -reference-counted so it lives while any viewer is mounted. Self-hosted single- -instance behavior is unchanged. diff --git a/.changeset/yellow-hoops-grin.md b/.changeset/yellow-hoops-grin.md deleted file mode 100644 index cc960b0..0000000 --- a/.changeset/yellow-hoops-grin.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"sideshow": patch ---- - -Add a minimal control to collapse the desktop session sidebar into a narrow rail. diff --git a/CHANGELOG.md b/CHANGELOG.md index fe74111..6be452b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,39 @@ # Changelog +## 0.13.0 + +### Minor Changes + +- 8822dea: Add a minimal control to collapse the desktop session sidebar into a narrow rail. + +### Patch Changes + +- 4161897: Coalesce the session-list refreshes triggered by a burst of live post events. Each post still streams into the open session independently, while sidebar metadata waits for a short quiet window and shares one request instead of fetching the full session list once per post. +- 120705e: Stop live viewer updates and session hydration from downloading a post's complete revision history. Both paths now use a compact viewer representation with current render metadata, native surface data, and a retained-version count, while the existing post detail endpoints keep returning full history. +- 6f81fa1: Refresh runtime and build dependencies to patched releases so the security audit passes with no known vulnerabilities. This also moves the Cloudflare type configuration to the current package entrypoint required by the latest Wrangler release. +- 287bb3d: Make the session-list endpoint count posts through a narrow store aggregate. SQLite no longer selects or decodes post surfaces and history, while the JSON store avoids cloning and sorting posts after loading the workspace. Custom stores without the optional capability keep the existing `listPosts` fallback. +- f15dc13: Speed up SQLite-backed workspaces by indexing session posts, recent posts, comment lookups, and session assets. +- 66c5f74: Align the shipped Pi extension with the current post contract: support JSON and code surfaces, require a real surface target for browser-thread replies, and remove experimental trace publishing from agent-facing schemas and guidance. +- 2b98bbf: Cut session-opening hydrate responses by omitting sandboxed surface bodies the viewer never reads. Sandboxed surfaces render through their own versioned iframe URLs, so duplicating those bodies in the session payload only delayed the stream. Across the six largest sessions in a real store, this reduced the response by 95% raw and 91% gzipped. The compact viewer contract above now also replaces retained history with a version count, while full post-detail APIs remain unchanged. + +- 9bbcb5e: Fix surface iframes staying stuck at their seed height when a host mounts two + viewer instances into one JS realm at once (e.g. an embedding host that + cross-fades an outgoing viewer into an incoming one during an in-place + navigation). Because the engine loads as a single shared module, both instances + shared the module-level surface-frame registry (`cardEls`) and the single + `message` bridge listener. Two instances routing to the same URL rendered a + `Card` for the same post, so keying `cardEls` by post id let them clobber each + other's entry — and the outgoing instance's teardown deleted the entry the + still-visible instance needed, so its surface `resize` messages were dropped and + the frames never grew past their seed height. The shared listener had the same + hazard: `removeEventListener` on the first teardown tore it out from under the + survivor. + + `cardEls` is now keyed by a per-`Card` token (resolved by `contentWindow`, with a + new `cardForPost` for the scroll-to-card pill), and the bridge listener is + reference-counted so it lives while any viewer is mounted. Self-hosted single- + instance behavior is unchanged. + ## 0.12.0 ### Minor Changes diff --git a/package-lock.json b/package-lock.json index 702fad2..c2678dc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "sideshow", - "version": "0.12.0", + "version": "0.13.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "sideshow", - "version": "0.12.0", + "version": "0.13.0", "license": "MIT", "dependencies": { "@hono/node-server": "^2.1.0", diff --git a/package.json b/package.json index 5be7643..ee3d1e6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sideshow", - "version": "0.12.0", + "version": "0.13.0", "description": "A live visual surface for terminal coding agents — agents draw HTML snippets, you watch them in the browser and comment back.", "keywords": [ "agent-tools",