Skip to content

feat(ui-web): draw the wizard's agents step with the agent hub's rows - #587

Merged
gloryfromca merged 5 commits into
refactor/ui_web_architecturefrom
feat/onboard_agents_hub_step
Sep 21, 2026
Merged

gloryfromca merged 5 commits into
refactor/ui_web_architecturefrom
feat/onboard_agents_hub_step

Conversation

@0xKT

@0xKT 0xKT commented Sep 21, 2026 •

Copy link
Copy Markdown
Member

Summary

Draws the onboarding wizard's agents step with the Agent Hub's rows. #559
took the agents page to the hub prototype but left the wizard's third step on
the old settings page's two-bucket rows, with classifiers of its own and a
toast for a refused connect -- two looks and two classifications for the
same roster.

The hub's row, its one control, the dot and the section block move out of
ExtAgentsPage.tsx into Rows.tsx, and the wizard draws them in two of the
hub's three sections -- available first, then connected -- from the hub's own
sectionOf. So a refusal stays on the row in red with Retry, a connect in
flight says so on the row, and a stale preset asks the hub's question before
it migrates. The one new seam is onOpen: the page passes the sheet opener,
the wizard passes nothing and gets a plain row.

What stays the wizard's, as decided for #523: no sheet (a step is a
decision, not a roster to manage), no "not installed" section and no openai
row, and the step counts itself done on an external agent alone, so the
shipped ravens are drawn as connected without completing it. One classifier
now: wizardSection narrows sectionOf and isFound reads it; the
wizard-only predicates and toast verbs are gone with their tests. The
wizard's duplicate section labels leave the catalogue for the hub's identical
ones, and the TUI copy is regenerated. In the class-namespace gate the
extAgents pin drops to the one .pmhero the page still writes: .kd and
.sulist were the old step's alone, and nothing names them now.

Connectivity itself is untouched: the adapter pins, the probe and the
credentials an agent needs are the sub-agents module's, and the step inherits
whatever lands there through the same subagents.* calls.

Type

  • Fix
  • Feature
  • Docs
  • CI / tooling
  • Refactor
  • Other

Verification

cd ui-web && npm test            # 190 files, 2549 tests passed (40 gates included)
cd ui-web && npm run type-check  # clean
cd ui-web && npm run lint        # 0 errors
cd ui-web && node scripts/check-class-namespace.mjs   # OK
cd ui-web && npm run build && python3 build.py        # boot goldens 251/252 match
cd ui-web && npm run gen:check                        # generated.ts matches the contract
npm run lint:i18n --prefix ui-tui                     # generated catalogue up to date

Real host: a fresh RAVEN_HOME served from this branch, walked with playwright
to the agents step -- the two sections drawn with the hub's rows (Claude Code
and Codex available with their catalogue lines, the four shipped ravens
connected), rows without a button role, Connect on Claude Code showing
"connecting" on the row and then landing (the adapter pin on the base is
current now), the step's primary lighting up; the hub page opened beside it
draws the same rows in its three sections.

