
























@@ -3,14 +3,17 @@
33import { spawn } from "node:child_process";
44import { createHash } from "node:crypto";
55import { chmod, copyFile, mkdir, readFile, rm, unlink, writeFile } from "node:fs/promises";
6+import {
7+TELEGRAM_USER_QA_CREDENTIAL_KIND,
8+parseTelegramUserQaCredentialPayload,
9+} from "../../extensions/qa-lab/runtime-api.js";
610711type JsonObject = Record<string, unknown>;
812913const DEFAULT_USER_DRIVER_DIR = "~/.codex/skills/custom/telegram-e2e-bot-to-bot/user-driver";
1014const DEFAULT_BOT_CREDENTIALS_FILE =
1115"~/.codex/skills/custom/telegram-e2e-bot-to-bot/credentials.local.json";
1216const DEFAULT_CONVEX_ENV_FILE = "~/.codex/skills/custom/telegram-e2e-bot-to-bot/convex.local.env";
13-const TELEGRAM_USER_KIND = "telegram-user";
1417const CHUNKED_PAYLOAD_MARKER = "__openclawQaCredentialPayloadChunksV1";
15181619function usage(): never {
@@ -165,7 +168,7 @@ async function tgzBase64(path: string) {
165168166169async function writePrivateJson(path: string, payload: JsonObject) {
167170const expanded = expandHome(path);
168-await mkdir(expanded.substring(0, expanded.lastIndexOf("/")), { recursive: true });
171+await mkdir(expanded.slice(0, expanded.lastIndexOf("/")), { recursive: true });
169172await writeFile(expanded, `${JSON.stringify(payload, null, 2)}\n`, { mode: 0o600 });
170173await chmodPrivate(expanded);
171174}
@@ -325,7 +328,7 @@ async function hydratePayloadFromLease(params: {
325328siteUrl: params.siteUrl,
326329token: params.token,
327330body: {
328-kind: TELEGRAM_USER_KIND,
331+kind: TELEGRAM_USER_QA_CREDENTIAL_KIND,
329332ownerId: params.ownerId,
330333actorRole: "ci",
331334 credentialId,
@@ -339,7 +342,7 @@ async function hydratePayloadFromLease(params: {
339342if (serialized.length !== marker.byteLength) {
340343throw new Error("Chunked payload length mismatch.");
341344}
342-return JSON.parse(serialized) as JsonObject;
345+return parseTelegramUserQaCredentialPayload(JSON.parse(serialized)) as JsonObject;
343346}
344347345348async function createTelegramUserPayload(opts: Map<string, string>) {
@@ -411,7 +414,7 @@ async function createTelegramUserPayload(opts: Map<string, string>) {
411414]);
412415}
413416414-await writePrivateJson(output, {
417+const payload = parseTelegramUserQaCredentialPayload({
415418 groupId,
416419 sutToken,
417420testerUserId: requireString(config, "testerUserId"),
@@ -424,6 +427,7 @@ async function createTelegramUserPayload(opts: Map<string, string>) {
424427desktopTdataArchiveBase64: await tgzBase64(desktopArchive),
425428desktopTdataArchiveSha256: await fileSha256(desktopArchive),
426429});
430+await writePrivateJson(output, payload);
427431} finally {
428432await rm(tempRoot, { force: true, recursive: true });
429433}
@@ -451,7 +455,7 @@ async function restoreTelegramUserPayload(params: {
451455if (!userDriverDir || !desktopWorkdir) {
452456usage();
453457}
454-const payload = params.payload;
458+const payload = parseTelegramUserQaCredentialPayload(params.payload);
455459const tempRoot = `/tmp/openclaw-telegram-user-restore-${Date.now()}-${Math.random()
456460 .toString(16)
457461 .slice(2)}`;
@@ -507,7 +511,7 @@ async function leaseAndRestoreTelegramUser(opts: Map<string, string>) {
507511siteUrl: config.siteUrl,
508512token: config.token,
509513body: {
510-kind: TELEGRAM_USER_KIND,
514+kind: TELEGRAM_USER_QA_CREDENTIAL_KIND,
511515ownerId: config.ownerId,
512516actorRole: "ci",
513517leaseTtlMs: config.leaseTtlMs,
@@ -516,7 +520,7 @@ async function leaseAndRestoreTelegramUser(opts: Map<string, string>) {
516520});
517521const lease = {
518522siteUrl: config.siteUrl,
519-kind: TELEGRAM_USER_KIND,
523+kind: TELEGRAM_USER_QA_CREDENTIAL_KIND,
520524ownerId: config.ownerId,
521525actorRole: "ci",
522526credentialId: requireString(acquired, "credentialId"),
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。