Skip to content

fix: improve 408 timeout handling with socket retry in waitForWebLogin#47710

Closed
xi7ang wants to merge 1 commit into
openclaw:mainfrom
xi7ang:fix/47367-whatsapp-qr-timeout-v2
Closed

fix: improve 408 timeout handling with socket retry in waitForWebLogin#47710
xi7ang wants to merge 1 commit into
openclaw:mainfrom
xi7ang:fix/47367-whatsapp-qr-timeout-v2

Conversation

@xi7ang

@xi7ang xi7ang commented Mar 16, 2026

Copy link
Copy Markdown
Contributor

Summary

This PR improves the WhatsApp QR code fix based on code review feedback.

Review Feedback Applied

  1. Fixed duplicate condition: Removed redundant status === 408 || status === DisconnectReason.timedOut
  2. Added 408 restart handling: Added socket retry logic for 408 timeouts

Changes Made

extensions/whatsapp/src/session.ts

  • Fixed duplicate timeout condition in connection.update handler

extensions/whatsapp/src/login-qr.ts

  • Added 408 timeout handling with socket retry logic

Related Issue: #47367

- Remove duplicate 408/DisconnectReason.timedOut condition
- Add 408 timeout handling with socket restart in login-qr.ts
- Similar to existing 515 (logged out) restart logic
@openclaw-barnacle openclaw-barnacle Bot added channel: whatsapp-web Channel integration: whatsapp-web size: XS labels Mar 16, 2026
@greptile-apps

greptile-apps Bot commented Mar 16, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR adds 408 (WebSocket timeout) handling to the WhatsApp login flow. session.ts gets a new DisconnectReason.timedOut branch that logs the event, and login-qr.ts gets a retry block in waitForWebLogin that tears down the stale socket and creates a fresh one when a 408 is detected.

Key observations:

  • No retry limit on 408 retries: Unlike the 515 restart path (which uses restartAttempted), the new 408 block has no counter or flag. A persistent 408 condition (e.g. prolonged connectivity issues) will cause the loop to spin and create new sockets on every iteration until the 120 s deadline — potentially dozens of rapid socket open/close cycles.
  • Redundant and imprecise condition check: login.errorStatus === 408 || String(login.errorStatus).includes('408') — the string check is never needed since errorStatus is a number, and both forms should use the already-imported DisconnectReason.timedOut constant to stay consistent with the rest of the file.
  • Misleading comment in session.ts: "log and trigger reconnect" — only logging happens in that handler; the reconnect lives in login-qr.ts.

Confidence Score: 3/5

  • Safe to merge for the logging change; the login retry logic needs a guard against runaway retries before it can be considered production-ready.
  • The session.ts change is low-risk (adds a log statement). The login-qr.ts retry logic is functionally useful but lacks a retry ceiling, which could cause resource exhaustion under persistent network faults. The redundant string check is cosmetic but signals the logic wasn't fully thought through.
  • extensions/whatsapp/src/login-qr.ts — specifically the 408 retry block around lines 282-298
Prompt To Fix All With AI
This is a comment left during a code review.
Path: extensions/whatsapp/src/login-qr.ts
Line: 283

Comment:
**Redundant string check and prefer constant over magic number**

`login.errorStatus` is typed as `number | undefined`, so `String(login.errorStatus).includes('408')` is redundant — if `errorStatus` is `408`, the preceding strict equality check already handles it. The string form could also accidentally match status codes like `4080` or `1408`.

Additionally, `DisconnectReason.timedOut` (already imported) equals `408` and is used consistently elsewhere in this codebase (e.g. `session.ts`). Using the named constant makes the intent clearer and avoids a magic number.

```suggestion
      if (login.errorStatus === DisconnectReason.timedOut) {
```

How can I resolve this? If you propose a fix, please make it concise.

---

This is a comment left during a code review.
Path: extensions/whatsapp/src/login-qr.ts
Line: 282-298

Comment:
**No retry limit — potential tight retry loop on persistent 408**

