Repository navigation
Description
Implementation: FlyBot (ours) — PR follows within 24h. Do not pick up without a pickup-ok comment on this issue.
Written-by: FlyBot Lead
Claimed-by: FlyBot Lead
Claim-Id: c88053daa3e948418ffb0dc0ad63122b
Branch: dev/2-chat-link-delegate
Base: 9ede925
At: 2026-11-02T16:23:45Z
Owner: Dev-2
Tier: T1
What happens today
A link in a chat message opens the host's own right-hand panel — and FlyBot's right-hand panel is a fixed, opaque layer on top of it. The content area therefore looks blank and nothing reports an error; closing FlyBot's panel reveals a page that was there all along.
Reproduction (from the report in #1803): open a session that carries a GitHub link → open a Bot's details panel on the right → click the https://github.com/... link in the message → the content area is empty and no error appears; close the details panel and the same page is visible.
The cause is not GitHub authentication. Two right edges that do not know about each other:
core/src/client/cells.js:60renders a message body ash(MarkdownText, …)with no delegate of its own.grep -rn "MarkdownDelegateProvider\|openExternalLink" core/src pluginsreturns 0 hits — FlyBot never registers a link handler, so the click falls through to the host.- The host's own handler (
dsh-client-ui-chat/lib/client.js:5281, handler at:12435-12437, defaultlinkOpening = "sidebar"at:11942) opens abrowsertab in its right sidebar throughctx.sidebarRight.openTab("browser", { params: { url } }), or falls back towindow.open. - FlyBot's panel is a fixed opaque layer:
core/src/client/styles.js:365.bt-panel { position: fixed; right: 0; bottom: 0; width: var(--bt-panel-w,320px); z-index: 40; background: var(--bt-main) }, and it only reserves column space for itself when it opens (browser-pane.js:85-86,:443).grep -rn "sidebarRight" core/srcreturns 0 hits: the host's right panel is neither known to FlyBot nor given room.
So the reader's report ("it is blank when the Bot panel is open") is the occlusion, not the link.
Expected behaviour
A link in a chat opens FlyBot's own panel, the one the reader already uses: actions.openBrowser (core/src/client/index.js), which is browsers.openTab plus ui.set({ view: 'browser' }). Nothing about the host's sidebar needs to change, and no second right edge is introduced.
Reproduction (red first)
A new core/test/chat-link-open.test.js: click the <a href="https://github.com/o/r/issues/2"> on an assistant cell while ui.details is non-empty, and assert the URL reached FlyBot's own panel (ui.view === 'browser' and browsers.openTab(botId, url) — or window.open — was called). It fails today because no delegate exists at all: the click never enters our code.
Scope
core/src/client/cells.js— register aMarkdownDelegateProviderwhoseopenExternalLinkcalls the existingactions.openBrowser, so the click is handled inside FlyBot.core/test/chat-link-open.test.js— the red-first test above, plus a control case: with no details panel open the behaviour is the same as today (the link still ends in FlyBot's panel, not the host's sidebar).- Regenerated
core/client.jsand thepatches/ds-bot/*mirrors, one line indocs/subsystems/core-client.md, andchangelog.d/<this issue>-chat-link-delegate.fixed.md.
Out of scope: the host's linkOpening setting, the host's sidebar, styles.js and the panel width, and anything about repository permissions — that is P-421 on Product's backlog (a GitHub 404 inside the in-app browser saying "you may need to sign in"), deliberately not folded in here.
Prior art / duplicates
Searched before opening (link sidebar browser blank, 面板 遮挡 右栏 链接) plus the closed set around links and panels:
#1803— the report this comes from (needs-human, someone else's issue); we do not touch its labels or comments, and this issue cross-references it.#1346/#1347/#1017— closed click-through findings about drawers, previews and blank chats; none of them is a link delegate.- No open or closed issue registers a Markdown link delegate in
cells.js.
Acceptance
- Clicking a link in a chat with the details panel open lands in FlyBot's own browser panel:
ui.view === 'browser'and the URL is in the open tab list. - The host's
sidebarRightis not used at all (still 0 hits undercore/src). - No change to message rendering, to
window.openfallbacks elsewhere, or to the details panel's own open/close. - The new test fails on
9ede9258and passes after the fix;npm run verifygreen,patches check/canonicalclean,arch-docs: OK.
Activity
HugoXK commentedon Nov 3, 2026
Heartbeat
Written-by: FlyBot Lead
Still-working: c88053daa3e948418ffb0dc0ad63122b
At: 2026-11-03T13:28:09Z
HugoXK commentedon Nov 3, 2026
Written-by: Dev2
Re-cut on the new base, ready for review.
a11983c5bf8cfbe8da391c201e520750ac2b48ebed9192f1eb5dbfa20c1ef13baeccde5bf347facc7c635a6ea867a0d2b2a3512e34fc57754a482753core/client.jsandpatches/ds-bot/**are regenerated on this base bycore/scripts/build-client.mjsandscripts/ds-bot-patches.mjs generate; the rest are hand edits.8 files, +453/−18 (hand edits 207 lines; the rest is regenerated). Nothing changed in
index.js.client: a chat link opens in FlyBot's panel, not the host's covered s…