Skip to content

NEXUS-4022: Start region chats in the New Chat editor - #2784

Merged
gilgtm merged 2 commits into
mainfrom
gil/nexus-4022-durable-task-host
Nov 11, 2026
Merged

gilgtm merged 2 commits into
mainfrom
gil/nexus-4022-durable-task-host

Conversation

@gilgtm

@gilgtm gilgtm commented Nov 6, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Lets a Solo region source start its chats in the host's New chat editor, and fixes how a row menu action gets focus.

New Chat entry point for region sources (45408d79c)

A region source can now open the New chat editor for its region, optionally in a workspace, with handle.openDraft(binding, { workspace?, lead? }).

  • Draft: keeps its own prompt, files, model and effort.
  • Send: works like an ordinary New chat. The create goes out unguarded with the region label before the first message, so the Outbox retries both after a restart. A region draft adds no durable acceptance step.
  • Agents: a source can limit the agents the draft may address with draftAgent.
  • Refusal: Send is refused while the source is not running and ready. The prompt and files go back to the region's draft.
  • Start record: before the create, the host saves on this device how the chat started. started(binding, channelId) returns it only to that region's source until forget(binding, channelId). The source reconciles its own records from it by channel ID.

Hosts and plugins that do not call these APIs see no change. docs/solo-regions.md documents the contract.

Row menu action focus (a778be9bd)

A contributed Solo row action used to run on click, while its menu was still open. The menu then returned focus to the row and took it from the dialog or composer the action had just opened.

  • Now the action runs once the menu's close completes. The menu first focuses the row, so the action can move focus from there.
  • The queued action is dropped if the menu reopens, the row unmounts or rebinds, or the user moves focus elsewhere first.
  • Escape and outside dismissal still return focus to the row and run nothing.

Compared with the previous version of this PR

The durable task chat flow that this PR used to hold is gone: task drafts, task submission saved before the source claim, and the task-mode Outbox. Task sources now reconcile from the region draft start.

buzz-review-completed

Testing

Local runs on macOS, on the stack rebased onto main 9596cd3db:

  • At this PR's head a778be9bd: pnpm check (Biome, TypeScript and the design checks) and the icon check passed. Vitest for the files the flake check selects for this PR: 497 passed.
  • At the stack tip adbdf424e: full Vitest, 20556 passed and 23 skipped (includes browser-host/channel-kit.test.mjs).
  • Browser journeys at the stack tip, Chromium and WebKit: the full tests/browser/solo-rename.spec.mjs, repeated 5 times, passed 120/120. The 34 other specs that the flake check relates to the stack, run once in each engine: 343 passed, 3 skipped by their own conditions. The full browser suite was not run locally.
  • The Nexus plugin's connected browser harness ran on the actual Buzz web shell and plugin UI, with a simulated relay and generated identities, before the rebase. Full run at host pin 049a9b57e (now 1fbd49c49), which includes this PR: 53 passed. Targeted New task and workspace tests at pin 797040559 (now fc6749bda): 4 passed.

Native testing: Gil ran the native desktop app on this stack at adbdf424e, with the matching Nexus plugin build. Gil confirmed that these native-only paths passed:

Agent testing did not reach these paths: the agent ran no native app, no real relay and no real agent.

Known gaps

  • On the plugin side, a new task chat shows briefly as a "More tasks" placeholder, with an "Incomplete task information" notice, before its record lands. This lasted about 80 ms on the simulated relay; on a real relay it lasts at least one record read and one write.

Hosted or local failures that this stack does not cause:

  • tests/browser/typing.spec.mjs:290 ("a growing channel/thread composer lifts history with it at the bottom") intermittently fails with React error Add complete reaction toggles to the message menu #185 on main too. Locally it failed 12 of 12 runs at 9596cd3db and 9 of 12 at a later main commit.
  • On macOS, cargo test -p Buzz crashes the library test binary (SIGSEGV), and some host_command deadline tests fail. Both happen the same way at base 9596cd3db, before this stack. Hosted Linux CI is the reference for these.