Unlike the 515 restart path which is guarded by `login.restartAttempted`, the 408 retry has no counter or flag. If the WhatsApp server consistently returns 408 (e.g. due to a prolonged network issue or server-side rate limiting), this block will fire on every loop iteration until the `deadline` expires (up to 120 s by default). Each iteration creates a new socket, connects, and gets torn down — potentially dozens of times — which could exhaust file descriptors, flood logs, and hammer the server.

Consider adding a per-login retry counter (similar to `restartAttempted`) to bound the number of 408 retries:

```ts
// in the ActiveLogin type
timeoutRetries: number;   // initialised to 0

// in the 408 block
if (login.timeoutRetries >= 3) {
  // fall through to the generic failure path
} else {
  login.timeoutRetries += 1;
  // existing retry logic…
}
```

How can I resolve this? If you propose a fix, please make it concise.

---

This is a comment left during a code review.
Path: extensions/whatsapp/src/session.ts
Line: 149-152

Comment:
**Misleading comment — reconnect is not triggered here**

The inline comment says `"log and trigger reconnect"` but this handler only logs. The actual reconnect happens in `login-qr.ts`. Leaving the misleading comment risks confusing future maintainers into thinking reconnection is already handled at the socket level when it is not.

```suggestion
          } else if (status === DisconnectReason.timedOut) {
            // 408 timeout — log only; callers (e.g. waitForWebLogin) are responsible for reconnecting
            sessionLogger.error({ status }, 'WhatsApp WebSocket connection timed out');
```

How can I resolve this? If you propose a fix, please make it concise.

Last reviewed commit: 41c12e8

}
}
// Handle 408 timeout - retry with fresh socket
if (login.errorStatus === 408 || String(login.errorStatus).includes('408')) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Redundant string check and prefer constant over magic number

login.errorStatus is typed as number | undefined, so String(login.errorStatus).includes('408') is redundant — if errorStatus is 408, the preceding strict equality check already handles it. The string form could also accidentally match status codes like 4080 or 1408.

Additionally, DisconnectReason.timedOut (already imported) equals 408 and is used consistently elsewhere in this codebase (e.g. session.ts). Using the named constant makes the intent clearer and avoids a magic number.

