Repository navigation
Conversation
gilgtm
force-pushed
the
gil/nexus-4029-task-references
branch
2 times, most recently
from
November 10, 2026 03:00
565d801 to
049a9b5
Compare
This was referenced Nov 10, 2026
This was referenced Nov 10, 2026
gilgtm
force-pushed
the
gil/nexus-4029-task-references
branch
from
November 10, 2026 05:31
049a9b5 to
1fbd49c
Compare
In the desktop app, `!` in any composer lists the immediate folders of the community's repositories folder (Local settings, or the default `~/.buzz/REPOS`) as folder chips. It opens at a word start, as `@` does, once a character follows `!`. A bare `!`, `!` before a space, a mid-word `!` and Markdown image syntax `![` stay prose, so "Merci !" and Enter still sends. `@` still lists only mentions. One open `!` query lists once across keystrokes; reopening it, a changed preference or Retry after a failed read lists again. Chips now send. A chip is its label as literal text in place, and the host composer signs the message's chips as one `buzz-tokens-v1` tag. Only the first send or reply inside `signMessageTokens` takes them, so a send an outbox subscriber makes meanwhile carries none, and the public message API cannot add the tag. Sends, replies, queued follow-ups after a restart, and the first message of a new Solo chat all sign. A detached window refuses to send chips, since its relay connection would drop them. Malformed or unknown chip data still stays in storage unchanged and is refused. Native listing has two entry points over one bounded helper: - `repositories_folder_list` serves the trusted core renderer. - `plugin_host_repository_folders` serves `ctx.host.repositoryFolders`. It checks the plugin's manager id, revision and file grant before any filesystem work. The listing follows a linked root folder but never a linked child. It is capped at 4096 entries and 1 MiB, and runs on the directory listing semaphore with the read deadline. A local Claude or Codex agent is told about a referenced folder only when the message's author is the agent's owner and the folder is in the owner's repositories folder listing at that turn. Anyone in a chat can sign a chip, so another author's chip, or an unlisted folder, grants nothing. Claude also gets the folder through `--add-dir` for the rest of that conversation; Codex gets the prompt section only. Co-authored-by: Codex <noreply@openai.com> Co-authored-by: Claude <noreply@anthropic.com> Signed-off-by: Gil Birman <gil@squareup.com>
gilgtm
force-pushed
the
gil/nexus-4029-task-references
branch
from
November 10, 2026 06:17
1fbd49c to
8285716
Compare
gilgtm
marked this pull request as ready for review
November 10, 2026 06:37
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Offers and sends
!folder chips (828571619).!in any composer lists the immediate folders of the community's repositories folder (Local settings, or the default~/.buzz/REPOS).!.!,!before a space, a mid-word!and![stay prose.buzz-tokens-v1tag.repositories_folder_listserves the core renderer, andplugin_host_repository_foldersservesctx.host.repositoryFoldersafter checking the plugin's manager id, revision and file grant. The listing:--add-dirfor the rest of the conversation; Codex gets the prompt section only.Compared with the previous version of this PR
The previous version ("send task references,
#workspaces and@folders") depended on the removed task mode. The#workspace choice is now in its own commits (see the stack), and folders use!instead of@.buzz-review-completed
Testing
Local runs on macOS, on the stack rebased onto main
9596cd3db:adbdf424echain only intests/browser/solo-rename.spec.mjs.02f9c0277makes the new plugin-owned lifecycle test wait for the chat's row before filing it, after the hosted flake check caught it racing the roster load. With that fix, the fullsolo-rename.spec.mjspassed 180/180 at02f9c0277(10 repeats, Chromium and WebKit) and 120/120 atc99d0ce51(5 repeats).1fbd49c49:pnpm check(Biome, TypeScript and the design checks) and the icon check passed. Vitest for the files the flake check selects for this PR: 984 passed, 28 skipped.1fbd49c49:cargo fmt --checkandcargo clippy -p Buzz --all-targets -- -D warningspassed.host_filesandrepositories_foldertests at the stack tip: 24 and 4 passed.cargo-deny checkpassed at the stack tip.adbdf424e: full Vitest, 20556 passed and 23 skipped (includesbrowser-host/channel-kit.test.mjs).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.049a9b57e): 53 passed. The simulated host lists folders; the native listing did not run there.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 Taurirepositories_folder_listcommand (NEXUS-4029: Offer folder chips in the composer #2789);/SKILL.md listing throughlocal_skills_list(NEXUS-4033: Offer session skills in the core task composer #2790);--add-dirfolder grant (NEXUS-4029: Offer folder chips in the composer #2789);Agent testing did not reach these paths: the agent ran no native app, no real relay and no real agent.
Known gaps
--add-dirgrant natively, and they passed. Agent testing did not reach them.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 at9596cd3dband 9 of 12 at a later main commit.cargo test -p Buzzcrashes the library test binary (SIGSEGV), and somehost_commanddeadline tests fail. Both happen the same way at base9596cd3db, 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 (2)
src/features/conversation/service.test.tsx: bundled plugin registers its own completion providersrc/features/messages/MessageComposer.test.tsx: inserts a bundled provider's chip as one atom and keeps it unsent until chips shipAdded by this PR's diff (21)
src/bundled/claude-code/runtime.test.ts: grants a listed folder its owner referenced by chip for the rest of the conversation, never an unlisted onesrc/bundled/mentions/FolderCompletion.test.tsx: a!query reopened at the same position, after a preference change, or retried after a failed read lists the folders again; a closed query's late listing never publishessrc/bundled/mentions/FolderCompletion.test.tsx: matches!only at a word start before a query character, never in image syntax or mid-wordsrc/bundled/mentions/FolderCompletion.test.tsx: offers the repositories folder's folders as chips, listed once per query; a browser build never lists itsrc/features/agent-harness/referenced-folders.test.ts: grants nothing without chips, for malformed chips, or when the listing failssrc/features/agent-harness/referenced-folders.test.ts: grants only folders the owner referenced that their repositories folder lists nowsrc/features/agent-harness/referenced-folders.test.ts: quotes a folder path so it cannot close the prompt sectionsrc/features/communities/repositories.test.ts: lists the partition's configured folder and refuses a listing that outlived its preference or callersrc/features/conversation/service.test.tsx: bundled plugin registers its own completion providerssrc/features/host/service.test.ts: lists the binding's configured repositories folder as the calling plugin, never a path it namessrc/features/messages/MessageComposer.test.tsx: inserts a bundled provider's chip as one atom and signs it into the sent messagesrc/features/messages/follow-up-persistence.test.ts: keeps saved messages with invalid or oversized chips unsent and unchanged: %jsrc/features/messages/follow-up-persistence.test.ts: restores a queued message's chips and signs them on the recovered sendsrc/features/messages/message-tokens.test.ts: gives the chips being signed only to the first send inside itsrc/features/messages/message-tokens.test.ts: rejects duplicate tags or chips, malformed shapes and oversized payloadssrc/features/messages/message-tokens.test.ts: round-trips exact chips with extra metadata in one tagsrc/features/messages/message-tokens.test.ts: sends chips as their labels, literally and in authored ordersrc/features/messages/message-tokens.test.ts: serializes syntax-like labels literally, including under rich formattingsrc/features/relay/send-to-channel.test.ts: a host reply signs its chips once and retries the exact bytes; the public API cannot add chipssrc/features/relay/send-to-channel.test.ts: only the host's own send carries its chips, not a send an outbox subscriber makes while it is queuedsrc/features/solo/SoloDraft.test.tsx: starts a New chat from a saved folder chip and signs the chip into its first messageIn the previous version of this PR, not carried over (24)
src/bundled/channels/ChannelCompletion.test.tsx: in a task draft,#offers the region's workspaces instead of channels; a task chat keeps channel linkssrc/bundled/mentions/team-mentions.test.tsx: a host task composer offers its repositories folder's folders as chips, listed once per query; other composers never list itsrc/bundled/mentions/team-mentions.test.tsx: an@query reopened at the same position, after a preference change, or retried after a failed read lists the folders again; a closed query's late listing never publishessrc/features/conversation/completion.test.ts: keeps chip and workspace edits only from a provider a bundled plugin registered, for that registration's lifetimesrc/features/messages/MessageComposer.test.tsx: a bundled#workspace choice files a task draft in one undo step, and nothing else (task draft: %s)src/features/messages/MessageComposer.test.tsx: a plugin Composer seeded with chip data never gets it signed (%s)src/features/messages/MessageComposer.test.tsx: inserts a bundled provider's chip as one atom and signs it only in a task chat (task chat: %s)src/features/messages/MessageComposer.test.tsx: inside a host task draft, only its own composer gets the draft's completion context (task draft: %s)src/features/messages/follow-up-persistence.test.ts: keeps saved messages with invalid or oversized task tokens unsent and unchanged: %jsrc/features/messages/follow-up-persistence.test.ts: restores a task chat's queued chips and signs them on the recovered send, never in another chatsrc/features/messages/mention-draft.test.ts: keeps a task draft's workspace, lifts one saved project into it, and marks other data another build saved as unsupportedsrc/features/messages/task-tokens.test.ts: keeps personal workspace filing out of signed task tagssrc/features/messages/task-tokens.test.ts: keeps repository and folder references in authored order, inline and without a footersrc/features/messages/task-tokens.test.ts: keeps unknown versions inert and fallback labels literalsrc/features/messages/task-tokens.test.ts: rejects duplicate tags, duplicate identities, malformed shapes and oversized UTF-8 payloadssrc/features/messages/task-tokens.test.ts: round-trips exact identities and extra metadata without interpreting display verificationsrc/features/messages/task-tokens.test.ts: serializes syntax-like token labels literally in place, including under rich formattingsrc/features/relay/send-to-channel.test.ts: a host task reply signs its chips once and retries the exact bytes; the public API cannot add chipssrc/features/solo/SoloDraft.test.tsx: gives the task draft's own region binding to its composer's completionssrc/features/solo/SoloDraft.test.tsx: restores %s chip saved beside a staged chat link across remount; starts the task with it inline and signed only if it is for the primary agentsrc/features/solo/SoloDraft.test.tsx: resumes the saved task pair before prepare and transfers edits, including a chip-only change; refuses malformed signed chips (%s)src/features/solo/task-mode.test.ts: checks signed chips against the task chat's recipients, refuses them outside a task chat and malformed ones on send and first-event retry, and ignores unknown versionssrc/features/solo/task-mode.test.ts: keeps malformed task-token and live task-member guards ahead of informational policysrc/features/solo/task-mode.test.ts: refuses recognized information carrying %s even if ordinary admission would allow it