Skip to content

feat(cli): cursor-based pagination (--limit/--continue) for list commands - #344

Open
jpage-godaddy wants to merge 11 commits into
mainfrom
cursoring
Open

jpage-godaddy wants to merge 11 commits into
mainfrom
cursoring

Conversation

@jpage-godaddy

@jpage-godaddy jpage-godaddy commented Oct 21, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

Moves the CLI's list commands onto cli-engine's cursor pagination model (--limit as page size, --continue <token> for the next page). Each response carries a cursor block (has_more, continue_from, and total/remaining where the backend reports them) and a ready-to-run next action, replacing the earlier --offset windowing and its pagination block. No cli-engine bump is needed: origin/main already pins 0.10.2, which includes the feature.

What changed

Backed by the service's own cursor or page token

  • domain list (v3 page token), platform app list (App Registry Relay cursor)
  • dns list, email list (page number)
  • hosting app list, hosting deployment list, hosting log list (page token)

Paged client-side over the full response (--offset jumps straight to a position)

  • api parameter list, api response list, api search
  • platform actions list
  • hosting domain list

Continuation behavior

  • The engine's next-page action replays the command's own arguments, so after a direct jump it reads … --offset 20 --continue <token>. --continue takes precedence over --offset/--page, so that action advances as printed (regression tests execute it).
  • Tokens escape % and , in values, so an opaque server page token round-trips exactly. A --continue value this command did not issue is rejected with a validation error and a fix instead of quietly restarting from page one: a truncated token, a key the command never produces (for example a dns list token given to platform actions list), a non-numeric value, a page size outside the command's range, or a page below 1. A blank --continue still starts from the beginning.
  • --page on dns list and email list must be at least 1, and --offset on the client-side lists must be 0 or more; both fail at argument parsing.
  • For the client-side commands the global --filter is applied to the whole collection before slicing, so offsets, cursor.total and cursor.remaining reflect the filtered rows.

Data accuracy

  • dns list reports cursor.total/cursor.remaining when the API returns a total.
  • email list decides whether another page exists from the response's rel=next link, not from the item count.
  • Hosting app/deployment/log lists report cursor.total when the service sends totalItems.

Supporting changes

  • ApplicationsList.graphql now takes $first/$after and returns pageInfo; the platform app client and its tests were ported onto the generated client.
  • Shared token helpers in pagination_token.rs, and page_items/page_continuation/page_limit helpers for hosting.

How the user experience changes

Across every converted list

Before After
Page size --limit was a window over the full result (for several commands the default was "everything"; --limit 0 meant "all") --limit is the page size and must be at least 1; --limit 0 is rejected. Every command has a default and a maximum (below)
Getting the next page --limit N --offset M --continue <token> from the previous response
Machine-readable paging pagination: {total, offset, limit, count, has_more} cursor: {limit, count, has_more, continue_from?, total?, remaining?} (total/remaining only where the backend reports them)
Next-step hint gddy … --limit 3 --offset 3 gddy … --continue "limit:3,offset:3" (opaque token; for server-backed lists it is the service's own cursor)
Jumping to a position --offset on every list --offset on client-side lists, --page on dns list and email list; none on lists backed by a forward-only server cursor

--continue takes precedence over --offset/--page, so the next-step hint can be run exactly as printed even after a jump.

A --continue value that isn't one the command issued is now an error rather than "start over", so a bad copy/paste can't silently repeat page one. The Unicode/punycode name display (--punycode) works on the paged domain list, dns list and hosting domain list, and the printed next-step hint carries the flag.

Command by command

Command Before After
platform app list Everything by default; --limit/--offset sliced the result (max 200) One page of 50 (max 200) from the App Registry's Relay cursor; --continue
domain list Everything by default (up to 10,000 domains, fetching every page); --limit/--offset (max 500); reported total One page of 100 (max 200) using the service's page token; --continue. No total: the v3 API does not return one
dns list Every record by default (all pages fetched); --limit/--offset (max 500) One page of 50 (max 100); --page N to jump; cursor.total and cursor.remaining from the API
email list 25 by default (max 500), --offset 25 by default (max 100); --page N to jump; "more pages" now comes from the response's next link, not the item count
hosting app list All pages fetched by default; --limit was a total cap One page of 50 (max 100); --limit is the page size; --continue
hosting deployment list All pages fetched by default; --limit was a total cap One page of 50 (max 100); --limit is the page size; --continue
hosting log list All pages fetched by default; --limit was a total cap (max 500) One page of 100 (max 500); --limit is the page size; --continue
hosting domain list All domains by default; --limit capped the total One page of 50 (max 200), paged client-side over the full list; --limit, --offset, --continue. Reads every page the service offers, but only as many as the requested window needs (not with --filter)
hosting subscription list Looped on a next link while ignoring the token (could re-fetch page 1 indefinitely); --limit shortened the list Reads every page the service offers (bounded), so slot totals and the suggested plan cover all plans; --limit still only shortens the list shown
api parameter list, api response list 20 by default (max 200), --offset Same default and maximum; --continue, and --offset still works
api search Everything by default (max 100) One page of 50 (max 100); --continue, and --offset still works
platform actions list 50 by default (max 200), --offset Same default and maximum; --continue, and --offset still works

--filter on the client-side lists (api parameter/response list, api search, platform actions list, hosting domain list) is applied to the whole collection before paging, so offsets and counts reflect the filtered rows. On server-backed lists the engine still filters the page the backend returned, so a filtered page can be shorter than --limit.

Examples

Captured from real runs of this branch and of origin/main (0.2.31); platform actions list needs no network.

gddy platform actions list --limit 3

before   pagination: {"total":7,"offset":0,"limit":3,"count":3,"has_more":true}
         next: gddy platform action list --fields "name,description" --limit 3 --offset 3

after    cursor: {"limit":3,"count":3,"total":7,"remaining":4,"continue_from":"limit:3,offset:3","has_more":true,"self_sufficient_limit":true}
         next: gddy platform action list --fields "name,description" --continue "limit:3,offset:3"

gddy platform actions list --limit 3 --offset 3 (a jump, then the printed next step)

before   next: gddy platform action list --fields "name,description" --limit 3 --offset 6

after    next: gddy platform action list --offset 3 --fields "name,description" --continue "limit:3,offset:6"
         (runs as printed: the token wins over the replayed --offset)

--limit 0, which used to mean "all"

before   gddy api search commerce --limit 0     -> all 37 rows
after    gddy api search commerce --limit 0     -> error: invalid value '0' for '--limit <limit>': limit 0 must be greater than 0

gddy dns list <domain> --limit 1 on a real zone (test environment)

before   pagination: {"total":7,"offset":0,"limit":1,"count":1,"has_more":true}
         next: gddy dns list <domain> --fields "type,name,data,ttl" --limit 1 --offset 1

after    cursor: {"limit":1,"count":1,"total":7,"remaining":6,"continue_from":"<token>","has_more":true,"self_sufficient_limit":true}
         next: gddy dns list <domain> --fields "type,name,data,ttl" --continue "limit:1,page:2"

gddy domain list --limit 5 followed through --continue, against an account with 13 domains (test environment): pages of 5, 5 and 3 rows, 13 distinct domains, no duplicates, has_more false on the last page.

Hosting domain and subscription lists

The Hosting spec types listDomains and listSubscriptions as paged but declares no paging request parameters, and the service rejects pageSize/pageToken on GET /subscriptions with a 400 (checked against the test environment). The hosting team confirmed any next links will follow the API collections-and-pagination standard. The old code looped on a next link while the client discarded the token, so a next link would have re-fetched page 1 indefinitely.

Because the services don't paginate these endpoints yet, both commands gather the whole collection and work from it, so they are ready when next links start to appear:

  • The first request carries no paging parameters. If the response has a links[rel=next], its query string is replayed unchanged on the same path, host and credentials (never a host or path taken from the link), up to 20 pages. Each followed page goes through the same generated type as the first.
  • hosting domain list then pages that complete list client-side (--limit, --offset, --continue), and stops reading once it holds enough for the requested window. With --filter it reads everything, and cursor.total/cursor.remaining are left out whenever it stopped before the end.
  • hosting subscription list always reads every page, because its slot totals and the plan it suggests are only right over all plans. Its output shape is unchanged.
  • A link that can't be followed (nothing to replay, a repeated link, or the page cap) ends the listing and prints a warning to stderr instead of failing.

platform app list prints the same kind of warning if the App Registry reports another page but returns no cursor. Follow-up: DEVEX-1340 asks the hosting team to declare the paging parameters in the spec; once the services paginate, these two commands switch to the service's own continuation token in a follow-up release. When cli-engine#131 (CommandResult::with_warning) lands, the stderr warnings move to a structured result warning.

Test plan

  • Merged with the latest main (internationalized domain names, auto-renew and transfer-lock commands); the paged lists keep --punycode
  • cargo check --workspace
  • cargo clippy --workspace -- -D warnings
  • cargo test --workspace
  • cargo fmt --check
  • ./rust/scripts/check-module-size.sh
  • --help renders --limit/--continue (and --offset/--page where applicable) on every converted command
  • Next-page action executed as printed after an --offset jump (api parameter list, platform actions list); --filter plus offset jump plus continuation on platform actions list
  • Live (test environment, read-only): hosting subscription list output unchanged; domain list walked across three real pages (5, 5, 3 rows; 13 distinct, no duplicates); dns list reports total/remaining on a real zone
  • Not exercised live: multi-page continuation for dns list, email list, platform app list and the hosting lists (the test account has too little data or no apps), and following next links on the hosting domain and subscription lists (no endpoint returns one today; covered by mock-server tests)

🤖 Generated with Claude Code

…ands

List commands now page with cli-engine's cursor model. Each page reports a
`cursor` block (`has_more`, `continue_from`, and `total`/`remaining` when the
backend knows them) plus a ready-to-run next action, replacing the earlier
`--offset` windowing and its `pagination` block. `--limit` is the page size;
`--continue <token>` fetches the next page.

Backed by the service's own cursor or page token:
- domain list (v3 page token), platform app list (App Registry Relay cursor)
- dns list and email list (page number)
- hosting app list, deployment list and log list (page token)

Paged client-side over the full response, with `--offset` to jump straight to
a position:
- api parameter list, api response list, api search
- platform actions list
- hosting domain list

Defaults when `--limit` is omitted: platform app list 50, domain list 100,
dns list 50, email list 25, hosting app/deployment list 50, hosting log list
100, hosting domain list 50. Each command has a maximum page size.

`hosting domain list` and `hosting subscription list` call endpoints whose
spec declares no paging parameters, and the service rejects `pageSize` and
`pageToken` there. They make one request, and print a warning to stderr if the
response reports a further page instead of silently showing a partial list.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

Copilot AI 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.

🟡 Changes recommended

Pagination correctness issues and a deterministically failing warning test remain unresolved.

5 open issues
What changed in this PR

Migrates the CLI’s list commands to cli-engine cursor pagination, standardizing page sizes, continuation tokens, and next-page actions.

Changes:

  • Replaces offset-based pagination metadata with cursor output and --continue, retaining direct offsets for client-side paging.
  • Adds shared token helpers and backend-specific pagination support, including Relay cursors for platform applications.
  • Replaces unsupported hosting pagination loops with single requests and incomplete-result warnings.
File Description
rust/​src/​platform/​app/​commands/​list.rs Adds cursor-based application listing.
rust/​src/​platform/​app/​client.rs Returns application pages with continuation metadata.
rust/​src/​platform/​app/​client_tests.rs Tests application cursor requests and responses.
rust/​src/​platform/​actions/​mod.rs Adds client-side action catalog pagination.
rust/​src/​pagination_token.rs Adds shared continuation token and slicing helpers.
rust/​src/​main.rs Registers the pagination helper module.
rust/​src/​hosting/​subscription/​list.rs Uses one request and warns about additional results.
rust/​src/​hosting/​log/​list.rs Fetches one log page per invocation.
rust/​src/​hosting/​domain/​list.rs Adds client-side paging and incomplete-result warnings.
rust/​src/​hosting/​deployment/​list.rs Adds deployment continuation support.
rust/​src/​hosting/​common.rs Adds paging helpers, warnings, and tests.
rust/​src/​hosting/​client.rs Removes unsupported domain and subscription paging arguments.
rust/​src/​hosting/​client_tests.rs Updates calls for simplified client signatures.
rust/​src/​hosting/​app/​list.rs Adds cursor-based hosting application listing.
rust/​src/​email/​list.rs Converts mailbox listing to page-based continuation.
rust/​src/​domain/​list.rs Fetches individual domain pages with resumable tokens.
rust/​src/​dns/​records.rs Adds a single-page DNS fetch helper and tests.
rust/​src/​dns/​list.rs Adds DNS cursor output and direct page selection.
rust/​src/​api/​summary.rs Updates pagination terminology in comments.
rust/​src/​api/​search.rs Adds client-side search pagination and tests.
rust/​src/​api/​response.rs Adds cursor pagination for response definitions.
rust/​src/​api/​parameter.rs Adds cursor pagination for parameter definitions.
rust/​src/​api/​guides/​api-explorer.md Documents continuation and direct-offset usage.
rust/​platform-app-client/​src/​lib.rs Updates GraphQL pagination test fixtures.
rust/​platform-app-client/​graphql/​ApplicationsList.graphql Adds Relay paging arguments and page information.

Review effort: Balanced

Comment thread rust/src/api/parameter.rs Outdated
Comment thread rust/src/dns/list.rs Outdated
Comment thread rust/src/dns/records.rs Outdated
Comment thread rust/src/email/list.rs Outdated
Comment thread rust/src/hosting/common.rs Outdated
…aging

- A `--continue` token now takes precedence over `--offset`/`--page`. The
  next-page action replays the command's own arguments, so after a direct
  jump it reads `... --offset 20 --continue <token>`; the two flags no longer
  conflict and the token decides the page, so the action advances instead of
  failing to parse or repeating the same page.
- `dns list --page` and `email list --page` reject 0 at parse time, since pages
  are 1-based.
- `dns list` reports `cursor.total` and `cursor.remaining` when the API returns
  a total.
- `email list` decides whether another page exists from the response's
  `rel=next` link rather than from the item count, so a full final page no
  longer offers an empty next page.
- The incomplete-list warning test asserts the shipped wording, and the
  warning's formatting matches rustfmt.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

Copilot AI 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.

🔵 Needs a closer look

Unresolved cursor preservation, limit validation, and pagination metadata issues can produce incorrect or incomplete results.

No open issues 🎉

4 previously missed issues

In code that hasn't changed since last review

Medium severity Escape opaque page tokens in continuation encoding

rust/​src/​domain/​list.rs:221

The domain API's page token is opaque, but this comma-delimited encoding does not escape it. A next link containing pageToken=abc%2Cdef produces token:abc,def,direction:forward; decode_resume then sends abc instead of abc,def on the next request. Encode the token value and decode it symmetrically so continuation preserves the server's cursor exactly. Add a round-trip regression covering commas, percent signs, and plus signs.

Medium severity Preserve optional totalItems in paginated responses

rust/​src/​hosting/​common.rs:325

This drops totalItems even when the hosting response supplies it. The hosting spec's shared PagedList includes that field and the client preserves it, but application, deployment, and log lists return cursors without total. This contradicts the PR's stated contract of including counts where the backend reports them. Carry the optional total into the continuation and leave it absent when unavailable.

Medium severity Validate inherited continuation page-size limits

rust/​src/​pagination_token.rs:132

Limits read from --continue bypass the command's page-size bounds in both paginate_known_collection and resolve_page_request. Here, limit:-1 parses as i64 and converts to usize::MAX, so api search list --continue 'limit:-1,offset:0' returns all matching rows despite its maximum of 100. In the page-based resolver, email list --continue 'limit:101,page:2' or limit:0,page:2 instead sends an invalid page size to the backend. Validate inherited sizes against each command's positive range before slicing or making requests, returning a local validation error or falling back to the validated request limit. Cover negative, zero, and oversized token limits.

Medium severity Reject continuations with missing endCursor

rust/​src/​platform/​app/​commands/​list.rs:43

When hasNextPage is true but endCursor is null, this fallback reports a successful response with has_more: false even though the backend says more applications exist. The client forwards both fields without validating this combination, so callers collecting pages stop with an incomplete list. Return a structured error for (true, None) and reserve CursorContinuation::done() for hasNextPage: false.

5 resolved since last review

Review effort: Balanced

- `--continue` tokens escape `%` and `,` in values, so an opaque server page
  token (domain list) round-trips byte for byte instead of being truncated at
  an embedded comma.
- A page size carried by a `--continue` token is only honored when it is
  within the command's `1..=max` range; otherwise the request's own validated
  `--limit` applies. A token can no longer widen a page past the maximum
  (`limit:-1` no longer returns everything) or send the backend an invalid size.
- Hosting app, deployment and log lists report `cursor.total` when the service
  returns `totalItems`.
- `platform app list` warns on stderr when the App Registry reports another
  page but returns no cursor to fetch it, instead of ending silently.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@jpage-godaddy

Copy link
Copy Markdown
Collaborator Author

Addressed the four 'previously missed' findings from the latest review in fcd4089 (they had no review thread to resolve):

  • Opaque page tokens (domain list): continuation tokens now escape % and , in values, so a server page token containing a comma round-trips exactly. Round-trip test covers commas, percent signs, plus signs and combinations.
  • Hosting totalItems: app, deployment and log lists now set cursor.total when the service returns it; absent otherwise (the service only sends it when asked via totalRequired, which we don't request).
  • Inherited --continue limits: a token's page size is honored only within the command's 1..=max; otherwise the request's own validated --limit applies. Tests cover negative, zero and oversized values for both the offset and page-based resolvers.
  • hasNextPage without endCursor (platform app list): deliberately a stderr warning rather than an error, matching how the hosting lists treat an incomplete listing, so the list ends but no longer looks complete. This is a judgment call; happy to make it a hard error if preferred.

Copilot AI 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.

🔵 Needs a closer look

Filtering order needs correction, and the cross-service continuation changes still require human validation of unexercised multi-page paths.

1 open issue

Review effort: Balanced

Comment thread rust/src/pagination_token.rs
Commands that hold their whole collection (platform actions list, hosting
domain list, api parameter list, api response list, api search) now apply the
global `--filter` before slicing, using the engine's own filter. An offset jump
selects among the matching rows, `cursor.total` and `cursor.remaining` count
only those, and an invalid filter expression is reported instead of ignored.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

Copilot AI 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.

🔵 Needs a closer look

Cross-service pagination and output-contract changes warrant human validation because real-backend multi-page continuation paths remain unverified.

No open issues 🎉

1 resolved since last review

Review effort: Balanced

@kperkins-godaddy kperkins-godaddy left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

A few observations from a review pass. Some of these may already be handled somewhere I didn't trace, so please push back where that's the case.

Comment thread rust/src/domain/list.rs
Comment thread rust/src/email/list.rs
Comment thread rust/src/email/list.rs
fields,
)
.await?;
let has_more = list.links.iter().any(|link| link.rel == "next");

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This seems to make has_more depend entirely on a rel=next link. Since MailboxList.links defaults to an empty vec, a response that omits links would read as the last page even when it's full. The previous version seemed to fall back on the item count. Do we know the mailbox API reliably returns links? If not, keeping the count fallback might be safer.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Checked this against the live service rather than guessing. The test-environment response does include a links array (self, first), but my account has a single mailbox, so I could not see whether a full page carries rel=next. The spec says next is absent only on the last page, which is what the current code relies on, but you are right that a response with no links at all would read as the last page. Leaving this thread open: an option is to use the next link when links is present and fall back to the item count only when links is missing entirely. That is a judgment call about trusting the spec, so I want a decision before changing it.

Comment thread rust/src/pagination_token.rs Outdated
Comment thread rust/src/api/parameter.rs
jpage-godaddy and others added 2 commits October 22, 2026 15:44
`hosting domain list` and `hosting subscription list` call endpoints that do
not accept paging parameters today (the service rejects them) but are specified
to follow the API collections-and-pagination standard, so a `next` link can
appear. Both now gather the whole collection, following `next` links by
replaying the link's query on the same path, host and credentials (at most 20
pages), and then work from that complete list.

- `hosting domain list` pages the list client-side with `--limit`, `--offset`
  and `--continue`, and stops reading once it holds enough for the requested
  window. Totals are left out when it stopped before the end. `--filter`
  applies to the whole list first.
- `hosting subscription list` always reads every page, so slot totals and the
  suggested plan cover all plans, and keeps its existing output shape.
- A link that cannot be followed ends the listing and prints a warning to
  stderr instead of failing.
- The App Registry warning no longer names an internal service.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
A `--continue` value that this command did not issue now fails with a
validation error and a fix, instead of quietly restarting from the first page
where repeated rows could go unnoticed. That covers a truncated token, a pair
with no value, a key the command never issues (for example a `dns list` token
passed to `platform actions list`), a non-numeric value, and a page size
outside the command's range. A blank `--continue` still starts from the
beginning.

`--offset` on `api parameter list`, `api response list`, `api search` and
`hosting domain list` must now be 0 or greater, and is rejected by argument
parsing rather than treated as 0.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

Copilot AI 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.

🟡 Changes recommended

Followed hosting pages expose response bodies in transport traces, and incomplete-list totals and zero-page token validation remain incorrect.

3 open issues

Review effort: Balanced

Comment thread rust/src/hosting/client.rs Outdated
Comment thread rust/src/hosting/domain/list.rs Outdated
Comment thread rust/src/pagination_token.rs
- Hosting listing pages read after the first (domains and subscriptions) no
  longer put their response body in `--debug transport` output, matching the
  first page, which already traces status and headers only.
- `hosting domain list` leaves `cursor.total` and `cursor.remaining` out
  whenever it did not read the whole collection, including when a next link
  could not be followed, not only when it stopped early on purpose.
- A `--continue` token with `page:0` is rejected for `dns list` and
  `email list`, so it can no longer repeat the first page.
- The paging tests for these listings move to their own file to keep each
  test file under the size limit.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

Copilot AI 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.

🟡 Changes recommended

Hosting cycle detection can duplicate subscriptions and inflate slot totals, while empty searches bypass continuation validation.

1 open issue
1 previously missed issue

In code that hasn't changed since last review

Medium severity Preserve continuation token handling for empty results

rust/​src/​api/​search.rs:65

The empty-results branch discards --continue, so a search with no matches accepts malformed tokens that the normal path rejects. It also ignores valid embedded page sizes: --continue 'limit:1,offset:1' reports cursor.limit: 50 instead of 1 when --limit is omitted. Resolve and pass the supplied continuation here too, so token validation and cursor metadata remain consistent regardless of whether the search finds any rows.

3 resolved since last review

Review effort: Balanced

Comment thread rust/src/hosting/client.rs Outdated
…e empty-search tokens

- A hosting listing now recognises a repeated page after the required filter
  has been added to the link, so a link that omits it and a later one that
  includes it are not read twice. Previously the same plans could be counted
  twice and inflate the subscription slot totals.
- `api search` handles `--continue` the same way when nothing matches: a
  malformed token is rejected and a valid one's page size is reported.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@jpage-godaddy

Copy link
Copy Markdown
Collaborator Author

Addressed the 'previously missed' finding from the latest review in 0d946d3 (no review thread to resolve): api search with no matches now resolves --continue like a search with results, so a malformed token is rejected and a valid token's page size is what cursor.limit reports (previously the empty branch discarded the token and reported the default). A regression test covers both, and fails with the old behavior restored.

Copilot AI 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.

🟡 Changes recommended

Hosting’s repeat guard can fetch identical pages again, duplicating subscriptions and inflating available-slot totals.

2 open issues
1 resolved since last review

Review effort: Balanced

Comment thread rust/src/hosting/client.rs Outdated
Comment thread rust/src/hosting/client.rs Outdated
jpage-godaddy and others added 2 commits October 22, 2026 16:44
When a hosting listing is read across several pages, the request that produced
the first page now counts as already read, and two requests are compared by
their set of parameters rather than their order. A next link that points back
at the first page, or repeats a page with its parameters in another order, ends
the listing instead of fetching those plans again and inflating the
subscription slot totals.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Keeps the Unicode/punycode display of domain names (`--punycode`) on the paged
`domain list`, `dns list` and `hosting domain list`, and drops the
`--limit`/`--offset` windowing that main's `domain list` still carried.

Copilot AI 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.

🔵 Needs a closer look

Cross-service continuation paths need human validation, and the unresolved hosting cursor-encoding defect prevents reliable paging.

1 open issue
2 resolved since last review

Review effort: Balanced

Comment thread rust/src/hosting/common.rs
The page token read from a hosting `next` link is now percent-decoded once. It
is passed on to the generated client, which encodes it again, so a token that
was left encoded reached the service as a different value (`a%252Bb` instead of
`a%2Bb`) and the next page could not be fetched. This affects the application,
deployment and log lists' `--continue` tokens.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

Copilot AI 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.

🔵 Needs a closer look

The cross-service pagination migration warrants human validation of backend continuation paths that remain untested live.

No open issues 🎉

1 resolved since last review

Review effort: Balanced

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants