Skip to content

Open channel Canvas from the channel menu in a side-pane tab - #570

Merged
jameskraus merged 51 commits into
block:mainfrom
jameskraus:canvas-tabs
Oct 27, 2026
Merged

jameskraus merged 51 commits into
block:mainfrom
jameskraus:canvas-tabs

Conversation

@jameskraus

@jameskraus jameskraus commented Oct 3, 2026 •

Copy link
Copy Markdown
Contributor

Canvas opens in a side-pane tab so members can read and edit while keeping the conversation visible. Channels owns the registration; saving keeps the tab open, and channel-scoped drafts survive closing or navigation.

Late saves reconcile with a reopened editor without discarding newer edits or dropping focus. During reconciliation, a loaded editor is read-only. Archived Canvas identifies retained local drafts and directs readers to saved versions in History; the read-only explanation remains present in both views.

The October 26 refresh integrates main 5a8439631, preserves the current Solo toolbar/navigation behavior and Shared sessions removal, and updates the Canvas tab and archived-panel documentation. The Canvas tab shows a file icon and uses the shared panel inset; the View canvas menu row keeps the generic menu-panel icon.

First in the stack: intro copy → editor layout → preview and save controls. The fork's canvas-tabs and upstream jkraus/canvas-tabs both track this head.

Independent source review found no blockers. The full JavaScript unit suite, TypeScript, and design push checks passed at that same tree. On the integrated stack, 47 focused component/service checks and all 38 checks from the four affected browser files passed across Chromium and WebKit. All 38 browser checks passed together again at the tested snapshot a3dc63b88 (same Git tree as final head 2163325bb). Two browser cases are added here for native focus during a held reconciliation read (success and failure after moving focus); both failed before the repair in both engines. None removed. Archived draft/history assertions stay in component tests.

Draft pending human acceptance. Native desktop and live-relay checks remain deferred. Hosted checks must be assessed at the current head; historical media below shows the earlier snapshot.

Preview

Recorded from 60ac65fc81 with mock workspace data and a simulated relay: retained drafts, saving without closing, and archived read-only Canvas/History.

root-demo.mp4

Archived Canvas remains readable with Save disabled

jameskraus and others added 18 commits October 1, 2026 17:34
Keep the Canvas plugin alongside the new pairing and channel-usage
plugins, and keep the optional Canvas menu entry alongside main's
channel-menu panels.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Signed-off-by: James Kraus <[email protected]>
Keep the Canvas plugin alongside main's new Voice Notes and Me plugins.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Signed-off-by: James Kraus <[email protected]>
The desktop bundle list includes buzz.canvas, so the native catalog
must list it and enable it by default to keep the two in parity.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Signed-off-by: James Kraus <[email protected]>
Keep main's pending session recovery in the channel workspace; the
modal Canvas state it sat beside stays removed.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Signed-off-by: James Kraus <[email protected]>
Canvas only renders inside a workspace tab, so drop the editor's
standalone header and close callback; the tab owns closing. Open Canvas
through the same helper the tab picker uses for other channel tools
instead of a parallel copy.

Also restore main's mention picker test: its focus wait is unrelated to
Canvas and belongs in its own change.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Signed-off-by: James Kraus <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Signed-off-by: James Kraus <[email protected]>
Main moved the channel tab workspace into the shared useConversationTabs
hook. Move the Canvas tab wiring with it: the shared tool opener, the
Canvas launcher and its pressed state now live in the hook and return
openCanvas, which both the channel and session-channel header menus use.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Signed-off-by: James Kraus <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Signed-off-by: James Kraus <[email protected]>
jameskraus and others added 3 commits October 13, 2026 11:07
Main removed the side pane's New tab picker and tool tabs. Canvas keeps
opening as a workspace tab: the conversation-tabs hook owns one
openCanvas used by the Canvas launcher and both channel menus, and the
launcher hook keeps its tab-activation callback for that launcher.

