Skip to content

feat(console): bind NyxID bots and load Ornn skills - #3654

Merged
AbigailDeng merged 8 commits into
feat/2026-08-04_workflow-activity-vnextfrom
feat/2026-09-17_nyxid-channel-binding
Sep 17, 2026
Merged

AbigailDeng merged 8 commits into
feat/2026-08-04_workflow-activity-vnextfrom
feat/2026-09-17_nyxid-channel-binding

Conversation

@AbigailDeng

@AbigailDeng AbigailDeng commented Sep 17, 2026

Copy link
Copy Markdown
Contributor

Problem and Result

Channels still provisioned Telegram credentials inside Aevatar. This change implements the approved NyxID-first flow: add a bot in NyxID, refresh the inventory, bind an available bot, and open its existing Manage/detail page once the binding is confirmed. The bound bot also remains accessible from the inventory table.

  • Use a static illustrated three-step guide with equal emphasis, a prominent NyxID link and no current-progress state. Match the approved Figma's DM Sans typography, continuous white surface, spacing, buttons and table separators.
  • Display bound and unbound bots. The Binding column offers Bind for available unbound bots; bound registrations show Bound and Manage.
  • Share the binding/editing form and reuse the existing identity, service picker, loading and notification components. Binding has no Bot Token or editable Channel name. Editing retains the real NyxID Label from inventory rather than the detail endpoint's placeholder.
  • Load owned/shared skills through the current NyxID session and the Ornn private skill-search proxy. The dropdown contains server search, descriptions, pagination and an external Create new skill link with a return-and-refresh tooltip. The refresh icon is inside the popup, at the right of Available in Ornn; refreshing preserves selection and keeps the dropdown open. Keyboard search, selection and dismissal work.
  • Use Refactor channel registration around NyxID channel bots #3652's narrow adoption/detail/update contract. An accepted write is confirmed through inventory or a newer matching detail version before success. Successful binding navigates to the observed registration's existing Manage/detail page using its real registration ID; acceptance alone does not navigate. Delayed and uncertain writes do not allow duplicate submission or expose a Check again control.
  • Explain insecure_webhook_base_url as a server callback configuration failure, retaining the chosen skill and services without retrying the write or showing success.
  • Remove retired Telegram provisioning/runtime-config modules and update the channel specifications. Move the existing auth route classifier out of app.tsx because Umi rejects its export as a runtime plugin key; authentication behavior is unchanged.
  • Align the route contract test with the new Bind and Edit routes and the removed Telegram creation route. Fix CI tooltip boundary violations in Chat actor controls and Team work orders by reusing AevatarTooltip; keep the boundary guard unchanged.
  • Render channel empty-value dashes as Unicode string characters instead of HTML text entities so the copy audit does not misclassify them as untranslated English; the displayed character is unchanged.
  • Narrow the existing login redirect options on their own flow discriminator before reading service-review resources, fixing the CI type error without changing authorization behavior.

Backend and Live Verification

The required contract was merged into feature/integrate by #3653. During verification the remote server initially returned HTTP 200 with legacy fields (default_skill_name, no binding_status), which the new decoder rejected. The UI now identifies this unavailable contract without inventing binding states or showing an empty-success inventory.

The remote deployment subsequently exposed the new inventory and exact registration GET/POST routes. In the existing Chrome session, the frontend connected to the configured remote APIs and displayed 9 real bots: 8 bound, 1 unbound. Verified the binding form, real Ornn skill search, keyboard selection, refresh retention, NyxID service choices, and existing channel detail/edit loading with the real Label. Inspected desktop (1440px) and mobile (375px) screenshots, including mobile table scrolling and form actions. No production bot or service grant was mutated; write confirmation and uncertain-write behavior are covered by focused tests.

The server callback configuration rejection 400 insecure_webhook_base_url is tracked in #3656, assigned to @louis4li. The captured request contains exactly the four documented public inputs: nyx_channel_bot_id, skill_name, authorization_mode and service_ids. The backend validates its own callback origin before adoption; webhook_base_url is not frontend input. The UI attributes this failure to server configuration instead of suggesting that Skill or Services are incorrect.

The user's latest live screenshots show an accepted Bind followed by a bound registration visible on its Manage page. They also exposed the incorrect automatic return to the inventory, which this PR corrects. The new automatic success destination is verified by the focused route integration test. No production binding was replayed during this correction.

Frontend-only scope: apps/aevatar-console-web. Base: feat/2026-08-04_workflow-activity-vnext. Related: #3652, #3656. There is no mock inventory, local backend, credential-provisioning fallback or separate token store.

Local Verification