Test changes

Titles are compared only in the test files each range changes. Tests that moved or were renamed are matched by title.

Removed by this PR's diff (0)
  • none
Added by this PR's diff (17)
  • src/features/channel-navigation/SoloRegions.test.tsx: cancels selected %s %s after %s selection moves to %s during exit
  • src/features/channel-navigation/SoloRegions.test.tsx: does not let late %s completion consume a new %s selection
  • src/features/channel-navigation/SoloRegions.test.tsx: drops a queued %s destination action after %s before late close completion
  • src/features/channel-navigation/SoloRegions.test.tsx: drops a queued %s destination action when its menu reopens and then closes with Escape
  • src/features/channel-navigation/SoloRegions.test.tsx: hands the %s destination action focus after %s menu close completes
  • src/features/channel-navigation/SoloRegions.test.tsx: keeps ordinary %s Escape and outside dismissal focus without running a contribution
  • src/features/channel-navigation/SoloRegions.test.tsx: keeps the %s row origin and visible error after a deferred contribution rejects
  • src/features/channel-navigation/SoloRegions.test.tsx: resets the chosen %s handoff on keyboard reopen before Escape
  • src/features/channel-navigation/SoloRegions.test.tsx: runs selected %s Pin once from body and returns its non-navigation focus to the row
  • src/features/channel-navigation/routes.test.ts: keeps a region draft's label and refuses a malformed or linked one
  • src/features/channel-navigation/solo-navigation-draft.test.ts: names a region's draft owner only while its source is running and ready
  • src/features/channel-navigation/solo-navigation-draft.test.ts: opens New chat for its region, and only that region reads and forgets how its chats started
  • src/features/solo/SoloDraft.test.tsx: a refused region start forgets its link and gives its prompt and files back to the region's draft
  • src/features/solo/SoloDraft.test.tsx: a region draft can only address agents its source accepts
  • src/features/solo/SoloDraft.test.tsx: a region draft whose link can't be saved starts nothing and keeps its prompt and files
  • src/features/solo/SoloDraft.test.tsx: a region draft whose source stops while its files upload keeps the draft and can't send
  • src/features/solo/SoloDraft.test.tsx: a region's New chat starts a labeled chat its source can find, without filing it
