Repository navigation
feat(cmux-next): ship inline /btw side questions - #26108
Conversation
|
cmux status (one comment, edited in place; each line is updated by the job that owns it) Review App of this head (app.zip, kept 1 day)
Unclear: CI failed on
Failures:
Matched log linesNot re-run automatically: Written by red: cmux-next checks (god files, concurrency, crash safety, l10n); no finished base run on 51e238d to compare; do not merge until green; see lane-rules Gallery before/after for
States
Pick other states with a |
|
Found 7 test failures on Blacksmith runners: Failures
|
|
Bead |
9175aac to
5d3a748
Compare
5d3a748 to
91f0b27
Compare
91f0b27 to
2c14770
Compare
Bugbot needs on-demand usage enabledBugbot uses usage-based billing for this team and requires on-demand usage to be enabled. A team admin can enable on-demand usage in the Cursor dashboard. |
Bugbot needs on-demand usage enabledBugbot uses usage-based billing for this team and requires on-demand usage to be enabled. A team admin can enable on-demand usage in the Cursor dashboard. |
|
Review (review_btw_26108): SHIP at 936cf63 |
|
Addressed review-26108-75b9. Added the missing |
|
Swift suites for inline Head step
Every other suite passes, including the new Agent session: agent session |
|
Owned by an agent session · took over from an earlier session · session |
…line # Conflicts: # Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/AgentPageProvider.swift
|
Merged Conflict: the Checks: This needs a re-review at the new head. Agent session: agent session |
|
Review (codex-review-box/gpt-6-astra high, lane-place): BLOCK at 2c83874 BLOCK
|
…ession spawned with
The inline fallback's cleanup looked for the temporary Claude/Codex
transcript with the parent chat's raw profile and preset env, so a store
set with a template (CLAUDE_CONFIG_DIR="${home}/isolated-claude", which
HarnessHomes::with_env skips) or by a family default was searched in the
default store and the ghost conversation stayed discoverable.
btw_cleanup now resolves the side session's env with spawn_profile_for,
the spawn's own layering (family and profile defaults, preset, ${home} /
${cwd} / ${model} / ~/ expansion, chat store, session env, route), read
before the kill. The parent env remains only as a fallback when the
profile no longer resolves. Tests cover a ${home} profile store and a
family-default store.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-ab1f035a409b977caceb
Resolves the composerSnapshot deps conflict in App.tsx: keeps this branch's always-reserved /btw (no opensSideSessions dep) and base's /side action (localCwd, quick). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-ab1f035a409b977caceb
|
Review (codex gpt-6-astra high, review-router): SHIP at 4424606 The earlier cleanup BLOCK is fixed: cleanup rebuilds the spawn-time profile, preset, family defaults and ${home}/${cwd} expansion before locating transcripts. No other P0-P2 correctness issues found. (Reviewed through the review-router route because no review box would start.) Agent session: agent session |
…gallery plays
- The /btw highlight names a Try it action (release-notary needs a tryIt or docs link).
- App.tsx's merged dependency list takes vp fmt's one-line form.
- The /btw aside gallery plays ask through an acpmux client: the asking variants run the
mock daemon (which can now name capabilities for a gallery, here btw-inline-v1), show
the chat it attached to in a folder it trusts, wait for the trust answer before typing,
and answer chat.btw.inline as { text } like the app does.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-ab1f035a409b977caceb
Bugbot needs on-demand usage enabledBugbot uses usage-based billing for this team and requires on-demand usage to be enabled. A team admin can enable on-demand usage in the Cursor dashboard. |
|
Review (codex-review-box/gpt-6-astra high, lane-place): BLOCK at 44f3394 BLOCK
|
… btw path Addresses review-26108-44f3's BLOCK at 44f3394. - A fork whose session cannot be saved removes the transcript it copied (or its agent made) before returning the error: nothing owns it, and an inline /btw's fork must not outlive the question. The parent's own transcript is never touched. - An inline creation that fails after publishing cleans up the request's own session and its transcript (found by the request-unique name and parent), as timeouts already did. - Regression: inline_btw_fork_that_fails_to_save_leaves_no_copied_transcript (fails without the fork.rs change, passes with it). - The btw request, harness env, mode, fork point, settle, model and cleanup futures are boxed: at 4424606, a_codex_side_session_runs_sandboxed_read_only_and_the_adapter_is_refused overflowed its stack under plain `cargo test` (it passes on feat-cmux-next 90e1666 and now passes here). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-ab1f035a409b977caceb
…into lane/btw-inline # Conflicts: # cmux-tui/crates/acpmux/src/capabilities.rs
|
Review (codex-review-box/gpt-6-astra high, lane-place): BLOCK at 80c4f4b BLOCK
|
|
Review (codex-review-box/gpt-6-astra high, lane-place): BLOCK at e717025 BLOCK
|
…nscript Addresses review-26108-e717's BLOCK at e717025 (and review-26108-80c4's at 80c4f4b). `new_session` and `fork` discard a creation that fails after publishing (`discard_failed_creation`, directly or through CreationGuard) before the inline request can see the session, so its harness transcript survived. The inline request now marks its request-unique session name for its lifetime (`Hub::inline_btw`, `InlineOwned`), and `discard_failed_creation` runs `btw_cleanup` (purge plus the transcript in the session's spawn store) for a marked session. Any other discarded session keeps its harness's files, as before. Regression: discarded_inline_creation_removes_its_transcript_and_only_its_own (fails without the lifecycle.rs change, passes with it). hub_integration: 545 pass; the 2 that fail (auto_resume retry stop, transcript_events orchestration fields) fail the same way on feat-cmux-next 51e238d. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-ab1f035a409b977caceb
Bugbot needs on-demand usage enabledBugbot uses usage-based billing for this team and requires on-demand usage to be enabled. A team admin can enable on-demand usage in the Cursor dashboard. |
|
Review (codex-review-box/gpt-6-astra high, lane-place): BLOCK at 68fb280 BLOCK
|
… with Addresses review-26108-68fb's BLOCK at 68fb280. CreationGuard purges a cancelled creation on a spawned task, which can run after the inline request ended and dropped its mark; the purge then deleted the session but left its harness transcript. The guard now reads the inline owner when it is made (right after the session is published, while the request is alive) and passes it to the purge (`discard_failed_creation_owned`). Direct discards still read the mark, which the request holds while it awaits them. Regression: a_creation_guard_cleans_the_inline_transcript_after_the_request_ended (fails when the guard reads the mark at purge time instead, passes with the capture). hub_integration: 545 pass; the 2 failures fail the same way on feat-cmux-next 51e238d. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-ab1f035a409b977caceb
|
Review (codex-review-box/gpt-6-astra high, lane-place): BLOCK at 1e23d62 BLOCK
|
Addresses review-26108-1e23's BLOCK at 1e23d62. /btw is offered in any attached chat, but its aside is a transcript row, and a chat with no turn kept drawing its empty state, so neither the answer nor a failure appeared. The empty state now gives way once the chat has an aside (`hasBtwNotes`); the BtwNotes store is read before `freshView` for that. Regression (browser): "/btw in a chat with no turn yet leaves the empty state and shows its aside" in agent-pane-btw-side-session.test.ts, red with App.tsx at 1e23d62, green here; the file's other 11 tests still pass. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-ab1f035a409b977caceb
|
Review (codex-review-box/gpt-6-astra high, lane-place): SHIP at aecd470 SHIP |
JSONSerialization writes `/` as `\/`, so waitForRequest(containing: "_acpmux/btw") never matched and both "native inline btw preserves folder trust refusals" cases failed (CI swift test priority run and fleet run at aecd470). Compare against the unescaped request text. Agent-Session: https://cmux.com/deeplink/agent?id=aid-ab1f035a409b977caceb Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Review (codex gpt-6-astra high, review-router): SHIP at 5345db4 Full diff 51e238d..5345db4 plus the delta since the previous SHIP at aecd470 (OneShotRelay.waitForRequest now matches the unescaped JSON, since JSONSerialization writes Findings: No correctness, security, regression, or test-validity findings. |
|
Shipped in:
|
![Fix with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/fix-with-codesmith-light-3x.png)
/btw <question>is enabled by default and answers in a small dismissible aside. It never becomes a steer, queued prompt, or main-turn message. This supersedes #24876; #25441 supplies the separate native palette action and #26105 supplies/side.Leo, word for word: "So how about the slash side and the slash BTW command? Why are these commands not in yet? They need to be in. And they need to be in fast."
Claude uses its native
side_questioncallback during an active turn. Idle chats and an unavailable callback use a bounded, disposable read-only fork, as other supported harnesses do. Native and fallback futures are boxed separately and share the 110-second deadline. Cleanup removes the acpmux record and the temporary Claude or Codex transcript, including when fork creation is cancelled.The daemon advertises
btw-inline-v1. Older daemons receive only the legacy request shape; an older app host'snative.invalid_requestor WebKitunsupportedreply falls back to a regular side session. Selection checks prevent late replies from opening beside another chat. Quick Composer does not advertise/btw.The native handler consumes one gesture, checks the source chat, and forwards the app origin marker so daemon folder trust remains enforced. Trust refusals retain their reason and folder and open the pane's existing Trust route. The aside offers a separate Retry click after Trust so both actions receive their own gesture. Tests use an open transport and a real Unix socket stand-in; the relay assertion waits for the observed request to avoid racing Network.framework delivery. A DEBUG input fix sends Chromium child-window capture events through the owning pane's existing gesture monitor.
Size rationale: the change stays together because the web aside, Swift native request, capability negotiation, Claude callback, disposable fork lifecycle, transcript cleanup, and regression tests implement one cross-language request contract. Splitting it would leave an app or daemon half unable to serve the command. The overlapping palette slice was removed.
Validation at
6100c9667405be0ec13cb713e981044ea664ff58:Capture
tour-agent-paneateb4083f095b9(fleet build, capture mini, text checked for private data)Only
pr-mediacaptures are used. Historical tour stills: light, dark.Current settled head:
8c32e12ebe7ad80a491b479fd86de353961be020.Agent session: agent session