diff --git a/extensions/signal/src/channel.ts b/extensions/signal/src/channel.ts index 9144c68fb18..be5c8f9dae9 100644 --- a/extensions/signal/src/channel.ts +++ b/extensions/signal/src/channel.ts @@ -18,6 +18,7 @@ import { createComputedAccountStatusAdapter, createDefaultChannelRuntimeState, } from "openclaw/plugin-sdk/status-helpers"; +import { normalizeLowercaseStringOrEmpty } from "openclaw/plugin-sdk/text-runtime"; import { resolveSignalAccount, type ResolvedSignalAccount } from "./accounts.js"; import { signalApprovalAuth } from "./approval-auth.js"; import { markdownToSignalTextChunks } from "./format.js"; @@ -103,7 +104,7 @@ function inferSignalTargetChatType(rawTo: string) { if (!to) { return undefined; } - const lower = to.toLowerCase(); + const lower = normalizeLowercaseStringOrEmpty(to); if (lower.startsWith("group:")) { return "group" as const; } diff --git a/extensions/signal/src/format.ts b/extensions/signal/src/format.ts index b8d559fc012..66539548731 100644 --- a/extensions/signal/src/format.ts +++ b/extensions/signal/src/format.ts @@ -1,6 +1,7 @@ import type { MarkdownTableMode } from "openclaw/plugin-sdk/config-runtime"; import { markdownToIR, + normalizeLowercaseStringOrEmpty, type MarkdownIR, type MarkdownStyle, renderMarkdownIRChunksWithinLimit, @@ -35,7 +36,7 @@ type Insertion = { }; function normalizeUrlForComparison(url: string): string { - let normalized = url.toLowerCase(); + let normalized = normalizeLowercaseStringOrEmpty(url); // Strip protocol normalized = normalized.replace(/^https?:\/\//, ""); // Strip www. prefix diff --git a/extensions/signal/src/identity.ts b/extensions/signal/src/identity.ts index 4375e79e0c4..987c19bf118 100644 --- a/extensions/signal/src/identity.ts +++ b/extensions/signal/src/identity.ts @@ -1,5 +1,5 @@ import { evaluateSenderGroupAccessForPolicy } from "openclaw/plugin-sdk/group-access"; -import { normalizeE164 } from "openclaw/plugin-sdk/text-runtime"; +import { normalizeE164, normalizeLowercaseStringOrEmpty } from "openclaw/plugin-sdk/text-runtime"; import { looksLikeUuid } from "./uuid.js"; export type SignalSender = @@ -69,7 +69,7 @@ function parseSignalAllowEntry(entry: string): SignalAllowEntry | null { } const stripped = stripSignalPrefix(trimmed); - const lower = stripped.toLowerCase(); + const lower = normalizeLowercaseStringOrEmpty(stripped); if (lower.startsWith("uuid:")) { const raw = stripped.slice("uuid:".length).trim(); if (!raw) { diff --git a/extensions/signal/src/install-signal-cli.ts b/extensions/signal/src/install-signal-cli.ts index fbbc5908a34..d7bc0a3ec49 100644 --- a/extensions/signal/src/install-signal-cli.ts +++ b/extensions/signal/src/install-signal-cli.ts @@ -8,6 +8,7 @@ import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime"; import { runPluginCommandWithTimeout } from "openclaw/plugin-sdk/run-command"; import type { RuntimeEnv } from "openclaw/plugin-sdk/runtime-env"; import { CONFIG_DIR, extractArchive, resolveBrewExecutable } from "openclaw/plugin-sdk/setup-tools"; +import { normalizeLowercaseStringOrEmpty } from "openclaw/plugin-sdk/text-runtime"; export type ReleaseAsset = { name?: string; @@ -64,10 +65,12 @@ export function pickAsset( ); // Archives only, excluding signature files (.asc) - const archives = withName.filter((a) => looksLikeArchive(a.name.toLowerCase())); + const archives = withName.filter((a) => + looksLikeArchive(normalizeLowercaseStringOrEmpty(a.name)), + ); const byName = (pattern: RegExp) => - archives.find((asset) => pattern.test(asset.name.toLowerCase())); + archives.find((asset) => pattern.test(normalizeLowercaseStringOrEmpty(asset.name))); if (platform === "linux") { // The official "Linux-native" asset is an x86-64 GraalVM binary. @@ -253,7 +256,7 @@ async function installSignalCliFromRelease(runtime: RuntimeEnv): Promise { - if (entry.toLowerCase().startsWith("uuid:")) { + if (normalizeLowercaseStringOrEmpty(entry).startsWith("uuid:")) { const id = entry.slice("uuid:".length).trim(); if (!id) { return { error: "Invalid uuid entry" };