Commands run from apps/aevatar-console-web unless specified otherwise.

Scope selection, from repository root:

python3 ~/.codex/skills/frontend-incremental-pr/scripts/frontend_change_scope.py --repo . --base origin/feat/2026-08-04_workflow-activity-vnext

The initial implementation passed 9 focused suites / 35 tests:

pnpm exec jest --runInBand --runTestsByPath src/shared/api/channelsApi.test.ts src/shared/api/channelSkillsApi.test.ts src/shared/api/channelServicesApi.test.ts src/shared/api/channelBotsApi.test.ts src/pages/workflow-activity-vnext/channels/ChannelsPage.test.tsx src/pages/workflow-activity-vnext/channels/ChannelEditPage.test.tsx src/pages/workflow-activity-vnext/channels/ChannelIdentity.test.tsx src/pages/workflow-activity-vnext/channels/ChannelAuthorizedServices.test.tsx src/app.test.tsx

After the live-contract and design corrections, the affected suites passed 5 suites / 14 tests, exit 0, including the new legacy-contract regression and expanded skill search/description/refresh flow:

pnpm exec jest --runInBand --runTestsByPath src/shared/api/channelsApi.test.ts src/pages/workflow-activity-vnext/channels/ChannelsPage.test.tsx src/pages/workflow-activity-vnext/channels/ChannelEditPage.test.tsx src/pages/workflow-activity-vnext/channels/ChannelIdentity.test.tsx src/pages/workflow-activity-vnext/channels/ChannelAuthorizedServices.test.tsx

Changed-file static checks passed. Initial implementation: 23 files; correction: 13 files.

pnpm exec biome check config/routes.ts src/app.test.tsx src/app.tsx src/locales/channelMessages.en-US.ts src/locales/channelMessages.zh-CN.ts src/pages/workflow-activity-vnext/channels/ChannelAuthorizedServices.test.tsx src/pages/workflow-activity-vnext/channels/ChannelConfigurationPage.tsx src/pages/workflow-activity-vnext/channels/ChannelDetailsPage.tsx src/pages/workflow-activity-vnext/channels/ChannelEditPage.test.tsx src/pages/workflow-activity-vnext/channels/ChannelIdentity.test.tsx src/pages/workflow-activity-vnext/channels/ChannelSkillField.tsx src/pages/workflow-activity-vnext/channels/ChannelsPage.test.tsx src/pages/workflow-activity-vnext/channels/ChannelsPage.tsx src/pages/workflow-activity-vnext/channels/presentation.tsx src/pages/workflow-activity-vnext/channels/queries.ts src/pages/workflow-activity-vnext/channels/styles.ts src/pages/workflow-activity-vnext/index.tsx src/pages/workflow-activity-vnext/navigation.ts src/shared/api/channelsApi.test.ts src/shared/api/channelsApi.ts src/shared/api/channelSkillsApi.test.ts src/shared/api/channelSkillsApi.ts src/shared/auth/routeAccess.ts

pnpm exec biome check package.json src/locales/channelMessages.en-US.ts src/locales/channelMessages.zh-CN.ts src/shared/api/channelsApi.ts src/shared/api/channelsApi.test.ts src/pages/workflow-activity-vnext/channels/styles.ts src/pages/workflow-activity-vnext/channels/connectionStyles.ts src/pages/workflow-activity-vnext/channels/ChannelsPage.tsx src/pages/workflow-activity-vnext/channels/ChannelsPage.test.tsx src/pages/workflow-activity-vnext/channels/presentation.tsx src/pages/workflow-activity-vnext/channels/ChannelConfigurationPage.tsx src/pages/workflow-activity-vnext/channels/ChannelSkillField.tsx src/pages/workflow-activity-vnext/channels/ChannelEditPage.test.tsx

After moving Refresh into the dropdown header, the existing binding/editing suite passed 1 suite / 3 tests. Its refresh assertion now checks that the popup stays open and the selected skill remains. Focused commands:

pnpm exec jest --runInBand --runTestsByPath src/pages/workflow-activity-vnext/channels/ChannelEditPage.test.tsx
pnpm exec biome check src/pages/workflow-activity-vnext/channels/ChannelSkillField.tsx src/pages/workflow-activity-vnext/channels/ChannelEditPage.test.tsx src/pages/workflow-activity-vnext/channels/styles.ts src/pages/workflow-activity-vnext/channels/connectionStyles.ts

The callback-configuration error regression passed 2 suites / 7 tests. It checks the exact four-field request, one POST only, retained choices, the server-specific error, and no success notification or navigation. Changed-file static checks passed for all four affected TypeScript files:

