From 9211f5f6aae5792fd42736c134c0e86cd53bdd14 Mon Sep 17 00:00:00 2001 From: Anupam Kumar Date: Fri, 10 Apr 2026 13:39:38 +0530 Subject: [PATCH 01/14] chore(ci): set NC loglevel to 1 Signed-off-by: Anupam Kumar --- .github/workflows/integration-test.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/integration-test.yml b/.github/workflows/integration-test.yml index 637c99a..21d23f3 100644 --- a/.github/workflows/integration-test.yml +++ b/.github/workflows/integration-test.yml @@ -238,7 +238,7 @@ jobs: run: | set -x ./occ config:system:set debug --value true - ./occ config:system:set loglevel --value 0 + ./occ config:system:set loglevel --value 1 ./occ app_api:daemon:register --net host manual_install "Manual Install" manual-install http localhost http://localhost:8080 timeout 120 ./occ app_api:app:register context_chat_backend manual_install --json-info "{\"appid\":\"context_chat_backend\",\"name\":\"Context Chat Backend\",\"daemon_config_name\":\"manual_install\",\"version\":\"${{ fromJson(steps.appinfo.outputs.result).version }}\",\"secret\":\"12345\",\"port\":10034,\"scopes\":[],\"system_app\":0}" --force-scopes --wait-finish @@ -500,7 +500,7 @@ jobs: run: | set -x ./occ config:system:set debug --value true - ./occ config:system:set loglevel --value 0 + ./occ config:system:set loglevel --value 1 ./occ app_api:daemon:register --net host manual_install "Manual Install" manual-install http localhost http://localhost:8080 timeout 120 ./occ app_api:app:register context_chat_backend manual_install --json-info "{\"appid\":\"context_chat_backend\",\"name\":\"Context Chat Backend\",\"daemon_config_name\":\"manual_install\",\"version\":\"${{ fromJson(steps.appinfo.outputs.result).version }}\",\"secret\":\"12345\",\"port\":10034,\"scopes\":[],\"system_app\":0}" --force-scopes --wait-finish @@ -812,7 +812,7 @@ jobs: run: | set -x ./occ config:system:set debug --value true - ./occ config:system:set loglevel --value 0 + ./occ config:system:set loglevel --value 1 ./occ app_api:daemon:register --net host manual_install "Manual Install" manual-install http localhost http://localhost:8080 timeout 120 ./occ app_api:app:register context_chat_backend manual_install --json-info "{\"appid\":\"context_chat_backend\",\"name\":\"Context Chat Backend\",\"daemon_config_name\":\"manual_install\",\"version\":\"${{ fromJson(steps.appinfo.outputs.result).version }}\",\"secret\":\"12345\",\"port\":10034,\"scopes\":[],\"system_app\":0}" --force-scopes --wait-finish From 13406762e9a0149efcb71a2463f9963e5d98f40d Mon Sep 17 00:00:00 2001 From: Anupam Kumar Date: Fri, 10 Apr 2026 13:42:18 +0530 Subject: [PATCH 02/14] chore(ci): run only on protected branches PRs Signed-off-by: Anupam Kumar --- .github/workflows/integration-test.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/integration-test.yml b/.github/workflows/integration-test.yml index 21d23f3..a105942 100644 --- a/.github/workflows/integration-test.yml +++ b/.github/workflows/integration-test.yml @@ -5,6 +5,9 @@ name: Integration test on: pull_request: + branches: + - main + - stable* push: branches: - main From c355ddbeaef37fbc5b65e0049ccbdbe404de0619 Mon Sep 17 00:00:00 2001 From: Anupam Kumar Date: Fri, 10 Apr 2026 13:52:29 +0530 Subject: [PATCH 03/14] fix(ci): checkout the auto-enabled viewer app Signed-off-by: Anupam Kumar --- .github/workflows/integration-test.yml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/.github/workflows/integration-test.yml b/.github/workflows/integration-test.yml index a105942..89ff5c1 100644 --- a/.github/workflows/integration-test.yml +++ b/.github/workflows/integration-test.yml @@ -105,6 +105,14 @@ jobs: path: context_chat_backend/ persist-credentials: false + - name: Checkout viewer + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + repository: nextcloud/viewer + path: apps/viewer + persist-credentials: false + ref: ${{ matrix.server-versions }} + - name: Get backend app version id: appinfo uses: skjnldsv/xpath-action@7e6a7c379d0e9abc8acaef43df403ab4fc4f770c # master @@ -423,6 +431,14 @@ jobs: path: context_chat_backend/ persist-credentials: false + - name: Checkout viewer + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + repository: nextcloud/viewer + path: apps/viewer + persist-credentials: false + ref: ${{ matrix.server-versions }} + - name: Get backend app version id: appinfo uses: skjnldsv/xpath-action@7e6a7c379d0e9abc8acaef43df403ab4fc4f770c # master @@ -735,6 +751,14 @@ jobs: path: context_chat_backend/ persist-credentials: false + - name: Checkout viewer + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + repository: nextcloud/viewer + path: apps/viewer + persist-credentials: false + ref: ${{ matrix.server-versions }} + - name: Get backend app version id: appinfo uses: skjnldsv/xpath-action@7e6a7c379d0e9abc8acaef43df403ab4fc4f770c # master From 712d92ffe184659cb27e8439f5aea98608d1ed5e Mon Sep 17 00:00:00 2001 From: Anupam Kumar Date: Fri, 10 Apr 2026 14:07:11 +0530 Subject: [PATCH 04/14] chore(ci): split integration-test workflows into separate files Signed-off-by: Anupam Kumar --- .github/workflows/integration-test-cron.yml | 357 ++++++ .../integration-test-file-listener.yml | 478 +++++++ .github/workflows/integration-test-scan.yml | 367 ++++++ .github/workflows/integration-test.yml | 1120 ----------------- 4 files changed, 1202 insertions(+), 1120 deletions(-) create mode 100644 .github/workflows/integration-test-cron.yml create mode 100644 .github/workflows/integration-test-file-listener.yml create mode 100644 .github/workflows/integration-test-scan.yml delete mode 100644 .github/workflows/integration-test.yml diff --git a/.github/workflows/integration-test-cron.yml b/.github/workflows/integration-test-cron.yml new file mode 100644 index 0000000..665133e --- /dev/null +++ b/.github/workflows/integration-test-cron.yml @@ -0,0 +1,357 @@ +# SPDX-FileCopyrightText: Nextcloud contributors +# SPDX-License-Identifier: AGPL-3.0-or-later + +name: Integration test - Cron + +on: + pull_request: + branches: + - main + - stable* + push: + branches: + - main + - stable* + +env: + APP_NAME: context_chat + +permissions: + contents: read + +concurrency: + group: integration-test-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + + +jobs: + cron-test: + runs-on: ubuntu-24.04 + + strategy: + # do not stop on another job's failure + fail-fast: false + matrix: + php-versions: [ '8.1', '8.2' ] + databases: [ 'pgsql' ] + server-versions: [ 'stable32', 'master' ] + encryption: ['off'] + exclude: + - server-versions: master + databases: pgsql + php-versions: 8.1 + include: + - server-versions: master + databases: pgsql + php-versions: 8.2 + encryption: 'on' + - server-versions: stable32 + databases: pgsql + php-versions: 8.1 + encryption: 'on' + + name: Integration test - Cron ☁️${{ matrix.server-versions }} 🐘${{ matrix.php-versions }} πŸ”:${{ matrix.encryption }} + + env: + MYSQL_PORT: 4444 + PGSQL_PORT: 4445 + # use the same db for ccb and nextcloud + CCB_DB_URL: postgresql+psycopg://root:rootpassword@localhost:4445/nextcloud + + services: + mysql: + image: mariadb:10.5 + ports: + - 4444:3306/tcp + env: + MYSQL_ROOT_PASSWORD: rootpassword + options: --health-cmd="mysqladmin ping" --health-interval 5s --health-timeout 2s --health-retries 5 + postgres: + image: pgvector/pgvector:pg17 + ports: + - 4445:5432/tcp + env: + POSTGRES_USER: root + POSTGRES_PASSWORD: rootpassword + POSTGRES_DB: nextcloud + options: --health-cmd pg_isready --health-interval 5s --health-timeout 2s --health-retries 5 + + steps: + - name: Checkout server + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + repository: nextcloud/server + ref: ${{ matrix.server-versions }} + submodules: recursive + persist-credentials: false + + - name: Set up php ${{ matrix.php-versions }} + uses: shivammathur/setup-php@cf4cade2721270509d5b1c766ab3549210a39a2a # 2.33.0 + with: + php-version: ${{ matrix.php-versions }} + tools: phpunit + extensions: mbstring, iconv, fileinfo, intl, sqlite, pdo_mysql, pdo_sqlite, pgsql, pdo_pgsql, gd, zip + + - name: Checkout app + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + path: apps/${{ env.APP_NAME }} + persist-credentials: false + + - name: Checkout backend + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + repository: nextcloud/context_chat_backend + path: context_chat_backend/ + persist-credentials: false + + - name: Checkout viewer + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + repository: nextcloud/viewer + path: apps/viewer + persist-credentials: false + ref: ${{ matrix.server-versions }} + + - name: Get backend app version + id: appinfo + uses: skjnldsv/xpath-action@7e6a7c379d0e9abc8acaef43df403ab4fc4f770c # master + with: + filename: context_chat_backend/appinfo/info.xml + expression: "/info/version/text()" + + - name: Read package.json node and npm engines version + uses: skjnldsv/read-package-engines-version-actions@06d6baf7d8f41934ab630e97d9e6c0bc9c9ac5e4 # v3 + id: versions + with: + path: apps/${{ env.APP_NAME }} + fallbackNode: '^20' + fallbackNpm: '^10' + + - name: Set up node ${{ steps.versions.outputs.nodeVersion }} + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + with: + node-version: ${{ steps.versions.outputs.nodeVersion }} + + - name: Set up npm ${{ steps.versions.outputs.npmVersion }} + run: npm i -g npm@"${{ steps.versions.outputs.npmVersion }}" + + - name: Install app + working-directory: apps/${{ env.APP_NAME }} + run: | + make all + composer install --no-dev + + - name: Set up Nextcloud + if: ${{ matrix.databases != 'pgsql'}} + run: | + sleep 25 + mkdir data + ./occ maintenance:install --verbose --database=${{ matrix.databases }} --database-name=nextcloud --database-host=127.0.0.1 --database-port=$MYSQL_PORT --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass password + composer run serve & + + - name: Set up Nextcloud + if: ${{ matrix.databases == 'pgsql'}} + run: | + sleep 25 + mkdir data + ./occ maintenance:install --verbose --database=${{ matrix.databases }} --database-name=nextcloud --database-host=127.0.0.1 --database-port=$PGSQL_PORT --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass password + composer run serve & + + - name: Enable app_api and testing + run: ./occ app:enable -vvv -f app_api testing + + - name: Enable encryption + if: ${{ matrix.encryption == 'on' }} + run: | + ./occ app:enable -vvv -f encryption + ./occ encryption:enable + + - name: Setup python 3.11 + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + with: + python-version: '3.11' + cache: 'pip' + cache-dependency-path: context_chat_backend/requirements.txt + + - name: Install and init backend + run: | + cd context_chat_backend + pip install --upgrade pip setuptools wheel + # use the cpu version of torch to not run out of space + pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu + sed -i '/torch(vision)?/d' requirements.txt + pip install -r requirements.txt + cp example.env .env + echo "NEXTCLOUD_URL=http://localhost:8080" >> .env + python3 -u ./main_em.py > em_backend_logs 2>&1 & + python3 -u ./main.py > backend_logs 2>&1 & + echo $! > ../pid.txt # Save the process ID (PID) + sleep 120 # Wait for the backend to get ready + + - name: Register backend + run: | + set -x + ./occ config:system:set debug --value true + ./occ config:system:set loglevel --value 1 + ./occ app_api:daemon:register --net host manual_install "Manual Install" manual-install http localhost http://localhost:8080 + timeout 120 ./occ app_api:app:register context_chat_backend manual_install --json-info "{\"appid\":\"context_chat_backend\",\"name\":\"Context Chat Backend\",\"daemon_config_name\":\"manual_install\",\"version\":\"${{ fromJson(steps.appinfo.outputs.result).version }}\",\"secret\":\"12345\",\"port\":10034,\"scopes\":[],\"system_app\":0}" --force-scopes --wait-finish + + - name: Checkout documentation + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + repository: nextcloud/documentation + path: data/admin/files/documentation + persist-credentials: false + + - name: Checkout pdfs + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + repository: papers-we-love/papers-we-love + path: data/admin/files/papers + ref: ad039b1e29ddb6ab1e217d39f16a5051c18ccc5a # to be deterministic + persist-credentials: false + + - name: Prepare docs + run: | + cd data/admin/files + mv documentation/admin_manual . + cp -R documentation/developer_manual . + cd developer_manual + find . -type f -name "*.rst" -exec bash -c 'mv "$0" "${0%.rst}.md"' {} \; + cd .. + cp -R documentation/developer_manual ./developer_manual2 + cd developer_manual2 + find . -type f -name "*.rst" -exec bash -c 'mv "$0" "${0%.rst}.txt"' {} \; + cd .. + rm -rf documentation + + - name: Reduce number of files + run: | + cd data/admin/files + LIMIT=100 + + # Find all files in the directory and its subdirectories + FILES=($(find papers/ -type f)) + + # Count the number of files + FILE_COUNT=${#FILES[@]} + + # Check if the current number of files exceeds the limit + if [ "$FILE_COUNT" -le "$LIMIT" ]; then + echo "No files need to be deleted. Current count: $FILE_COUNT" + exit 0 + fi + + # Calculate how many files to delete + FILES_TO_DELETE=$((FILE_COUNT - LIMIT)) + + # Sort files by modification time (oldest first) and delete the oldest ones + for FILE in $(ls -t "${FILES[@]}" | tail -n "$FILES_TO_DELETE"); do + echo "Deleting: $FILE" + rm "$FILE" + done + + echo "Deleted $FILES_TO_DELETE files. Current count: $((FILE_COUNT - FILES_TO_DELETE))" + + - name: Run files scan + run: | + ./occ files:scan admin # Do the scan before enabling context chat + + - name: Enable context chat + run: ./occ app:enable -vvv -f ${{ env.APP_NAME }} + + - name: Run indexer cron + run: | + # Run cron in speed mode: Set interval to 0 minutes + ./occ config:app:set --value 30 --type integer context_chat indexing_job_interval # 30 seconds + ./occ config:app:set --value 10 --type integer context_chat crawl_job_interval # 10 seconds + ./occ config:app:set --value '10' --type string context_chat action_job_interval # 10 seconds + ./occ config:app:set --value '10' --type string context_chat fs_listener_job_interval # 10 seconds + for i in {1..100}; do + php cron.php & # Starting with stable31 we can use -v here for better visibility + wait + ./occ context_chat:stats + done + + - name: Check context chat state + run: | + ./occ context_chat:stats + ./occ background-job:list + ./occ context_chat:stats | grep -q "Index complete time" || echo "Indexing did not complete" + ./occ context_chat:stats | awk ' + /Total eligible files/ { + total = $NF + 0 # force conversion to number + } + /files__default/ { + indexed = $NF; + sub(/,$/, "", indexed) # remove trailing comma + indexed = indexed + 0 # force conversion to number + } + END { + low = total * 0.85; + high = total * 1.15; + if (indexed >= low && indexed <= high) { + print "βœ… Indexed files (" indexed ") are within 15% of eligible files (" total ")."; + exit 0; + } else { + print "❌ Indexed files (" indexed ") are OUTSIDE the 15% range of eligible files (" total ")."; + exit 1; + } + } + ' + + - name: Run the prompts + run: | + ./occ background-job:worker -v 'OC\TaskProcessing\SynchronousBackgroundJob' & + WORKER1_PID=$! + ./occ background-job:worker -v 'OC\TaskProcessing\SynchronousBackgroundJob' & + WORKER2_PID=$! + OUT1=$(./occ context_chat:prompt admin "Which factors are taken into account for the Ethical AI Rating?") + echo "$OUT1" + echo '--------------------------------------------------' + OUT2=$(./occ context_chat:prompt admin "Welche Faktoren beeinflussen das Ethical AI Rating?") + echo "$OUT2" + echo '--------------------------------------------------' + + OUT3=$(./occ context_chat:search admin "Welche Faktoren beeinflussen das Ethical AI Rating?") + echo "$OUT3" + echo "$OUT1" | grep -q "If all of these points are met, we give a Green label." || exit 1 + echo "$OUT2" | grep -q "If all of these points are met, we give a Green label." || exit 1 + echo "$OUT3" | grep -q "overview.rst" || exit 1 + + kill -9 $WORKER1_PID + kill -9 $WORKER2_PID + + - name: Show nextcloud logs + if: always() + run: | + cat data/nextcloud.log + + - name: Show context chat logs + if: always() + run: | + cat data/context_chat.log + + - name: Show backend logs + if: always() + run: | + cat context_chat_backend/backend_logs || echo "No main backend logs" + cat context_chat_backend/em_backend_logs || echo "No embedding server logs" + echo '--------------------------------------------------' + tail -v -n +1 context_chat_backend/persistent_storage/logs/* || echo "No logs in logs directory" + + summary: + permissions: + contents: none + runs-on: ubuntu-latest-low + needs: [cron-test] + + if: always() + + # This is the summary, we just avoid to rename it so that branch protection rules still match + name: integration-test-cron + + steps: + - name: Summary status + run: if ${{ needs.cron-test.result != 'success' }}; then exit 1; fi diff --git a/.github/workflows/integration-test-file-listener.yml b/.github/workflows/integration-test-file-listener.yml new file mode 100644 index 0000000..3ad91e9 --- /dev/null +++ b/.github/workflows/integration-test-file-listener.yml @@ -0,0 +1,478 @@ +# SPDX-FileCopyrightText: Nextcloud contributors +# SPDX-License-Identifier: AGPL-3.0-or-later + +name: Integration test - File listener + +on: + pull_request: + branches: + - main + - stable* + push: + branches: + - main + - stable* + +env: + APP_NAME: context_chat + +permissions: + contents: read + +concurrency: + group: integration-test-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + + +jobs: + file-listener-test: + runs-on: ubuntu-24.04 + + strategy: + # do not stop on another job's failure + fail-fast: false + matrix: + php-versions: [ '8.1', '8.2' ] + databases: [ 'pgsql' ] + server-versions: [ 'stable32', 'master' ] + encryption: ['off'] + file-deletion-method: [ 'occ', 'os' ] + exclude: + - server-versions: master + databases: pgsql + php-versions: 8.1 + include: + - server-versions: master + databases: pgsql + php-versions: 8.2 + encryption: 'on' + file-deletion-method: 'occ' + - server-versions: stable32 + databases: pgsql + php-versions: 8.1 + encryption: 'on' + file-deletion-method: 'occ' + + + name: Integration test - File listener ☁️${{ matrix.server-versions }} 🐘${{ matrix.php-versions }} πŸ—‘οΈ${{ matrix.file-deletion-method }} πŸ”:${{ matrix.encryption }} + + env: + MYSQL_PORT: 4444 + PGSQL_PORT: 4445 + # use the same db for ccb and nextcloud + CCB_DB_URL: postgresql+psycopg://root:rootpassword@localhost:4445/nextcloud + + services: + mysql: + image: mariadb:10.5 + ports: + - 4444:3306/tcp + env: + MYSQL_ROOT_PASSWORD: rootpassword + options: --health-cmd="mysqladmin ping" --health-interval 5s --health-timeout 2s --health-retries 5 + postgres: + image: pgvector/pgvector:pg17 + ports: + - 4445:5432/tcp + env: + POSTGRES_USER: root + POSTGRES_PASSWORD: rootpassword + POSTGRES_DB: nextcloud + options: --health-cmd pg_isready --health-interval 5s --health-timeout 2s --health-retries 5 + + steps: + - name: Checkout server + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + repository: nextcloud/server + ref: ${{ matrix.server-versions }} + submodules: recursive + persist-credentials: false + + - name: Set up php ${{ matrix.php-versions }} + uses: shivammathur/setup-php@cf4cade2721270509d5b1c766ab3549210a39a2a # 2.33.0 + with: + php-version: ${{ matrix.php-versions }} + tools: phpunit + extensions: mbstring, iconv, fileinfo, intl, sqlite, pdo_mysql, pdo_sqlite, pgsql, pdo_pgsql, gd, zip + + - name: Checkout app + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + path: apps/${{ env.APP_NAME }} + persist-credentials: false + + - name: Checkout backend + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + repository: nextcloud/context_chat_backend + path: context_chat_backend/ + persist-credentials: false + + - name: Checkout viewer + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + repository: nextcloud/viewer + path: apps/viewer + persist-credentials: false + ref: ${{ matrix.server-versions }} + + - name: Get backend app version + id: appinfo + uses: skjnldsv/xpath-action@7e6a7c379d0e9abc8acaef43df403ab4fc4f770c # master + with: + filename: context_chat_backend/appinfo/info.xml + expression: "/info/version/text()" + + - name: Read package.json node and npm engines version + uses: skjnldsv/read-package-engines-version-actions@06d6baf7d8f41934ab630e97d9e6c0bc9c9ac5e4 # v3 + id: versions + with: + path: apps/${{ env.APP_NAME }} + fallbackNode: '^20' + fallbackNpm: '^10' + + - name: Set up node ${{ steps.versions.outputs.nodeVersion }} + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + with: + node-version: ${{ steps.versions.outputs.nodeVersion }} + + - name: Set up npm ${{ steps.versions.outputs.npmVersion }} + run: npm i -g npm@"${{ steps.versions.outputs.npmVersion }}" + + - name: Install app + working-directory: apps/${{ env.APP_NAME }} + run: | + make all + composer install --no-dev + + - name: Set up Nextcloud + if: ${{ matrix.databases != 'pgsql'}} + run: | + sleep 25 + mkdir data + ./occ maintenance:install --verbose --database=${{ matrix.databases }} --database-name=nextcloud --database-host=127.0.0.1 --database-port=$MYSQL_PORT --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass password + composer run serve & + + - name: Set up Nextcloud + if: ${{ matrix.databases == 'pgsql'}} + run: | + sleep 25 + mkdir data + ./occ maintenance:install --verbose --database=${{ matrix.databases }} --database-name=nextcloud --database-host=127.0.0.1 --database-port=$PGSQL_PORT --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass password + composer run serve & + + - name: Enable app_api and testing + run: ./occ app:enable -vvv -f app_api testing + + - name: Enable encryption + if: ${{ matrix.encryption == 'on' }} + run: | + ./occ app:enable -vvv -f encryption + ./occ encryption:enable + + - name: Setup python 3.11 + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + with: + python-version: '3.11' + cache: 'pip' + cache-dependency-path: context_chat_backend/requirements.txt + + - name: Install and init backend + run: | + cd context_chat_backend + pip install --upgrade pip setuptools wheel + # use the cpu version of torch to not run out of space + pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu + sed -i '/torch(vision)?/d' requirements.txt + pip install -r requirements.txt + cp example.env .env + echo "NEXTCLOUD_URL=http://localhost:8080" >> .env + python3 -u ./main_em.py > em_backend_logs 2>&1 & + python3 -u ./main.py > backend_logs 2>&1 & + echo $! > ../pid.txt # Save the process ID (PID) + sleep 120 # Wait for the backend to get ready + + - name: Register backend + run: | + set -x + ./occ config:system:set debug --value true + ./occ config:system:set loglevel --value 1 + ./occ app_api:daemon:register --net host manual_install "Manual Install" manual-install http localhost http://localhost:8080 + timeout 120 ./occ app_api:app:register context_chat_backend manual_install --json-info "{\"appid\":\"context_chat_backend\",\"name\":\"Context Chat Backend\",\"daemon_config_name\":\"manual_install\",\"version\":\"${{ fromJson(steps.appinfo.outputs.result).version }}\",\"secret\":\"12345\",\"port\":10034,\"scopes\":[],\"system_app\":0}" --force-scopes --wait-finish + + - name: Enable context chat + run: | + ./occ app:enable -vvv -f ${{ env.APP_NAME }} + # Run cron in speed mode + ./occ config:app:set --value 30 --type integer context_chat indexing_job_interval # 30 seconds + ./occ config:app:set --value 10 --type integer context_chat crawl_job_interval # 10 seconds + ./occ config:app:set --value '10' --type string context_chat action_job_interval # 10 seconds + ./occ config:app:set --value '10' --type string context_chat fs_listener_job_interval # 10 seconds + # Run normal indexing jobs which will only pick up welcome.txt etc + for i in {1..10}; do + php cron.php & # Starting with stable31 we can use -v here for better visibility + wait + ./occ context_chat:stats + done + + - name: Checkout documentation + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + repository: nextcloud/documentation + path: data/admin/files/documentation + persist-credentials: false + + - name: Checkout pdfs + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + repository: papers-we-love/papers-we-love + path: data/admin/files/papers + ref: ad039b1e29ddb6ab1e217d39f16a5051c18ccc5a # to be deterministic + persist-credentials: false + + - name: Prepare docs + run: | + cd data/admin/files + mv documentation/admin_manual . + cp -R documentation/developer_manual . + cd developer_manual + find . -type f -name "*.rst" -exec bash -c 'mv "$0" "${0%.rst}.md"' {} \; + cd .. + cp -R documentation/developer_manual ./developer_manual2 + cd developer_manual2 + find . -type f -name "*.rst" -exec bash -c 'mv "$0" "${0%.rst}.txt"' {} \; + cd .. + rm -rf documentation + + - name: Reduce number of files + run: | + cd data/admin/files + LIMIT=100 + + # Find all files in the directory and its subdirectories + FILES=($(find papers/ -type f)) + + # Count the number of files + FILE_COUNT=${#FILES[@]} + + # Check if the current number of files exceeds the limit + if [ "$FILE_COUNT" -le "$LIMIT" ]; then + echo "No files need to be deleted. Current count: $FILE_COUNT" + exit 0 + fi + + # Calculate how many files to delete + FILES_TO_DELETE=$((FILE_COUNT - LIMIT)) + + # Sort files by modification time (oldest first) and delete the oldest ones + for FILE in $(ls -t "${FILES[@]}" | tail -n "$FILES_TO_DELETE"); do + echo "Deleting: $FILE" + rm "$FILE" + done + + echo "Deleted $FILES_TO_DELETE files. Current count: $((FILE_COUNT - FILES_TO_DELETE))" + + - name: Run files scan + run: | + ./occ files:scan admin # We do the scan after enabling context chat here, so we can test the file listeners + + - name: Run indexer cron + run: | + for i in {1..100}; do + php cron.php & # Starting with stable31 we can use -v here for better visibility + wait + ./occ context_chat:stats + done + + - name: Check context chat state + run: | + ./occ context_chat:stats + ./occ background-job:list + ./occ context_chat:stats | grep -q "Index complete time" || echo "Indexing did not complete" + ./occ context_chat:stats | awk ' + /Total eligible files/ { + total = $NF + 0 # force conversion to number + } + /files__default/ { + indexed = $NF; + sub(/,$/, "", indexed) # remove trailing comma + indexed = indexed + 0 # force conversion to number + } + END { + low = total * 0.85; + high = total * 1.15; + if (indexed >= low && indexed <= high) { + print "βœ… Indexed files (" indexed ") are within 15% of eligible files (" total ")."; + exit 0; + } else { + print "❌ Indexed files (" indexed ") are OUTSIDE the 15% range of eligible files (" total ")."; + exit 1; + } + } + ' + + - name: Run the prompts + run: | + ./occ background-job:worker -v 'OC\TaskProcessing\SynchronousBackgroundJob' & + WORKER1_PID=$! + ./occ background-job:worker -v 'OC\TaskProcessing\SynchronousBackgroundJob' & + WORKER2_PID=$! + set +e + + # Check for user admin: Should be there + OUT_ADMIN_ENGLISH_PROMPT_AI=$(./occ context_chat:prompt admin "Which factors are taken into account for the Ethical AI Rating?") + OUT_ADMIN_GERMAN_PROMPT_AI=$(./occ context_chat:prompt admin "Welche Faktoren beeinflussen das Ethical AI Rating?") + OUT_ADMIN_SEARCH_AI=$(./occ context_chat:search admin "Welche Faktoren beeinflussen das Ethical AI Rating?") + + # Check for user test: Shouldn't be there + OUT_TEST_ENGLISH_PROMPT_AI=$(./occ context_chat:prompt test "Which factors are taken into account for the Ethical AI Rating?") + OUT_TEST_GERMAN_PROMPT_AI=$(./occ context_chat:prompt test "Welche Faktoren beeinflussen das Ethical AI Rating?") + OUT_TEST_SEARCH_AI=$(./occ context_chat:search test "Welche Faktoren beeinflussen das Ethical AI Rating?") + + # Check for user test: Shouldn't be there, because it was not shared yet + OUT_TEST_PROMPT_JOBS=$(./occ context_chat:prompt test "How do I set my TimedJob to be time insensitive?") + OUT_TEST_SEARCH_JOBS=$(./occ context_chat:search test "How do I set my TimedJob to be time insensitive?") + + echo "OUT_ADMIN_ENGLISH_PROMPT_AI" + echo "$OUT_ADMIN_ENGLISH_PROMPT_AI" + echo "OUT_ADMIN_GERMAN_PROMPT_AI" + echo "$OUT_ADMIN_GERMAN_PROMPT_AI" + echo "OUT_ADMIN_SEARCH_AI" + echo "$OUT_ADMIN_SEARCH_AI" + echo "OUT_TEST_ENGLISH_PROMPT_AI" + echo "$OUT_TEST_ENGLISH_PROMPT_AI" + echo "OUT_TEST_GERMAN_PROMPT_AI" + echo "$OUT_TEST_GERMAN_PROMPT_AI" + echo "OUT_TEST_SEARCH_AI" + echo "$OUT_TEST_SEARCH_AI" + echo "OUT_TEST_PROMPT_JOBS" + echo "$OUT_TEST_PROMPT_JOBS" + echo "OUT_TEST_SEARCH_JOBS" + echo "$OUT_TEST_SEARCH_JOBS" + + echo "$OUT_ADMIN_ENGLISH_PROMPT_AI" | grep -q "If all of these points are met, we give a Green label." && echo 'βœ… Admin does see AI overview' || exit 1 + echo "$OUT_ADMIN_GERMAN_PROMPT_AI" | grep -q "If all of these points are met, we give a Green label." && echo 'βœ… Admin does see AI overview, after german question' || exit 1 + echo "$OUT_ADMIN_SEARCH_AI" | grep -q "overview.rst" && echo 'βœ… Admin does see AI overview, when using search' || exit 1 + echo "$OUT_TEST_ENGLISH_PROMPT_AI" | grep -q -v "If all of these points are met, we give a Green label." && echo 'βœ… Test user does not see AI overview' || exit 1 + echo "$OUT_TEST_GERMAN_PROMPT_AI" | grep -q -v "If all of these points are met, we give a Green label." && echo 'βœ…Test user does not see AI overview, after german question' || exit 1 + echo "$OUT_TEST_SEARCH_AI" | grep -q -v "overview.rst" && echo 'βœ…Test user does not see AI overview, when using search' || exit 1 + echo "$OUT_TEST_PROMPT_JOBS" | grep -q -v "background jobs" && echo 'βœ…Test user does not see BackgroundJobs docs' || exit 1 + echo "$OUT_TEST_SEARCH_JOBS" | grep -q -v "backgroundjobs.md" && echo 'βœ…Test user does not see BackgroundJobs docs' || exit 1 + + kill -9 $WORKER1_PID + kill -9 $WORKER2_PID + + - name: Remove some files using occ + if: ${{ matrix.file-deletion-method == 'occ'}} + run: | + ./occ files:delete admin/files/admin_manual + + - name: Remove some files using os + if: ${{ matrix.file-deletion-method == 'os'}} + run: | + cd data/admin/files + rm -rf ./admin_manual # this + files:scan sadly doesn't work, currently see https://github.com/nextcloud/context_chat/issues/153 + cd ../../.. + ./occ files:scan admin # We run the scan again to check if the files are successfully removed from the vectordb + + - name: Share some files + run: | + OC_PASS=test ./occ user:add --password-from-env -- test + # share developer_manual to test user + curl -X POST -u 'admin:password' -H 'OCS-APIRequest: true' 'http://localhost:8080/ocs/v2.php/apps/files_sharing/api/v1/shares?shareType=0&shareWith=test&path=developer_manual' + # list files to trigger mounting of shares + curl -X PROPFIND -H "Depth: 0" -u 'test:test' 'http://localhost:8080/remote.php/webdav/' + + - name: Run indexer cron + run: | + for i in {1..100}; do + php cron.php & # Starting with stable31 we can use -v here for better visibility + wait + ./occ context_chat:stats + done + + - name: Run the prompts again + run: | + ./occ background-job:worker -v 'OC\TaskProcessing\SynchronousBackgroundJob' & + WORKER1_PID=$! + ./occ background-job:worker -v 'OC\TaskProcessing\SynchronousBackgroundJob' & + WORKER2_PID=$! + + set +e + + # Check for user admin: Shouldn't be there + OUT_ADMIN_ENGLISH_PROMPT_AI=$(./occ context_chat:prompt admin "Which factors are taken into account for the Ethical AI Rating?") + OUT_ADMIN_GERMAN_PROMPT_AI=$(./occ context_chat:prompt admin "Welche Faktoren beeinflussen das Ethical AI Rating?") + OUT_ADMIN_SEARCH_AI=$(./occ context_chat:search admin "Welche Faktoren beeinflussen das Ethical AI Rating?") + + # Check for user test: Shouldn't be there + OUT_TEST_ENGLISH_PROMPT_AI=$(./occ context_chat:prompt test "Which factors are taken into account for the Ethical AI Rating?") + OUT_TEST_GERMAN_PROMPT_AI=$(./occ context_chat:prompt test "Welche Faktoren beeinflussen das Ethical AI Rating?") + OUT_TEST_SEARCH_AI=$(./occ context_chat:search test "Welche Faktoren beeinflussen das Ethical AI Rating?") + + # Check for user test: Should be there, because it was shared + OUT_TEST_PROMPT_JOBS=$(./occ context_chat:prompt test "How do I set my TimedJob to be time insensitive?") + OUT_TEST_SEARCH_JOBS=$(./occ context_chat:search test "How do I set my TimedJob to be time insensitive?") + + echo "OUT_ADMIN_ENGLISH_PROMPT_AI" + echo "$OUT_ADMIN_ENGLISH_PROMPT_AI" + echo "OUT_ADMIN_GERMAN_PROMPT_AI" + echo "$OUT_ADMIN_GERMAN_PROMPT_AI" + echo "OUT_ADMIN_SEARCH_AI" + echo "$OUT_ADMIN_SEARCH_AI" + echo "OUT_TEST_ENGLISH_PROMPT_AI" + echo "$OUT_TEST_ENGLISH_PROMPT_AI" + echo "OUT_TEST_GERMAN_PROMPT_AI" + echo "$OUT_TEST_GERMAN_PROMPT_AI" + echo "OUT_TEST_SEARCH_AI" + echo "$OUT_TEST_SEARCH_AI" + echo "OUT_TEST_PROMPT_JOBS" + echo "$OUT_TEST_PROMPT_JOBS" + echo "OUT_TEST_SEARCH_JOBS" + echo "$OUT_TEST_SEARCH_JOBS" + + echo "$OUT_ADMIN_ENGLISH_PROMPT_AI" | grep -q -v "If all of these points are met, we give a Green label." && echo 'βœ… Admin does not see AI overview anymore' || exit 1 + echo "$OUT_ADMIN_GERMAN_PROMPT_AI" | grep -q -v "If all of these points are met, we give a Green label." && echo 'βœ… Admin does not see AI overview anymore, after german question' || exit 1 + echo "$OUT_ADMIN_SEARCH_AI" | grep -q -v "overview.rst" && echo 'βœ… Admin does not see AI overview anymore, when using search' || exit 1 + echo "$OUT_TEST_ENGLISH_PROMPT_AI" | grep -q -v "If all of these points are met, we give a Green label." && echo 'βœ… Test user does not see AI overview' || exit 1 + echo "$OUT_TEST_GERMAN_PROMPT_AI" | grep -q -v "If all of these points are met, we give a Green label." && echo 'βœ…Test user does not see AI overview, after german question' || exit 1 + echo "$OUT_TEST_SEARCH_AI" | grep -q -v "overview.rst" && echo 'βœ…Test user does not see AI overview, when using search' || exit 1 + echo "$OUT_TEST_PROMPT_JOBS" | grep -q "background jobs" && echo 'βœ…Test user does see BackgroundJobs docs' || exit 1 + echo "$OUT_TEST_SEARCH_JOBS" | grep -q "backgroundjobs.md" && echo 'βœ…Test user does see BackgroundJobs docs' || exit 1 + + kill -9 $WORKER1_PID + kill -9 $WORKER2_PID + + - name: Show nextcloud logs + if: always() + run: | + cat data/nextcloud.log + + - name: Show context chat logs + if: always() + run: | + cat data/context_chat.log + + - name: Show backend logs + if: always() + run: | + cat context_chat_backend/backend_logs || echo "No main backend logs" + cat context_chat_backend/em_backend_logs || echo "No embedding server logs" + echo '--------------------------------------------------' + tail -v -n +1 context_chat_backend/persistent_storage/logs/* || echo "No logs in logs directory" + + summary: + permissions: + contents: none + runs-on: ubuntu-latest-low + needs: [file-listener-test] + + if: always() + + # This is the summary, we just avoid to rename it so that branch protection rules still match + name: integration-test + + steps: + - name: Summary status + run: if ${{ needs.file-listener-test.result != 'success' }}; then exit 1; fi diff --git a/.github/workflows/integration-test-scan.yml b/.github/workflows/integration-test-scan.yml new file mode 100644 index 0000000..9399137 --- /dev/null +++ b/.github/workflows/integration-test-scan.yml @@ -0,0 +1,367 @@ +# SPDX-FileCopyrightText: Nextcloud contributors +# SPDX-License-Identifier: AGPL-3.0-or-later + +name: Integration test - OCC Scan + +on: + pull_request: + branches: + - main + - stable* + push: + branches: + - main + - stable* + +env: + APP_NAME: context_chat + +permissions: + contents: read + +concurrency: + group: integration-test-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + + +jobs: + scan-test: + runs-on: ubuntu-24.04 + + strategy: + # do not stop on another job's failure + fail-fast: false + matrix: + php-versions: [ '8.1', '8.2' ] + databases: [ 'pgsql' ] + server-versions: [ 'stable32', 'master' ] + encryption: ['off'] + exclude: + - server-versions: master + databases: pgsql + php-versions: 8.1 + include: + - server-versions: master + databases: pgsql + php-versions: 8.2 + encryption: 'on' + - server-versions: stable32 + databases: pgsql + php-versions: 8.1 + encryption: 'on' + + name: Integration test - OCC Scan ☁️${{ matrix.server-versions }} 🐘${{ matrix.php-versions }} πŸ”:${{ matrix.encryption }} + + env: + MYSQL_PORT: 4444 + PGSQL_PORT: 4445 + # use the same db for ccb and nextcloud + CCB_DB_URL: postgresql+psycopg://root:rootpassword@localhost:4445/nextcloud + + services: + mysql: + image: mariadb:10.5 + ports: + - 4444:3306/tcp + env: + MYSQL_ROOT_PASSWORD: rootpassword + options: --health-cmd="mysqladmin ping" --health-interval 5s --health-timeout 2s --health-retries 5 + postgres: + image: pgvector/pgvector:pg17 + ports: + - 4445:5432/tcp + env: + POSTGRES_USER: root + POSTGRES_PASSWORD: rootpassword + POSTGRES_DB: nextcloud + options: --health-cmd pg_isready --health-interval 5s --health-timeout 2s --health-retries 5 + + steps: + - name: Checkout server + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + repository: nextcloud/server + ref: ${{ matrix.server-versions }} + submodules: recursive + persist-credentials: false + + - name: Set up php ${{ matrix.php-versions }} + uses: shivammathur/setup-php@cf4cade2721270509d5b1c766ab3549210a39a2a # 2.33.0 + with: + php-version: ${{ matrix.php-versions }} + tools: phpunit + extensions: mbstring, iconv, fileinfo, intl, sqlite, pdo_mysql, pdo_sqlite, pgsql, pdo_pgsql, gd, zip + + - name: Checkout app + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + path: apps/${{ env.APP_NAME }} + persist-credentials: false + + - name: Checkout backend + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + repository: nextcloud/context_chat_backend + path: context_chat_backend/ + persist-credentials: false + + - name: Checkout viewer + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + repository: nextcloud/viewer + path: apps/viewer + persist-credentials: false + ref: ${{ matrix.server-versions }} + + - name: Get backend app version + id: appinfo + uses: skjnldsv/xpath-action@7e6a7c379d0e9abc8acaef43df403ab4fc4f770c # master + with: + filename: context_chat_backend/appinfo/info.xml + expression: "/info/version/text()" + + - name: Read package.json node and npm engines version + uses: skjnldsv/read-package-engines-version-actions@06d6baf7d8f41934ab630e97d9e6c0bc9c9ac5e4 # v3 + id: versions + with: + path: apps/${{ env.APP_NAME }} + fallbackNode: '^20' + fallbackNpm: '^10' + + - name: Set up node ${{ steps.versions.outputs.nodeVersion }} + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + with: + node-version: ${{ steps.versions.outputs.nodeVersion }} + + - name: Set up npm ${{ steps.versions.outputs.npmVersion }} + run: npm i -g npm@"${{ steps.versions.outputs.npmVersion }}" + + - name: Install app + working-directory: apps/${{ env.APP_NAME }} + run: | + make all + composer install --no-dev + + - name: Set up Nextcloud + if: ${{ matrix.databases != 'pgsql'}} + run: | + sleep 25 + mkdir data + ./occ maintenance:install --verbose --database=${{ matrix.databases }} --database-name=nextcloud --database-host=127.0.0.1 --database-port=$MYSQL_PORT --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass password + composer run serve & + + - name: Set up Nextcloud + if: ${{ matrix.databases == 'pgsql'}} + run: | + sleep 25 + mkdir data + ./occ maintenance:install --verbose --database=${{ matrix.databases }} --database-name=nextcloud --database-host=127.0.0.1 --database-port=$PGSQL_PORT --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass password + composer run serve & + + - name: Enable context_chat, app_api and testing + run: ./occ app:enable -vvv -f ${{ env.APP_NAME }} app_api testing + + - name: Enable encryption + if: ${{ matrix.encryption == 'on' }} + run: | + ./occ app:enable -vvv -f encryption + ./occ encryption:enable + + - name: Checkout documentation + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + repository: nextcloud/documentation + path: data/admin/files/documentation + persist-credentials: false + + - name: Checkout pdfs + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + repository: papers-we-love/papers-we-love + path: data/admin/files/papers + persist-credentials: false + + - name: Prepare docs + run: | + cd data/admin/files + mv documentation/admin_manual . + cp -R documentation/developer_manual . + cd developer_manual + find . -type f -name "*.rst" -exec bash -c 'mv "$0" "${0%.rst}.md"' {} \; + cd .. + cp -R documentation/developer_manual ./developer_manual2 + cd developer_manual2 + find . -type f -name "*.rst" -exec bash -c 'mv "$0" "${0%.rst}.txt"' {} \; + cd .. + rm -rf documentation + + - name: Reduce number of files + run: | + cd data/admin/files + LIMIT=100 + + # Find all files in the directory and its subdirectories + FILES=($(find papers/ -type f)) + + # Count the number of files + FILE_COUNT=${#FILES[@]} + + # Check if the current number of files exceeds the limit + if [ "$FILE_COUNT" -le "$LIMIT" ]; then + echo "No files need to be deleted. Current count: $FILE_COUNT" + exit 0 + fi + + # Calculate how many files to delete + FILES_TO_DELETE=$((FILE_COUNT - LIMIT)) + + # Sort files by modification time (oldest first) and delete the oldest ones + for FILE in $(ls -t "${FILES[@]}" | tail -n "$FILES_TO_DELETE"); do + echo "Deleting: $FILE" + rm "$FILE" + done + + echo "Deleted $FILES_TO_DELETE files. Current count: $((FILE_COUNT - FILES_TO_DELETE))" + + - name: Setup python 3.11 + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + with: + python-version: '3.11' + cache: 'pip' + cache-dependency-path: context_chat_backend/requirements.txt + + - name: Install and init backend + run: | + cd context_chat_backend + pip install --upgrade pip setuptools wheel + # use the cpu version of torch to not run out of space + pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu + sed -i '/torch(vision)?/d' requirements.txt + pip install -r requirements.txt + cp example.env .env + echo "NEXTCLOUD_URL=http://localhost:8080" >> .env + python3 -u ./main_em.py > em_backend_logs 2>&1 & + python3 -u ./main.py > backend_logs 2>&1 & + echo $! > ../pid.txt # Save the process ID (PID) + sleep 120 # Wait for the backend to get ready + + - name: Register backend + run: | + set -x + ./occ config:system:set debug --value true + ./occ config:system:set loglevel --value 1 + ./occ app_api:daemon:register --net host manual_install "Manual Install" manual-install http localhost http://localhost:8080 + timeout 120 ./occ app_api:app:register context_chat_backend manual_install --json-info "{\"appid\":\"context_chat_backend\",\"name\":\"Context Chat Backend\",\"daemon_config_name\":\"manual_install\",\"version\":\"${{ fromJson(steps.appinfo.outputs.result).version }}\",\"secret\":\"12345\",\"port\":10034,\"scopes\":[],\"system_app\":0}" --force-scopes --wait-finish + + - name: Scan files, baseline + run: | + ./occ files:scan admin + ./occ context_chat:scan admin -m text/plain + + - name: Check python memory usage + run: | + ps -p $(cat pid.txt) -o pid,cmd,%mem,rss --sort=-%mem + ps -p $(cat pid.txt) -o %mem --no-headers > initial_mem.txt + + - name: Scan files + run: | + ./occ files:scan admin + ./occ context_chat:scan admin -m text/markdown & + ./occ context_chat:scan admin -m text/x-rst & + ./occ context_chat:scan admin -m application/pdf & + wait + + - name: Check stats + run: | + ./occ context_chat:stats + + - name: Check python memory usage + run: | + ps -p $(cat pid.txt) -o pid,cmd,%mem,rss --sort=-%mem + ps -p $(cat pid.txt) -o %mem --no-headers > after_scan_mem.txt + + - name: Run the prompts + run: | + ./occ background-job:worker -v 'OC\TaskProcessing\SynchronousBackgroundJob' & + WORKER1_PID=$! + ./occ background-job:worker -v 'OC\TaskProcessing\SynchronousBackgroundJob' & + WORKER2_PID=$! + OUT1=$(./occ context_chat:prompt admin "Which factors are taken into account for the Ethical AI Rating?") + echo "$OUT1" + echo '--------------------------------------------------' + OUT2=$(./occ context_chat:prompt admin "Welche Faktoren beeinflussen das Ethical AI Rating?") + echo "$OUT2" + echo '--------------------------------------------------' + + OUT3=$(./occ context_chat:search admin "Welche Faktoren beeinflussen das Ethical AI Rating?") + echo "$OUT3" + echo "$OUT1" | grep -q "If all of these points are met, we give a Green label." || exit 1 + echo "$OUT2" | grep -q "If all of these points are met, we give a Green label." || exit 1 + echo "$OUT3" | grep -q "overview.rst" || exit 1 + + kill -9 $WORKER1_PID + kill -9 $WORKER2_PID + + - name: Check python memory usage + run: | + ps -p $(cat pid.txt) -o pid,cmd,%mem,rss --sort=-%mem + ps -p $(cat pid.txt) -o %mem --no-headers > after_prompt_mem.txt + + - name: Compare memory usage and detect leak + run: | + initial_mem=$(cat initial_mem.txt | tr -d ' ') + final_mem=$(cat after_scan_mem.txt | tr -d ' ') + echo "Initial Memory Usage: $initial_mem%" + echo "Memory Usage after scan: $final_mem%" + + if (( $(echo "$final_mem > $initial_mem" | bc -l) )); then + echo "Memory usage has increased during scan. Possible memory leak detected!" + else + echo "Memory usage during scan is stable. No memory leak detected." + fi + + - name: Compare memory usage and detect leak + run: | + initial_mem=$(cat after_scan_mem.txt | tr -d ' ') + final_mem=$(cat after_prompt_mem.txt | tr -d ' ') + echo "Initial Memory Usage: $initial_mem%" + echo "Memory Usage after prompt: $final_mem%" + + if (( $(echo "$final_mem > $initial_mem" | bc -l) )); then + echo "Memory usage has increased during prompt. Possible memory leak detected!" + else + echo "Memory usage during prompt is stable. No memory leak detected." + fi + + - name: Show nextcloud logs + if: always() + run: | + cat data/nextcloud.log + + - name: Show context chat logs + if: always() + run: | + cat data/context_chat.log + + - name: Show backend logs + if: always() + run: | + cat context_chat_backend/backend_logs || echo "No main backend logs" + cat context_chat_backend/em_backend_logs || echo "No embedding server logs" + echo '--------------------------------------------------' + tail -v -n +1 context_chat_backend/persistent_storage/logs/* || echo "No logs in logs directory" + + summary: + permissions: + contents: none + runs-on: ubuntu-latest-low + needs: [scan-test] + + if: always() + + # This is the summary, we just avoid to rename it so that branch protection rules still match + name: integration-test-scan + + steps: + - name: Summary status + run: if ${{ needs.scan-test.result != 'success' }}; then exit 1; fi diff --git a/.github/workflows/integration-test.yml b/.github/workflows/integration-test.yml deleted file mode 100644 index 89ff5c1..0000000 --- a/.github/workflows/integration-test.yml +++ /dev/null @@ -1,1120 +0,0 @@ -# SPDX-FileCopyrightText: Nextcloud contributors -# SPDX-License-Identifier: AGPL-3.0-or-later - -name: Integration test - -on: - pull_request: - branches: - - main - - stable* - push: - branches: - - main - - stable* - -env: - APP_NAME: context_chat - -permissions: - contents: read - -concurrency: - group: integration-test-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - - -jobs: - scan-test: - runs-on: ubuntu-24.04 - - strategy: - # do not stop on another job's failure - fail-fast: false - matrix: - php-versions: [ '8.1', '8.2' ] - databases: [ 'pgsql' ] - server-versions: [ 'stable32', 'master' ] - encryption: ['off'] - exclude: - - server-versions: master - databases: pgsql - php-versions: 8.1 - include: - - server-versions: master - databases: pgsql - php-versions: 8.2 - encryption: 'on' - - server-versions: stable32 - databases: pgsql - php-versions: 8.1 - encryption: 'on' - - name: Integration test ☁️${{ matrix.server-versions }} 🐘${{ matrix.php-versions }} πŸ”:${{ matrix.encryption }} - - env: - MYSQL_PORT: 4444 - PGSQL_PORT: 4445 - # use the same db for ccb and nextcloud - CCB_DB_URL: postgresql+psycopg://root:rootpassword@localhost:4445/nextcloud - - services: - mysql: - image: mariadb:10.5 - ports: - - 4444:3306/tcp - env: - MYSQL_ROOT_PASSWORD: rootpassword - options: --health-cmd="mysqladmin ping" --health-interval 5s --health-timeout 2s --health-retries 5 - postgres: - image: pgvector/pgvector:pg17 - ports: - - 4445:5432/tcp - env: - POSTGRES_USER: root - POSTGRES_PASSWORD: rootpassword - POSTGRES_DB: nextcloud - options: --health-cmd pg_isready --health-interval 5s --health-timeout 2s --health-retries 5 - - steps: - - name: Checkout server - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - with: - repository: nextcloud/server - ref: ${{ matrix.server-versions }} - submodules: recursive - persist-credentials: false - - - name: Set up php ${{ matrix.php-versions }} - uses: shivammathur/setup-php@cf4cade2721270509d5b1c766ab3549210a39a2a # 2.33.0 - with: - php-version: ${{ matrix.php-versions }} - tools: phpunit - extensions: mbstring, iconv, fileinfo, intl, sqlite, pdo_mysql, pdo_sqlite, pgsql, pdo_pgsql, gd, zip - - - name: Checkout app - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - with: - path: apps/${{ env.APP_NAME }} - persist-credentials: false - - - name: Checkout backend - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - with: - repository: nextcloud/context_chat_backend - path: context_chat_backend/ - persist-credentials: false - - - name: Checkout viewer - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - with: - repository: nextcloud/viewer - path: apps/viewer - persist-credentials: false - ref: ${{ matrix.server-versions }} - - - name: Get backend app version - id: appinfo - uses: skjnldsv/xpath-action@7e6a7c379d0e9abc8acaef43df403ab4fc4f770c # master - with: - filename: context_chat_backend/appinfo/info.xml - expression: "/info/version/text()" - - - name: Read package.json node and npm engines version - uses: skjnldsv/read-package-engines-version-actions@06d6baf7d8f41934ab630e97d9e6c0bc9c9ac5e4 # v3 - id: versions - with: - path: apps/${{ env.APP_NAME }} - fallbackNode: '^20' - fallbackNpm: '^10' - - - name: Set up node ${{ steps.versions.outputs.nodeVersion }} - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 - with: - node-version: ${{ steps.versions.outputs.nodeVersion }} - - - name: Set up npm ${{ steps.versions.outputs.npmVersion }} - run: npm i -g npm@"${{ steps.versions.outputs.npmVersion }}" - - - name: Install app - working-directory: apps/${{ env.APP_NAME }} - run: | - make all - composer install --no-dev - - - name: Set up Nextcloud - if: ${{ matrix.databases != 'pgsql'}} - run: | - sleep 25 - mkdir data - ./occ maintenance:install --verbose --database=${{ matrix.databases }} --database-name=nextcloud --database-host=127.0.0.1 --database-port=$MYSQL_PORT --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass password - composer run serve & - - - name: Set up Nextcloud - if: ${{ matrix.databases == 'pgsql'}} - run: | - sleep 25 - mkdir data - ./occ maintenance:install --verbose --database=${{ matrix.databases }} --database-name=nextcloud --database-host=127.0.0.1 --database-port=$PGSQL_PORT --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass password - composer run serve & - - - name: Enable context_chat, app_api and testing - run: ./occ app:enable -vvv -f ${{ env.APP_NAME }} app_api testing - - - name: Enable encryption - if: ${{ matrix.encryption == 'on' }} - run: | - ./occ app:enable -vvv -f encryption - ./occ encryption:enable - - - name: Checkout documentation - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - with: - repository: nextcloud/documentation - path: data/admin/files/documentation - persist-credentials: false - - - name: Checkout pdfs - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - with: - repository: papers-we-love/papers-we-love - path: data/admin/files/papers - persist-credentials: false - - - name: Prepare docs - run: | - cd data/admin/files - mv documentation/admin_manual . - cp -R documentation/developer_manual . - cd developer_manual - find . -type f -name "*.rst" -exec bash -c 'mv "$0" "${0%.rst}.md"' {} \; - cd .. - cp -R documentation/developer_manual ./developer_manual2 - cd developer_manual2 - find . -type f -name "*.rst" -exec bash -c 'mv "$0" "${0%.rst}.txt"' {} \; - cd .. - rm -rf documentation - - - name: Reduce number of files - run: | - cd data/admin/files - LIMIT=100 - - # Find all files in the directory and its subdirectories - FILES=($(find papers/ -type f)) - - # Count the number of files - FILE_COUNT=${#FILES[@]} - - # Check if the current number of files exceeds the limit - if [ "$FILE_COUNT" -le "$LIMIT" ]; then - echo "No files need to be deleted. Current count: $FILE_COUNT" - exit 0 - fi - - # Calculate how many files to delete - FILES_TO_DELETE=$((FILE_COUNT - LIMIT)) - - # Sort files by modification time (oldest first) and delete the oldest ones - for FILE in $(ls -t "${FILES[@]}" | tail -n "$FILES_TO_DELETE"); do - echo "Deleting: $FILE" - rm "$FILE" - done - - echo "Deleted $FILES_TO_DELETE files. Current count: $((FILE_COUNT - FILES_TO_DELETE))" - - - name: Setup python 3.11 - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 - with: - python-version: '3.11' - cache: 'pip' - cache-dependency-path: context_chat_backend/requirements.txt - - - name: Install and init backend - run: | - cd context_chat_backend - pip install --upgrade pip setuptools wheel - # use the cpu version of torch to not run out of space - pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu - sed -i '/torch(vision)?/d' requirements.txt - pip install -r requirements.txt - cp example.env .env - echo "NEXTCLOUD_URL=http://localhost:8080" >> .env - python3 -u ./main_em.py > em_backend_logs 2>&1 & - python3 -u ./main.py > backend_logs 2>&1 & - echo $! > ../pid.txt # Save the process ID (PID) - sleep 120 # Wait for the backend to get ready - - - name: Register backend - run: | - set -x - ./occ config:system:set debug --value true - ./occ config:system:set loglevel --value 1 - ./occ app_api:daemon:register --net host manual_install "Manual Install" manual-install http localhost http://localhost:8080 - timeout 120 ./occ app_api:app:register context_chat_backend manual_install --json-info "{\"appid\":\"context_chat_backend\",\"name\":\"Context Chat Backend\",\"daemon_config_name\":\"manual_install\",\"version\":\"${{ fromJson(steps.appinfo.outputs.result).version }}\",\"secret\":\"12345\",\"port\":10034,\"scopes\":[],\"system_app\":0}" --force-scopes --wait-finish - - - name: Scan files, baseline - run: | - ./occ files:scan admin - ./occ context_chat:scan admin -m text/plain - - - name: Check python memory usage - run: | - ps -p $(cat pid.txt) -o pid,cmd,%mem,rss --sort=-%mem - ps -p $(cat pid.txt) -o %mem --no-headers > initial_mem.txt - - - name: Scan files - run: | - ./occ files:scan admin - ./occ context_chat:scan admin -m text/markdown & - ./occ context_chat:scan admin -m text/x-rst & - ./occ context_chat:scan admin -m application/pdf & - wait - - - name: Check stats - run: | - ./occ context_chat:stats - - - name: Check python memory usage - run: | - ps -p $(cat pid.txt) -o pid,cmd,%mem,rss --sort=-%mem - ps -p $(cat pid.txt) -o %mem --no-headers > after_scan_mem.txt - - - name: Run the prompts - run: | - ./occ background-job:worker -v 'OC\TaskProcessing\SynchronousBackgroundJob' & - WORKER1_PID=$! - ./occ background-job:worker -v 'OC\TaskProcessing\SynchronousBackgroundJob' & - WORKER2_PID=$! - OUT1=$(./occ context_chat:prompt admin "Which factors are taken into account for the Ethical AI Rating?") - echo "$OUT1" - echo '--------------------------------------------------' - OUT2=$(./occ context_chat:prompt admin "Welche Faktoren beeinflussen das Ethical AI Rating?") - echo "$OUT2" - echo '--------------------------------------------------' - - OUT3=$(./occ context_chat:search admin "Welche Faktoren beeinflussen das Ethical AI Rating?") - echo "$OUT3" - echo "$OUT1" | grep -q "If all of these points are met, we give a Green label." || exit 1 - echo "$OUT2" | grep -q "If all of these points are met, we give a Green label." || exit 1 - echo "$OUT3" | grep -q "overview.rst" || exit 1 - - kill -9 $WORKER1_PID - kill -9 $WORKER2_PID - - - name: Check python memory usage - run: | - ps -p $(cat pid.txt) -o pid,cmd,%mem,rss --sort=-%mem - ps -p $(cat pid.txt) -o %mem --no-headers > after_prompt_mem.txt - - - name: Compare memory usage and detect leak - run: | - initial_mem=$(cat initial_mem.txt | tr -d ' ') - final_mem=$(cat after_scan_mem.txt | tr -d ' ') - echo "Initial Memory Usage: $initial_mem%" - echo "Memory Usage after scan: $final_mem%" - - if (( $(echo "$final_mem > $initial_mem" | bc -l) )); then - echo "Memory usage has increased during scan. Possible memory leak detected!" - else - echo "Memory usage during scan is stable. No memory leak detected." - fi - - - name: Compare memory usage and detect leak - run: | - initial_mem=$(cat after_scan_mem.txt | tr -d ' ') - final_mem=$(cat after_prompt_mem.txt | tr -d ' ') - echo "Initial Memory Usage: $initial_mem%" - echo "Memory Usage after prompt: $final_mem%" - - if (( $(echo "$final_mem > $initial_mem" | bc -l) )); then - echo "Memory usage has increased during prompt. Possible memory leak detected!" - else - echo "Memory usage during prompt is stable. No memory leak detected." - fi - - - name: Show nextcloud logs - if: always() - run: | - cat data/nextcloud.log - - - name: Show context chat logs - if: always() - run: | - cat data/context_chat.log - - - name: Show backend logs - if: always() - run: | - cat context_chat_backend/backend_logs || echo "No main backend logs" - cat context_chat_backend/em_backend_logs || echo "No embedding server logs" - echo '--------------------------------------------------' - tail -v -n +1 context_chat_backend/persistent_storage/logs/* || echo "No logs in logs directory" - - cron-test: - runs-on: ubuntu-24.04 - - strategy: - # do not stop on another job's failure - fail-fast: false - matrix: - php-versions: [ '8.1', '8.2' ] - databases: [ 'pgsql' ] - server-versions: [ 'stable32', 'master' ] - encryption: ['off'] - exclude: - - server-versions: master - databases: pgsql - php-versions: 8.1 - include: - - server-versions: master - databases: pgsql - php-versions: 8.2 - encryption: 'on' - - server-versions: stable32 - databases: pgsql - php-versions: 8.1 - encryption: 'on' - - name: Integration test with cron ☁️${{ matrix.server-versions }} 🐘${{ matrix.php-versions }} πŸ”:${{ matrix.encryption }} - - env: - MYSQL_PORT: 4444 - PGSQL_PORT: 4445 - # use the same db for ccb and nextcloud - CCB_DB_URL: postgresql+psycopg://root:rootpassword@localhost:4445/nextcloud - - services: - mysql: - image: mariadb:10.5 - ports: - - 4444:3306/tcp - env: - MYSQL_ROOT_PASSWORD: rootpassword - options: --health-cmd="mysqladmin ping" --health-interval 5s --health-timeout 2s --health-retries 5 - postgres: - image: pgvector/pgvector:pg17 - ports: - - 4445:5432/tcp - env: - POSTGRES_USER: root - POSTGRES_PASSWORD: rootpassword - POSTGRES_DB: nextcloud - options: --health-cmd pg_isready --health-interval 5s --health-timeout 2s --health-retries 5 - - steps: - - name: Checkout server - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - with: - repository: nextcloud/server - ref: ${{ matrix.server-versions }} - submodules: recursive - persist-credentials: false - - - name: Set up php ${{ matrix.php-versions }} - uses: shivammathur/setup-php@cf4cade2721270509d5b1c766ab3549210a39a2a # 2.33.0 - with: - php-version: ${{ matrix.php-versions }} - tools: phpunit - extensions: mbstring, iconv, fileinfo, intl, sqlite, pdo_mysql, pdo_sqlite, pgsql, pdo_pgsql, gd, zip - - - name: Checkout app - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - with: - path: apps/${{ env.APP_NAME }} - persist-credentials: false - - - name: Checkout backend - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - with: - repository: nextcloud/context_chat_backend - path: context_chat_backend/ - persist-credentials: false - - - name: Checkout viewer - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - with: - repository: nextcloud/viewer - path: apps/viewer - persist-credentials: false - ref: ${{ matrix.server-versions }} - - - name: Get backend app version - id: appinfo - uses: skjnldsv/xpath-action@7e6a7c379d0e9abc8acaef43df403ab4fc4f770c # master - with: - filename: context_chat_backend/appinfo/info.xml - expression: "/info/version/text()" - - - name: Read package.json node and npm engines version - uses: skjnldsv/read-package-engines-version-actions@06d6baf7d8f41934ab630e97d9e6c0bc9c9ac5e4 # v3 - id: versions - with: - path: apps/${{ env.APP_NAME }} - fallbackNode: '^20' - fallbackNpm: '^10' - - - name: Set up node ${{ steps.versions.outputs.nodeVersion }} - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 - with: - node-version: ${{ steps.versions.outputs.nodeVersion }} - - - name: Set up npm ${{ steps.versions.outputs.npmVersion }} - run: npm i -g npm@"${{ steps.versions.outputs.npmVersion }}" - - - name: Install app - working-directory: apps/${{ env.APP_NAME }} - run: | - make all - composer install --no-dev - - - name: Set up Nextcloud - if: ${{ matrix.databases != 'pgsql'}} - run: | - sleep 25 - mkdir data - ./occ maintenance:install --verbose --database=${{ matrix.databases }} --database-name=nextcloud --database-host=127.0.0.1 --database-port=$MYSQL_PORT --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass password - composer run serve & - - - name: Set up Nextcloud - if: ${{ matrix.databases == 'pgsql'}} - run: | - sleep 25 - mkdir data - ./occ maintenance:install --verbose --database=${{ matrix.databases }} --database-name=nextcloud --database-host=127.0.0.1 --database-port=$PGSQL_PORT --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass password - composer run serve & - - - name: Enable app_api and testing - run: ./occ app:enable -vvv -f app_api testing - - - name: Enable encryption - if: ${{ matrix.encryption == 'on' }} - run: | - ./occ app:enable -vvv -f encryption - ./occ encryption:enable - - - name: Setup python 3.11 - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 - with: - python-version: '3.11' - cache: 'pip' - cache-dependency-path: context_chat_backend/requirements.txt - - - name: Install and init backend - run: | - cd context_chat_backend - pip install --upgrade pip setuptools wheel - # use the cpu version of torch to not run out of space - pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu - sed -i '/torch(vision)?/d' requirements.txt - pip install -r requirements.txt - cp example.env .env - echo "NEXTCLOUD_URL=http://localhost:8080" >> .env - python3 -u ./main_em.py > em_backend_logs 2>&1 & - python3 -u ./main.py > backend_logs 2>&1 & - echo $! > ../pid.txt # Save the process ID (PID) - sleep 120 # Wait for the backend to get ready - - - name: Register backend - run: | - set -x - ./occ config:system:set debug --value true - ./occ config:system:set loglevel --value 1 - ./occ app_api:daemon:register --net host manual_install "Manual Install" manual-install http localhost http://localhost:8080 - timeout 120 ./occ app_api:app:register context_chat_backend manual_install --json-info "{\"appid\":\"context_chat_backend\",\"name\":\"Context Chat Backend\",\"daemon_config_name\":\"manual_install\",\"version\":\"${{ fromJson(steps.appinfo.outputs.result).version }}\",\"secret\":\"12345\",\"port\":10034,\"scopes\":[],\"system_app\":0}" --force-scopes --wait-finish - - - name: Checkout documentation - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - with: - repository: nextcloud/documentation - path: data/admin/files/documentation - persist-credentials: false - - - name: Checkout pdfs - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - with: - repository: papers-we-love/papers-we-love - path: data/admin/files/papers - ref: ad039b1e29ddb6ab1e217d39f16a5051c18ccc5a # to be deterministic - persist-credentials: false - - - name: Prepare docs - run: | - cd data/admin/files - mv documentation/admin_manual . - cp -R documentation/developer_manual . - cd developer_manual - find . -type f -name "*.rst" -exec bash -c 'mv "$0" "${0%.rst}.md"' {} \; - cd .. - cp -R documentation/developer_manual ./developer_manual2 - cd developer_manual2 - find . -type f -name "*.rst" -exec bash -c 'mv "$0" "${0%.rst}.txt"' {} \; - cd .. - rm -rf documentation - - - name: Reduce number of files - run: | - cd data/admin/files - LIMIT=100 - - # Find all files in the directory and its subdirectories - FILES=($(find papers/ -type f)) - - # Count the number of files - FILE_COUNT=${#FILES[@]} - - # Check if the current number of files exceeds the limit - if [ "$FILE_COUNT" -le "$LIMIT" ]; then - echo "No files need to be deleted. Current count: $FILE_COUNT" - exit 0 - fi - - # Calculate how many files to delete - FILES_TO_DELETE=$((FILE_COUNT - LIMIT)) - - # Sort files by modification time (oldest first) and delete the oldest ones - for FILE in $(ls -t "${FILES[@]}" | tail -n "$FILES_TO_DELETE"); do - echo "Deleting: $FILE" - rm "$FILE" - done - - echo "Deleted $FILES_TO_DELETE files. Current count: $((FILE_COUNT - FILES_TO_DELETE))" - - - name: Run files scan - run: | - ./occ files:scan admin # Do the scan before enabling context chat - - - name: Enable context chat - run: ./occ app:enable -vvv -f ${{ env.APP_NAME }} - - - name: Run indexer cron - run: | - # Run cron in speed mode: Set interval to 0 minutes - ./occ config:app:set --value 30 --type integer context_chat indexing_job_interval # 30 seconds - ./occ config:app:set --value 10 --type integer context_chat crawl_job_interval # 10 seconds - ./occ config:app:set --value '10' --type string context_chat action_job_interval # 10 seconds - ./occ config:app:set --value '10' --type string context_chat fs_listener_job_interval # 10 seconds - for i in {1..100}; do - php cron.php & # Starting with stable31 we can use -v here for better visibility - wait - ./occ context_chat:stats - done - - - name: Check context chat state - run: | - ./occ context_chat:stats - ./occ background-job:list - ./occ context_chat:stats | grep -q "Index complete time" || echo "Indexing did not complete" - ./occ context_chat:stats | awk ' - /Total eligible files/ { - total = $NF + 0 # force conversion to number - } - /files__default/ { - indexed = $NF; - sub(/,$/, "", indexed) # remove trailing comma - indexed = indexed + 0 # force conversion to number - } - END { - low = total * 0.85; - high = total * 1.15; - if (indexed >= low && indexed <= high) { - print "βœ… Indexed files (" indexed ") are within 15% of eligible files (" total ")."; - exit 0; - } else { - print "❌ Indexed files (" indexed ") are OUTSIDE the 15% range of eligible files (" total ")."; - exit 1; - } - } - ' - - - name: Run the prompts - run: | - ./occ background-job:worker -v 'OC\TaskProcessing\SynchronousBackgroundJob' & - WORKER1_PID=$! - ./occ background-job:worker -v 'OC\TaskProcessing\SynchronousBackgroundJob' & - WORKER2_PID=$! - OUT1=$(./occ context_chat:prompt admin "Which factors are taken into account for the Ethical AI Rating?") - echo "$OUT1" - echo '--------------------------------------------------' - OUT2=$(./occ context_chat:prompt admin "Welche Faktoren beeinflussen das Ethical AI Rating?") - echo "$OUT2" - echo '--------------------------------------------------' - - OUT3=$(./occ context_chat:search admin "Welche Faktoren beeinflussen das Ethical AI Rating?") - echo "$OUT3" - echo "$OUT1" | grep -q "If all of these points are met, we give a Green label." || exit 1 - echo "$OUT2" | grep -q "If all of these points are met, we give a Green label." || exit 1 - echo "$OUT3" | grep -q "overview.rst" || exit 1 - - kill -9 $WORKER1_PID - kill -9 $WORKER2_PID - - - name: Show nextcloud logs - if: always() - run: | - cat data/nextcloud.log - - - name: Show context chat logs - if: always() - run: | - cat data/context_chat.log - - - name: Show backend logs - if: always() - run: | - cat context_chat_backend/backend_logs || echo "No main backend logs" - cat context_chat_backend/em_backend_logs || echo "No embedding server logs" - echo '--------------------------------------------------' - tail -v -n +1 context_chat_backend/persistent_storage/logs/* || echo "No logs in logs directory" - - listener-test: - runs-on: ubuntu-24.04 - - strategy: - # do not stop on another job's failure - fail-fast: false - matrix: - php-versions: [ '8.1', '8.2' ] - databases: [ 'pgsql' ] - server-versions: [ 'stable32', 'master' ] - encryption: ['off'] - file-deletion-method: [ 'occ', 'os' ] - exclude: - - server-versions: master - databases: pgsql - php-versions: 8.1 - include: - - server-versions: master - databases: pgsql - php-versions: 8.2 - encryption: 'on' - file-deletion-method: 'occ' - - server-versions: stable32 - databases: pgsql - php-versions: 8.1 - encryption: 'on' - file-deletion-method: 'occ' - - - name: Integration test with file listener ☁️${{ matrix.server-versions }} 🐘${{ matrix.php-versions }} πŸ—‘οΈ${{ matrix.file-deletion-method }} πŸ”:${{ matrix.encryption }} - - env: - MYSQL_PORT: 4444 - PGSQL_PORT: 4445 - # use the same db for ccb and nextcloud - CCB_DB_URL: postgresql+psycopg://root:rootpassword@localhost:4445/nextcloud - - services: - mysql: - image: mariadb:10.5 - ports: - - 4444:3306/tcp - env: - MYSQL_ROOT_PASSWORD: rootpassword - options: --health-cmd="mysqladmin ping" --health-interval 5s --health-timeout 2s --health-retries 5 - postgres: - image: pgvector/pgvector:pg17 - ports: - - 4445:5432/tcp - env: - POSTGRES_USER: root - POSTGRES_PASSWORD: rootpassword - POSTGRES_DB: nextcloud - options: --health-cmd pg_isready --health-interval 5s --health-timeout 2s --health-retries 5 - - steps: - - name: Checkout server - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - with: - repository: nextcloud/server - ref: ${{ matrix.server-versions }} - submodules: recursive - persist-credentials: false - - - name: Set up php ${{ matrix.php-versions }} - uses: shivammathur/setup-php@cf4cade2721270509d5b1c766ab3549210a39a2a # 2.33.0 - with: - php-version: ${{ matrix.php-versions }} - tools: phpunit - extensions: mbstring, iconv, fileinfo, intl, sqlite, pdo_mysql, pdo_sqlite, pgsql, pdo_pgsql, gd, zip - - - name: Checkout app - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - with: - path: apps/${{ env.APP_NAME }} - persist-credentials: false - - - name: Checkout backend - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - with: - repository: nextcloud/context_chat_backend - path: context_chat_backend/ - persist-credentials: false - - - name: Checkout viewer - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - with: - repository: nextcloud/viewer - path: apps/viewer - persist-credentials: false - ref: ${{ matrix.server-versions }} - - - name: Get backend app version - id: appinfo - uses: skjnldsv/xpath-action@7e6a7c379d0e9abc8acaef43df403ab4fc4f770c # master - with: - filename: context_chat_backend/appinfo/info.xml - expression: "/info/version/text()" - - - name: Read package.json node and npm engines version - uses: skjnldsv/read-package-engines-version-actions@06d6baf7d8f41934ab630e97d9e6c0bc9c9ac5e4 # v3 - id: versions - with: - path: apps/${{ env.APP_NAME }} - fallbackNode: '^20' - fallbackNpm: '^10' - - - name: Set up node ${{ steps.versions.outputs.nodeVersion }} - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 - with: - node-version: ${{ steps.versions.outputs.nodeVersion }} - - - name: Set up npm ${{ steps.versions.outputs.npmVersion }} - run: npm i -g npm@"${{ steps.versions.outputs.npmVersion }}" - - - name: Install app - working-directory: apps/${{ env.APP_NAME }} - run: | - make all - composer install --no-dev - - - name: Set up Nextcloud - if: ${{ matrix.databases != 'pgsql'}} - run: | - sleep 25 - mkdir data - ./occ maintenance:install --verbose --database=${{ matrix.databases }} --database-name=nextcloud --database-host=127.0.0.1 --database-port=$MYSQL_PORT --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass password - composer run serve & - - - name: Set up Nextcloud - if: ${{ matrix.databases == 'pgsql'}} - run: | - sleep 25 - mkdir data - ./occ maintenance:install --verbose --database=${{ matrix.databases }} --database-name=nextcloud --database-host=127.0.0.1 --database-port=$PGSQL_PORT --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass password - composer run serve & - - - name: Enable app_api and testing - run: ./occ app:enable -vvv -f app_api testing - - - name: Enable encryption - if: ${{ matrix.encryption == 'on' }} - run: | - ./occ app:enable -vvv -f encryption - ./occ encryption:enable - - - name: Setup python 3.11 - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 - with: - python-version: '3.11' - cache: 'pip' - cache-dependency-path: context_chat_backend/requirements.txt - - - name: Install and init backend - run: | - cd context_chat_backend - pip install --upgrade pip setuptools wheel - # use the cpu version of torch to not run out of space - pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu - sed -i '/torch(vision)?/d' requirements.txt - pip install -r requirements.txt - cp example.env .env - echo "NEXTCLOUD_URL=http://localhost:8080" >> .env - python3 -u ./main_em.py > em_backend_logs 2>&1 & - python3 -u ./main.py > backend_logs 2>&1 & - echo $! > ../pid.txt # Save the process ID (PID) - sleep 120 # Wait for the backend to get ready - - - name: Register backend - run: | - set -x - ./occ config:system:set debug --value true - ./occ config:system:set loglevel --value 1 - ./occ app_api:daemon:register --net host manual_install "Manual Install" manual-install http localhost http://localhost:8080 - timeout 120 ./occ app_api:app:register context_chat_backend manual_install --json-info "{\"appid\":\"context_chat_backend\",\"name\":\"Context Chat Backend\",\"daemon_config_name\":\"manual_install\",\"version\":\"${{ fromJson(steps.appinfo.outputs.result).version }}\",\"secret\":\"12345\",\"port\":10034,\"scopes\":[],\"system_app\":0}" --force-scopes --wait-finish - - - name: Enable context chat - run: | - ./occ app:enable -vvv -f ${{ env.APP_NAME }} - # Run cron in speed mode - ./occ config:app:set --value 30 --type integer context_chat indexing_job_interval # 30 seconds - ./occ config:app:set --value 10 --type integer context_chat crawl_job_interval # 10 seconds - ./occ config:app:set --value '10' --type string context_chat action_job_interval # 10 seconds - ./occ config:app:set --value '10' --type string context_chat fs_listener_job_interval # 10 seconds - # Run normal indexing jobs which will only pick up welcome.txt etc - for i in {1..10}; do - php cron.php & # Starting with stable31 we can use -v here for better visibility - wait - ./occ context_chat:stats - done - - - name: Checkout documentation - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - with: - repository: nextcloud/documentation - path: data/admin/files/documentation - persist-credentials: false - - - name: Checkout pdfs - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - with: - repository: papers-we-love/papers-we-love - path: data/admin/files/papers - ref: ad039b1e29ddb6ab1e217d39f16a5051c18ccc5a # to be deterministic - persist-credentials: false - - - name: Prepare docs - run: | - cd data/admin/files - mv documentation/admin_manual . - cp -R documentation/developer_manual . - cd developer_manual - find . -type f -name "*.rst" -exec bash -c 'mv "$0" "${0%.rst}.md"' {} \; - cd .. - cp -R documentation/developer_manual ./developer_manual2 - cd developer_manual2 - find . -type f -name "*.rst" -exec bash -c 'mv "$0" "${0%.rst}.txt"' {} \; - cd .. - rm -rf documentation - - - name: Reduce number of files - run: | - cd data/admin/files - LIMIT=100 - - # Find all files in the directory and its subdirectories - FILES=($(find papers/ -type f)) - - # Count the number of files - FILE_COUNT=${#FILES[@]} - - # Check if the current number of files exceeds the limit - if [ "$FILE_COUNT" -le "$LIMIT" ]; then - echo "No files need to be deleted. Current count: $FILE_COUNT" - exit 0 - fi - - # Calculate how many files to delete - FILES_TO_DELETE=$((FILE_COUNT - LIMIT)) - - # Sort files by modification time (oldest first) and delete the oldest ones - for FILE in $(ls -t "${FILES[@]}" | tail -n "$FILES_TO_DELETE"); do - echo "Deleting: $FILE" - rm "$FILE" - done - - echo "Deleted $FILES_TO_DELETE files. Current count: $((FILE_COUNT - FILES_TO_DELETE))" - - - name: Run files scan - run: | - ./occ files:scan admin # We do the scan after enabling context chat here, so we can test the file listeners - - - name: Run indexer cron - run: | - for i in {1..100}; do - php cron.php & # Starting with stable31 we can use -v here for better visibility - wait - ./occ context_chat:stats - done - - - name: Check context chat state - run: | - ./occ context_chat:stats - ./occ background-job:list - ./occ context_chat:stats | grep -q "Index complete time" || echo "Indexing did not complete" - ./occ context_chat:stats | awk ' - /Total eligible files/ { - total = $NF + 0 # force conversion to number - } - /files__default/ { - indexed = $NF; - sub(/,$/, "", indexed) # remove trailing comma - indexed = indexed + 0 # force conversion to number - } - END { - low = total * 0.85; - high = total * 1.15; - if (indexed >= low && indexed <= high) { - print "βœ… Indexed files (" indexed ") are within 15% of eligible files (" total ")."; - exit 0; - } else { - print "❌ Indexed files (" indexed ") are OUTSIDE the 15% range of eligible files (" total ")."; - exit 1; - } - } - ' - - - name: Run the prompts - run: | - ./occ background-job:worker -v 'OC\TaskProcessing\SynchronousBackgroundJob' & - WORKER1_PID=$! - ./occ background-job:worker -v 'OC\TaskProcessing\SynchronousBackgroundJob' & - WORKER2_PID=$! - set +e - - # Check for user admin: Should be there - OUT_ADMIN_ENGLISH_PROMPT_AI=$(./occ context_chat:prompt admin "Which factors are taken into account for the Ethical AI Rating?") - OUT_ADMIN_GERMAN_PROMPT_AI=$(./occ context_chat:prompt admin "Welche Faktoren beeinflussen das Ethical AI Rating?") - OUT_ADMIN_SEARCH_AI=$(./occ context_chat:search admin "Welche Faktoren beeinflussen das Ethical AI Rating?") - - # Check for user test: Shouldn't be there - OUT_TEST_ENGLISH_PROMPT_AI=$(./occ context_chat:prompt test "Which factors are taken into account for the Ethical AI Rating?") - OUT_TEST_GERMAN_PROMPT_AI=$(./occ context_chat:prompt test "Welche Faktoren beeinflussen das Ethical AI Rating?") - OUT_TEST_SEARCH_AI=$(./occ context_chat:search test "Welche Faktoren beeinflussen das Ethical AI Rating?") - - # Check for user test: Shouldn't be there, because it was not shared yet - OUT_TEST_PROMPT_JOBS=$(./occ context_chat:prompt test "How do I set my TimedJob to be time insensitive?") - OUT_TEST_SEARCH_JOBS=$(./occ context_chat:search test "How do I set my TimedJob to be time insensitive?") - - echo "OUT_ADMIN_ENGLISH_PROMPT_AI" - echo "$OUT_ADMIN_ENGLISH_PROMPT_AI" - echo "OUT_ADMIN_GERMAN_PROMPT_AI" - echo "$OUT_ADMIN_GERMAN_PROMPT_AI" - echo "OUT_ADMIN_SEARCH_AI" - echo "$OUT_ADMIN_SEARCH_AI" - echo "OUT_TEST_ENGLISH_PROMPT_AI" - echo "$OUT_TEST_ENGLISH_PROMPT_AI" - echo "OUT_TEST_GERMAN_PROMPT_AI" - echo "$OUT_TEST_GERMAN_PROMPT_AI" - echo "OUT_TEST_SEARCH_AI" - echo "$OUT_TEST_SEARCH_AI" - echo "OUT_TEST_PROMPT_JOBS" - echo "$OUT_TEST_PROMPT_JOBS" - echo "OUT_TEST_SEARCH_JOBS" - echo "$OUT_TEST_SEARCH_JOBS" - - echo "$OUT_ADMIN_ENGLISH_PROMPT_AI" | grep -q "If all of these points are met, we give a Green label." && echo 'βœ… Admin does see AI overview' || exit 1 - echo "$OUT_ADMIN_GERMAN_PROMPT_AI" | grep -q "If all of these points are met, we give a Green label." && echo 'βœ… Admin does see AI overview, after german question' || exit 1 - echo "$OUT_ADMIN_SEARCH_AI" | grep -q "overview.rst" && echo 'βœ… Admin does see AI overview, when using search' || exit 1 - echo "$OUT_TEST_ENGLISH_PROMPT_AI" | grep -q -v "If all of these points are met, we give a Green label." && echo 'βœ… Test user does not see AI overview' || exit 1 - echo "$OUT_TEST_GERMAN_PROMPT_AI" | grep -q -v "If all of these points are met, we give a Green label." && echo 'βœ…Test user does not see AI overview, after german question' || exit 1 - echo "$OUT_TEST_SEARCH_AI" | grep -q -v "overview.rst" && echo 'βœ…Test user does not see AI overview, when using search' || exit 1 - echo "$OUT_TEST_PROMPT_JOBS" | grep -q -v "background jobs" && echo 'βœ…Test user does not see BackgroundJobs docs' || exit 1 - echo "$OUT_TEST_SEARCH_JOBS" | grep -q -v "backgroundjobs.md" && echo 'βœ…Test user does not see BackgroundJobs docs' || exit 1 - - kill -9 $WORKER1_PID - kill -9 $WORKER2_PID - - - name: Remove some files using occ - if: ${{ matrix.file-deletion-method == 'occ'}} - run: | - ./occ files:delete admin/files/admin_manual - - - name: Remove some files using os - if: ${{ matrix.file-deletion-method == 'os'}} - run: | - cd data/admin/files - rm -rf ./admin_manual # this + files:scan sadly doesn't work, currently see https://github.com/nextcloud/context_chat/issues/153 - cd ../../.. - ./occ files:scan admin # We run the scan again to check if the files are successfully removed from the vectordb - - - name: Share some files - run: | - OC_PASS=test ./occ user:add --password-from-env -- test - # share developer_manual to test user - curl -X POST -u 'admin:password' -H 'OCS-APIRequest: true' 'http://localhost:8080/ocs/v2.php/apps/files_sharing/api/v1/shares?shareType=0&shareWith=test&path=developer_manual' - # list files to trigger mounting of shares - curl -X PROPFIND -H "Depth: 0" -u 'test:test' 'http://localhost:8080/remote.php/webdav/' - - - name: Run indexer cron - run: | - for i in {1..100}; do - php cron.php & # Starting with stable31 we can use -v here for better visibility - wait - ./occ context_chat:stats - done - - - name: Run the prompts again - run: | - ./occ background-job:worker -v 'OC\TaskProcessing\SynchronousBackgroundJob' & - WORKER1_PID=$! - ./occ background-job:worker -v 'OC\TaskProcessing\SynchronousBackgroundJob' & - WORKER2_PID=$! - - set +e - - # Check for user admin: Shouldn't be there - OUT_ADMIN_ENGLISH_PROMPT_AI=$(./occ context_chat:prompt admin "Which factors are taken into account for the Ethical AI Rating?") - OUT_ADMIN_GERMAN_PROMPT_AI=$(./occ context_chat:prompt admin "Welche Faktoren beeinflussen das Ethical AI Rating?") - OUT_ADMIN_SEARCH_AI=$(./occ context_chat:search admin "Welche Faktoren beeinflussen das Ethical AI Rating?") - - # Check for user test: Shouldn't be there - OUT_TEST_ENGLISH_PROMPT_AI=$(./occ context_chat:prompt test "Which factors are taken into account for the Ethical AI Rating?") - OUT_TEST_GERMAN_PROMPT_AI=$(./occ context_chat:prompt test "Welche Faktoren beeinflussen das Ethical AI Rating?") - OUT_TEST_SEARCH_AI=$(./occ context_chat:search test "Welche Faktoren beeinflussen das Ethical AI Rating?") - - # Check for user test: Should be there, because it was shared - OUT_TEST_PROMPT_JOBS=$(./occ context_chat:prompt test "How do I set my TimedJob to be time insensitive?") - OUT_TEST_SEARCH_JOBS=$(./occ context_chat:search test "How do I set my TimedJob to be time insensitive?") - - echo "OUT_ADMIN_ENGLISH_PROMPT_AI" - echo "$OUT_ADMIN_ENGLISH_PROMPT_AI" - echo "OUT_ADMIN_GERMAN_PROMPT_AI" - echo "$OUT_ADMIN_GERMAN_PROMPT_AI" - echo "OUT_ADMIN_SEARCH_AI" - echo "$OUT_ADMIN_SEARCH_AI" - echo "OUT_TEST_ENGLISH_PROMPT_AI" - echo "$OUT_TEST_ENGLISH_PROMPT_AI" - echo "OUT_TEST_GERMAN_PROMPT_AI" - echo "$OUT_TEST_GERMAN_PROMPT_AI" - echo "OUT_TEST_SEARCH_AI" - echo "$OUT_TEST_SEARCH_AI" - echo "OUT_TEST_PROMPT_JOBS" - echo "$OUT_TEST_PROMPT_JOBS" - echo "OUT_TEST_SEARCH_JOBS" - echo "$OUT_TEST_SEARCH_JOBS" - - echo "$OUT_ADMIN_ENGLISH_PROMPT_AI" | grep -q -v "If all of these points are met, we give a Green label." && echo 'βœ… Admin does not see AI overview anymore' || exit 1 - echo "$OUT_ADMIN_GERMAN_PROMPT_AI" | grep -q -v "If all of these points are met, we give a Green label." && echo 'βœ… Admin does not see AI overview anymore, after german question' || exit 1 - echo "$OUT_ADMIN_SEARCH_AI" | grep -q -v "overview.rst" && echo 'βœ… Admin does not see AI overview anymore, when using search' || exit 1 - echo "$OUT_TEST_ENGLISH_PROMPT_AI" | grep -q -v "If all of these points are met, we give a Green label." && echo 'βœ… Test user does not see AI overview' || exit 1 - echo "$OUT_TEST_GERMAN_PROMPT_AI" | grep -q -v "If all of these points are met, we give a Green label." && echo 'βœ…Test user does not see AI overview, after german question' || exit 1 - echo "$OUT_TEST_SEARCH_AI" | grep -q -v "overview.rst" && echo 'βœ…Test user does not see AI overview, when using search' || exit 1 - echo "$OUT_TEST_PROMPT_JOBS" | grep -q "background jobs" && echo 'βœ…Test user does see BackgroundJobs docs' || exit 1 - echo "$OUT_TEST_SEARCH_JOBS" | grep -q "backgroundjobs.md" && echo 'βœ…Test user does see BackgroundJobs docs' || exit 1 - - kill -9 $WORKER1_PID - kill -9 $WORKER2_PID - - - name: Show nextcloud logs - if: always() - run: | - cat data/nextcloud.log - - - name: Show context chat logs - if: always() - run: | - cat data/context_chat.log - - - name: Show backend logs - if: always() - run: | - cat context_chat_backend/backend_logs || echo "No main backend logs" - cat context_chat_backend/em_backend_logs || echo "No embedding server logs" - echo '--------------------------------------------------' - tail -v -n +1 context_chat_backend/persistent_storage/logs/* || echo "No logs in logs directory" - - summary: - permissions: - contents: none - runs-on: ubuntu-latest-low - needs: [scan-test, cron-test, listener-test] - - if: always() - - # This is the summary, we just avoid to rename it so that branch protection rules still match - name: integration-test - - steps: - - name: Summary status - run: if ${{ needs.scan-test.rest != 'success' && needs.cron-test.result != 'success' && needs.listener-test.result != 'success' }}; then exit 1; fi From 7a36d1b7b87cb1e83bb07975db7ca391519f3ee7 Mon Sep 17 00:00:00 2001 From: Anupam Kumar Date: Fri, 10 Apr 2026 14:09:13 +0530 Subject: [PATCH 05/14] chore(ci): update gh workflows Signed-off-by: Anupam Kumar --- .github/workflows/appstore-build-publish.yml | 48 ++++++++++++-------- .github/workflows/lint-php-cs.yml | 6 +-- .github/workflows/lint-php.yml | 13 +++--- .github/workflows/node.yml | 18 +++++--- .github/workflows/pr-feedback.yml | 4 +- .github/workflows/psalm-matrix.yml | 12 +++-- .github/workflows/reuse.yml | 4 +- 7 files changed, 61 insertions(+), 44 deletions(-) diff --git a/.github/workflows/appstore-build-publish.yml b/.github/workflows/appstore-build-publish.yml index 0a05cd1..a46aa95 100644 --- a/.github/workflows/appstore-build-publish.yml +++ b/.github/workflows/appstore-build-publish.yml @@ -35,14 +35,14 @@ jobs: echo "APP_VERSION=${GITHUB_REF##*/}" >> $GITHUB_ENV - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false path: ${{ env.APP_NAME }} - name: Get app version number id: app-version - uses: skjnldsv/xpath-action@f5b036e9d973f42c86324833fd00be90665fbf77 # master + uses: skjnldsv/xpath-action@f5b036e9d973f42c86324833fd00be90665fbf77 # v1.0.0 with: filename: ${{ env.APP_NAME }}/appinfo/info.xml expression: "//info//version/text()" @@ -53,7 +53,7 @@ jobs: - name: Get appinfo data id: appinfo - uses: skjnldsv/xpath-action@f5b036e9d973f42c86324833fd00be90665fbf77 # master + uses: skjnldsv/xpath-action@f5b036e9d973f42c86324833fd00be90665fbf77 # v1.0.0 with: filename: ${{ env.APP_NAME }}/appinfo/info.xml expression: "//info//dependencies//nextcloud/@min-version" @@ -65,13 +65,13 @@ jobs: continue-on-error: true with: path: ${{ env.APP_NAME }} - fallbackNode: '^20' - fallbackNpm: '^10' + fallbackNode: '^24' + fallbackNpm: '^11.3' - name: Set up node ${{ steps.versions.outputs.nodeVersion }} # Skip if no package.json if: ${{ steps.versions.outputs.nodeVersion }} - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version: ${{ steps.versions.outputs.nodeVersion }} @@ -82,12 +82,12 @@ jobs: - name: Get php version id: php-versions - uses: icewind1991/nextcloud-version-matrix@58becf3b4bb6dc6cef677b15e2fd8e7d48c0908f # v1.3.1 + uses: icewind1991/nextcloud-version-matrix@8a7bac6300b2f0f3100088b297995a229558ddba # v1.3.2 with: filename: ${{ env.APP_NAME }}/appinfo/info.xml - name: Set up php ${{ steps.php-versions.outputs.php-min }} - uses: shivammathur/setup-php@cf4cade2721270509d5b1c766ab3549210a39a2a # v2.33.0 + uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f # v2.37.0 with: php-version: ${{ steps.php-versions.outputs.php-min }} coverage: none @@ -140,23 +140,31 @@ jobs: cd ${{ env.APP_NAME }} make appstore - - name: Checkout server ${{ fromJSON(steps.appinfo.outputs.result).nextcloud.min-version }} - continue-on-error: true - id: server-checkout + - name: Check server download link for ${{ fromJSON(steps.appinfo.outputs.result).nextcloud.min-version }} run: | NCVERSION='${{ fromJSON(steps.appinfo.outputs.result).nextcloud.min-version }}' - wget --quiet https://download.nextcloud.com/server/releases/latest-$NCVERSION.zip - unzip latest-$NCVERSION.zip + DOWNLOAD_URL=$(curl -s "https://updates.nextcloud.com/updater_server/latest?channel=beta&version=$NCVERSION" | jq -r '.downloads.zip[0]') + echo "DOWNLOAD_URL=$DOWNLOAD_URL" >> $GITHUB_ENV + + - name: Download server ${{ fromJSON(steps.appinfo.outputs.result).nextcloud.min-version }} + continue-on-error: true + id: server-download + if: ${{ env.DOWNLOAD_URL != 'null' }} + run: | + echo "Downloading release tarball from $DOWNLOAD_URL" + wget $DOWNLOAD_URL -O nextcloud.zip + unzip nextcloud.zip - name: Checkout server master fallback - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - if: ${{ steps.server-checkout.outcome != 'success' }} + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + if: ${{ steps.server-download.outcome != 'success' }} with: persist-credentials: false submodules: true repository: nextcloud/server path: nextcloud + - name: Sign app run: | # Extracting release @@ -164,7 +172,7 @@ jobs: tar -xvf ${{ env.APP_NAME }}.tar.gz cd ../../../ # Setting up keys - echo '${{ secrets.APP_PRIVATE_KEY }}' > ${{ env.APP_NAME }}.key + echo '${{ secrets.APP_PRIVATE_KEY }}' > ${{ env.APP_NAME }}.key # zizmor: ignore[secrets-outside-env] wget --quiet "https://github.com/nextcloud/app-certificate-requests/raw/master/${{ env.APP_NAME }}/${{ env.APP_NAME }}.crt" # Signing php nextcloud/occ integrity:sign-app --privateKey=../${{ env.APP_NAME }}.key --certificate=../${{ env.APP_NAME }}.crt --path=../${{ env.APP_NAME }}/build/artifacts/${{ env.APP_NAME }} @@ -173,7 +181,7 @@ jobs: tar -zcvf ${{ env.APP_NAME }}.tar.gz ${{ env.APP_NAME }} - name: Attach tarball to github release - uses: svenstaro/upload-release-action@04733e069f2d7f7f0b4aebc4fbdbce8613b03ccd # v2 + uses: svenstaro/upload-release-action@29e53e917877a24fad85510ded594ab3c9ca12de # v2.11.5 id: attach_to_release with: repo_token: ${{ secrets.GITHUB_TOKEN }} @@ -183,9 +191,9 @@ jobs: overwrite: true - name: Upload app to Nextcloud appstore - uses: nextcloud-releases/nextcloud-appstore-push-action@a011fe619bcf6e77ddebc96f9908e1af4071b9c1 # v1 + uses: nextcloud-releases/nextcloud-appstore-push-action@a011fe619bcf6e77ddebc96f9908e1af4071b9c1 # v1.0.3 with: app_name: ${{ env.APP_NAME }} - appstore_token: ${{ secrets.APPSTORE_TOKEN }} + appstore_token: ${{ secrets.APPSTORE_TOKEN }} # zizmor: ignore[secrets-outside-env] download_url: ${{ steps.attach_to_release.outputs.browser_download_url }} - app_private_key: ${{ secrets.APP_PRIVATE_KEY }} + app_private_key: ${{ secrets.APP_PRIVATE_KEY }} # zizmor: ignore[secrets-outside-env] diff --git a/.github/workflows/lint-php-cs.yml b/.github/workflows/lint-php-cs.yml index b19b56f..da40208 100644 --- a/.github/workflows/lint-php-cs.yml +++ b/.github/workflows/lint-php-cs.yml @@ -25,16 +25,16 @@ jobs: steps: - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false - name: Get php version id: versions - uses: icewind1991/nextcloud-version-matrix@58becf3b4bb6dc6cef677b15e2fd8e7d48c0908f # v1.3.1 + uses: icewind1991/nextcloud-version-matrix@8a7bac6300b2f0f3100088b297995a229558ddba # v1.3.2 - name: Set up php${{ steps.versions.outputs.php-min }} - uses: shivammathur/setup-php@cf4cade2721270509d5b1c766ab3549210a39a2a # v2.33.0 + uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f # v2.37.0 with: php-version: ${{ steps.versions.outputs.php-min }} extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, session, simplexml, xmlreader, xmlwriter, zip, zlib, sqlite, pdo_sqlite diff --git a/.github/workflows/lint-php.yml b/.github/workflows/lint-php.yml index 94de4b5..d1eafea 100644 --- a/.github/workflows/lint-php.yml +++ b/.github/workflows/lint-php.yml @@ -21,34 +21,35 @@ jobs: matrix: runs-on: ubuntu-latest-low outputs: - php-versions: ${{ steps.versions.outputs.php-versions }} + php-min: ${{ steps.versions.outputs.php-min }} + php-max: ${{ steps.versions.outputs.php-max }} steps: - name: Checkout app - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false - name: Get version matrix id: versions - uses: icewind1991/nextcloud-version-matrix@58becf3b4bb6dc6cef677b15e2fd8e7d48c0908f # v1.0.0 + uses: icewind1991/nextcloud-version-matrix@8a7bac6300b2f0f3100088b297995a229558ddba # v1.3.2 php-lint: runs-on: ubuntu-latest needs: matrix strategy: matrix: - php-versions: ${{fromJson(needs.matrix.outputs.php-versions)}} + php-versions: ['${{ needs.matrix.outputs.php-min }}', '${{ needs.matrix.outputs.php-max }}'] name: php-lint steps: - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false - name: Set up php ${{ matrix.php-versions }} - uses: shivammathur/setup-php@cf4cade2721270509d5b1c766ab3549210a39a2a # v2.33.0 + uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f # v2.37.0 with: php-version: ${{ matrix.php-versions }} extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, session, simplexml, xmlreader, xmlwriter, zip, zlib, sqlite, pdo_sqlite diff --git a/.github/workflows/node.yml b/.github/workflows/node.yml index d1f18a1..1ee7662 100644 --- a/.github/workflows/node.yml +++ b/.github/workflows/node.yml @@ -28,7 +28,7 @@ jobs: src: ${{ steps.changes.outputs.src}} steps: - - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 + - uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1 id: changes continue-on-error: true with: @@ -53,7 +53,7 @@ jobs: name: NPM build steps: - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false @@ -61,17 +61,23 @@ jobs: uses: skjnldsv/read-package-engines-version-actions@06d6baf7d8f41934ab630e97d9e6c0bc9c9ac5e4 # v3 id: versions with: - fallbackNode: '^20' - fallbackNpm: '^10' + fallbackNode: '^24' + fallbackNpm: '^11.3' - name: Set up node ${{ steps.versions.outputs.nodeVersion }} - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version: ${{ steps.versions.outputs.nodeVersion }} - name: Set up npm ${{ steps.versions.outputs.npmVersion }} run: npm i -g 'npm@${{ steps.versions.outputs.npmVersion }}' + - name: Validate package-lock.json # See https://github.com/npm/cli/issues/4460 + run: | + npm i -g npm-package-lock-add-resolved@1.1.4 + npm-package-lock-add-resolved + git --no-pager diff --exit-code + - name: Install dependencies & build env: CYPRESS_INSTALL_BINARY: 0 @@ -80,7 +86,7 @@ jobs: npm ci npm run build --if-present - - name: Check webpack build changes + - name: Check build changes run: | bash -c "[[ ! \"`git status --porcelain `\" ]] || (echo 'Please recompile and commit the assets, see the section \"Show changes on failure\" for details' && exit 1)" diff --git a/.github/workflows/pr-feedback.yml b/.github/workflows/pr-feedback.yml index 98e9fad..f4c0477 100644 --- a/.github/workflows/pr-feedback.yml +++ b/.github/workflows/pr-feedback.yml @@ -36,7 +36,7 @@ jobs: blocklist=$(curl https://raw.githubusercontent.com/nextcloud/.github/master/non-community-usernames.txt | paste -s -d, -) echo "blocklist=$blocklist" >> "$GITHUB_OUTPUT" - - uses: nextcloud/pr-feedback-action@1883b38a033fb16f576875e0cf45f98b857655c4 # main + - uses: nextcloud/pr-feedback-action@f0cab224dea8e1f282f9451de322f323c78fc7a5 # main with: feedback-message: | Hello there, @@ -50,6 +50,6 @@ jobs: (If you believe you should not receive this message, you can add yourself to the [blocklist](https://github.com/nextcloud/.github/blob/master/non-community-usernames.txt).) days-before-feedback: 14 - start-date: '2024-04-30' + start-date: '2025-06-12' exempt-authors: '${{ steps.blocklist.outputs.blocklist }},${{ steps.scrape.outputs.users }}' exempt-bots: true diff --git a/.github/workflows/psalm-matrix.yml b/.github/workflows/psalm-matrix.yml index 639a7a9..b22a423 100644 --- a/.github/workflows/psalm-matrix.yml +++ b/.github/workflows/psalm-matrix.yml @@ -24,13 +24,13 @@ jobs: ocp-matrix: ${{ steps.versions.outputs.ocp-matrix }} steps: - name: Checkout app - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false - name: Get version matrix id: versions - uses: icewind1991/nextcloud-version-matrix@58becf3b4bb6dc6cef677b15e2fd8e7d48c0908f # v1.3.1 + uses: icewind1991/nextcloud-version-matrix@8a7bac6300b2f0f3100088b297995a229558ddba # v1.3.2 - name: Check enforcement of minimum PHP version ${{ steps.versions.outputs.php-min }} in psalm.xml run: grep 'phpVersion="${{ steps.versions.outputs.php-min }}' psalm.xml @@ -46,12 +46,12 @@ jobs: name: static-psalm-analysis ${{ matrix.ocp-version }} steps: - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false - name: Set up php${{ matrix.php-min }} - uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e # v2.34.1 + uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f # v2.37.0 with: php-version: ${{ matrix.php-min }} extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, session, simplexml, xmlreader, xmlwriter, zip, zlib, sqlite, pdo_sqlite @@ -67,6 +67,8 @@ jobs: composer remove nextcloud/ocp --dev --no-scripts composer i + - name: Check for vulnerable PHP dependencies + run: composer require --dev roave/security-advisories:dev-latest - name: Install dependencies # zizmor: ignore[template-injection] run: composer require --dev 'nextcloud/ocp:${{ matrix.ocp-version }}' --ignore-platform-reqs --with-dependencies @@ -84,4 +86,4 @@ jobs: steps: - name: Summary status - run: if ${{ needs.static-analysis.result != 'success' }}; then exit 1; fi \ No newline at end of file + run: if ${{ needs.static-analysis.result != 'success' }}; then exit 1; fi diff --git a/.github/workflows/reuse.yml b/.github/workflows/reuse.yml index 95a8626..3f485f8 100644 --- a/.github/workflows/reuse.yml +++ b/.github/workflows/reuse.yml @@ -19,9 +19,9 @@ jobs: runs-on: ubuntu-latest-low steps: - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false - name: REUSE Compliance Check - uses: fsfe/reuse-action@bb774aa972c2a89ff34781233d275075cbddf542 # v5.0.0 + uses: fsfe/reuse-action@676e2d560c9a403aa252096d99fcab3e1132b0f5 # v6.0.0 From 821b0cba30faeb311f0e01e41bd2eec5585f6b3f Mon Sep 17 00:00:00 2001 From: Anupam Kumar Date: Fri, 10 Apr 2026 14:14:33 +0530 Subject: [PATCH 06/14] fix(ci): add a folder/files filter for integration tests Signed-off-by: Anupam Kumar --- .github/workflows/integration-test-cron.yml | 24 +++++++++++++++++++ .../integration-test-file-listener.yml | 24 +++++++++++++++++++ .github/workflows/integration-test-scan.yml | 24 +++++++++++++++++++ 3 files changed, 72 insertions(+) diff --git a/.github/workflows/integration-test-cron.yml b/.github/workflows/integration-test-cron.yml index 665133e..be6f94f 100644 --- a/.github/workflows/integration-test-cron.yml +++ b/.github/workflows/integration-test-cron.yml @@ -25,6 +25,30 @@ concurrency: jobs: + changes: + runs-on: ubuntu-latest-low + permissions: + contents: read + pull-requests: read + + outputs: + src: ${{ steps.changes.outputs.src}} + + steps: + - uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1 + id: changes + continue-on-error: true + with: + filters: | + src: + - '.github/workflows/**' + - 'lib/**' + - 'stubs/**' + - 'templates/**' + - 'appinfo/info.xml' + - 'composer.json' + - 'composer.lock' + cron-test: runs-on: ubuntu-24.04 diff --git a/.github/workflows/integration-test-file-listener.yml b/.github/workflows/integration-test-file-listener.yml index 3ad91e9..a65294f 100644 --- a/.github/workflows/integration-test-file-listener.yml +++ b/.github/workflows/integration-test-file-listener.yml @@ -25,6 +25,30 @@ concurrency: jobs: + changes: + runs-on: ubuntu-latest-low + permissions: + contents: read + pull-requests: read + + outputs: + src: ${{ steps.changes.outputs.src}} + + steps: + - uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1 + id: changes + continue-on-error: true + with: + filters: | + src: + - '.github/workflows/**' + - 'lib/**' + - 'stubs/**' + - 'templates/**' + - 'appinfo/info.xml' + - 'composer.json' + - 'composer.lock' + file-listener-test: runs-on: ubuntu-24.04 diff --git a/.github/workflows/integration-test-scan.yml b/.github/workflows/integration-test-scan.yml index 9399137..8f5a092 100644 --- a/.github/workflows/integration-test-scan.yml +++ b/.github/workflows/integration-test-scan.yml @@ -25,6 +25,30 @@ concurrency: jobs: + changes: + runs-on: ubuntu-latest-low + permissions: + contents: read + pull-requests: read + + outputs: + src: ${{ steps.changes.outputs.src}} + + steps: + - uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1 + id: changes + continue-on-error: true + with: + filters: | + src: + - '.github/workflows/**' + - 'lib/**' + - 'stubs/**' + - 'templates/**' + - 'appinfo/info.xml' + - 'composer.json' + - 'composer.lock' + scan-test: runs-on: ubuntu-24.04 From 5b33d78a561cd25c3fcaa3540b0089a8eae6b907 Mon Sep 17 00:00:00 2001 From: Anupam Kumar Date: Fri, 10 Apr 2026 15:48:00 +0530 Subject: [PATCH 07/14] fix(ci): reduce CI time while testing most of the functionality Signed-off-by: Anupam Kumar --- .github/workflows/integration-test-cron.yml | 8 ++----- .../integration-test-file-listener.yml | 23 +++---------------- .github/workflows/integration-test-scan.yml | 17 ++------------ 3 files changed, 7 insertions(+), 41 deletions(-) diff --git a/.github/workflows/integration-test-cron.yml b/.github/workflows/integration-test-cron.yml index be6f94f..0e3a8cb 100644 --- a/.github/workflows/integration-test-cron.yml +++ b/.github/workflows/integration-test-cron.yml @@ -56,14 +56,10 @@ jobs: # do not stop on another job's failure fail-fast: false matrix: - php-versions: [ '8.1', '8.2' ] + php-versions: [ '8.2' ] databases: [ 'pgsql' ] - server-versions: [ 'stable32', 'master' ] + server-versions: [ 'stable32', 'stable33', 'master' ] encryption: ['off'] - exclude: - - server-versions: master - databases: pgsql - php-versions: 8.1 include: - server-versions: master databases: pgsql diff --git a/.github/workflows/integration-test-file-listener.yml b/.github/workflows/integration-test-file-listener.yml index a65294f..00e1aaf 100644 --- a/.github/workflows/integration-test-file-listener.yml +++ b/.github/workflows/integration-test-file-listener.yml @@ -56,27 +56,10 @@ jobs: # do not stop on another job's failure fail-fast: false matrix: - php-versions: [ '8.1', '8.2' ] + php-versions: [ '8.2' ] databases: [ 'pgsql' ] - server-versions: [ 'stable32', 'master' ] - encryption: ['off'] - file-deletion-method: [ 'occ', 'os' ] - exclude: - - server-versions: master - databases: pgsql - php-versions: 8.1 - include: - - server-versions: master - databases: pgsql - php-versions: 8.2 - encryption: 'on' - file-deletion-method: 'occ' - - server-versions: stable32 - databases: pgsql - php-versions: 8.1 - encryption: 'on' - file-deletion-method: 'occ' - + server-versions: [ 'master' ] + encryption: ['on'] name: Integration test - File listener ☁️${{ matrix.server-versions }} 🐘${{ matrix.php-versions }} πŸ—‘οΈ${{ matrix.file-deletion-method }} πŸ”:${{ matrix.encryption }} diff --git a/.github/workflows/integration-test-scan.yml b/.github/workflows/integration-test-scan.yml index 8f5a092..b6e55fa 100644 --- a/.github/workflows/integration-test-scan.yml +++ b/.github/workflows/integration-test-scan.yml @@ -56,23 +56,10 @@ jobs: # do not stop on another job's failure fail-fast: false matrix: - php-versions: [ '8.1', '8.2' ] + php-versions: [ '8.2' ] databases: [ 'pgsql' ] - server-versions: [ 'stable32', 'master' ] + server-versions: [ 'master' ] encryption: ['off'] - exclude: - - server-versions: master - databases: pgsql - php-versions: 8.1 - include: - - server-versions: master - databases: pgsql - php-versions: 8.2 - encryption: 'on' - - server-versions: stable32 - databases: pgsql - php-versions: 8.1 - encryption: 'on' name: Integration test - OCC Scan ☁️${{ matrix.server-versions }} 🐘${{ matrix.php-versions }} πŸ”:${{ matrix.encryption }} From 51f74c870891059ea53638d8f1a445e545b0bcb3 Mon Sep 17 00:00:00 2001 From: Anupam Kumar Date: Fri, 10 Apr 2026 15:51:44 +0530 Subject: [PATCH 08/14] fix(ci): requires changes step in integration tests Signed-off-by: Anupam Kumar --- .github/workflows/integration-test-cron.yml | 4 ++-- .github/workflows/integration-test-file-listener.yml | 4 ++-- .github/workflows/integration-test-scan.yml | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/integration-test-cron.yml b/.github/workflows/integration-test-cron.yml index 0e3a8cb..995bb9c 100644 --- a/.github/workflows/integration-test-cron.yml +++ b/.github/workflows/integration-test-cron.yml @@ -365,7 +365,7 @@ jobs: permissions: contents: none runs-on: ubuntu-latest-low - needs: [cron-test] + needs: [changes, cron-test] if: always() @@ -374,4 +374,4 @@ jobs: steps: - name: Summary status - run: if ${{ needs.cron-test.result != 'success' }}; then exit 1; fi + run: if ${{ needs.changes.outputs.src != 'false' && needs.cron-test.result != 'success' }}; then exit 1; fi diff --git a/.github/workflows/integration-test-file-listener.yml b/.github/workflows/integration-test-file-listener.yml index 00e1aaf..6ea19d0 100644 --- a/.github/workflows/integration-test-file-listener.yml +++ b/.github/workflows/integration-test-file-listener.yml @@ -473,7 +473,7 @@ jobs: permissions: contents: none runs-on: ubuntu-latest-low - needs: [file-listener-test] + needs: [changes, file-listener-test] if: always() @@ -482,4 +482,4 @@ jobs: steps: - name: Summary status - run: if ${{ needs.file-listener-test.result != 'success' }}; then exit 1; fi + run: if ${{ needs.changes.outputs.src != 'false' && needs.file-listener-test.result != 'success' }}; then exit 1; fi diff --git a/.github/workflows/integration-test-scan.yml b/.github/workflows/integration-test-scan.yml index b6e55fa..bb67be4 100644 --- a/.github/workflows/integration-test-scan.yml +++ b/.github/workflows/integration-test-scan.yml @@ -366,7 +366,7 @@ jobs: permissions: contents: none runs-on: ubuntu-latest-low - needs: [scan-test] + needs: [changes, scan-test] if: always() @@ -375,4 +375,4 @@ jobs: steps: - name: Summary status - run: if ${{ needs.scan-test.result != 'success' }}; then exit 1; fi + run: if ${{ needs.changes.outputs.src != 'false' && needs.scan-test.result != 'success' }}; then exit 1; fi From 60e52c860257916d547f4fbd3605a55b3d4178b7 Mon Sep 17 00:00:00 2001 From: Anupam Kumar Date: Fri, 10 Apr 2026 15:55:27 +0530 Subject: [PATCH 09/14] fix(composer): use dev-stable32 and update composer deps Signed-off-by: Anupam Kumar --- composer.json | 2 +- composer.lock | 682 ++++++++++++++++++++++++++++---------------------- 2 files changed, 388 insertions(+), 296 deletions(-) diff --git a/composer.json b/composer.json index f6f1693..f2fa44d 100644 --- a/composer.json +++ b/composer.json @@ -22,7 +22,7 @@ }, "require-dev": { "nextcloud/coding-standard": "^1.3.2", - "nextcloud/ocp": "dev-master", + "nextcloud/ocp": "dev-stable32", "roave/security-advisories": "dev-latest", "phpunit/phpunit": "^10.5", "vimeo/psalm": "^6.11.0" diff --git a/composer.lock b/composer.lock index 4dcfaa5..648692a 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "fba4467f030c337977c89de488890411", + "content-hash": "4f9c6d3e45fa5eb0a5fab8a47d07834b", "packages": [], "packages-dev": [ { @@ -319,16 +319,16 @@ }, { "name": "amphp/parallel", - "version": "v2.3.2", + "version": "v2.3.3", "source": { "type": "git", "url": "https://github.com/amphp/parallel.git", - "reference": "321b45ae771d9c33a068186b24117e3cd1c48dce" + "reference": "296b521137a54d3a02425b464e5aee4c93db2c60" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/parallel/zipball/321b45ae771d9c33a068186b24117e3cd1c48dce", - "reference": "321b45ae771d9c33a068186b24117e3cd1c48dce", + "url": "https://api.github.com/repos/amphp/parallel/zipball/296b521137a54d3a02425b464e5aee4c93db2c60", + "reference": "296b521137a54d3a02425b464e5aee4c93db2c60", "shasum": "" }, "require": { @@ -391,7 +391,7 @@ ], "support": { "issues": "https://github.com/amphp/parallel/issues", - "source": "https://github.com/amphp/parallel/tree/v2.3.2" + "source": "https://github.com/amphp/parallel/tree/v2.3.3" }, "funding": [ { @@ -399,7 +399,7 @@ "type": "github" } ], - "time": "2025-08-27T21:55:40+00:00" + "time": "2025-11-15T06:23:42+00:00" }, { "name": "amphp/parser", @@ -600,24 +600,27 @@ }, { "name": "amphp/serialization", - "version": "v1.0.0", + "version": "v1.1.0", "source": { "type": "git", "url": "https://github.com/amphp/serialization.git", - "reference": "693e77b2fb0b266c3c7d622317f881de44ae94a1" + "reference": "fdf2834d78cebb0205fb2672676c1b1eb84371f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/serialization/zipball/693e77b2fb0b266c3c7d622317f881de44ae94a1", - "reference": "693e77b2fb0b266c3c7d622317f881de44ae94a1", + "url": "https://api.github.com/repos/amphp/serialization/zipball/fdf2834d78cebb0205fb2672676c1b1eb84371f0", + "reference": "fdf2834d78cebb0205fb2672676c1b1eb84371f0", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.4" }, "require-dev": { - "amphp/php-cs-fixer-config": "dev-master", - "phpunit/phpunit": "^9 || ^8 || ^7" + "amphp/php-cs-fixer-config": "^2", + "ext-json": "*", + "ext-zlib": "*", + "phpunit/phpunit": "^9", + "psalm/phar": "6.16.1" }, "type": "library", "autoload": { @@ -652,9 +655,15 @@ ], "support": { "issues": "https://github.com/amphp/serialization/issues", - "source": "https://github.com/amphp/serialization/tree/master" + "source": "https://github.com/amphp/serialization/tree/v1.1.0" }, - "time": "2020-03-25T21:39:07+00:00" + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2026-04-05T15:59:53+00:00" }, { "name": "amphp/socket", @@ -1039,22 +1048,22 @@ }, { "name": "danog/advanced-json-rpc", - "version": "v3.2.2", + "version": "v3.2.3", "source": { "type": "git", "url": "https://github.com/danog/php-advanced-json-rpc.git", - "reference": "aadb1c4068a88c3d0530cfe324b067920661efcb" + "reference": "ae703ea7b4811797a10590b6078de05b3b33dd91" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/danog/php-advanced-json-rpc/zipball/aadb1c4068a88c3d0530cfe324b067920661efcb", - "reference": "aadb1c4068a88c3d0530cfe324b067920661efcb", + "url": "https://api.github.com/repos/danog/php-advanced-json-rpc/zipball/ae703ea7b4811797a10590b6078de05b3b33dd91", + "reference": "ae703ea7b4811797a10590b6078de05b3b33dd91", "shasum": "" }, "require": { "netresearch/jsonmapper": "^5", "php": ">=8.1", - "phpdocumentor/reflection-docblock": "^4.3.4 || ^5.0.0" + "phpdocumentor/reflection-docblock": "^4.3.4 || ^5.0.0 || ^6" }, "replace": { "felixfbecker/php-advanced-json-rpc": "^3" @@ -1085,9 +1094,9 @@ "description": "A more advanced JSONRPC implementation", "support": { "issues": "https://github.com/danog/php-advanced-json-rpc/issues", - "source": "https://github.com/danog/php-advanced-json-rpc/tree/v3.2.2" + "source": "https://github.com/danog/php-advanced-json-rpc/tree/v3.2.3" }, - "time": "2025-02-14T10:55:15+00:00" + "time": "2026-01-12T21:07:10+00:00" }, { "name": "daverandom/libdns", @@ -1172,29 +1181,29 @@ }, { "name": "doctrine/deprecations", - "version": "1.1.5", + "version": "1.1.6", "source": { "type": "git", "url": "https://github.com/doctrine/deprecations.git", - "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38" + "reference": "d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", - "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca", + "reference": "d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, "conflict": { - "phpunit/phpunit": "<=7.5 || >=13" + "phpunit/phpunit": "<=7.5 || >=14" }, "require-dev": { - "doctrine/coding-standard": "^9 || ^12 || ^13", - "phpstan/phpstan": "1.4.10 || 2.1.11", + "doctrine/coding-standard": "^9 || ^12 || ^14", + "phpstan/phpstan": "1.4.10 || 2.1.30", "phpstan/phpstan-phpunit": "^1.0 || ^2", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12.4 || ^13.0", "psr/log": "^1 || ^2 || ^3" }, "suggest": { @@ -1214,9 +1223,9 @@ "homepage": "https://www.doctrine-project.org/", "support": { "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/1.1.5" + "source": "https://github.com/doctrine/deprecations/tree/1.1.6" }, - "time": "2025-04-07T20:06:18+00:00" + "time": "2026-02-07T07:09:04+00:00" }, { "name": "felixfbecker/language-server-protocol", @@ -1395,16 +1404,16 @@ }, { "name": "kubawerlos/php-cs-fixer-custom-fixers", - "version": "v3.35.1", + "version": "v3.36.1", "source": { "type": "git", "url": "https://github.com/kubawerlos/php-cs-fixer-custom-fixers.git", - "reference": "2a35f80ae24ca77443a7af1599c3a3db1b6bd395" + "reference": "ec9776e80f5ea9bf0d8ec16d662e431bfab19a24" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/kubawerlos/php-cs-fixer-custom-fixers/zipball/2a35f80ae24ca77443a7af1599c3a3db1b6bd395", - "reference": "2a35f80ae24ca77443a7af1599c3a3db1b6bd395", + "url": "https://api.github.com/repos/kubawerlos/php-cs-fixer-custom-fixers/zipball/ec9776e80f5ea9bf0d8ec16d662e431bfab19a24", + "reference": "ec9776e80f5ea9bf0d8ec16d662e431bfab19a24", "shasum": "" }, "require": { @@ -1414,7 +1423,7 @@ "php": "^7.4 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "^9.6.24 || ^10.5.51 || ^11.5.32" + "phpunit/phpunit": "^9.6.24 || ^10.5.51 || ^11.5.44" }, "type": "library", "autoload": { @@ -1435,7 +1444,7 @@ "description": "A set of custom fixers for PHP CS Fixer", "support": { "issues": "https://github.com/kubawerlos/php-cs-fixer-custom-fixers/issues", - "source": "https://github.com/kubawerlos/php-cs-fixer-custom-fixers/tree/v3.35.1" + "source": "https://github.com/kubawerlos/php-cs-fixer-custom-fixers/tree/v3.36.1" }, "funding": [ { @@ -1443,37 +1452,42 @@ "type": "github" } ], - "time": "2025-09-28T18:43:35+00:00" + "time": "2026-03-07T11:35:13+00:00" }, { "name": "league/uri", - "version": "7.5.1", + "version": "7.8.1", "source": { "type": "git", "url": "https://github.com/thephpleague/uri.git", - "reference": "81fb5145d2644324614cc532b28efd0215bda430" + "reference": "08cf38e3924d4f56238125547b5720496fac8fd4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/uri/zipball/81fb5145d2644324614cc532b28efd0215bda430", - "reference": "81fb5145d2644324614cc532b28efd0215bda430", + "url": "https://api.github.com/repos/thephpleague/uri/zipball/08cf38e3924d4f56238125547b5720496fac8fd4", + "reference": "08cf38e3924d4f56238125547b5720496fac8fd4", "shasum": "" }, "require": { - "league/uri-interfaces": "^7.5", - "php": "^8.1" + "league/uri-interfaces": "^7.8.1", + "php": "^8.1", + "psr/http-factory": "^1" }, "conflict": { "league/uri-schemes": "^1.0" }, "suggest": { "ext-bcmath": "to improve IPV4 host parsing", + "ext-dom": "to convert the URI into an HTML anchor tag", "ext-fileinfo": "to create Data URI from file contennts", "ext-gmp": "to improve IPV4 host parsing", "ext-intl": "to handle IDN host with the best performance", - "jeremykendall/php-domain-parser": "to resolve Public Suffix and Top Level Domain", - "league/uri-components": "Needed to easily manipulate URI objects components", + "ext-uri": "to use the PHP native URI class", + "jeremykendall/php-domain-parser": "to further parse the URI host and resolve its Public Suffix and Top Level Domain", + "league/uri-components": "to provide additional tools to manipulate URI objects components", + "league/uri-polyfill": "to backport the PHP URI extension for older versions of PHP", "php-64bit": "to improve IPV4 host parsing", + "rowbot/url": "to handle URLs using the WHATWG URL Living Standard specification", "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" }, "type": "library", @@ -1501,6 +1515,7 @@ "description": "URI manipulation library", "homepage": "https://uri.thephpleague.com", "keywords": [ + "URN", "data-uri", "file-uri", "ftp", @@ -1513,9 +1528,11 @@ "psr-7", "query-string", "querystring", + "rfc2141", "rfc3986", "rfc3987", "rfc6570", + "rfc8141", "uri", "uri-template", "url", @@ -1525,7 +1542,7 @@ "docs": "https://uri.thephpleague.com", "forum": "https://thephpleague.slack.com", "issues": "https://github.com/thephpleague/uri-src/issues", - "source": "https://github.com/thephpleague/uri/tree/7.5.1" + "source": "https://github.com/thephpleague/uri/tree/7.8.1" }, "funding": [ { @@ -1533,26 +1550,25 @@ "type": "github" } ], - "time": "2024-12-08T08:40:02+00:00" + "time": "2026-03-15T20:22:25+00:00" }, { "name": "league/uri-interfaces", - "version": "7.5.0", + "version": "7.8.1", "source": { "type": "git", "url": "https://github.com/thephpleague/uri-interfaces.git", - "reference": "08cfc6c4f3d811584fb09c37e2849e6a7f9b0742" + "reference": "85d5c77c5d6d3af6c54db4a78246364908f3c928" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/08cfc6c4f3d811584fb09c37e2849e6a7f9b0742", - "reference": "08cfc6c4f3d811584fb09c37e2849e6a7f9b0742", + "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/85d5c77c5d6d3af6c54db4a78246364908f3c928", + "reference": "85d5c77c5d6d3af6c54db4a78246364908f3c928", "shasum": "" }, "require": { "ext-filter": "*", "php": "^8.1", - "psr/http-factory": "^1", "psr/http-message": "^1.1 || ^2.0" }, "suggest": { @@ -1560,6 +1576,7 @@ "ext-gmp": "to improve IPV4 host parsing", "ext-intl": "to handle IDN host with the best performance", "php-64bit": "to improve IPV4 host parsing", + "rowbot/url": "to handle URLs using the WHATWG URL Living Standard specification", "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" }, "type": "library", @@ -1584,7 +1601,7 @@ "homepage": "https://nyamsprod.com" } ], - "description": "Common interfaces and classes for URI representation and interaction", + "description": "Common tools for parsing and resolving RFC3987/RFC3986 URI", "homepage": "https://uri.thephpleague.com", "keywords": [ "data-uri", @@ -1609,7 +1626,7 @@ "docs": "https://uri.thephpleague.com", "forum": "https://thephpleague.slack.com", "issues": "https://github.com/thephpleague/uri-src/issues", - "source": "https://github.com/thephpleague/uri-interfaces/tree/7.5.0" + "source": "https://github.com/thephpleague/uri-interfaces/tree/7.8.1" }, "funding": [ { @@ -1617,7 +1634,7 @@ "type": "github" } ], - "time": "2024-12-08T08:18:47+00:00" + "time": "2026-03-08T20:05:35+00:00" }, { "name": "myclabs/deep-copy", @@ -1681,16 +1698,16 @@ }, { "name": "netresearch/jsonmapper", - "version": "v5.0.0", + "version": "v5.0.1", "source": { "type": "git", "url": "https://github.com/cweiske/jsonmapper.git", - "reference": "8c64d8d444a5d764c641ebe97e0e3bc72b25bf6c" + "reference": "980674efdda65913492d29a8fd51c82270dd37bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/8c64d8d444a5d764c641ebe97e0e3bc72b25bf6c", - "reference": "8c64d8d444a5d764c641ebe97e0e3bc72b25bf6c", + "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/980674efdda65913492d29a8fd51c82270dd37bb", + "reference": "980674efdda65913492d29a8fd51c82270dd37bb", "shasum": "" }, "require": { @@ -1726,9 +1743,9 @@ "support": { "email": "cweiske@cweiske.de", "issues": "https://github.com/cweiske/jsonmapper/issues", - "source": "https://github.com/cweiske/jsonmapper/tree/v5.0.0" + "source": "https://github.com/cweiske/jsonmapper/tree/v5.0.1" }, - "time": "2024-09-08T10:20:00+00:00" + "time": "2026-02-22T16:28:03+00:00" }, { "name": "nextcloud/coding-standard", @@ -1777,16 +1794,16 @@ }, { "name": "nextcloud/ocp", - "version": "dev-master", + "version": "dev-stable32", "source": { "type": "git", "url": "https://github.com/nextcloud-deps/ocp.git", - "reference": "4556a0916442369994fdc6a7d4cd7c6e5e85d46d" + "reference": "d7323652d345582c97c7ca2e23f70984b76e8e3a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nextcloud-deps/ocp/zipball/4556a0916442369994fdc6a7d4cd7c6e5e85d46d", - "reference": "4556a0916442369994fdc6a7d4cd7c6e5e85d46d", + "url": "https://api.github.com/repos/nextcloud-deps/ocp/zipball/d7323652d345582c97c7ca2e23f70984b76e8e3a", + "reference": "d7323652d345582c97c7ca2e23f70984b76e8e3a", "shasum": "" }, "require": { @@ -1796,11 +1813,10 @@ "psr/event-dispatcher": "^1.0", "psr/log": "^3.0.2" }, - "default-branch": true, "type": "library", "extra": { "branch-alias": { - "dev-master": "33.0.0-dev" + "dev-stable32": "32.0.0-dev" } }, "notification-url": "https://packagist.org/downloads/", @@ -1820,22 +1836,22 @@ "description": "Composer package containing Nextcloud's public OCP API and the unstable NCU API", "support": { "issues": "https://github.com/nextcloud-deps/ocp/issues", - "source": "https://github.com/nextcloud-deps/ocp/tree/master" + "source": "https://github.com/nextcloud-deps/ocp/tree/stable32" }, - "time": "2025-10-15T00:49:40+00:00" + "time": "2026-04-09T01:10:47+00:00" }, { "name": "nikic/php-parser", - "version": "v5.6.1", + "version": "v5.7.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "f103601b29efebd7ff4a1ca7b3eeea9e3336a2a2" + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/f103601b29efebd7ff4a1ca7b3eeea9e3336a2a2", - "reference": "f103601b29efebd7ff4a1ca7b3eeea9e3336a2a2", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82", + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82", "shasum": "" }, "require": { @@ -1878,9 +1894,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.6.1" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.7.0" }, - "time": "2025-08-13T20:13:15+00:00" + "time": "2025-12-06T11:56:16+00:00" }, { "name": "phar-io/manifest", @@ -2002,16 +2018,16 @@ }, { "name": "php-cs-fixer/shim", - "version": "v3.88.2", + "version": "v3.94.2", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/shim.git", - "reference": "b70300670e5a37dd3a9cb0f188e186c8c206f70f" + "reference": "80fd29f44a736136a2f05bae5464816a444b91d1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/shim/zipball/b70300670e5a37dd3a9cb0f188e186c8c206f70f", - "reference": "b70300670e5a37dd3a9cb0f188e186c8c206f70f", + "url": "https://api.github.com/repos/PHP-CS-Fixer/shim/zipball/80fd29f44a736136a2f05bae5464816a444b91d1", + "reference": "80fd29f44a736136a2f05bae5464816a444b91d1", "shasum": "" }, "require": { @@ -2048,9 +2064,9 @@ "description": "A tool to automatically fix PHP code style", "support": { "issues": "https://github.com/PHP-CS-Fixer/shim/issues", - "source": "https://github.com/PHP-CS-Fixer/shim/tree/v3.88.2" + "source": "https://github.com/PHP-CS-Fixer/shim/tree/v3.94.2" }, - "time": "2025-09-27T00:25:01+00:00" + "time": "2026-02-20T16:14:17+00:00" }, { "name": "phpdocumentor/reflection-common", @@ -2107,16 +2123,16 @@ }, { "name": "phpdocumentor/reflection-docblock", - "version": "5.6.3", + "version": "6.0.3", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "94f8051919d1b0369a6bcc7931d679a511c03fe9" + "reference": "7bae67520aa9f5ecc506d646810bd40d9da54582" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/94f8051919d1b0369a6bcc7931d679a511c03fe9", - "reference": "94f8051919d1b0369a6bcc7931d679a511c03fe9", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/7bae67520aa9f5ecc506d646810bd40d9da54582", + "reference": "7bae67520aa9f5ecc506d646810bd40d9da54582", "shasum": "" }, "require": { @@ -2124,9 +2140,9 @@ "ext-filter": "*", "php": "^7.4 || ^8.0", "phpdocumentor/reflection-common": "^2.2", - "phpdocumentor/type-resolver": "^1.7", - "phpstan/phpdoc-parser": "^1.7|^2.0", - "webmozart/assert": "^1.9.1" + "phpdocumentor/type-resolver": "^2.0", + "phpstan/phpdoc-parser": "^2.0", + "webmozart/assert": "^1.9.1 || ^2" }, "require-dev": { "mockery/mockery": "~1.3.5 || ~1.6.0", @@ -2135,7 +2151,8 @@ "phpstan/phpstan-mockery": "^1.1", "phpstan/phpstan-webmozart-assert": "^1.2", "phpunit/phpunit": "^9.5", - "psalm/phar": "^5.26" + "psalm/phar": "^5.26", + "shipmonk/dead-code-detector": "^0.5.1" }, "type": "library", "extra": { @@ -2165,44 +2182,44 @@ "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", "support": { "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.3" + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/6.0.3" }, - "time": "2025-08-01T19:43:32+00:00" + "time": "2026-03-18T20:49:53+00:00" }, { "name": "phpdocumentor/type-resolver", - "version": "1.10.0", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a" + "reference": "327a05bbee54120d4786a0dc67aad30226ad4cf9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/679e3ce485b99e84c775d28e2e96fade9a7fb50a", - "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/327a05bbee54120d4786a0dc67aad30226ad4cf9", + "reference": "327a05bbee54120d4786a0dc67aad30226ad4cf9", "shasum": "" }, "require": { "doctrine/deprecations": "^1.0", - "php": "^7.3 || ^8.0", + "php": "^7.4 || ^8.0", "phpdocumentor/reflection-common": "^2.0", - "phpstan/phpdoc-parser": "^1.18|^2.0" + "phpstan/phpdoc-parser": "^2.0" }, "require-dev": { "ext-tokenizer": "*", "phpbench/phpbench": "^1.2", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-phpunit": "^1.1", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-phpunit": "^2.0", "phpunit/phpunit": "^9.5", - "rector/rector": "^0.13.9", - "vimeo/psalm": "^4.25" + "psalm/phar": "^4" }, "type": "library", "extra": { "branch-alias": { - "dev-1.x": "1.x-dev" + "dev-1.x": "1.x-dev", + "dev-2.x": "2.x-dev" } }, "autoload": { @@ -2223,22 +2240,22 @@ "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", "support": { "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.10.0" + "source": "https://github.com/phpDocumentor/TypeResolver/tree/2.0.0" }, - "time": "2024-11-09T15:12:26+00:00" + "time": "2026-01-06T21:53:42+00:00" }, { "name": "phpstan/phpdoc-parser", - "version": "2.3.0", + "version": "2.3.2", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "1e0cd5370df5dd2e556a36b9c62f62e555870495" + "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/1e0cd5370df5dd2e556a36b9c62f62e555870495", - "reference": "1e0cd5370df5dd2e556a36b9c62f62e555870495", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/a004701b11273a26cd7955a61d67a7f1e525a45a", + "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a", "shasum": "" }, "require": { @@ -2270,9 +2287,9 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.0" + "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.2" }, - "time": "2025-08-30T15:50:23+00:00" + "time": "2026-01-25T14:56:51+00:00" }, { "name": "phpunit/php-code-coverage", @@ -2597,16 +2614,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.5.58", + "version": "10.5.63", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "e24fb46da450d8e6a5788670513c1af1424f16ca" + "reference": "33198268dad71e926626b618f3ec3966661e4d90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/e24fb46da450d8e6a5788670513c1af1424f16ca", - "reference": "e24fb46da450d8e6a5788670513c1af1424f16ca", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/33198268dad71e926626b618f3ec3966661e4d90", + "reference": "33198268dad71e926626b618f3ec3966661e4d90", "shasum": "" }, "require": { @@ -2627,7 +2644,7 @@ "phpunit/php-timer": "^6.0.0", "sebastian/cli-parser": "^2.0.1", "sebastian/code-unit": "^2.0.0", - "sebastian/comparator": "^5.0.4", + "sebastian/comparator": "^5.0.5", "sebastian/diff": "^5.1.1", "sebastian/environment": "^6.1.0", "sebastian/exporter": "^5.1.4", @@ -2678,7 +2695,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.58" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.63" }, "funding": [ { @@ -2702,7 +2719,7 @@ "type": "tidelift" } ], - "time": "2025-09-28T12:04:46+00:00" + "time": "2026-01-27T05:48:37+00:00" }, { "name": "psr/clock", @@ -3015,16 +3032,16 @@ }, { "name": "revolt/event-loop", - "version": "v1.0.7", + "version": "v1.0.8", "source": { "type": "git", "url": "https://github.com/revoltphp/event-loop.git", - "reference": "09bf1bf7f7f574453efe43044b06fafe12216eb3" + "reference": "b6fc06dce8e9b523c9946138fa5e62181934f91c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/revoltphp/event-loop/zipball/09bf1bf7f7f574453efe43044b06fafe12216eb3", - "reference": "09bf1bf7f7f574453efe43044b06fafe12216eb3", + "url": "https://api.github.com/repos/revoltphp/event-loop/zipball/b6fc06dce8e9b523c9946138fa5e62181934f91c", + "reference": "b6fc06dce8e9b523c9946138fa5e62181934f91c", "shasum": "" }, "require": { @@ -3081,9 +3098,9 @@ ], "support": { "issues": "https://github.com/revoltphp/event-loop/issues", - "source": "https://github.com/revoltphp/event-loop/tree/v1.0.7" + "source": "https://github.com/revoltphp/event-loop/tree/v1.0.8" }, - "time": "2025-01-25T19:27:39+00:00" + "time": "2025-08-27T21:33:23+00:00" }, { "name": "roave/security-advisories", @@ -3091,37 +3108,43 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "f34f054015aff54acc108a8517308dc67b572841" + "reference": "c5e319c36bb8e95f3662f05e46f16e89c44da480" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/f34f054015aff54acc108a8517308dc67b572841", - "reference": "f34f054015aff54acc108a8517308dc67b572841", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/c5e319c36bb8e95f3662f05e46f16e89c44da480", + "reference": "c5e319c36bb8e95f3662f05e46f16e89c44da480", "shasum": "" }, "conflict": { "3f/pygmentize": "<1.2", "adaptcms/adaptcms": "<=1.3", - "admidio/admidio": "<4.3.12", + "admidio/admidio": "<5.0.8", "adodb/adodb-php": "<=5.22.9", "aheinze/cockpit": "<2.2", "aimeos/ai-admin-graphql": ">=2022.04.1,<2022.10.10|>=2023.04.1,<2023.10.6|>=2024.04.1,<2024.07.2", "aimeos/ai-admin-jsonadm": "<2020.10.13|>=2021.04.1,<2021.10.6|>=2022.04.1,<2022.10.3|>=2023.04.1,<2023.10.4|==2024.04.1", "aimeos/ai-client-html": ">=2020.04.1,<2020.10.27|>=2021.04.1,<2021.10.22|>=2022.04.1,<2022.10.13|>=2023.04.1,<2023.10.15|>=2024.04.1,<2024.04.7", + "aimeos/ai-cms-grapesjs": ">=2021.04.1,<2021.10.8|>=2022.04.1,<2022.10.9|>=2023.04.1,<2023.10.15|>=2024.04.1,<2024.10.8|>=2025.04.1,<2025.10.2", "aimeos/ai-controller-frontend": "<2020.10.15|>=2021.04.1,<2021.10.8|>=2022.04.1,<2022.10.8|>=2023.04.1,<2023.10.9|==2024.04.1", "aimeos/aimeos-core": ">=2022.04.1,<2022.10.17|>=2023.04.1,<2023.10.17|>=2024.04.1,<2024.04.7", + "aimeos/aimeos-laravel": "==2021.10", "aimeos/aimeos-typo3": "<19.10.12|>=20,<20.10.5", "airesvsg/acf-to-rest-api": "<=3.1", "akaunting/akaunting": "<2.1.13", "akeneo/pim-community-dev": "<5.0.119|>=6,<6.0.53", - "alextselegidis/easyappointments": "<1.5.2.0-beta1", + "alextselegidis/easyappointments": "<=1.5.2", + "alexusmai/laravel-file-manager": "<=3.3.1", + "algolia/algoliasearch-magento-2": "<=3.16.1|>=3.17.0.0-beta1,<=3.17.1", "alt-design/alt-redirect": "<1.6.4", + "altcha-org/altcha": "<1.3.1", "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1", "amazing/media2click": ">=1,<1.3.3", "ameos/ameos_tarteaucitron": "<1.2.23", "amphp/artax": "<1.0.6|>=2,<2.0.6", "amphp/http": "<=1.7.2|>=2,<=2.1", "amphp/http-client": ">=4,<4.4", + "amphp/http-server": ">=2.0.0.0-RC1-dev,<2.1.10|>=3.0.0.0-beta1,<3.4.4", "anchorcms/anchor-cms": "<=0.12.7", "andreapollastri/cipi": "<=3.1.15", "andrewhaine/silverstripe-form-capture": ">=0.2,<=0.2.3|>=1,<1.0.2|>=2,<2.2.5", @@ -3138,28 +3161,30 @@ "athlon1600/php-proxy": "<=5.1", "athlon1600/php-proxy-app": "<=3", "athlon1600/youtube-downloader": "<=4", + "aureuserp/aureuserp": "<1.3.0.0-beta1", "austintoddj/canvas": "<=3.4.2", - "auth0/auth0-php": ">=3.3,<=8.16", - "auth0/login": "<=7.18", - "auth0/symfony": "<=5.4.1", - "auth0/wordpress": "<=5.3", + "auth0/auth0-php": ">=3.3,<=8.18", + "auth0/login": "<=7.20", + "auth0/symfony": "<=5.7", + "auth0/wordpress": "<=5.5", "automad/automad": "<2.0.0.0-alpha5", "automattic/jetpack": "<9.8", "awesome-support/awesome-support": "<=6.0.7", - "aws/aws-sdk-php": "<3.288.1", - "azuracast/azuracast": "<0.18.3", + "aws/aws-sdk-php": "<=3.371.3", + "ayacoo/redirect-tab": "<2.1.2|>=3,<3.1.7|>=4,<4.0.5", + "azuracast/azuracast": "<=0.23.3", "b13/seo_basics": "<0.8.2", - "backdrop/backdrop": "<1.27.3|>=1.28,<1.28.2", + "backdrop/backdrop": "<=1.32", "backpack/crud": "<3.4.9", "backpack/filemanager": "<2.0.2|>=3,<3.0.9", "bacula-web/bacula-web": "<9.7.1", "badaso/core": "<=2.9.11", - "bagisto/bagisto": "<2.1|==2.3.6", + "bagisto/bagisto": "<2.3.10", "barrelstrength/sprout-base-email": "<1.2.7", "barrelstrength/sprout-forms": "<3.9", "barryvdh/laravel-translation-manager": "<0.6.8", "barzahlen/barzahlen-php": "<2.0.1", - "baserproject/basercms": "<=5.1.1", + "baserproject/basercms": "<=5.2.2", "bassjobsen/bootstrap-3-typeahead": ">4.0.2", "bbpress/bbpress": "<2.6.5", "bcit-ci/codeigniter": "<3.1.3", @@ -3186,7 +3211,8 @@ "bvbmedia/multishop": "<2.0.39", "bytefury/crater": "<6.0.2", "cachethq/cachet": "<2.5.1", - "cakephp/cakephp": "<3.10.3|>=4,<4.0.10|>=4.1,<4.1.4|>=4.2,<4.2.12|>=4.3,<4.3.11|>=4.4,<4.4.10", + "cadmium-org/cadmium-cms": "<=0.4.9", + "cakephp/cakephp": "<3.10.3|>=4,<4.0.10|>=4.1,<4.1.4|>=4.2,<4.2.12|>=4.3,<4.3.11|>=4.4,<4.4.10|>=5.2.10,<5.2.12|==5.3", "cakephp/database": ">=4.2,<4.2.12|>=4.3,<4.3.11|>=4.4,<4.4.10", "cardgate/magento2": "<2.0.33", "cardgate/woocommerce": "<=3.1.15", @@ -3197,37 +3223,50 @@ "causal/oidc": "<4", "cecil/cecil": "<7.47.1", "centreon/centreon": "<22.10.15", + "cesargb/laravel-magiclink": ">=2,<2.25.1", "cesnet/simplesamlphp-module-proxystatistics": "<3.1", "chriskacerguis/codeigniter-restserver": "<=2.7.1", "chrome-php/chrome": "<1.14", + "ci4-cms-erp/ci4ms": "<=0.31.3", "civicrm/civicrm-core": ">=4.2,<4.2.9|>=4.3,<4.3.3", "ckeditor/ckeditor": "<4.25", "clickstorm/cs-seo": ">=6,<6.8|>=7,<7.5|>=8,<8.4|>=9,<9.3", "co-stack/fal_sftp": "<0.2.6", - "cockpit-hq/cockpit": "<2.11.4", + "cockpit-hq/cockpit": "<2.13.5", + "code16/sharp": "<9.20", "codeception/codeception": "<3.1.3|>=4,<4.1.22", "codeigniter/framework": "<3.1.10", "codeigniter4/framework": "<4.6.2", "codeigniter4/shield": "<1.0.0.0-beta8", "codiad/codiad": "<=2.8.4", "codingms/additional-tca": ">=1.7,<1.15.17|>=1.16,<1.16.9", + "codingms/modules": "<4.3.11|>=5,<5.7.4|>=6,<6.4.2|>=7,<7.5.5", "commerceteam/commerce": ">=0.9.6,<0.9.9", "components/jquery": ">=1.0.3,<3.5", - "composer/composer": "<1.10.27|>=2,<2.2.24|>=2.3,<2.7.7", - "concrete5/concrete5": "<9.4.3", + "composer/composer": "<1.10.27|>=2,<2.2.26|>=2.3,<2.9.3", + "concrete5/concrete5": "<9.4.8", "concrete5/core": "<8.5.8|>=9,<9.1", "contao-components/mediaelement": ">=2.14.2,<2.21.1", "contao/comments-bundle": ">=2,<4.13.40|>=5.0.0.0-RC1-dev,<5.3.4", "contao/contao": ">=3,<3.5.37|>=4,<4.4.56|>=4.5,<4.13.56|>=5,<5.3.38|>=5.4.0.0-RC1-dev,<5.6.1", "contao/core": "<3.5.39", - "contao/core-bundle": "<4.13.56|>=5,<5.3.38|>=5.4,<5.6.1", + "contao/core-bundle": "<4.13.57|>=5,<5.3.42|>=5.4,<5.6.5", "contao/listing-bundle": ">=3,<=3.5.30|>=4,<4.4.8", "contao/managed-edition": "<=1.5", + "coreshop/core-shop": "<4.1.9", "corveda/phpsandbox": "<1.3.5", "cosenary/instagram": "<=2.3", "couleurcitron/tarteaucitron-wp": "<0.3", - "craftcms/cms": "<=4.16.5|>=5,<=5.8.6", - "croogo/croogo": "<4", + "cpsit/typo3-mailqueue": "<0.4.5|>=0.5,<0.5.2", + "craftcms/aws-s3": ">=2.0.2,<=2.2.4", + "craftcms/azure-blob": ">=2.0.0.0-beta1,<=2.1", + "craftcms/cms": "<=4.17.7|>=5,<=5.9.13", + "craftcms/commerce": ">=4,<4.11|>=5,<5.6", + "craftcms/composer": ">=4.0.0.0-RC1-dev,<=4.10|>=5.0.0.0-RC1-dev,<=5.5.1", + "craftcms/craft": ">=3.5,<=4.16.17|>=5.0.0.0-RC1-dev,<=5.8.21", + "craftcms/google-cloud": ">=2.0.0.0-beta1,<=2.2", + "craftcms/webhooks": ">=3,<3.2", + "croogo/croogo": "<=4.0.7", "cuyz/valinor": "<0.12", "czim/file-handling": "<1.5|>=2,<2.3", "czproject/git-php": "<4.0.3", @@ -3244,9 +3283,11 @@ "derhansen/sf_event_mgt": "<4.3.1|>=5,<5.1.1|>=7,<7.4", "desperado/xml-bundle": "<=0.1.7", "dev-lancer/minecraft-motd-parser": "<=1.0.5", + "devcode-it/openstamanager": "<=2.10.1", "devgroup/dotplant": "<2020.09.14-dev", "digimix/wp-svg-upload": "<=1", "directmailteam/direct-mail": "<6.0.3|>=7,<7.0.3|>=8,<9.5.2", + "directorytree/imapengine": "<1.22.3", "dl/yag": "<3.0.1", "dmk/webkitpdf": "<1.1.4", "dnadesign/silverstripe-elemental": "<5.3.12", @@ -3259,40 +3300,52 @@ "doctrine/mongodb-odm": "<1.0.2", "doctrine/mongodb-odm-bundle": "<3.0.1", "doctrine/orm": ">=1,<1.2.4|>=2,<2.4.8|>=2.5,<2.5.1|>=2.8.3,<2.8.4", - "dolibarr/dolibarr": "<21.0.3", + "dolibarr/dolibarr": "<=22.0.4", "dompdf/dompdf": "<2.0.4", "doublethreedigital/guest-entries": "<3.1.2", + "dreamfactory/df-core": "<1.0.4", "drupal-pattern-lab/unified-twig-extensions": "<=0.1", + "drupal/access_code": "<2.0.5", + "drupal/acquia_dam": "<1.1.5", "drupal/admin_audit_trail": "<1.0.5", "drupal/ai": "<1.0.5", "drupal/alogin": "<2.0.6", "drupal/cache_utility": "<1.2.1", + "drupal/civictheme": "<1.12", "drupal/commerce_alphabank_redirect": "<1.0.3", "drupal/commerce_eurobank_redirect": "<2.1.1", "drupal/config_split": "<1.10|>=2,<2.0.2", - "drupal/core": ">=6,<6.38|>=7,<7.102|>=8,<10.3.14|>=10.4,<10.4.5|>=11,<11.0.13|>=11.1,<11.1.5", + "drupal/core": ">=6,<6.38|>=7,<7.103|>=8,<10.4.9|>=10.5,<10.5.6|>=11,<11.1.9|>=11.2,<11.2.8", "drupal/core-recommended": ">=7,<7.102|>=8,<10.2.11|>=10.3,<10.3.9|>=11,<11.0.8", + "drupal/currency": "<3.5", "drupal/drupal": ">=5,<5.11|>=6,<6.38|>=7,<7.102|>=8,<10.2.11|>=10.3,<10.3.9|>=11,<11.0.8", + "drupal/email_tfa": "<2.0.6", "drupal/formatter_suite": "<2.1", "drupal/gdpr": "<3.0.1|>=3.1,<3.1.2", "drupal/google_tag": "<1.8|>=2,<2.0.8", "drupal/ignition": "<1.0.4", + "drupal/json_field": "<1.5", "drupal/lightgallery": "<1.6", "drupal/link_field_display_mode_formatter": "<1.6", "drupal/matomo": "<1.24", "drupal/oauth2_client": "<4.1.3", "drupal/oauth2_server": "<2.1", "drupal/obfuscate": "<2.0.1", + "drupal/plausible_tracking": "<1.0.2", "drupal/quick_node_block": "<2", "drupal/rapidoc_elements_field_formatter": "<1.0.1", + "drupal/reverse_proxy_header": "<1.1.2", + "drupal/simple_multistep": "<2", + "drupal/simple_oauth": ">=6,<6.0.7", "drupal/spamspan": "<3.2.1", "drupal/tfa": "<1.10", + "drupal/umami_analytics": "<1.0.1", "duncanmcclean/guest-entries": "<3.1.2", "dweeves/magmi": "<=0.7.24", - "ec-cube/ec-cube": "<2.4.4|>=2.11,<=2.17.1|>=3,<=3.0.18.0-patch4|>=4,<=4.1.2", + "ec-cube/ec-cube": "<2.4.4|>=2.11,<=2.17.1|>=3,<=3.0.18.0-patch4|>=4,<=4.3.1", "ecodev/newsletter": "<=4", "ectouch/ectouch": "<=2.7.2", - "egroupware/egroupware": "<23.1.20240624", + "egroupware/egroupware": "<23.1.20260113|>=26.0.20251208,<26.0.20260113", "elefant/cms": "<2.0.7", "elgg/elgg": "<3.3.24|>=4,<4.0.5", "elijaa/phpmemcacheadmin": "<=1.3", @@ -3311,33 +3364,34 @@ "ezsystems/ezdemo-ls-extension": ">=5.4,<5.4.2.1-dev", "ezsystems/ezfind-ls": ">=5.3,<5.3.6.1-dev|>=5.4,<5.4.11.1-dev|>=2017.12,<2017.12.0.1-dev", "ezsystems/ezplatform": "<=1.13.6|>=2,<=2.5.24", - "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.6|>=1.5,<1.5.29|>=2.3,<2.3.38|>=3.3,<3.3.39", + "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.6|>=1.5,<1.5.29|>=2.3,<2.3.39|>=3.3,<3.3.39", "ezsystems/ezplatform-admin-ui-assets": ">=4,<4.2.1|>=5,<5.0.1|>=5.1,<5.1.1|>=5.3.0.0-beta1,<5.3.5", "ezsystems/ezplatform-graphql": ">=1.0.0.0-RC1-dev,<1.0.13|>=2.0.0.0-beta1,<2.3.12", "ezsystems/ezplatform-http-cache": "<2.3.16", - "ezsystems/ezplatform-kernel": "<1.2.5.1-dev|>=1.3,<1.3.35", + "ezsystems/ezplatform-kernel": "<=1.2.5|>=1.3,<1.3.35", "ezsystems/ezplatform-rest": ">=1.2,<=1.2.2|>=1.3,<1.3.8", "ezsystems/ezplatform-richtext": ">=2.3,<2.3.26|>=3.3,<3.3.40", "ezsystems/ezplatform-solr-search-engine": ">=1.7,<1.7.12|>=2,<2.0.2|>=3.3,<3.3.15", "ezsystems/ezplatform-user": ">=1,<1.0.1", - "ezsystems/ezpublish-kernel": "<6.13.8.2-dev|>=7,<7.5.31", + "ezsystems/ezpublish-kernel": "<=6.13.8.1|>=7,<7.5.31", "ezsystems/ezpublish-legacy": "<=2017.12.7.3|>=2018.6,<=2019.03.5.1", "ezsystems/platform-ui-assets-bundle": ">=4.2,<4.2.3", "ezsystems/repository-forms": ">=2.3,<2.3.2.1-dev|>=2.5,<2.5.15", "ezyang/htmlpurifier": "<=4.2", "facade/ignition": "<1.16.15|>=2,<2.4.2|>=2.5,<2.5.2", - "facturascripts/facturascripts": "<=2022.08", + "facturascripts/facturascripts": "<2025.81", "fastly/magento2": "<1.2.26", "feehi/cms": "<=2.1.1", "feehi/feehicms": "<=2.1.1", "fenom/fenom": "<=2.12.1", "filament/actions": ">=3.2,<3.2.123", + "filament/filament": ">=4,<4.3.1", "filament/infolists": ">=3,<3.2.115", - "filament/tables": ">=3,<3.2.115", + "filament/tables": ">=3,<3.2.115|>=4,<4.8.5|>=5,<5.3.5", "filegator/filegator": "<7.8", "filp/whoops": "<2.1.13", "fineuploader/php-traditional-server": "<=1.2.2", - "firebase/php-jwt": "<6", + "firebase/php-jwt": "<7", "fisharebest/webtrees": "<=2.1.18", "fixpunkt/fp-masterquiz": "<2.2.1|>=3,<3.5.2", "fixpunkt/fp-newsletter": "<1.1.1|>=1.2,<2.1.2|>=2.2,<3.2.6", @@ -3345,11 +3399,13 @@ "flarum/flarum": "<0.1.0.0-beta8", "flarum/framework": "<1.8.10", "flarum/mentions": "<1.6.3", + "flarum/nicknames": "<1.8.3", "flarum/sticky": ">=0.1.0.0-beta14,<=0.1.0.0-beta15", "flarum/tags": "<=0.1.0.0-beta13", "floriangaerber/magnesium": "<0.3.1", "fluidtypo3/vhs": "<5.1.1", "fof/byobu": ">=0.3.0.0-beta2,<1.1.7", + "fof/pretty-mail": "<=1.1.2", "fof/upload": "<1.2.3", "foodcoopshop/foodcoopshop": ">=3.2,<3.6.1", "fooman/tcpdf": "<6.2.22", @@ -3365,17 +3421,18 @@ "friendsoftypo3/mediace": ">=7.6.2,<7.6.5", "friendsoftypo3/openid": ">=4.5,<4.5.31|>=4.7,<4.7.16|>=6,<6.0.11|>=6.1,<6.1.6", "froala/wysiwyg-editor": "<=4.3", - "froxlor/froxlor": "<=2.2.5", + "frosh/adminer-platform": "<2.2.1", + "froxlor/froxlor": "<=2.3.4", "frozennode/administrator": "<=5.0.12", "fuel/core": "<1.8.1", - "funadmin/funadmin": "<=5.0.2", + "funadmin/funadmin": "<=7.1.0.0-RC4", "gaoming13/wechat-php-sdk": "<=1.10.2", "genix/cms": "<=1.1.11", "georgringer/news": "<1.3.3", "geshi/geshi": "<=1.0.9.1", - "getformwork/formwork": "<1.13.1|>=2.0.0.0-beta1,<2.0.0.0-beta4", - "getgrav/grav": "<1.7.46", - "getkirby/cms": "<3.9.8.3-dev|>=3.10,<3.10.1.2-dev|>=4,<4.7.1", + "getformwork/formwork": "<=2.3.3", + "getgrav/grav": "<1.11.0.0-beta1", + "getkirby/cms": "<=5.2.1", "getkirby/kirby": "<3.9.8.3-dev|>=3.10,<3.10.1.2-dev|>=4,<4.7.1", "getkirby/panel": "<2.5.14", "getkirby/starterkit": "<=3.7.0.2", @@ -3384,12 +3441,12 @@ "globalpayments/php-sdk": "<2", "goalgorilla/open_social": "<12.3.11|>=12.4,<12.4.10|>=13.0.0.0-alpha1,<13.0.0.0-alpha11", "gogentooss/samlbase": "<1.2.7", - "google/protobuf": "<3.4", + "google/protobuf": "<4.33.6", "gos/web-socket-bundle": "<1.10.4|>=2,<2.6.1|>=3,<3.3", "gp247/core": "<1.1.24", "gree/jose": "<2.2.1", "gregwar/rst": "<1.0.3", - "grumpydictator/firefly-iii": "<6.1.17", + "grumpydictator/firefly-iii": "<6.1.17|>=6.4.23,<=6.5", "gugoan/economizzer": "<=0.9.0.0-beta1", "guzzlehttp/guzzle": "<6.5.8|>=7,<7.4.5", "guzzlehttp/oauth-subscriber": "<0.8.1", @@ -3404,18 +3461,19 @@ "hjue/justwriting": "<=1", "hov/jobfair": "<1.0.13|>=2,<2.0.2", "httpsoft/http-message": "<1.0.12", + "hybridauth/hybridauth": "<=3.12.2", "hyn/multi-tenant": ">=5.6,<5.7.2", - "ibexa/admin-ui": ">=4.2,<4.2.3|>=4.6,<4.6.21", + "ibexa/admin-ui": ">=4.2,<4.2.3|>=4.6,<4.6.25|>=5,<5.0.3", "ibexa/admin-ui-assets": ">=4.6.0.0-alpha1,<4.6.21", "ibexa/core": ">=4,<4.0.7|>=4.1,<4.1.4|>=4.2,<4.2.3|>=4.5,<4.5.6|>=4.6,<4.6.2", - "ibexa/fieldtype-richtext": ">=4.6,<4.6.21", + "ibexa/fieldtype-richtext": ">=4.6,<4.6.25|>=5,<5.0.3", "ibexa/graphql": ">=2.5,<2.5.31|>=3.3,<3.3.28|>=4.2,<4.2.3", "ibexa/http-cache": ">=4.6,<4.6.14", "ibexa/post-install": "<1.0.16|>=4.6,<4.6.14", "ibexa/solr": ">=4.5,<4.5.4", - "ibexa/user": ">=4,<4.4.3", + "ibexa/user": ">=4,<4.4.3|>=5,<5.0.4", "icecoder/icecoder": "<=8.1", - "idno/known": "<=1.3.1", + "idno/known": "<1.6.4", "ilicmiljan/secure-props": ">=1.2,<1.2.2", "illuminate/auth": "<5.5.10", "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<6.18.31|>=7,<7.22.4", @@ -3432,10 +3490,12 @@ "innologi/typo3-appointments": "<2.0.6", "intelliants/subrion": "<4.2.2", "inter-mediator/inter-mediator": "==5.5", + "invoiceninja/invoiceninja": "<5.13.4", "ipl/web": "<0.10.1", "islandora/crayfish": "<4.1", "islandora/islandora": ">=2,<2.4.1", "ivankristianto/phpwhois": "<=4.3", + "j0k3r/graby": "<=2.5", "jackalope/jackalope-doctrine-dbal": "<1.7.4", "jambagecom/div2007": "<0.10.2", "james-heinrich/getid3": "<1.9.21", @@ -3444,6 +3504,7 @@ "jbartels/wec-map": "<3.0.3", "jcbrand/converse.js": "<3.3.3", "joelbutcher/socialstream": "<5.6|>=6,<6.2", + "johnbillion/query-monitor": "<3.20.4", "johnbillion/wp-crontrol": "<1.16.2|>=1.17,<1.19.2", "joomla/application": "<1.0.13", "joomla/archive": "<1.1.12|>=2,<2.0.1", @@ -3462,16 +3523,17 @@ "jweiland/events2": "<8.3.8|>=9,<9.0.6", "jweiland/kk-downloader": "<1.2.2", "kazist/phpwhois": "<=4.2.6", + "kelvinmo/simplejwt": "<=1.1", "kelvinmo/simplexrd": "<3.1.1", "kevinpapst/kimai2": "<1.16.7", "khodakhah/nodcms": "<=3", - "kimai/kimai": "<=2.20.1", + "kimai/kimai": "<=2.50", "kitodo/presentation": "<3.2.3|>=3.3,<3.3.4", "klaviyo/magento2-extension": ">=1,<3", "knplabs/knp-snappy": "<=1.4.2", "kohana/core": "<3.3.3", "koillection/koillection": "<1.6.12", - "krayin/laravel-crm": "<=1.3", + "krayin/laravel-crm": "<=2.2", "kreait/firebase-php": ">=3.2,<3.8.1", "kumbiaphp/kumbiapp": "<=1.1.1", "la-haute-societe/tcpdf": "<6.2.22", @@ -3483,24 +3545,26 @@ "laravel/fortify": "<1.11.1", "laravel/framework": "<10.48.29|>=11,<11.44.1|>=12,<12.1.1", "laravel/laravel": ">=5.4,<5.4.22", + "laravel/passport": "<13.7.1", "laravel/pulse": "<1.3.1", - "laravel/reverb": "<1.4", + "laravel/reverb": "<1.7", "laravel/socialite": ">=1,<2.0.10", "latte/latte": "<2.10.8", - "lavalite/cms": "<=9|==10.1", + "lavalite/cms": "<=10.1", "lavitto/typo3-form-to-database": "<2.2.5|>=3,<3.2.2|>=4,<4.2.3|>=5,<5.0.2", "lcobucci/jwt": ">=3.4,<3.4.6|>=4,<4.0.4|>=4.1,<4.1.5", - "league/commonmark": "<2.7", + "league/commonmark": "<=2.8.1", "league/flysystem": "<1.1.4|>=2,<2.1.1", "league/oauth2-server": ">=8.3.2,<8.4.2|>=8.5,<8.5.3", "leantime/leantime": "<3.3", "lexik/jwt-authentication-bundle": "<2.10.7|>=2.11,<2.11.3", "libreform/libreform": ">=2,<=2.0.8", - "librenms/librenms": "<2017.08.18", + "librenms/librenms": "<26.3", "liftkit/database": "<2.13.2", "lightsaml/lightsaml": "<1.3.5", - "limesurvey/limesurvey": "<6.5.12", + "limesurvey/limesurvey": "<6.15.4", "livehelperchat/livehelperchat": "<=3.91", + "livewire-filemanager/filemanager": "<=1.0.4", "livewire/livewire": "<2.12.7|>=3.0.0.0-beta1,<3.6.4", "livewire/volt": "<1.7", "lms/routes": "<2.1.1", @@ -3510,7 +3574,7 @@ "luyadev/yii-helpers": "<1.2.1", "macropay-solutions/laravel-crud-wizard-free": "<3.4.17", "maestroerror/php-heic-to-jpg": "<1.0.5", - "magento/community-edition": "<=2.4.5.0-patch14|==2.4.6|>=2.4.6.0-patch1,<=2.4.6.0-patch12|>=2.4.7.0-beta1,<=2.4.7.0-patch7|>=2.4.8.0-beta1,<=2.4.8.0-patch2|>=2.4.9.0-alpha1,<=2.4.9.0-alpha2|==2.4.9", + "magento/community-edition": "<2.4.6.0-patch13|>=2.4.7.0-beta1,<2.4.7.0-patch8|>=2.4.8.0-beta1,<2.4.8.0-patch3|>=2.4.9.0-alpha1,<2.4.9.0-alpha3|==2.4.9", "magento/core": "<=1.9.4.5", "magento/magento1ce": "<1.9.4.3-dev", "magento/magento1ee": ">=1,<1.14.4.3-dev", @@ -3521,17 +3585,18 @@ "maikuolan/phpmussel": ">=1,<1.6", "mainwp/mainwp": "<=4.4.3.3", "manogi/nova-tiptap": "<=3.2.6", - "mantisbt/mantisbt": "<=2.26.3", + "mantisbt/mantisbt": "<2.28.1", "marcwillmann/turn": "<0.3.3", "marshmallow/nova-tiptap": "<5.7", "matomo/matomo": "<1.11", "matyhtf/framework": "<3.0.6", - "mautic/core": "<5.2.8|>=6.0.0.0-alpha,<6.0.5", + "mautic/core": "<5.2.10|>=6,<6.0.8|>=7.0.0.0-alpha,<7.0.1", "mautic/core-lib": ">=1.0.0.0-beta,<4.4.13|>=5.0.0.0-alpha,<5.1.1", + "mautic/grapes-js-builder-bundle": ">=4,<4.4.18|>=5,<5.2.9|>=6,<6.0.7", "maximebf/debugbar": "<1.19", "mdanter/ecc": "<2", "mediawiki/abuse-filter": "<1.39.9|>=1.40,<1.41.3|>=1.42,<1.42.2", - "mediawiki/cargo": "<3.6.1", + "mediawiki/cargo": "<3.8.3", "mediawiki/core": "<1.39.5|==1.40", "mediawiki/data-transfer": ">=1.39,<1.39.11|>=1.41,<1.41.3|>=1.42,<1.42.2", "mediawiki/matomo": "<2.4.3", @@ -3547,25 +3612,27 @@ "microsoft/microsoft-graph": ">=1.16,<1.109.1|>=2,<2.0.1", "microsoft/microsoft-graph-beta": "<2.0.1", "microsoft/microsoft-graph-core": "<2.0.2", - "microweber/microweber": "<=2.0.19", + "microweber/microweber": "<2.0.20", "mikehaertl/php-shellcommand": "<1.6.1", + "mineadmin/mineadmin": "<=3.0.9", "miniorange/miniorange-saml": "<1.4.3", + "miraheze/ts-portal": "<=33", "mittwald/typo3_forum": "<1.2.1", "mobiledetect/mobiledetectlib": "<2.8.32", "modx/revolution": "<=3.1", "mojo42/jirafeau": "<4.4", "mongodb/mongodb": ">=1,<1.9.2", + "mongodb/mongodb-extension": "<1.21.2", "monolog/monolog": ">=1.8,<1.12", - "moodle/moodle": "<4.3.12|>=4.4,<4.4.8|>=4.5.0.0-beta,<4.5.4", + "moodle/moodle": "<4.5.9|>=5.0.0.0-beta,<5.0.5|>=5.1.0.0-beta,<5.1.2", "moonshine/moonshine": "<=3.12.5", "mos/cimage": "<0.7.19", "movim/moxl": ">=0.8,<=0.10", "movingbytes/social-network": "<=1.2.1", "mpdf/mpdf": "<=7.1.7", - "munkireport/comment": "<4.1", + "munkireport/comment": "<4", "munkireport/managedinstalls": "<2.6", "munkireport/munki_facts": "<1.5", - "munkireport/munkireport": ">=2.5.3,<5.6.3", "munkireport/reportdata": "<3.5", "munkireport/softwareupdate": "<1.6", "mustache/mustache": ">=2,<2.14.1", @@ -3585,6 +3652,7 @@ "netgen/tagsbundle": ">=3.4,<3.4.11|>=4,<4.0.15", "nette/application": ">=2,<2.0.19|>=2.1,<2.1.13|>=2.2,<2.2.10|>=2.3,<2.3.14|>=2.4,<2.4.16|>=3,<3.0.6", "nette/nette": ">=2,<2.0.19|>=2.1,<2.1.13", + "neuron-core/neuron-ai": "<=2.8.11", "nilsteampassnet/teampass": "<3.1.3.1-dev", "nitsan/ns-backup": "<13.0.1", "nonfiction/nterchange": "<4.1.1", @@ -3601,17 +3669,17 @@ "october/cms": "<1.0.469|==1.0.469|==1.0.471|==1.1.1", "october/october": "<3.7.5", "october/rain": "<1.0.472|>=1.1,<1.1.2", - "october/system": "<3.7.5", + "october/system": "<=3.7.12|>=4,<=4.0.11", "oliverklee/phpunit": "<3.5.15", "omeka/omeka-s": "<4.0.3", - "onelogin/php-saml": "<2.10.4", + "onelogin/php-saml": "<2.21.1|>=3,<3.8.1|>=4,<4.3.1", "oneup/uploader-bundle": ">=1,<1.9.3|>=2,<2.1.5", "open-web-analytics/open-web-analytics": "<1.8.1", "opencart/opencart": ">=0", "openid/php-openid": "<2.3", - "openmage/magento-lts": "<20.12.3", + "openmage/magento-lts": "<20.16.1", "opensolutions/vimbadmin": "<=3.0.15", - "opensource-workshop/connect-cms": "<1.8.7|>=2,<2.4.7", + "opensource-workshop/connect-cms": "<1.41.1|>=2,<2.41.1", "orchid/platform": ">=8,<14.43", "oro/calendar-bundle": ">=4.2,<=4.2.6|>=5,<=5.0.6|>=5.1,<5.1.1", "oro/commerce": ">=4.1,<5.0.11|>=5.1,<5.1.1", @@ -3628,6 +3696,7 @@ "pagekit/pagekit": "<=1.0.18", "paragonie/ecc": "<2.0.1", "paragonie/random_compat": "<2", + "paragonie/sodium_compat": "<1.24|>=2,<2.5", "passbolt/passbolt_api": "<4.6.2", "paypal/adaptivepayments-sdk-php": "<=3.9.2", "paypal/invoice-sdk-php": "<=3.9", @@ -3640,6 +3709,7 @@ "pear/pear": "<=1.10.1", "pegasus/google-for-jobs": "<1.5.1|>=2,<2.1.1", "personnummer/personnummer": "<3.0.2", + "ph7software/ph7builder": "<=17.9.1", "phanan/koel": "<5.1.4", "phenx/php-svg-lib": "<0.5.2", "php-censor/php-censor": "<2.0.13|>=2.1,<2.1.5", @@ -3650,32 +3720,35 @@ "phpmailer/phpmailer": "<6.5", "phpmussel/phpmussel": ">=1,<1.6", "phpmyadmin/phpmyadmin": "<5.2.2", - "phpmyfaq/phpmyfaq": "<3.2.5|==3.2.5|>=3.2.10,<=4.0.1", + "phpmyfaq/phpmyfaq": "<=4.1", "phpoffice/common": "<0.2.9", "phpoffice/math": "<=0.2", "phpoffice/phpexcel": "<=1.8.2", "phpoffice/phpspreadsheet": "<1.30|>=2,<2.1.12|>=2.2,<2.4|>=3,<3.10|>=4,<5", - "phpseclib/phpseclib": "<2.0.47|>=3,<3.0.36", + "phppgadmin/phppgadmin": "<=7.13", + "phpseclib/phpseclib": "<=2.0.51|>=3,<=3.0.49", "phpservermon/phpservermon": "<3.6", "phpsysinfo/phpsysinfo": "<3.4.3", - "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5.0.10,<5.6.3", + "phpunit/phpunit": "<8.5.52|>=9,<9.6.33|>=10,<10.5.62|>=11,<11.5.50|>=12,<12.5.8", "phpwhois/phpwhois": "<=4.2.5", "phpxmlrpc/extras": "<0.6.1", "phpxmlrpc/phpxmlrpc": "<4.9.2", + "phraseanet/phraseanet": "==4.0.3", "pi/pi": "<=2.5", - "pimcore/admin-ui-classic-bundle": "<1.7.6", + "pimcore/admin-ui-classic-bundle": "<=1.7.15|>=2.0.0.0-RC1-dev,<=2.2.2", "pimcore/customer-management-framework-bundle": "<4.2.1", "pimcore/data-hub": "<1.2.4", "pimcore/data-importer": "<1.8.9|>=1.9,<1.9.3", "pimcore/demo": "<10.3", "pimcore/ecommerce-framework-bundle": "<1.0.10", "pimcore/perspective-editor": "<1.5.1", - "pimcore/pimcore": "<11.5.4", + "pimcore/pimcore": "<=11.5.14.1|>=12,<12.3.3", + "pimcore/web2print-tools-bundle": "<=5.2.1|>=6.0.0.0-RC1-dev,<=6.1", "piwik/piwik": "<1.11", "pixelfed/pixelfed": "<0.12.5", "plotly/plotly.js": "<2.25.2", "pocketmine/bedrock-protocol": "<8.0.2", - "pocketmine/pocketmine-mp": "<5.32.1", + "pocketmine/pocketmine-mp": "<5.41.1", "pocketmine/raklib": ">=0.14,<0.14.6|>=0.15,<0.15.1", "pressbooks/pressbooks": "<5.18", "prestashop/autoupgrade": ">=4,<4.10.1", @@ -3683,22 +3756,25 @@ "prestashop/blockwishlist": ">=2,<2.1.1", "prestashop/contactform": ">=1.0.1,<4.3", "prestashop/gamification": "<2.3.2", - "prestashop/prestashop": "<8.2.3", + "prestashop/prestashop": "<8.2.5|>=9.0.0.0-alpha1,<9.1", "prestashop/productcomments": "<5.0.2", + "prestashop/ps_checkout": "<4.4.1|>=5,<5.0.5", "prestashop/ps_contactinfo": "<=3.3.2", "prestashop/ps_emailsubscription": "<2.6.1", "prestashop/ps_facetedsearch": "<3.4.1", "prestashop/ps_linklist": "<3.1", - "privatebin/privatebin": "<1.4|>=1.5,<1.7.4", - "processwire/processwire": "<=3.0.229", + "privatebin/privatebin": "<1.4|>=1.5,<1.7.4|>=1.7.7,<2.0.3", + "processwire/processwire": "<=3.0.246", "propel/propel": ">=2.0.0.0-alpha1,<=2.0.0.0-alpha7", "propel/propel1": ">=1,<=1.7.1", - "pterodactyl/panel": "<=1.11.10", + "psy/psysh": "<=0.11.22|>=0.12,<=0.12.18", + "pterodactyl/panel": "<1.12.1", "ptheofan/yii2-statemachine": ">=2.0.0.0-RC1-dev,<=2", "ptrofimov/beanstalk_console": "<1.7.14", "pubnub/pubnub": "<6.1", "punktde/pt_extbase": "<1.5.1", "pusher/pusher-php-server": "<2.2.1", + "putyourlightson/craft-sprig": ">=2,<2.15.2|>=3,<3.7.2", "pwweb/laravel-core": "<=0.3.6.0-beta", "pxlrbt/filament-excel": "<1.1.14|>=2.0.0.0-alpha,<2.3.3", "pyrocms/pyrocms": "<=3.9.1", @@ -3707,25 +3783,28 @@ "rainlab/blog-plugin": "<1.4.1", "rainlab/debugbar-plugin": "<3.1", "rainlab/user-plugin": "<=1.4.5", + "ralffreit/mfa-email": "<1.0.7|==2", "rankmath/seo-by-rank-math": "<=1.0.95", "rap2hpoutre/laravel-log-viewer": "<0.13", "react/http": ">=0.7,<1.9", "really-simple-plugins/complianz-gdpr": "<6.4.2", - "redaxo/source": "<5.18.3", + "redaxo/source": "<=5.20.1", "remdex/livehelperchat": "<4.29", "renolit/reint-downloadmanager": "<4.0.2|>=5,<5.0.1", "reportico-web/reportico": "<=8.1", "rhukster/dom-sanitizer": "<1.0.7", "rmccue/requests": ">=1.6,<1.8", - "robrichards/xmlseclibs": ">=1,<3.0.4", + "roadiz/documents": "<2.3.42|>=2.4,<2.5.44|>=2.6,<2.6.28|>=2.7,<2.7.9", + "robrichards/xmlseclibs": "<3.1.5", "roots/soil": "<4.1", - "roundcube/roundcubemail": "<1.5.10|>=1.6,<1.6.11", + "roundcube/roundcubemail": "<1.5.10|>=1.6,<1.6.11|>=1.7.0.0-beta,<1.7.0.0-RC5-dev", "rudloff/alltube": "<3.0.3", "rudloff/rtmpdump-bin": "<=2.3.1", "s-cart/core": "<=9.0.5", "s-cart/s-cart": "<6.9", "sabberworm/php-css-parser": ">=1,<1.0.1|>=2,<2.0.1|>=3,<3.0.1|>=4,<4.0.1|>=5,<5.0.9|>=5.1,<5.1.3|>=5.2,<5.2.1|>=6,<6.0.2|>=7,<7.0.4|>=8,<8.0.1|>=8.1,<8.1.1|>=8.2,<8.2.1|>=8.3,<8.3.1", "sabre/dav": ">=1.6,<1.7.11|>=1.8,<1.8.9", + "saloonphp/saloon": "<4", "samwilson/unlinked-wikibase": "<1.42", "scheb/two-factor-bundle": "<3.26|>=4,<4.11", "sensiolabs/connect": "<4.2.3", @@ -3733,11 +3812,11 @@ "setasign/fpdi": "<2.6.4", "sfroemken/url_redirect": "<=1.2.1", "sheng/yiicms": "<1.2.1", - "shopware/core": "<6.5.8.18-dev|>=6.6,<6.6.10.3-dev|>=6.7,<6.7.2.1-dev", - "shopware/platform": "<=6.6.10.4|>=6.7.0.0-RC1-dev,<6.7.0.0-RC2-dev", + "shopware/core": "<6.6.10.15-dev|>=6.7,<6.7.8.1-dev", + "shopware/platform": "<6.6.10.15-dev|>=6.7,<6.7.8.1-dev", "shopware/production": "<=6.3.5.2", - "shopware/shopware": "<=5.7.17|>=6.7,<6.7.2.1-dev", - "shopware/storefront": "<=6.4.8.1|>=6.5.8,<6.5.8.7-dev", + "shopware/shopware": "<=5.7.17|>=6.4.6,<6.6.10.10-dev|>=6.7,<6.7.6.1-dev", + "shopware/storefront": "<6.6.10.10-dev|>=6.7,<6.7.5.1-dev", "shopxo/shopxo": "<=6.4", "showdoc/showdoc": "<2.10.4", "shuchkin/simplexlsx": ">=1.0.12,<1.1.13", @@ -3768,7 +3847,7 @@ "simplesamlphp/simplesamlphp-module-openid": "<1", "simplesamlphp/simplesamlphp-module-openidprovider": "<0.9", "simplesamlphp/xml-common": "<1.20", - "simplesamlphp/xml-security": "==1.6.11", + "simplesamlphp/xml-security": "<1.13.9|>=2,<2.3.1", "simplito/elliptic-php": "<1.0.6", "sitegeist/fluid-components": "<3.5", "sjbr/sr-feuser-register": "<2.6.2|>=5.1,<12.5", @@ -3778,31 +3857,32 @@ "slim/slim": "<2.6", "slub/slub-events": "<3.0.3", "smarty/smarty": "<4.5.3|>=5,<5.1.1", - "snipe/snipe-it": "<8.1.18", + "snipe/snipe-it": "<8.3.7", "socalnick/scn-social-auth": "<1.15.2", "socialiteproviders/steam": "<1.1", - "solspace/craft-freeform": ">=5,<5.10.16", + "solspace/craft-freeform": "<4.1.29|>=5,<=5.14.6", "soosyze/soosyze": "<=2", "spatie/browsershot": "<5.0.5", "spatie/image-optimizer": "<1.7.3", "spencer14420/sp-php-email-handler": "<1", "spipu/html2pdf": "<5.2.8", + "spiral/roadrunner": "<2025.1", "spoon/library": "<1.4.1", "spoonity/tcpdf": "<6.2.22", "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1", "ssddanbrown/bookstack": "<24.05.1", - "starcitizentools/citizen-skin": ">=1.9.4,<3.4", + "starcitizentools/citizen-skin": ">=1.9.4,<3.9", "starcitizentools/short-description": ">=4,<4.0.1", "starcitizentools/tabber-neue": ">=1.9.1,<2.7.2|>=3,<3.1.1", "starcitizenwiki/embedvideo": "<=4", - "statamic/cms": "<=5.16", + "statamic/cms": "<5.73.16|>=6,<6.7.2", "stormpath/sdk": "<9.9.99", "studio-42/elfinder": "<=2.1.64", "studiomitte/friendlycaptcha": "<0.1.4", "subhh/libconnect": "<7.0.8|>=8,<8.1", "sukohi/surpass": "<1", "sulu/form-bundle": ">=2,<2.5.3", - "sulu/sulu": "<1.6.44|>=2,<2.5.25|>=2.6,<2.6.9|>=3.0.0.0-alpha1,<3.0.0.0-alpha3", + "sulu/sulu": "<2.6.22|>=3,<3.0.5", "sumocoders/framework-user-bundle": "<1.4", "superbig/craft-audit": "<3.0.2", "svewap/a21glossary": "<=0.4.10", @@ -3814,7 +3894,7 @@ "sylius/grid-bundle": "<1.10.1", "sylius/paypal-plugin": "<1.6.2|>=1.7,<1.7.2|>=2,<2.0.2", "sylius/resource-bundle": ">=1,<1.3.14|>=1.4,<1.4.7|>=1.5,<1.5.2|>=1.6,<1.6.4", - "sylius/sylius": "<1.12.19|>=1.13.0.0-alpha1,<1.13.4", + "sylius/sylius": "<1.9.12|>=1.10,<1.10.16|>=1.11,<1.11.17|>=1.12,<=1.12.22|>=1.13,<=1.13.14|>=1.14,<=1.14.17|>=2,<=2.0.15|>=2.1,<=2.1.11|>=2.2,<=2.2.2", "symbiote/silverstripe-multivaluefield": ">=3,<3.1", "symbiote/silverstripe-queuedjobs": ">=3,<3.0.2|>=3.1,<3.1.4|>=4,<4.0.7|>=4.1,<4.1.2|>=4.2,<4.2.4|>=4.3,<4.3.3|>=4.4,<4.4.3|>=4.5,<4.5.1|>=4.6,<4.6.4", "symbiote/silverstripe-seed": "<6.0.3", @@ -3826,7 +3906,7 @@ "symfony/form": ">=2.3,<2.3.35|>=2.4,<2.6.12|>=2.7,<2.7.50|>=2.8,<2.8.49|>=3,<3.4.20|>=4,<4.0.15|>=4.1,<4.1.9|>=4.2,<4.2.1", "symfony/framework-bundle": ">=2,<2.3.18|>=2.4,<2.4.8|>=2.5,<2.5.2|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7|>=5.3.14,<5.3.15|>=5.4.3,<5.4.4|>=6.0.3,<6.0.4", "symfony/http-client": ">=4.3,<5.4.47|>=6,<6.4.15|>=7,<7.1.8", - "symfony/http-foundation": "<5.4.46|>=6,<6.4.14|>=7,<7.1.7", + "symfony/http-foundation": "<5.4.50|>=6,<6.4.29|>=7,<7.3.7", "symfony/http-kernel": ">=2,<4.4.50|>=5,<5.4.20|>=6,<6.0.20|>=6.1,<6.1.12|>=6.2,<6.2.6", "symfony/intl": ">=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13", "symfony/maker-bundle": ">=1.27,<1.29.2|>=1.30,<1.31.1", @@ -3834,7 +3914,7 @@ "symfony/phpunit-bridge": ">=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", "symfony/polyfill": ">=1,<1.10", "symfony/polyfill-php55": ">=1,<1.10", - "symfony/process": "<5.4.46|>=6,<6.4.14|>=7,<7.1.7", + "symfony/process": "<5.4.51|>=6,<6.4.33|>=7,<7.1.7|>=7.3,<7.3.11|>=7.4,<7.4.5|>=8,<8.0.5", "symfony/proxy-manager-bridge": ">=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", "symfony/routing": ">=2,<2.0.19", "symfony/runtime": ">=5.3,<5.4.46|>=6,<6.4.14|>=7,<7.1.7", @@ -3845,7 +3925,7 @@ "symfony/security-guard": ">=2.8,<3.4.48|>=4,<4.4.23|>=5,<5.2.8", "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7|>=5.1,<5.2.8|>=5.3,<5.4.47|>=6,<6.4.15|>=7,<7.1.8", "symfony/serializer": ">=2,<2.0.11|>=4.1,<4.4.35|>=5,<5.3.12", - "symfony/symfony": "<5.4.47|>=6,<6.4.15|>=7,<7.1.8", + "symfony/symfony": "<5.4.51|>=6,<6.4.33|>=7,<7.3.11|>=7.4,<7.4.5|>=8,<8.0.5", "symfony/translation": ">=2,<2.0.17", "symfony/twig-bridge": ">=2,<4.4.51|>=5,<5.4.31|>=6,<6.3.8", "symfony/ux-autocomplete": "<2.11.2", @@ -3869,7 +3949,7 @@ "thelia/thelia": ">=2.1,<2.1.3", "theonedemon/phpwhois": "<=4.2.5", "thinkcmf/thinkcmf": "<6.0.8", - "thorsten/phpmyfaq": "<=4.0.1|>=4.0.7,<4.0.13", + "thorsten/phpmyfaq": "<4.1.1", "tikiwiki/tiki-manager": "<=17.1", "timber/timber": ">=0.16.6,<1.23.1|>=1.24,<1.24.1|>=2,<2.1", "tinymce/tinymce": "<7.2", @@ -3880,18 +3960,19 @@ "topthink/framework": "<6.0.17|>=6.1,<=8.0.4", "topthink/think": "<=6.1.1", "topthink/thinkphp": "<=3.2.3|>=6.1.3,<=8.0.4", - "torrentpier/torrentpier": "<=2.4.3", + "torrentpier/torrentpier": "<=2.8.8", "tpwd/ke_search": "<4.0.3|>=4.1,<4.6.6|>=5,<5.0.2", "tribalsystems/zenario": "<=9.7.61188", "truckersmp/phpwhois": "<=4.3.1", "ttskch/pagination-service-provider": "<1", "twbs/bootstrap": "<3.4.1|>=4,<4.3.1", "twig/twig": "<3.11.2|>=3.12,<3.14.1|>=3.16,<3.19", + "typicms/core": "<16.1.7", "typo3/cms": "<9.5.29|>=10,<10.4.35|>=11,<11.5.23|>=12,<12.2", - "typo3/cms-backend": "<4.1.14|>=4.2,<4.2.15|>=4.3,<4.3.7|>=4.4,<4.4.4|>=7,<=7.6.50|>=8,<=8.7.39|>=9,<9.5.55|>=10,<10.4.54|>=11,<11.5.48|>=12,<12.4.37|>=13,<13.4.18", + "typo3/cms-backend": "<4.1.14|>=4.2,<4.2.15|>=4.3,<4.3.7|>=4.4,<4.4.4|>=7,<=7.6.50|>=8,<=8.7.39|>=9,<9.5.55|>=10,<=10.4.54|>=11,<=11.5.48|>=12,<=12.4.40|>=13,<=13.4.22|>=14,<=14.0.1", "typo3/cms-belog": ">=10,<=10.4.47|>=11,<=11.5.41|>=12,<=12.4.24|>=13,<=13.4.2", "typo3/cms-beuser": ">=9,<9.5.55|>=10,<10.4.54|>=11,<11.5.48|>=12,<12.4.37|>=13,<13.4.18", - "typo3/cms-core": "<=8.7.56|>=9,<9.5.55|>=10,<10.4.54|>=11,<11.5.48|>=12,<12.4.37|>=13,<13.4.18", + "typo3/cms-core": "<=8.7.56|>=9,<9.5.55|>=10,<=10.4.54|>=11,<=11.5.48|>=12,<=12.4.40|>=13,<=13.4.22|>=14,<=14.0.1", "typo3/cms-dashboard": ">=10,<10.4.54|>=11,<11.5.48|>=12,<12.4.37|>=13,<13.4.18", "typo3/cms-extbase": "<6.2.24|>=7,<7.6.8|==8.1.1", "typo3/cms-extensionmanager": ">=10,<=10.4.47|>=11,<=11.5.41|>=12,<=12.4.24|>=13,<=13.4.2", @@ -3903,7 +3984,8 @@ "typo3/cms-install": "<4.1.14|>=4.2,<4.2.16|>=4.3,<4.3.9|>=4.4,<4.4.5|>=12.2,<12.4.8|==13.4.2", "typo3/cms-lowlevel": ">=11,<=11.5.41", "typo3/cms-recordlist": ">=11,<11.5.48", - "typo3/cms-recycler": ">=9,<9.5.55|>=10,<10.4.54|>=11,<11.5.48|>=12,<12.4.37|>=13,<13.4.18", + "typo3/cms-recycler": ">=9,<9.5.55|>=10,<=10.4.54|>=11,<=11.5.48|>=12,<=12.4.40|>=13,<=13.4.22|>=14,<=14.0.1", + "typo3/cms-redirects": ">=10,<=10.4.54|>=11,<=11.5.48|>=12,<=12.4.40|>=13,<=13.4.22|>=14,<=14.0.1", "typo3/cms-rte-ckeditor": ">=9.5,<9.5.42|>=10,<10.4.39|>=11,<11.5.30", "typo3/cms-scheduler": ">=11,<=11.5.41", "typo3/cms-setup": ">=9,<=9.5.50|>=10,<=10.4.49|>=11,<=11.5.43|>=12,<=12.4.30|>=13,<=13.4.11", @@ -3933,15 +4015,16 @@ "vertexvaar/falsftp": "<0.2.6", "villagedefrance/opencart-overclocked": "<=1.11.1", "vova07/yii2-fileapi-widget": "<0.1.9", - "vrana/adminer": "<=4.8.1", + "vrana/adminer": "<5.4.2", "vufind/vufind": ">=2,<9.1.1", "waldhacker/hcaptcha": "<2.1.2", "wallabag/tcpdf": "<6.2.22", "wallabag/wallabag": "<2.6.11", "wanglelecc/laracms": "<=1.0.3", "wapplersystems/a21glossary": "<=0.4.10", - "web-auth/webauthn-framework": ">=3.3,<3.3.4|>=4.5,<4.9", - "web-auth/webauthn-lib": ">=4.5,<4.9", + "web-auth/webauthn-framework": ">=3.3,<3.3.4|>=4.5,<4.9|>=5.2,<5.2.4", + "web-auth/webauthn-lib": ">=4.5,<4.9|>=5.2,<5.2.4", + "web-auth/webauthn-symfony-bundle": ">=5.2,<5.2.4", "web-feet/coastercms": "==5.5", "web-tp3/wec_map": "<3.0.3", "webbuilders-group/silverstripe-kapost-bridge": "<0.4", @@ -3953,8 +4036,8 @@ "wikibase/wikibase": "<=1.39.3", "wikimedia/parsoid": "<0.12.2", "willdurand/js-translation-bundle": "<2.1.1", - "winter/wn-backend-module": "<1.2.4", - "winter/wn-cms-module": "<1.0.476|>=1.1,<1.1.11|>=1.2,<1.2.7", + "winter/wn-backend-module": "<1.2.12", + "winter/wn-cms-module": "<=1.2.9", "winter/wn-dusk-plugin": "<2.1", "winter/wn-system-module": "<1.2.4", "wintercms/winter": "<=1.2.3", @@ -3966,11 +4049,13 @@ "wpanel/wpanel4-cms": "<=4.3.1", "wpcloud/wp-stateless": "<3.2", "wpglobus/wpglobus": "<=1.9.6", - "wwbn/avideo": "<14.3", + "wpmetabox/meta-box": "<5.11.2", + "wwbn/avideo": "<=26", "xataface/xataface": "<3", "xpressengine/xpressengine": "<3.0.15", "yab/quarx": "<2.4.5", - "yeswiki/yeswiki": "<=4.5.4", + "yansongda/pay": "<=3.7.19", + "yeswiki/yeswiki": "<4.6", "yetiforce/yetiforce-crm": "<6.5", "yidashi/yii2cmf": "<=2", "yii2mod/yii2-cms": "<1.9.2", @@ -3985,8 +4070,10 @@ "yiisoft/yii2-redis": "<2.0.20", "yikesinc/yikes-inc-easy-mailchimp-extender": "<6.8.6", "yoast-seo-for-typo3/yoast_seo": "<7.2.3", - "yourls/yourls": "<=1.8.2", + "yoast/duplicate-post": "<=4.5", + "yourls/yourls": "<=1.10.2", "yuan1994/tpadmin": "<=1.3.12", + "yungifez/skuul": "<=2.6.5", "z-push/z-push-dev": "<2.7.6", "zencart/zencart": "<=1.5.7.0-beta", "zendesk/zendesk_api_client_php": "<2.2.11", @@ -4024,7 +4111,8 @@ "zf-commons/zfc-user": "<1.2.2", "zfcampus/zf-apigility-doctrine": ">=1,<1.0.3", "zfr/zfr-oauth2-server-module": "<0.1.2", - "zoujingli/thinkadmin": "<=6.1.53" + "zoujingli/thinkadmin": "<=6.1.53", + "zumba/json-serializer": "<3.2.3" }, "default-branch": true, "type": "metapackage", @@ -4062,7 +4150,7 @@ "type": "tidelift" } ], - "time": "2025-10-14T18:07:42+00:00" + "time": "2026-04-08T23:16:29+00:00" }, { "name": "sebastian/cli-parser", @@ -4234,16 +4322,16 @@ }, { "name": "sebastian/comparator", - "version": "5.0.4", + "version": "5.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "e8e53097718d2b53cfb2aa859b06a41abf58c62e" + "reference": "55dfef806eb7dfeb6e7a6935601fef866f8ca48d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/e8e53097718d2b53cfb2aa859b06a41abf58c62e", - "reference": "e8e53097718d2b53cfb2aa859b06a41abf58c62e", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55dfef806eb7dfeb6e7a6935601fef866f8ca48d", + "reference": "55dfef806eb7dfeb6e7a6935601fef866f8ca48d", "shasum": "" }, "require": { @@ -4299,7 +4387,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.4" + "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.5" }, "funding": [ { @@ -4319,7 +4407,7 @@ "type": "tidelift" } ], - "time": "2025-09-07T05:25:07+00:00" + "time": "2026-01-24T09:25:16+00:00" }, { "name": "sebastian/complexity", @@ -5019,16 +5107,16 @@ }, { "name": "spatie/array-to-xml", - "version": "3.4.0", + "version": "3.4.4", "source": { "type": "git", "url": "https://github.com/spatie/array-to-xml.git", - "reference": "7dcfc67d60b0272926dabad1ec01f6b8a5fb5e67" + "reference": "88b2f3852a922dd73177a68938f8eb2ec70c7224" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/array-to-xml/zipball/7dcfc67d60b0272926dabad1ec01f6b8a5fb5e67", - "reference": "7dcfc67d60b0272926dabad1ec01f6b8a5fb5e67", + "url": "https://api.github.com/repos/spatie/array-to-xml/zipball/88b2f3852a922dd73177a68938f8eb2ec70c7224", + "reference": "88b2f3852a922dd73177a68938f8eb2ec70c7224", "shasum": "" }, "require": { @@ -5071,7 +5159,7 @@ "xml" ], "support": { - "source": "https://github.com/spatie/array-to-xml/tree/3.4.0" + "source": "https://github.com/spatie/array-to-xml/tree/3.4.4" }, "funding": [ { @@ -5083,20 +5171,20 @@ "type": "github" } ], - "time": "2024-12-16T12:45:15+00:00" + "time": "2025-12-15T09:00:41+00:00" }, { "name": "symfony/console", - "version": "v6.4.26", + "version": "v6.4.36", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "492de6dfd93910d7d7a729c5a04ddcd2b9e99c4f" + "reference": "9f481cfb580db8bcecc9b2d4c63f3e13df022ad5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/492de6dfd93910d7d7a729c5a04ddcd2b9e99c4f", - "reference": "492de6dfd93910d7d7a729c5a04ddcd2b9e99c4f", + "url": "https://api.github.com/repos/symfony/console/zipball/9f481cfb580db8bcecc9b2d4c63f3e13df022ad5", + "reference": "9f481cfb580db8bcecc9b2d4c63f3e13df022ad5", "shasum": "" }, "require": { @@ -5161,7 +5249,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.26" + "source": "https://github.com/symfony/console/tree/v6.4.36" }, "funding": [ { @@ -5181,7 +5269,7 @@ "type": "tidelift" } ], - "time": "2025-09-26T12:13:46+00:00" + "time": "2026-03-27T15:30:51+00:00" }, { "name": "symfony/deprecation-contracts", @@ -5252,16 +5340,16 @@ }, { "name": "symfony/filesystem", - "version": "v6.4.24", + "version": "v6.4.34", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "75ae2edb7cdcc0c53766c30b0a2512b8df574bd8" + "reference": "01ffe0411b842f93c571e5c391f289c3fdd498c3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/75ae2edb7cdcc0c53766c30b0a2512b8df574bd8", - "reference": "75ae2edb7cdcc0c53766c30b0a2512b8df574bd8", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/01ffe0411b842f93c571e5c391f289c3fdd498c3", + "reference": "01ffe0411b842f93c571e5c391f289c3fdd498c3", "shasum": "" }, "require": { @@ -5298,7 +5386,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.4.24" + "source": "https://github.com/symfony/filesystem/tree/v6.4.34" }, "funding": [ { @@ -5318,7 +5406,7 @@ "type": "tidelift" } ], - "time": "2025-07-10T08:14:14+00:00" + "time": "2026-02-24T17:51:06+00:00" }, { "name": "symfony/polyfill-ctype", @@ -5737,16 +5825,16 @@ }, { "name": "symfony/service-contracts", - "version": "v3.6.0", + "version": "v3.6.1", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4" + "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f021b05a130d35510bd6b25fe9053c2a8a15d5d4", - "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/45112560a3ba2d715666a509a0bc9521d10b6c43", + "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43", "shasum": "" }, "require": { @@ -5800,7 +5888,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.6.0" + "source": "https://github.com/symfony/service-contracts/tree/v3.6.1" }, "funding": [ { @@ -5811,25 +5899,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-04-25T09:37:31+00:00" + "time": "2025-07-15T11:30:57+00:00" }, { "name": "symfony/string", - "version": "v6.4.26", + "version": "v6.4.34", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "5621f039a71a11c87c106c1c598bdcd04a19aeea" + "reference": "2adaf4106f2ef4c67271971bde6d3fe0a6936432" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/5621f039a71a11c87c106c1c598bdcd04a19aeea", - "reference": "5621f039a71a11c87c106c1c598bdcd04a19aeea", + "url": "https://api.github.com/repos/symfony/string/zipball/2adaf4106f2ef4c67271971bde6d3fe0a6936432", + "reference": "2adaf4106f2ef4c67271971bde6d3fe0a6936432", "shasum": "" }, "require": { @@ -5885,7 +5977,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.4.26" + "source": "https://github.com/symfony/string/tree/v6.4.34" }, "funding": [ { @@ -5905,20 +5997,20 @@ "type": "tidelift" } ], - "time": "2025-09-11T14:32:46+00:00" + "time": "2026-02-08T20:44:54+00:00" }, { "name": "theseer/tokenizer", - "version": "1.2.3", + "version": "1.3.1", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" + "reference": "b7489ce515e168639d17feec34b8847c326b0b3c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", - "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b7489ce515e168639d17feec34b8847c326b0b3c", + "reference": "b7489ce515e168639d17feec34b8847c326b0b3c", "shasum": "" }, "require": { @@ -5947,7 +6039,7 @@ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.3" + "source": "https://github.com/theseer/tokenizer/tree/1.3.1" }, "funding": [ { @@ -5955,20 +6047,20 @@ "type": "github" } ], - "time": "2024-03-03T12:36:25+00:00" + "time": "2025-11-17T20:03:58+00:00" }, { "name": "vimeo/psalm", - "version": "6.13.1", + "version": "6.16.1", "source": { "type": "git", "url": "https://github.com/vimeo/psalm.git", - "reference": "1e3b7f0a8ab32b23197b91107adc0a7ed8a05b51" + "reference": "f1f5de594dc76faf8784e02d3dc4716c91c6f6ac" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vimeo/psalm/zipball/1e3b7f0a8ab32b23197b91107adc0a7ed8a05b51", - "reference": "1e3b7f0a8ab32b23197b91107adc0a7ed8a05b51", + "url": "https://api.github.com/repos/vimeo/psalm/zipball/f1f5de594dc76faf8784e02d3dc4716c91c6f6ac", + "reference": "f1f5de594dc76faf8784e02d3dc4716c91c6f6ac", "shasum": "" }, "require": { @@ -5991,11 +6083,11 @@ "fidry/cpu-core-counter": "^0.4.1 || ^0.5.1 || ^1.0.0", "netresearch/jsonmapper": "^5.0", "nikic/php-parser": "^5.0.0", - "php": "~8.1.31 || ~8.2.27 || ~8.3.16 || ~8.4.3", - "sebastian/diff": "^4.0 || ^5.0 || ^6.0 || ^7.0", + "php": "~8.1.31 || ~8.2.27 || ~8.3.16 || ~8.4.3 || ~8.5.0", + "sebastian/diff": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0", "spatie/array-to-xml": "^2.17.0 || ^3.0", - "symfony/console": "^6.0 || ^7.0", - "symfony/filesystem": "~6.3.12 || ~6.4.3 || ^7.0.3", + "symfony/console": "^6.0 || ^7.0 || ^8.0", + "symfony/filesystem": "~6.3.12 || ~6.4.3 || ^7.0.3 || ^8.0", "symfony/polyfill-php84": "^1.31.0" }, "provide": { @@ -6017,7 +6109,7 @@ "psalm/plugin-phpunit": "^0.19", "slevomat/coding-standard": "^8.4", "squizlabs/php_codesniffer": "^3.6", - "symfony/process": "^6.0 || ^7.0" + "symfony/process": "^6.0 || ^7.0 || ^8.0" }, "suggest": { "ext-curl": "In order to send data to shepherd", @@ -6073,32 +6165,32 @@ "issues": "https://github.com/vimeo/psalm/issues", "source": "https://github.com/vimeo/psalm" }, - "time": "2025-08-06T10:10:28+00:00" + "time": "2026-03-19T10:56:09+00:00" }, { "name": "webmozart/assert", - "version": "1.11.0", + "version": "1.12.1", "source": { "type": "git", "url": "https://github.com/webmozarts/assert.git", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + "reference": "9be6926d8b485f55b9229203f962b51ed377ba68" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/9be6926d8b485f55b9229203f962b51ed377ba68", + "reference": "9be6926d8b485f55b9229203f962b51ed377ba68", "shasum": "" }, "require": { "ext-ctype": "*", + "ext-date": "*", + "ext-filter": "*", "php": "^7.2 || ^8.0" }, - "conflict": { - "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<4.6.1 || 4.6.2" - }, - "require-dev": { - "phpunit/phpunit": "^8.5.13" + "suggest": { + "ext-intl": "", + "ext-simplexml": "", + "ext-spl": "" }, "type": "library", "extra": { @@ -6129,9 +6221,9 @@ ], "support": { "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.11.0" + "source": "https://github.com/webmozarts/assert/tree/1.12.1" }, - "time": "2022-06-03T18:03:27+00:00" + "time": "2025-10-29T15:56:20+00:00" } ], "aliases": [], @@ -6149,5 +6241,5 @@ "platform-overrides": { "php": "8.1.31" }, - "plugin-api-version": "2.6.0" + "plugin-api-version": "2.9.0" } From e13aef918206c66a6061f7fe9e9185f714474933 Mon Sep 17 00:00:00 2001 From: Anupam Kumar Date: Fri, 10 Apr 2026 16:09:31 +0530 Subject: [PATCH 10/14] fix(ci): don't re-require roave's package in psalm Signed-off-by: Anupam Kumar --- .github/workflows/psalm-matrix.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/psalm-matrix.yml b/.github/workflows/psalm-matrix.yml index b22a423..8d6603e 100644 --- a/.github/workflows/psalm-matrix.yml +++ b/.github/workflows/psalm-matrix.yml @@ -67,9 +67,6 @@ jobs: composer remove nextcloud/ocp --dev --no-scripts composer i - - name: Check for vulnerable PHP dependencies - run: composer require --dev roave/security-advisories:dev-latest - - name: Install dependencies # zizmor: ignore[template-injection] run: composer require --dev 'nextcloud/ocp:${{ matrix.ocp-version }}' --ignore-platform-reqs --with-dependencies From 2a0948c6517eefd44ed8908a0cf62dafc9a834da Mon Sep 17 00:00:00 2001 From: Anupam Kumar Date: Fri, 10 Apr 2026 16:20:18 +0530 Subject: [PATCH 11/14] fix(ci): integration tests should have different concurrency groups Signed-off-by: Anupam Kumar --- .github/workflows/integration-test-cron.yml | 4 ++-- .github/workflows/integration-test-file-listener.yml | 4 ++-- .github/workflows/integration-test-scan.yml | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/integration-test-cron.yml b/.github/workflows/integration-test-cron.yml index 995bb9c..d7e4cbb 100644 --- a/.github/workflows/integration-test-cron.yml +++ b/.github/workflows/integration-test-cron.yml @@ -1,7 +1,7 @@ # SPDX-FileCopyrightText: Nextcloud contributors # SPDX-License-Identifier: AGPL-3.0-or-later -name: Integration test - Cron +name: Integration test on: pull_request: @@ -20,7 +20,7 @@ permissions: contents: read concurrency: - group: integration-test-${{ github.head_ref || github.run_id }} + group: integration-test-cron-${{ github.head_ref || github.run_id }} cancel-in-progress: true diff --git a/.github/workflows/integration-test-file-listener.yml b/.github/workflows/integration-test-file-listener.yml index 6ea19d0..b63b155 100644 --- a/.github/workflows/integration-test-file-listener.yml +++ b/.github/workflows/integration-test-file-listener.yml @@ -1,7 +1,7 @@ # SPDX-FileCopyrightText: Nextcloud contributors # SPDX-License-Identifier: AGPL-3.0-or-later -name: Integration test - File listener +name: Integration test on: pull_request: @@ -20,7 +20,7 @@ permissions: contents: read concurrency: - group: integration-test-${{ github.head_ref || github.run_id }} + group: integration-test-file-listener${{ github.head_ref || github.run_id }} cancel-in-progress: true diff --git a/.github/workflows/integration-test-scan.yml b/.github/workflows/integration-test-scan.yml index bb67be4..e4d5c35 100644 --- a/.github/workflows/integration-test-scan.yml +++ b/.github/workflows/integration-test-scan.yml @@ -1,7 +1,7 @@ # SPDX-FileCopyrightText: Nextcloud contributors # SPDX-License-Identifier: AGPL-3.0-or-later -name: Integration test - OCC Scan +name: Integration test on: pull_request: @@ -20,7 +20,7 @@ permissions: contents: read concurrency: - group: integration-test-${{ github.head_ref || github.run_id }} + group: integration-test-scan-${{ github.head_ref || github.run_id }} cancel-in-progress: true From 52ad657e02e71d2120425ba5a918e91d51f97d73 Mon Sep 17 00:00:00 2001 From: Anupam Kumar Date: Fri, 10 Apr 2026 16:20:42 +0530 Subject: [PATCH 12/14] fix(ci): allow the embedding server to start up in integration tests Signed-off-by: Anupam Kumar --- .github/workflows/integration-test-cron.yml | 3 ++- .github/workflows/integration-test-file-listener.yml | 3 ++- .github/workflows/integration-test-scan.yml | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/integration-test-cron.yml b/.github/workflows/integration-test-cron.yml index d7e4cbb..63f5a0b 100644 --- a/.github/workflows/integration-test-cron.yml +++ b/.github/workflows/integration-test-cron.yml @@ -207,7 +207,7 @@ jobs: python3 -u ./main_em.py > em_backend_logs 2>&1 & python3 -u ./main.py > backend_logs 2>&1 & echo $! > ../pid.txt # Save the process ID (PID) - sleep 120 # Wait for the backend to get ready + sleep 60 # Wait for the backend to get ready - name: Register backend run: | @@ -216,6 +216,7 @@ jobs: ./occ config:system:set loglevel --value 1 ./occ app_api:daemon:register --net host manual_install "Manual Install" manual-install http localhost http://localhost:8080 timeout 120 ./occ app_api:app:register context_chat_backend manual_install --json-info "{\"appid\":\"context_chat_backend\",\"name\":\"Context Chat Backend\",\"daemon_config_name\":\"manual_install\",\"version\":\"${{ fromJson(steps.appinfo.outputs.result).version }}\",\"secret\":\"12345\",\"port\":10034,\"scopes\":[],\"system_app\":0}" --force-scopes --wait-finish + sleep 60 # Wait for the embedding server to get ready - name: Checkout documentation uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 diff --git a/.github/workflows/integration-test-file-listener.yml b/.github/workflows/integration-test-file-listener.yml index b63b155..e2058e0 100644 --- a/.github/workflows/integration-test-file-listener.yml +++ b/.github/workflows/integration-test-file-listener.yml @@ -198,7 +198,7 @@ jobs: python3 -u ./main_em.py > em_backend_logs 2>&1 & python3 -u ./main.py > backend_logs 2>&1 & echo $! > ../pid.txt # Save the process ID (PID) - sleep 120 # Wait for the backend to get ready + sleep 60 # Wait for the backend to get ready - name: Register backend run: | @@ -207,6 +207,7 @@ jobs: ./occ config:system:set loglevel --value 1 ./occ app_api:daemon:register --net host manual_install "Manual Install" manual-install http localhost http://localhost:8080 timeout 120 ./occ app_api:app:register context_chat_backend manual_install --json-info "{\"appid\":\"context_chat_backend\",\"name\":\"Context Chat Backend\",\"daemon_config_name\":\"manual_install\",\"version\":\"${{ fromJson(steps.appinfo.outputs.result).version }}\",\"secret\":\"12345\",\"port\":10034,\"scopes\":[],\"system_app\":0}" --force-scopes --wait-finish + sleep 60 # Wait for the embedding server to get ready - name: Enable context chat run: | diff --git a/.github/workflows/integration-test-scan.yml b/.github/workflows/integration-test-scan.yml index e4d5c35..ddbe9ac 100644 --- a/.github/workflows/integration-test-scan.yml +++ b/.github/workflows/integration-test-scan.yml @@ -254,7 +254,7 @@ jobs: python3 -u ./main_em.py > em_backend_logs 2>&1 & python3 -u ./main.py > backend_logs 2>&1 & echo $! > ../pid.txt # Save the process ID (PID) - sleep 120 # Wait for the backend to get ready + sleep 60 # Wait for the backend to get ready - name: Register backend run: | @@ -263,6 +263,7 @@ jobs: ./occ config:system:set loglevel --value 1 ./occ app_api:daemon:register --net host manual_install "Manual Install" manual-install http localhost http://localhost:8080 timeout 120 ./occ app_api:app:register context_chat_backend manual_install --json-info "{\"appid\":\"context_chat_backend\",\"name\":\"Context Chat Backend\",\"daemon_config_name\":\"manual_install\",\"version\":\"${{ fromJson(steps.appinfo.outputs.result).version }}\",\"secret\":\"12345\",\"port\":10034,\"scopes\":[],\"system_app\":0}" --force-scopes --wait-finish + sleep 60 # Wait for the embedding server to get ready - name: Scan files, baseline run: | From ddd94e46ee19909b4ffd0f4877f60e0bb5d4864b Mon Sep 17 00:00:00 2001 From: Anupam Kumar Date: Fri, 10 Apr 2026 20:36:22 +0530 Subject: [PATCH 13/14] fix(ci): add file-deletion-method matrix option back to file listener Signed-off-by: Anupam Kumar --- .github/workflows/integration-test-file-listener.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/integration-test-file-listener.yml b/.github/workflows/integration-test-file-listener.yml index e2058e0..af8a028 100644 --- a/.github/workflows/integration-test-file-listener.yml +++ b/.github/workflows/integration-test-file-listener.yml @@ -60,6 +60,7 @@ jobs: databases: [ 'pgsql' ] server-versions: [ 'master' ] encryption: ['on'] + file-deletion-method: [ 'occ', 'os' ] name: Integration test - File listener ☁️${{ matrix.server-versions }} 🐘${{ matrix.php-versions }} πŸ—‘οΈ${{ matrix.file-deletion-method }} πŸ”:${{ matrix.encryption }} From 9dfa991ca871b26c48d2d8387caed92cabb9bc20 Mon Sep 17 00:00:00 2001 From: Anupam Kumar Date: Fri, 10 Apr 2026 20:38:48 +0530 Subject: [PATCH 14/14] fix(ci): format prompts in integration test Signed-off-by: Anupam Kumar --- .github/workflows/integration-test-cron.yml | 14 +- .../integration-test-file-listener.yml | 145 +++++++++++------- 2 files changed, 98 insertions(+), 61 deletions(-) diff --git a/.github/workflows/integration-test-cron.yml b/.github/workflows/integration-test-cron.yml index 63f5a0b..2f37d2a 100644 --- a/.github/workflows/integration-test-cron.yml +++ b/.github/workflows/integration-test-cron.yml @@ -328,18 +328,24 @@ jobs: WORKER1_PID=$! ./occ background-job:worker -v 'OC\TaskProcessing\SynchronousBackgroundJob' & WORKER2_PID=$! + + echo "::group::Check english prompt with admin user" OUT1=$(./occ context_chat:prompt admin "Which factors are taken into account for the Ethical AI Rating?") echo "$OUT1" - echo '--------------------------------------------------' + echo "$OUT1" | grep -q "If all of these points are met, we give a Green label." || exit 1 + echo "::endgroup::" + + echo "::group::Check german prompt with admin user" OUT2=$(./occ context_chat:prompt admin "Welche Faktoren beeinflussen das Ethical AI Rating?") echo "$OUT2" - echo '--------------------------------------------------' + echo "$OUT2" | grep -q "If all of these points are met, we give a Green label." || exit 1 + echo "::endgroup::" + echo "::group::Check german search with admin user" OUT3=$(./occ context_chat:search admin "Welche Faktoren beeinflussen das Ethical AI Rating?") echo "$OUT3" - echo "$OUT1" | grep -q "If all of these points are met, we give a Green label." || exit 1 - echo "$OUT2" | grep -q "If all of these points are met, we give a Green label." || exit 1 echo "$OUT3" | grep -q "overview.rst" || exit 1 + echo "::endgroup::" kill -9 $WORKER1_PID kill -9 $WORKER2_PID diff --git a/.github/workflows/integration-test-file-listener.yml b/.github/workflows/integration-test-file-listener.yml index af8a028..e555d21 100644 --- a/.github/workflows/integration-test-file-listener.yml +++ b/.github/workflows/integration-test-file-listener.yml @@ -329,45 +329,61 @@ jobs: WORKER2_PID=$! set +e - # Check for user admin: Should be there + echo "Check for user admin: Should be there" # --------------- + + echo "::group::Check english prompt with admin user" OUT_ADMIN_ENGLISH_PROMPT_AI=$(./occ context_chat:prompt admin "Which factors are taken into account for the Ethical AI Rating?") + echo "$OUT_ADMIN_ENGLISH_PROMPT_AI" + echo "$OUT_ADMIN_ENGLISH_PROMPT_AI" | grep -q "If all of these points are met, we give a Green label." && echo 'βœ… Admin does see AI overview' || exit 1 + echo "::endgroup::" + + echo "::group::Check german prompt with admin user" OUT_ADMIN_GERMAN_PROMPT_AI=$(./occ context_chat:prompt admin "Welche Faktoren beeinflussen das Ethical AI Rating?") + echo "$OUT_ADMIN_GERMAN_PROMPT_AI" + echo "$OUT_ADMIN_GERMAN_PROMPT_AI" | grep -q "If all of these points are met, we give a Green label." && echo 'βœ… Admin does see AI overview, after german question' || exit 1 + echo "::endgroup::" + + echo "::group::Check german search with admin user" OUT_ADMIN_SEARCH_AI=$(./occ context_chat:search admin "Welche Faktoren beeinflussen das Ethical AI Rating?") + echo "$OUT_ADMIN_SEARCH_AI" + echo "$OUT_ADMIN_SEARCH_AI" | grep -q "overview.rst" && echo 'βœ… Admin does see AI overview, when using search' || exit 1 + echo "::endgroup::" - # Check for user test: Shouldn't be there - OUT_TEST_ENGLISH_PROMPT_AI=$(./occ context_chat:prompt test "Which factors are taken into account for the Ethical AI Rating?") - OUT_TEST_GERMAN_PROMPT_AI=$(./occ context_chat:prompt test "Welche Faktoren beeinflussen das Ethical AI Rating?") - OUT_TEST_SEARCH_AI=$(./occ context_chat:search test "Welche Faktoren beeinflussen das Ethical AI Rating?") - # Check for user test: Shouldn't be there, because it was not shared yet - OUT_TEST_PROMPT_JOBS=$(./occ context_chat:prompt test "How do I set my TimedJob to be time insensitive?") - OUT_TEST_SEARCH_JOBS=$(./occ context_chat:search test "How do I set my TimedJob to be time insensitive?") + echo "Check for user test: Shouldn't be there" # --------------- - echo "OUT_ADMIN_ENGLISH_PROMPT_AI" - echo "$OUT_ADMIN_ENGLISH_PROMPT_AI" - echo "OUT_ADMIN_GERMAN_PROMPT_AI" - echo "$OUT_ADMIN_GERMAN_PROMPT_AI" - echo "OUT_ADMIN_SEARCH_AI" - echo "$OUT_ADMIN_SEARCH_AI" - echo "OUT_TEST_ENGLISH_PROMPT_AI" + echo "::group::Check english prompt with admin user" + OUT_TEST_ENGLISH_PROMPT_AI=$(./occ context_chat:prompt test "Which factors are taken into account for the Ethical AI Rating?") echo "$OUT_TEST_ENGLISH_PROMPT_AI" - echo "OUT_TEST_GERMAN_PROMPT_AI" + echo "$OUT_TEST_ENGLISH_PROMPT_AI" | grep -q -v "If all of these points are met, we give a Green label." && echo 'βœ… Test user does not see AI overview' || exit 1 + echo "::endgroup::" + + echo "::group::Check german prompt with test user" + OUT_TEST_GERMAN_PROMPT_AI=$(./occ context_chat:prompt test "Welche Faktoren beeinflussen das Ethical AI Rating?") echo "$OUT_TEST_GERMAN_PROMPT_AI" - echo "OUT_TEST_SEARCH_AI" + echo "$OUT_TEST_GERMAN_PROMPT_AI" | grep -q -v "If all of these points are met, we give a Green label." && echo 'βœ… Test user does not see AI overview, after german question' || exit 1 + echo "::endgroup::" + + echo "::group::Check german search with test user" + OUT_TEST_SEARCH_AI=$(./occ context_chat:search test "Welche Faktoren beeinflussen das Ethical AI Rating?") echo "$OUT_TEST_SEARCH_AI" - echo "OUT_TEST_PROMPT_JOBS" + echo "$OUT_TEST_SEARCH_AI" | grep -q -v "overview.rst" && echo 'βœ… Test user does not see AI overview, when using search' || exit 1 + echo "::endgroup::" + + + echo "Check for user test: Shouldn't be there, because it was not shared yet" # --------------- + + echo "::group::Check english prompt with test user" + OUT_TEST_PROMPT_JOBS=$(./occ context_chat:prompt test "How do I set my TimedJob to be time insensitive?") echo "$OUT_TEST_PROMPT_JOBS" - echo "OUT_TEST_SEARCH_JOBS" - echo "$OUT_TEST_SEARCH_JOBS" + echo "$OUT_TEST_PROMPT_JOBS" | grep -q -v "background jobs" && echo 'βœ… Test user does not see BackgroundJobs docs' || exit 1 + echo "::endgroup::" - echo "$OUT_ADMIN_ENGLISH_PROMPT_AI" | grep -q "If all of these points are met, we give a Green label." && echo 'βœ… Admin does see AI overview' || exit 1 - echo "$OUT_ADMIN_GERMAN_PROMPT_AI" | grep -q "If all of these points are met, we give a Green label." && echo 'βœ… Admin does see AI overview, after german question' || exit 1 - echo "$OUT_ADMIN_SEARCH_AI" | grep -q "overview.rst" && echo 'βœ… Admin does see AI overview, when using search' || exit 1 - echo "$OUT_TEST_ENGLISH_PROMPT_AI" | grep -q -v "If all of these points are met, we give a Green label." && echo 'βœ… Test user does not see AI overview' || exit 1 - echo "$OUT_TEST_GERMAN_PROMPT_AI" | grep -q -v "If all of these points are met, we give a Green label." && echo 'βœ…Test user does not see AI overview, after german question' || exit 1 - echo "$OUT_TEST_SEARCH_AI" | grep -q -v "overview.rst" && echo 'βœ…Test user does not see AI overview, when using search' || exit 1 - echo "$OUT_TEST_PROMPT_JOBS" | grep -q -v "background jobs" && echo 'βœ…Test user does not see BackgroundJobs docs' || exit 1 - echo "$OUT_TEST_SEARCH_JOBS" | grep -q -v "backgroundjobs.md" && echo 'βœ…Test user does not see BackgroundJobs docs' || exit 1 + echo "::group::Check english prompt with test user" + OUT_TEST_SEARCH_JOBS=$(./occ context_chat:search test "How do I set my TimedJob to be time insensitive?") + echo "$OUT_TEST_SEARCH_JOBS" + echo "$OUT_TEST_SEARCH_JOBS" | grep -q -v "backgroundjobs.md" && echo 'βœ… Test user does not see BackgroundJobs docs' || exit 1 + echo "::endgroup::" kill -9 $WORKER1_PID kill -9 $WORKER2_PID @@ -407,48 +423,63 @@ jobs: WORKER1_PID=$! ./occ background-job:worker -v 'OC\TaskProcessing\SynchronousBackgroundJob' & WORKER2_PID=$! - set +e - # Check for user admin: Shouldn't be there + echo "Check for user admin: Shouldn't be there" # --------------- + + echo "::group::Check english prompt with admin user" OUT_ADMIN_ENGLISH_PROMPT_AI=$(./occ context_chat:prompt admin "Which factors are taken into account for the Ethical AI Rating?") + echo "$OUT_ADMIN_ENGLISH_PROMPT_AI" + echo "$OUT_ADMIN_ENGLISH_PROMPT_AI" | grep -q -v "If all of these points are met, we give a Green label." && echo 'βœ… Admin does not see AI overview anymore' || exit 1 + echo "::endgroup::" + + echo "::group::Check german prompt with admin user" OUT_ADMIN_GERMAN_PROMPT_AI=$(./occ context_chat:prompt admin "Welche Faktoren beeinflussen das Ethical AI Rating?") + echo "$OUT_ADMIN_GERMAN_PROMPT_AI" + echo "$OUT_ADMIN_GERMAN_PROMPT_AI" | grep -q -v "If all of these points are met, we give a Green label." && echo 'βœ… Admin does not see AI overview anymore, after german question' || exit 1 + echo "::endgroup::" + + echo "::group::Check german search with admin user" OUT_ADMIN_SEARCH_AI=$(./occ context_chat:search admin "Welche Faktoren beeinflussen das Ethical AI Rating?") + echo "$OUT_ADMIN_SEARCH_AI" + echo "$OUT_ADMIN_SEARCH_AI" | grep -q -v "overview.rst" && echo 'βœ… Admin does not see AI overview anymore, when using search' || exit 1 + echo "::endgroup::" - # Check for user test: Shouldn't be there - OUT_TEST_ENGLISH_PROMPT_AI=$(./occ context_chat:prompt test "Which factors are taken into account for the Ethical AI Rating?") - OUT_TEST_GERMAN_PROMPT_AI=$(./occ context_chat:prompt test "Welche Faktoren beeinflussen das Ethical AI Rating?") - OUT_TEST_SEARCH_AI=$(./occ context_chat:search test "Welche Faktoren beeinflussen das Ethical AI Rating?") - # Check for user test: Should be there, because it was shared - OUT_TEST_PROMPT_JOBS=$(./occ context_chat:prompt test "How do I set my TimedJob to be time insensitive?") - OUT_TEST_SEARCH_JOBS=$(./occ context_chat:search test "How do I set my TimedJob to be time insensitive?") + echo "Check for user test: Shouldn't be there" # --------------- - echo "OUT_ADMIN_ENGLISH_PROMPT_AI" - echo "$OUT_ADMIN_ENGLISH_PROMPT_AI" - echo "OUT_ADMIN_GERMAN_PROMPT_AI" - echo "$OUT_ADMIN_GERMAN_PROMPT_AI" - echo "OUT_ADMIN_SEARCH_AI" - echo "$OUT_ADMIN_SEARCH_AI" - echo "OUT_TEST_ENGLISH_PROMPT_AI" + echo "::group::Check english prompt with test user" + OUT_TEST_ENGLISH_PROMPT_AI=$(./occ context_chat:prompt test "Which factors are taken into account for the Ethical AI Rating?") echo "$OUT_TEST_ENGLISH_PROMPT_AI" - echo "OUT_TEST_GERMAN_PROMPT_AI" + echo "$OUT_TEST_ENGLISH_PROMPT_AI" | grep -q -v "If all of these points are met, we give a Green label." && echo 'βœ… Test user does not see AI overview' || exit 1 + echo "::endgroup::" + + echo "::group::Check german prompt with test user" + OUT_TEST_GERMAN_PROMPT_AI=$(./occ context_chat:prompt test "Welche Faktoren beeinflussen das Ethical AI Rating?") echo "$OUT_TEST_GERMAN_PROMPT_AI" - echo "OUT_TEST_SEARCH_AI" + echo "$OUT_TEST_GERMAN_PROMPT_AI" | grep -q -v "If all of these points are met, we give a Green label." && echo 'βœ… Test user does not see AI overview, after german question' || exit 1 + echo "::endgroup::" + + echo "::group::Check german search with test user" + OUT_TEST_SEARCH_AI=$(./occ context_chat:search test "Welche Faktoren beeinflussen das Ethical AI Rating?") echo "$OUT_TEST_SEARCH_AI" - echo "OUT_TEST_PROMPT_JOBS" + echo "$OUT_TEST_SEARCH_AI" | grep -q -v "overview.rst" && echo 'βœ… Test user does not see AI overview, when using search' || exit 1 + echo "::endgroup::" + + + echo "Check for user test: Should be there, because it was shared" # --------------- + + echo "::group::Check english prompt with test user" + OUT_TEST_PROMPT_JOBS=$(./occ context_chat:prompt test "How do I set my TimedJob to be time insensitive?") echo "$OUT_TEST_PROMPT_JOBS" - echo "OUT_TEST_SEARCH_JOBS" - echo "$OUT_TEST_SEARCH_JOBS" + echo "$OUT_TEST_PROMPT_JOBS" | grep -q "background jobs" && echo 'βœ… Test user does see BackgroundJobs docs' || exit 1 + echo "::endgroup::" - echo "$OUT_ADMIN_ENGLISH_PROMPT_AI" | grep -q -v "If all of these points are met, we give a Green label." && echo 'βœ… Admin does not see AI overview anymore' || exit 1 - echo "$OUT_ADMIN_GERMAN_PROMPT_AI" | grep -q -v "If all of these points are met, we give a Green label." && echo 'βœ… Admin does not see AI overview anymore, after german question' || exit 1 - echo "$OUT_ADMIN_SEARCH_AI" | grep -q -v "overview.rst" && echo 'βœ… Admin does not see AI overview anymore, when using search' || exit 1 - echo "$OUT_TEST_ENGLISH_PROMPT_AI" | grep -q -v "If all of these points are met, we give a Green label." && echo 'βœ… Test user does not see AI overview' || exit 1 - echo "$OUT_TEST_GERMAN_PROMPT_AI" | grep -q -v "If all of these points are met, we give a Green label." && echo 'βœ…Test user does not see AI overview, after german question' || exit 1 - echo "$OUT_TEST_SEARCH_AI" | grep -q -v "overview.rst" && echo 'βœ…Test user does not see AI overview, when using search' || exit 1 - echo "$OUT_TEST_PROMPT_JOBS" | grep -q "background jobs" && echo 'βœ…Test user does see BackgroundJobs docs' || exit 1 - echo "$OUT_TEST_SEARCH_JOBS" | grep -q "backgroundjobs.md" && echo 'βœ…Test user does see BackgroundJobs docs' || exit 1 + echo "::group::Check english search with test user" + OUT_TEST_SEARCH_JOBS=$(./occ context_chat:search test "How do I set my TimedJob to be time insensitive?") + echo "$OUT_TEST_SEARCH_JOBS" + echo "$OUT_TEST_SEARCH_JOBS" | grep -q "backgroundjobs.md" && echo 'βœ… Test user does see BackgroundJobs docs' || exit 1 + echo "::endgroup::" kill -9 $WORKER1_PID kill -9 $WORKER2_PID