Skip to content

feat(examples): namegraph explorer in enskit-react-example#2295

Merged
shrugs merged 6 commits into
mainfrom
examples/namegraph-explorer
Jun 13, 2026
Merged

feat(examples): namegraph explorer in enskit-react-example#2295
shrugs merged 6 commits into
mainfrom
examples/namegraph-explorer

Conversation

@shrugs

@shrugs shrugs commented Jun 12, 2026

Copy link
Copy Markdown
Member

What

Adds an interactive Namegraph Explorer to examples/enskit-react-example, using the trees.software (@pierre/trees) file-tree component as the UI.

Route: /namegraph/:registryId (and /namegraph → redirects to the namespace Root Registry). It traverses the ENS namegraph forward from a Registry via registry(by:{id}).domains → subregistry → domains ….

How it maps onto a file tree

  • Each row is a Domain. A domain that declares a subregistry renders as an expandable directory and lazily loads that subregistry's domains the first time it's expanded (the library has no expand event, so expansion is detected via the model subscription). Large registries paginate behind a ⤓ load more… sentinel row.
  • The tree path is the constructed addressable name (the forward-traversal trail), shown alongside each domain's canonical name — mismatches are flagged as aliases ().
  • For each subregistry we check whether its reverse canonical pointer agrees with the location we reached it through (↩✓ / ↩✗ / ↩?), derived by peeking a child's parent (a Registry has no direct canonical-domain field).

Detail + resolution panels

Selecting a domain shows stacked panels (the right column scrolls independently; the page does not):

  • Detail — addressable vs canonical name, ENSv1/ENSv2 (__typename), assigned/effective resolver, subregistry id + agreement, with an "open subregistry as root" link.
  • Resolution — forward-resolves the domain (enssdk imperative Omnigraph client): a summary with acceleration { requested attempted } and request timing derived from the protocol trace (longest root span's duration), plus separate Profile and Records panels.

Notes

  • New src/ensnode.ts shares the Omnigraph client between the React OmnigraphProvider and the imperative lazy/paginated fetches.
  • Defaults to the example's existing endpoint (api.v2-sepolia.ensnode.io); VITE_ENSNODE_URL overridable. Verified end-to-end against a local ens-test-env devnet stack.
  • Example app is private — no changeset.

Test

pnpm -F @ensnode/enskit-react-example devhttp://localhost:5173/#/namegraph. Typecheck, lint, and build all pass.

Adds a /namegraph/:registryId route that traverses the ENS namegraph forward
from a Registry using the trees.software (@pierre/trees) file-tree as the UI.

- Each row is a Domain; domains with a subregistry render as expandable
  directories and lazily load their subregistry's domains on expand (paginated
  via a 'load more' sentinel).
- Per domain: the constructed addressable name vs canonical name (alias
  highlighting), ENSv1/ENSv2 version, assigned/effective resolver, and whether
  the subregistry's reverse canonical pointer agrees with its location.
- Selecting a domain forward-resolves it (enssdk imperative Omnigraph client),
  shown as separate Profile and Records panels plus a Resolution summary with
  acceleration metadata and request timing derived from the protocol trace.

Shared the Omnigraph client via a new src/ensnode.ts.
@shrugs shrugs requested a review from a team as a code owner June 12, 2026 17:15
Copilot AI review requested due to automatic review settings June 12, 2026 17:15
@vercel

vercel Bot commented Jun 12, 2026

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
enskit-react-example.ensnode.io Ready Ready Preview, Comment Jun 12, 2026 11:13pm
3 Skipped Deployments
Project Deployment Actions Updated (UTC)
admin.ensnode.io Skipped Skipped Jun 12, 2026 11:13pm
ensnode.io Skipped Skipped Jun 12, 2026 11:13pm
ensrainbow.io Skipped Skipped Jun 12, 2026 11:13pm

@changeset-bot

changeset-bot Bot commented Jun 12, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 5533e19

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@coderabbitai

coderabbitai Bot commented Jun 12, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Warning

Review limit reached

@shrugs, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 9 minutes and 41 seconds. Learn how PR review limits work.

Your organization has run out of usage credits. Purchase more credits in the billing tab to continue.

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: c6fad96f-8141-4d8c-b6ef-a2c34dfac916

📥 Commits

Reviewing files that changed from the base of the PR and between 804b623 and 5533e19.

📒 Files selected for processing (1)
  • examples/enskit-react-example/src/NamegraphView.tsx
📝 Walkthrough

Walkthrough

This PR adds a Namegraph Explorer to the example app: centralized ENSNode client setup, new /namegraph routes, and a tree-based registry browser with lazy pagination, domain detail panels, and resolution tracing.

Changes

Namegraph Explorer Feature

Layer / File(s) Summary
ENSNode Setup & Dependencies
examples/enskit-react-example/src/ensnode.ts, examples/enskit-react-example/package.json
New ensnode.ts exports ENSNODE_URL and a shared client (created via createEnsNodeClient with omnigraph); @pierre/trees bumped to 1.0.0-beta.4.
App.tsx Routing Integration
examples/enskit-react-example/src/App.tsx
App imports client/ENSNODE_URL, adds NamegraphRoute that reads registryId and renders NamegraphView keyed by it, and adds /namegraph and /namegraph/:registryId routes plus nav link.
GraphQL Queries & Helpers
examples/enskit-react-example/src/NamegraphView.tsx (lines 1–313)
Adds queries for paginated registry domains, root registry id, and domain forward-resolution; includes trace-duration extraction and data normalization helpers and fetchRegistryPage mapper.
Tree State & Node Metadata
examples/enskit-react-example/src/NamegraphView.tsx (lines 314–452)
Defines node metadata union types and core tree plumbing (meta refs, path normalization, row decoration, file-tree model, collision-safe path generation).
Tree Loading & Interaction Logic
examples/enskit-react-example/src/NamegraphView.tsx (lines 454–636)
Implements addressable name computation, domain/meta population, load-more sentinel creation, initial registry page load, and async loaders (loadChildren, loadMore) with in-flight deduplication and microtask-deferral.
Main UI Layout & Selection
examples/enskit-react-example/src/NamegraphView.tsx (lines 637–704)
Derives selected node/meta, sizes the left tree viewport, and renders the two-panel layout (left tree, right detail/resolution panels).
Domain Details Panel
examples/enskit-react-example/src/NamegraphView.tsx (lines 706–842)
Provides shared panel styling/utilities and DetailPanel showing addressable/canonical names, resolver info, agreement display, and SubregistryDetail with “open as root” link.
Resolution Panels & Records
examples/enskit-react-example/src/NamegraphView.tsx (lines 843–1077)
Implements ResolutionPanels state machine for forward-resolution with trace-based duration and acceleration flags; renders ProfilePanel and RecordsPanel, plus UI helpers (KeyValueGrid, ExternalLink, prettyUrl, ResolutionStatus).
Root Redirect Helper
examples/enskit-react-example/src/NamegraphView.tsx (lines 1078–1106)
NamegraphRootRedirect queries the Root Registry id on mount and redirects to /namegraph/{rootId} with loading/error states.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

Suggested labels

javascript

Poem

🐰 A little rabbit hops the namegraph trail,

Through registries branching like a tale,
Click a node, watch profiles bloom and shine,
Lazy loads hum while traces mark the time,
Hooray — the explorer sprouts a leafy vine! 🌿

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 35.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately describes the main feature: adding a namegraph explorer component to the enskit-react-example.
Description check ✅ Passed The description comprehensively covers all required sections: What (summary of changes), Why (context), How it maps onto file tree, Detail/resolution panels, Notes, and Test instructions with verification steps.
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.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch examples/namegraph-explorer

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 and usage tips.

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.

Pull request overview

This PR adds a new interactive Namegraph Explorer page to the examples/enskit-react-example app. It uses @pierre/trees to render registries/domains as a lazily-expanded file tree and uses the ENSIndexer/Omnigraph client to traverse registries and forward-resolve selected domains.

Changes:

  • Add a new /namegraph + /namegraph/:registryId route that renders a tree-based explorer for forward traversal of registry.domains → subregistry → ….
  • Introduce src/ensnode.ts to share a single ENSNode + Omnigraph client between OmnigraphProvider and imperative query calls.
  • Add @pierre/trees dependency (and lockfile updates) to support the file-tree UI.

Reviewed changes

Copilot reviewed 4 out of 5 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
pnpm-lock.yaml Locks @pierre/trees (and transitive deps) for the example app.
examples/enskit-react-example/package.json Adds @pierre/trees dependency.
examples/enskit-react-example/src/App.tsx Wires up /namegraph routes and navigation link; switches to shared client export.
examples/enskit-react-example/src/ensnode.ts New shared ENSNode + Omnigraph client module.
examples/enskit-react-example/src/NamegraphView.tsx New explorer implementation: tree model, lazy loading, pagination sentinel, and resolution panels.
Files not reviewed (1)
  • pnpm-lock.yaml: Generated file

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread examples/enskit-react-example/src/NamegraphView.tsx
Comment thread examples/enskit-react-example/src/NamegraphView.tsx
Comment thread examples/enskit-react-example/src/NamegraphView.tsx
@greptile-apps

greptile-apps Bot commented Jun 12, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

Adds an interactive Namegraph Explorer route (/namegraph/:registryId) to the enskit-react-example app. The view uses @pierre/trees as a virtualized file tree to lazily traverse the ENS namegraph forward from any Registry, with paginated domain loading, per-domain detail and forward-resolution panels, and canonical-vs-addressable name comparison.

  • NamegraphView.tsx (~1 150 lines): file-tree model management, lazy subregistry expansion via model subscriptions, scroll-triggered pagination, error-retry for failed subregistry loads (fixed since the initial PR open), and the DetailPanel / ResolutionPanels UI.
  • ensnode.ts: new module exporting the singleton EnsNodeClient shared between the React OmnigraphProvider and the imperative client.omnigraph.query(...) calls in NamegraphView.
  • App.tsx: new /namegraph redirect route and /namegraph/:registryId route; NamegraphView is keyed by registryId so the file-tree model is fully re-initialized on registry navigation.

Confidence Score: 5/5

Safe to merge — this is a self-contained new feature added only to the example app, with no changes to library or production code paths.

The change is entirely additive, isolated to the example app, and the bugs flagged in earlier review rounds (traceDurationMicros zero sentinel, KeyValueGrid duplicate-key warning, loadChildren permanent error state) are addressed in the current diff. No new defects were found during this pass.

No files require special attention. NamegraphView.tsx is the densest file but its logic is well-commented and the previously identified issues are resolved.

Important Files Changed

Filename Overview
examples/enskit-react-example/src/NamegraphView.tsx Adds the full Namegraph Explorer: lazy/paginated file-tree traversal, detail panel, and resolution panels. Previously flagged bugs (traceDurationMicros zero sentinel, KeyValueGrid label key, loadChildren retry loop) appear addressed in the current code.
examples/enskit-react-example/src/App.tsx Adds /namegraph and /namegraph/:registryId routes, extracts client + ENSNODE_URL to ensnode.ts, and wires NamegraphRootRedirect/NamegraphView.
examples/enskit-react-example/src/ensnode.ts New module exporting the singleton EnsNodeClient shared between OmnigraphProvider and the imperative Omnigraph fetches. Simple and correct.
examples/enskit-react-example/package.json Adds @pierre/trees@1.0.0-beta.4 (pre-release, which itself pulls in preact@11.0.0-beta.0). Low risk for an example app but both dependencies are pre-release.
pnpm-lock.yaml Lockfile updated for @pierre/trees and its transitive deps (preact beta). No concerns beyond the pre-release chain noted in package.json.

Sequence Diagram

sequenceDiagram
    participant U as User
    participant FT as FileTree (pierre/trees)
    participant NV as NamegraphView
    participant API as ENSNode Omnigraph

    U->>NV: Navigate to /namegraph/:registryId
    NV->>API: fetchRegistryPage(registryId, null)
    API-->>NV: "page { domains[], hasNextPage, endCursor }"
    NV->>FT: model.batch([add domain paths])
    note over FT: Subregistry domains added as directories with PLACEHOLDER child

    U->>FT: Expand a directory domain
    FT->>NV: model.subscribe fires
    NV->>NV: loadChildren(dirPath)
    NV->>API: fetchRegistryPage(subregistryId, null)
    API-->>NV: "page { domains[], hasNextPage }"
    NV->>FT: model.batch([remove placeholder, add domains])

    U->>FT: Scroll LOAD_MORE sentinel into view
    FT->>NV: renderRowDecoration(LOAD_MORE row)
    NV->>NV: queueMicrotask → triggerLoadMore(meta)
    NV->>API: fetchRegistryPage(registryId, cursor)
    API-->>NV: next page
    NV->>FT: model.batch([remove sentinel, add new domains, add new sentinel])

    U->>FT: Select a domain row
    FT->>NV: useFileTreeSelection update
    NV->>API: "client.omnigraph.query(ResolveQuery, {id})"
    API-->>NV: "resolve { profile, records, trace, acceleration }"
    NV->>U: Render DetailPanel + ResolutionPanels
Loading

Reviews (9): Last reviewed commit: "fix(examples): dedupe load-more microtas..." | Re-trigger Greptile

Comment thread examples/enskit-react-example/src/NamegraphView.tsx
Comment thread examples/enskit-react-example/src/NamegraphView.tsx
Comment thread examples/enskit-react-example/src/NamegraphView.tsx Outdated
Comment thread examples/enskit-react-example/src/NamegraphView.tsx
Replace click-to-paginate with infinite scroll: the load-more sentinel
triggers the next page from renderRowDecoration (trees' per-visible-row
callback) when it scrolls into view, guarded against re-entry while a
page is in flight.

Sort siblings by name only instead of the library's folder-first default
so name-paginated pages append below already-rendered rows; folder-first
sorted later pages' subregistry-bearing domains above the viewport,
making the tree jump on load.
Comment thread examples/enskit-react-example/src/NamegraphView.tsx
Comment thread examples/enskit-react-example/src/NamegraphView.tsx Outdated
Comment thread examples/enskit-react-example/src/NamegraphView.tsx Outdated
Comment thread examples/enskit-react-example/src/NamegraphView.tsx Outdated
Comment thread examples/enskit-react-example/src/NamegraphView.tsx Outdated

@coderabbitai coderabbitai 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.

Actionable comments posted: 1

♻️ Duplicate comments (1)
examples/enskit-react-example/src/NamegraphView.tsx (1)

280-303: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Guard nullable resolver before accessing assigned/effective.

Line 292 and Line 298 dereference resolver without a null guard. If resolver is null in any edge, mapping throws and the registry page load fails.

Suggested fix
-    const resolver = node.resolver;
+    const resolver = node.resolver;
@@
-      assignedResolver: resolver.assigned
+      assignedResolver: resolver?.assigned
         ? {
             chainId: resolver.assigned.contract.chainId,
             address: resolver.assigned.contract.address,
           }
         : null,
-      effectiveResolver: resolver.effective
+      effectiveResolver: resolver?.effective
         ? {
             chainId: resolver.effective.contract.chainId,
             address: resolver.effective.contract.address,
           }
         : null,
🤖 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 `@examples/enskit-react-example/src/NamegraphView.tsx` around lines 280 - 303,
The mapping accesses resolver.assigned and resolver.effective without null
checks which can throw when resolver is null; update the mapping that produces
assignedResolver and effectiveResolver to guard resolver (e.g., use resolver ==
null or optional-chaining) before accessing assigned/effective and their
contract fields so assignedResolver and effectiveResolver become null when
resolver is null; specifically modify the block building assignedResolver and
effectiveResolver to check resolver (and resolver.assigned/effective) first and
only read contract.chainId/contract.address when present.
🤖 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 `@examples/enskit-react-example/src/ensnode.ts`:
- Line 6: The module sets ENSNODE_URL directly from import.meta.env which delays
config validation; import Zod (e.g., z from "zod") and perform an eager parse at
module load: define a zod schema like z.string().url() (or
z.string().url().default("https://api.v2-sepolia.ensnode.io") if you want the
fallback validated) and call schema.parse(import.meta.env.VITE_ENSNODE_URL ??
undefined) to produce ENSNODE_URL, allowing the ZodError to surface immediately;
update the ENSNODE_URL export to use the validated value and let ZodError
propagate (or catch and rethrow with context) so malformed env values fail fast.

---

Duplicate comments:
In `@examples/enskit-react-example/src/NamegraphView.tsx`:
- Around line 280-303: The mapping accesses resolver.assigned and
resolver.effective without null checks which can throw when resolver is null;
update the mapping that produces assignedResolver and effectiveResolver to guard
resolver (e.g., use resolver == null or optional-chaining) before accessing
assigned/effective and their contract fields so assignedResolver and
effectiveResolver become null when resolver is null; specifically modify the
block building assignedResolver and effectiveResolver to check resolver (and
resolver.assigned/effective) first and only read
contract.chainId/contract.address when present.
🪄 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: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 4f1e6492-2464-4e2d-b91d-4ee63b43376f

📥 Commits

Reviewing files that changed from the base of the PR and between 4ecd8d9 and 91db0ae.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (4)
  • examples/enskit-react-example/package.json
  • examples/enskit-react-example/src/App.tsx
  • examples/enskit-react-example/src/NamegraphView.tsx
  • examples/enskit-react-example/src/ensnode.ts

Comment thread examples/enskit-react-example/src/ensnode.ts
…ollisions

- loadMore: show error sentinel on pagination failure (matches loadChildren)
- traceDurationMicros: return null instead of 0 when no span timing exists
- KeyValueGrid: use index keys to avoid duplicate-label collisions
- ExternalLink: restrict hrefs to http(s), add rel=noopener noreferrer
Copilot AI review requested due to automatic review settings June 12, 2026 22:22
@vercel vercel Bot temporarily deployed to Preview – ensrainbow.io June 12, 2026 22:22 Inactive
@vercel vercel Bot temporarily deployed to Preview – admin.ensnode.io June 12, 2026 22:22 Inactive
@vercel vercel Bot temporarily deployed to Preview – ensnode.io June 12, 2026 22:22 Inactive
@shrugs

shrugs commented Jun 12, 2026

Copy link
Copy Markdown
Member Author

@greptile review

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.

Pull request overview

Copilot reviewed 4 out of 5 changed files in this pull request and generated 4 comments.

Files not reviewed (1)
  • pnpm-lock.yaml: Generated file

Comment thread examples/enskit-react-example/src/NamegraphView.tsx
Comment thread examples/enskit-react-example/src/NamegraphView.tsx
Comment thread examples/enskit-react-example/src/NamegraphView.tsx Outdated
Comment thread examples/enskit-react-example/package.json

@coderabbitai coderabbitai 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.

Caution

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

⚠️ Outside diff range comments (1)
examples/enskit-react-example/src/NamegraphView.tsx (1)

1092-1092: 🩺 Stability & Availability | 🔵 Trivial | 💤 Low value

Consider handling missing root.id as an error.

If the GraphQL response succeeds but root.id is missing (e.g., API/schema change), rootId stays null and the UI shows "Loading…" indefinitely rather than an error.

🛡️ Suggested defensive check
-        setRootId(result.data?.root.id ?? null);
+        const id = result.data?.root?.id;
+        if (!id) throw new Error("Root registry id not found");
+        setRootId(id);
🤖 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 `@examples/enskit-react-example/src/NamegraphView.tsx` at line 1092, The
current assignment setRootId(result.data?.root.id ?? null) lets a successful
GraphQL response with a missing root.id leave rootId null and the UI stuck on
"Loading…"; update the response handling in NamegraphView to explicitly detect
missing result.data?.root?.id after the query and treat it as an error: call the
component's error handler / set an error state (e.g., setError or
setIsLoading(false) + setError("missing root.id")) instead of silently setting
null, and only call setRootId(...) when result.data.root.id is present. Use the
existing symbols setRootId, result.data?.root.id and rootId to locate and change
the logic.
🤖 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.

Outside diff comments:
In `@examples/enskit-react-example/src/NamegraphView.tsx`:
- Line 1092: The current assignment setRootId(result.data?.root.id ?? null) lets
a successful GraphQL response with a missing root.id leave rootId null and the
UI stuck on "Loading…"; update the response handling in NamegraphView to
explicitly detect missing result.data?.root?.id after the query and treat it as
an error: call the component's error handler / set an error state (e.g.,
setError or setIsLoading(false) + setError("missing root.id")) instead of
silently setting null, and only call setRootId(...) when result.data.root.id is
present. Use the existing symbols setRootId, result.data?.root.id and rootId to
locate and change the logic.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 45c90fa0-928a-433a-8cda-0a93ca201f4e

📥 Commits

Reviewing files that changed from the base of the PR and between 91db0ae and 804b623.

📒 Files selected for processing (1)
  • examples/enskit-react-example/src/NamegraphView.tsx

…prettyUrl

- fetchRegistryPage: throw on null registry instead of rendering an empty tree
- loadChildren: only mark a dir loaded after the domain/subregistry guard
- prettyUrl: case-insensitive scheme strip, matching the ExternalLink guard
@vercel vercel Bot temporarily deployed to Preview – admin.ensnode.io June 12, 2026 22:32 Inactive
@vercel vercel Bot temporarily deployed to Preview – ensrainbow.io June 12, 2026 22:32 Inactive
@vercel vercel Bot temporarily deployed to Preview – ensnode.io June 12, 2026 22:32 Inactive
@shrugs

shrugs commented Jun 12, 2026

Copy link
Copy Markdown
Member Author

@greptile review

Comment thread examples/enskit-react-example/src/NamegraphView.tsx
Comment thread examples/enskit-react-example/src/NamegraphView.tsx
- loadChildren: mark a dir loaded only on success, drop a stale error sentinel
  on re-entry, and on failure collapse + re-queue the dir so a manual re-expand
  retries (collapsing first avoids a retry storm from the model subscription)
- add a banner explaining the page + ensnode.ts are a vibe-coded demo of enskit
  + the Omnigraph + ensskills
Copilot AI review requested due to automatic review settings June 12, 2026 22:50
@vercel vercel Bot temporarily deployed to Preview – ensrainbow.io June 12, 2026 22:50 Inactive
@vercel vercel Bot temporarily deployed to Preview – admin.ensnode.io June 12, 2026 22:50 Inactive
@vercel vercel Bot temporarily deployed to Preview – ensnode.io June 12, 2026 22:50 Inactive
@shrugs

shrugs commented Jun 12, 2026

Copy link
Copy Markdown
Member Author

@greptile review

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.

Pull request overview

Copilot reviewed 4 out of 5 changed files in this pull request and generated 3 comments.

Files not reviewed (1)
  • pnpm-lock.yaml: Generated file

Comment thread examples/enskit-react-example/src/NamegraphView.tsx
Comment thread examples/enskit-react-example/src/NamegraphView.tsx
Comment thread examples/enskit-react-example/src/NamegraphView.tsx
- renderRowDecoration: don't schedule a load-more microtask while that page is
  already in flight
- initial registry load: show an empty sentinel for a zero-domain root, matching
  the subregistry loader
@vercel vercel Bot temporarily deployed to Preview – ensrainbow.io June 12, 2026 23:13 Inactive
@vercel vercel Bot temporarily deployed to Preview – admin.ensnode.io June 12, 2026 23:13 Inactive
@vercel vercel Bot temporarily deployed to Preview – ensnode.io June 12, 2026 23:13 Inactive
@shrugs

shrugs commented Jun 12, 2026

Copy link
Copy Markdown
Member Author

@greptile review

@shrugs shrugs merged commit 602c3cd into main Jun 13, 2026
20 checks passed
@shrugs shrugs deleted the examples/namegraph-explorer branch June 13, 2026 15:29
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.

2 participants