Base merge (refactor/ui_web_architecture at ccd32f9, one merge commit on
this branch): npm test 189 files / 2471 tests, type-check, lint, the class
gate, build + build.py (boot goldens 235 nodes), gen:check and lint:i18n
all green; the real-host walk repeated on the merged head with the same
result, and Codex shows the disabled Unauthorized control after the re-scan
(the base's #595 stage, carried by the shared rows).

  • Relevant tests pass locally
  • Relevant lint / type checks pass locally
  • User-facing docs or screenshots are updated when needed

Risk

  • Security impact considered
  • Backward compatibility considered
  • Rollback path is clear for risky changes

Behaviour changes, wizard only: a refused connect is red text on the row with
Retry rather than a toast, and -- the hub store keeping failures per row --
that row stays red on the agents page too until the next write on it; a
preset the probe has not measured yet is offered like the hub offers it; a
connected row counts towards the step whatever its probe says; a shim preset
whose binary is absent is out of the step (the hub's "not installed"). The
agents page is unchanged in markup and behaviour except that only a row that
opens the sheet shows the hand cursor and the hover. Rollback is reverting
the squash commit; no config or wire change.

Related Issues

N/A

0xKT and others added 3 commits September 21, 2026 14:51
The row, its one control, the dot and the section block move from
ExtAgentsPage.tsx into Rows.tsx so a second caller can draw them. The page
draws the same markup as before; the one new seam is `onOpen`, the click a
row answers with -- the page passes the sheet opener, and a caller that
passes nothing gets a plain row with no button role and no focus stop.

Co-authored-by: Claude (claude-fable-5-1) <noreply@anthropic.com>
The onboarding wizard's third step kept the two-bucket rows of the old
settings page after the agents page moved to the hub prototype, with its own
classifiers and a toast for a refused connect. It now draws the hub's rows
in two of the hub's three sections -- available first, then connected --
from the hub's own `sectionOf`, so a refusal stays on the row in red with
Retry and a stale row asks the same question before it migrates. What stays
the wizard's: no sheet (a step is a decision, not a roster), no "not
installed" section and no openai row, and the step counts itself done on an
external agent alone, as the prototype does.

One classifier now: `wizardSection` narrows `sectionOf`, `isFound` reads it,
and the wizard-only predicates and toast verbs are gone with their tests.
The wizard's duplicate section labels leave the catalogue for the hub's
identical ones; `.kd` moves from the shared pins to connections' own, its
one remaining reader.

Co-authored-by: Claude (claude-fable-5-1) <noreply@anthropic.com>
…tep counts

A row without a sheet to open kept the hand cursor and the hover the page's
rows have, from rules on the row class alone; both now follow the button
role that only an opening row carries. Rows.tsx keeps to itself the five
pieces nothing outside it reads, the step body's header names its two
sections in the order they are drawn, and isFound says that a connected row
counts whatever its probe reports -- the reading sectionOf already made,
which also stops a verdict lost over a re-scan from flipping the step back
to not done.

Co-authored-by: Claude (claude-fable-5-1) <noreply@anthropic.com>
@0xKT
0xKT requested a review from gloryfromca September 21, 2026 07:20

@gloryfromca gloryfromca left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No blockers; suggestions only, and they are marked inline.

I reviewed the full target diff, the onboarding wiring and completion/import callers, the Agent Hub extraction, and the relevant history. I also checked AGENTS.md, CLAUDE.md, CONTEXT-MAP.md, ui-web/CONTEXT.md, and ui-web/CONTRIBUTING.md for source-language, naming, layering, rendering, CSS, i18n, and test constraints. The intended wizard-only behavior changes are coherent, and the Agent Hub path retains its existing behavior.

Backward compatibility found one narrow legacy-gateway edge, marked inline. I checked the removed tests for weakening: coverage was expanded for the shared rows and failure/retry path, but the deleted mid-build case is the compatibility gap noted inline.

Verification on this head:

  • cd ui-web && npm test: 190 files, 2,548 tests passed
  • cd ui-web && npm run type-check: passed
  • cd ui-web && npm run lint: passed with 5 pre-existing warnings and 0 errors
  • npm run lint:i18n --prefix ui-tui: passed
  • node ui-web/scripts/check-class-namespace.mjs: passed
  • uv run python scripts/check_source_language.py github/refactor/ui_web_architecture...HEAD: passed

This can merge as-is; the inline item can be handled as a compatibility follow-up.

Comment thread ui-web/src/features/extAgents/source.ts
The rewrite dropped the exclusion the old predicate carried for an older
gateway's build-in-flight flag, so the step filed such a row under available
with an active Connect whose shared handler falls through to a toggle on an
install that is not finished. wizardSection returns null for it again, and
the table has the row back.

Co-authored-by: Claude (claude-fable-5-1) <noreply@anthropic.com>
@0xKT

0xKT commented Sep 21, 2026

Copy link
Copy Markdown
Member Author

Thanks for the review. Verdict on the inline item, and what changed.

ID Verdict Where Change
R1 a build in flight reached the wizard's available section accept ui-web/src/features/extAgents/source.ts (wizardSection) The rewrite dropped the !row.building exclusion the old predicate carried, so on an older gateway reporting building: true the step drew an active Connect whose shared handler falls through to subagents.toggle. wizardSection now returns null for row.building, the way it does for the built-in loop, an openai endpoint and a command the machine has not got; the source test's table has the mid-build row back (sectionOf files it under available, the wizard shows nothing, isFound is false).

Left where it is, as the module's: the hub page itself draws Connect for that row too (RowControl has no branch for the building stage since #559), which is the same compatibility-only edge on the page side; noted for the sub-agents module pass rather than widened into this PR.

Verify:

cd ui-web && npx vitest run src/features/extAgents src/features/onboard scripts/gates
# 47 files, 273 passed, including "a preset mid-build on an older server"

@gloryfromca gloryfromca left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No blockers; this can merge as far as I am concerned.

The new commit resolves the prior mid-build compatibility finding: wizardSection excludes building rows again, isFound follows that result, and the regression table now proves the Agent Hub still classifies the row as available while the wizard omits it.

I reviewed the revision delta and rechecked the full target diff, affected callers, history, backward compatibility, test changes, and the repository's documented Web UI architecture and source rules. No other behavior changed from the previously reviewed revision, and I found no new issue.

Verification on 13ed251bf2f5:

  • cd ui-web && npm test: 190 files, 2,549 tests passed
  • cd ui-web && npm run type-check: passed
  • cd ui-web && npm run lint: 0 errors; 5 pre-existing warnings
  • i18n generation, class-namespace, source-language, and git diff --check: passed

…hub_step

The base moved under the branch. #595 gave the agent rows an unauthorized
stage, inside the row control this branch lifts into Rows.tsx and the
wizard row it deletes, so the control's new branch is ported into Rows.tsx
and the wizard step's test gets the refused-row case in its own idiom; the
source test keeps the stageOf import the base's new cases read. #591
recounted the class-namespace pins: connections no longer names `.kd`, so
with the wizard step off `.kd` and `.sulist` nothing names them, and the
extAgents pin drops to the one `.pmhero` that remains.

Co-authored-by: Claude (claude-fable-5-1) <noreply@anthropic.com>

@gloryfromca gloryfromca left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No blockers; this can merge as far as I am concerned.

The base-refresh merge preserves the target branch unauthorized-agent behavior in the extracted shared rows, adds coverage for it in the wizard, and retains the earlier building-state compatibility fix. I found no new defect.

Covered: the full target diff; the merge resolution against both parents; affected wizard and Agent Hub callers; relevant history and backward compatibility; test changes for weakening; and the repository AGENTS.md, CLAUDE.md, CONTEXT*.md, source-language, and component-architecture constraints.

Verification: npm test (189 files, 2,471 tests passed; expected happy-dom aborted-fetch noise), npm run type-check (passed), npm run lint (passed with four pre-existing warnings in untouched files), npm run lint:i18n --prefix ui-tui, node ui-web/scripts/check-class-namespace.mjs, and uv run python scripts/check_source_language.py github/refactor/ui_web_architecture...HEAD (all passed).

@gloryfromca
gloryfromca merged commit bdce28d into refactor/ui_web_architecture Sep 21, 2026
26 checks passed
@gloryfromca
gloryfromca deleted the feat/onboard_agents_hub_step branch September 21, 2026 13:09
gloryfromca pushed a commit that referenced this pull request Sep 21, 2026
…#587)

Draws the onboarding wizard's agents step with the Agent Hub's rows.
took the agents page to the hub prototype but left the wizard's third
step on
the old settings page's two-bucket rows, with classifiers of its own and
a
toast for a refused connect -- two looks and two classifications for the
same roster.

The hub's row, its one control, the dot and the section block move out
of
`ExtAgentsPage.tsx` into `Rows.tsx`, and the wizard draws them in two of
the
hub's three sections -- available first, then connected -- from the
hub's own
`sectionOf`. So a refusal stays on the row in red with Retry, a connect
in
flight says so on the row, and a stale preset asks the hub's question
before
it migrates. The one new seam is `onOpen`: the page passes the sheet
opener,
the wizard passes nothing and gets a plain row.

What stays the wizard's, as decided for #523: no sheet (a step is a
decision, not a roster to manage), no "not installed" section and no
openai
row, and the step counts itself done on an external agent alone, so the
shipped ravens are drawn as connected without completing it. One
classifier
now: `wizardSection` narrows `sectionOf` and `isFound` reads it; the
wizard-only predicates and toast verbs are gone with their tests. The
wizard's duplicate section labels leave the catalogue for the hub's
identical
ones, and the TUI copy is regenerated. In the class-namespace gate the
extAgents pin drops to the one `.pmhero` the page still writes: `.kd`
and
`.sulist` were the old step's alone, and nothing names them now.

Connectivity itself is untouched: the adapter pins, the probe and the
credentials an agent needs are the sub-agents module's, and the step
inherits
whatever lands there through the same `subagents.*` calls.

- [ ] Fix
- [x] Feature
- [ ] Docs
- [ ] CI / tooling
- [ ] Refactor
- [ ] Other

```
cd ui-web && npm test            # 190 files, 2549 tests passed (40 gates included)
cd ui-web && npm run type-check  # clean
cd ui-web && npm run lint        # 0 errors
cd ui-web && node scripts/check-class-namespace.mjs   # OK
cd ui-web && npm run build && python3 build.py        # boot goldens 251/252 match
cd ui-web && npm run gen:check                        # generated.ts matches the contract
npm run lint:i18n --prefix ui-tui                     # generated catalogue up to date
```

Real host: a fresh RAVEN_HOME served from this branch, walked with
playwright
to the agents step -- the two sections drawn with the hub's rows (Claude
Code
and Codex available with their catalogue lines, the four shipped ravens
connected), rows without a button role, Connect on Claude Code showing
"connecting" on the row and then landing (the adapter pin on the base is
current now), the step's primary lighting up; the hub page opened beside
it
draws the same rows in its three sections.

