feat(console): bind NyxID bots and load Ornn skills - #3654
Merged
AbigailDeng merged 8 commits intoSep 17, 2026
Merged
AbigailDeng merged 8 commits into
AbigailDeng merged 8 commits into
Conversation
AbigailDeng
merged commit Sep 17, 2026
dae3e45
into
feat/2026-08-04_workflow-activity-vnext
17 checks passed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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.
insecure_webhook_base_urlas a server callback configuration failure, retaining the chosen skill and services without retrying the write or showing success.app.tsxbecause Umi rejects its export as a runtime plugin key; authentication behavior is unchanged.AevatarTooltip; keep the boundary guard unchanged.flowdiscriminator 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/integrateby #3653. During verification the remote server initially returned HTTP 200 with legacy fields (default_skill_name, nobinding_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_urlis tracked in #3656, assigned to @louis4li. The captured request contains exactly the four documented public inputs:nyx_channel_bot_id,skill_name,authorization_modeandservice_ids. The backend validates its own callback origin before adoption;webhook_base_urlis 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-webunless specified otherwise.Scope selection, from repository root:
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.tsxAfter 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.tsxChanged-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.tsxAfter 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:
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:
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:
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:
The empty-value dash correction passed 2 suites / 11 tests, including the console copy audit and channel list integration tests:
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:
Scope selection for each follow-up increment, from repository root:
Repository guards and whitespace checks passed:
Added the pinned
@fontsource-variable/dm-sans@5.3.0font with scoped Channels styling. The development server compiles and runs against the configured remote services athttp://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