Repository navigation
feat(remote): GitHub Remote integration with progressive PR/Issue surfaces - #21
Conversation
…cycle Implement the staged remote integration from credential admission and OAuth lifecycle through GitHub REST reads, verified Git checkout, guarded writes, portable Client workflows, and notification deduplication. Keep unavailable credentials fail-closed, bind writes to stable account and repository facts, and preserve optional Desktop enhancement boundaries. Update the bilingual implementation plan, RPC reference, and compatibility installation and validation tooling. Validation: 442 main-lane tests, build and compatibility checks, 4 artifact tests, documentation checks, and all 17 supported DSH version lanes passed. Real OAuth/SSO, remote mutations, and platform manual acceptance remain open.
…source tabs Decompose the monolithic remote surface into presentational components under src/client/remote/ backed by ui-primitives (Menu, Pill, Tag, StateDot, DisclosureRow, Modal, MarkdownText), aligned with the changes/graph page conventions and a dedicated CSS module. Move authentication behind a toolbar icon + dialog on both list and detail toolbars, and open PR/issue entries as shared git.remote.item resource tabs addressed by dsh-resource://git-remote/<owner>/<repo>/ <kind>/<number>, so detail state lives per tab instead of inline below the list. Item row hover now bleeds to the pane edge for a uniform band width, matching the graph row convention.
Remote reads previously stopped at a fixed pagination budget and flagged truncated, leaving long PR/Issue lists, comment threads and comparisons permanently unreachable. Progressive reads now follow the Git Graph pattern: RemotePage carries an opaque next cursor (the origin-checked Link rel="next"), list/comments/files endpoints accept cursor and pages fields, and the Client controller appends pages in a serial background stream with generation checks, defensive deduplication and one bounded resume after a rate limit. remote-files continuations pin the head/base snapshot so inline-comment coordinates cannot drift; inline submission stays disabled until files are fully loaded.
|
@codex review |
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
Retain tab data with freshness windows and conditional page validation. Display localized authentication sources and refresh them after credential actions. Add isolated browser E2E coverage and CI checks, with bilingual architecture and testing documentation.
…thentication dialog GitHub bodies with details/summary, comments, images and other HTML no longer show raw tags; PR and issue activity is ordered chronologically with GitHub avatars; the detail page gains wider margins; the authentication dialog becomes a status card plus a GitHub CLI / OAuth choice.
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: b917738dea
ℹ️ 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".
| this.viewer ??= this.loadViewer(op) | ||
| op.viewer = await this.viewer |
There was a problem hiding this comment.
Clear the cached viewer promise when loading fails
If the initial /user request times out, is cancelled, or encounters a temporary provider failure, this.viewer retains the rejected promise. Every subsequent authenticated operation in the same generation awaits that rejection without making another HTTP request, so refreshing cannot recover and remote functionality remains unavailable across repositories and sessions until authentication is reset or the provider restarts. Clear the cached promise on rejection while preserving successful viewer caching.
Useful? React with 👍 / 👎.
| const value = name.startsWith('#x') || name.startsWith('#X') ? parseInt(name.slice(2), 16) : parseInt(name.slice(1), 10) | ||
| return Number.isSafeInteger(value) ? String.fromCodePoint(value) : all |
There was a problem hiding this comment.
Bound numeric entities before converting Unicode code points
A remote body containing an out-of-range numeric entity, such as <code>�</code>, passes Number.isSafeInteger but causes String.fromCodePoint to throw a RangeError. RemoteMarkdown calls this conversion synchronously during rendering without catching the exception, so malformed content in a PR description or comment prevents the detail view from rendering. Validate the Unicode range before conversion and preserve invalid entities or replace them with a replacement character.
Useful? React with 👍 / 👎.
Summary
End-to-end GitHub Remote platform integration (per ADR-0004, staged plan in
docs/plans/active/remote-platform-integration.md):GH_TOKEN/gh auth tokendiscovery chain, generation-checked RPC boundary (remote-capability, login/poll/cancel/sign-out/grant management).expectedGeneration/expectedViewer/requestId admission and write-result-unknown recovery.nextcursors (Link rel="next", origin-checked) on all list endpoints; Client streams a multi-page first request then one page per serial continuation, deduplicating by number/id/path; no total-item ceiling; boundedresetAtrate-limit recovery.remote-commits/remote-reviewsendpoints; commit and review history sections; inline review comments nested under their owning review viareviewId; file changes reached through a GitHub Files link instead of an embedded diff;remote-files/remote-inline-commentremain guarded Host capabilities.Test plan
pnpm test --maxWorkers=4— 43 files, 451 testspnpm build/tsc --noEmitpnpm docs:check— 57 files, 602 linksgit diff --check