fix(tui): add OSC 8 hyperlinks for wrapped URLs (#17814)

* feat(tui): add OSC 8 hyperlinks to make wrapped URLs clickable

Long URLs that exceed terminal width get broken across lines by pi-tui's
word wrapping, making them unclickable. Post-process rendered markdown
output to add OSC 8 terminal hyperlink sequences around URL fragments,
so each line fragment links to the full URL. Gracefully degrades on
terminals without OSC 8 support.

* tui: harden OSC8 URL extraction and prefix resolution

* tui: add changelog entry for OSC 8 markdown hyperlinks

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
This commit is contained in:
Phineas1500
2026-02-22 19:09:07 -05:00
committed by GitHub
parent d92ba4f8aa
commit 331b728b8d
5 changed files with 434 additions and 4 deletions

View File

@@ -1,12 +1,22 @@
import { theme } from "../theme/theme.js";
import { MarkdownMessageComponent } from "./markdown-message.js";
import { Container, Spacer } from "@mariozechner/pi-tui";
import { markdownTheme, theme } from "../theme/theme.js";
import { HyperlinkMarkdown } from "./hyperlink-markdown.js";
export class AssistantMessageComponent extends Container {
private body: HyperlinkMarkdown;
export class AssistantMessageComponent extends MarkdownMessageComponent {
constructor(text: string) {
super(text, 0, {
super();
this.body = new HyperlinkMarkdown(text, 1, 0, markdownTheme, {
// Keep assistant body text in terminal default foreground so contrast
// follows the user's terminal theme (dark or light).
color: (line) => theme.assistantText(line),
});
this.addChild(new Spacer(1));
this.addChild(this.body);
}
setText(text: string) {
this.body.setText(text);
}
}