In the previous version of this PR, not carried over (78)
  • src/features/channel-navigation/solo-navigation-draft.test.ts: persists one copied workspace on separate new draft identities before navigating
  • src/features/channel-navigation/solo-navigation-draft.test.ts: preserves ordinary no-workspace seed %j
  • src/features/channel-navigation/solo-navigation-draft.test.ts: rechecks binding after synchronous draft-save subscribers invalidate it
  • src/features/channel-navigation/solo-navigation-draft.test.ts: rechecks binding when workspace validation re-enters the host
  • src/features/channel-navigation/solo-navigation-draft.test.ts: refuses an existing UUID draft rather than overwrite it
  • src/features/channel-navigation/solo-navigation-draft.test.ts: refuses an old binding before writing
  • src/features/channel-navigation/solo-navigation-draft.test.ts: refuses combined workspace and primary seeds before allocating, writing or navigating
  • src/features/channel-navigation/solo-navigation-draft.test.ts: refuses malformed workspace %j without saving or navigating
  • src/features/channel-navigation/solo-navigation-draft.test.ts: refuses storage %s without navigation
  • src/features/messages/MessageComposer.test.tsx: a task with a missing provider stays read-only and retains its draft
  • src/features/messages/MessageComposer.test.tsx: an ineligible pasted task identity blocks the send instead of falling back to primary
  • src/features/messages/MessageComposer.test.tsx: keeps task repair visible with revoked historical A, then sends only to eligible primary B
  • src/features/messages/MessageComposer.test.tsx: queued task follow-ups preserve captured primary identity (explicit=%s)
  • src/features/messages/MessageComposer.test.tsx: rechecks task policy at queued publication after the provider is %s
  • src/features/messages/MessageComposer.test.tsx: refuses captured task-draft workspace controls while %s
  • src/features/messages/MessageComposer.test.tsx: task primary A survives explicit B; later Make primary B changes untagged routing without prefill
  • src/features/messages/MessageComposer.test.tsx: task sends reject multiple or revoked explicit targets before admission and never fall back
  • src/features/messages/MessageComposer.test.tsx: taskDraft without submission cannot bypass %s own-Solo send admission
  • src/features/messages/composer-chat-cards.test.ts: stages a card from document data another build saved and keeps it unsupported
  • src/features/messages/follow-up-persistence.test.ts: keeps a saved follow-up with task details this build cannot send, unsent and unchanged
  • src/features/messages/mention-draft.test.ts: keeps a task draft's workspace and marks document data another build saved as unsupported
  • src/features/relay/channel-details.test.ts: keeps region and task-mode labels during label replacement, including rename=%s
  • src/features/relay/channel-writes.test.ts: confirms a restored Solo create with a lost acknowledgement before attempting any resend
  • src/features/relay/channel-writes.test.ts: resolves missing metadata for an authorized roster-only task before confirming refresh
  • src/features/relay/channel-writes.test.ts: task member additions keep current policy through signing and require a fresh gate on restored retry
  • src/features/relay/outbox-chat.test.ts: holds the submission lock through publication and refreshes a waiting stale owner
  • src/features/relay/outbox-chat.test.ts: keeps peer cleanup after a former owner receives a late verified echo
  • src/features/relay/outbox-chat.test.ts: refuses a failed pair write before claim and restores no partial submission
  • src/features/relay/outbox-chat.test.ts: renews admission for saved rows and cannot use a released lock gate
  • src/features/relay/outbox-chat.test.ts: reserves room for both rows before claim and permits retry after capacity is free
  • src/features/relay/outbox-chat.test.ts: restores the same pair without automatic replay after %s
  • src/features/relay/outbox-chat.test.ts: saves the entire pair before any signer, observer or publisher runs
  • src/features/relay/task-outbox.test.ts: a verified echo settles a queued whenPrepared wait without claiming local binding
  • src/features/relay/task-outbox.test.ts: keeps a refused preparation signed and retries after reload with the same content and event ID
  • src/features/relay/task-outbox.test.ts: persists the signed event before binding it, and binds before local hearing or publication
  • src/features/relay/task-outbox.test.ts: restores the guarded create and first message with fresh policy and their original signed bytes
  • src/features/relay/task-outbox.test.ts: whenPrepared ends after durable binding and synchronous policy, without waiting for relay ACK
  • src/features/relay/task-outbox.test.ts: whenPrepared rejects %s failure and retains the saved operation
  • src/features/solo/SoloDraft.test.tsx: keeps another build's task draft with a staged chat link unchanged and unsent across mount, send and remount (%s)
  • src/features/solo/SoloDraft.test.tsx: persists first-message intent before waiting for task creation (%s)
  • src/features/solo/SoloDraft.test.tsx: prepares a task before starting it, keeps a refused draft and signs only its primary recipient
  • src/features/solo/SoloDraft.test.tsx: rejects multiple task targets before preparation or creation and retains the draft
  • src/features/solo/SoloDraft.test.tsx: restores workspace-only openDraft and never reseeds a removal, which undo restores
  • src/features/solo/SoloDraft.test.tsx: resumes the saved task pair before prepare and transfers edits; keeps another build's task references unchanged and unsent=%s
  • src/features/solo/SoloDraft.test.tsx: same-ID attachment recovery transfers only actual file edits (changed=%s)
  • src/features/solo/SoloDraft.test.tsx: shows pending accepted-message recovery and cancels binding when its draft region ends
  • src/features/solo/task-mode.test.ts: admits verified owner information through only the current source policy
  • src/features/solo/task-mode.test.ts: applies task policy to every signed member addition, including a direct outbox retry
  • src/features/solo/task-mode.test.ts: binds the exact preparation identity and revision before exposing the first event
  • src/features/solo/task-mode.test.ts: checks creation readiness at the durable binding boundary (%s)
  • src/features/solo/task-mode.test.ts: checks the whole membership and exact explicit target before local delivery
  • src/features/solo/task-mode.test.ts: does not classify a three-field destination
  • src/features/solo/task-mode.test.ts: does not grant informational admission to an event with %s
  • src/features/solo/task-mode.test.ts: does not trust a copied proof-bearing event
  • src/features/solo/task-mode.test.ts: fails closed after disposal or a missing owning region while preserving legacy region chats
  • src/features/solo/task-mode.test.ts: keeps %s outside informational policy
  • src/features/solo/task-mode.test.ts: keeps an ordinary addressed owner message when the source predicate returns false
  • src/features/solo/task-mode.test.ts: keeps foreign task-reference and live task-member guards ahead of informational policy
  • src/features/solo/task-mode.test.ts: keeps recipient-free publication closed when the source policy is %s
  • src/features/solo/task-mode.test.ts: keeps unsigned saved draft validation on the ordinary path
  • src/features/solo/task-mode.test.ts: never binds an informational notice as the first task event
  • src/features/solo/task-mode.test.ts: rechecks an informational notice before publication after %s
  • src/features/solo/task-mode.test.ts: refuses a proof-bearing addressed owner message classified as information
  • src/features/solo/task-mode.test.ts: refuses recognized information carrying a recipient even if ordinary admission would allow it
  • src/features/solo/task-mode.test.ts: refuses task references another build signed, on send and first-event retry, and ignores unknown versions
  • src/features/solo/task-mode.test.ts: refuses unknown roster keys, mismatched channel evidence and unreadable historical policy
  • src/features/solo/task-mode.test.ts: retains and retries the same signed first message after a creation wait %s
  • src/features/solo/task-mode.test.ts: retains confirmed historical members without authorizing revoked recipients or additions
  • src/features/solo/task-submission.test.tsx: hands off a %s draft after a shared submission completes
  • src/features/solo/task-submission.test.tsx: keeps a completed task draft when its %s changes during handoff
  • src/features/solo/task-submission.test.tsx: keeps accepted first delivery recoverable through failed %s cleanup
  • src/features/solo/task-submission.test.tsx: keeps an incomplete claim in its draft without a saved pair
  • src/features/solo/task-submission.test.tsx: keeps failed staging editable and retries without consuming a source claim
  • src/features/solo/task-submission.test.tsx: refuses a corrupt saved pair before another source claim
  • src/features/solo/task-submission.test.tsx: refuses live eligibility revoked while the staged claim is pending
  • src/features/solo/task-submission.test.tsx: resumes the staged identity after exit %s the source claim commits
  • tests/browser/outbox-chat.spec.mjs: a waiting chat owner keeps accepted event identities from the shared journal
  • tests/browser/outbox-chat.spec.mjs: an unrelated save cannot restore a task pair that another page completes

