




















@@ -404,6 +404,9 @@ Default endpoint contract (`OPENCLAW_QA_CONVEX_SITE_URL` + `/qa-credentials/v1`)
404404 - Request: `{ kind, ownerId, actorRole, leaseTtlMs, heartbeatIntervalMs }`
405405 - Success: `{ status: "ok", credentialId, leaseToken, payload, leaseTtlMs?, heartbeatIntervalMs? }`
406406 - Exhausted/retryable: `{ status: "error", code: "POOL_EXHAUSTED" | "NO_CREDENTIAL_AVAILABLE", ... }`
407+- `POST /payload-chunk`
408+ - Request: `{ kind, ownerId, actorRole, credentialId, leaseToken, index }`
409+ - Success: `{ status: "ok", index, data }`
407410- `POST /heartbeat`
408411 - Request: `{ kind, ownerId, actorRole, credentialId, leaseToken, leaseTtlMs }`
409412 - Success: `{ status: "ok" }` (or empty `2xx`)
@@ -427,6 +430,46 @@ Payload shape for Telegram kind:
427430- `groupId` must be a numeric Telegram chat id string.
428431- `admin/add` validates this shape for `kind: "telegram"` and rejects malformed payloads.
429432433+Payload shape for Telegram real-user kind:
434+435+- `{ groupId: string, sutToken: string, testerUserId: string, testerUsername: string, telegramApiId: string, telegramApiHash: string, tdlibDatabaseEncryptionKey: string, tdlibArchiveBase64: string, tdlibArchiveSha256: string, desktopTdataArchiveBase64: string, desktopTdataArchiveSha256: string }`
436+- `groupId`, `testerUserId`, and `telegramApiId` must be numeric strings.
437+- `tdlibArchiveSha256` and `desktopTdataArchiveSha256` must be SHA-256 hex strings.
438+- `kind: "telegram-user"` represents one Telegram burner account. Treat the lease as account-wide: the TDLib CLI driver and Telegram Desktop visual witness restore from the same payload, and only one job should hold the lease at a time.
439+440+Telegram real-user lease restore:
441+442+```bash
443+tmp=$(mktemp -d /tmp/openclaw-telegram-user.XXXXXX)
444+node --import tsx scripts/e2e/telegram-user-credential.ts lease-restore \
445+ --user-driver-dir "$tmp/user-driver" \
446+ --desktop-workdir "$tmp/desktop" \
447+ --lease-file "$tmp/lease.json"
448+TELEGRAM_USER_DRIVER_STATE_DIR="$tmp/user-driver" \
449+ uv run ~/.codex/skills/custom/telegram-e2e-bot-to-bot/scripts/user-driver.py status --json
450+node --import tsx scripts/e2e/telegram-user-credential.ts release --lease-file "$tmp/lease.json"
451+```
452+453+Use the restored Desktop profile with `Telegram -workdir "$tmp/desktop"` when a visual recording is needed. In local operator environments, `scripts/e2e/telegram-user-credential.ts` reads `~/.codex/skills/custom/telegram-e2e-bot-to-bot/convex.local.env` by default if process env vars are absent.
454+455+One-command Crabbox proof:
456+457+```bash
458+pnpm qa:telegram-user:crabbox -- --text /status
459+```
460+461+That command leases the `telegram-user` credential, restores the same account
462+into TDLib and Telegram Desktop on a Crabbox Linux desktop, starts a local mock
463+SUT gateway from the current checkout, sends the command as the real QA user,
464+records the visible Telegram Desktop session, trims the recording to the motion
465+window, writes artifacts under `.artifacts/qa-e2e/telegram-user-crabbox/`, then
466+releases the credential and stops the box. Use `--id <cbx_...>` to reuse a warm
467+desktop lease, `--keep-box` to keep VNC open after failure,
468+`--desktop-chat-title <name>` to pick the visible chat, and `--tdlib-url <tgz>`
469+when using a prebaked Linux `libtdjson.so` archive instead of building TDLib on
470+a fresh box. The runner verifies `--tdlib-url` with `--tdlib-sha256 <hex>` or,
471+by default, a sibling `<url>.sha256` file.
472+430473Broker-validated multi-channel payloads:
431474432475- Discord: `{ guildId: string, channelId: string, driverBotToken: string, sutBotToken: string, sutApplicationId: string, voiceChannelId?: string }`
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。