From 6d658c70ea159cec1800e5fec0556b4010f659ea Mon Sep 17 00:00:00 2001 From: linhongkuan Date: Mon, 29 Jun 2026 10:14:18 +0800 Subject: [PATCH] fix(terminal-core): tighten docs link URL detection --- packages/terminal-core/src/links.test.ts | 10 ++++++++++ packages/terminal-core/src/links.ts | 4 +++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/packages/terminal-core/src/links.test.ts b/packages/terminal-core/src/links.test.ts index c3c1f017dd82..a90dc00c4113 100644 --- a/packages/terminal-core/src/links.test.ts +++ b/packages/terminal-core/src/links.test.ts @@ -13,6 +13,16 @@ describe("formatDocsLink", () => { expect(out).toBe("https://example.com/page"); }); + it("preserves uppercase absolute HTTPS urls", () => { + const out = formatDocsLink("HTTPS://example.com/page", "page"); + expect(out).toBe("HTTPS://example.com/page"); + }); + + it("does not treat http-prefixed relative paths as absolute urls", () => { + const out = formatDocsLink("http-status", "HTTP status"); + expect(out).toBe("https://docs.openclaw.ai/http-status"); + }); + it("treats whitespace-only path like an empty path and falls back to docs root", () => { const out = formatDocsLink(" ", "root"); expect(out).toBe("https://docs.openclaw.ai"); diff --git a/packages/terminal-core/src/links.ts b/packages/terminal-core/src/links.ts index f839a61c9b25..6d3df6e6c190 100644 --- a/packages/terminal-core/src/links.ts +++ b/packages/terminal-core/src/links.ts @@ -5,6 +5,8 @@ function resolveDocsRoot(): string { return "https://docs.openclaw.ai"; } +const ABSOLUTE_HTTP_URL_RE = /^https?:\/\//i; + export function formatDocsLink( path: string | undefined | null, label?: string, @@ -17,7 +19,7 @@ export function formatDocsLink( // here unguarded. The typed contract says docsPath is required, but a // handful of channel plugins and catalog rows leave it unset at runtime. const url = trimmed - ? trimmed.startsWith("http") + ? ABSOLUTE_HTTP_URL_RE.test(trimmed) ? trimmed : `${docsRoot}${trimmed.startsWith("/") ? trimmed : `/${trimmed}`}` : docsRoot;