From 12a5f5919e011bac963d3cc637dc014f9f7eb574 Mon Sep 17 00:00:00 2001 From: Codeman maintainer Date: Wed, 5 Aug 2026 22:36:51 +0200 Subject: [PATCH] chore: version packages --- .changeset/fix-claude-viewer-session-pin.md | 22 ------- CHANGELOG.md | 64 +++++++++++++++++++++ CLAUDE.md | 2 +- package-lock.json | 4 +- package.json | 2 +- 5 files changed, 68 insertions(+), 26 deletions(-) delete mode 100644 .changeset/fix-claude-viewer-session-pin.md diff --git a/.changeset/fix-claude-viewer-session-pin.md b/.changeset/fix-claude-viewer-session-pin.md deleted file mode 100644 index caf457b1..00000000 --- a/.changeset/fix-claude-viewer-session-pin.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -'aicodeman': patch ---- - -fix(web): stop the Claude response viewer from following another session's conversation - -The viewer re-derived a pane's live conversation by taking the newest -`~/.claude/history.jsonl` entry for the pane's cwd. A cwd is shared with every -other Codeman tab on it, with tabs long since closed, and with any plain -`claude` run in the user's own terminal, so the eye followed whichever of those -was typed into last — and the adoption was written back to the session, so the -mispin persisted. Entries are now credited to a pane only when they land within -10s of that pane's own Enter and no other pane on the cwd submitted closer, the -same last-submit correlation the Codex locator already uses. - -That correlation also has to survive a restart. `start()` resets -`claudeSessionId` to the launch id even when re-attaching to a mux session whose -CLI has since moved on via `/clear`, so a recovered pane pointed the viewer at -its pre-`/clear` transcript — and with the anchor itself living only in memory, -nothing corrected it until the user happened to type again. `lastSubmitAt` is -now persisted in `SessionState` and restored on boot recovery, so the viewer -re-derives the live conversation on its first poll. diff --git a/CHANGELOG.md b/CHANGELOG.md index 44dd495f..584a9ae1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,69 @@ # aicodeman +## 1.11.1 + +### Patch Changes + +- fix(history): Past Sessions data quality, and gate the phone run picker on CLI availability + + **Past Sessions data quality (#215).** Three bugs in the transcript scanner behind + the Cmd+K Session Manager and the phone overview's PAST SESSIONS list: + - Automated/SDK-driven transcripts (CI review bots and other tooling, which Claude + Code stamps with a non-`cli` `entrypoint`) were listed alongside real interactive + sessions even though they were never resumable. They are now excluded. Detection + scans every entrypoint-bearing message rather than stopping at the first, so a + transcript that began under an older Claude Code build and only later picked up a + non-`cli` entrypoint is no longer wrongly hidden. + - A resumed session could show a same-directory sibling's preview text as its own. + The `workingDir` backfill in `mergeUnifiedSessions()` now only ever applies to rows + that have no history entry of their own, so it can no longer overwrite a row's real + content with another conversation's. + - Sessions restarted many times accumulated enough bookkeeping lines to push the real + first prompt past the scanner's 16KB head-read window, leaving a blank row. The read + is now two-tier: 16KB first, escalating to 128KB only when that was not enough, which + is both correct and cheaper than reading 128KB unconditionally (measured on a real + transcript tree: 36% fewer bytes read, roughly 17.5% faster than the unconditional + version). Also restores the tail-read fallback for a file whose head read failed + outright (for example `EMFILE` while scanning hundreds of files), which had been + silently dropping the session from history. + + Follow-up hardening on top of the above: the automated-transcript exclusion now + blocklists the SDK entrypoint shape (`sdk`, `sdk-cli`, `sdk-py`) instead of allowlisting + the exact value `cli`. Because the check hides rows, an allowlist failed closed on any + value Claude Code has not shipped yet: a future rename of the interactive entrypoint, + or a second interactive host, would have blanked the entire Past Sessions list with + nothing in the UI to explain it. An unrecognized automated entrypoint now costs a few + noisy rows instead, which is the annoyance this filter set out to fix rather than a + broken feature. + + **Phone overview run picker (#214).** The "C" logo home screen's Run picker listed all + six backends regardless of what was installed, so tapping an uninstalled one produced a + failed launch instead of the entry simply not being offered. It is now gated on + `isCliAvailable()` exactly like the desktop toolbar's run-mode dropdown (shell exempt, + since it has no external CLI dependency and keeps the menu from ever being empty). The + picker is a hardcoded duplicate of the toolbar menu rather than a shared render, which + is why it never picked up the earlier gating work; a test now asserts that every mode + the picker offers is gated, so a newly added backend cannot silently drift again. + +- 73315bc: fix(web): stop the Claude response viewer from following another session's conversation + + The viewer re-derived a pane's live conversation by taking the newest + `~/.claude/history.jsonl` entry for the pane's cwd. A cwd is shared with every + other Codeman tab on it, with tabs long since closed, and with any plain + `claude` run in the user's own terminal, so the eye followed whichever of those + was typed into last — and the adoption was written back to the session, so the + mispin persisted. Entries are now credited to a pane only when they land within + 10s of that pane's own Enter and no other pane on the cwd submitted closer, the + same last-submit correlation the Codex locator already uses. + + That correlation also has to survive a restart. `start()` resets + `claudeSessionId` to the launch id even when re-attaching to a mux session whose + CLI has since moved on via `/clear`, so a recovered pane pointed the viewer at + its pre-`/clear` transcript — and with the anchor itself living only in memory, + nothing corrected it until the user happened to type again. `lastSubmitAt` is + now persisted in `SessionState` and restored on boot recovery, so the viewer + re-derives the live conversation on its first poll. + ## 1.11.0 ### Minor Changes diff --git a/CLAUDE.md b/CLAUDE.md index 55d0d7b7..4c6c9759 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -74,7 +74,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.11.0 (must match `package.json`) +**Version**: 1.11.1 (must match `package.json`) ## Project Overview diff --git a/package-lock.json b/package-lock.json index 4747c4ee..eddf2657 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "aicodeman", - "version": "1.11.0", + "version": "1.11.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "aicodeman", - "version": "1.11.0", + "version": "1.11.1", "hasInstallScript": true, "license": "MIT", "workspaces": [ diff --git a/package.json b/package.json index 2743d60a..89fac5e3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "aicodeman", - "version": "1.11.0", + "version": "1.11.1", "description": "Mission control for AI coding agents - run 20 autonomous agents with real-time monitoring and session persistence", "type": "module", "main": "dist/index.js",