Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
203 commits
Select commit Hold shift + click to select a range
892a0f9
Document workflow activity vNext baseline
AbigailDeng Aug 4, 2026
19ddbdc
Document workflow activity vNext user paths
AbigailDeng Aug 4, 2026
9909a7e
Clarify vNext auth and localization reuse
AbigailDeng Aug 4, 2026
9fec431
Harden vNext design baseline verification
AbigailDeng Aug 4, 2026
8bfac95
Document vNext draft materialization paths
AbigailDeng Aug 4, 2026
fad9adf
Implement Workflow Activity vNext (#3189)
AbigailDeng Aug 6, 2026
3416817
Skip vNext baseline coverage quality
AbigailDeng Aug 6, 2026
083b594
Fix Settings save action dock (#3235)
AbigailDeng Aug 6, 2026
deb529a
Distinguish duplicate workflows in the catalogue (#3233)
AbigailDeng Aug 6, 2026
4fad793
Complete editor test run flow (#3236)
AbigailDeng Aug 6, 2026
7261549
Keep new workflow setup recoverable (#3234)
AbigailDeng Aug 6, 2026
81ecf05
Map backend failures to actionable Workflow Activity toasts (#3232)
AbigailDeng Aug 6, 2026
0bffed1
Improve editor save and publish readiness feedback (#3241)
AbigailDeng Aug 6, 2026
aa86b23
Redesign Account as the authoritative identity surface (#3237)
AbigailDeng Aug 6, 2026
b1060ae
Preserve workflow context in Activity (#3238)
AbigailDeng Aug 6, 2026
34c1336
Refine Workflow catalogue metadata hierarchy (#3257)
AbigailDeng Aug 6, 2026
f518661
Hide redundant raw node configuration (#3258)
AbigailDeng Aug 6, 2026
121f013
Fix new workflow creation UX (#3256)
AbigailDeng Aug 6, 2026
63dd36e
Fix Workflow catalogue action hierarchy (#3255)
AbigailDeng Aug 6, 2026
3fe15fa
Restore workflow name in Describe creation (#3263)
AbigailDeng Aug 6, 2026
5c97a0f
Add Workflow archive lifecycle (#3264)
AbigailDeng Aug 6, 2026
70ddb63
Merge remote-tracking branch 'origin/dev' into feat/2026-08-04_workfl…
AbigailDeng Aug 6, 2026
20b7e71
Use toast for transient frontend errors (#3261)
AbigailDeng Aug 6, 2026
7df714f
Fix published workflow Run flow (#3270)
AbigailDeng Aug 6, 2026
552c2e6
Fix Add node sequential placement (#3271)
AbigailDeng Aug 6, 2026
b454db1
Add skeletons to primary console loading states (#3272)
AbigailDeng Aug 6, 2026
e858472
Add skeletons to vNext primary lists (#3275)
AbigailDeng Aug 6, 2026
8295f79
Fix workflow rename persistence and node reselection (#3269)
AbigailDeng Aug 6, 2026
48be765
Standardize Workflow Activity failure toasts (#3274)
AbigailDeng Aug 6, 2026
dd22b8f
Separate Workflow rename, draft delete, and archive actions (#3279)
AbigailDeng Aug 7, 2026
cac6251
Show backend run source in Activity (#3239)
AbigailDeng Aug 7, 2026
2889e65
Use backend workflow catalogue in Workflow Activity (#3288)
AbigailDeng Aug 7, 2026
b8e0eae
Fix workflow draft filtering and refresh loading (#3291)
AbigailDeng Aug 7, 2026
be74bab
Remove save location loading notice (#3294)
AbigailDeng Aug 7, 2026
d2bebe6
Fix workflow publication observation (#3335)
AbigailDeng Aug 10, 2026
0cea91c
Fix published workflow Run readiness (#3386)
AbigailDeng Aug 10, 2026
62b82f6
Make frontend tests deterministic and behavior-focused (#3384)
AbigailDeng Aug 10, 2026
94c64c7
Reuse shared Studio workflow editor surface (#3276)
AbigailDeng Aug 10, 2026
0211193
Reuse shared workflow run console
AbigailDeng Aug 10, 2026
4943fdd
Restore published run file uploads
AbigailDeng Aug 10, 2026
9344c8d
Fix published run live state
AbigailDeng Aug 10, 2026
33c426d
Add resizable workflow run panels
AbigailDeng Aug 10, 2026
59de0cc
codex: fix CI failure on PR #3389
AbigailDeng Aug 10, 2026
0e2989f
codex: fix i18n CI failure on PR #3389
AbigailDeng Aug 10, 2026
5622406
Merge pull request #3389 from aevatarAI/fix/2026-08-10_reuse-workflow…
AbigailDeng Aug 10, 2026
32366e3
Fix workflow archive actions (#3391)
AbigailDeng Aug 10, 2026
a3d079d
Filter vNext LLM services without models (#3394)
AbigailDeng Aug 10, 2026
04c8226
Refine console toast presentation (#3396)
AbigailDeng Aug 10, 2026
4ea36e7
Fix workflow run logs and save action state (#3397)
AbigailDeng Aug 11, 2026
179b42a
Merge blank workflow creation into Describe (#3398)
AbigailDeng Aug 11, 2026
d91fd3e
Refresh vNext lists when returning from detail pages (#3399)
AbigailDeng Aug 11, 2026
c318ca6
Fix workflow template selection layout (#3400)
AbigailDeng Aug 11, 2026
7137462
Restore delete draft action (#3401)
AbigailDeng Aug 11, 2026
114a13d
Refine Workflow Activity settings semantics (#3411)
AbigailDeng Aug 11, 2026
a6602ed
Unify Workflow Activity account identity (#3417)
AbigailDeng Aug 11, 2026
bc30223
Preserve auth callback error details (#3435)
AbigailDeng Aug 13, 2026
74fc67e
Fix workflow catalogue removal observation (#3433)
AbigailDeng Aug 13, 2026
1151649
Preserve vNext browser auth principal (#3436)
AbigailDeng Aug 13, 2026
b48186a
Respect auth-me profile authority (#3445)
AbigailDeng Aug 13, 2026
9518a65
Allow empty published workflow runs (#3434)
AbigailDeng Aug 13, 2026
6b0ecfd
Clarify draft delete refresh toast (#3441)
AbigailDeng Aug 13, 2026
d65f11a
Use authoritative Workflow Activity contracts (#3412)
AbigailDeng Aug 13, 2026
bc2a140
Align workflow catalogue service identity (#3456)
AbigailDeng Aug 14, 2026
b34ebf0
Match activity run detail to published runs (#3454)
AbigailDeng Aug 14, 2026
cdb4872
Align workflow title before saving (#3462)
AbigailDeng Aug 14, 2026
027d616
Expose archived workflow catalogue view (#3494)
AbigailDeng Aug 18, 2026
b0914b2
Add vNext workflow template browser and visual previews (#3495)
AbigailDeng Aug 21, 2026
bbb3ed3
Unify workflow template tooltips (#3509)
AbigailDeng Aug 24, 2026
d343bf4
Wire workflow-scoped Schedule management (#3498)
AbigailDeng Aug 27, 2026
80bce2e
Clarify workflow publication failures (#3548)
AbigailDeng Aug 31, 2026
31de432
Document workflow vNext home navigation
AbigailDeng Aug 31, 2026
6d2c957
Make workflow vNext the console home
AbigailDeng Aug 31, 2026
2080e2f
Complete workflow vNext home delivery plan
AbigailDeng Aug 31, 2026
594612a
Merge pull request #3563 from aevatarAI/feat/2026-08-31_workflow-vnex…
AbigailDeng Sep 1, 2026
cf4d2cc
Fix stale published run status
AbigailDeng Sep 2, 2026
a3d029f
Merge workflow activity vNext base
AbigailDeng Sep 2, 2026
bb5ec50
Document guided workflow configuration
AbigailDeng Sep 2, 2026
c3522d7
Plan guided workflow configuration
AbigailDeng Sep 2, 2026
cea9c7b
Expose workflow capability guidance endpoints
AbigailDeng Sep 2, 2026
2d0a973
Add typed workflow capability client
AbigailDeng Sep 2, 2026
9390488
Preserve workflow capability in inspector drafts
AbigailDeng Sep 2, 2026
4b2878e
Merge pull request #3570 from aevatarAI/fix/2026-09-02_published-run-…
AbigailDeng Sep 2, 2026
db87449
Model guided tool call inputs
AbigailDeng Sep 2, 2026
1271d0d
Guide external tool call configuration
AbigailDeng Sep 2, 2026
f3d2fbf
Refine guided workflow action configuration
AbigailDeng Sep 2, 2026
263d3a0
Fix workflow capability decoder typing
AbigailDeng Sep 2, 2026
e892e90
Constrain workflow configuration guidance to frontend
AbigailDeng Sep 3, 2026
996f80d
Keep workflow configuration guidance frontend-only
AbigailDeng Sep 3, 2026
62cff25
Harden workflow inspector guidance
AbigailDeng Sep 3, 2026
2478085
Add structured tool argument editing
AbigailDeng Sep 3, 2026
72e42d5
Document NyxID review return route design
AbigailDeng Sep 3, 2026
d94618f
Declare react-intl test dependency
AbigailDeng Sep 3, 2026
fffbd37
Fix NyxID review return routing
AbigailDeng Sep 3, 2026
0ebd569
Document workflow canvas scaling
AbigailDeng Sep 3, 2026
04f57d3
Merge pull request #3579 from aevatarAI/fix/2026-09-03_nyxid-review-r…
AbigailDeng Sep 3, 2026
bdddd5f
codex: fix CI failure on PR #3574
AbigailDeng Sep 3, 2026
082b1b8
Plan workflow canvas scaling
AbigailDeng Sep 3, 2026
d24ad54
Preserve graph element references
AbigailDeng Sep 3, 2026
0443ea7
Complete graph reference reconciliation
AbigailDeng Sep 3, 2026
619eb2c
codex: fix build target compatibility on PR #3574
AbigailDeng Sep 3, 2026
0db0be2
Harden graph reconciliation contracts
AbigailDeng Sep 3, 2026
0380178
Constrain graph reconciliation inference
AbigailDeng Sep 3, 2026
e350e3b
Fix live run node tracking
AbigailDeng Sep 3, 2026
c5e81bc
Optimize shared workflow canvas rendering
AbigailDeng Sep 3, 2026
7f1a363
Merge pull request #3574 from aevatarAI/feat/2026-09-02_workflow-conf…
AbigailDeng Sep 3, 2026
0aedd82
Document live node presentation
AbigailDeng Sep 3, 2026
42a7baf
Fix Studio canvas fit eligibility
AbigailDeng Sep 3, 2026
1f42bec
Preserve live node presentation
AbigailDeng Sep 3, 2026
84b9097
Fix Studio canvas topology synchronization
AbigailDeng Sep 3, 2026
058c833
Define upfront workflow node presentation
AbigailDeng Sep 3, 2026
5c5dc2e
Plan upfront workflow node presentation
AbigailDeng Sep 3, 2026
d8e8ea6
Fix Studio canvas navigation boundaries
AbigailDeng Sep 3, 2026
9b48245
Show submitted workflow nodes up front
AbigailDeng Sep 3, 2026
3dc542b
Stabilize workflow canvas wrappers
AbigailDeng Sep 3, 2026
16797e7
Skip unnecessary workflow auto layout
AbigailDeng Sep 3, 2026
2ddcbf2
Avoid saved workflow layout collisions
AbigailDeng Sep 3, 2026
296b28a
Harden workflow layout position maps
AbigailDeng Sep 3, 2026
aa014a7
Preserve duplicate workflow auto positions
AbigailDeng Sep 3, 2026
cf89aab
Reuse unchanged run graph elements
AbigailDeng Sep 3, 2026
bb5b217
Add workflow canvas scale benchmark
AbigailDeng Sep 3, 2026
aeacb04
Harden workflow canvas benchmark interactions
AbigailDeng Sep 3, 2026
fa92b6b
Fix workflow canvas benchmark evidence
AbigailDeng Sep 3, 2026
5a4963c
Clarify benchmark initialization geometry
AbigailDeng Sep 3, 2026
35daf71
Format workflow graph helpers
AbigailDeng Sep 3, 2026
491e90a
Correct workflow canvas benchmark semantics
AbigailDeng Sep 4, 2026
4a8af11
codex: fix CI failure on PR #3580
AbigailDeng Sep 4, 2026
66e0537
Accumulate benchmark reference changes
AbigailDeng Sep 4, 2026
6f75ccf
Keep canvas labels in sync with locale
AbigailDeng Sep 4, 2026
e875a1a
Merge remote-tracking branch 'origin/feat/2026-08-04_workflow-activit…
AbigailDeng Sep 4, 2026
0f99991
Align canvas benchmark with supported Node versions
AbigailDeng Sep 4, 2026
03d8eff
codex: stabilize CI test on PR #3580
AbigailDeng Sep 4, 2026
225ef77
Merge pull request #3580 from aevatarAI/fix/2026-09-03_live-run-node-…
AbigailDeng Sep 4, 2026
54711ae
Fix locale catalog route test typing
AbigailDeng Sep 14, 2026
c7f0a4e
Fix workflow home scope and frontend coverage routing
AbigailDeng Sep 14, 2026
95757d9
Fix benchmark localization and run-console focus regressions
Sep 14, 2026
decff64
Add channel directory and connection details
AbigailDeng Sep 14, 2026
6d5bd2a
Add Telegram connection form with explicit service selection
AbigailDeng Sep 14, 2026
7ada900
Correct canvas benchmark gestures and measurement accounting
Sep 14, 2026
5dba0b7
Refine channel action buttons and link NyxID details
AbigailDeng Sep 14, 2026
e8399de
Default optional Telegram names and restore connection retries
AbigailDeng Sep 14, 2026
dec8ad4
Stop automatic refreshes on Channels pages
AbigailDeng Sep 14, 2026
cbc1968
Merge pull request #3622 from aevatarAI/feat/2026-09-14_channel-setti…
AbigailDeng Sep 14, 2026
30818c7
Resolve console home from the authenticated scope
AbigailDeng Sep 14, 2026
e263334
fix: Filter channel services by current NyxID grants
AbigailDeng Sep 14, 2026
b61aabe
Merge pull request #3623 from aevatarAI/fix/2026-09-14_console-sessio…
AbigailDeng Sep 15, 2026
2490f26
fix: Show Telegram and WhatsApp in channel directory
AbigailDeng Sep 15, 2026
04951ec
Merge branch 'fix/2026-09-15_channel-service-grants' into fix/2026-09…
AbigailDeng Sep 15, 2026
2fc56ed
fix: Include authorized model services in channel grants
AbigailDeng Sep 15, 2026
0f1a196
fix: Center channel pages within the content area
AbigailDeng Sep 15, 2026
37fa7f5
fix: Use channel labels across connection and management pages
AbigailDeng Sep 15, 2026
97b70d3
Merge pull request #3624 from aevatarAI/fix/2026-09-15_channel-servic…
AbigailDeng Sep 15, 2026
f9ffe12
fix: Use supported role query options in channel tests
AbigailDeng Sep 15, 2026
a872943
fix: Reveal complete channel identifiers in tooltips
AbigailDeng Sep 15, 2026
9208650
Merge pull request #3626 from aevatarAI/fix/2026-09-15_channel-platfo…
AbigailDeng Sep 15, 2026
9ba0709
test: Keep channel tooltip fixture compatible with naming changes
AbigailDeng Sep 15, 2026
6e3b47e
fix: Add six random digits to default channel names
AbigailDeng Sep 15, 2026
51df710
Merge workflow activity base and fix CI tests
AbigailDeng Sep 15, 2026
6ac1400
Clarify workflow generation and mutation feedback
AbigailDeng Sep 15, 2026
bd76730
fix: Partition console CI tests and narrow editor queries
AbigailDeng Sep 15, 2026
33f8200
Merge latest workflow activity base
AbigailDeng Sep 15, 2026
1f4d5f2
Fix workflow feedback validation failures
AbigailDeng Sep 15, 2026
71c838f
Merge pull request #3630 from aevatarAI/fix/2026-09-15_channel-id-too…
AbigailDeng Sep 15, 2026
537625b
Merge pull request #3632 from aevatarAI/fix/2026-09-15_channel-defaul…
AbigailDeng Sep 15, 2026
e3d7b3c
Merge latest workflow activity baseline and resolve channel form conf…
AbigailDeng Sep 15, 2026
14dee8e
Merge latest workflow activity changes and resolve locale conflicts
AbigailDeng Sep 15, 2026
10c6a83
Merge pull request #3581 from aevatarAI/feat/2026-09-03_workflow-canv…
AbigailDeng Sep 15, 2026
4d5bc66
Merge pull request #3633 from aevatarAI/fix/2026-09-15_workflow-opera…
AbigailDeng Sep 15, 2026
40cbac7
Restore optional Telegram skill name input
AbigailDeng Sep 15, 2026
0ae9800
Merge latest workflow activity changes and preserve home messages
AbigailDeng Sep 15, 2026
f27ffe2
Use the standard refresh button on Channels
AbigailDeng Sep 15, 2026
81249d5
Show channel authorizations and acknowledge connection requests
AbigailDeng Sep 15, 2026
6728033
Merge pull request #3635 from aevatarAI/fix/2026-09-15_restore-channe…
AbigailDeng Sep 15, 2026
e4bf75a
Make Studio member binding regression deterministic
AbigailDeng Sep 15, 2026
e7fecdb
Merge pull request #3621 from aevatarAI/fix/2026-09-14_workflow-home-…
AbigailDeng Sep 15, 2026
839ebdb
Add channel runtime editor with shared connection controls
AbigailDeng Sep 15, 2026
2129739
Remove advanced settings from channel editor
AbigailDeng Sep 15, 2026
da6f11e
Simplify channel authorized service labels
AbigailDeng Sep 15, 2026
83f53da
Move channel detail actions to the top toolbar
AbigailDeng Sep 15, 2026
02c35ab
Show loading over the connected channels table during refresh
AbigailDeng Sep 15, 2026
828f9e0
Merge pull request #3638 from aevatarAI/feat/2026-09-15_channel-runti…
AbigailDeng Sep 16, 2026
0004614
Merge pull request #3640 from aevatarAI/fix/2026-09-15_channel-refres…
AbigailDeng Sep 16, 2026
0df6ca3
Merge pull request #3639 from aevatarAI/fix/2026-09-15_channel-servic…
AbigailDeng Sep 16, 2026
8035793
Merge latest workflow activity changes into frontend CI fix
AbigailDeng Sep 16, 2026
629bcea
Fix channel editor save completion flow
AbigailDeng Sep 16, 2026
abb9392
Merge pull request #3645 from aevatarAI/fix/2026-09-16_channel-edit-f…
AbigailDeng Sep 16, 2026
6797a2b
Merge pull request #3634 from aevatarAI/fix/2026-09-15_console-test-t…
AbigailDeng Sep 16, 2026
8007774
Restore Telegram creation success details
AbigailDeng Sep 16, 2026
beaff28
Merge pull request #3646 from aevatarAI/fix/2026-09-16_telegram-conne…
AbigailDeng Sep 16, 2026
b2163f8
fix(channels): limit editing to label and skill name
AbigailDeng Sep 16, 2026
d09c8a0
fix(channels): reuse the shared tooltip in channel details
AbigailDeng Sep 16, 2026
3dfb85f
Merge pull request #3647 from aevatarAI/fix/2026-09-16_channel-edit-n…
AbigailDeng Sep 16, 2026
6254a41
Merge dev into workflow activity vNext
AbigailDeng Sep 16, 2026
277cf59
Add NyxID bot binding and Ornn skill selection
AbigailDeng Sep 17, 2026
4ffa440
Fix channel binding design and live contract feedback
AbigailDeng Sep 17, 2026
df22b62
Move skill refresh into the dropdown header
AbigailDeng Sep 17, 2026
39d3bb0
Explain server callback configuration failures during binding
AbigailDeng Sep 17, 2026
8ae7a68
Open channel details after confirmed bot binding
AbigailDeng Sep 17, 2026
bb8fd84
Fix route and tooltip CI failures for channel binding
AbigailDeng Sep 17, 2026
92d9c6c
Render channel empty values without HTML text entities
AbigailDeng Sep 17, 2026
fba2ce1
Narrow service access review options before reading resources
AbigailDeng Sep 17, 2026
dae3e45
Merge pull request #3654 from aevatarAI/feat/2026-09-17_nyxid-channel…
AbigailDeng Sep 17, 2026
ab00a81
fix(console): require channel Ornn and LLM services
AbigailDeng Sep 17, 2026
c408d07
Merge pull request #3658 from aevatarAI/fix/2026-09-17_channel-requir…
AbigailDeng Sep 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
87 changes: 75 additions & 12 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ jobs:
runs-on: ubuntu-latest
outputs:
docs_only: ${{ steps.docs_only_route.outputs.docs_only }}
frontend_only: ${{ steps.docs_only_route.outputs.frontend_only }}
all_changed: ${{ steps.filter.outputs.all_changed }}
core_code: ${{ steps.filter.outputs.core_code }}
product_runtime: ${{ steps.filter.outputs.product_runtime }}
Expand Down Expand Up @@ -130,18 +131,29 @@ jobs:
console_web:
- 'apps/aevatar-console-web/**'
- '.github/workflows/ci.yml'
frontend_paths:
- 'apps/aevatar-console-web/**'

- name: Resolve Doc-Only Route
- name: Resolve Change Scope
id: docs_only_route
env:
ALL_CHANGED_COUNT: ${{ steps.filter.outputs.all_changed_count }}
DOCS_ONLY_COUNT: ${{ steps.filter.outputs.docs_only_count }}
FRONTEND_CHANGED_COUNT: ${{ steps.filter.outputs.frontend_paths_count }}
run: |
if [ "${ALL_CHANGED_COUNT:-0}" != "0" ] && [ "${ALL_CHANGED_COUNT:-0}" = "${DOCS_ONLY_COUNT:-0}" ]; then
echo "docs_only=true" >> "$GITHUB_OUTPUT"
else
echo "docs_only=false" >> "$GITHUB_OUTPUT"
fi
if [ "${ALL_CHANGED_COUNT:-0}" != "0" ] && [ "${ALL_CHANGED_COUNT:-0}" = "${FRONTEND_CHANGED_COUNT:-0}" ]; then
echo "frontend_only=true" >> "$GITHUB_OUTPUT"
else
echo "frontend_only=false" >> "$GITHUB_OUTPUT"
fi

- name: Verify Change Scope Routing
run: python3 tools/ci/tests/test_ci_change_scope.py

fkst-host-policy:
if: |
Expand Down Expand Up @@ -233,19 +245,54 @@ jobs:
- name: Test Stability Guards
run: bash tools/ci/test_stability_guards.sh

console-web-tests:
if: needs.changes.outputs.docs_only == 'false' && needs.changes.outputs.console_web == 'true'
needs: changes
runs-on: ubuntu-latest
timeout-minutes: 35
strategy:
fail-fast: false
matrix:
shard: [1, 2, 3, 4]
steps:
- uses: actions/checkout@v4

- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: 10.2.1
run_install: false

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 20
cache: pnpm
cache-dependency-path: apps/aevatar-console-web/pnpm-lock.yaml

- name: Install console-web dependencies
run: pnpm --dir apps/aevatar-console-web install --frozen-lockfile

- name: Test console-web shard
run: pnpm --dir apps/aevatar-console-web test --runInBand --shard=${{ matrix.shard }}/4

console-web:
# Refactor (iter16/cluster-ci-systemic-refactor):
# Old pattern: console-web skipped scheduled CI and ran for every PR, workflow_dispatch, main/dev push, or console_web changes
# New principle: gate on changes.outputs.console_web per Phase 9 #716 r3 consensus A
if: needs.changes.outputs.docs_only == 'false' && needs.changes.outputs.console_web == 'true'
needs: changes
# Keep the existing required check name and fail it if any test shard fails
# or is cancelled. All tests run once across the four Jest partitions.
if: always() && needs.changes.outputs.docs_only == 'false' && needs.changes.outputs.console_web == 'true'
needs: [changes, console-web-tests]
runs-on: ubuntu-latest
# The serial suite grew into this budget: recent runs took 19m02s, 19m35s,
# 19m57s, then 20m10s and 20m17s, the last two cancelled mid-test at the
# 20m cap. The ~18m of test work is real, so give it headroom rather than
# letting every run decide the build on runner jitter.
timeout-minutes: 35
# Retain the base branch's budget for typecheck, build, and canvas benchmark.
timeout-minutes: 45
steps:
- name: Require all console-web test shards
env:
TEST_SHARDS_RESULT: ${{ needs.console-web-tests.result }}
run: test "$TEST_SHARDS_RESULT" = success

- uses: actions/checkout@v4

- name: Setup pnpm
Expand All @@ -267,12 +314,22 @@ jobs:
- name: Type-check console-web
run: pnpm --dir apps/aevatar-console-web tsc

- name: Test console-web
run: pnpm --dir apps/aevatar-console-web test --runInBand

- name: Build console-web
env:
AEVATAR_WORKFLOW_CANVAS_BENCHMARK: '1'
run: pnpm --dir apps/aevatar-console-web build

- name: Benchmark workflow canvas
run: pnpm --dir apps/aevatar-console-web benchmark:workflow-canvas

- name: Upload workflow canvas benchmark
if: always()
uses: actions/upload-artifact@v4
with:
name: workflow-canvas-benchmark
path: apps/aevatar-console-web/artifacts/workflow-canvas-benchmark
if-no-files-found: warn

slow-test-guards:
needs: changes
# Refactor (iter18/cluster-019-strict-coverage-aevatar-slnx):
Expand Down Expand Up @@ -388,11 +445,17 @@ jobs:
# Old pattern: coverage_quality_guard.sh 吞 test fail 继续 emit coverage;split-test-guards 漏跑 22 orphan project
# New principle: strict-coverage fail-fast(不吞 fail);aevatar.slnx-or-slow-test 唯一测试权威;
# retire slnf 测试执行(只保留 slnf build boundary);slow-tests 独立 CI job
# Frontend-only PRs do not need backend coverage, regardless of their target branch.
# Mixed changes and changes to CI/build infrastructure retain this gate.
if: |
github.event_name == 'schedule' ||
github.event_name == 'workflow_dispatch' ||
(github.event_name == 'push' && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/dev')) ||
needs.changes.outputs.docs_only == 'false'
(
github.event_name == 'pull_request' &&
needs.changes.outputs.frontend_only != 'true' &&
needs.changes.outputs.docs_only == 'false'
)
runs-on: ubuntu-latest
# Full coverage takes 34-35 minutes after a roughly 10-minute restore/build,
# then still needs time to upload the report. Keep the fail-fast guard while
Expand Down
106 changes: 106 additions & 0 deletions apps/aevatar-console-web/AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,58 @@ pnpm --dir apps/aevatar-console-web build
- Do not add or preserve hidden `/teams/:scopeId...` compatibility routes.
Parse paths by resource name, not by fragile segment indexes.

## Workflow Activity vNext Baseline

- Before changing any route, page, component, hook, query, adapter, model,
style, locale, or test for
`/scopes/:scopeId/workflow-activity-vnext`, read all three of these sources
completely:
`docs/design-baselines/workflow-activity-vnext/README.md` and
`docs/superpowers/specs/2026-08-04-workflow-activity-vnext-design.md` and
`docs/superpowers/specs/2026-08-04-workflow-activity-vnext-user-paths.md`.
- Treat
`docs/design-baselines/workflow-activity-vnext/aevatar-workflow-activity-vnext.excalidraw`
as the primary visual, information-architecture, and interaction reference.
Treat the design specification as the normative route, product identity,
API, state, and backend-compatibility contract. Treat the user-path
specification as the normative journey, decision, recovery, and completion
evidence contract.
- The PNG and HTML prototypes are reference artifacts, not runtime data
sources. Never copy their hard-coded records, `localStorage` persistence,
timers, simulated receipts, or successful-looking defaults into production
code.
- Production remote state must come from real API responses or real user
actions acknowledged by those APIs. When an API is pending, empty,
unavailable, delayed, or failed, render that exact state; do not insert mock
or fixture fallback data.
- Keep mock and fixture data in clearly named test-only files. Production
routes, components, hooks, queries, and API adapters must not import them.
- Reuse the existing protected-route, `/login`, `/auth/callback`,
`NyxIDAuthClient`, sanitized `returnTo`, session restoration, sign-in,
sign-out, and service-access review behavior. Do not create a vNext auth
route, provider, callback, token cache, session store, or identity fallback.
- Reuse the existing Umi locale configuration, `ConsoleLanguageSwitch`,
`getLocale`/`setLocale`, message helpers, and `en-US`/`zh-CN` catalogues. Add
every new vNext message to both catalogues; do not create a vNext locale
context, storage key, or hard-coded visible-copy path.
- Login, callback, language, and account presentation may adopt the vNext
visual system, but auth, redirect, callback, session, language, persistence,
error, and accessibility behavior must remain unchanged. If vNext hides the
global header, reuse its existing language/account actions inside the local
shell rather than cloning their logic.
- Include the design-baseline declaration from
`docs/design-baselines/workflow-activity-vnext/README.md` in every vNext
implementation task and pull request so the Excalidraw hash, contract
documents, user paths, and real-API-only data-source rule are reviewable.
- Run
`python3 docs/design-baselines/workflow-activity-vnext/verify-baseline.py`
from `apps/aevatar-console-web/` before and after changing the baseline. The
verifier must confirm the declared hash, deterministic generator output, and
exact 17-frame inventory.
- Keep this feature frontend-only and isolated to its new route namespace.
Do not change backend code or alter existing Workflow, Run, Settings, Studio,
Team, member, redirect, or menu behavior to implement it.

## UI and Interaction

- For page, component, console, playground, or visual-polish work, follow
Expand All @@ -148,6 +200,32 @@ pnpm --dir apps/aevatar-console-web build
magic values.
- Treat the console as an operational tool: prioritize scannability, clear
hierarchy, predictable navigation, and efficient repeated actions.
- Every visible title or heading must add distinct orientation, resource
identity, current-state, or task meaning. Do not repeat the same noun at the
modal/drawer shell and content levels, and do not add helper copy that merely
paraphrases an adjacent heading. Prefer one resource-owned container title;
add a nested heading only when it names a genuinely different state, view,
or user task.
- Scope asynchronous loading feedback to the data region owned by the query or
command. Keep committed sibling regions mounted and usable, preserving their
selection and scroll position when they are not being reloaded. Use a
whole-workspace loading state only when the initiating operation actually
invalidates or blocks the whole workspace.
- Reuse the shared loading language instead of composing page-local spinners or
indicator cards: use `AevatarContentSkeleton` for an initial structured data
surface, `AevatarLoadingOverlay` when a command temporarily blocks committed
content, and `AevatarLoadingDots` only for compact inline progress.
- Default user-facing surfaces must show only information needed to understand
the current task, result, or next action. Do not expose backend architecture,
transport, storage, or consistency terminology such as `read model`,
`projection`, `materialization`, `receipt`, raw actor/command/correlation
identifiers, state versions/watermarks, DTO or endpoint names, or query
sampling limits in page titles, descriptions, helper copy, primary tables,
empty states, or primary error messages. Preserve truthful loading, accepted,
delayed, and failed semantics in plain product language. When raw values are
genuinely useful for support or debugging, place them behind an explicit,
user-opened technical-details disclosure instead of making them the default
interface.
- Preserve responsive behavior, keyboard access, focus visibility, semantic
controls, and readable contrast. Verify dense real content and narrow mobile
widths without overlap, clipping, or inaccessible actions.
Expand All @@ -157,6 +235,34 @@ pnpm --dir apps/aevatar-console-web build
- Use established icon libraries and control patterns. Add accessible names or
tooltips for icon-only or unfamiliar actions.

### Action Feedback and Toasts

- Use the shared `ConsoleToastProvider` and `useConsoleToast` from
`src/shared/ui/ConsoleToast.tsx` for transient user-action feedback. Do not
introduce new direct `antd` `message` or `notification` calls inside React
product surfaces. Non-React transport error boundaries retain their existing
handling unless the boundary receives a deliberate React-safe migration.
- A success toast is evidence of a completed user-visible action, not of a
click, request dispatch, `202 Accepted` response, local optimistic update,
or background observation still in progress. Show it only after the API
contract has reached the state the copy claims.
- Keep a toast short, localized, and action-oriented. Do not put endpoint
names, DTO fields, request IDs, raw backend errors, or recovery diagnostics
in it; expose those through the surface's existing technical-details path.
- Report transient API request failures through the shared error toast. Do not
add page-wide warning or error banners above otherwise usable content, and
do not render an error while another request required to classify the same
state is still pending.
- Use persistent inline state, alerts, or panels for loading, accepted,
observing, delayed, retryable, authorization, forbidden, and primary-content
failures where the user needs a durable next step. A toast must not be the
only evidence of a durable status or recovery action.
- Emit at most one toast for one user action. Avoid success toasts for local
form edits that still require an explicit page-level save. Migrate touched
user-feedback paths to the shared abstraction while preserving legacy
behavior outside the requested surface unless a deliberate migration is in
scope.

## Change and Review Hygiene

- Branch names use `<type>/YYYY-MM-DD_<purpose>`, where `<type>` is one of
Expand Down
16 changes: 11 additions & 5 deletions apps/aevatar-console-web/config/config.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
// https://umijs.org/config/

import { defineConfig } from '@umijs/max';
import { aevatarThemeConfig } from '../src/shared/ui/aevatarWorkbench';
import defaultSettings from './defaultSettings';
import proxy from './proxy';
import { aevatarThemeConfig } from '../src/shared/ui/aevatarWorkbench';

import routes from './routes';

Expand All @@ -15,7 +15,9 @@ function resolvePublicPath(value?: string): string {
return '/';
}

const rootRelative = normalized.startsWith('/') ? normalized : `/${normalized}`;
const rootRelative = normalized.startsWith('/')
? normalized
: `/${normalized}`;
return rootRelative.endsWith('/') ? rootRelative : `${rootRelative}/`;
}

Expand Down Expand Up @@ -157,20 +159,24 @@ const config: ReturnType<typeof defineConfig> = defineConfig({
define: {
'process.env.CI': JSON.stringify(process.env.CI),
'process.env.NYXID_BASE_URL': JSON.stringify(process.env.NYXID_BASE_URL),
'process.env.NYXID_CLIENT_ID': JSON.stringify(
process.env.NYXID_CLIENT_ID,
),
'process.env.NYXID_CLIENT_ID': JSON.stringify(process.env.NYXID_CLIENT_ID),
'process.env.NYXID_REDIRECT_URI': JSON.stringify(
process.env.NYXID_REDIRECT_URI,
),
'process.env.NYXID_SCOPE': JSON.stringify(process.env.NYXID_SCOPE),
'process.env.AEVATAR_CHANNEL_WEBHOOK_BASE_URL': JSON.stringify(
process.env.AEVATAR_CHANNEL_WEBHOOK_BASE_URL,
),
'process.env.ORNN_BASE_URL': JSON.stringify(process.env.ORNN_BASE_URL),
'process.env.AEVATAR_CONSOLE_TEAM_FIRST_ENABLED': JSON.stringify(
process.env.AEVATAR_CONSOLE_TEAM_FIRST_ENABLED,
),
'process.env.AEVATAR_CONSOLE_PUBLIC_PATH': JSON.stringify(
process.env.AEVATAR_CONSOLE_PUBLIC_PATH,
),
'process.env.AEVATAR_WORKFLOW_CANVAS_BENCHMARK': JSON.stringify(
process.env.AEVATAR_WORKFLOW_CANVAS_BENCHMARK,
),
},
});

Expand Down
Loading
Loading