The Canvas journey finds thread tabs by their new tab value and opens
Canvas on the session channel from its menu, which has no launchers.
The Todos journey returns to main's version.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Signed-off-by: James Kraus <[email protected]>
Register Canvas as a channel menu panel, like Channel Usage, instead of a
header launcher that opened a tab. Channels then owns the View canvas
item, its eligibility check and the tab, so the hardcoded menu item,
the openCanvas wiring and the launcher-to-tab hook changes go away.
Session-channel menus receive the same channel menu panels, keeping
View canvas there.

A channel change retires the Canvas tab, as docs/channels.md already
describes; the editor keeps the draft, so reopening restores it.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Signed-off-by: James Kraus <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Signed-off-by: James Kraus <[email protected]>
@jameskraus jameskraus changed the title Open channel Canvas in the tabbed workspace Open channel Canvas from the channel menu in a side-pane tab Oct 13, 2026
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Signed-off-by: James Kraus <[email protected]>
jameskraus and others added 4 commits October 13, 2026 15:05
A Canvas tab can now unmount while a save or restore is in flight (tab
close, channel change, plugin disable). The unmount fence then skipped
clearing the stored draft, so reopening reported a false conflict and
disabled Save. Retire the draft once the write lands, using the stored
revision captured when it started, so a reopened editor's newer draft
is never cleared.

Canvas also focused its editor whenever loading finished, pulling focus
back from the composer. Take focus only if it is still where the tab
host placed it when Canvas opened.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Signed-off-by: James Kraus <[email protected]>
The Canvas plugin owns the editor, so colocate it with the plugin and
its styles. Channels no longer imports from the Canvas plugin; the
plugin depends on Channels' history view and shared styles.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Signed-off-by: James Kraus <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Signed-off-by: James Kraus <[email protected]>
Main removed personal groups from the channel workspace while this
branch removed the Canvas modal state beside them; keep both removals.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Signed-off-by: James Kraus <[email protected]>

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Star Lord's automated source review via Wes's account, integrating independent Rocket (systems/lifecycle), Mantis (correctness/security/concurrency), and Groot (product/accessibility) lanes.

Reviewed head 5590a83c566f50cf5d25185a6d6cec0efef768ed against base c1449f5b8258ae1204fc16e69d5a8b2db9b4dc1d, following the review at 330c3636e034383cd2fb09d9762bc5ba6b250835.

9/10 — no actionable findings in this merge/README follow-up. The Canvas editor, registration and recovery-focus repair are unchanged from the previous review. The current host still rechecks eligibility on activation and retires inaccessible channel tabs; browser/native catalogs retain Canvas alongside Huddles. The added plugin guide and adapted browser journey fit the existing owners without expanding the feature.

Validation: immutable source and test inspection only; no tests, builds, app launches or PR code execution. One hosted-check snapshot was still in progress, with Windows native validation skipped. Real first-open and retry focus timing, screen readers, both themes, narrow/enlarged layouts, live-relay/native behavior, performance, comparative test cost and human acceptance remain unverified. The updated public description and follow-up commit messages were inspected with no disclosure finding; the replacement demo MP4 downloaded but could not be decoded with available tools, so attachment-content review remains incomplete. This COMMENT is not approval or merge authorization.

Keep Canvas in the default-on plugin list beside main's renamed Usage &
costs plugin.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Signed-off-by: James Kraus <[email protected]>

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Star Lord’s automated source review via Wes’s account, integrating independent Rocket (systems/lifecycle), Mantis (correctness/security/concurrency), and Groot (product/accessibility) lanes.

Reviewed head 3fa93afa128b19c130f0306290b5908e9a80c08f against base 7a68e01c40b900747564d44adb3798a621890c1f, following 5590a83c566f50cf5d25185a6d6cec0efef768ed.

9/10 — no new actionable findings in this merge follow-up. The Canvas feature patch is unchanged apart from documentation context and a test hunk offset. The merge correctly preserves Canvas in the default-on list alongside the upstream Usage & costs wording. The shared-control additions preserve the previous recovery-focus repair; draft retirement, channel eligibility and tab lifetime remain intact.

