Vendor OpenClaw source as Adolf fork baseline
Some checks failed
ClawSweeper Dispatch / dispatch (push) Has been cancelled
CodeQL / Security High (actions) (push) Has been cancelled
CodeQL / Security High (channel-runtime-boundary) (push) Has been cancelled
CodeQL / Security High (core-auth-secrets) (push) Has been cancelled
CodeQL / Security High (mcp-process-tool-boundary) (push) Has been cancelled
CodeQL / Security High (network-ssrf-boundary) (push) Has been cancelled
CodeQL / Security High (plugin-trust-boundary) (push) Has been cancelled
CodeQL / Security High (process-exec-boundary) (push) Has been cancelled
Docs Sync Publish Repo / sync-publish-repo (push) Has been cancelled
Docs / docs (push) Has been cancelled
OpenClaw Stable Main Closeout / Resolve stable release closeout inputs (push) Has been cancelled
OpenClaw Stable Main Closeout / Verify stable main closeout (push) Has been cancelled
Workflow Sanity / no-tabs (push) Has been cancelled
Workflow Sanity / actionlint (push) Has been cancelled
Workflow Sanity / generated-doc-baselines (push) Has been cancelled
CI / runner-admission (push) Has been cancelled
CI / preflight (push) Has been cancelled
CI / security-fast (push) Has been cancelled
CI / pnpm-store-warmup (push) Has been cancelled
CI / build-artifacts (push) Has been cancelled
CI / native-i18n (push) Has been cancelled
CI / ${{ matrix.check_name }} (push) Has been cancelled
CI / ${{ matrix.checkName }} (push) Has been cancelled
CI / checks-node-compat-node22 (push) Has been cancelled
CI / check-bundled-channel-config-metadata (push) Has been cancelled
CI / check-dependencies (push) Has been cancelled
CI / check-guards (push) Has been cancelled
CI / check-lint (push) Has been cancelled
CI / check-prod-types (push) Has been cancelled
CI / check-shrinkwrap (push) Has been cancelled
CI / check-test-types (push) Has been cancelled
CI / check-additional-boundaries-a (push) Has been cancelled
CI / check-additional-boundaries-bcd (push) Has been cancelled
CI / check-additional-extension-bundled (push) Has been cancelled
CI / check-additional-extension-channels (push) Has been cancelled
CI / check-additional-extension-package-boundary (push) Has been cancelled
CI / check-additional-runtime-topology-architecture (push) Has been cancelled
CI / check-session-accessor-boundary (push) Has been cancelled
CI / check-session-transcript-reader-boundary (push) Has been cancelled
CI / check-docs (push) Has been cancelled
CI / skills-python (push) Has been cancelled
CI / macos-swift (push) Has been cancelled
CI / ios-build (push) Has been cancelled
CI / ci-timings-summary (push) Has been cancelled
Native App Locale Refresh / Refresh native fa (push) Has been cancelled
Native App Locale Refresh / Refresh native fr (push) Has been cancelled
Native App Locale Refresh / Refresh native hi (push) Has been cancelled
Native App Locale Refresh / Refresh native id (push) Has been cancelled
Native App Locale Refresh / Refresh native it (push) Has been cancelled
Native App Locale Refresh / Refresh native ja-JP (push) Has been cancelled
Control UI Locale Refresh / plan (push) Has been cancelled
Control UI Locale Refresh / Refresh ${{ matrix.locale }} (push) Has been cancelled
Control UI Locale Refresh / Commit control UI locale refresh (push) Has been cancelled
Live Media Runner Image / Build live media runner image (push) Has been cancelled
Native App Locale Refresh / Refresh native ar (push) Has been cancelled
Native App Locale Refresh / Refresh native de (push) Has been cancelled
Native App Locale Refresh / Refresh native es (push) Has been cancelled
Native App Locale Refresh / Refresh native ko (push) Has been cancelled
Native App Locale Refresh / Refresh native nl (push) Has been cancelled
Native App Locale Refresh / Refresh native pl (push) Has been cancelled
Native App Locale Refresh / Refresh native pt-BR (push) Has been cancelled
Native App Locale Refresh / Refresh native ru (push) Has been cancelled
Native App Locale Refresh / Refresh native sv (push) Has been cancelled
Native App Locale Refresh / Refresh native th (push) Has been cancelled
Native App Locale Refresh / Refresh native tr (push) Has been cancelled
Native App Locale Refresh / Refresh native uk (push) Has been cancelled
Native App Locale Refresh / Refresh native vi (push) Has been cancelled
Native App Locale Refresh / Refresh native zh-CN (push) Has been cancelled
Native App Locale Refresh / Refresh native zh-TW (push) Has been cancelled
Native App Locale Refresh / Commit native locale refresh (push) Has been cancelled
Plugin Init Scaffold Validation / Validate provider scaffold (push) Has been cancelled
Plugin NPM Release / preview_plugins_npm (push) Has been cancelled
Plugin NPM Release / Validate release publish approval (push) Has been cancelled
Plugin NPM Release / preview_plugin_pack (push) Has been cancelled
Plugin NPM Release / publish_plugins_npm (push) Has been cancelled
Sandbox Common Smoke / sandbox-common-smoke (push) Has been cancelled
Website Installer Sync / static (push) Has been cancelled
Website Installer Sync / linux-docker (push) Has been cancelled
Website Installer Sync / macos-installer (push) Has been cancelled
Website Installer Sync / windows-installer (push) Has been cancelled
Website Installer Sync / sync-website (push) Has been cancelled

Adolf is a fork/vendored clone of github.com/openclaw/openclaw (v2026.6.11),
free to diverge. Tree copied sans upstream .git; upstream remote added for
future syncs. Node pinned to 24 (.nvmrc); engines already require >=22.19.
Preserves docs/ARCHITECTURE.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LeqyaxJF2nbRXJtae2kNB2
This commit is contained in:
2026-07-05 09:36:54 +00:00
parent 3216769225
commit bedb527145
21108 changed files with 6010766 additions and 0 deletions

View File

@@ -0,0 +1,142 @@
// Telegram plugin module implements reply parameters behavior.
import { GrammyError } from "grammy";
import type { MessageEntity } from "grammy/types";
import { formatErrorMessage } from "openclaw/plugin-sdk/ssrf-runtime";
import { buildTelegramThreadParams, type TelegramThreadSpec } from "./bot/helpers.js";
import { normalizeTelegramReplyToMessageId } from "./outbound-params.js";
const QUOTE_PARAM_RE = /\bquote not found\b|\bQUOTE_TEXT_INVALID\b|\bquote text invalid\b/i;
const GrammyErrorCtor: typeof GrammyError | undefined =
typeof GrammyError === "function" ? GrammyError : undefined;
type TelegramReplyParameters = {
message_id: number;
allow_sending_without_reply: true;
quote?: string;
quote_position?: number;
quote_entities?: MessageEntity[];
};
type TelegramThreadReplyParams = {
message_thread_id?: number;
reply_parameters?: TelegramReplyParameters;
reply_to_message_id?: number;
allow_sending_without_reply?: true;
};
export function resolveTelegramSendThreadSpec(params: {
targetMessageThreadId?: number;
messageThreadId?: number;
chatType?: "direct" | "group" | "unknown";
}): TelegramThreadSpec | undefined {
const messageThreadId =
params.messageThreadId != null ? params.messageThreadId : params.targetMessageThreadId;
if (messageThreadId == null) {
return undefined;
}
// Telegram supports DM topics; keep direct chat thread IDs and let invalid
// topics fail closed instead of sending to the base chat.
return {
id: messageThreadId,
scope: params.chatType === "direct" ? "dm" : "forum",
};
}
export function buildTelegramThreadReplyParams(opts?: {
thread?: TelegramThreadSpec | null;
replyToMessageId?: number;
replyQuoteMessageId?: number;
replyQuoteText?: string;
replyQuotePosition?: number;
replyQuoteEntities?: unknown[];
useReplyIdAsQuoteSource?: boolean;
}): TelegramThreadReplyParams {
const params: TelegramThreadReplyParams = {};
const threadParams = buildTelegramThreadParams(opts?.thread);
if (threadParams) {
params.message_thread_id = threadParams.message_thread_id;
}
const replyToMessageId = normalizeTelegramReplyToMessageId(opts?.replyToMessageId);
if (replyToMessageId == null) {
return params;
}
const defaultQuoteMessageId =
opts?.useReplyIdAsQuoteSource === true ? replyToMessageId : undefined;
const replyQuoteMessageId = normalizeTelegramReplyToMessageId(
opts?.replyQuoteMessageId ?? defaultQuoteMessageId,
);
const replyQuoteTextRaw =
replyQuoteMessageId === replyToMessageId ? opts?.replyQuoteText : undefined;
const replyQuoteText = replyQuoteTextRaw?.trim() ? replyQuoteTextRaw : undefined;
if (!replyQuoteText) {
params.reply_to_message_id = replyToMessageId;
params.allow_sending_without_reply = true;
return params;
}
const replyParameters: TelegramReplyParameters = {
message_id: replyToMessageId,
quote: replyQuoteText,
allow_sending_without_reply: true,
};
if (typeof opts?.replyQuotePosition === "number" && Number.isFinite(opts.replyQuotePosition)) {
replyParameters.quote_position = Math.trunc(opts.replyQuotePosition);
}
if (Array.isArray(opts?.replyQuoteEntities) && opts.replyQuoteEntities.length > 0) {
replyParameters.quote_entities = opts.replyQuoteEntities as MessageEntity[];
}
params.reply_parameters = replyParameters;
return params;
}
export function buildTelegramSendParams(opts?: {
replyToMessageId?: number;
replyQuoteMessageId?: number;
replyQuoteText?: string;
replyQuotePosition?: number;
replyQuoteEntities?: unknown[];
thread?: TelegramThreadSpec | null;
silent?: boolean;
useReplyIdAsQuoteSource?: boolean;
}): Record<string, unknown> {
const params: Record<string, unknown> = { ...buildTelegramThreadReplyParams(opts) };
if (opts?.silent === true) {
params.disable_notification = true;
}
return params;
}
export function getTelegramNativeQuoteReplyMessageId(
params: Record<string, unknown> | undefined,
): number | undefined {
const replyParameters = params?.reply_parameters;
if (!replyParameters || typeof replyParameters !== "object") {
return undefined;
}
const messageId = (replyParameters as { message_id?: unknown }).message_id;
return typeof messageId === "number" && Number.isFinite(messageId) ? messageId : undefined;
}
export function isTelegramQuoteParamError(err: unknown): boolean {
if (GrammyErrorCtor && err instanceof GrammyErrorCtor) {
return QUOTE_PARAM_RE.test(err.description);
}
return QUOTE_PARAM_RE.test(formatErrorMessage(err));
}
export function removeTelegramNativeQuoteParam(
params: Record<string, unknown> | undefined,
): Record<string, unknown> {
if (!params) {
return {};
}
const replyMessageId = getTelegramNativeQuoteReplyMessageId(params);
const { reply_parameters: _ignored, ...rest } = params;
if (replyMessageId != null) {
rest.reply_to_message_id = replyMessageId;
rest.allow_sending_without_reply = true;
}
return rest;
}