@gilgtm
gilgtm added this pull request to stack #2791 November 6, 2026 12:04
@gilgtm
gilgtm force-pushed the gil/nexus-4022-durable-task-host branch from 325ffdd to eefb9ac Compare November 6, 2026 16:02
@dr0uleau
dr0uleau marked this pull request as ready for review November 7, 2026 01:11
@dr0uleau
dr0uleau requested a review from a team as a code owner November 7, 2026 01:11
Comment thread src/features/solo/TaskSoloDraft.tsx Resolved
@tellaho

tellaho commented Nov 7, 2026

Copy link
Copy Markdown
Contributor

🤖 Design review at f12d20cb9964fe26f4af45c1a23b433824b6b142 — not critical path.

This aims to keep a task’s draft and first message safe across interruptions. The patch also introduces a new task-creation view and task-specific recipient/status controls in core (draft view, recipient control). Those are additions to the product experience, beyond a contained fix to an existing flow.

Under the current UI frost through the Nov 10 launch, defer the new core task experience. New UX should ship in an external plugin under the current plugin-first policy.

Source-only scope review. No screenshots attached in the PR description or discussion. I did not run the app or tests, or verify native delivery/recovery, themes, window widths, enlarged text, or live keyboard/focus behavior.

@dr0uleau
dr0uleau requested a review from a team November 9, 2026 16:25
@dr0uleau

dr0uleau commented Nov 9, 2026 •

Copy link
Copy Markdown
Contributor

🤖 lets narrow this to integration with the shared New Chat flow and a durable local handoff into the existing Outbox. task state can catch up asynchronously in the plugin

the Buzz thread has the flow, existing owners, required gaps and recovery cases

this is a scope change request. the smaller implementation still needs validation

open in Buzz (copy this URL):

buzz://message?channel=346c5d21-d059-44e8-8798-6d0f35f19ae0&id=f6f460c95d8e15cf9ea309fdfc361708abdd7993f8f8621a23a4f54f12a7e2d6

@gilgtm
gilgtm force-pushed the gil/nexus-4022-durable-task-host branch from f12d20c to c065897 Compare November 10, 2026 03:00
@gilgtm gilgtm changed the title NEXUS-4022: Create durable task chats in New Chat NEXUS-4022: Start region chats in the New Chat editor Nov 10, 2026
@gilgtm
gilgtm marked this pull request as draft November 10, 2026 03:01
@gilgtm
gilgtm removed this pull request from stack #2791 November 10, 2026 03:03
@gilgtm
gilgtm added this pull request to stack #3176 November 10, 2026 03:03
gilgtm and others added 2 commits November 9, 2026 21:16
A Solo region source can open the host's New chat editor for its region,
optionally in a workspace. The draft keeps its own prompt, files, model and
effort, and sends like an ordinary New chat: the create goes out unguarded with
the region label before the first message, so the Outbox retries both after a
restart. A source can narrow the agents the draft may address, and Send is
refused while the source is not running and ready.

Before the create, the host saves on this device how the chat started, and
returns it only to that region's source until the source forgets it. The
source reconciles its own records from it by channel ID. Nothing changes for
hosts or plugins that do not use it.

Co-authored-by: Codex <[email protected]>
Co-authored-by: Claude <[email protected]>
Signed-off-by: Gil Birman <[email protected]>
A contributed Solo row action used to run on click, while its menu was
still open. The menu then returned focus to the row, which took focus
from the dialog or composer that the action had just opened.

Now the row menu runs the chosen action once its close completes. It
first puts focus on the row, so the action can move focus from there.
The action is dropped if the menu reopens, the row unmounts or rebinds,
or the user moves focus elsewhere before the close completes. Escape
and outside dismissal still return focus without running anything.

Co-authored-by: Codex <[email protected]>
Co-authored-by: Claude <[email protected]>
Signed-off-by: Gil Birman <[email protected]>
@gilgtm
gilgtm force-pushed the gil/nexus-4022-durable-task-host branch from c065897 to a778be9 Compare November 10, 2026 05:31
@gilgtm
gilgtm marked this pull request as ready for review November 10, 2026 05:54

@dr0uleau dr0uleau left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🤖 approved with one non-blocking finding on the agent check after file upload

Updated by Codex 🤖

// the start instead of leaving an empty chat behind.
const uploaded = await files.prepareForSend(new AbortController().signal);
if (!mounted.current) return;
regionOwner();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🤖 [P2] should you recheck the source binding and draftAgent after file upload, before saving the start and creating the chat? the current check only requires a ready source. if the selected local agent becomes archived or is removed during upload, Buzz still creates the chat and sends the message. Nexus then skips task creation and forgets the start. reuse the existing eligibility check here and keep the draft and files on refusal

Updated by Codex 🤖

@gilgtm
gilgtm merged commit 084bf95 into main Nov 11, 2026
64 checks passed
@gilgtm
gilgtm deleted the gil/nexus-4022-durable-task-host branch November 11, 2026 02:40
gilgtm added a commit that referenced this pull request Nov 11, 2026
## Summary

