This repository was archived by the owner on Aug 17, 2026. It is now read-only.
feat(composer): offer roster bots in the @ picker (#43) - #65
Closed
BowmanStephen wants to merge 3 commits into
Closed
feat(composer): offer roster bots in the @ picker (#43)#65BowmanStephen wants to merge 3 commits into
BowmanStephen wants to merge 3 commits into
Conversation
…arch#48) A bot that never had a 'Bot Chat' session made the handoff command fail with 'No session found matching Bot Chat' and the reply silently drop. The @mention middleware now ensures every mentioned bot has a canonical chat before composing the handoff: - ensureCanonicalChat() adopts an existing 'Bot Chat' session when the pin is missing (created via CLI/gateway) instead of minting a duplicate - createCanonicalChat() gains { navigate: false } so the pre-flight never hijacks the user's view — the kickoff still runs so the gateway doesn't prune the zero-message session - if pre-creation fails, the handoff note tells the agent the fallback (send without -c, then rename) instead of letting it vanish silently Tests: 4 new (adopt existing, create without navigate, pinned short- circuit, navigate:false never opens a session). 48 total, all pass.
Registers a composer.mentions provider: every roster bot (except the active profile) appears as a grouped 'Bots' entry in the composer's @ autocomplete, with the display name from bot-meta, description/title as the secondary line, and the @handle as the inserted text. Needs hermes-agent PR #86814 (composer.mentions contribution surface); on older desktop builds the plugin's registration is inert. Tests: 4 new (roster listed, meta title override, meta fallback order, active profile excluded). 59 total, all pass.
Upstream NousResearch#64 (hide Bot Chats) added $hideBotChats reads to createCanonicalChat; the pre-flight test harness must stub it.
Contributor
|
Thanks for building this, @BowmanStephen! Closing as already implemented: the composer If you spot a specific case where a bot you'd expect is NOT offered in the picker, please open an issue with a repro and we'll take a look. The separate |
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 subscribe to this conversation on GitHub.
Already have an account?
Sign in.
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.
What
Registers a
composer.mentionsprovider so the composer's@picker offers every roster bot (except the active profile) as a grouped Bots entry.How
resolveMentions({ gatewayProfile })reads$lastRoster, excludes the active profile, maps each bot to{ text: '@' + botHandle(name), display: displayName(bot, meta[name]), meta: bot.description || bot.title || 'Agent', group: 'Bots' }.ctx.register({ id: 'mention-provider', area: COMPOSER_AREAS.mentions, data: { resolve: resolveMentions } }).composer.mentionsseam: mention entries are merged intouseAtCompletions, filtered by text or display name (case-insensitive), and taggedmetadata.mention = trueso they survive the mid-message inline filter alongside skills.Compatibility
Older gateways / desktop builds without the core seam simply never call the provider — no breakage. Entries use
displayNamesemantics (meta title wins, else profile title, else handle).Tests
tests/mention-provider.test.mjs— 4 tests: excludes active profile, maps handle/display/meta, groups as Bots, empty roster yields no entries.origin/main(upstream fix: scope Routines pane to each bot's own cron store (#37) #63/feat: hide canonical Bot Chats from the global Sessions sidebar (#46) #64 included).Also in this branch
7e2e7f7ancestor, PR fix: pre-flight canonical Bot Chat before @mention handoffs (#48) #61) and a test-harness stub for upstream's$hideBotChats(feat: hide canonical Bot Chats from the global Sessions sidebar (#46) #64).