Portal command pages¶
The portal (hadronmemory.com) has a family of command pages — form-and-result or list views that give the CLI's operational commands a point-and-click surface, for people who don't reach for the terminal.
Reach a command page two ways:
- The ⌘K command bar — press ⌘K (or Ctrl K), type the command name, and pick it from the list.
- A direct URL —
/app/commands/<id>(e.g./app/commands/access-check).
Every command page shares the same chrome: a breadcrumb
(Commands → <command>), a title, and a short description. All
strings route through the portal's localization layer, so the pages
are translation-ready.
Command pages come in two shapes:
- Form pages take inputs, submit, and render a result inline (Check access, Merge node, Merge memory).
- List pages render a searchable read-only table (List tasks).
The four pages below mirror the same server operations the CLI and GraphQL API expose, so a result is identical whichever surface you drive it from.
Check access¶
/app/commands/access-check · ⌘K: "access check", "check
access"
Audits a principal's effective access to a resource — the portal
front-end for the CLI
hadron access check (GraphQL
effectiveAccess).
Inputs
- User — a
@handle, anhrn:user:<handle>URN, or a user id. Defaults to the signed-in user, so a one-click submit answers "what can I access?" - Resource — a fully-qualified
hrn:<type>:URN (memory, node, agent, app, org, or user) or an AI-service-config id.
Output
- A capability matrix — READ / WRITE / MANAGE / DELETE, each ✓ or ✗.
- The highest role the principal holds on the resource.
- A Grants table explaining why: each row is a grant with its
source(e.g.PUBLIC_VISIBILITY,ORG_ROLE), theroleit confers, and theviapath it travels.
Permissions — you can always check your own access. Checking another user requires being able to see the resource (today that means an admin/owner of it; broadening is tracked upstream in hadron-server#364). A disallowed audit shows a friendly message, not an error.
Merge node¶
/app/commands/merge-node · ⌘K: "merge node", "merge"
Folds a source node into a target node (the survivor). Backs
the GraphQL mergeNodes mutation (see the
GraphQL API reference).
Inputs
- Source and Target — a node id or
hrn:node:…URN each. - Fields to merge — a multiselect over Content, Abstract, Description, Tags, Data, Properties, Edges. Everything selected merges the whole node; narrow it to fold only some fields.
- Delete the source after merging — a checkbox.
Behavior — text fields (content, abstract, description)
concatenate target-first; tags take the union; data and
properties shallow-merge with the target winning on key
collisions; edges re-point from the source onto the target. The
result links to the surviving node.
Permissions — write access to the target, plus the source when you're deleting it or moving its edges.
Merge memory¶
/app/commands/merge-memory · ⌘K: "merge memory"
Empties a source memory into a target memory. Backs the
GraphQL mergeMemories mutation (see the
GraphQL API reference).
Inputs
- Source and Target — a memory id or
hrn:memory:…URN each. - Collision fold strategy — the same field multiselect as Merge
node. It applies to source nodes whose
loccollides with an existing target node (each is folded by the Merge-node rules); non-colliding nodes move over unchanged,locpreserved. - Delete the source memory after merging — a checkbox.
Permissions — write access to both memories. Deleting the
source additionally requires being its owner (for a personal/private
memory) or an org admin. The v1 of this operation rejects encrypted
memories and the system/app memory classes.
List tasks¶
/app/commands/list-tasks · ⌘K: "list tasks", "tasks"
The read/list shape — no form. Lists every runnable node
(Node.isRunnable = true) across the memories you can access, in a
searchable table; clicking a row opens that node. Backed by
nodes(isRunnable: true) — the same predicate behind
hadron node ls --runnable and the
gate for hadron task run.
See also¶
- hadron CLI — the scriptable equivalents of these operations.
- Surfaces: MCP, CLI, and the portal — what each surface is for and which to reach for.
- GraphQL API — the
effectiveAccess,mergeNodes,mergeMemories, andnodesoperations these pages call.