Exposes the bound user's personal Solo Workspaces to plugin regions
(`2cbf04b6d`).

`ctx.soloNavigation.workspaces` takes the current region binding and
offers:
- `snapshot`: the workspace IDs and names, the catalog status, whether
creation is available, and any read error;
- `subscribe` and `refresh`;
- `create({ id, name })`.

It uses the existing Solo preference writer, so that writer's
authorization, capacity and revision checks apply. An ended binding
cannot read or write another community. Ordinary chat filing stays
host-owned. `docs/solo-regions.md` documents the contract.

### Compared with the previous version of this PR

The PR no longer contains "add primary controls and the workspace
header". It is based on #2784's branch instead of #2785's.

buzz-review-completed

## Testing

Local runs on macOS, on the stack rebased onto main `9596cd3db`:
- At this PR's head `2cbf04b6d`: `pnpm check` (Biome, TypeScript and the
design checks) and the icon check passed. Vitest for the files the flake
check selects for this PR: 436 of 438 passed in a run that shared the
machine with a Rust build; the 2 tests that timed out
(`App.profile.test.tsx`, `entity-navigation.test.tsx`) passed on rerun,
52/52 in their files.
- At the stack tip `adbdf424e`: full Vitest, 20556 passed and 23 skipped
(includes `browser-host/channel-kit.test.mjs`).
- Browser journeys at the stack tip, Chromium and WebKit: the full
`tests/browser/solo-rename.spec.mjs`, repeated 5 times, passed 120/120.
The 34 other specs that the flake check relates to the stack, run once
in each engine: 343 passed, 3 skipped by their own conditions. The full
browser suite was not run locally.
- The Nexus plugin's connected browser harness ran on the actual Buzz
web shell and plugin UI, with a simulated relay and generated
identities, before the rebase. Full run at host pin `049a9b57e` (now
`1fbd49c49`), which includes this PR: 53 passed.

