Skip to content

feat(core): expose typed stanza responses and retries - #1069

Merged
jlucaso1 merged 8 commits into
mainfrom
agent/public-stanza-ack-retry
Jul 22, 2026
Merged

jlucaso1 merged 8 commits into
mainfrom
agent/public-stanza-ack-retry

Conversation

@jlucaso1

Copy link
Copy Markdown
Collaborator

Summary

  • add borrowed, typed client operations for acknowledging and rejecting inbound stanzas
  • expose explicit retransmission requests through the canonical message parser, retry counter, PDO recovery, key reservation, and durability paths
  • preserve the direct ACK encoder and avoid intermediate node trees or transport-specific models
  • make retry counting atomic and add allocation-free decoded JID comparisons

Protocol behavior

  • malformed explicit inputs return typed errors while automatic receive handling remains tolerant
  • rejection reasons preserve unknown numeric values, and only invalid protobuf rejections can carry failure metadata
  • manual retransmission requests never send a transport ACK; the automatic pipeline retains retry-before-ACK ordering
  • key bundles follow the observed force || stateless || retry_count >= 2 policy independently of the diagnostic reason
  • retry limits, PDO fallback, hosted addressing, bot suppression, prekey reservation, and persistence ordering reuse existing client state

Validation

  • cargo fmt --all -- --check
  • cargo clippy --workspace --all-targets --all-features -- -D warnings
  • cargo test --workspace --exclude e2e-tests

@coderabbitai

coderabbitai Bot commented Jul 21, 2026

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

This PR adds typed stanza response APIs, updates ACK/NACK wire construction and error handling, introduces allocation-free display comparisons, and refactors retry processing around atomic counters, typed outcomes, and policy-driven key inclusion.

Changes

Typed stanza responses

Layer / File(s) Summary
Wire-value comparison primitives
wacore/binary/src/jid.rs, wacore/binary/src/node.rs, src/client.rs
JID and ValueRef comparisons support allocation-free display-form equality for ACK attribute handling.
Stanza response contracts
src/features/stanza.rs, src/features/mod.rs, src/lib.rs, wacore/src/protocol/nack.rs
Typed rejection, response-error, retry-option, and retry-outcome types are added and re-exported.
ACK encoding and transport
src/client.rs, src/client/node_io.rs, src/client/tests.rs
ACK encoding returns concrete buffers and typed errors, uses device snapshots, and supports tolerant and explicit send paths.
NACK construction and rejection
src/receipt.rs, src/message/receive.rs
NACKs can be built from original stanzas or MessageInfo, with validation and the reject_stanza API.
Strict routing validation
wacore/binary/src/attrs.rs, wacore/src/messages.rs
Required routing JIDs are parsed strictly and malformed or missing values are rejected.

Retry processing

Layer / File(s) Summary
Retry policy and receipt sending
wacore/src/protocol/retry.rs, src/retry.rs, src/message.rs, wacore/src/message_processing.rs
Retry constants and key inclusion are centralized, while receipt sending reports suppression and key-inclusion outcomes.
Atomic retry tracking
src/portable_cache.rs, src/message/retry.rs, src/message/tests.rs
Retry counters use serialized cache updates while enforcing the shared retry limit.
Typed retry request pipeline
src/message/retry.rs, src/message/receive.rs, src/message/tests.rs
Explicit retry requests validate stanzas, coordinate receipts and PDO fallback, and return typed outcomes and errors.

Supporting maintenance