Base merge (refactor/ui_web_architecture at ccd32f9, one merge commit
on
this branch): npm test 189 files / 2471 tests, type-check, lint, the
class
gate, build + build.py (boot goldens 235 nodes), gen:check and lint:i18n
all green; the real-host walk repeated on the merged head with the same
result, and Codex shows the disabled Unauthorized control after the
re-scan
(the base's #595 stage, carried by the shared rows).

- [x] Relevant tests pass locally
- [x] Relevant lint / type checks pass locally
- [ ] User-facing docs or screenshots are updated when needed

- [x] Security impact considered
- [x] Backward compatibility considered
- [x] Rollback path is clear for risky changes

Behaviour changes, wizard only: a refused connect is red text on the row
with
Retry rather than a toast, and -- the hub store keeping failures per row
--
that row stays red on the agents page too until the next write on it; a
preset the probe has not measured yet is offered like the hub offers it;
a
connected row counts towards the step whatever its probe says; a shim
preset
whose binary is absent is out of the step (the hub's "not installed").
The
agents page is unchanged in markup and behaviour except that only a row
that
opens the sheet shows the hand cursor and the hover. Rollback is
reverting
the squash commit; no config or wire change.

N/A

---------

Co-authored-by: Claude (claude-fable-5-1) <noreply@anthropic.com>
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