**Native testing:** Gil ran the native desktop app on this stack at
`adbdf424e`, with the matching Nexus plugin build. Gil confirmed that
these native-only paths passed:
- `!` folder listing through the Tauri `repositories_folder_list`
command (#2789);
- `/` SKILL.md listing through `local_skills_list` (#2790);
- the Claude `--add-dir` folder grant (#2789);
- relay signing and Outbox retry after a native restart.

Agent testing did not reach these paths: the agent ran no native app, no
real relay and no real agent.

## Known gaps

- None specific to this PR.

Hosted or local failures that this stack does not cause:
- `tests/browser/typing.spec.mjs:290` ("a growing channel/thread
composer lifts history with it at the bottom") intermittently fails with
React error #185 on main too. Locally it failed 12 of 12 runs at
`9596cd3db` and 9 of 12 at a later main commit.
- On macOS, `cargo test -p Buzz` crashes the library test binary
(SIGSEGV), and some `host_command` deadline tests fail. Both happen the
same way at base `9596cd3db`, before this stack. Hosted Linux CI is the
reference for these.

## Test changes

Titles are compared only in the test files each range changes. Tests
that moved or were renamed are matched by title.

<details><summary>Removed by this PR's diff (0)</summary>

- none

</details>

<details><summary>Added by this PR's diff (1)</summary>

- `src/features/channel-navigation/solo-workspaces.test.ts`: projects
the existing Solo catalog and writer, preserving uncertainty and fencing
ended bindings

</details>

<details><summary>In the previous version of this PR, not carried over
(2)</summary>

- `src/features/solo/SoloDraft.test.tsx`: permits one start across
already-open drafts and preserves unresolved payload (%s)
- `src/features/solo/SoloDraft.test.tsx`: shows pending accepted-message
recovery and cancels binding when its draft region ends

</details>

Signed-off-by: Gil Birman <[email protected]>
Co-authored-by: Codex <[email protected]>
joahg added a commit to joahg/buzz-app that referenced this pull request Nov 11, 2026
* origin/main:
  feat(messages): let attachment renderers open files from the host file card (block#2239)
  feat(charts): bundle a Charts code-block renderer (block#3226)
  Expose native reply grouping through Conversation.ui (block#3245)
  NEXUS-4163: Keep plugin-owned chat deletion in Solo (block#2787)
  NEXUS-4156: Expose Solo Workspaces to plugin regions (block#2786)
  NEXUS-4022: Start region chats in the New Chat editor (block#2784)
  feat(link-previews): unfurl web links below messages by default (block#3225)
  fix(messages): keep names in literal Markdown as written when editing (block#2834)
  feat(plugins): fetch a packaged managed plugin policy from a URL (block#2504)

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

# Conflicts:
#	crates/plugin-manager/tests/management.rs
#	docs/plugin-architecture.md
bostonaholic added a commit that referenced this pull request Nov 11, 2026
…y-untagged-reactions

* origin/main: (324 commits)
  fix(github): show private-repo body images from signed links (#3252)
  NEXUS-4029: Preserve semantic chips in the core composer (#2303)
  Make plugin signature enforcement opt-in (#2212)
  NEXUS-4156: Add workspace Leads and choose a chat's workspace (#2788)
  feat(plugins): report conclusively retired update providers (#3263)
  feat(messages): let attachment renderers open files from the host file card (#2239)
  feat(charts): bundle a Charts code-block renderer (#3226)
  Expose native reply grouping through Conversation.ui (#3245)
  NEXUS-4163: Keep plugin-owned chat deletion in Solo (#2787)
  NEXUS-4156: Expose Solo Workspaces to plugin regions (#2786)
  NEXUS-4022: Start region chats in the New Chat editor (#2784)
  feat(link-previews): unfurl web links below messages by default (#3225)
  fix(messages): keep names in literal Markdown as written when editing (#2834)
  feat(plugins): fetch a packaged managed plugin policy from a URL (#2504)
  fix(goose): enable deferred tool loading for goose agents (#3227)
  fix(unread): preserve manual intent in captured explicit reads (#3228)
  NEXUS-4337: Expose retained plugin update reviews (#3075)
  feat(conversation): add a link preview slot below messages (#3219)
  feat(plugins): let link previews read a public page's preview fields (#3217)
  Let sidebar row plugins decorate ordinary Solo chats (#3222)
  ...
tlongwell-block added a commit that referenced this pull request Nov 11, 2026
* origin/main: (121 commits)
  Expose Solo region state before a component mounts (#3296)
  fix(builderlab): say a 401 was refused, not expired, and show each sign-in failure once (#3241)
  feat(agents): file new Solo chats in explicit personal workspaces (#2857)
  perf(css): limit broad style invalidation (#3267)
  Delay and fade in the Bestie badge celebration (#3292)
  fix(github): show private-repo body images from signed links (#3252)
  NEXUS-4029: Preserve semantic chips in the core composer (#2303)
  Make plugin signature enforcement opt-in (#2212)
  NEXUS-4156: Add workspace Leads and choose a chat's workspace (#2788)
  feat(plugins): report conclusively retired update providers (#3263)
  feat(messages): let attachment renderers open files from the host file card (#2239)
  feat(charts): bundle a Charts code-block renderer (#3226)
  Expose native reply grouping through Conversation.ui (#3245)
  NEXUS-4163: Keep plugin-owned chat deletion in Solo (#2787)
  NEXUS-4156: Expose Solo Workspaces to plugin regions (#2786)
  NEXUS-4022: Start region chats in the New Chat editor (#2784)
  feat(link-previews): unfurl web links below messages by default (#3225)
  fix(messages): keep names in literal Markdown as written when editing (#2834)
  feat(plugins): fetch a packaged managed plugin policy from a URL (#2504)
  fix(goose): enable deferred tool loading for goose agents (#3227)
  ...

Signed-off-by: Tyler Longwell <[email protected]>
Co-authored-by: Eva <011987e296fd5006292d2f930b574be47c7801048d1983c46c425d3c95f0cffd@buzz.block.builderlab.xyz>
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.

4 participants