feat(DATAGO-130230): Inline Progress Timeline & LLM Thinking Tokens in Chat UI #2869
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
| name: "CI (UI)" | |
| on: | |
| workflow_dispatch: | |
| push: | |
| branches: | |
| - "main" | |
| pull_request: | |
| types: [opened, synchronize] | |
| branches: | |
| - "main" | |
| permissions: | |
| contents: write | |
| packages: write | |
| id-token: write | |
| pull-requests: write | |
| actions: read | |
| statuses: write | |
| checks: write | |
| repository-projects: read | |
| jobs: | |
| check-paths: | |
| name: "Check if UI files changed" | |
| runs-on: ubuntu-latest | |
| outputs: | |
| should-run: ${{ steps.filter.outputs.ui }} | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 | |
| - name: Check for UI changes | |
| uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 | |
| id: filter | |
| with: | |
| filters: | | |
| ui: | |
| - 'client/webui/frontend/**' | |
| validate-conventional-commit: | |
| name: "Validate Conventional Commit" | |
| runs-on: ubuntu-latest | |
| if: github.event_name == 'pull_request' | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 | |
| with: | |
| fetch-depth: 0 | |
| - name: Validate PR Title | |
| uses: amannn/action-semantic-pull-request@e32d7e603df1aa1ba07e981f2a23455dee596825 # v5 | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| with: | |
| types: | | |
| feat | |
| fix | |
| docs | |
| style | |
| refactor | |
| perf | |
| test | |
| build | |
| ci | |
| chore | |
| revert | |
| requireScope: false | |
| disallowScopes: | | |
| release | |
| subjectPattern: ^.+$ | |
| subjectPatternError: | | |
| The subject "{subject}" found in the pull request title "{title}" | |
| didn't match the configured pattern. Please ensure that the subject | |
| is not empty. | |
| ui-build-and-test: | |
| name: "Build and Test UI" | |
| needs: check-paths | |
| if: needs.check-paths.outputs.should-run == 'true' | |
| runs-on: ubuntu-latest | |
| defaults: | |
| run: | |
| working-directory: client/webui/frontend | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 | |
| with: | |
| fetch-depth: 0 | |
| - name: Setup Node.js | |
| uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 | |
| with: | |
| node-version: "25.5.0" | |
| cache: "npm" | |
| cache-dependency-path: client/webui/frontend/package-lock.json | |
| registry-url: https://npm.pkg.github.com/ | |
| scope: "@SolaceLabs" | |
| - name: Configure npm for install | |
| run: | | |
| echo "//npm.pkg.github.com/:_authToken=${{ secrets.GITHUB_TOKEN }}" > .npmrc | |
| echo "@SolaceLabs:registry=https://npm.pkg.github.com/" >> .npmrc | |
| echo "legacy-peer-deps=true" >> .npmrc | |
| - name: Install dependencies | |
| run: npm ci | |
| env: | |
| NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Restore Playwright Browser From Cache | |
| id: restore-playwright-cache | |
| uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 | |
| with: | |
| path: ~/.cache/ms-playwright | |
| key: playwright-${{ runner.os }}-${{ hashFiles('client/webui/frontend/package-lock.json') }} | |
| - name: Install Playwright browsers | |
| if: steps.restore-playwright-cache.outputs.cache-hit != 'true' | |
| run: ./node_modules/.bin/playwright install chromium --with-deps | |
| - name: Save Playwright cache | |
| if: steps.restore-playwright-cache.outputs.cache-hit != 'true' | |
| uses: actions/cache/save@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 | |
| with: | |
| path: ~/.cache/ms-playwright | |
| key: playwright-${{ runner.os }}-${{ hashFiles('client/webui/frontend/package-lock.json') }} | |
| - name: Run lint | |
| run: npm run lint | |
| - name: Run Storybook Tests with Coverage | |
| run: npm run ci:storybook:coverage | |
| env: | |
| # Workaround for Node.js 25 Web Storage API breaking jsdom tests | |
| # See: https://github.com/vitest-dev/vitest/issues/8757 | |
| NODE_OPTIONS: "--no-webstorage" | |
| - name: Upload UI Coverage Artifact | |
| uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 | |
| with: | |
| name: ui-coverage-standalone | |
| path: client/webui/frontend/coverage/ | |
| retention-days: 1 | |
| - name: Build UI package | |
| run: npm run build-package | |
| - name: Run WhiteSource Scan | |
| id: whitesource_scan | |
| uses: SolaceDev/solace-public-workflows/.github/actions/whitesource-scan@main | |
| continue-on-error: true | |
| with: | |
| whitesource_api_key: ${{ secrets.WHITESOURCE_API_KEY }} | |
| whitesource_product_name: "solaceai" | |
| whitesource_project_name: "solace-agent-mesh-ui${{ github.event_name == 'push' && '' || github.event_name == 'pull_request' && format('-pr-{0}', github.event.pull_request.number) || '' }}" | |
| whitesource_config_file: "client/webui/frontend/wss-unified-agent.config" | |
| target_directory: "client/webui/frontend" | |
| - name: Run WhiteSource PR Checker (Policy Violations) | |
| id: whitesource-pr-policy-violation-checker | |
| if: github.event_name == 'pull_request' | |
| uses: docker://ghcr.io/solacedev/maas-build-actions:latest | |
| continue-on-error: true | |
| env: | |
| WS_API_KEY: ${{ secrets.WHITESOURCE_API_KEY }} | |
| WS_PRODUCT_NAME: "solaceai" | |
| WS_PROJECT_NAME: "solace-agent-mesh-ui-pr-${{ github.event.pull_request.number }}" | |
| GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| AWS_REGION: ${{ secrets.AWS_DEFAULT_REGION }} | |
| AWS_ACCESS_KEY_ID: ${{ secrets.SAM_AWS_ACCESS_KEY_ID }} | |
| AWS_SECRET_ACCESS_KEY: ${{ secrets.SAM_AWS_SECRET_ACCESS_KEY }} | |
| WS_BLOCKING_POLICY_VIOLATION_LEVELS: "Major,Minor" | |
| FAIL_IF_POLICY_VIOLATIONS_FOUND: "True" | |
| GH_ORG: ${{ github.repository_owner }} | |
| GH_REPO: ${{ github.event.repository.name }} | |
| GH_SHA: ${{ github.event.pull_request.head.sha }} | |
| PR_NUMBER: ${{ github.event.pull_request.number }} | |
| INCLUDE_HELPFUL_LINKS: "False" | |
| STATUS_CHECK: "True" | |
| with: | |
| entrypoint: /bin/sh | |
| args: > | |
| -c " | |
| . $VIRTUAL_ENV/bin/activate && | |
| cd $ACTIONS_PATH/whitesource-pr-checker && | |
| python whitesource_pr_checker.py | |
| " | |
| - name: Run WhiteSource Policy Gate | |
| id: whitesource-policy-gate | |
| if: github.event_name == 'push' && github.ref_name == github.event.repository.default_branch | |
| uses: docker://ghcr.io/solacedev/maas-build-actions:latest | |
| continue-on-error: true | |
| env: | |
| WS_API_KEY: ${{ secrets.WHITESOURCE_API_KEY }} | |
| WS_PRODUCT_NAME: "solaceai" | |
| WS_PROJECT_NAME: "solace-agent-mesh-ui" | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| AWS_ACCESS_KEY_ID: ${{ secrets.SAM_AWS_ACCESS_KEY_ID }} | |
| AWS_SECRET_ACCESS_KEY: ${{ secrets.SAM_AWS_SECRET_ACCESS_KEY }} | |
| AWS_REGION: ${{ secrets.AWS_DEFAULT_REGION }} | |
| WS_BLOCKING_POLICY_VIOLATION_LEVELS: "Major,Minor" | |
| FAIL_IF_POLICY_VIOLATIONS_FOUND: "True" | |
| STATUS_CHECK: "True" | |
| GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| GH_ORG: ${{ github.repository_owner }} | |
| GH_REPO: ${{ github.event.repository.name }} | |
| GITHUB_SHA: ${{ github.sha }} | |
| with: | |
| entrypoint: /bin/sh | |
| args: > | |
| -c " | |
| . $VIRTUAL_ENV/bin/activate && | |
| cd $ACTIONS_PATH/whitesource-policy-violation-checker && | |
| python whitesource_policy_violation_checker.py | |
| " | |
| - name: Run WhiteSource Vulnerability Checker | |
| id: whitesource-vulnerability-checker | |
| if: github.event_name == 'push' && github.ref_name == github.event.repository.default_branch | |
| uses: docker://ghcr.io/solacedev/maas-build-actions:latest | |
| continue-on-error: true | |
| env: | |
| WS_API_KEY: ${{ secrets.WHITESOURCE_API_KEY }} | |
| WS_PRODUCT_NAME: "solaceai" | |
| WS_PROJECT_NAME: "solace-agent-mesh-ui" | |
| AWS_ACCESS_KEY_ID: ${{ secrets.SAM_AWS_ACCESS_KEY_ID }} | |
| AWS_SECRET_ACCESS_KEY: ${{ secrets.SAM_AWS_SECRET_ACCESS_KEY }} | |
| AWS_REGION: ${{ secrets.AWS_DEFAULT_REGION }} | |
| WS_JIRA_CHECK: "True" | |
| JIRA_ONLY: "True" | |
| STATUS_CHECK: "True" | |
| GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| GH_ORG: ${{ github.repository_owner }} | |
| GH_REPO: ${{ github.event.repository.name }} | |
| GITHUB_SHA: ${{ github.sha }} | |
| with: | |
| entrypoint: /bin/sh | |
| args: > | |
| -c " | |
| . $VIRTUAL_ENV/bin/activate && | |
| cd $ACTIONS_PATH/whitesource-vulnerability-checker && | |
| python whitesource_vulnerability_checker.py | |
| " | |
| ui-ci-status: | |
| name: "UI CI Status" | |
| runs-on: ubuntu-latest | |
| needs: [check-paths, ui-build-and-test] | |
| if: always() | |
| steps: | |
| - name: Check build status | |
| run: | | |
| if [[ "${{ needs.check-paths.outputs.should-run }}" == "false" ]]; then | |
| echo "UI files not changed, skipping UI build and tests" | |
| exit 0 | |
| elif [[ "${{ needs.ui-build-and-test.result }}" == "success" ]]; then | |
| echo "UI build/tests passed" | |
| exit 0 | |
| else | |
| echo "UI build/tests failed" | |
| exit 1 | |
| fi | |
| bump-version: | |
| needs: [check-paths, ui-build-and-test] | |
| name: "Bump UI Version" | |
| runs-on: ubuntu-latest | |
| if: github.event_name == 'push' && github.ref_name == github.event.repository.default_branch && needs.check-paths.outputs.should-run == 'true' | |
| outputs: | |
| new-tag: ${{ steps.bump.outputs.newTag }} | |
| defaults: | |
| run: | |
| working-directory: client/webui/frontend | |
| steps: | |
| - name: "Checkout source code" | |
| uses: "actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd" # v5.0.1 | |
| with: | |
| ref: ${{ github.ref }} | |
| token: ${{ secrets.GITHUB_TOKEN }} | |
| fetch-depth: 0 | |
| - name: "Current package.json" | |
| run: cat ./package.json | |
| - name: Setup Node.js | |
| uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 | |
| with: | |
| node-version: "25.5.0" | |
| - name: "Automated Version Bump" | |
| id: bump | |
| uses: "phips28/gh-action-bump-version@71473b25295fe3907df2ff87cce295a0dce1b20b" # master | |
| with: | |
| minor-wording: "feat,minor" | |
| major-wording: "BREAKING CHANGE,major" | |
| patch-wording: "fix,patch,docs,style,refactor,perf,test,build,ci,chore,revert" | |
| tag-prefix: "ui-v" | |
| commit-message: "ci(ui): bump version to {{version}} [skip ci]" | |
| skip-push: "true" | |
| default: "patch" # default to patch bump if no bumps included in commit messages | |
| bump-policy: "ignore" # always bump regardless of whether bumps included in commit messages | |
| env: | |
| PACKAGEJSON_DIR: client/webui/frontend | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| - name: "Updated package.json" | |
| run: cat ./package.json | |
| - name: "Extract version from tag" | |
| id: extract-version | |
| run: | | |
| if [ -n "${{ steps.bump.outputs.newTag }}" ]; then | |
| TAG="${{ steps.bump.outputs.newTag }}" | |
| VERSION="${TAG#ui-v}" | |
| echo "version=$VERSION" >> $GITHUB_OUTPUT | |
| echo "Extracted version: $VERSION from tag: $TAG" | |
| else | |
| echo "No new tag created" | |
| echo "version=" >> $GITHUB_OUTPUT | |
| fi | |
| - name: Set up SSH agent | |
| if: steps.bump.outputs.newTag != '' | |
| uses: webfactory/ssh-agent@a6f90b1f127823b31d4d4a8d96047790581349bd # v0.9.1 | |
| with: | |
| ssh-private-key: ${{ secrets.COMMIT_KEY }} | |
| - name: Push new version and tag | |
| if: steps.bump.outputs.newTag != '' | |
| run: | | |
| git config user.name "github-actions[bot]" | |
| git config user.email "41898282+github-actions[bot]@users.noreply.github.com" | |
| git remote set-url origin git@github.com:${{ github.repository }}.git | |
| git push origin main | |
| git push origin ${{ steps.bump.outputs.newTag }} | |
| release-ui: | |
| needs: bump-version | |
| name: "Release UI Package" | |
| if: needs.bump-version.outputs.new-tag != '' | |
| uses: ./.github/workflows/ui-release.yml | |
| with: | |
| tag: ${{ needs.bump-version.outputs.new-tag }} | |
| secrets: inherit |