Suggested change
if (login.errorStatus === 408 || String(login.errorStatus).includes('408')) {
if (login.errorStatus === DisconnectReason.timedOut) {
Prompt To Fix With AI
This is a comment left during a code review.
Path: extensions/whatsapp/src/login-qr.ts
Line: 283

Comment:
**Redundant string check and prefer constant over magic number**

`login.errorStatus` is typed as `number | undefined`, so `String(login.errorStatus).includes('408')` is redundant — if `errorStatus` is `408`, the preceding strict equality check already handles it. The string form could also accidentally match status codes like `4080` or `1408`.

Additionally, `DisconnectReason.timedOut` (already imported) equals `408` and is used consistently elsewhere in this codebase (e.g. `session.ts`). Using the named constant makes the intent clearer and avoids a magic number.

```suggestion
      if (login.errorStatus === DisconnectReason.timedOut) {
```

How can I resolve this? If you propose a fix, please make it concise.

Comment on lines +282 to +298
// Handle 408 timeout - retry with fresh socket
if (login.errorStatus === 408 || String(login.errorStatus).includes('408')) {
runtime.log(info('WhatsApp login timed out (408), retrying with new socket...'));
closeSocket(login.sock);
try {
login.sock = await createWaSocket(false, login.verbose, {
authDir: login.authDir,
});
login.error = undefined;
login.errorStatus = undefined;
login.restartAttempted = false;
attachLoginWaiter(account.accountId, login);
continue;
} catch (err) {
runtime.log(danger(`Failed to retry after 408: ${err}`));
}
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No retry limit — potential tight retry loop on persistent 408

Unlike the 515 restart path which is guarded by login.restartAttempted, the 408 retry has no counter or flag. If the WhatsApp server consistently returns 408 (e.g. due to a prolonged network issue or server-side rate limiting), this block will fire on every loop iteration until the deadline expires (up to 120 s by default). Each iteration creates a new socket, connects, and gets torn down — potentially dozens of times — which could exhaust file descriptors, flood logs, and hammer the server.

Consider adding a per-login retry counter (similar to restartAttempted) to bound the number of 408 retries:

// in the ActiveLogin type
timeoutRetries: number;   // initialised to 0

// in the 408 block
if (login.timeoutRetries >= 3) {
  // fall through to the generic failure path
} else {
  login.timeoutRetries += 1;
  // existing retry logic…
}
Prompt To Fix With AI
This is a comment left during a code review.
Path: extensions/whatsapp/src/login-qr.ts
Line: 282-298

Comment:
**No retry limit — potential tight retry loop on persistent 408**

Unlike the 515 restart path which is guarded by `login.restartAttempted`, the 408 retry has no counter or flag. If the WhatsApp server consistently returns 408 (e.g. due to a prolonged network issue or server-side rate limiting), this block will fire on every loop iteration until the `deadline` expires (up to 120 s by default). Each iteration creates a new socket, connects, and gets torn down — potentially dozens of times — which could exhaust file descriptors, flood logs, and hammer the server.

Consider adding a per-login retry counter (similar to `restartAttempted`) to bound the number of 408 retries:

```ts
// in the ActiveLogin type
timeoutRetries: number;   // initialised to 0

// in the 408 block
if (login.timeoutRetries >= 3) {
  // fall through to the generic failure path
} else {
  login.timeoutRetries += 1;
  // existing retry logic…
}
```

How can I resolve this? If you propose a fix, please make it concise.

Comment on lines +149 to 152
} else if (status === DisconnectReason.timedOut) {
// Handle 408 timeout - log and trigger reconnect
sessionLogger.error({ status }, 'WhatsApp WebSocket connection timed out');
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Misleading comment — reconnect is not triggered here

The inline comment says "log and trigger reconnect" but this handler only logs. The actual reconnect happens in login-qr.ts. Leaving the misleading comment risks confusing future maintainers into thinking reconnection is already handled at the socket level when it is not.

Suggested change
} else if (status === DisconnectReason.timedOut) {
// Handle 408 timeout - log and trigger reconnect
sessionLogger.error({ status }, 'WhatsApp WebSocket connection timed out');
}
} else if (status === DisconnectReason.timedOut) {
// 408 timeout — log only; callers (e.g. waitForWebLogin) are responsible for reconnecting
sessionLogger.error({ status }, 'WhatsApp WebSocket connection timed out');
Prompt To Fix With AI
This is a comment left during a code review.
Path: extensions/whatsapp/src/session.ts
Line: 149-152

Comment:
**Misleading comment — reconnect is not triggered here**

The inline comment says `"log and trigger reconnect"` but this handler only logs. The actual reconnect happens in `login-qr.ts`. Leaving the misleading comment risks confusing future maintainers into thinking reconnection is already handled at the socket level when it is not.

```suggestion
          } else if (status === DisconnectReason.timedOut) {
            // 408 timeout — log only; callers (e.g. waitForWebLogin) are responsible for reconnecting
            sessionLogger.error({ status }, 'WhatsApp WebSocket connection timed out');
```

How can I resolve this? If you propose a fix, please make it concise.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 41c12e84a5

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment on lines +287 to +289
login.sock = await createWaSocket(false, login.verbose, {
authDir: login.authDir,
});

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Preserve QR callback when recreating socket after 408

In waitForWebLogin, the 408 retry path recreates the socket without passing an onQr handler, so any new QR emitted after the timeout is never stored back into the active login state. When the original QR has expired (the common 408 case), callers can only keep seeing the stale qrDataUrl from the first attempt, which leaves users unable to scan the fresh code and the login flow stalls until they manually restart from scratch.

Useful? React with 👍 / 👎.

xuwei-xy pushed a commit to xuwei-xy/openclaw that referenced this pull request Mar 16, 2026
- openclaw#47710 fix: improve 408 timeout handling with socket retry in waitForWebLogin
@openclaw-barnacle

Copy link
Copy Markdown

This pull request has been automatically marked as stale due to inactivity.
Please add updates or it will be closed.

@openclaw-barnacle openclaw-barnacle Bot added the stale Marked as stale due to inactivity label Apr 29, 2026
@clawsweeper

clawsweeper Bot commented Apr 29, 2026

Copy link
Copy Markdown
Contributor

Thanks for the context here. I swept through the related work, and this is now duplicate or superseded.

Keep open, but this PR is not merge-ready. Current main still lacks a bounded WhatsApp QR-login 408 retry, while this branch retries in the wrong layer, drops the shared QR/timing socket contract, can churn sockets on persistent 408s, conflicts with main, and has no after-fix real WhatsApp proof.

Canonical path: Close this stale PR. The latest review rated it F, the branch still lacks merge-ready proof, and there has been no human follow-up after the durable review.

So I’m closing this here because the remaining work is already tracked in the canonical issue.

Review details

Best possible solution:

Close this stale PR. The latest review rated it F, the branch still lacks merge-ready proof, and there has been no human follow-up after the durable review.

Do we have a high-confidence way to reproduce the issue?

Yes, source-level: mock waitForWaConnection to reject with a Boom-style 408 during QR login. Current main records that status as failed and reports it instead of retrying; no live WhatsApp device run was performed.

Is this the best way to solve the issue?

No. The fix idea is valid, but the PR retries too late in waitForWebLogin and recreates the socket without the shared waiter callback/timing contract; the maintainable fix belongs in waitForWhatsAppLoginResult.

Security review:

Security review cleared: The diff only changes WhatsApp socket retry/logging code and does not touch dependencies, workflows, package resolution, scripts, or secret handling.

What I checked:

  • stale F-rated PR: PR was opened 2026-03-16T00:37:35Z, is older than 60 days, and the latest review rated it F.
  • proof blocker: real behavior proof is missing and proof tier is F, so this branch is not merge-ready without contributor follow-up.
  • no human follow-up: live comments and timeline hydrated by apply contain no non-automation activity after the ClawSweeper review.

Likely related people:

  • mcaxtr: Commit aa023e428306 centralized the WhatsApp account connection lifecycle and introduced the shared waiter boundary that a 408 QR-login retry should extend. (role: connection lifecycle refactor contributor; confidence: high; commits: aa023e428306; files: extensions/whatsapp/src/connection-controller.ts, extensions/whatsapp/src/login-qr.ts, extensions/whatsapp/src/login.ts)
  • asyncjason: Merged PR history for 9d3e653ec9d2 established the current 515 QR-pairing restart behavior and coverage adjacent to the requested 408 handling. (role: adjacent QR restart contributor; confidence: high; commits: 9d3e653ec9d2; files: extensions/whatsapp/src/login-qr.ts, extensions/whatsapp/src/login.ts, extensions/whatsapp/src/session.ts)
  • Radek Sienkiewicz: Commit dd643c82b55e added the WhatsApp socket timing options that replacement sockets need to preserve across retries. (role: socket timing contributor; confidence: medium; commits: dd643c82b55e; files: extensions/whatsapp/src/socket-timing.ts, extensions/whatsapp/src/session.ts, extensions/whatsapp/src/login-qr.ts)
  • vincentkoc: Recent merged WhatsApp reliability work touched adjacent auth cleanup, reconnect, and post-408 listener recovery while keeping QR-timeout retry separate. (role: recent reconnect lifecycle contributor; confidence: medium; commits: 7950a1802510, 21a92ea0f636; files: extensions/whatsapp/src/auth-store.ts, extensions/whatsapp/src/auto-reply/monitor.ts, extensions/whatsapp/src/connection-controller.ts)

Codex review notes: model gpt-5.5, reasoning high; reviewed against 6981051682f2.

@clawsweeper

clawsweeper Bot commented Apr 29, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs changes before merge.

What this changes:

The PR adds WhatsApp Web QR-login handling that closes and recreates the socket after a 408 timeout in waitForWebLogin, plus a 408 timeout log branch in the WhatsApp session socket handler.

Required change before merge:

This is a concrete replacement/update candidate: current main still treats QR-login 408 as terminal, the source PR has specific fixable defects, and the likely files plus validation path are narrow.

Review findings:

  • [P1] Preserve QR callbacks on 408 socket retries — extensions/whatsapp/src/login-qr.ts:287-289
  • [P2] Bound repeated 408 socket recreation — extensions/whatsapp/src/login-qr.ts:283-298
Review details

Best possible solution:

Port the idea into the current shared WhatsApp login waiter as a bounded 408/timedOut socket-restart path that preserves authDir, isLegacyAuthDir, socketTiming, onQr, and onSocketReplaced, with tests for retry success, retry exhaustion, QR refresh preservation, and unchanged 401/515 behavior.

Full review comments:

  • [P1] Preserve QR callbacks on 408 socket retries — extensions/whatsapp/src/login-qr.ts:287-289
    The retry creates the replacement socket with only authDir. createWaSocket captures onQr when the socket is constructed, so a fresh QR emitted by the replacement socket is not written back to the active login state; users can keep seeing the expired QR after the 408. Reuse the shared restart path or pass the same QR/timing callbacks when recreating the socket.
    Confidence: 0.91
  • [P2] Bound repeated 408 socket recreation — extensions/whatsapp/src/login-qr.ts:283-298
    A persistent 408 re-enters this branch each time the new waiter fails until the outer wait deadline, repeatedly closing and opening sockets without a per-login cap. Track a bounded retry count, or handle 408 in the shared waiter with an explicit maximum, so network faults do not churn sockets and logs for the full wait window.
    Confidence: 0.86

Overall correctness: patch is incorrect
Overall confidence: 0.88

Acceptance criteria:

  • pnpm test extensions/whatsapp/src/login-qr.test.ts extensions/whatsapp/src/connection-controller.test.ts extensions/whatsapp/src/session.test.ts
  • pnpm exec oxfmt --check --threads=1 extensions/whatsapp/src/login-qr.ts extensions/whatsapp/src/login-qr.test.ts extensions/whatsapp/src/connection-controller.ts extensions/whatsapp/src/connection-controller.test.ts extensions/whatsapp/src/session.ts extensions/whatsapp/src/session.test.ts CHANGELOG.md
  • pnpm check:changed

What I checked:

  • Current main terminal 408 path: waitForWebLogin only special-cases logged-out status 401; any other login.error, including a 408 reported by the waiter, resets the active login and returns a terminal failure. (extensions/whatsapp/src/login-qr.ts:477, e46dccb35374)
  • Shared waiter is 515-only for socket restart: waitForWhatsAppLoginResult recreates the socket only for statusCode === 515 && !restarted; after the 401 logged-out branch, all other statuses return outcome: "failed". (extensions/whatsapp/src/connection-controller.ts:197, e46dccb35374)
  • Existing restart contract preserves callback/timing state: The current 515 restart path passes authDir, socketTiming, and onQr into createWaSocket, then calls onSocketReplaced so active-login state tracks the replacement socket. (extensions/whatsapp/src/connection-controller.ts:202, e46dccb35374)
  • Active login depends on the shared callback contract: attachLoginWaiter wires onQr to update rendered QR state and onSocketReplaced to clear error state on replacement; a replacement socket must preserve these callbacks for QR refreshes after a timeout. (extensions/whatsapp/src/login-qr.ts:176, e46dccb35374)
  • Test coverage gap: Focused QR-login tests cover the 515 restart completion path, while nearby 408 coverage only checks Boom-like error formatting; there is no current regression test for bounded 408 retry or retry exhaustion. (extensions/whatsapp/src/login-qr.test.ts:104, e46dccb35374)
  • Docs and changelog show adjacent mitigations only: WhatsApp docs advise proxy and socket-timing tuning for 408 failures, and the changelog records socket timing and post-408 listener recovery, but not bounded QR-login retry handling. Public docs: docs/channels/whatsapp.md. (docs/channels/whatsapp.md:546, e46dccb35374)

Likely related people:

  • steipete: Local shallow blame for the central WhatsApp login/controller files resolves through the current-main snapshot, and the latest available local commits are maintainer-owned; useful route for final product judgment despite limited local history depth. (role: current maintainer / current-main provenance; confidence: medium; commits: 34d11d57579d, 2d53b49b20e1; files: extensions/whatsapp/src/login-qr.ts, extensions/whatsapp/src/connection-controller.ts, extensions/whatsapp/src/session.ts)
  • asyncjason: Merged PR fix(web): handle 515 Stream Error during WhatsApp QR pairing #27910 / commit 9fecd87 established the current 515 QR-pairing restart behavior and regression coverage that a 408 retry should extend without breaking. (role: introduced adjacent QR-login restart behavior; confidence: medium; commits: 9fecd87b2bca; files: extensions/whatsapp/src/login-qr.ts, extensions/whatsapp/src/login.ts, extensions/whatsapp/src/session.ts)
  • vincentkoc: Recent merged WhatsApp reliability work around auth cleanup and reconnect/group recovery is adjacent, and those PRs explicitly kept the QR timeout retry separate. (role: recent adjacent WhatsApp reliability maintainer; confidence: medium; commits: bf39d3d99964, 8d428d745a0c; files: extensions/whatsapp/src/auth-store.ts, extensions/whatsapp/src/logout.test.ts, extensions/whatsapp/src/monitor-inbox.streams-inbound-messages.test-support.ts)

Remaining risk / open question:

  • The explicit 408 QR-timeout symptom may overlap with proxy/connectivity tuning or the separate sendUnifiedSession handshake work in fix(whatsapp): patch Baileys QR auth handshake for sendUnifiedSession #74349, so the fix should stay scoped to observable 408 opening-handshake failures and keep that handshake path separate.
  • No live WhatsApp device pairing was run during this read-only review; the verdict is based on current source, tests, docs, dependency contract, and provided PR/issue context.

Codex review notes: model gpt-5.5, reasoning high; reviewed against e46dccb35374.

@openclaw-barnacle openclaw-barnacle Bot removed the stale Marked as stale due to inactivity label Apr 30, 2026
@clawsweeper clawsweeper Bot added the P1 High-priority user-facing bug, regression, or broken workflow. label May 16, 2026
@openclaw-barnacle openclaw-barnacle Bot added the triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. label May 16, 2026
@clawsweeper clawsweeper Bot added impact:auth-provider Auth, provider routing, model choice, or SecretRef resolution may break. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. merge-risk: 🚨 auth-provider 🚨 May break OAuth, tokens, provider routing, model choice, or credentials. merge-risk: 🚨 availability 🚨 May cause crashes, hangs, restart loops, stalls, or process outages. and removed impact:auth-provider Auth, provider routing, model choice, or SecretRef resolution may break. labels May 17, 2026
@clawsweeper

clawsweeper Bot commented May 19, 2026

Copy link
Copy Markdown
Contributor

ClawSweeper PR egg

🎁 Pass real behavior proof to wake the egg and unlock a hatchable treat.

Where did the egg go?
  • The egg game starts only after the PR passes the real-behavior proof check.
  • Before that, no creature or rarity is rolled. The treat waits for real proof.
  • This is still just collectible flavor: proof affects review readiness, not creature quality.

@mcaxtr

mcaxtr commented May 30, 2026

Copy link
Copy Markdown
Member

Thanks for working on this. I’m closing this PR as superseded by #88183.

The behavior claim is valid: current main can treat a WhatsApp QR-login 408 opening-handshake timeout as a terminal failure before a scannable QR is shown. The replacement PR keeps the fix in the shared WhatsApp login waiter instead of the QR polling layer, preserves the existing socket timing and QR callback contract, bounds repeated 408 recovery, and keeps the existing 515 post-pairing restart available after a 408 recovery.

Validation for the replacement:

node scripts/run-vitest.mjs extensions/whatsapp/src/connection-controller.test.ts extensions/whatsapp/src/login-qr.test.ts
pnpm tsgo:extensions:test
pnpm exec oxfmt --check --threads=1 extensions/whatsapp/src/connection-controller.ts extensions/whatsapp/src/connection-controller.test.ts extensions/whatsapp/src/login-qr.ts extensions/whatsapp/src/login-qr.test.ts
git diff --check HEAD~1..HEAD
.agents/skills/autoreview/scripts/autoreview --mode local

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

channel: whatsapp-web Channel integration: whatsapp-web merge-risk: 🚨 auth-provider 🚨 May break OAuth, tokens, provider routing, model choice, or credentials. merge-risk: 🚨 availability 🚨 May cause crashes, hangs, restart loops, stalls, or process outages. P1 High-priority user-facing bug, regression, or broken workflow. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. size: XS status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants