Conversation
A claimed call that timed out was dropped at once, while its page was
still inside the Chrome call and not polling. The next command then
found nobody and failed as no_panel ("nothing is connected"), though the
page would have come back on its own.
The call now stays claimed until its late result arrives, or for
LATE_RESULT_MS (60s) should the page have closed mid-call. The next
command queues behind it instead.
Refs #86
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Chrome can finish grouping after groupTabs timed out, and the follow-up updateGroup was then skipped, leaving an untitled grey group. On a timeout, `tabs group` reads a fresh snapshot (served once the page is done) and, if every tab is in one group that was not there before (or the --to group), applies the title, color and collapse after all. Otherwise the timeout is reported as before. Refs #86 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
✅ e2e against a real Chrome14 passed, 0 failed
Chrome state after each stepAfter
|










What
Refs #86. Fixes the two CLI bugs from that issue. Why Chrome takes over 10s is still unconfirmed; see the investigation comment.
fix(session): a page still working on a timed-out call is busy, not gone. When a claimed call timed out, the server dropped it immediately, even though the page was still insidechrome.tabs.groupand not polling. The next command found no page and failed withno_panel("nothing is connected; runtabbrew session open"). Now the call stays claimed until its late result arrives, or for at mostLATE_RESULT_MS(60s) if the page closed while working. The next command queues behind it. A late result gets200instead of404 unknown_request; the SDK ignores that response either way.fix(tabs): keep--title/--colorwhen group creation times out. On agroupTabstimeout,tabs groupreads a fresh snapshot. Because of the first fix, that read is served once the page has finished. If every requested tab is in one group, it applies the title, colour and collapse, then exits 0. For--windowthat group must be new and in the requested window; for--toit must be the named group. Otherwise the original timeout error is reported. The check isfindGroupedinsrc/core/tabs/group.ts.The 10s operator timeout is unchanged on purpose: with both fixes a slow regroup completes correctly, it just takes longer.
Verified
bun run typecheck,bun run check,bun test: 415 pass, 14 skip, 0 fail.server.test.ts: a late result is accepted; a page still working on a timed-out call counts as busy, and the next call is served after it; a page that never answers is forgotten afterlateResultMs.core/tabs/group.test.ts:findGroupedcovers a new group, joining a group, partial grouping, a pre-existing group, the wrong window, and a missing tab.tabs.test.ts: end to end with a fake panel that answers after the timeout. Title and colour are still applied when Chrome did group the tabs; the timeout is reported when it didn't. The suite now runs with a 1.5s operator timeout so the slow cases stay short.Not in this PR
handleMoveTabdebounce in tabbrew-extension or a longer timeout for batch operators.tabs move,tabs close). They now leave the session usable after a timeout, but don't re-check what happened.Checklist
extension/and an e2e case insrc/e2e/: no extension or SDK change; the session and CLI are covered with a fake panel instead of e2e.🤖 Generated with Claude Code