Commit Graph

2899 Commits

Author SHA1 Message Date
Ahmed Alwahib ffc019fb51 fix: align noise-handler buffer types for Baileys build (#2284)
* fix: align noise-handler buffer types for Baileys build

* Align noise handler buffer types

* Clarify noise handler buffer typing
2026-01-25 01:52:36 +02:00
Matheus Filype d514764686 feat: send unified session (#2294)
* fix: improve message resend logic by adding checks for message IDs

* Revert "fix: improve message resend logic by adding checks for message IDs"

This reverts commit c03f9d8e6fc6cbfbb9d1f8f67c169700e704213d.

* feat: add unified session handling and time constants

* refactor: improve socket variable destructuring and presence update logic

* fix: remove unnecessary semicolons in socket and time constants definitions

* fix: handle invalid server time offset parsing in makeSocket function
2026-01-25 01:51:47 +02:00
Renato Alcara f76bfbc0df fix(unified-session): resolve circular dependency with TimeMs
fix(unified-session): resolve circular dependency with TimeMs
2026-01-24 17:46:01 -03:00
Claude 7cb1df6d95 fix(unified-session): resolve circular dependency with TimeMs
The import of TimeMs from Defaults/index.ts caused a circular
dependency error in ESM:
"ReferenceError: Cannot access 'TimeMs' before initialization"

Solution: Define TimeMs constants locally in unified-session.ts
instead of importing from Defaults. This avoids the ESM module
initialization order issue.
2026-01-24 20:42:32 +00:00
Renato Alcara 49711891d0 fix: add isJidUser alias for compatibility
fix: add isJidUser alias for compatibility
2026-01-24 17:37:13 -03:00
Claude 6f9fd27321 fix: add isJidUser alias for zpro.io compatibility
Adds backward compatibility alias:
- isJidUser -> isPersonJid

This allows zpro.io and other consumers that depend on the old
isJidUser function name to continue working without changes.
2026-01-24 20:31:49 +00:00
Renato Alcara 050aea38c1 feat(telemetry): add unified_session to reduce unofficial client detection
feat(telemetry): add unified_session to reduce unofficial client detection
2026-01-24 17:24:11 -03:00
Claude d132e1cfd8 fix: address code review feedback (batch 2)
1. Add logger to writeCacheFile (version-cache.ts)
   - Now logs warnings when file write fails
   - Helps debugging in production environments

2. Sanitize logging in parseGroupResult (communities.ts)
   - Changed from info to debug level
   - Removed full node/groupNode dumps (sensitive data)
   - Now only logs nodeTag and groupId

3. Add input validation in parseNewsletterCreateResponse (newsletter.ts)
   - Validates response structure before destructuring
   - Adds fallback values for parseInt (prevents NaN)
   - Adds null checks for optional fields

4. Add health-status.ts module
   - getHealthStatus(): Full health check with circuit breakers, cache, memory
   - isHealthy(): Simple boolean for liveness probes
   - getSimpleHealthStatus(): Returns 'ok', 'degraded', or 'error'
   - Useful for k8s probes and monitoring dashboards
2026-01-24 20:04:53 +00:00
Claude 22eda03eb2 fix(unified-session): address code review feedback
Fixes 3 issues identified in code review:

1. ENV VAR PRECEDENCE: Changed DEFAULT_CONNECTION_CONFIG to use
   undefined for enableUnifiedSession, allowing env var
   BAILEYS_UNIFIED_SESSION_ENABLED to take precedence.
   Priority is now: explicit config > env var > default (true)

2. SINGLE INITIALIZATION: UnifiedSessionManager is now created
   only once, after sendNode is defined. This avoids:
   - Duplicate circuit breaker instances
   - State reinitialization
   - Unnecessary overhead and logs

3. CONTINUOUS TIME SYNC: serverTimeOffset is now updated on
   every received frame that contains a 't' attribute, not just
   on CB:success. This keeps the offset accurate even during
   long-running connections.
2026-01-24 19:14:02 +00:00
Claude 9f17567951 feat(telemetry): add unified_session telemetry to reduce detection
Implements WhatsApp's unified_session telemetry feature to reduce
detection of unofficial clients. This is an enterprise-grade implementation
inspired by whatsmeow PR #1057 and Baileys PR #2294.

Features:
- UnifiedSessionManager class with circuit breaker protection
- Server time synchronization for accurate session IDs
- Rate limiting to prevent spam (1 minute between sends)
- Prometheus metrics integration (unified_session_sent, errors)
- Structured logging for debugging
- Configurable via SocketConfig.enableUnifiedSession
- Environment variable support (BAILEYS_UNIFIED_SESSION_ENABLED)

Trigger points (matching official WhatsApp Web):
- After successful login (CB:success)
- After successful pairing (CB:iq,,pair-success)
- When sending 'available' presence

Implementation details:
- Session ID algorithm: (now + serverOffset + 3days) % 7days
- Time constants exported from Defaults/index.ts
- Full test coverage (31 tests)

References:
- https://github.com/tulir/whatsmeow/pull/1057
- https://github.com/WhiskeySockets/Baileys/pull/2294
- https://github.com/tulir/whatsmeow/issues/810
2026-01-24 18:56:08 +00:00
Renato Alcara a55055e55e fix(album): resolve TypeScript strict array access errors
fix(album): resolve TypeScript strict array access errors
2026-01-23 15:50:46 -03:00
Renato Alcara d95b2236c0 fix(album): resolve TypeScript strict array access errors
Fix TS2345 errors where array element access (medias[i]) was inferred as
`AlbumMediaItem | undefined` instead of `AlbumMediaItem`.

Changes:
- Add non-null assertion (!) after array access in for loops
- Add explicit cast to AnyMessageContent for hasNonNullishProperty calls

The non-null assertion is safe here because we iterate with `i < medias.length`,
guaranteeing the index is valid.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 15:48:09 -03:00
Renato Alcara 3345fc0225 feat(album): add album message sending with intelligent retry and ada…
feat(album): add album message sending with intelligent retry and ada…
2026-01-23 15:43:56 -03:00
Renato Alcara 688739239a fix(album): improve validation consistency and result clarity
Addresses additional PR review suggestions:

1. **Consistent media type validation**
   - Changed from `'image' in m` to `hasNonNullishProperty(m, 'image')`
   - Aligns with validation in generateWAMessageContent
   - Prevents counting items with undefined image/video properties

2. **Explicit interrupted send indication**
   - Added `attemptedItems: number` - how many items were actually tried
   - Added `stoppedEarly: boolean` - true if interrupted by continueOnFailure=false
   - Updated `success` to be false if stoppedEarly (even if no failures in attempted items)
   - Helps automated integrations understand partial sends

Example result when interrupted:
```json
{
  "totalItems": 5,
  "attemptedItems": 3,
  "successCount": 2,
  "failedCount": 1,
  "stoppedEarly": true,
  "success": false
}
```

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 15:33:46 -03:00
Renato Alcara 54549c4fc1 fix(album): address code review feedback
Fixes all issues identified in PR #44 review:

1. **Album root message now relayed to server** (Critical)
   - Before: Only generated root message, never sent it
   - After: Calls relayMessage() on albumRootMsg before sending media items
   - Also emits own event if emitOwnEvents is enabled

2. **Fixed messageId collision**
   - Before: Spread ...options could pass same messageId to all items
   - After: Explicitly pass only safe options (timestamp, quoted, etc.)
   - Each media item now gets a fresh ID from generateWAMessage

3. **Fixed proto structure for album association**
   - Before: Used non-existent messageContextInfo.messageAddOnType
   - After: Uses correct messageContextInfo.messageAssociation with:
     - associationType: proto.MessageAssociation.AssociationType.MEDIA_ALBUM
     - parentMessageKey: albumKey

4. **Added runtime error for sendMessage misuse**
   - sendMessage() now throws clear error if called with { album: ... }
   - Forces users to use sendAlbumMessage() for proper behavior

5. **Fixed documentation**
   - delay: Changed "based on media size" to "based on media type"
   - retryAttempts: Clarified it's "total attempts" not just retries

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 15:09:31 -03:00
Renato Alcara 6e0694e72a feat(album): add album message sending with intelligent retry and adaptive delay
Implements WhatsApp album messages (grouped media) with the following features:

- Send 2-10 images/videos grouped as a single album message
- Adaptive delay between sends based on media type (videos get 2x delay)
- Intelligent retry with exponential backoff for failed items
- parentMessageKey reference to album root (as suggested by maintainer)
- Complete result structure with success/failure tracking per item
- Validation for min (2) and max (10) media items

Types added:
- AlbumMediaItem: Single image/video with caption, mentions, dimensions
- AlbumMessageOptions: Configuration for delay, retry, continueOnFailure
- AlbumMediaResult: Per-item result with latency and retry attempts
- AlbumSendResult: Complete result with albumKey and statistics

Based on PR #2058 from WhiskeySockets/Baileys with improvements.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 14:41:19 -03:00
Renato Alcara 32d8b57605 Merge pull request #43
refactor(ctwa): use messageRetryManager for placeholder resend schedu…
2026-01-23 10:43:33 -03:00
Claude dc899faa11 fix(ctwa): address code review feedback from Copilot
- Update outdated file reference in comment (process-message.ts:399-421
  -> PDO response handler in src/Utils/process-message.ts)
- Add missing else branch in fallback path for duplicate request logging
  to maintain observability parity with scheduled path
- Clarify log message in fallback path to reflect direct request flow
  ('Message received before direct resend request completed')

https://claude.ai/code/session_011WM4Nb6tE1S5nLjHen8Xsi
2026-01-23 13:39:56 +00:00
Claude 65768bc70c refactor(ctwa): use messageRetryManager for placeholder resend scheduling
Aligns CTWA recovery with upstream philosophy by using messageRetryManager
instead of direct requestPlaceholderResend calls.

Benefits:
- Uses 3-second delay from manager (avoids request spam)
- Enables automatic cancellation if message arrives before request
- Centralizes phone request logic in messageRetryManager
- Adds fallback for when manager is not available

Changes:
- Wrap requestPlaceholderResend in messageRetryManager.schedulePhoneRequest()
- Add new metric status 'scheduled' for tracking scheduled requests
- Add metric status 'sent' when request is actually sent after delay
- Keep direct call as fallback when messageRetryManager is null

https://claude.ai/code/session_011WM4Nb6tE1S5nLjHen8Xsi
2026-01-23 13:17:32 +00:00
Renato Alcara 87ed383ba4 fix(messages): reorganize interactive message processing to execute correctly
Critical bug fix: Interactive message blocks were never being executed because
they were placed AFTER the normal text message processing block. Messages with
text+buttons were processed as plain text, ignoring the interactive features.

Changes:
- Move all interactive message processing (buttons, lists, templates, carousel)
  to BEFORE the normal text processing block
- Remove duplicate interactive message blocks that were unreachable
- Ensure correct execution order: check for interactive features first, then
  fallback to normal text processing

This fixes the runtime error where interactive message functions were not
being called properly when sending messages with buttons/lists.

Structure now:
1. Check text + buttons → buttonsMessage
2. Check text + templateButtons → templateMessage
3. Check sections → listMessage
4. Check carousel → interactiveMessage
5. Check text (normal) → extendedTextMessage
6. Other message types...

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-23 01:23:24 -03:00
Renato Alcara b48dbd7038 fix(types): resolve TypeScript compilation errors in interactive messages
Fixes type incompatibility error when processing buttons with media:
- Extract only media properties before passing to prepareWAMessageMedia
- Remove problematic interactiveMessage type from AnyRegularMessageContent
- Move Carouselable to text message type as Partial

This resolves the compilation error:
  error TS2345: Argument of type '...' is not assignable to parameter
  of type 'AnyMediaMessageContent'

Changes:
- src/Utils/messages.ts: Extract media content explicitly for type safety
- src/Types/Message.ts: Simplify type definitions, add Carouselable to text messages

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-23 01:14:58 -03:00
Renato Alcara 90db2512d9 feat(experimental): add interactive messages support (buttons, lists, templates, carousel)
⚠️ EXPERIMENTAL FEATURE - Use only for testing with disposable accounts

Implements full support for WhatsApp interactive messages including:
- Simple text buttons (up to 3 buttons)
- Buttons with images/videos
- List messages (up to 10 items in sections)
- Template buttons (quick reply, URL, call actions)
- Carousel messages (up to 10 scrollable cards)

Features:
- Feature flag 'enableInteractiveMessages' (default: true for dev/testing)
- Prometheus metrics for tracking sends, successes, failures, and latency
- Comprehensive TypeScript types for all interactive message formats
- Extensive logging with warnings about potential account bans
- Automatic 'biz' node injection when feature is enabled

CRITICAL WARNINGS:
- These features may NOT work on non-business WhatsApp accounts
- Can cause temporary or permanent account BANS
- WhatsApp actively blocks this functionality since April 2022
- Messages may be rejected or fail silently
- Use ONLY in dev environment with test accounts

Architecture:
- Added ButtonInfo, Templatable, Listable, Carouselable types to Message.ts
- Extended AnyMediaMessageContent and AnyRegularMessageContent
- Implemented message generation in messages.ts
- Added getButtonType() and getButtonArgs() helpers in messages-send.ts
- Injected 'biz' node in stanza construction with metrics tracking
- Added 4 new Prometheus metrics: interactiveMessagesSent, Success, Failures, Latency

Documentation:
- Complete usage guide in INTERACTIVE_MESSAGES.md
- Examples for all interactive message types
- Metrics monitoring queries
- Troubleshooting guide
- Migration path to WhatsApp Business API

Related issues:
- https://github.com/WhiskeySockets/Baileys/issues/56
- https://github.com/WhiskeySockets/Baileys/issues/25
- https://github.com/WhiskeySockets/Baileys/pull/2291

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-23 00:51:33 -03:00
Renato Alcara fe2563d509 fix baileys install
fix baileys install
2026-01-22 20:57:26 -03:00
Claude 1ffaec663d fix(types): remove duplicate enableCTWARecovery declaration in SocketConfig
The property was declared twice in SocketConfig type:
- Line 134 as required boolean
- Line 211 as optional boolean

This caused TypeScript compilation errors:
- TS2300: Duplicate identifier
- TS2687: Mismatched modifiers
- TS2717: Type mismatch between required and optional

Removed the duplicate declaration, keeping the first one which is
already properly documented and has the correct type.
2026-01-22 23:55:59 +00:00
Renato Alcara 7ec7e2c430 fix(messages-recv): add age validation for CTWA placeholder resend requests
Prevents unnecessary placeholder resend requests for messages older than 7 days,
improving resource efficiency and aligning with upstream best practices. Adds
metrics tracking for rejected old messages and includes message age in logs.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-22 20:07:11 -03:00
Renato Alcara b205a43eab fix: align noise-handler buffer types for TypeScript
fix: align noise-handler buffer types for TypeScript
2026-01-22 17:55:16 -03:00
Claude 7d2a1fc540 fix: align noise-handler buffer types for TypeScript 5.x compatibility
- Add explicit Buffer type annotations to salt, encKey, decKey variables
- Add Promise<[Buffer, Buffer]> return type to localHKDF function
- Add Buffer type casts for subarray return values
- Remove unnecessary non-null assertion operators (!)

Fixes TS2322 type mismatch errors when building with TypeScript 5.9.3+
and Node.js v24+. No runtime behavior changes.

Based on upstream PR #2284.
2026-01-22 20:51:43 +00:00
Renato Alcara 1171db5924 fix(example): correct logger parameter order and fix wrong event
fix(example): correct logger parameter order and fix wrong event
2026-01-22 17:45:51 -03:00
Claude 3d4ba16dc5 fix(example): correct logger parameter order and fix wrong event
Address PR #38 review comments:
- Fix contacts.upsert logging wrong event (was message-receipt.update)
- Fix chats.delete logger params order (object, message)
- Fix group.member-tag.update params order and remove redundant JSON.stringify

Follows pino logger convention: logger.method(object, message)
2026-01-22 20:42:34 +00:00
Renato Alcara 561a9a8e28 merge upstream
merge upstream
2026-01-22 17:31:26 -03:00
Claude 1a1fc9daff chore: mark upstream commits as integrated
Merge upstream/master using 'ours' strategy to mark the following
commits as integrated (already cherry-picked with customizations):

- chat-utils,sync-action-utils: provide alternatives for the contact name
- example: revamp logging for example
- defaults, index: change shouldSyncHistoryMessage behavior
- history: fortify contact data
- history: add proper logging support in history
- example: cleanup
- socket: no sync warning!!!!!
- Fix connection showing "Online" but disconnected (#2132)
- fix: skip retry for expired status messages over 24 hours old
- fix: optimize getLIDsForPNs and add getPNsForLIDs (#2274)
- fix: extract LID-PN mappings from conversation objects in history sync

Our customizations are preserved. This zeros the "behind" counter.
2026-01-22 20:28:19 +00:00
Claude b288c41d11 Merge branch 'claude/feat-identity-change-handler-eQVNg' 2026-01-22 20:28:03 +00:00
Claude fe9a3166a8 chat-utils: add fallbacks for contact name extraction
Apply consistent fallback pattern for contact names:
- chat-utils.ts: fullName || firstName || username for lidContactAction
- sync-action-utils.ts: fullName || firstName || username for processContactAction

Ensures contact names are extracted regardless of which field WhatsApp populates.
2026-01-22 20:11:20 +00:00
Claude b69f6c6b6b example: use structured logging instead of console.log
Refactor example.ts to use pino logger with structured data:
- Replace all console.log with logger.debug/fatal
- Use objects for data instead of string concatenation
- Add contacts.upsert event handler
- Improves log filtering and searchability
2026-01-22 20:03:32 +00:00
Claude f2dd5c81c8 config: skip FULL history sync by default (market standard)
Remove the override that was forcing full history sync when
syncFullHistory was true. Now uses the default from Defaults/index.ts
which skips FULL sync type for better performance and stability.

Benefits:
- Faster connection time (2-10s vs 30s-5min)
- Lower bandwidth usage (1-10MB vs 50-500MB+)
- More stable connections (no timeouts)
- INITIAL_BOOTSTRAP + RECENT provide sufficient data

Users can still customize via shouldSyncHistoryMessage if needed.
2026-01-22 19:59:20 +00:00
Renato Alcara ec22355902 feat(history): fortify contact data extraction with fallbacks
feat(history): fortify contact data extraction with fallbacks
2026-01-22 16:50:33 -03:00
Claude 1dfdd47a12 feat(history): fortify contact data extraction with fallbacks
- Add fallback chain for contact name: displayName || name || username
- Add fallback for LID: lidJid || accountLid
- Add TODO marker for WAJIDHASH support in picture updates

These fallbacks improve robustness when WhatsApp returns contact
data in different fields depending on account type (business, personal).
2026-01-22 19:48:20 +00:00
Renato Alcara 5395ecd213 feat(history): add proper logging support for history sync debugging
feat(history): add proper logging support for history sync debugging
2026-01-22 16:29:56 -03:00
Claude 5d97e170d2 feat(history): add proper logging support for history sync debugging
- Add optional ILogger parameter to processHistoryMessage and
  downloadAndProcessHistorySyncNotification functions
- Add trace-level logging with syncType and progress for debugging
- Preserve all existing imports and LID-PN extraction functionality
- Enhanced JSDoc documentation with detailed parameter descriptions

This enables trace-level visibility into history sync processing,
helping debug issues with message synchronization and LID mappings.
2026-01-22 19:24:36 +00:00
Renato Alcara 6257648086 feat: add identity change handler for improved connection stability
feat: add identity change handler for improved connection stability
2026-01-22 16:01:11 -03:00
Claude 4a3d8e9e46 fix: address PR review comments for identity change handler
Fixes 4 issues identified in PR #35 code review:

## 1. Self-Primary Identity Check (Copilot #1)
- BEFORE: `ctx.meId && (areJidsSameUser(...) || (ctx.meLid && ...))`
- AFTER: Check meId and meLid independently with OR
- FIX: Now correctly detects when only meLid exists

## 2. Debounce Cache Placement (Copilot #3, #4)
- BEFORE: Cache set immediately after debounce check
- AFTER: Cache set only before actual assertSessions call
- FIX: Prevents incorrect debouncing when exiting early (offline, etc.)

## 3. Session Regression (ChatGPT Codex P2)
- BEFORE: Returned 'skipped_no_session' when no session exists
- AFTER: Always call assertSessions - identity change IS the signal to rebuild
- FIX: Critical for key reset and device restore scenarios

## 4. Result Type Enhancement
- Added `hadExistingSession: boolean` to 'session_refreshed' result
- Removed 'skipped_no_session' action (no longer applicable)
- Enables better monitoring of session creation vs refresh

## Test Updates
- Added test for meLid-only self-primary detection
- Updated session creation test (no longer skips)
- Added test verifying debounce not set on offline skip
- Added Result Types test suite for type safety
2026-01-22 18:55:01 +00:00
Claude c4da46321f feat: add identity change handler for improved connection stability
Cherry-pick from upstream PR #2264 (commit 5cbad317) with enhancements:

## Changes

### New Files
- `src/Utils/identity-change-handler.ts`: Centralized identity change handling
  - Enterprise-grade JSDoc documentation
  - Clear result types for all 9 possible outcomes
  - Debouncing to prevent duplicate session refreshes
  - Companion device filtering
  - Offline notification handling

- `src/__tests__/Socket/identity-change-handling.test.ts`: Comprehensive tests
  - Core functionality tests
  - Debounce behavior tests
  - Error handling tests
  - Edge case coverage

### Modified Files
- `src/Socket/messages-recv.ts`: Updated error handling
  - MISSING_KEYS_ERROR now returns NACK with ParsingError
  - Maintains CTWA recovery logic intact
  - Preserves all Prometheus metrics integration

- `src/Utils/generics.ts`: Added `isStringNullOrEmpty()` helper
- `src/Utils/index.ts`: Added identity-change-handler export

## Benefits
- Fixes "Online" status shown when actually disconnected (#2132)
- Better session management after contact identity changes
- Clear separation of concerns with dedicated handler module

Co-authored-by: João Lucas de Oliveira Lopes <55464917+jlucaso1@users.noreply.github.com>
2026-01-22 18:34:19 +00:00
Renato Alcara 8141e0dfcc Merge pull request #34
fix merge conflict e qv ng
2026-01-22 15:25:35 -03:00
Claude 9e1e67df6a fix: skip retry for expired status messages over 24 hours old
Cherry-pick from upstream PR #2280 (commit 92d4198)

- Add STATUS_EXPIRY_SECONDS constant (24h = 86400s)
- Skip retry attempts for status broadcast messages older than 24h
- Saves resources by not retrying messages that are already expired

Co-authored-by: João Lucas de Oliveira Lopes <55464917+jlucaso1@users.noreply.github.com>
2026-01-22 18:24:18 +00:00
Renato Alcara 8ddfc4d5a5 Merge pull request #33
feat(history): add userReceipt fallback for LID-PN mapping extraction
2026-01-22 14:19:10 -03:00
Claude 55e86987e9 feat(history): add userReceipt fallback for LID-PN mapping extraction
Add extractPnFromMessages() function to extract phone numbers from
userReceipt fields when pnJid is missing in LID conversations.

This is a cherry-pick of the functionality from upstream PR #2282
(commit f829b6d7a) integrated with our existing LID-PN extraction logic.

Closes: WhiskeySockets/Baileys#2282
2026-01-22 17:13:07 +00:00
Renato Alcara 83936cfec2 Functionality: Add automatic retrieval of messages from CTWA (Click-to-WhatsApp) ads.
Functionality: Add automatic retrieval of messages from CTWA (Click-to-WhatsApp) ads.
2026-01-22 14:02:48 -03:00
Claude 2b3ab32596 Merge branch 'claude/ctwa-upstream-no-metrics-FdFq2' into claude/fix-merge-conflict-eQVNg 2026-01-22 16:59:27 +00:00
Claude 5d889d67b3 fix: resolve merge conflicts with master branch
Merge origin/master into CTWA recovery feature branch

Resolved conflicts:
- src/Defaults/index.ts: kept detailed comment about enableCTWARecovery
- src/Socket/messages-recv.ts: integrated metrics with CTWA recovery logic
- src/__tests__/Utils/ctwa-recovery.test.ts: added metrics tests
2026-01-22 16:58:59 +00:00
Claude ff16ed53e9 fix: resolve merge conflicts for CTWA recovery feature PR #31
Merge branch 'claude/ctwa-upstream-no-metrics-FdFq2' into master

Resolved conflicts:
- src/Defaults/index.ts: kept detailed comment about enableCTWARecovery
- src/Socket/messages-recv.ts: preserved metrics integration with CTWA recovery
- src/__tests__/Utils/ctwa-recovery.test.ts: kept metrics tests
2026-01-22 16:50:42 +00:00