refactor: dedupe core optional string helper

This commit is contained in:
Peter Steinberger
2026-04-07 00:11:28 +01:00
parent f16e9364d2
commit 10bc10b853
5 changed files with 5 additions and 31 deletions

View File

@@ -1,6 +1,7 @@
import type { OpenClawConfig } from "../../config/config.js";
import type { SandboxSshSettings } from "../../config/types.sandbox.js";
import { normalizeSecretInputString } from "../../config/types.secrets.js";
import { normalizeOptionalString } from "../../shared/string-coerce.js";
import { resolveAgentConfig } from "../agent-scope.js";
import {
DEFAULT_SANDBOX_BROWSER_AUTOSTART_TIMEOUT_MS,
@@ -173,11 +174,6 @@ export function resolveSandboxPruneConfig(params: {
};
}
function normalizeOptionalString(value: string | undefined): string | undefined {
const trimmed = value?.trim();
return trimmed ? trimmed : undefined;
}
function normalizeRemoteRoot(value: string | undefined, fallback: string): string {
const normalized = normalizeOptionalString(value) ?? fallback;
const posix = normalized.replaceAll("\\", "/");

View File

@@ -3,6 +3,7 @@ import { resolveStorePath } from "../config/sessions/paths.js";
import { loadSessionStore } from "../config/sessions/store-load.js";
import { normalizeOptionalAccountId } from "../routing/account-id.js";
import { parseAgentSessionKey } from "../routing/session-key.js";
import { normalizeOptionalString } from "../shared/string-coerce.js";
import { normalizeMessageChannel } from "../utils/message-channel.js";
import type { ExecApprovalRequest } from "./exec-approvals.js";
import type { PluginApprovalRequest } from "./plugin-approvals.js";
@@ -14,11 +15,6 @@ type ApprovalRequestSessionBinding = {
accountId?: string;
};
function normalizeOptionalString(value?: string | null): string | undefined {
const normalized = value?.trim();
return normalized ? normalized : undefined;
}
function normalizeOptionalChannel(value?: string | null): string | undefined {
return normalizeMessageChannel(value);
}

View File

@@ -2,6 +2,7 @@ import type { OpenClawConfig } from "../config/config.js";
import { resolveStorePath } from "../config/sessions/paths.js";
import { loadSessionStore } from "../config/sessions/store-load.js";
import { parseAgentSessionKey } from "../routing/session-key.js";
import { normalizeOptionalString } from "../shared/string-coerce.js";
import { normalizeMessageChannel } from "../utils/message-channel.js";
import { doesApprovalRequestMatchChannelAccount } from "./approval-request-account-binding.js";
import type { ExecApprovalRequest } from "./exec-approvals.js";
@@ -33,11 +34,6 @@ type ApprovalRequestOriginTargetResolver<TTarget> = {
resolveFallbackTarget?: (request: ApprovalRequestLike) => TTarget | null;
};
function normalizeOptionalString(value?: string | null): string | undefined {
const normalized = value?.trim();
return normalized ? normalized : undefined;
}
function normalizeOptionalThreadId(value?: string | number | null): number | undefined {
if (typeof value === "number") {
return Number.isFinite(value) ? value : undefined;

View File

@@ -1,5 +1,6 @@
import { resolveSessionAgentId } from "../../agents/agent-scope.js";
import type { OpenClawConfig } from "../../config/config.js";
import { normalizeOptionalString } from "../../shared/string-coerce.js";
export type OutboundSessionContext = {
/** Canonical session key used for internal hook dispatch. */
@@ -8,14 +9,6 @@ export type OutboundSessionContext = {
agentId?: string;
};
function normalizeOptionalString(value?: string | null): string | undefined {
if (typeof value !== "string") {
return undefined;
}
const trimmed = value.trim();
return trimmed.length > 0 ? trimmed : undefined;
}
export function buildOutboundSessionContext(params: {
cfg: OpenClawConfig;
sessionKey?: string | null;

View File

@@ -1,4 +1,5 @@
import type { AgentMessage } from "@mariozechner/pi-agent-core";
import { normalizeOptionalString } from "../shared/string-coerce.js";
export const INPUT_PROVENANCE_KIND_VALUES = [
"external_user",
@@ -16,14 +17,6 @@ export type InputProvenance = {
sourceTool?: string;
};
function normalizeOptionalString(value: unknown): string | undefined {
if (typeof value !== "string") {
return undefined;
}
const trimmed = value.trim();
return trimmed ? trimmed : undefined;
}
function isInputProvenanceKind(value: unknown): value is InputProvenanceKind {
return (
typeof value === "string" && (INPUT_PROVENANCE_KIND_VALUES as readonly string[]).includes(value)