Validation: immutable source and test-source inspection only; diff whitespace check passed. No tests, builds, app launches or PR code execution. One hosted-check snapshot showed a failed Chromium browser shard (3/9), several checks still running, and Windows native validation skipped; the failure cause was not investigated. Native/live-relay behavior, real retry/reload focus timing, screen readers, both themes, narrow/enlarged layouts, performance and human acceptance remain unverified. Public description and merge message inspected; six sampled frames of the replacement 36.2-second fixture demo showed no disclosure finding, but unsampled frames were not inspected. The media has no audio track. This COMMENT is not approval or merge authorization.

Preserve compact reload confirmation sizing and Solo pane focus navigation in the Canvas panel architecture.

Co-authored-by: Codex <[email protected]>
Signed-off-by: James Kraus <[email protected]>

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Star Lord’s automated source review via Wes’s account, integrating independent Rocket (systems/lifecycle), Mantis (correctness/security/concurrency), and Groot (product/accessibility) lanes.

Reviewed head d2f379f9a27a1917d65ccf27516c252b516d1cd6 against base 13114920525461f6559484a8fb74dffb6e892d56, following 3fa93afa128b19c130f0306290b5908e9a80c08f.

9/10 — no new actionable findings in this merge follow-up. The merge preserves the upstream compact reload confirmation and Solo pane focus marker. Canvas’s generation fences, guarded draft retirement, channel/plugin eligibility and previous recovery-focus repair remain intact. Shared focus navigation correctly falls back to the selected tool tab without redirecting typing to another pane. No new lifecycle or performance defect was demonstrated by source.

Validation: immutable source and test-source inspection only; diff whitespace check passed. No tests, builds, app launches or PR code execution. One hosted-check snapshot showed 36 successes, two WebKit journey shards running, and Windows native validation skipped. Real browser/native focus timing, screen readers, themes/layouts, live-relay behavior, measured performance and human acceptance remain unverified. Public description and merge message inspected with no disclosure finding; six sampled frames of the checksum-verified 36.2-second fixture demo showed no disclosure finding, but unsampled frames remain unreviewed. The media has no audio track. This COMMENT is not approval or merge authorization.

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Carl, an automated reviewer, commenting via Wes's GitHub account.

Reviewed head d2f379f9a against merge base 131149205, with independent Court lanes on runtime/lifecycle, contracts/tests/CI, and a cross-stack challenge pass over #1303, #1304 and #1453.

No blocking findings. Several things hold up. Channel change, plugin disable and loss of eligibility all retire the tab. The unmount operation++ fences late reads. Access stays enforced by canWrite in the canvas capability, which matches the "not authority" rule. Native and browser catalog/default-on parity agree. The rewritten editor tests mount real React against real view-state storage. Two low-severity editor issues and one product question are inline.

Before merge

  • Required CI is red. WebKit shard 9/12 (job) fails at solo-chats.spec.mjs:414: the Share chat combobox stays empty after filling "Aria". That journey never opens Canvas, and its picker and test sources match base, so it looks unrelated. Sampled main failures hit different assertions, though, so this is not proven to be a known flake. Root-cause it or re-run it before treating it as noise.
  • Conflicts with current main in docs/plugin-architecture.md (the bundled-defaults list; main renamed "Usage & costs" to "Usage"). The upper three PRs will need the same refresh.
  • Land with #1453, or add a save cue. The modal used to close on a successful save. In a tab, the only signal is the spinner ending. #1453's unsaved status covers this, so it only matters if #570 ships alone.

Validation: source review on all lanes. Runtime findings were reproduced in scratch Vitest and focused Chromium/WebKit probes, then reverted. Native desktop and live relay were not exercised. This COMMENT is not an approval.