Layer / File(s) Summary
Operational support updates
src/prekeys.rs, src/client/lifecycle.rs, tests/e2e/tests/*
Pre-key flush failures gain contextual errors, selected E2E tests raise recursion limits, lifecycle test helpers are available under test builds, and memory soak analysis logs tracked heap deltas.

Estimated code review effort: 4 (Complex) | ~60 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Caller
  participant Client
  participant RetryPipeline
  participant PortableCache
  participant Transport
  Caller->>Client: request_message_retry(stanza, options)
  Client->>RetryPipeline: validate and process retry
  RetryPipeline->>PortableCache: atomically increment retry count
  RetryPipeline->>Transport: send retry receipt or PDO request
  Transport-->>Caller: typed outcome or error
Loading

Possibly related PRs

Suggested labels: api-design

Suggested reviewers: cubic-dev-ai

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main change by calling out typed stanza responses and retries.
Description check ✅ Passed The description is directly related to the changeset and describes the new stanza, retry, and JID comparison behavior.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch agent/public-stanza-ack-retry

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@greptile-apps

greptile-apps Bot commented Jul 21, 2026

Copy link
Copy Markdown

Greptile Summary

This PR adds typed stanza responses and explicit message retry requests. The main changes are:

  • Borrowed APIs for acknowledging and rejecting inbound stanzas.
  • Shared retry parsing, counting, recovery, key reservation, and persistence paths.
  • Atomic retry-count updates and allocation-free decoded JID comparisons.
  • Public retry options, outcomes, reasons, and typed errors.

Confidence Score: 5/5

This looks safe to merge.

  • Atomic updates prevent concurrent retry increments from being lost.
  • Failed sends continue to consume the established attempt budget while withholding automatic transport acknowledgments.
  • No distinct blocking failure remains in the updated retry path.

Important Files Changed

Filename Overview
src/message/retry.rs Adds explicit retry requests and centralizes automatic and manual retry handling.
src/message/receive.rs Uses shared envelope selection and monotonic sender retry-count pre-seeding.
src/portable_cache.rs Adds atomic by-reference cache updates for retry-count reconciliation.
src/retry.rs Extends retry receipt construction, outcomes, key handling, and durability behavior.
src/features/stanza.rs Defines the public typed stanza response and retry API.

Reviews (8): Last reviewed commit: "fix(core): harden explicit stanza operat..." | Re-trigger Greptile

Comment thread src/message/retry.rs
@github-actions

github-actions Bot commented Jul 21, 2026

Copy link
Copy Markdown

📦 Binary size report

Metric main PR Δ
bin size (stripped) 9.66 MiB 9.67 MiB +15.12 KiB (+0.15%) 🔺
bin .text 7.72 MiB 7.74 MiB +14.62 KiB (+0.18%) 🔺
bin allocated (text+data+bss) 9.65 MiB 9.67 MiB +16.02 KiB (+0.16%) 🔺
llvm-lines wacore 490,781 490,929 +148 (+0.03%) 🔺
llvm-lines wacore copies 16,226 16,226 0
llvm-lines whatsapp-rust lib 675,666 680,827 +5,161 (+0.76%) 🔺
llvm-lines whatsapp-rust lib copies 21,749 21,856 +107 (+0.49%) 🔺
deps crates (Cargo.lock) 470 470 0
.text per crate
Crate main PR Δ
.text whatsapp_rust 1.68 MiB 1.70 MiB +14.86 KiB (+0.86%) 🔺
.text wacore 635.44 KiB 636.30 KiB +883 B (+0.14%) 🔺
.text wacore_binary 87.02 KiB 89.35 KiB +2.33 KiB (+2.67%) ⚠️
.text wacore_libsignal 160.96 KiB 160.96 KiB 0
.text wacore_appstate 22.36 KiB 22.36 KiB 0
.text wacore_noise 22.98 KiB 22.98 KiB 0
.text waproto 1.74 MiB 1.74 MiB 0
.text whatsapp_rust_sqlite_storage 510.58 KiB 510.58 KiB 0
.text whatsapp_rust_tokio_transport 39.84 KiB 39.84 KiB 0
.text whatsapp_rust_ureq_http_client 10.28 KiB 10.28 KiB 0
.text std 950.73 KiB 951.21 KiB +496 B (+0.05%) 🔺
.text other deps 1.88 MiB 1.88 MiB -3.96 KiB (-0.21%) 🔽
Top movers (cargo-bloat attribution)
Crate main PR Δ
whatsapp_rust 1.68 MiB 1.70 MiB +14.86 KiB (+0.86%)
metrics_exporter_prometheus 3.96 KiB (removed) -3.96 KiB (-100.00%)
wacore_binary 87.02 KiB 89.35 KiB +2.33 KiB (+2.67%)

Baseline: b649fe8dd (latest main run) · Head: 365e28de7 · Graphs

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

Copy link
Copy Markdown

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: 7bf9dae72f

ℹ️ About Codex in GitHub

Your team has set up Codex to 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 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/receipt.rs
Comment thread src/message/retry.rs
Comment thread src/client.rs Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/client/node_io.rs (1)

597-696: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Four near-identical snapshot→encode→drop blocks — let's not repeat ourselves four times.

send_ack_for, acknowledge_stanza, send_transport_ack, and spawn_node_transport_ack all do the same "snapshot device, call encode_ack_bytes, drop snapshot" dance with slightly different error handling. Every one of these is a spot where a future edit could forget the drop(device) or mis-order it. Worth pulling into one private helper that returns Result<Vec<u8>, StanzaResponseError> and let each caller decide how to handle the error (log-and-return vs propagate).

♻️ Sketch of the shared helper
fn encode_ack_from_snapshot(
    &self,
    node: &wacore_binary::NodeRef<'_>,
) -> Result<Vec<u8>, crate::features::StanzaResponseError> {
    let device = self.persistence_manager.get_device_snapshot();
    let result = encode_ack_bytes(node, device.pn.as_ref());
    drop(device);
    result
}

Not blocking — the current code is correct, just repetitive.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/client/node_io.rs` around lines 597 - 696, Add a private helper near the
ack methods, such as encode_ack_from_snapshot, that obtains the device snapshot,
calls encode_ack_bytes, and releases the snapshot before returning its
Result<Vec<u8>, StanzaResponseError>. Update send_ack_for, acknowledge_stanza,
send_transport_ack, and spawn_node_transport_ack to use this helper while
preserving each method’s existing error handling and logging behavior.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/client.rs`:
- Around line 1047-1062: Update value_refs_display_equal so the Jid–Jid branch
compares the fields that determine their wire display, respecting the documented
agent suppression rules used by Jid::is_same_chat_as instead of relying on
derived Jid equality. Keep the comparison allocation-free and preserve the
existing String–String and cross String/Jid behavior so encode_ack_bytes and
build_ack_node correctly drop participants matching from by display form.

In `@tests/e2e/tests/memory_soak.rs`:
- Around line 208-215: Update the heap-growth calculation in the dhat-heap
reporting block to use a signed difference instead of saturating_sub, allowing
decreases to be represented. Format the delta with an explicit sign while
preserving the existing first and last heap byte values in the Tracked heap log.

---

Outside diff comments:
In `@src/client/node_io.rs`:
- Around line 597-696: Add a private helper near the ack methods, such as
encode_ack_from_snapshot, that obtains the device snapshot, calls
encode_ack_bytes, and releases the snapshot before returning its Result<Vec<u8>,
StanzaResponseError>. Update send_ack_for, acknowledge_stanza,
send_transport_ack, and spawn_node_transport_ack to use this helper while
preserving each method’s existing error handling and logging behavior.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI (base), Organization UI (inherited)

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: a55a239d-8352-4b3f-9765-b89da3c68c9e

📥 Commits

Reviewing files that changed from the base of the PR and between 8b82df0 and 7bf9dae.

📒 Files selected for processing (23)
  • src/client.rs
  • src/client/node_io.rs
  • src/client/tests.rs
  • src/features/mod.rs
  • src/features/stanza.rs
  • src/lib.rs
  • src/message.rs
  • src/message/retry.rs
  • src/message/tests.rs
  • src/portable_cache.rs
  • src/prekeys.rs
  • src/receipt.rs
  • src/retry.rs
  • tests/e2e/tests/app_state.rs
  • tests/e2e/tests/chat_actions.rs
  • tests/e2e/tests/memory_soak.rs
  • tests/e2e/tests/messaging.rs
  • tests/e2e/tests/profile.rs
  • wacore/binary/src/jid.rs
  • wacore/binary/src/node.rs
  • wacore/src/message_processing.rs
  • wacore/src/protocol/nack.rs
  • wacore/src/protocol/retry.rs

Comment thread src/client.rs
Comment thread tests/e2e/tests/memory_soak.rs
greptile-apps[bot]
greptile-apps Bot previously approved these changes Jul 22, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
src/message/tests.rs (2)

5567-5582: 🔒 Security & Privacy | 🟡 Minor | ⚡ Quick win

Use reserved fictitious NANP JIDs in these fixtures.

The new 1555... values use 555 as the NPA. Replace them with the repository’s fictional format, e.g. 12025550111, and update matching assertions.

Based on learnings, fictitious NANP test numbers must use 1 + a real NPA + 555 + a line number from 0100 through 0199.

Also applies to: 5664-5666, 5674-5674, 5690-5693, 5711-5717, 6055-6096

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/message/tests.rs` around lines 5567 - 5582, Replace all fictitious NANP
JIDs and matching assertions in the affected fixtures with the repository
format: 1 + a real NPA + 555 + a line number from 0100 through 0199, such as
12025550111. Update every corresponding participant, sender, recipient, and
expected-value reference across the affected tests.

Source: Learnings


3612-3662: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Bind this test to MAX_DECRYPT_RETRIES.

The task count, expected successes/failures, returned values, and final count all hardcode 5. Derive them from MAX_DECRYPT_RETRIES so this atomicity test remains valid if retry policy changes.

Proposed fix
-    // Spawn 10 concurrent increment tasks
+    let max_retries = usize::from(MAX_DECRYPT_RETRIES);
+    let attempts = max_retries * 2;
     let mut tasks = JoinSet::new();
-    for _ in 0..10 {
+    for _ in 0..attempts {
...
-        5,
+        max_retries,
...
-        5,
+        attempts - max_retries,
...
-        vec![1, 2, 3, 4, 5],
+        (1..=MAX_DECRYPT_RETRIES).collect::<Vec<_>>(),
...
-    assert_eq!(final_count, Some(5), "Final count should be capped at 5");
+    assert_eq!(final_count, Some(MAX_DECRYPT_RETRIES));
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/message/tests.rs` around lines 3612 - 3662, Update the concurrent
increment test around increment_retry_count to derive the task count, expected
successful and failed result counts, returned value range, and final count from
MAX_DECRYPT_RETRIES instead of hardcoded 5 values. Preserve the existing
atomicity assertions and adapt the task count so it still exercises both
successful and exhausted increments when the retry limit changes.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@wacore/binary/src/jid.rs`:
- Around line 1213-1219: Standardize both fictional NANP JID fixtures by
replacing 15551234567 with 12025550111 in wacore/binary/src/jid.rs lines
1213-1219 and src/client/tests.rs lines 2453-2459; retain the existing
hosted-JID display comparison in src/client/tests.rs.

---

Outside diff comments:
In `@src/message/tests.rs`:
- Around line 5567-5582: Replace all fictitious NANP JIDs and matching
assertions in the affected fixtures with the repository format: 1 + a real NPA +
555 + a line number from 0100 through 0199, such as 12025550111. Update every
corresponding participant, sender, recipient, and expected-value reference
across the affected tests.
- Around line 3612-3662: Update the concurrent increment test around
increment_retry_count to derive the task count, expected successful and failed
result counts, returned value range, and final count from MAX_DECRYPT_RETRIES
instead of hardcoded 5 values. Preserve the existing atomicity assertions and
adapt the task count so it still exercises both successful and exhausted
increments when the retry limit changes.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI (base), Organization UI (inherited)

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: ca4f7ec3-8867-4948-8255-8c71d3245ca9

📥 Commits

Reviewing files that changed from the base of the PR and between 7bf9dae and 43a80b9.

📒 Files selected for processing (8)
  • src/client.rs
  • src/client/node_io.rs
  • src/client/tests.rs
  • src/message/tests.rs
  • tests/e2e/tests/memory_soak.rs
  • wacore/binary/src/attrs.rs
  • wacore/binary/src/jid.rs
  • wacore/src/messages.rs

Comment thread wacore/binary/src/jid.rs
@greptile-apps
greptile-apps Bot dismissed their stale review July 22, 2026 00:28

Dismissed because a newer commit was pushed; Greptile will re-review the current head.

greptile-apps[bot]
greptile-apps Bot previously approved these changes Jul 22, 2026

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

Copy link
Copy Markdown

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: c4f2e7ddbb

ℹ️ About Codex in GitHub

Your team has set up Codex to 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 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/message/retry.rs
Comment thread wacore/src/messages.rs
Comment thread src/message/retry.rs Outdated
Comment thread src/message/retry.rs
@greptile-apps
greptile-apps Bot dismissed their stale review July 22, 2026 02:05

Dismissed because a newer commit was pushed; Greptile will re-review the current head.

greptile-apps[bot]
greptile-apps Bot previously approved these changes Jul 22, 2026

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

Copy link
Copy Markdown

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: d05996cd68

ℹ️ About Codex in GitHub

Your team has set up Codex to 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 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/client.rs
Comment thread src/message/retry.rs Outdated
Comment thread src/retry.rs

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/message/tests.rs`:
- Around line 6113-6155: Replace the sender JID fixture in
explicit_retry_while_disconnected_preserves_budget_and_prekeys with a properly
formatted fictitious NANP number: country code 1, a real non-555 NPA, exchange
555, and line number 0100–0199. Keep the sender’s device suffix and all
retry-cache assertions unchanged.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI (base), Organization UI (inherited)

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: af5c5964-e537-4e8b-844e-7e5bf5c99d42

📥 Commits

Reviewing files that changed from the base of the PR and between c4f2e7d and d05996c.

📒 Files selected for processing (7)
  • src/client/lifecycle.rs
  • src/message/receive.rs
  • src/message/retry.rs
  • src/message/tests.rs
  • src/receipt.rs
  • wacore/binary/src/attrs.rs
  • wacore/src/messages.rs

Comment thread src/message/tests.rs
@greptile-apps
greptile-apps Bot dismissed their stale review July 22, 2026 02:18

Dismissed because a newer commit was pushed; Greptile will re-review the current head.

greptile-apps[bot]
greptile-apps Bot previously approved these changes Jul 22, 2026
@greptile-apps
greptile-apps Bot dismissed their stale review July 22, 2026 12:32

Dismissed because a newer commit was pushed; Greptile will re-review the current head.

greptile-apps[bot]
greptile-apps Bot previously approved these changes Jul 22, 2026

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

Copy link
Copy Markdown

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: 451443e349

ℹ️ About Codex in GitHub

Your team has set up Codex to 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 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/message/retry.rs
@greptile-apps
greptile-apps Bot dismissed their stale review July 22, 2026 12:57

Dismissed because a newer commit was pushed; Greptile will re-review the current head.

greptile-apps[bot]
greptile-apps Bot previously approved these changes Jul 22, 2026

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

Copy link
Copy Markdown

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: 435e3f72d4

ℹ️ About Codex in GitHub

Your team has set up Codex to 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 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/message/retry.rs Outdated
Comment thread src/client.rs Outdated
@greptile-apps
greptile-apps Bot dismissed their stale review July 22, 2026 13:23

Dismissed because a newer commit was pushed; Greptile will re-review the current head.

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant