diff --git a/CHANGELOG.md b/CHANGELOG.md index 67f715ec..8ac73b63 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # aicodeman +## 1.1.6 + +### Patch Changes + +- Fix: ultracode floating run windows now pop on a fresh device/browser that loads while a run is already active. + + `ultracodeFloatingWindows` syncs from the server (it's a non-display setting), but on a first-time device the SSE `getLightState` run snapshot can seed the run list BEFORE the async settings load resolves — so the floating-window gate read `false` at that instant and skipped any already-active run, leaving the window un-popped until the next ~10s watcher tick. The app now re-runs `syncAllUltracodeFloatingWindows()` once server settings finish loading (in the `loadAppSettingsFromServer().then()` callback), so an in-flight run pops its window immediately. Idempotent: open windows are left as-is, and if the setting is off any premature windows are torn down. Verified end-to-end against a real in-flight run on an isolated instance — a pristine browser (empty localStorage) seeds the setting from the server and pops the active run's window ~0.4s after first paint. + + Also corrected a stale `@fileoverview` comment in `ultracode-windows.js` that claimed the floating windows are gated on `showUltracodeAgents`; they are gated on the dedicated `ultracodeFloatingWindows` toggle (only the docked "Ultracode Agents" panel uses `showUltracodeAgents`). + ## 1.1.5 ### Patch Changes diff --git a/CLAUDE.md b/CLAUDE.md index 808d0b7b..7f67e296 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -56,7 +56,7 @@ When user says "COM": CI runs `npm run check:lockfile` on every push/PR, so lockfile drift fails the build even if the `version-packages` script is bypassed. -**Version**: 1.1.5 (must match `package.json`) +**Version**: 1.1.6 (must match `package.json`) ## Project Overview diff --git a/package-lock.json b/package-lock.json index afbb2301..3acdd44a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "aicodeman", - "version": "1.1.5", + "version": "1.1.6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "aicodeman", - "version": "1.1.5", + "version": "1.1.6", "hasInstallScript": true, "license": "MIT", "workspaces": [ diff --git a/package.json b/package.json index b054edab..520db8c3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "aicodeman", - "version": "1.1.5", + "version": "1.1.6", "description": "Mission control for AI coding agents - run 20 autonomous agents with real-time monitoring and session persistence", "type": "module", "main": "dist/index.js", diff --git a/src/web/public/app.js b/src/web/public/app.js index a1e530b6..b5a824e0 100644 --- a/src/web/public/app.js +++ b/src/web/public/app.js @@ -665,6 +665,16 @@ class CodemanApp { this.applySkin(); this.applyTabWrapSettings(); this.applyMonitorVisibility(); + // ultracodeFloatingWindows syncs from the server (non-display key), but on a + // FRESH device the getLightState run snapshot can seed workflowRuns BEFORE this + // async settings load resolves — so the floating-window gate read false then and + // skipped any already-active run. Re-sync now that the real setting is loaded so + // an in-flight run pops its window immediately instead of waiting for the next + // ~10s SSE tick. Idempotent: open windows are left as-is; if the setting is off + // it tears any premature windows down. + if (typeof this.syncAllUltracodeFloatingWindows === 'function') { + this.syncAllUltracodeFloatingWindows(); + } }); // Hide loading skeleton now that the app shell is ready document.body.classList.add('app-loaded'); diff --git a/src/web/public/ultracode-windows.js b/src/web/public/ultracode-windows.js index 64eda6b1..3537e8ac 100644 --- a/src/web/public/ultracode-windows.js +++ b/src/web/public/ultracode-windows.js @@ -4,7 +4,9 @@ * * This is the "floating thing" companion to the docked master-detail panel in * `ultracode-panel.js` (the dock panel stays — these windows are ADDITIONAL). - * When the `showUltracodeAgents` setting is on, a small floating window pops up + * When the `ultracodeFloatingWindows` setting is on (a DEDICATED toggle, separate + * from the dock panel's `showUltracodeAgents` — see `_ultracodeFloatingEnabled`), + * a small floating window pops up * for each ACTIVE ultracode/Workflow run (status not completed/killed/failed), * mirroring the live agent grid, and is connected by a glowing line to the * Codeman tab whose `claudeSessionId` matches the run's `sessionUuid` — the same