diff --git a/CHANGELOG.md b/CHANGELOG.md index a0245d954..68c7af413 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ Docs: https://docs.openclaw.ai ### Fixes +- Auto-reply/Tools: forward `senderIsOwner` through embedded queued/followup runner params so owner-only tools remain available for authorized senders. (#22296) thanks @hcoj. - Agents/Subagents: restore announce-chain delivery to agent injection, defer nested announce output until descendant follow-up content is ready, and prevent descendant deferrals from consuming announce retry budget so deep chains do not drop final completions. (#22223) Thanks @tyler6204. - Gateway/Auth: require `gateway.trustedProxies` to include a loopback proxy address when `auth.mode="trusted-proxy"` and `bind="loopback"`, preventing same-host proxy misconfiguration from silently blocking auth. (#22082, follow-up to #20097) thanks @mbelinky. - Security/OpenClawKit/UI: prevent injected inbound user context metadata blocks from leaking into chat history in TUI, webchat, and macOS surfaces by stripping all untrusted metadata prefixes at display boundaries. (#22142) Thanks @Mellowambience, @vincentkoc. diff --git a/src/auto-reply/reply/agent-runner-utils.ts b/src/auto-reply/reply/agent-runner-utils.ts index cafad03ac..3402e8924 100644 --- a/src/auto-reply/reply/agent-runner-utils.ts +++ b/src/auto-reply/reply/agent-runner-utils.ts @@ -164,6 +164,7 @@ export function buildEmbeddedRunBaseParams(params: { config: params.run.config, skillsSnapshot: params.run.skillsSnapshot, ownerNumbers: params.run.ownerNumbers, + senderIsOwner: params.run.senderIsOwner, enforceFinalTag: resolveEnforceFinalTag(params.run, params.provider), provider: params.provider, model: params.model, diff --git a/src/auto-reply/reply/followup-runner.ts b/src/auto-reply/reply/followup-runner.ts index 52f3e9e0c..91f9e38c2 100644 --- a/src/auto-reply/reply/followup-runner.ts +++ b/src/auto-reply/reply/followup-runner.ts @@ -152,6 +152,7 @@ export function createFollowupRunner(params: { senderName: queued.run.senderName, senderUsername: queued.run.senderUsername, senderE164: queued.run.senderE164, + senderIsOwner: queued.run.senderIsOwner, sessionFile: queued.run.sessionFile, workspaceDir: queued.run.workspaceDir, config: queued.run.config, diff --git a/src/auto-reply/reply/queue/types.ts b/src/auto-reply/reply/queue/types.ts index 8fee20059..929f02e07 100644 --- a/src/auto-reply/reply/queue/types.ts +++ b/src/auto-reply/reply/queue/types.ts @@ -55,6 +55,7 @@ export type FollowupRun = { senderName?: string; senderUsername?: string; senderE164?: string; + senderIsOwner?: boolean; sessionFile: string; workspaceDir: string; config: OpenClawConfig; diff --git a/src/shared/chat-envelope.ts b/src/shared/chat-envelope.ts index e7a8bcc2f..c96a231af 100644 --- a/src/shared/chat-envelope.ts +++ b/src/shared/chat-envelope.ts @@ -24,7 +24,7 @@ const INBOUND_METADATA_HEADERS = [ "Forwarded message context (untrusted metadata):", "Chat history since last reply (untrusted, for context):", ]; -const REGEX_ESCAPE_RE = /[.*+?^${}()|[\]\\\-]/g; +const REGEX_ESCAPE_RE = /[.*+?^${}()|[\]\\-]/g; const INBOUND_METADATA_PREFIX_RE = new RegExp( "^\\s*(?:" + INBOUND_METADATA_HEADERS.map((header) => header.replace(REGEX_ESCAPE_RE, "\\$&")).join("|") +