---
    name: CI

    on:
      push:
        branches: [main]
      pull_request:

    # If another push to the same PR or branch happens while this workflow is still running,
    # cancel the earlier run in favor of the next run.
    #
    # There's no point in testing an outdated version of the code. GitHub only allows
    # a limited number of job runners to be active at the same time, so it's better to cancel
    # pointless jobs early so that more useful jobs can run sooner.
    concurrency:
      group: ${{ github.workflow }}-${{ github.ref }}
      cancel-in-progress: true

    env:
      POETRY_VERSION: "1.7.1"

    jobs:
      build:
        runs-on: ubuntu-latest
        steps:
          - uses: actions/checkout@v4
          - uses: actions/setup-python@v5
            with:
              python-version: '3.10'

      lint:
        name: cd ${{ matrix.working-directory }}
        needs: [ build ]
        strategy:
          matrix:
            working-directory: [
                "libs/langgraph",
                "libs/sdk-py",
                "libs/cli",
                "libs/checkpoint",
                "libs/checkpoint-sqlite",
                "libs/checkpoint-postgres"
            ]
        uses: ./.github/workflows/_lint.yml
        with:
          working-directory: ${{ matrix.working-directory }}
        secrets: inherit

      test:
        name: cd ${{ matrix.working-directory }}
        needs: [ build ]
        strategy:
          matrix:
            working-directory: [
                "libs/langgraph",
                "libs/cli",
                "libs/checkpoint",
                "libs/checkpoint-sqlite",
                "libs/checkpoint-postgres"
            ]
        uses: ./.github/workflows/_test.yml
        with:
          working-directory: ${{ matrix.working-directory }}
        secrets: inherit

      integration-test:
        name: CLI integration test
        needs: [ build ]
        uses: ./.github/workflows/_integration_test.yml
        secrets: inherit

      lint-js:
        runs-on: ubuntu-latest
        needs: [ build ]
        strategy:
          matrix:
            working-directory:
              - "libs/sdk-js"
        defaults:
          run:
            working-directory: ${{ matrix.working-directory }}
        steps:
          - uses: actions/checkout@v3
          - name: Setup Node.js (LTS)
            uses: actions/setup-node@v3
            with:
              node-version: "20"
              cache: "yarn"
              cache-dependency-path: ${{ matrix.working-directory }}/yarn.lock
          - name: Install dependencies
            run: yarn install
          - name: Run lint
            run: yarn lint
          - name: Build
            run: yarn build

      ci_success:
        name: "CI Success"
        needs: [build, lint, lint-js, test, integration-test]
        if: |
          always()
        runs-on: ubuntu-latest
        env:
          JOBS_JSON: ${{ toJSON(needs) }}
          RESULTS_JSON: ${{ toJSON(needs.*.result) }}
          EXIT_CODE: ${{!contains(needs.*.result, 'failure') && !contains(needs.*.result, 'cancelled') && '0' || '1'}}
        steps:
          - name: "CI Success"
            run: |
              echo $JOBS_JSON
              echo $RESULTS_JSON
              echo "Exiting with $EXIT_CODE"
              exit $EXIT_CODE
    