Admin Cockpit · Surface walkthrough

Isis ops · ComfyUI nodes

A per-surface walkthrough of the Admin Cockpit admin surface: layout, states, interactions, data, and cross-references.

drafted
8sections2 minread

On this page

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 inputdata-field="search", placeholder classType / display / category; filters by lowercase match on classType / displayName / category
      • "Show deprecated" checkboxdata-field="showDeprecated"; when off, deprecated nodes hidden
      • Node list (<ul data-testid="node-list">) — each <li> is role="button" with tabIndex={0}; clicking or Enter sets selectedIdx
    • Detail pane — schema / deprecation / alternative-node suggestion / "used by" workflow-class ids for the selected node

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 === true nodes filtered out
  • selectedIdx overflows filtered length → clamped to last entry; selected falls back to null when filtered is empty

Interactions#

  • Search input<input type="text" data-field="search">
    • Function: updates query state; re-derives filtered
  • "Show deprecated" checkboxdata-field="showDeprecated"
    • Function: toggles showDeprecated state
  • Node list item (<li role="button" tabIndex={0}>)
    • Function: sets selectedIdx; Enter key activates
  • 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() returns readonly NodeRegistryItem[] — each item { definition: NodeDefinition, deprecated: boolean, alternativeClassType: string | null, usedByWorkflowClassIds: readonly string[] }. Production binding wires @yemaya/comfyui-integration exports
  • 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-integrationNodeDefinition
  • Component source: apps/oshun/admin/src/app/isis/comfy-nodes/ComfyNodesPanel.tsx

Open questions / known gaps#

  • bindNodeRegistryLoader is 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