pnpm exec jest --runInBand --runTestsByPath src/shared/api/channelsApi.test.ts src/pages/workflow-activity-vnext/channels/ChannelEditPage.test.tsx
pnpm exec biome check src/pages/workflow-activity-vnext/channels/ChannelConfigurationPage.tsx src/pages/workflow-activity-vnext/channels/ChannelEditPage.test.tsx src/locales/channelMessages.en-US.ts src/locales/channelMessages.zh-CN.ts

The successful-binding destination correction passed 1 suite / 4 tests. The route integration test verifies no success navigation on acceptance, then exactly one redirect to the observed registration's detail page after bound inventory. Existing edit, configuration-error and uncertain-write cases also passed:

pnpm exec jest --runInBand --runTestsByPath src/pages/workflow-activity-vnext/channels/ChannelEditPage.test.tsx
pnpm exec biome check src/pages/workflow-activity-vnext/channels/ChannelConfigurationPage.tsx src/pages/workflow-activity-vnext/channels/ChannelEditPage.test.tsx

CI exposed a stale Telegram route assertion and existing tooltip-adapter bypasses in Chat and Team surfaces. The focused route/guard and affected component suites passed 4 suites / 24 tests after correction, and static checks passed for all three changed files:

pnpm exec jest --runInBand --runTestsByPath src/routesConfig.test.ts src/shared/ui/AevatarTooltipImportGuard.test.ts src/pages/chat/ChatActorControls.test.tsx src/pages/teams/tabs/TeamWorkOrdersTab.test.tsx
pnpm exec biome check src/routesConfig.test.ts src/pages/chat/ChatActorControls.tsx src/pages/teams/tabs/TeamWorkOrdersTab.tsx

The empty-value dash correction passed 2 suites / 11 tests, including the console copy audit and channel list integration tests:

pnpm exec jest --runInBand --runTestsByPath src/locales/hardcodedCopyAudit.test.ts src/pages/workflow-activity-vnext/channels/ChannelsPage.test.tsx
pnpm exec biome check src/pages/workflow-activity-vnext/channels/ChannelsPage.tsx

The CI type-narrowing correction passed the existing auth client suite, 1 suite / 17 tests, covering sign-in, exact review resources, callbacks, refresh and error recovery:

pnpm exec jest --runInBand --runTestsByPath src/shared/auth/client.test.ts
pnpm exec biome check src/shared/auth/client.ts

Scope selection for each follow-up increment, from repository root:

python3 ~/.codex/skills/frontend-incremental-pr/scripts/frontend_change_scope.py --repo . --base HEAD

Repository guards and whitespace checks passed:

# Repository root; system Python 3.9 cannot parse the guard's union annotations.
PATH=/opt/homebrew/opt/python@3.12/libexec/bin:$PATH bash tools/ci/test_stability_guards.sh
git diff --check

Added the pinned @fontsource-variable/dm-sans@5.3.0 font with scoped Channels styling. The development server compiles and runs against the configured remote services at http://localhost:5197.

Full frontend verification passed in GitHub CI run 35188983347 for fba2ce180c32be833c035aa45b11cbee5330708d: all four frontend test shards passed, totaling 195 suites / 1,929 tests. Typecheck, production build, workflow canvas benchmark and fast gates also passed; all eight active checks succeeded. Backend jobs were skipped by the workflow's changed-path rules. Full checks ran in GitHub CI under the personal incremental-validation policy, with only focused checks run locally. No reliable repository-native affected typecheck is available.

Design Baseline

Design baseline:
  apps/aevatar-console-web/docs/design-baselines/workflow-activity-vnext/
Primary design:
  aevatar-workflow-activity-vnext.excalidraw
Design SHA-256:
  30e74d7b410ae72c4c91432355436679033679c54c10b1702908435b001577de
Contract specification:
  apps/aevatar-console-web/docs/superpowers/specs/
  2026-08-04-workflow-activity-vnext-design.md
User paths:
  apps/aevatar-console-web/docs/superpowers/specs/
  2026-08-04-workflow-activity-vnext-user-paths.md
Authentication and localization:
  Existing Aevatar login, callback, session, returnTo, and Umi locale logic.
Production data source:
  Real APIs and API-acknowledged user actions only; no mock fallback.
Channels supplement:
  Approved Figma FaVJx5IZeQX9jHcUi55ndB, page 6:182;
  2026-09-17-channel-bot-adoption.md; backend issue #3652.

@AbigailDeng
AbigailDeng merged commit dae3e45 into feat/2026-08-04_workflow-activity-vnext Sep 17, 2026
17 checks passed
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.

1 participant