setBusy(true);
setError("");
try {
const event = await canvas.save(channelId, draft, base ?? undefined);
// Retire the saved draft even if this editor has closed since.
replaceView(scope, key, stored, null);

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[P3] Reopening during an in-flight save leaves the new editor on a stale base

Steps: Save → close the tab → View canvas again before the write lands. The new editor reads the still-pending draft, and its canvas.read returns the pre-save head, so base === head.id and Save is enabled. The first save then lands and this replaceView retires the draft. The new editor's head/base stay at the pre-save revision. Clicking Save throws CanvasConflictError and offers Discard and reload for content that is already saved. With #1453 on top, the editor also shows "Unsaved changes" for that content. Reproduced in a scratch Vitest.

It recovers (reload fixes it), so this is not blocking. A small fix: when an earlier instance's save retires this key, have the mounted editor re-read the head. Subscribing to the view key, or re-reading once when readView goes null under a loaded editor, would do it.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Codex: Fixed in 60ac65fc81. The editor subscribes to the existing draft-store revision and reloads the saved head when an earlier instance retires that draft. The compare-and-swap guard still preserves newer edits. Component coverage exercises close/reopen during pending saves and restores, including an initial read still in flight; the stale-base cases failed before the repair and pass now.

Comment thread src/bundled/canvas/CanvasEditor.tsx Outdated
// only if it is still there; never pull it back from elsewhere.
const handoff = useRef<Element | null>(null);
useEffect(() => {
handoff.current = document.activeElement;

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[P3, latent] Mount-time focus capture can pull focus from elsewhere

This records whatever is focused at mount as the handoff target. When the read lands, focus moves into the editor if that element still has focus. If the composer is focused when the editor mounts, typing that was meant for the composer moves into the shared Canvas draft. That contradicts the comment above ("never pull it back from elsewhere"). Reproduced in a scratch Vitest. Today the menu path is safe only because PanelWorkspace focuses the selected tab first, and the generation-keyed remount in index.tsx should not happen in practice. So this is latent, not live.

Suggested fix: arm the handoff only when focus starts inside the tab host at mount, for example when the panel workspace contains document.activeElement. Otherwise leave it null.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Codex: Fixed in 60ac65fc81. Mount-time handoff is armed only when the active element belongs to the panel workspace. Focus outside that workspace is left alone when the read completes. The regression case that starts with focus elsewhere failed before the fix and passes now.

Comment thread src/bundled/canvas/index.tsx Outdated
return (
!channel.cached &&
!channel.readOnly &&
!channel.archived &&

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Question (product): archived channels lose Canvas access

On main, View canvas showed for any non-read-only channel, including archived ones, and the host already required membership. This adds !channel.archived, so members of an archived channel can no longer open the Canvas or its History, even read-only. The PR description says this is intended for editing. Please confirm that dropping read-only access to archived Canvases is also intended, rather than an accident of reusing a write-oriented eligibility check. Non-blocking.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Codex: James confirmed that archived channel members should retain read-only access. Implemented in 60ac65fc81: View canvas and History remain available, while editing, Save, and Restore are disabled and write handlers are guarded. Membership checks remain in place. The archived-channel journey failed before the host eligibility repair and now passes in Chromium and WebKit. The refreshed PR video and screenshot show this behavior.

@@ -207,6 +231,7 @@ export function ChannelCanvasDialog({
loaded revision on supporting relays.
</p>
<Textarea

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: the composer and SharedSessions mark their primary field data-tab-focus, and PanelWorkspace (PanelWorkspace.tsx:282) uses it to send focus into tab content when a tab is selected. Canvas Markdown doesn't have it, so selecting the Canvas tab with the pointer doesn't resume the editor the way it does for those panes. Optional.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Codex: Addressed in 60ac65fc81: the Canvas Markdown textarea now has data-tab-focus, reusing the existing panel host's focus behavior.

Comment thread src/bundled/canvas/index.tsx Outdated
state.status !== "ready" ||
state.scope !== channelContext.scope
)
return <p role="status">Connect to this channel to view canvas.</p>;

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit (copy): this shows for any relay status that isn't ready, including reconnecting. "Connect to this channel to view canvas." reads like a join prompt. Something like "Reconnecting…" (or a status-specific message) would be clearer. Optional.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Codex: Updated in 60ac65fc81 to “Canvas is unavailable while the connection recovers.” The status no longer asks an existing member to connect or join.

wesbillman
wesbillman previously approved these changes Oct 21, 2026
@wesbillman
wesbillman dismissed their stale review October 21, 2026 16:37

🤖 Carl, an automated reviewer, commenting via Wes's GitHub account. Clearing this approval at Wes's request, pending the plugin-boundary question in the follow-up review.

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Carl, an automated reviewer, commenting via Wes's GitHub account.

Question before approval: why is Canvas its own plugin rather than part of Channels?

I cleared the earlier approval while this is open. The tab behavior isn't in question, only where it's registered. Can you explain why this needs a separate buzz.canvas plugin? Three things make Channels look like the natural owner:

  • There's precedent. Shared sessions is a channel tab panel that the Channels plugin registers itself (registerSharedSessions(ctx) in src/bundled/channels/index.tsx). The channelMenu contract doesn't require a separate plugin, so Channels could register View canvas the same way. Canvas also lived in src/bundled/channels before this PR.
  • Disabling the plugin wouldn't disable Canvas. Canvas is a core session capability (session.canvas). Solo chat settings and SoloDraft, the Todos plugin (which stores its items in the Canvas), agent reads (features/agents/reads.ts) and the goose runtime all use it. Turning off "Canvas" in Settings would only hide the team-channel editor while Canvas keeps working everywhere else, which is confusing to users.
  • The split has a cost. It adds a manifest, a native catalog entry in crates/plugin-manager, default-on policy in two catalogs, a README and a Settings card. All of that would need upkeep under the bundled-plugin rules.

If the goal is to let users switch Canvas off, please say so and explain how that should interact with Solo, Todos and agents. Otherwise, consider registering the panel from Channels and dropping the plugin wrapper. The "Not chosen" section doesn't currently weigh that option.

Co-authored-by: Codex <[email protected]>
Signed-off-by: James Kraus <[email protected]>
@jameskraus
jameskraus marked this pull request as draft October 21, 2026 19:21
jameskraus and others added 2 commits October 21, 2026 12:25
Reconcile writes that finish after reopening and scope initial focus to the Canvas tab host.

Co-authored-by: Codex <[email protected]>
Signed-off-by: James Kraus <[email protected]>
Co-authored-by: Codex <[email protected]>
Signed-off-by: James Kraus <[email protected]>

Copy link
Copy Markdown
Contributor Author

🤖 Codex: Addressed the Channels ownership question in 60ac65fc81. James chose Channels as the owner: registerCanvas(ctx) now lives alongside the existing channel panel registrations. The separate Canvas plugin wrapper, manifest, Settings entry, and catalog registration are removed; Solo, Todos, and agents retain the existing session capability.

The stack has also been restacked, resolving the reported main conflict, and required CI and DCO now pass on all four PRs. This confirms the current heads are green; it does not establish the cause of the earlier Solo sharing failure. The description and mock-workspace preview have been refreshed. The save-status cue remains in #1453, so the recommendation to land the stack together still applies. Native/live-relay and human acceptance remain outstanding.

@jameskraus
jameskraus marked this pull request as ready for review October 21, 2026 21:55

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Star Lord’s automated source review via Wes’s account, integrating independent Rocket (systems/lifecycle), Mantis (correctness/security/concurrency), and Groot (product/accessibility) lanes.

Reviewed head 60ac65fc81eafcb2a7114e0cec478d87ce63010b against base/merge-base 8466aeaa055a4b1b39f6821e4ebc41e1e0fe97a7, focusing on the changes since d2f379f9a27a1917d65ccf27516c252b516d1cd6.

8/10 — two low-severity P3 findings, detailed inline: automatic late-save reconciliation loses editor focus; archived Canvas can present an unlabeled unsaved local draft as its read-only document. The Channels-owned registration, archived read access, restricted initial focus handoff and revision-guarded draft retirement address the earlier feedback. No additional actionable systems/security findings were established.

Validation: immutable source and test-source inspection only; diff whitespace check passed. No tests, builds, app launches, PR code execution or CI assessment. Real browser/native focus timing, screen readers, both themes, narrow/enlarged layouts, live-relay behavior, performance and human acceptance remain unverified. The public description and attached screenshot were inspected without a disclosure finding; the demo video downloaded but was not decoded, so attachment review remains incomplete. The description still records pending human/native acceptance. This COMMENT is advisory, not approval or merge authorization.

Comment thread src/bundled/channels/CanvasEditor.tsx Resolved
Comment thread src/bundled/channels/CanvasEditor.tsx Resolved

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Carl, an automated reviewer, commenting via Wes's GitHub account.

Reviewed head 60ac65fc81 against merge-base 8466aeaa055a. Independent lanes covered draft persistence and the save lifecycle, access and the panel contract, and product/UI/a11y.

No blockers. Four optional P3s are inline. Draft retirement on late save or restore, membership rechecks at activation and on retained tabs, and archived read-only gating all held up under source review. The removed modal paths are fully gone. Both earlier P3s on this head still apply: focus is lost during reconciliation (L139), and the archived view shows an unlabeled local draft (L283).

Mergeability: docs/channels.md conflicts with main. It is a textual conflict in the same passage the docs comment below covers.

Not verified: source review only. No suites, builds or app runs (CI is green). Native focus timing, screen readers, live relay behavior, and races where a member is removed mid-save have not been exercised. The PR still notes that native and live-relay acceptance is pending.

Comment thread docs/channels.md Resolved
Comment thread docs/plugin-architecture.md Resolved
Comment thread src/bundled/channels/canvas-panel.tsx Resolved
Comment thread src/bundled/channels/CanvasEditor.tsx Resolved
Comment thread src/bundled/channels/Canvas.module.css Resolved
@jameskraus
jameskraus marked this pull request as draft October 26, 2026 18:10
jameskraus and others added 7 commits October 26, 2026 14:11
Preserve the Solo toolbar and removal of Shared sessions while retaining Channels-owned Canvas tabs.

Co-authored-by: Codex <[email protected]>
Signed-off-by: James Kraus <[email protected]>
Keep a loaded editor read-only while busy so a late save can reconcile without dropping native focus. Label retained local drafts in archived channels and keep the read-only explanation visible in History.

Co-authored-by: Codex <[email protected]>
Signed-off-by: James Kraus <[email protected]>
Main now lists Beta among shared chats; preserve the existing navigation and retained-draft assertions using its current sidebar control.

Co-authored-by: Codex <[email protected]>
Signed-off-by: James Kraus <[email protected]>
The Canvas tab reuses the file icon its menu row had before, instead of
the generic channel-context icon. Its content and footer use the panel
inset that sibling tabs use.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Signed-off-by: James Kraus <[email protected]>
@jameskraus
jameskraus marked this pull request as ready for review October 27, 2026 18:28
@jameskraus
jameskraus merged commit a940dc3 into block:main Oct 27, 2026
79 of 81 checks passed
joahg added a commit to joahg/buzz-app that referenced this pull request Oct 27, 2026
…-stop

* origin/main: (132 commits)
  feat(workflows): add combined filters and recent sorting (block#1699)
  ci: smoke test the browser perf suite on pull requests (block#1662)
  feat(acp): share one ACP client and server pool across harnesses (block#1227)
  Preserve recipient picker rows and scroll position during paging (block#1739)
  Group matching emoji reactions at nine people (block#1740)
  Open channel Canvas from the channel menu in a side-pane tab (block#570)
  fix(github): keep PR action menu trigger in place (block#1736)
  fix(goose): preserve default-model focus during pending saves (block#1495)
  test(fixtures): reduce polling waits and repeated signing (block#1493)
  test(inbox): wait for conversation focus before filtering (block#1491)
  fix(desktop): keep the main webview running while it is hidden (block#1713)
  chore(release): version desktop previews from 0.7.0 (block#1643)
  fix(agent-harness): remove the unavailable-tools line from the base prompt (block#1715)
  fix(agents): keep View transcript visible in narrow Pi and goose activity panes (block#1717)
  fix(github-plugin): prefix GitHub plugin tools with github_ (block#1726)
  perf(agents): load Claude and Codex activity without scanning every session (block#1674)
  Improve new DM previews, picker performance, and composer focus (block#1664)
  Polish individual message reactions and emoji settings (block#1628)
  Improve dark-mode separators and composer contrast (block#1711)
  Make decision providers plugins, and move TypeSafe into one (block#1353)
  ...

Signed-off-by: Joah Gerstenberg <[email protected]>

# Conflicts:
#	src/bundled/voice-notes/VoiceCapture.tsx
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants