Context. surface admin · domain isis · route /isis/comfy-nodes · auth signed-in (admin) · source apps/oshun/admin/src/app/isis/comfy-nodes/page.tsx
Last walked. —
Purpose#
ComfyUI node-registry browser (§24.3): lists every registered node type with its
schema, deprecation flag, alternative-node suggestion, and the workflow classes
that reference it (a "used by" report). Pairs with isis-workflow-editor.md
which composes graphs against this registry.
Entry points#
- Direct URL —
/isis/comfy-nodes - External runbooks / deep links to the Isis ops admin area
- Not in canonical IA — no sidebar entry
Layout regions#
The page does NOT wrap the body in AdminShell. Server entry resolves the node
list via binding (set by bindNodeRegistryLoader) and renders
<ComfyNodesPanel nodes={nodes} />:
- ComfyNodesPanel —
<main>with a 300px aside + 1fr detail:- Aside / Filter (
aria-label="Filter"):- h2 "Nodes (
<filtered.length>)" - Search input —
data-field="search", placeholderclassType / display / category; filters by lowercase match onclassType/displayName/category - "Show deprecated" checkbox —
data-field="showDeprecated"; when off, deprecated nodes hidden - Node list (
<ul data-testid="node-list">) — each<li>isrole="button"withtabIndex={0}; clicking or Enter setsselectedIdx
- h2 "Nodes (
- Detail pane — schema / deprecation / alternative-node suggestion / "used by" workflow-class ids for the selected node
- Aside / Filter (
States#
- Anonymous → global middleware redirects (this route is NOT in
PUBLIC_PATHS) - Binding not set →
binding ? await binding() : []returns[]; panel renders empty list - Binding bound, registry populated → list renders; first entry selected
- Query trims to empty → all (non-deprecated) nodes
- Query non-empty → case-insensitive substring match across classType / displayName / category
- Show-deprecated toggle off →
deprecated === truenodes filtered out -
selectedIdxoverflows filtered length → clamped to last entry;selectedfalls back to null when filtered is empty
Interactions#
- Search input —
<input type="text" data-field="search">- Function: updates
querystate; re-derivesfiltered
- Function: updates
- "Show deprecated" checkbox —
data-field="showDeprecated"- Function: toggles
showDeprecatedstate
- Function: toggles
- Node list item (
<li role="button" tabIndex={0}>)- Function: sets
selectedIdx; Enter key activates
- Function: sets
- Detail-pane interactions inside the selected node view (read from the panel source if exposed; the visible code shows selection only)
Data & contracts#
- Reads:
binding()returnsreadonly NodeRegistryItem[]— each item{ definition: NodeDefinition, deprecated: boolean, alternativeClassType: string | null, usedByWorkflowClassIds: readonly string[] }. Production binding wires@yemaya/comfyui-integrationexports - Writes: None visible at page level. The browser is read-only
- Realtime: None.
- Auth/role check: only the global middleware
Cross-references#
- Shell:
shell/02-routing-layouts.md - Sibling route:
isis-workflow-editor.md(consumes node registry to build workflow classes) - Library:
@yemaya/comfyui-integration—NodeDefinition - Component source:
apps/oshun/admin/src/app/isis/comfy-nodes/ComfyNodesPanel.tsx
Open questions / known gaps#
-
bindNodeRegistryLoaderis module-level mutable state; document where production binding happens - No session / scope check at the page level
- Confirm whether the registry browser has write affordances (mark deprecated, edit alternative-node suggestion) anywhere beyond the visible read-only list