diff --git a/.changeset/background-work-bar.md b/.changeset/background-work-bar.md deleted file mode 100644 index 88b252d4..00000000 --- a/.changeset/background-work-bar.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -"@paddock/server": minor -"@paddock/web": minor ---- - -Show background work that is still running, pinned above the composer (#604) - -A sub-agent already got a live row above the composer while it worked. Nothing -else did. A background `Bash`, a `Monitor`, or a workflow could run for minutes -behind a card scrolled far up the transcript, and the only hint was a static -`running` chip that meant "no completion notification was found in the -transcript" — not "we checked". A killed task kept that chip forever. - -Worse, the chat itself claimed to be idle. `chat:active` reports one hub turn, -and a background task outlives the turn that launched it, so the moment the -reply landed every consumer of that signal — the sidebar streaming dot, the Home -in-flight badge, the running-only filter, the composer's own streaming state — -was told the session had stopped while minutes of work continued. - -Both come from the same missing piece, and the Claude Agent SDK already -publishes it. `background_tasks_changed` carries the complete live task set on -every membership change, with `task_started` / `task_progress` / -`task_notification` adding per-task detail. herdctl already taps that stream to -decide session reaping; Paddock dropped it on the floor. - -- **New `BackgroundRegistry`** (`background-live.ts`) folds those signals into a - per-session live set, fed from all five turn paths. The level signal is the - sole authority on membership and edges may only enrich, so a missed edge cannot - wedge a stale row — the failure mode #528 was. -- **New `chat:background` frame**, broadcast on every change and replayed to a - newly-connected socket, so a remount or reload is populated on the first paint - instead of after a poll. -- **`chat:active.running` now accounts for background work**, which is the #604 - fix proper. Every consumer of the signal reads the truth. -- **`RunningSubagents` becomes `RunningWork`**, rendering shells, monitors and - workflows alongside sub-agents, with elapsed time and live step counts. A task - the transcript path already shows is not duplicated; ambient work the SDK marks - `skip_transcript` is hidden. - -The signal is per-process and emits nothing at startup, so after a server -restart the bar is empty until the next change. That is correct rather than a -gap: Paddock stops the fleet with `waitForJobs: false`, so those tasks are dead — -unlike the old chip, which went on claiming a killed task was alive. - -Session drive mode only; the CLI runtime reads the transcript file, which these -stream-only control messages never reach. diff --git a/package-lock.json b/package-lock.json index c2d4eedf..6d44ef10 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "paddock", - "version": "0.68.1", + "version": "0.69.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "paddock", - "version": "0.68.1", + "version": "0.69.0", "license": "MIT", "workspaces": [ "packages/*" @@ -10697,7 +10697,7 @@ }, "packages/server": { "name": "@paddock/server", - "version": "0.68.1", + "version": "0.69.0", "license": "MIT", "dependencies": { "@fastify/multipart": "^8.3.1", @@ -11645,7 +11645,7 @@ }, "packages/web": { "name": "@paddock/web", - "version": "0.68.1", + "version": "0.69.0", "license": "MIT", "dependencies": { "highlight.js": "^11.11.1", diff --git a/package.json b/package.json index a00a29ba..cc202c49 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "paddock", - "version": "0.68.1", + "version": "0.69.0", "private": true, "description": "Project-first launchpad built on herdctl. Server-hosted, persistent Claude Code sessions organized by project.", "license": "MIT", diff --git a/packages/server/CHANGELOG.md b/packages/server/CHANGELOG.md index 312d5abe..0d8828a1 100644 --- a/packages/server/CHANGELOG.md +++ b/packages/server/CHANGELOG.md @@ -1,5 +1,51 @@ # @paddock/server +## 0.69.0 + +### Minor Changes + +- [#807](https://github.com/edspencer/paddock/pull/807) [`b1a294d`](https://github.com/edspencer/paddock/commit/b1a294dccc448c1166dba07977f24736e81fef88) Thanks [@edspencer](https://github.com/edspencer)! - Show background work that is still running, pinned above the composer (#604) + + A sub-agent already got a live row above the composer while it worked. Nothing + else did. A background `Bash`, a `Monitor`, or a workflow could run for minutes + behind a card scrolled far up the transcript, and the only hint was a static + `running` chip that meant "no completion notification was found in the + transcript" — not "we checked". A killed task kept that chip forever. + + Worse, the chat itself claimed to be idle. `chat:active` reports one hub turn, + and a background task outlives the turn that launched it, so the moment the + reply landed every consumer of that signal — the sidebar streaming dot, the Home + in-flight badge, the running-only filter, the composer's own streaming state — + was told the session had stopped while minutes of work continued. + + Both come from the same missing piece, and the Claude Agent SDK already + publishes it. `background_tasks_changed` carries the complete live task set on + every membership change, with `task_started` / `task_progress` / + `task_notification` adding per-task detail. herdctl already taps that stream to + decide session reaping; Paddock dropped it on the floor. + + - **New `BackgroundRegistry`** (`background-live.ts`) folds those signals into a + per-session live set, fed from all five turn paths. The level signal is the + sole authority on membership and edges may only enrich, so a missed edge cannot + wedge a stale row — the failure mode #528 was. + - **New `chat:background` frame**, broadcast on every change and replayed to a + newly-connected socket, so a remount or reload is populated on the first paint + instead of after a poll. + - **`chat:active.running` now accounts for background work**, which is the #604 + fix proper. Every consumer of the signal reads the truth. + - **`RunningSubagents` becomes `RunningWork`**, rendering shells, monitors and + workflows alongside sub-agents, with elapsed time and live step counts. A task + the transcript path already shows is not duplicated; ambient work the SDK marks + `skip_transcript` is hidden. + + The signal is per-process and emits nothing at startup, so after a server + restart the bar is empty until the next change. That is correct rather than a + gap: Paddock stops the fleet with `waitForJobs: false`, so those tasks are dead — + unlike the old chip, which went on claiming a killed task was alive. + + Session drive mode only; the CLI runtime reads the transcript file, which these + stream-only control messages never reach. + ## 0.68.1 ## 0.68.0 diff --git a/packages/server/package.json b/packages/server/package.json index 0e6321ae..3a774e31 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,6 +1,6 @@ { "name": "@paddock/server", - "version": "0.68.1", + "version": "0.69.0", "private": true, "description": "Paddock backend: Fastify + WebSocket wrapping @herdctl/core FleetManager and a project layer.", "license": "MIT", diff --git a/packages/web/CHANGELOG.md b/packages/web/CHANGELOG.md index b523e054..2f5d50ba 100644 --- a/packages/web/CHANGELOG.md +++ b/packages/web/CHANGELOG.md @@ -1,5 +1,51 @@ # @paddock/web +## 0.69.0 + +### Minor Changes + +- [#807](https://github.com/edspencer/paddock/pull/807) [`b1a294d`](https://github.com/edspencer/paddock/commit/b1a294dccc448c1166dba07977f24736e81fef88) Thanks [@edspencer](https://github.com/edspencer)! - Show background work that is still running, pinned above the composer (#604) + + A sub-agent already got a live row above the composer while it worked. Nothing + else did. A background `Bash`, a `Monitor`, or a workflow could run for minutes + behind a card scrolled far up the transcript, and the only hint was a static + `running` chip that meant "no completion notification was found in the + transcript" — not "we checked". A killed task kept that chip forever. + + Worse, the chat itself claimed to be idle. `chat:active` reports one hub turn, + and a background task outlives the turn that launched it, so the moment the + reply landed every consumer of that signal — the sidebar streaming dot, the Home + in-flight badge, the running-only filter, the composer's own streaming state — + was told the session had stopped while minutes of work continued. + + Both come from the same missing piece, and the Claude Agent SDK already + publishes it. `background_tasks_changed` carries the complete live task set on + every membership change, with `task_started` / `task_progress` / + `task_notification` adding per-task detail. herdctl already taps that stream to + decide session reaping; Paddock dropped it on the floor. + + - **New `BackgroundRegistry`** (`background-live.ts`) folds those signals into a + per-session live set, fed from all five turn paths. The level signal is the + sole authority on membership and edges may only enrich, so a missed edge cannot + wedge a stale row — the failure mode #528 was. + - **New `chat:background` frame**, broadcast on every change and replayed to a + newly-connected socket, so a remount or reload is populated on the first paint + instead of after a poll. + - **`chat:active.running` now accounts for background work**, which is the #604 + fix proper. Every consumer of the signal reads the truth. + - **`RunningSubagents` becomes `RunningWork`**, rendering shells, monitors and + workflows alongside sub-agents, with elapsed time and live step counts. A task + the transcript path already shows is not duplicated; ambient work the SDK marks + `skip_transcript` is hidden. + + The signal is per-process and emits nothing at startup, so after a server + restart the bar is empty until the next change. That is correct rather than a + gap: Paddock stops the fleet with `waitForJobs: false`, so those tasks are dead — + unlike the old chip, which went on claiming a killed task was alive. + + Session drive mode only; the CLI runtime reads the transcript file, which these + stream-only control messages never reach. + ## 0.68.1 ### Patch Changes diff --git a/packages/web/package.json b/packages/web/package.json index 7f687988..4e9e4707 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -1,6 +1,6 @@ { "name": "@paddock/web", - "version": "0.68.1", + "version": "0.69.0", "private": true, "description": "Paddock project-first web SPA (Vite + React + Tailwind).", "license": "MIT",