Skip to content

feat(chat): run chat turns in CodeAct mode with a JS graph object model #11915

feat(chat): run chat turns in CodeAct mode with a JS graph object model

feat(chat): run chat turns in CodeAct mode with a JS graph object model #11915

Workflow file for this run

name: Test
on:
push:
branches:
- main
paths:
- "web/**"
- "electron/**"
- "packages/**"
- "reliability/**"
- "mobile/**"
- "examples/**"
- "scripts/**"
- "Dockerfile"
- ".dockerignore"
- "package.json"
- "package-lock.json"
- "tsconfig.json"
- "tsconfig.*.json"
- "turbo.json"
- ".nvmrc"
- ".github/workflows/test.yml"
- ".github/workflows/quality-checks.yml"
- ".github/actions/setup-build/**"
pull_request:
branches:
- main
# No `paths` filter here: this workflow's "Quality Gate" job is a REQUIRED
# status check. A path-filtered required check is left Pending (never runs)
# when a PR push/merge touches no matching path — e.g. a clean "merge main"
# commit — which blocks the PR and auto-merge indefinitely. Running the gate
# on every PR keeps the required check from getting stuck. (The `push` to
# main above keeps its path filter — there is no required-check to block.)
# Cancel superseded runs for the same branch/PR; the latest push is what matters.
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
quality:
name: Quality Gate (npm run check)
uses: ./.github/workflows/quality-checks.yml
# A called workflow's permissions are capped by the caller's, so the gate's
# `docker` leg only gets its read-only GHCR buildcache access if it is
# granted here too.
permissions:
contents: read
packages: read
with:
# false → every check leg (deps/typecheck/lint/tests) runs to completion
# so each reports its own red/green instead of the first failure masking
# the rest. The required check is the reusable workflow's `quality` gate
# job, surfaced unchanged as "Quality Gate (npm run check) / quality".
fail-fast: false
skip-tests: false
# Heavy jobs run concurrently with the quality gate rather than after it, so
# the critical path is max(quality, integration, e2e) instead of
# quality + max(integration, e2e). Trade-off: a PR that fails a static check
# still spends these runner minutes. They build packages themselves (they are
# in this workflow, not the reusable quality-checks one, so they can't consume
# its build artifact without depending on the whole gate — which would undo
# the decoupling).
integration:
name: Workflow Integration Tests
runs-on: ubuntu-latest
timeout-minutes: 45
steps:
- name: Checkout code
uses: actions/checkout@v7
- name: Set up Node, install deps, build packages
uses: ./.github/actions/setup-build
- name: Run shipped-workflow execution tests
run: npm run test:integration
workflow-runner-e2e:
name: Workflow Runner Browser E2E
runs-on: ubuntu-latest
timeout-minutes: 45
steps:
- name: Checkout code
uses: actions/checkout@v7
- name: Set up Node, install deps, build packages
# mesa-vulkan-drivers ships lavapipe (CPU Vulkan ICD) so headless
# Chromium can acquire a WebGPU adapter on GPU-less CI runners. The
# workflow-runner browser harness uses it to drive shader-pool tests
# (color.brightnessContrast, etc.) against the same module catalog
# the server uses on Node/Dawn.
uses: ./.github/actions/setup-build
with:
extra-apt: mesa-vulkan-drivers
- name: Cache Playwright browsers
id: playwright-cache
uses: actions/cache@v6
with:
path: ~/.cache/ms-playwright
key: ${{ runner.os }}-playwright-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-playwright-
- name: Install Playwright Chromium browser
run: npx playwright install --with-deps chromium
working-directory: packages/workflow-runner
- name: Run workflow-runner browser E2E tests
run: npm run test:e2e --workspace=@nodetool-ai/workflow-runner
- name: Upload Playwright report on failure
if: failure()
uses: actions/upload-artifact@v7
with:
name: workflow-runner-playwright-report
path: packages/workflow-runner/playwright-report
retention-days: 7