From 163f5cd1b4e6cf3a6117f150ce79f79365af7106 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 28 Apr 2026 16:24:55 +0800 Subject: [PATCH 01/28] ci:update last version and delete cppcheck.yml and improved codeql.yml --- .github/workflows/Alma_build.yml | 8 +++---- .github/workflows/Centos_build.yml | 8 +++---- .github/workflows/Rocky_build.yml | 8 +++---- .github/workflows/Ubuntu_build.yml | 12 +++++----- .github/workflows/codeql.yml | 28 +++--------------------- .github/workflows/cppcheck.yml | 35 ------------------------------ .github/workflows/debian_build.yml | 8 +++---- .github/workflows/fedora_build.yml | 12 ++++++---- .github/workflows/macbuild.yml | 11 ++++------ .github/workflows/msbuild.yml | 12 +++++----- .github/workflows/release.yml | 20 ++++++++--------- 11 files changed, 53 insertions(+), 109 deletions(-) delete mode 100644 .github/workflows/cppcheck.yml diff --git a/.github/workflows/Alma_build.yml b/.github/workflows/Alma_build.yml index 9f5458f..1ed1005 100644 --- a/.github/workflows/Alma_build.yml +++ b/.github/workflows/Alma_build.yml @@ -44,16 +44,16 @@ jobs: steps: - name: Checkout main repository code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Checkout dependency repository (xengine) - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: repository: libxengine/libxengine path: libxengine - name: sub module checkout (opensource) - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: repository: libxengine/XEngine_OPenSource path: XEngine_Source/XEngine_DependLibrary @@ -89,7 +89,7 @@ jobs: ./XEngine_ProxyServiceApp -t - name: Upload folder as artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: XEngine_ProxyServiceApp-AlmaLinux_${{ matrix.version }}_${{ matrix.artifact }} path: XEngine_Release/ \ No newline at end of file diff --git a/.github/workflows/Centos_build.yml b/.github/workflows/Centos_build.yml index 5465efa..f73efbc 100644 --- a/.github/workflows/Centos_build.yml +++ b/.github/workflows/Centos_build.yml @@ -48,16 +48,16 @@ jobs: steps: - name: Checkout main repository code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Checkout dependency repository (xengine) - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: repository: libxengine/libxengine path: libxengine - name: sub module checkout (opensource) - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: repository: libxengine/XEngine_OPenSource path: XEngine_Source/XEngine_DependLibrary @@ -95,7 +95,7 @@ jobs: ./XEngine_ProxyServiceApp -t - name: Upload folder as artifact with CentOS - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: XEngine_ProxyServiceApp-CentOS_${{ matrix.version }}_${{ matrix.artifact }} path: XEngine_Release/ diff --git a/.github/workflows/Rocky_build.yml b/.github/workflows/Rocky_build.yml index 5df3623..bf48536 100644 --- a/.github/workflows/Rocky_build.yml +++ b/.github/workflows/Rocky_build.yml @@ -44,18 +44,18 @@ jobs: steps: - name: Checkout main repository code - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: ref: 'develop' - name: Checkout dependency repository (xengine) - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: repository: libxengine/libxengine path: libxengine - name: sub module checkout (opensource) - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: repository: libxengine/XEngine_OPenSource path: XEngine_Source/XEngine_DependLibrary @@ -93,7 +93,7 @@ jobs: ./XEngine_ProxyServiceApp -t - name: Upload folder as artifact with RockyLinux - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: XEngine_ProxyServiceApp-RockyLinux_${{ matrix.version }}_${{ matrix.artifact }} path: XEngine_Release/ diff --git a/.github/workflows/Ubuntu_build.yml b/.github/workflows/Ubuntu_build.yml index 8a702ac..bda501d 100644 --- a/.github/workflows/Ubuntu_build.yml +++ b/.github/workflows/Ubuntu_build.yml @@ -23,12 +23,12 @@ jobs: steps: - name: Checkout main repository code - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: ref: 'develop' - name: Checkout dependency repository (xengine) - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: repository: libxengine/libxengine path: libxengine @@ -95,28 +95,28 @@ jobs: - name: Upload folder as artifact with ubuntu22.04 x86-64 if: matrix.os == 'ubuntu-22.04' - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: XEngine_ProxyServiceApp-Ubuntu_22.04_x86_64 path: XEngine_Release/ retention-days: 1 - name: Upload folder as artifact with ubuntu24.04 x86-64 if: matrix.os == 'ubuntu-24.04' - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: XEngine_ProxyServiceApp-Ubuntu_24.04_x86_64 path: XEngine_Release/ retention-days: 1 - name: Upload folder as artifact with ubuntu22.04 Arm64 if: matrix.os == 'ubuntu-22.04-arm' - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: XEngine_ProxyServiceApp-Ubuntu_22.04_Arm64 path: XEngine_Release/ retention-days: 1 - name: Upload folder as artifact with ubuntu24.04 Arm64 if: matrix.os == 'ubuntu-24.04-arm' - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: XEngine_ProxyServiceApp-Ubuntu_24.04_Arm64 path: XEngine_Release/ diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 75bb2a8..9114715 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -25,41 +25,19 @@ jobs: - language: c-cpp steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: ref: 'develop' - - - name: Checkout dependency repository (xengine) - uses: actions/checkout@v4 - with: - repository: libxengine/libxengine - path: libxengine - - - name: sub module checkout (opensource) - run: | - git submodule init - git submodule update - name: Set TERM variable run: echo "TERM=xterm" >> $GITHUB_ENV - - name: Set up Dependency Environment - run: | - cd libxengine - chmod +x ./XEngine_LINEnv.sh - sudo ./XEngine_LINEnv.sh -i 3 - - name: Initialize CodeQL - uses: github/codeql-action/init@v3 + uses: github/codeql-action/init@v4 with: languages: ${{ matrix.language }} - - - name: make - run: | - cd XEngine_Source - make - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v3 + uses: github/codeql-action/analyze@v4 with: category: "/language:${{ matrix.language }}" diff --git a/.github/workflows/cppcheck.yml b/.github/workflows/cppcheck.yml deleted file mode 100644 index 279b03f..0000000 --- a/.github/workflows/cppcheck.yml +++ /dev/null @@ -1,35 +0,0 @@ -name: cpp check workflows - -on: - push: - branches: - - 'develop' - paths: - - 'XEngine_Source/**' - - 'XEngine_Release/**' - - '.github/**' - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - name: Checkout main repository code - uses: actions/checkout@v4 - with: - ref: 'develop' - - - name: Create static_analysis directory - run: mkdir -p static_analysis - - - name: Run Cppcheck - run: | - sudo apt-get install -y cppcheck - cppcheck --enable=all --language=c++ --std=c++20 ./XEngine_Source/ --output-file=static_analysis/log.xml --xml - continue-on-error: true - - - name: Upload Cppcheck Results - uses: actions/upload-artifact@v4 - with: - name: cppcheck_results - path: static_analysis/log.xml \ No newline at end of file diff --git a/.github/workflows/debian_build.yml b/.github/workflows/debian_build.yml index 2e8d342..be7e82b 100644 --- a/.github/workflows/debian_build.yml +++ b/.github/workflows/debian_build.yml @@ -36,18 +36,18 @@ jobs: steps: - name: Checkout main repository code - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: ref: 'develop' - name: Checkout dependency repository (xengine) - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: repository: libxengine/libxengine path: libxengine - name: sub module checkout (opensource) - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: repository: libxengine/XEngine_OPenSource path: XEngine_Source/XEngine_DependLibrary @@ -86,7 +86,7 @@ jobs: ./XEngine_ProxyServiceApp -t - name: Upload folder as artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: XEngine_ProxyServiceApp-Debian_${{ matrix.version }}_x86-64 path: XEngine_Release/ diff --git a/.github/workflows/fedora_build.yml b/.github/workflows/fedora_build.yml index 6c1a12e..eb5a82c 100644 --- a/.github/workflows/fedora_build.yml +++ b/.github/workflows/fedora_build.yml @@ -21,6 +21,10 @@ jobs: strategy: matrix: include: + - arch: amd64 + runner: ubuntu-24.04 + platform: linux/amd64 + fedora-version: 43 - arch: amd64 runner: ubuntu-24.04 platform: linux/amd64 @@ -34,16 +38,16 @@ jobs: steps: - name: Checkout main repository code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Checkout dependency repository (xengine) - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: repository: libxengine/libxengine path: libxengine - name: sub module checkout (opensource) - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: repository: libxengine/XEngine_OPenSource path: XEngine_Source/XEngine_DependLibrary @@ -82,7 +86,7 @@ jobs: ./XEngine_ProxyServiceApp -t - name: Upload folder as artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: XEngine_ProxyServiceApp-Fedora_${{ matrix.fedora-version }}_${{ matrix.artifact }} path: XEngine_Release/ diff --git a/.github/workflows/macbuild.yml b/.github/workflows/macbuild.yml index c6041dd..1e03cbf 100644 --- a/.github/workflows/macbuild.yml +++ b/.github/workflows/macbuild.yml @@ -20,13 +20,13 @@ jobs: steps: - name: Checkout main repository code - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: ref: 'develop' # 检出依赖的xengine仓库到指定的xengine目录 - name: Checkout dependency repository (xengine) - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: repository: libxengine/libxengine path: libxengine @@ -38,9 +38,6 @@ jobs: - name: Set TERM variable run: echo "TERM=xterm" >> $GITHUB_ENV - - - name: brew install - run: /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" - name: Set up Dependency x86_64 Environment if: matrix.os == 'macos-15-intel' @@ -77,14 +74,14 @@ jobs: - name: Upload folder as artifact with mac x64 if: matrix.os == 'macos-15-intel' - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: XEngine_ProxyServiceApp-Mac_x86_64 path: XEngine_Release/ retention-days: 1 - name: Upload folder as artifact with mac arm if: matrix.os == 'macos-15' - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: XEngine_ProxyServiceApp-Mac_Arm64 path: XEngine_Release/ diff --git a/.github/workflows/msbuild.yml b/.github/workflows/msbuild.yml index ea41e76..b29ff69 100644 --- a/.github/workflows/msbuild.yml +++ b/.github/workflows/msbuild.yml @@ -22,13 +22,13 @@ jobs: steps: # 检出您的主仓库代码 - name: Checkout main repository code - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: ref: 'develop' # 检出依赖的xengine仓库到指定的xengine目录 - name: Checkout dependency repository (xengine) - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: repository: libxengine/libxengine path: libxengine @@ -75,7 +75,7 @@ jobs: shell: pwsh - name: Setup MSBuild - uses: microsoft/setup-msbuild@v2 + uses: microsoft/setup-msbuild@v3 - name: Build Solution run: msbuild XEngine_Source/XEngine.sln /p:Configuration=${{ matrix.configuration }} /p:Platform=${{ matrix.platform }} @@ -112,21 +112,21 @@ jobs: - name: Upload folder as artifact with x86 if: matrix.configuration == 'Release' && matrix.platform == 'x64' - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: XEngine_ProxyServiceApp-Windows_x86_32 path: XEngine_Release/ retention-days: 1 - name: Upload folder as artifact with x64 if: matrix.configuration == 'Release' && matrix.platform == 'x64' - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: XEngine_ProxyServiceApp-Windows_x86_64 path: XEngine_Release/ retention-days: 1 - name: Upload folder as artifact with ARM64 if: matrix.configuration == 'Release' && matrix.platform == 'ARM64' - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: XEngine_ProxyServiceApp-Windows_ARM64 path: XEngine_Release/ diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9bf137f..b2d9b68 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -12,12 +12,12 @@ jobs: steps: # 检出代码并包含标签 - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: fetch-depth: 0 - name: Download ubuntu build - uses: dawidd6/action-download-artifact@v6 + uses: dawidd6/action-download-artifact@v20 with: workflow: Ubuntu_build.yml workflow_conclusion: success @@ -26,7 +26,7 @@ jobs: if_no_artifact_found: fail path: ./XRelease/ - name: Download fedora build - uses: dawidd6/action-download-artifact@v6 + uses: dawidd6/action-download-artifact@v20 with: workflow: fedora_build.yml workflow_conclusion: success @@ -35,7 +35,7 @@ jobs: if_no_artifact_found: fail path: ./XRelease/ - name: Download debian build - uses: dawidd6/action-download-artifact@v6 + uses: dawidd6/action-download-artifact@v20 with: workflow: debian_build.yml workflow_conclusion: success @@ -44,7 +44,7 @@ jobs: if_no_artifact_found: fail path: ./XRelease/ - name: Download Alma - uses: dawidd6/action-download-artifact@v6 + uses: dawidd6/action-download-artifact@v20 with: workflow: Alma_build.yml workflow_conclusion: success @@ -53,7 +53,7 @@ jobs: if_no_artifact_found: fail path: ./XRelease/ - name: Download Centos - uses: dawidd6/action-download-artifact@v6 + uses: dawidd6/action-download-artifact@v20 with: workflow: Centos_build.yml workflow_conclusion: success @@ -62,7 +62,7 @@ jobs: if_no_artifact_found: fail path: ./XRelease/ - name: Download Rockylinux - uses: dawidd6/action-download-artifact@v6 + uses: dawidd6/action-download-artifact@v20 with: workflow: Rocky_build.yml workflow_conclusion: success @@ -71,7 +71,7 @@ jobs: if_no_artifact_found: fail path: ./XRelease/ - name: Download macbuild - uses: dawidd6/action-download-artifact@v6 + uses: dawidd6/action-download-artifact@v20 with: workflow: macbuild.yml workflow_conclusion: success @@ -80,7 +80,7 @@ jobs: if_no_artifact_found: fail path: ./XRelease/ - name: Download msbuild - uses: dawidd6/action-download-artifact@v6 + uses: dawidd6/action-download-artifact@v20 with: workflow: msbuild.yml workflow_conclusion: success @@ -123,7 +123,7 @@ jobs: echo "$release_notes" > release_notes.txt - name: Release - uses: softprops/action-gh-release@v2 + uses: softprops/action-gh-release@v3 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: From 0cba9f77b3a76b953c7cdf0b0da67469daa01686 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 28 Apr 2026 16:25:25 +0800 Subject: [PATCH 02/28] update:depend library --- XEngine_Source/XEngine_DependLibrary | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/XEngine_Source/XEngine_DependLibrary b/XEngine_Source/XEngine_DependLibrary index adf48e2..fa19ea8 160000 --- a/XEngine_Source/XEngine_DependLibrary +++ b/XEngine_Source/XEngine_DependLibrary @@ -1 +1 @@ -Subproject commit adf48e22d68f741ec52f299945f8f8f8fb3df9d2 +Subproject commit fa19ea8880dfa312221b5d17ece40c3bbc0f00cf From 9b27c63acd9f9d9911b4cbdf51b5cba53cbfce01 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 28 Apr 2026 16:55:03 +0800 Subject: [PATCH 03/28] ci:enable build support for codeql.yml --- .github/workflows/codeql.yml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 9114715..603dd33 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -28,14 +28,36 @@ jobs: uses: actions/checkout@v6 with: ref: 'develop' + + - name: Checkout dependency repository (xengine) + uses: actions/checkout@v6 + with: + repository: libxengine/libxengine + path: libxengine + + - name: sub module checkout (opensource) + run: | + git submodule init + git submodule update - name: Set TERM variable run: echo "TERM=xterm" >> $GITHUB_ENV + - name: Set up Dependency Environment + run: | + cd libxengine + chmod +x ./XEngine_LINEnv.sh + sudo ./XEngine_LINEnv.sh -i 3 + - name: Initialize CodeQL uses: github/codeql-action/init@v4 with: languages: ${{ matrix.language }} + + - name: make + run: | + cd XEngine_Source + make - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@v4 From f3e0e98d61e4e92f81324b8a4acb538f6b7e0c0c Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 28 Apr 2026 17:38:43 +0800 Subject: [PATCH 04/28] update:codeql.yml and fedora_build.yml --- .github/workflows/codeql.yml | 2 ++ .github/workflows/fedora_build.yml | 1 + 2 files changed, 3 insertions(+) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 603dd33..2a851db 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -53,6 +53,8 @@ jobs: uses: github/codeql-action/init@v4 with: languages: ${{ matrix.language }} + build-mode: manual + queries: security-and-quality - name: make run: | diff --git a/.github/workflows/fedora_build.yml b/.github/workflows/fedora_build.yml index eb5a82c..2d20d0f 100644 --- a/.github/workflows/fedora_build.yml +++ b/.github/workflows/fedora_build.yml @@ -25,6 +25,7 @@ jobs: runner: ubuntu-24.04 platform: linux/amd64 fedora-version: 43 + artifact: x86-64 - arch: amd64 runner: ubuntu-24.04 platform: linux/amd64 From bc507e34036d2dd910f6755b7240251c26fb09ab Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 28 Apr 2026 17:44:29 +0800 Subject: [PATCH 05/28] ci:reset codeql --- .github/workflows/codeql.yml | 67 ------------------------------------ 1 file changed, 67 deletions(-) delete mode 100644 .github/workflows/codeql.yml diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml deleted file mode 100644 index 2a851db..0000000 --- a/.github/workflows/codeql.yml +++ /dev/null @@ -1,67 +0,0 @@ -name: CodeQL Advanced - -on: - push: - branches: - - 'develop' - paths: - - 'XEngine_Source/**' - - 'XEngine_Release/**' - - '.github/**' - -jobs: - analyze: - runs-on: ubuntu-24.04 - permissions: - security-events: write - packages: read - actions: read - contents: read - - strategy: - fail-fast: false - matrix: - include: - - language: c-cpp - steps: - - name: Checkout repository - uses: actions/checkout@v6 - with: - ref: 'develop' - - - name: Checkout dependency repository (xengine) - uses: actions/checkout@v6 - with: - repository: libxengine/libxengine - path: libxengine - - - name: sub module checkout (opensource) - run: | - git submodule init - git submodule update - - - name: Set TERM variable - run: echo "TERM=xterm" >> $GITHUB_ENV - - - name: Set up Dependency Environment - run: | - cd libxengine - chmod +x ./XEngine_LINEnv.sh - sudo ./XEngine_LINEnv.sh -i 3 - - - name: Initialize CodeQL - uses: github/codeql-action/init@v4 - with: - languages: ${{ matrix.language }} - build-mode: manual - queries: security-and-quality - - - name: make - run: | - cd XEngine_Source - make - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v4 - with: - category: "/language:${{ matrix.language }}" From 0e60c1dac0a69ed49c020c409961904ff69b7a03 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 28 Apr 2026 17:45:25 +0800 Subject: [PATCH 06/28] Update CodeQL workflow configuration --- .github/workflows/codeql.yml | 67 ++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 .github/workflows/codeql.yml diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 0000000..2a851db --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,67 @@ +name: CodeQL Advanced + +on: + push: + branches: + - 'develop' + paths: + - 'XEngine_Source/**' + - 'XEngine_Release/**' + - '.github/**' + +jobs: + analyze: + runs-on: ubuntu-24.04 + permissions: + security-events: write + packages: read + actions: read + contents: read + + strategy: + fail-fast: false + matrix: + include: + - language: c-cpp + steps: + - name: Checkout repository + uses: actions/checkout@v6 + with: + ref: 'develop' + + - name: Checkout dependency repository (xengine) + uses: actions/checkout@v6 + with: + repository: libxengine/libxengine + path: libxengine + + - name: sub module checkout (opensource) + run: | + git submodule init + git submodule update + + - name: Set TERM variable + run: echo "TERM=xterm" >> $GITHUB_ENV + + - name: Set up Dependency Environment + run: | + cd libxengine + chmod +x ./XEngine_LINEnv.sh + sudo ./XEngine_LINEnv.sh -i 3 + + - name: Initialize CodeQL + uses: github/codeql-action/init@v4 + with: + languages: ${{ matrix.language }} + build-mode: manual + queries: security-and-quality + + - name: make + run: | + cd XEngine_Source + make + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v4 + with: + category: "/language:${{ matrix.language }}" From 34902865d536b5fd12242969724e835f5d800a3c Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Wed, 29 Apr 2026 16:34:11 +0800 Subject: [PATCH 07/28] Potential fix for code scanning alert no. 63: Incorrect allocation-error handling Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> --- .../ModuleSession_Tunnel/ModuleSession_Tunnel.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/XEngine_Source/XEngine_ModuleSession/ModuleSession_Tunnel/ModuleSession_Tunnel.cpp b/XEngine_Source/XEngine_ModuleSession/ModuleSession_Tunnel/ModuleSession_Tunnel.cpp index 5f6d239..efa42ea 100644 --- a/XEngine_Source/XEngine_ModuleSession/ModuleSession_Tunnel/ModuleSession_Tunnel.cpp +++ b/XEngine_Source/XEngine_ModuleSession/ModuleSession_Tunnel/ModuleSession_Tunnel.cpp @@ -1,5 +1,6 @@ #include "pch.h" #include "ModuleSession_Tunnel.h" +#include /******************************************************************** // Created: 2024/09/06 16:29:12 // File Name: D:\XEngine_ProxyServer\XEngine_Source\XEngine_ModuleSession\ModuleSession_Tunnel\ModuleSession_Tunnel.cpp @@ -44,7 +45,7 @@ bool CModuleSession_Tunnel::ModuleSession_Tunnel_Create(LPCXSTR lpszClientID) return false; } - PROXYTUNNEL_CLIENTINFO* pSt_TunnelInfo = new PROXYTUNNEL_CLIENTINFO; + PROXYTUNNEL_CLIENTINFO* pSt_TunnelInfo = new (std::nothrow) PROXYTUNNEL_CLIENTINFO; if (NULL == pSt_TunnelInfo) { Session_IsErrorOccur = true; @@ -53,7 +54,7 @@ bool CModuleSession_Tunnel::ModuleSession_Tunnel_Create(LPCXSTR lpszClientID) } memset(pSt_TunnelInfo, '\0', sizeof(PROXYTUNNEL_CLIENTINFO)); - pSt_TunnelInfo->pStl_ListField = new list; + pSt_TunnelInfo->pStl_ListField = new (std::nothrow) list; if (NULL == pSt_TunnelInfo->pStl_ListField) { Session_IsErrorOccur = true; From 95df89b0f97af59e65f6e67778fdd2ba59b8b6b9 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Wed, 29 Apr 2026 17:00:35 +0800 Subject: [PATCH 08/28] Potential fix for code scanning alert no. 62: Incorrect allocation-error handling Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> --- .../ModuleSession_Socks/ModuleSession_Socks.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/XEngine_Source/XEngine_ModuleSession/ModuleSession_Socks/ModuleSession_Socks.cpp b/XEngine_Source/XEngine_ModuleSession/ModuleSession_Socks/ModuleSession_Socks.cpp index 76af6f3..39b8072 100644 --- a/XEngine_Source/XEngine_ModuleSession/ModuleSession_Socks/ModuleSession_Socks.cpp +++ b/XEngine_Source/XEngine_ModuleSession/ModuleSession_Socks/ModuleSession_Socks.cpp @@ -1,5 +1,6 @@ #include "pch.h" #include "ModuleSession_Socks.h" +#include /******************************************************************** // Created: 2024/09/06 13:48:58 // File Name: D:\XEngine_ProxyServer\XEngine_Source\XEngine_ModuleSession\ModuleSession_Socks\ModuleSession_Socks.cpp @@ -43,7 +44,7 @@ bool CModuleSession_Socks::ModuleSession_Socks_Create(LPCXSTR lpszClientID) Session_dwErrorCode = ERROR_MODULE_SESSION_SOCKS_PARAMENT; return false; } - RFCPROTOCOL_SOCKS5CLIENT* pSt_SocksClinet = new RFCPROTOCOL_SOCKS5CLIENT; + RFCPROTOCOL_SOCKS5CLIENT* pSt_SocksClinet = new (std::nothrow) RFCPROTOCOL_SOCKS5CLIENT; if (NULL == pSt_SocksClinet) { Session_IsErrorOccur = true; From 161b31d9af344d1ea07e9160320de0666f6ce329 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Sat, 9 May 2026 11:37:47 +0800 Subject: [PATCH 09/28] feat: add agentic workflows for issue triage and auto fix --- .github/workflows/auto-code.lock.yml | 1179 +++++++++++++++++++++++ .github/workflows/auto-code.md | 88 ++ .github/workflows/issue-translator.yml | 15 - .github/workflows/issue-triage.lock.yml | 1097 +++++++++++++++++++++ .github/workflows/issue-triage.md | 68 ++ 5 files changed, 2432 insertions(+), 15 deletions(-) create mode 100644 .github/workflows/auto-code.lock.yml create mode 100644 .github/workflows/auto-code.md delete mode 100644 .github/workflows/issue-translator.yml create mode 100644 .github/workflows/issue-triage.lock.yml create mode 100644 .github/workflows/issue-triage.md diff --git a/.github/workflows/auto-code.lock.yml b/.github/workflows/auto-code.lock.yml new file mode 100644 index 0000000..919efe7 --- /dev/null +++ b/.github/workflows/auto-code.lock.yml @@ -0,0 +1,1179 @@ +# gh-aw-metadata: {"schema_version":"v3","frontmatter_hash":"158e10df0b3421742ed672f7a5667899e0977be63eed6a6fa996ccb9de250211","compiler_version":"v0.71.5","agent_id":"copilot"} +# gh-aw-manifest: {"version":1,"secrets":["COPILOT_GITHUB_TOKEN","GH_AW_CI_TRIGGER_TOKEN","GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GITHUB_TOKEN","OPENAI_API_KEY"],"actions":[{"repo":"actions/checkout","sha":"de0fac2e4500dabe0009e67214ff5f5447ce83dd","version":"v6.0.2"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"},{"repo":"github/gh-aw-actions/setup","sha":"b8068426813005612b960b5ab0b8bd2c27142323","version":"v0.71.5"}],"containers":[{"image":"ghcr.io/github/github-mcp-server:v1.0.3","digest":"sha256:2ac27ef03461ef2b877031b838a7d1fd7f12b12d4ace7796d8cad91446d55959","pinned_image":"ghcr.io/github/github-mcp-server:v1.0.3@sha256:2ac27ef03461ef2b877031b838a7d1fd7f12b12d4ace7796d8cad91446d55959"},{"image":"node:lts-alpine","digest":"sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f","pinned_image":"node:lts-alpine@sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f"}]} +# ___ _ _ +# / _ \ | | (_) +# | |_| | __ _ ___ _ __ | |_ _ ___ +# | _ |/ _` |/ _ \ '_ \| __| |/ __| +# | | | | (_| | __/ | | | |_| | (__ +# \_| |_/\__, |\___|_| |_|\__|_|\___| +# __/ | +# _ _ |___/ +# | | | | / _| | +# | | | | ___ _ __ _ __| |_| | _____ ____ +# | |/\| |/ _ \ '__| |/ /| _| |/ _ \ \ /\ / / ___| +# \ /\ / (_) | | | | ( | | | | (_) \ V V /\__ \ +# \/ \/ \___/|_| |_|\_\|_| |_|\___/ \_/\_/ |___/ +# +# This file was automatically generated by gh-aw (v0.71.5). DO NOT EDIT. +# +# To update this file, edit the corresponding .md file and run: +# gh aw compile +# Not all edits will cause changes to this file. +# +# For more information: https://github.github.com/gh-aw/introduction/overview/ +# +# +# Secrets used: +# - COPILOT_GITHUB_TOKEN +# - GH_AW_CI_TRIGGER_TOKEN +# - GH_AW_GITHUB_MCP_SERVER_TOKEN +# - GH_AW_GITHUB_TOKEN +# - GITHUB_TOKEN +# - OPENAI_API_KEY +# +# Custom actions used: +# - actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 +# - actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 +# - actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 +# - actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 +# - github/gh-aw-actions/setup@b8068426813005612b960b5ab0b8bd2c27142323 # v0.71.5 +# +# Container images used: +# - ghcr.io/github/github-mcp-server:v1.0.3@sha256:2ac27ef03461ef2b877031b838a7d1fd7f12b12d4ace7796d8cad91446d55959 +# - node:lts-alpine@sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f + +name: "自动处理 Issue" +"on": + issues: + types: + - labeled + +permissions: {} + +concurrency: + group: "gh-aw-${{ github.workflow }}-${{ github.event.issue.number || github.run_id }}" + +run-name: "自动处理 Issue" + +jobs: + activation: + needs: pre_activation + if: needs.pre_activation.outputs.activated == 'true' + runs-on: ubuntu-slim + permissions: + actions: read + contents: read + outputs: + body: ${{ steps.sanitized.outputs.body }} + comment_id: "" + comment_repo: "" + engine_id: ${{ steps.generate_aw_info.outputs.engine_id }} + lockdown_check_failed: ${{ steps.generate_aw_info.outputs.lockdown_check_failed == 'true' }} + model: ${{ steps.generate_aw_info.outputs.model }} + setup-trace-id: ${{ steps.setup.outputs.trace-id }} + stale_lock_file_failed: ${{ steps.check-lock-file.outputs.stale_lock_file_failed == 'true' }} + text: ${{ steps.sanitized.outputs.text }} + title: ${{ steps.sanitized.outputs.title }} + steps: + - name: Setup Scripts + id: setup + uses: github/gh-aw-actions/setup@b8068426813005612b960b5ab0b8bd2c27142323 # v0.71.5 + with: + destination: ${{ runner.temp }}/gh-aw/actions + job-name: ${{ github.job }} + trace-id: ${{ needs.pre_activation.outputs.setup-trace-id }} + env: + GH_AW_SETUP_WORKFLOW_NAME: "自动处理 Issue" + GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/auto-code.lock.yml@${{ github.ref }} + GH_AW_INFO_VERSION: "1.0.40" + - name: Generate agentic run info + id: generate_aw_info + env: + GH_AW_INFO_ENGINE_ID: "copilot" + GH_AW_INFO_ENGINE_NAME: "GitHub Copilot CLI" + GH_AW_INFO_MODEL: ${{ vars.GH_AW_MODEL_AGENT_COPILOT || 'claude-sonnet-4.6' }} + GH_AW_INFO_VERSION: "1.0.40" + GH_AW_INFO_AGENT_VERSION: "1.0.40" + GH_AW_INFO_CLI_VERSION: "v0.71.5" + GH_AW_INFO_WORKFLOW_NAME: "自动处理 Issue" + GH_AW_INFO_EXPERIMENTAL: "false" + GH_AW_INFO_SUPPORTS_TOOLS_ALLOWLIST: "true" + GH_AW_INFO_STAGED: "false" + GH_AW_INFO_ALLOWED_DOMAINS: '["defaults","ark.cn-beijing.volces.com"]' + GH_AW_INFO_FIREWALL_ENABLED: "false" + GH_AW_INFO_AWF_VERSION: "" + GH_AW_INFO_AWMG_VERSION: "" + GH_AW_INFO_FIREWALL_TYPE: "" + GH_AW_COMPILED_STRICT: "false" + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/generate_aw_info.cjs'); + await main(core, context); + - name: Checkout .github and .agents folders + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + persist-credentials: false + sparse-checkout: | + .github + .agents + .claude + .codex + .crush + .gemini + .opencode + .pi + sparse-checkout-cone-mode: true + fetch-depth: 1 + - name: Save agent config folders for base branch restoration + env: + GH_AW_AGENT_FOLDERS: ".agents .claude .codex .crush .gemini .github .opencode .pi" + GH_AW_AGENT_FILES: ".crush.json AGENTS.md CLAUDE.md GEMINI.md PI.md opencode.jsonc" + # poutine:ignore untrusted_checkout_exec + run: bash "${RUNNER_TEMP}/gh-aw/actions/save_base_github_folders.sh" + - name: Check workflow lock file + id: check-lock-file + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_WORKFLOW_FILE: "auto-code.lock.yml" + GH_AW_CONTEXT_WORKFLOW_REF: "${{ github.workflow_ref }}" + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/check_workflow_timestamp_api.cjs'); + await main(); + - name: Check compile-agentic version + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_COMPILED_VERSION: "v0.71.5" + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/check_version_updates.cjs'); + await main(); + - name: Compute current body text + id: sanitized + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_ALLOWED_DOMAINS: "api.business.githubcopilot.com,api.enterprise.githubcopilot.com,api.github.com,api.githubcopilot.com,api.individual.githubcopilot.com,api.snapcraft.io,archive.ubuntu.com,ark.cn-beijing.volces.com,azure.archive.ubuntu.com,crl.geotrust.com,crl.globalsign.com,crl.identrust.com,crl.sectigo.com,crl.thawte.com,crl.usertrust.com,crl.verisign.com,crl3.digicert.com,crl4.digicert.com,crls.ssl.com,github.com,host.docker.internal,json-schema.org,json.schemastore.org,keyserver.ubuntu.com,ocsp.digicert.com,ocsp.geotrust.com,ocsp.globalsign.com,ocsp.identrust.com,ocsp.sectigo.com,ocsp.ssl.com,ocsp.thawte.com,ocsp.usertrust.com,ocsp.verisign.com,packagecloud.io,packages.cloud.google.com,packages.microsoft.com,ppa.launchpad.net,raw.githubusercontent.com,registry.npmjs.org,s.symcb.com,s.symcd.com,security.ubuntu.com,telemetry.enterprise.githubcopilot.com,ts-crl.ws.symantec.com,ts-ocsp.ws.symantec.com,www.googleapis.com" + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/compute_text.cjs'); + await main(); + - name: Create prompt with built-in context + env: + GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt + GH_AW_SAFE_OUTPUTS: ${{ runner.temp }}/gh-aw/safeoutputs/outputs.jsonl + GH_AW_GITHUB_ACTOR: ${{ github.actor }} + GH_AW_GITHUB_EVENT_COMMENT_ID: ${{ github.event.comment.id }} + GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER: ${{ github.event.discussion.number }} + GH_AW_GITHUB_EVENT_ISSUE_NUMBER: ${{ github.event.issue.number }} + GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER: ${{ github.event.pull_request.number }} + GH_AW_GITHUB_REPOSITORY: ${{ github.repository }} + GH_AW_GITHUB_RUN_ID: ${{ github.run_id }} + GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }} + # poutine:ignore untrusted_checkout_exec + run: | + bash "${RUNNER_TEMP}/gh-aw/actions/create_prompt_first.sh" + { + cat << 'GH_AW_PROMPT_de410bcdbc8f0b37_EOF' + + GH_AW_PROMPT_de410bcdbc8f0b37_EOF + cat "${RUNNER_TEMP}/gh-aw/prompts/xpia.md" + cat "${RUNNER_TEMP}/gh-aw/prompts/temp_folder_prompt.md" + cat "${RUNNER_TEMP}/gh-aw/prompts/markdown.md" + cat "${RUNNER_TEMP}/gh-aw/prompts/safe_outputs_prompt.md" + cat << 'GH_AW_PROMPT_de410bcdbc8f0b37_EOF' + + Tools: add_comment, create_pull_request, missing_tool, missing_data, noop + GH_AW_PROMPT_de410bcdbc8f0b37_EOF + cat "${RUNNER_TEMP}/gh-aw/prompts/safe_outputs_create_pull_request.md" + cat << 'GH_AW_PROMPT_de410bcdbc8f0b37_EOF' + + GH_AW_PROMPT_de410bcdbc8f0b37_EOF + cat "${RUNNER_TEMP}/gh-aw/prompts/mcp_cli_tools_prompt.md" + cat << 'GH_AW_PROMPT_de410bcdbc8f0b37_EOF' + + The following GitHub context information is available for this workflow: + {{#if __GH_AW_GITHUB_ACTOR__ }} + - **actor**: __GH_AW_GITHUB_ACTOR__ + {{/if}} + {{#if __GH_AW_GITHUB_REPOSITORY__ }} + - **repository**: __GH_AW_GITHUB_REPOSITORY__ + {{/if}} + {{#if __GH_AW_GITHUB_WORKSPACE__ }} + - **workspace**: __GH_AW_GITHUB_WORKSPACE__ + {{/if}} + {{#if __GH_AW_GITHUB_EVENT_ISSUE_NUMBER__ }} + - **issue-number**: #__GH_AW_GITHUB_EVENT_ISSUE_NUMBER__ + {{/if}} + {{#if __GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER__ }} + - **discussion-number**: #__GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER__ + {{/if}} + {{#if __GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER__ }} + - **pull-request-number**: #__GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER__ + {{/if}} + {{#if __GH_AW_GITHUB_EVENT_COMMENT_ID__ }} + - **comment-id**: __GH_AW_GITHUB_EVENT_COMMENT_ID__ + {{/if}} + {{#if __GH_AW_GITHUB_RUN_ID__ }} + - **workflow-run-id**: __GH_AW_GITHUB_RUN_ID__ + {{/if}} + + + GH_AW_PROMPT_de410bcdbc8f0b37_EOF + cat "${RUNNER_TEMP}/gh-aw/prompts/github_mcp_tools_with_safeoutputs_prompt.md" + cat << 'GH_AW_PROMPT_de410bcdbc8f0b37_EOF' + + {{#runtime-import .github/workflows/auto-code.md}} + GH_AW_PROMPT_de410bcdbc8f0b37_EOF + } > "$GH_AW_PROMPT" + - name: Interpolate variables and render templates + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt + GH_AW_ENGINE_ID: "copilot" + GH_AW_GITHUB_EVENT_ISSUE_NUMBER: ${{ github.event.issue.number }} + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/interpolate_prompt.cjs'); + await main(); + - name: Substitute placeholders + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt + GH_AW_GITHUB_ACTOR: ${{ github.actor }} + GH_AW_GITHUB_EVENT_COMMENT_ID: ${{ github.event.comment.id }} + GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER: ${{ github.event.discussion.number }} + GH_AW_GITHUB_EVENT_ISSUE_NUMBER: ${{ github.event.issue.number }} + GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER: ${{ github.event.pull_request.number }} + GH_AW_GITHUB_REPOSITORY: ${{ github.repository }} + GH_AW_GITHUB_RUN_ID: ${{ github.run_id }} + GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }} + GH_AW_MCP_CLI_SERVERS_LIST: '- `safeoutputs` — run `safeoutputs --help` to see available tools' + GH_AW_NEEDS_PRE_ACTIVATION_OUTPUTS_ACTIVATED: ${{ needs.pre_activation.outputs.activated }} + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + + const substitutePlaceholders = require('${{ runner.temp }}/gh-aw/actions/substitute_placeholders.cjs'); + + // Call the substitution function + return await substitutePlaceholders({ + file: process.env.GH_AW_PROMPT, + substitutions: { + GH_AW_GITHUB_ACTOR: process.env.GH_AW_GITHUB_ACTOR, + GH_AW_GITHUB_EVENT_COMMENT_ID: process.env.GH_AW_GITHUB_EVENT_COMMENT_ID, + GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER: process.env.GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER, + GH_AW_GITHUB_EVENT_ISSUE_NUMBER: process.env.GH_AW_GITHUB_EVENT_ISSUE_NUMBER, + GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER: process.env.GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER, + GH_AW_GITHUB_REPOSITORY: process.env.GH_AW_GITHUB_REPOSITORY, + GH_AW_GITHUB_RUN_ID: process.env.GH_AW_GITHUB_RUN_ID, + GH_AW_GITHUB_WORKSPACE: process.env.GH_AW_GITHUB_WORKSPACE, + GH_AW_MCP_CLI_SERVERS_LIST: process.env.GH_AW_MCP_CLI_SERVERS_LIST, + GH_AW_NEEDS_PRE_ACTIVATION_OUTPUTS_ACTIVATED: process.env.GH_AW_NEEDS_PRE_ACTIVATION_OUTPUTS_ACTIVATED + } + }); + - name: Validate prompt placeholders + env: + GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt + # poutine:ignore untrusted_checkout_exec + run: bash "${RUNNER_TEMP}/gh-aw/actions/validate_prompt_placeholders.sh" + - name: Print prompt + env: + GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt + # poutine:ignore untrusted_checkout_exec + run: bash "${RUNNER_TEMP}/gh-aw/actions/print_prompt_summary.sh" + - name: Upload activation artifact + if: success() + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: activation + include-hidden-files: true + path: | + /tmp/gh-aw/aw_info.json + /tmp/gh-aw/aw-prompts/prompt.txt + /tmp/gh-aw/github_rate_limits.jsonl + /tmp/gh-aw/base + if-no-files-found: ignore + retention-days: 1 + + agent: + needs: activation + runs-on: ubuntu-latest + permissions: + contents: read + issues: read + pull-requests: read + env: + DEFAULT_BRANCH: ${{ github.event.repository.default_branch }} + GH_AW_ASSETS_ALLOWED_EXTS: "" + GH_AW_ASSETS_BRANCH: "" + GH_AW_ASSETS_MAX_SIZE_KB: 0 + GH_AW_MCP_LOG_DIR: /tmp/gh-aw/mcp-logs/safeoutputs + GH_AW_WORKFLOW_ID_SANITIZED: autocode + outputs: + agentic_engine_timeout: ${{ steps.detect-copilot-errors.outputs.agentic_engine_timeout || 'false' }} + checkout_pr_success: ${{ steps.checkout-pr.outputs.checkout_pr_success || 'true' }} + effective_tokens: ${{ steps.parse-mcp-gateway.outputs.effective_tokens }} + has_patch: ${{ steps.collect_output.outputs.has_patch }} + inference_access_error: ${{ steps.detect-copilot-errors.outputs.inference_access_error || 'false' }} + mcp_policy_error: ${{ steps.detect-copilot-errors.outputs.mcp_policy_error || 'false' }} + model: ${{ needs.activation.outputs.model }} + model_not_supported_error: ${{ steps.detect-copilot-errors.outputs.model_not_supported_error || 'false' }} + output: ${{ steps.collect_output.outputs.output }} + output_types: ${{ steps.collect_output.outputs.output_types }} + setup-trace-id: ${{ steps.setup.outputs.trace-id }} + steps: + - name: Setup Scripts + id: setup + uses: github/gh-aw-actions/setup@b8068426813005612b960b5ab0b8bd2c27142323 # v0.71.5 + with: + destination: ${{ runner.temp }}/gh-aw/actions + job-name: ${{ github.job }} + trace-id: ${{ needs.activation.outputs.setup-trace-id }} + env: + GH_AW_SETUP_WORKFLOW_NAME: "自动处理 Issue" + GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/auto-code.lock.yml@${{ github.ref }} + GH_AW_INFO_VERSION: "1.0.40" + - name: Set runtime paths + id: set-runtime-paths + run: | + { + echo "GH_AW_SAFE_OUTPUTS=${RUNNER_TEMP}/gh-aw/safeoutputs/outputs.jsonl" + echo "GH_AW_SAFE_OUTPUTS_CONFIG_PATH=${RUNNER_TEMP}/gh-aw/safeoutputs/config.json" + echo "GH_AW_SAFE_OUTPUTS_TOOLS_PATH=${RUNNER_TEMP}/gh-aw/safeoutputs/tools.json" + } >> "$GITHUB_OUTPUT" + - name: Checkout repository + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + persist-credentials: false + - name: Create gh-aw temp directory + run: bash "${RUNNER_TEMP}/gh-aw/actions/create_gh_aw_tmp_dir.sh" + - name: Configure gh CLI for GitHub Enterprise + run: bash "${RUNNER_TEMP}/gh-aw/actions/configure_gh_for_ghe.sh" + env: + GH_TOKEN: ${{ github.token }} + - name: Configure Git credentials + env: + REPO_NAME: ${{ github.repository }} + SERVER_URL: ${{ github.server_url }} + GITHUB_TOKEN: ${{ github.token }} + run: | + git config --global user.email "github-actions[bot]@users.noreply.github.com" + git config --global user.name "github-actions[bot]" + git config --global am.keepcr true + # Re-authenticate git with GitHub token + SERVER_URL_STRIPPED="${SERVER_URL#https://}" + git remote set-url origin "https://x-access-token:${GITHUB_TOKEN}@${SERVER_URL_STRIPPED}/${REPO_NAME}.git" + echo "Git configured with standard GitHub Actions identity" + - name: Checkout PR branch + id: checkout-pr + if: | + github.event.pull_request || github.event.issue.pull_request + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + with: + github-token: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/checkout_pr_branch.cjs'); + await main(); + - name: Install GitHub Copilot CLI + run: bash "${RUNNER_TEMP}/gh-aw/actions/install_copilot_cli.sh" 1.0.40 + env: + GH_HOST: github.com + - name: Parse integrity filter lists + id: parse-guard-vars + env: + GH_AW_BLOCKED_USERS_VAR: ${{ vars.GH_AW_GITHUB_BLOCKED_USERS || '' }} + GH_AW_TRUSTED_USERS_VAR: ${{ vars.GH_AW_GITHUB_TRUSTED_USERS || '' }} + GH_AW_APPROVAL_LABELS_VAR: ${{ vars.GH_AW_GITHUB_APPROVAL_LABELS || '' }} + run: bash "${RUNNER_TEMP}/gh-aw/actions/parse_guard_list.sh" + - name: Download activation artifact + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + name: activation + path: /tmp/gh-aw + - name: Restore agent config folders from base branch + if: steps.checkout-pr.outcome == 'success' + env: + GH_AW_AGENT_FOLDERS: ".agents .claude .codex .crush .gemini .github .opencode .pi" + GH_AW_AGENT_FILES: ".crush.json AGENTS.md CLAUDE.md GEMINI.md PI.md opencode.jsonc" + run: bash "${RUNNER_TEMP}/gh-aw/actions/restore_base_github_folders.sh" + - name: Download container images + run: bash "${RUNNER_TEMP}/gh-aw/actions/download_docker_images.sh" ghcr.io/github/github-mcp-server:v1.0.3@sha256:2ac27ef03461ef2b877031b838a7d1fd7f12b12d4ace7796d8cad91446d55959 node:lts-alpine@sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f + - name: Generate Safe Outputs Config + run: | + mkdir -p "${RUNNER_TEMP}/gh-aw/safeoutputs" + mkdir -p /tmp/gh-aw/safeoutputs + mkdir -p /tmp/gh-aw/mcp-logs/safeoutputs + cat > "${RUNNER_TEMP}/gh-aw/safeoutputs/config.json" << 'GH_AW_SAFE_OUTPUTS_CONFIG_982fd4401303461a_EOF' + {"add_comment":{"max":1},"create_pull_request":{"base_branch":"develop","max":1,"max_patch_files":100,"max_patch_size":1024,"protect_top_level_dot_folders":true,"protected_files":["package.json","bun.lockb","bunfig.toml","deno.json","deno.jsonc","deno.lock","global.json","NuGet.Config","Directory.Packages.props","mix.exs","mix.lock","go.mod","go.sum","stack.yaml","stack.yaml.lock","pom.xml","build.gradle","build.gradle.kts","settings.gradle","settings.gradle.kts","gradle.properties","package-lock.json","yarn.lock","pnpm-lock.yaml","npm-shrinkwrap.json","requirements.txt","Pipfile","Pipfile.lock","pyproject.toml","setup.py","setup.cfg","Gemfile","Gemfile.lock","uv.lock","CODEOWNERS","DESIGN.md","README.md","CONTRIBUTING.md","CHANGELOG.md","SECURITY.md","CODE_OF_CONDUCT.md","AGENTS.md","CLAUDE.md","GEMINI.md"]},"create_report_incomplete_issue":{},"missing_data":{},"missing_tool":{},"noop":{"max":1,"report-as-issue":"true"},"report_incomplete":{}} + GH_AW_SAFE_OUTPUTS_CONFIG_982fd4401303461a_EOF + - name: Generate Safe Outputs Tools + env: + GH_AW_TOOLS_META_JSON: | + { + "description_suffixes": { + "add_comment": " CONSTRAINTS: Maximum 1 comment(s) can be added. Supports reply_to_id for discussion threading.", + "create_pull_request": " CONSTRAINTS: Maximum 1 pull request(s) can be created." + }, + "repo_params": {}, + "dynamic_tools": [] + } + GH_AW_VALIDATION_JSON: | + { + "add_comment": { + "defaultMax": 1, + "fields": { + "body": { + "required": true, + "type": "string", + "sanitize": true, + "maxLength": 65000 + }, + "item_number": { + "issueOrPRNumber": true + }, + "reply_to_id": { + "type": "string", + "maxLength": 256 + }, + "repo": { + "type": "string", + "maxLength": 256 + } + } + }, + "create_pull_request": { + "defaultMax": 1, + "fields": { + "base": { + "type": "string", + "sanitize": true, + "maxLength": 128 + }, + "body": { + "required": true, + "type": "string", + "sanitize": true, + "maxLength": 65000 + }, + "branch": { + "required": true, + "type": "string", + "sanitize": true, + "maxLength": 256 + }, + "draft": { + "type": "boolean" + }, + "labels": { + "type": "array", + "itemType": "string", + "itemSanitize": true, + "itemMaxLength": 128 + }, + "repo": { + "type": "string", + "maxLength": 256 + }, + "title": { + "required": true, + "type": "string", + "sanitize": true, + "maxLength": 128 + } + } + }, + "missing_data": { + "defaultMax": 20, + "fields": { + "alternatives": { + "type": "string", + "sanitize": true, + "maxLength": 256 + }, + "context": { + "type": "string", + "sanitize": true, + "maxLength": 256 + }, + "data_type": { + "type": "string", + "sanitize": true, + "maxLength": 128 + }, + "reason": { + "type": "string", + "sanitize": true, + "maxLength": 256 + } + } + }, + "missing_tool": { + "defaultMax": 20, + "fields": { + "alternatives": { + "type": "string", + "sanitize": true, + "maxLength": 512 + }, + "reason": { + "required": true, + "type": "string", + "sanitize": true, + "maxLength": 256 + }, + "tool": { + "type": "string", + "sanitize": true, + "maxLength": 128 + } + } + }, + "noop": { + "defaultMax": 1, + "fields": { + "message": { + "required": true, + "type": "string", + "sanitize": true, + "maxLength": 65000 + } + } + }, + "report_incomplete": { + "defaultMax": 5, + "fields": { + "details": { + "type": "string", + "sanitize": true, + "maxLength": 65000 + }, + "reason": { + "required": true, + "type": "string", + "sanitize": true, + "maxLength": 1024 + } + } + } + } + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/generate_safe_outputs_tools.cjs'); + await main(); + - name: Generate Safe Outputs MCP Server Config + id: safe-outputs-config + run: | + # Generate a secure random API key (360 bits of entropy, 40+ chars) + # Mask immediately to prevent timing vulnerabilities + API_KEY=$(openssl rand -base64 45 | tr -d '/+=') + echo "::add-mask::${API_KEY}" + + PORT=3001 + + # Set outputs for next steps + { + echo "safe_outputs_api_key=${API_KEY}" + echo "safe_outputs_port=${PORT}" + } >> "$GITHUB_OUTPUT" + + echo "Safe Outputs MCP server will run on port ${PORT}" + + - name: Start Safe Outputs MCP HTTP Server + id: safe-outputs-start + env: + DEBUG: '*' + GH_AW_SAFE_OUTPUTS: ${{ steps.set-runtime-paths.outputs.GH_AW_SAFE_OUTPUTS }} + GH_AW_SAFE_OUTPUTS_PORT: ${{ steps.safe-outputs-config.outputs.safe_outputs_port }} + GH_AW_SAFE_OUTPUTS_API_KEY: ${{ steps.safe-outputs-config.outputs.safe_outputs_api_key }} + GH_AW_SAFE_OUTPUTS_TOOLS_PATH: ${{ runner.temp }}/gh-aw/safeoutputs/tools.json + GH_AW_SAFE_OUTPUTS_CONFIG_PATH: ${{ runner.temp }}/gh-aw/safeoutputs/config.json + GH_AW_MCP_LOG_DIR: /tmp/gh-aw/mcp-logs/safeoutputs + run: | + # Environment variables are set above to prevent template injection + export DEBUG + export GH_AW_SAFE_OUTPUTS + export GH_AW_SAFE_OUTPUTS_PORT + export GH_AW_SAFE_OUTPUTS_API_KEY + export GH_AW_SAFE_OUTPUTS_TOOLS_PATH + export GH_AW_SAFE_OUTPUTS_CONFIG_PATH + export GH_AW_MCP_LOG_DIR + + bash "${RUNNER_TEMP}/gh-aw/actions/start_safe_outputs_server.sh" + + - name: Start MCP Gateway + id: start-mcp-gateway + env: + GH_AW_SAFE_OUTPUTS: ${{ steps.set-runtime-paths.outputs.GH_AW_SAFE_OUTPUTS }} + GH_AW_SAFE_OUTPUTS_API_KEY: ${{ steps.safe-outputs-start.outputs.api_key }} + GH_AW_SAFE_OUTPUTS_PORT: ${{ steps.safe-outputs-start.outputs.port }} + GITHUB_MCP_SERVER_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + run: | + set -eo pipefail + mkdir -p "${RUNNER_TEMP}/gh-aw/mcp-config" + + # Export gateway environment variables for MCP config and gateway script + export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_DOMAIN="localhost" + export MCP_GATEWAY_HOST_DOMAIN="localhost" + MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') + echo "::add-mask::${MCP_GATEWAY_API_KEY}" + export MCP_GATEWAY_API_KEY + export MCP_GATEWAY_PAYLOAD_DIR="/tmp/gh-aw/mcp-payloads" + mkdir -p "${MCP_GATEWAY_PAYLOAD_DIR}" + export MCP_GATEWAY_PAYLOAD_SIZE_THRESHOLD="524288" + export DEBUG="*" + + export GH_AW_ENGINE="copilot" + MCP_GATEWAY_UID=$(id -u 2>/dev/null || echo '0') + MCP_GATEWAY_GID=$(id -g 2>/dev/null || echo '0') + DOCKER_SOCK_GID=$(stat -c '%g' /var/run/docker.sock 2>/dev/null || echo '0') + export MCP_GATEWAY_DOCKER_COMMAND='docker run -i --rm --network host --add-host host.docker.internal:127.0.0.1 --user '"${MCP_GATEWAY_UID}"':'"${MCP_GATEWAY_GID}"' --group-add '"${DOCKER_SOCK_GID}"' -v /var/run/docker.sock:/var/run/docker.sock -e MCP_GATEWAY_PORT -e MCP_GATEWAY_DOMAIN -e MCP_GATEWAY_API_KEY -e MCP_GATEWAY_PAYLOAD_DIR -e MCP_GATEWAY_PAYLOAD_SIZE_THRESHOLD -e DEBUG -e MCP_GATEWAY_LOG_DIR -e GH_AW_MCP_LOG_DIR -e GH_AW_SAFE_OUTPUTS -e GH_AW_SAFE_OUTPUTS_CONFIG_PATH -e GH_AW_SAFE_OUTPUTS_TOOLS_PATH -e GH_AW_ASSETS_BRANCH -e GH_AW_ASSETS_MAX_SIZE_KB -e GH_AW_ASSETS_ALLOWED_EXTS -e DEFAULT_BRANCH -e GITHUB_MCP_SERVER_TOKEN -e GITHUB_MCP_GUARD_MIN_INTEGRITY -e GITHUB_MCP_GUARD_REPOS -e GITHUB_REPOSITORY -e GITHUB_SERVER_URL -e GITHUB_SHA -e GITHUB_WORKSPACE -e GITHUB_TOKEN -e GITHUB_RUN_ID -e GITHUB_RUN_NUMBER -e GITHUB_RUN_ATTEMPT -e GITHUB_JOB -e GITHUB_ACTION -e GITHUB_EVENT_NAME -e GITHUB_EVENT_PATH -e GITHUB_ACTOR -e GITHUB_ACTOR_ID -e GITHUB_TRIGGERING_ACTOR -e GITHUB_WORKFLOW -e GITHUB_WORKFLOW_REF -e GITHUB_WORKFLOW_SHA -e GITHUB_REF -e GITHUB_REF_NAME -e GITHUB_REF_TYPE -e GITHUB_HEAD_REF -e GITHUB_BASE_REF -e GH_AW_SAFE_OUTPUTS_PORT -e GH_AW_SAFE_OUTPUTS_API_KEY -v /tmp/gh-aw/mcp-payloads:/tmp/gh-aw/mcp-payloads:rw -v /opt:/opt:ro -v /tmp:/tmp:rw -v '"${GITHUB_WORKSPACE}"':'"${GITHUB_WORKSPACE}"':rw ghcr.io/github/gh-aw-mcpg:v0.3.6' + + mkdir -p /home/runner/.copilot + GH_AW_NODE=$(which node 2>/dev/null || command -v node 2>/dev/null || echo node) + cat << GH_AW_MCP_CONFIG_01a7963a8b9bf043_EOF | "$GH_AW_NODE" "${RUNNER_TEMP}/gh-aw/actions/start_mcp_gateway.cjs" + { + "mcpServers": { + "github": { + "type": "stdio", + "container": "ghcr.io/github/github-mcp-server:v1.0.3", + "env": { + "GITHUB_HOST": "\${GITHUB_SERVER_URL}", + "GITHUB_PERSONAL_ACCESS_TOKEN": "\${GITHUB_MCP_SERVER_TOKEN}", + "GITHUB_READ_ONLY": "1", + "GITHUB_TOOLSETS": "context,repos,issues,pull_requests" + }, + "guard-policies": { + "allow-only": { + "approval-labels": ${{ steps.parse-guard-vars.outputs.approval_labels }}, + "blocked-users": ${{ steps.parse-guard-vars.outputs.blocked_users }}, + "min-integrity": "none", + "repos": "all", + "trusted-users": ${{ steps.parse-guard-vars.outputs.trusted_users }} + } + } + }, + "safeoutputs": { + "type": "http", + "url": "http://localhost:$GH_AW_SAFE_OUTPUTS_PORT", + "headers": { + "Authorization": "\${GH_AW_SAFE_OUTPUTS_API_KEY}" + }, + "guard-policies": { + "write-sink": { + "accept": [ + "*" + ] + } + } + } + }, + "gateway": { + "port": $MCP_GATEWAY_PORT, + "domain": "${MCP_GATEWAY_DOMAIN}", + "apiKey": "${MCP_GATEWAY_API_KEY}", + "payloadDir": "${MCP_GATEWAY_PAYLOAD_DIR}" + } + } + GH_AW_MCP_CONFIG_01a7963a8b9bf043_EOF + - name: Mount MCP servers as CLIs + id: mount-mcp-clis + continue-on-error: true + env: + MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} + MCP_GATEWAY_DOMAIN: ${{ steps.start-mcp-gateway.outputs.gateway-domain }} + MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io); + const { main } = require('${{ runner.temp }}/gh-aw/actions/mount_mcp_as_cli.cjs'); + await main(); + - name: Clean credentials + continue-on-error: true + run: bash "${RUNNER_TEMP}/gh-aw/actions/clean_git_credentials.sh" + - name: Audit pre-agent workspace + id: pre_agent_audit + continue-on-error: true + run: bash "${RUNNER_TEMP}/gh-aw/actions/audit_pre_agent_workspace.sh" + - name: Execute GitHub Copilot CLI + id: agentic_execution + # Copilot CLI tool arguments (sorted): + # --allow-tool github + # --allow-tool safeoutputs + # --allow-tool shell(cat) + # --allow-tool shell(date) + # --allow-tool shell(echo) + # --allow-tool shell(git add:*) + # --allow-tool shell(git branch:*) + # --allow-tool shell(git checkout:*) + # --allow-tool shell(git commit:*) + # --allow-tool shell(git merge:*) + # --allow-tool shell(git rm:*) + # --allow-tool shell(git status) + # --allow-tool shell(git switch:*) + # --allow-tool shell(grep) + # --allow-tool shell(head) + # --allow-tool shell(ls) + # --allow-tool shell(pwd) + # --allow-tool shell(safeoutputs:*) + # --allow-tool shell(sort) + # --allow-tool shell(tail) + # --allow-tool shell(uniq) + # --allow-tool shell(wc) + # --allow-tool shell(yq) + # --allow-tool write + timeout-minutes: 20 + run: | + set -o pipefail + touch /tmp/gh-aw/agent-step-summary.md + (umask 177 && touch /tmp/gh-aw/agent-stdio.log) + mkdir -p /tmp/ + mkdir -p /tmp/gh-aw/ + mkdir -p /tmp/gh-aw/agent/ + mkdir -p /tmp/gh-aw/sandbox/agent/logs/ + GH_AW_NODE_EXEC="${GH_AW_NODE_BIN:-}"; if [ -z "$GH_AW_NODE_EXEC" ] || [ ! -x "$GH_AW_NODE_EXEC" ]; then GH_AW_NODE_EXEC="$(command -v node 2>/dev/null || echo node)"; fi; "$GH_AW_NODE_EXEC" ${RUNNER_TEMP}/gh-aw/actions/copilot_harness.cjs copilot --add-dir /tmp/ --add-dir /tmp/gh-aw/ --add-dir /tmp/gh-aw/agent/ --log-level all --log-dir /tmp/gh-aw/sandbox/agent/logs/ --disable-builtin-mcps --no-ask-user --allow-tool github --allow-tool safeoutputs --allow-tool 'shell(cat)' --allow-tool 'shell(date)' --allow-tool 'shell(echo)' --allow-tool 'shell(git add:*)' --allow-tool 'shell(git branch:*)' --allow-tool 'shell(git checkout:*)' --allow-tool 'shell(git commit:*)' --allow-tool 'shell(git merge:*)' --allow-tool 'shell(git rm:*)' --allow-tool 'shell(git status)' --allow-tool 'shell(git switch:*)' --allow-tool 'shell(grep)' --allow-tool 'shell(head)' --allow-tool 'shell(ls)' --allow-tool 'shell(pwd)' --allow-tool 'shell(safeoutputs:*)' --allow-tool 'shell(sort)' --allow-tool 'shell(tail)' --allow-tool 'shell(uniq)' --allow-tool 'shell(wc)' --allow-tool 'shell(yq)' --allow-tool write --allow-all-paths --prompt-file /tmp/gh-aw/aw-prompts/prompt.txt 2>&1 | tee /tmp/gh-aw/agent-stdio.log + env: + COPILOT_AGENT_RUNNER_TYPE: STANDALONE + COPILOT_API_KEY: dummy-byok-key-for-offline-mode + COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }} + COPILOT_MODEL: doubao-seed-2-0-code-preview-260215 + COPILOT_PROVIDER_API_KEY: ${{ secrets.OPENAI_API_KEY }} + COPILOT_PROVIDER_BASE_URL: https://ark.cn-beijing.volces.com/api/v3 + COPILOT_PROVIDER_TYPE: openai + GH_AW_MCP_CONFIG: /home/runner/.copilot/mcp-config.json + GH_AW_PHASE: agent + GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt + GH_AW_SAFE_OUTPUTS: ${{ steps.set-runtime-paths.outputs.GH_AW_SAFE_OUTPUTS }} + GH_AW_VERSION: v0.71.5 + GITHUB_API_URL: ${{ github.api_url }} + GITHUB_AW: true + GITHUB_COPILOT_INTEGRATION_ID: agentic-workflows + GITHUB_HEAD_REF: ${{ github.head_ref }} + GITHUB_MCP_SERVER_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + GITHUB_REF_NAME: ${{ github.ref_name }} + GITHUB_SERVER_URL: ${{ github.server_url }} + GITHUB_STEP_SUMMARY: /tmp/gh-aw/agent-step-summary.md + GITHUB_WORKSPACE: ${{ github.workspace }} + XDG_CONFIG_HOME: /home/runner + - name: Detect Copilot errors + id: detect-copilot-errors + if: always() + continue-on-error: true + run: node "${RUNNER_TEMP}/gh-aw/actions/detect_copilot_errors.cjs" + - name: Configure Git credentials + env: + REPO_NAME: ${{ github.repository }} + SERVER_URL: ${{ github.server_url }} + GITHUB_TOKEN: ${{ github.token }} + run: | + git config --global user.email "github-actions[bot]@users.noreply.github.com" + git config --global user.name "github-actions[bot]" + git config --global am.keepcr true + # Re-authenticate git with GitHub token + SERVER_URL_STRIPPED="${SERVER_URL#https://}" + git remote set-url origin "https://x-access-token:${GITHUB_TOKEN}@${SERVER_URL_STRIPPED}/${REPO_NAME}.git" + echo "Git configured with standard GitHub Actions identity" + - name: Copy Copilot session state files to logs + if: always() + continue-on-error: true + run: bash "${RUNNER_TEMP}/gh-aw/actions/copy_copilot_session_state.sh" + - name: Stop MCP Gateway + if: always() + continue-on-error: true + env: + MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} + GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} + run: | + bash "${RUNNER_TEMP}/gh-aw/actions/stop_mcp_gateway.sh" "$GATEWAY_PID" + - name: Redact secrets in logs + if: always() + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/redact_secrets.cjs'); + await main(); + env: + GH_AW_SECRET_NAMES: 'COPILOT_GITHUB_TOKEN,GH_AW_GITHUB_MCP_SERVER_TOKEN,GH_AW_GITHUB_TOKEN,GITHUB_TOKEN,OPENAI_API_KEY' + SECRET_COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }} + SECRET_GH_AW_GITHUB_MCP_SERVER_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN }} + SECRET_GH_AW_GITHUB_TOKEN: ${{ secrets.GH_AW_GITHUB_TOKEN }} + SECRET_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + SECRET_OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} + - name: Append agent step summary + if: always() + run: bash "${RUNNER_TEMP}/gh-aw/actions/append_agent_step_summary.sh" + - name: Copy Safe Outputs + if: always() + env: + GH_AW_SAFE_OUTPUTS: ${{ steps.set-runtime-paths.outputs.GH_AW_SAFE_OUTPUTS }} + run: | + mkdir -p /tmp/gh-aw + cp "$GH_AW_SAFE_OUTPUTS" /tmp/gh-aw/safeoutputs.jsonl 2>/dev/null || true + - name: Ingest agent output + id: collect_output + if: always() + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_SAFE_OUTPUTS: ${{ steps.set-runtime-paths.outputs.GH_AW_SAFE_OUTPUTS }} + GH_AW_ALLOWED_DOMAINS: "api.business.githubcopilot.com,api.enterprise.githubcopilot.com,api.github.com,api.githubcopilot.com,api.individual.githubcopilot.com,api.snapcraft.io,archive.ubuntu.com,ark.cn-beijing.volces.com,azure.archive.ubuntu.com,crl.geotrust.com,crl.globalsign.com,crl.identrust.com,crl.sectigo.com,crl.thawte.com,crl.usertrust.com,crl.verisign.com,crl3.digicert.com,crl4.digicert.com,crls.ssl.com,github.com,host.docker.internal,json-schema.org,json.schemastore.org,keyserver.ubuntu.com,ocsp.digicert.com,ocsp.geotrust.com,ocsp.globalsign.com,ocsp.identrust.com,ocsp.sectigo.com,ocsp.ssl.com,ocsp.thawte.com,ocsp.usertrust.com,ocsp.verisign.com,packagecloud.io,packages.cloud.google.com,packages.microsoft.com,ppa.launchpad.net,raw.githubusercontent.com,registry.npmjs.org,s.symcb.com,s.symcd.com,security.ubuntu.com,telemetry.enterprise.githubcopilot.com,ts-crl.ws.symantec.com,ts-ocsp.ws.symantec.com,www.googleapis.com" + GITHUB_SERVER_URL: ${{ github.server_url }} + GITHUB_API_URL: ${{ github.api_url }} + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/collect_ndjson_output.cjs'); + await main(); + - name: Parse agent logs for step summary + if: always() + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_AGENT_OUTPUT: /tmp/gh-aw/sandbox/agent/logs/ + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/parse_copilot_log.cjs'); + await main(); + - name: Parse MCP Gateway logs for step summary + if: always() + id: parse-mcp-gateway + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/parse_mcp_gateway_log.cjs'); + await main(); + - name: Write agent output placeholder if missing + if: always() + run: | + if [ ! -f /tmp/gh-aw/agent_output.json ]; then + echo '{"items":[]}' > /tmp/gh-aw/agent_output.json + fi + - name: Upload agent artifacts + if: always() + continue-on-error: true + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: agent + path: | + /tmp/gh-aw/aw-prompts/prompt.txt + /tmp/gh-aw/sandbox/agent/logs/ + /tmp/gh-aw/redacted-urls.log + /tmp/gh-aw/mcp-logs/ + /tmp/gh-aw/proxy-logs/ + !/tmp/gh-aw/proxy-logs/proxy-tls/ + /tmp/gh-aw/agent-stdio.log + /tmp/gh-aw/pre-agent-audit.txt + /tmp/gh-aw/agent/ + /tmp/gh-aw/github_rate_limits.jsonl + /tmp/gh-aw/safeoutputs.jsonl + /tmp/gh-aw/agent_output.json + /tmp/gh-aw/aw-*.patch + /tmp/gh-aw/aw-*.bundle + if-no-files-found: ignore + + conclusion: + needs: + - activation + - agent + - safe_outputs + if: > + always() && (needs.agent.result != 'skipped' || needs.activation.outputs.lockdown_check_failed == 'true' || + needs.activation.outputs.stale_lock_file_failed == 'true') + runs-on: ubuntu-slim + permissions: + contents: write + discussions: write + issues: write + pull-requests: write + concurrency: + group: "gh-aw-conclusion-auto-code" + cancel-in-progress: false + outputs: + incomplete_count: ${{ steps.report_incomplete.outputs.incomplete_count }} + noop_message: ${{ steps.noop.outputs.noop_message }} + tools_reported: ${{ steps.missing_tool.outputs.tools_reported }} + total_count: ${{ steps.missing_tool.outputs.total_count }} + steps: + - name: Setup Scripts + id: setup + uses: github/gh-aw-actions/setup@b8068426813005612b960b5ab0b8bd2c27142323 # v0.71.5 + with: + destination: ${{ runner.temp }}/gh-aw/actions + job-name: ${{ github.job }} + trace-id: ${{ needs.activation.outputs.setup-trace-id }} + env: + GH_AW_SETUP_WORKFLOW_NAME: "自动处理 Issue" + GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/auto-code.lock.yml@${{ github.ref }} + GH_AW_INFO_VERSION: "1.0.40" + - name: Download agent output artifact + id: download-agent-output + continue-on-error: true + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + name: agent + path: /tmp/gh-aw/ + - name: Setup agent output environment variable + id: setup-agent-output-env + if: steps.download-agent-output.outcome == 'success' + run: | + mkdir -p /tmp/gh-aw/ + find "/tmp/gh-aw/" -type f -print + echo "GH_AW_AGENT_OUTPUT=/tmp/gh-aw/agent_output.json" >> "$GITHUB_OUTPUT" + - name: Process no-op messages + id: noop + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }} + GH_AW_NOOP_MAX: "1" + GH_AW_WORKFLOW_NAME: "自动处理 Issue" + GH_AW_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} + GH_AW_AGENT_CONCLUSION: ${{ needs.agent.result }} + GH_AW_NOOP_REPORT_AS_ISSUE: "true" + with: + github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_noop_message.cjs'); + await main(); + - name: Record missing tool + id: missing_tool + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }} + GH_AW_MISSING_TOOL_CREATE_ISSUE: "true" + GH_AW_WORKFLOW_NAME: "自动处理 Issue" + with: + github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/missing_tool.cjs'); + await main(); + - name: Record incomplete + id: report_incomplete + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }} + GH_AW_REPORT_INCOMPLETE_CREATE_ISSUE: "true" + GH_AW_WORKFLOW_NAME: "自动处理 Issue" + with: + github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/report_incomplete_handler.cjs'); + await main(); + - name: Handle agent failure + id: handle_agent_failure + if: always() + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }} + GH_AW_WORKFLOW_NAME: "自动处理 Issue" + GH_AW_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} + GH_AW_AGENT_CONCLUSION: ${{ needs.agent.result }} + GH_AW_WORKFLOW_ID: "auto-code" + GH_AW_ACTION_FAILURE_ISSUE_EXPIRES_HOURS: "168" + GH_AW_ENGINE_ID: "copilot" + GH_AW_CHECKOUT_PR_SUCCESS: ${{ needs.agent.outputs.checkout_pr_success }} + GH_AW_INFERENCE_ACCESS_ERROR: ${{ needs.agent.outputs.inference_access_error }} + GH_AW_MCP_POLICY_ERROR: ${{ needs.agent.outputs.mcp_policy_error }} + GH_AW_AGENTIC_ENGINE_TIMEOUT: ${{ needs.agent.outputs.agentic_engine_timeout }} + GH_AW_MODEL_NOT_SUPPORTED_ERROR: ${{ needs.agent.outputs.model_not_supported_error }} + GH_AW_ENGINE_API_HOSTS: "api.enterprise.githubcopilot.com,api.githubcopilot.com,api.business.githubcopilot.com,api.individual.githubcopilot.com" + GH_AW_CODE_PUSH_FAILURE_ERRORS: ${{ needs.safe_outputs.outputs.code_push_failure_errors }} + GH_AW_CODE_PUSH_FAILURE_COUNT: ${{ needs.safe_outputs.outputs.code_push_failure_count }} + GH_AW_LOCKDOWN_CHECK_FAILED: ${{ needs.activation.outputs.lockdown_check_failed }} + GH_AW_STALE_LOCK_FILE_FAILED: ${{ needs.activation.outputs.stale_lock_file_failed }} + GH_AW_GROUP_REPORTS: "false" + GH_AW_FAILURE_REPORT_AS_ISSUE: "true" + GH_AW_MISSING_TOOL_REPORT_AS_FAILURE: "true" + GH_AW_MISSING_DATA_REPORT_AS_FAILURE: "true" + GH_AW_TIMEOUT_MINUTES: "20" + with: + github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); + await main(); + + pre_activation: + runs-on: ubuntu-slim + outputs: + activated: ${{ steps.check_membership.outputs.is_team_member == 'true' }} + matched_command: '' + setup-trace-id: ${{ steps.setup.outputs.trace-id }} + steps: + - name: Setup Scripts + id: setup + uses: github/gh-aw-actions/setup@b8068426813005612b960b5ab0b8bd2c27142323 # v0.71.5 + with: + destination: ${{ runner.temp }}/gh-aw/actions + job-name: ${{ github.job }} + env: + GH_AW_SETUP_WORKFLOW_NAME: "自动处理 Issue" + GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/auto-code.lock.yml@${{ github.ref }} + GH_AW_INFO_VERSION: "1.0.40" + - name: Check team membership for workflow + id: check_membership + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_REQUIRED_ROLES: "admin,maintainer,write" + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/check_membership.cjs'); + await main(); + + safe_outputs: + needs: + - activation + - agent + if: (!cancelled()) && needs.agent.result != 'skipped' + runs-on: ubuntu-slim + permissions: + contents: write + discussions: write + issues: write + pull-requests: write + timeout-minutes: 15 + env: + GH_AW_CALLER_WORKFLOW_ID: "${{ github.repository }}/auto-code" + GH_AW_EFFECTIVE_TOKENS: ${{ needs.agent.outputs.effective_tokens }} + GH_AW_ENGINE_ID: "copilot" + GH_AW_ENGINE_MODEL: ${{ needs.agent.outputs.model }} + GH_AW_ENGINE_VERSION: "1.0.40" + GH_AW_WORKFLOW_ID: "auto-code" + GH_AW_WORKFLOW_NAME: "自动处理 Issue" + outputs: + code_push_failure_count: ${{ steps.process_safe_outputs.outputs.code_push_failure_count }} + code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} + comment_id: ${{ steps.process_safe_outputs.outputs.comment_id }} + comment_url: ${{ steps.process_safe_outputs.outputs.comment_url }} + create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} + create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_pr_number: ${{ steps.process_safe_outputs.outputs.created_pr_number }} + created_pr_url: ${{ steps.process_safe_outputs.outputs.created_pr_url }} + process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} + process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} + steps: + - name: Setup Scripts + id: setup + uses: github/gh-aw-actions/setup@b8068426813005612b960b5ab0b8bd2c27142323 # v0.71.5 + with: + destination: ${{ runner.temp }}/gh-aw/actions + job-name: ${{ github.job }} + trace-id: ${{ needs.activation.outputs.setup-trace-id }} + env: + GH_AW_SETUP_WORKFLOW_NAME: "自动处理 Issue" + GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/auto-code.lock.yml@${{ github.ref }} + GH_AW_INFO_VERSION: "1.0.40" + - name: Download agent output artifact + id: download-agent-output + continue-on-error: true + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + name: agent + path: /tmp/gh-aw/ + - name: Setup agent output environment variable + id: setup-agent-output-env + if: steps.download-agent-output.outcome == 'success' + run: | + mkdir -p /tmp/gh-aw/ + find "/tmp/gh-aw/" -type f -print + echo "GH_AW_AGENT_OUTPUT=/tmp/gh-aw/agent_output.json" >> "$GITHUB_OUTPUT" + - name: Download patch artifact + continue-on-error: true + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + name: agent + path: /tmp/gh-aw/ + - name: Checkout repository + if: (!cancelled()) && needs.agent.result != 'skipped' && contains(needs.agent.outputs.output_types, 'create_pull_request') + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + ref: develop + token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + persist-credentials: false + fetch-depth: 1 + - name: Configure Git credentials + if: (!cancelled()) && needs.agent.result != 'skipped' && contains(needs.agent.outputs.output_types, 'create_pull_request') + env: + REPO_NAME: ${{ github.repository }} + SERVER_URL: ${{ github.server_url }} + GIT_TOKEN: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + run: | + git config --global user.email "github-actions[bot]@users.noreply.github.com" + git config --global user.name "github-actions[bot]" + git config --global am.keepcr true + # Re-authenticate git with GitHub token + SERVER_URL_STRIPPED="${SERVER_URL#https://}" + git remote set-url origin "https://x-access-token:${GIT_TOKEN}@${SERVER_URL_STRIPPED}/${REPO_NAME}.git" + echo "Git configured with standard GitHub Actions identity" + - name: Configure GH_HOST for enterprise compatibility + id: ghes-host-config + shell: bash + run: | + # Derive GH_HOST from GITHUB_SERVER_URL so the gh CLI targets the correct + # GitHub instance (GHES/GHEC). On github.com this is a harmless no-op. + GH_HOST="${GITHUB_SERVER_URL#https://}" + GH_HOST="${GH_HOST#http://}" + echo "GH_HOST=${GH_HOST}" >> "$GITHUB_ENV" + - name: Process Safe Outputs + id: process_safe_outputs + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }} + GH_AW_ALLOWED_DOMAINS: "api.business.githubcopilot.com,api.enterprise.githubcopilot.com,api.github.com,api.githubcopilot.com,api.individual.githubcopilot.com,api.snapcraft.io,archive.ubuntu.com,ark.cn-beijing.volces.com,azure.archive.ubuntu.com,crl.geotrust.com,crl.globalsign.com,crl.identrust.com,crl.sectigo.com,crl.thawte.com,crl.usertrust.com,crl.verisign.com,crl3.digicert.com,crl4.digicert.com,crls.ssl.com,github.com,host.docker.internal,json-schema.org,json.schemastore.org,keyserver.ubuntu.com,ocsp.digicert.com,ocsp.geotrust.com,ocsp.globalsign.com,ocsp.identrust.com,ocsp.sectigo.com,ocsp.ssl.com,ocsp.thawte.com,ocsp.usertrust.com,ocsp.verisign.com,packagecloud.io,packages.cloud.google.com,packages.microsoft.com,ppa.launchpad.net,raw.githubusercontent.com,registry.npmjs.org,s.symcb.com,s.symcd.com,security.ubuntu.com,telemetry.enterprise.githubcopilot.com,ts-crl.ws.symantec.com,ts-ocsp.ws.symantec.com,www.googleapis.com" + GITHUB_SERVER_URL: ${{ github.server_url }} + GITHUB_API_URL: ${{ github.api_url }} + GH_AW_SAFE_OUTPUTS_HANDLER_CONFIG: "{\"add_comment\":{\"max\":1},\"create_pull_request\":{\"base_branch\":\"develop\",\"max\":1,\"max_patch_files\":100,\"max_patch_size\":1024,\"protect_top_level_dot_folders\":true,\"protected_files\":[\"package.json\",\"bun.lockb\",\"bunfig.toml\",\"deno.json\",\"deno.jsonc\",\"deno.lock\",\"global.json\",\"NuGet.Config\",\"Directory.Packages.props\",\"mix.exs\",\"mix.lock\",\"go.mod\",\"go.sum\",\"stack.yaml\",\"stack.yaml.lock\",\"pom.xml\",\"build.gradle\",\"build.gradle.kts\",\"settings.gradle\",\"settings.gradle.kts\",\"gradle.properties\",\"package-lock.json\",\"yarn.lock\",\"pnpm-lock.yaml\",\"npm-shrinkwrap.json\",\"requirements.txt\",\"Pipfile\",\"Pipfile.lock\",\"pyproject.toml\",\"setup.py\",\"setup.cfg\",\"Gemfile\",\"Gemfile.lock\",\"uv.lock\",\"CODEOWNERS\",\"DESIGN.md\",\"README.md\",\"CONTRIBUTING.md\",\"CHANGELOG.md\",\"SECURITY.md\",\"CODE_OF_CONDUCT.md\",\"AGENTS.md\",\"CLAUDE.md\",\"GEMINI.md\"]},\"create_report_incomplete_issue\":{},\"missing_data\":{},\"missing_tool\":{},\"noop\":{\"max\":1,\"report-as-issue\":\"true\"},\"report_incomplete\":{}}" + GH_AW_CI_TRIGGER_TOKEN: ${{ secrets.GH_AW_CI_TRIGGER_TOKEN }} + with: + github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/safe_output_handler_manager.cjs'); + await main(); + - name: Upload Safe Outputs Items + if: always() + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: safe-outputs-items + path: | + /tmp/gh-aw/safe-output-items.jsonl + /tmp/gh-aw/temporary-id-map.json + if-no-files-found: ignore + diff --git a/.github/workflows/auto-code.md b/.github/workflows/auto-code.md new file mode 100644 index 0000000..5a51003 --- /dev/null +++ b/.github/workflows/auto-code.md @@ -0,0 +1,88 @@ +--- +on: + issues: + types: [labeled] + +engine: + id: copilot + env: + COPILOT_PROVIDER_BASE_URL: "https://ark.cn-beijing.volces.com/api/v3" + COPILOT_MODEL: doubao-seed-2-0-code-preview-260215 + COPILOT_PROVIDER_API_KEY: ${{ secrets.OPENAI_API_KEY }} + COPILOT_PROVIDER_TYPE: openai + +network: + allowed: + - defaults + - ark.cn-beijing.volces.com + +sandbox: + agent: false +strict: false + +tools: + github: + min-integrity: none + +permissions: + contents: read + issues: read + pull-requests: read + +safe-outputs: + threat-detection: false + create-pull-request: + base-branch: develop + add-comment: + max: 1 +--- + +# 自动处理 Issue + +当 Issue 被打上 `bug` 或 `enhancement` 标签时触发。其他标签直接退出,不做任何操作。 + +## 判断任务类型 + +读取 Issue #${{ github.event.issue.number }} 当前的标签: +- 如果包含 `bug` 标签 → 执行【Bug 修复流程】 +- 如果包含 `enhancement` 标签 → 执行【新功能开发流程】 +- 其他情况 → 直接退出 + +--- + +## Bug 修复流程 + +1. 阅读 Issue 的完整标题和正文,理解问题现象 +2. 浏览仓库代码和文档,定位问题所在的文件和函数 +3. 分析根本原因 +4. 实现修复方案,注意: + - 保持与现有代码风格一致 + - 只修改必要的部分,不做无关改动 +5. 创建 Pull Request,标题格式:`fix: `,描述中说明: + - 问题根因 + - 修复方式 + - 如何验证 +6. 在原 Issue 下用中文回复,说明已提交 PR 及修复思路 + +如果问题过于复杂或信息不足,在 Issue 下用中文说明原因,不创建 PR。 + +--- + +## 新功能开发流程 + +1. 阅读 Issue 的完整标题和正文,理解需求目标 +2. 浏览仓库现有代码结构和文档,找到最相关的模块和文件 +3. 制定实现方案: + - 需要新增哪些文件或函数 + - 需要修改哪些现有文件 +4. 按方案实现代码,注意: + - 保持与现有代码风格一致 + - 新增函数/类需要添加注释 + - 如果涉及接口变更,同步更新相关调用方 +5. 创建 Pull Request,标题格式:`feat: `,描述中说明: + - 实现了哪些功能 + - 涉及哪些文件改动 + - 如何验证/测试 +6. 在原 Issue 下用用户提问的语言进行回复,说明已提交 PR、实现思路和测试建议 + +如果需求描述不清晰或实现风险过大,在 Issue 下用用户提问的语言说明原因,不创建 PR。 \ No newline at end of file diff --git a/.github/workflows/issue-translator.yml b/.github/workflows/issue-translator.yml deleted file mode 100644 index 424f3d1..0000000 --- a/.github/workflows/issue-translator.yml +++ /dev/null @@ -1,15 +0,0 @@ -name: Issue Translator -on: - issue_comment: - types: [created] - issues: - types: [opened] - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: usthe/issues-translate-action@v2.7 - with: - IS_MODIFY_TITLE: true - CUSTOM_BOT_NOTE: Bot detected the issue body's language is not English, translate it automatically. \ No newline at end of file diff --git a/.github/workflows/issue-triage.lock.yml b/.github/workflows/issue-triage.lock.yml new file mode 100644 index 0000000..4dd0549 --- /dev/null +++ b/.github/workflows/issue-triage.lock.yml @@ -0,0 +1,1097 @@ +# gh-aw-metadata: {"schema_version":"v3","frontmatter_hash":"49f1529d95cbf3c8e3d0da1df4b6cee935245532511b98ca9ecd7a44f1d0bb68","compiler_version":"v0.71.5","agent_id":"copilot"} +# gh-aw-manifest: {"version":1,"secrets":["COPILOT_GITHUB_TOKEN","GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GITHUB_TOKEN","OPENAI_API_KEY"],"actions":[{"repo":"actions/checkout","sha":"de0fac2e4500dabe0009e67214ff5f5447ce83dd","version":"v6.0.2"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"},{"repo":"github/gh-aw-actions/setup","sha":"b8068426813005612b960b5ab0b8bd2c27142323","version":"v0.71.5"}],"containers":[{"image":"ghcr.io/github/github-mcp-server:v1.0.3","digest":"sha256:2ac27ef03461ef2b877031b838a7d1fd7f12b12d4ace7796d8cad91446d55959","pinned_image":"ghcr.io/github/github-mcp-server:v1.0.3@sha256:2ac27ef03461ef2b877031b838a7d1fd7f12b12d4ace7796d8cad91446d55959"},{"image":"node:lts-alpine","digest":"sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f","pinned_image":"node:lts-alpine@sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f"}]} +# ___ _ _ +# / _ \ | | (_) +# | |_| | __ _ ___ _ __ | |_ _ ___ +# | _ |/ _` |/ _ \ '_ \| __| |/ __| +# | | | | (_| | __/ | | | |_| | (__ +# \_| |_/\__, |\___|_| |_|\__|_|\___| +# __/ | +# _ _ |___/ +# | | | | / _| | +# | | | | ___ _ __ _ __| |_| | _____ ____ +# | |/\| |/ _ \ '__| |/ /| _| |/ _ \ \ /\ / / ___| +# \ /\ / (_) | | | | ( | | | | (_) \ V V /\__ \ +# \/ \/ \___/|_| |_|\_\|_| |_|\___/ \_/\_/ |___/ +# +# This file was automatically generated by gh-aw (v0.71.5). DO NOT EDIT. +# +# To update this file, edit the corresponding .md file and run: +# gh aw compile +# Not all edits will cause changes to this file. +# +# For more information: https://github.github.com/gh-aw/introduction/overview/ +# +# +# Secrets used: +# - COPILOT_GITHUB_TOKEN +# - GH_AW_GITHUB_MCP_SERVER_TOKEN +# - GH_AW_GITHUB_TOKEN +# - GITHUB_TOKEN +# - OPENAI_API_KEY +# +# Custom actions used: +# - actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 +# - actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 +# - actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 +# - actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 +# - github/gh-aw-actions/setup@b8068426813005612b960b5ab0b8bd2c27142323 # v0.71.5 +# +# Container images used: +# - ghcr.io/github/github-mcp-server:v1.0.3@sha256:2ac27ef03461ef2b877031b838a7d1fd7f12b12d4ace7796d8cad91446d55959 +# - node:lts-alpine@sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f + +name: "Issue 自动分类与回复" +"on": + issues: + types: + - opened + - reopened + +permissions: {} + +concurrency: + group: "gh-aw-${{ github.workflow }}-${{ github.event.issue.number || github.run_id }}" + +run-name: "Issue 自动分类与回复" + +jobs: + activation: + needs: pre_activation + if: needs.pre_activation.outputs.activated == 'true' + runs-on: ubuntu-slim + permissions: + actions: read + contents: read + outputs: + body: ${{ steps.sanitized.outputs.body }} + comment_id: "" + comment_repo: "" + engine_id: ${{ steps.generate_aw_info.outputs.engine_id }} + lockdown_check_failed: ${{ steps.generate_aw_info.outputs.lockdown_check_failed == 'true' }} + model: ${{ steps.generate_aw_info.outputs.model }} + setup-trace-id: ${{ steps.setup.outputs.trace-id }} + stale_lock_file_failed: ${{ steps.check-lock-file.outputs.stale_lock_file_failed == 'true' }} + text: ${{ steps.sanitized.outputs.text }} + title: ${{ steps.sanitized.outputs.title }} + steps: + - name: Setup Scripts + id: setup + uses: github/gh-aw-actions/setup@b8068426813005612b960b5ab0b8bd2c27142323 # v0.71.5 + with: + destination: ${{ runner.temp }}/gh-aw/actions + job-name: ${{ github.job }} + trace-id: ${{ needs.pre_activation.outputs.setup-trace-id }} + env: + GH_AW_SETUP_WORKFLOW_NAME: "Issue 自动分类与回复" + GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/issue-triage.lock.yml@${{ github.ref }} + GH_AW_INFO_VERSION: "1.0.40" + - name: Generate agentic run info + id: generate_aw_info + env: + GH_AW_INFO_ENGINE_ID: "copilot" + GH_AW_INFO_ENGINE_NAME: "GitHub Copilot CLI" + GH_AW_INFO_MODEL: ${{ vars.GH_AW_MODEL_AGENT_COPILOT || 'claude-sonnet-4.6' }} + GH_AW_INFO_VERSION: "1.0.40" + GH_AW_INFO_AGENT_VERSION: "1.0.40" + GH_AW_INFO_CLI_VERSION: "v0.71.5" + GH_AW_INFO_WORKFLOW_NAME: "Issue 自动分类与回复" + GH_AW_INFO_EXPERIMENTAL: "false" + GH_AW_INFO_SUPPORTS_TOOLS_ALLOWLIST: "true" + GH_AW_INFO_STAGED: "false" + GH_AW_INFO_ALLOWED_DOMAINS: '["defaults","ark.cn-beijing.volces.com"]' + GH_AW_INFO_FIREWALL_ENABLED: "false" + GH_AW_INFO_AWF_VERSION: "" + GH_AW_INFO_AWMG_VERSION: "" + GH_AW_INFO_FIREWALL_TYPE: "" + GH_AW_COMPILED_STRICT: "false" + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/generate_aw_info.cjs'); + await main(core, context); + - name: Checkout .github and .agents folders + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + persist-credentials: false + sparse-checkout: | + .github + .agents + .claude + .codex + .crush + .gemini + .opencode + .pi + sparse-checkout-cone-mode: true + fetch-depth: 1 + - name: Save agent config folders for base branch restoration + env: + GH_AW_AGENT_FOLDERS: ".agents .claude .codex .crush .gemini .github .opencode .pi" + GH_AW_AGENT_FILES: ".crush.json AGENTS.md CLAUDE.md GEMINI.md PI.md opencode.jsonc" + # poutine:ignore untrusted_checkout_exec + run: bash "${RUNNER_TEMP}/gh-aw/actions/save_base_github_folders.sh" + - name: Check workflow lock file + id: check-lock-file + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_WORKFLOW_FILE: "issue-triage.lock.yml" + GH_AW_CONTEXT_WORKFLOW_REF: "${{ github.workflow_ref }}" + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/check_workflow_timestamp_api.cjs'); + await main(); + - name: Check compile-agentic version + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_COMPILED_VERSION: "v0.71.5" + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/check_version_updates.cjs'); + await main(); + - name: Compute current body text + id: sanitized + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_ALLOWED_DOMAINS: "api.business.githubcopilot.com,api.enterprise.githubcopilot.com,api.github.com,api.githubcopilot.com,api.individual.githubcopilot.com,api.snapcraft.io,archive.ubuntu.com,ark.cn-beijing.volces.com,azure.archive.ubuntu.com,crl.geotrust.com,crl.globalsign.com,crl.identrust.com,crl.sectigo.com,crl.thawte.com,crl.usertrust.com,crl.verisign.com,crl3.digicert.com,crl4.digicert.com,crls.ssl.com,github.com,host.docker.internal,json-schema.org,json.schemastore.org,keyserver.ubuntu.com,ocsp.digicert.com,ocsp.geotrust.com,ocsp.globalsign.com,ocsp.identrust.com,ocsp.sectigo.com,ocsp.ssl.com,ocsp.thawte.com,ocsp.usertrust.com,ocsp.verisign.com,packagecloud.io,packages.cloud.google.com,packages.microsoft.com,ppa.launchpad.net,raw.githubusercontent.com,registry.npmjs.org,s.symcb.com,s.symcd.com,security.ubuntu.com,telemetry.enterprise.githubcopilot.com,ts-crl.ws.symantec.com,ts-ocsp.ws.symantec.com,www.googleapis.com" + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/compute_text.cjs'); + await main(); + - name: Create prompt with built-in context + env: + GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt + GH_AW_SAFE_OUTPUTS: ${{ runner.temp }}/gh-aw/safeoutputs/outputs.jsonl + GH_AW_GITHUB_ACTOR: ${{ github.actor }} + GH_AW_GITHUB_EVENT_COMMENT_ID: ${{ github.event.comment.id }} + GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER: ${{ github.event.discussion.number }} + GH_AW_GITHUB_EVENT_ISSUE_NUMBER: ${{ github.event.issue.number }} + GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER: ${{ github.event.pull_request.number }} + GH_AW_GITHUB_REPOSITORY: ${{ github.repository }} + GH_AW_GITHUB_RUN_ID: ${{ github.run_id }} + GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }} + # poutine:ignore untrusted_checkout_exec + run: | + bash "${RUNNER_TEMP}/gh-aw/actions/create_prompt_first.sh" + { + cat << 'GH_AW_PROMPT_1857816c8098cba9_EOF' + + GH_AW_PROMPT_1857816c8098cba9_EOF + cat "${RUNNER_TEMP}/gh-aw/prompts/xpia.md" + cat "${RUNNER_TEMP}/gh-aw/prompts/temp_folder_prompt.md" + cat "${RUNNER_TEMP}/gh-aw/prompts/markdown.md" + cat "${RUNNER_TEMP}/gh-aw/prompts/safe_outputs_prompt.md" + cat << 'GH_AW_PROMPT_1857816c8098cba9_EOF' + + Tools: add_comment, add_labels, missing_tool, missing_data, noop + + GH_AW_PROMPT_1857816c8098cba9_EOF + cat "${RUNNER_TEMP}/gh-aw/prompts/mcp_cli_tools_prompt.md" + cat << 'GH_AW_PROMPT_1857816c8098cba9_EOF' + + The following GitHub context information is available for this workflow: + {{#if __GH_AW_GITHUB_ACTOR__ }} + - **actor**: __GH_AW_GITHUB_ACTOR__ + {{/if}} + {{#if __GH_AW_GITHUB_REPOSITORY__ }} + - **repository**: __GH_AW_GITHUB_REPOSITORY__ + {{/if}} + {{#if __GH_AW_GITHUB_WORKSPACE__ }} + - **workspace**: __GH_AW_GITHUB_WORKSPACE__ + {{/if}} + {{#if __GH_AW_GITHUB_EVENT_ISSUE_NUMBER__ }} + - **issue-number**: #__GH_AW_GITHUB_EVENT_ISSUE_NUMBER__ + {{/if}} + {{#if __GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER__ }} + - **discussion-number**: #__GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER__ + {{/if}} + {{#if __GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER__ }} + - **pull-request-number**: #__GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER__ + {{/if}} + {{#if __GH_AW_GITHUB_EVENT_COMMENT_ID__ }} + - **comment-id**: __GH_AW_GITHUB_EVENT_COMMENT_ID__ + {{/if}} + {{#if __GH_AW_GITHUB_RUN_ID__ }} + - **workflow-run-id**: __GH_AW_GITHUB_RUN_ID__ + {{/if}} + + + GH_AW_PROMPT_1857816c8098cba9_EOF + cat "${RUNNER_TEMP}/gh-aw/prompts/github_mcp_tools_with_safeoutputs_prompt.md" + cat << 'GH_AW_PROMPT_1857816c8098cba9_EOF' + + {{#runtime-import .github/workflows/issue-triage.md}} + GH_AW_PROMPT_1857816c8098cba9_EOF + } > "$GH_AW_PROMPT" + - name: Interpolate variables and render templates + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt + GH_AW_ENGINE_ID: "copilot" + GH_AW_GITHUB_REPOSITORY: ${{ github.repository }} + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/interpolate_prompt.cjs'); + await main(); + - name: Substitute placeholders + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt + GH_AW_GITHUB_ACTOR: ${{ github.actor }} + GH_AW_GITHUB_EVENT_COMMENT_ID: ${{ github.event.comment.id }} + GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER: ${{ github.event.discussion.number }} + GH_AW_GITHUB_EVENT_ISSUE_NUMBER: ${{ github.event.issue.number }} + GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER: ${{ github.event.pull_request.number }} + GH_AW_GITHUB_REPOSITORY: ${{ github.repository }} + GH_AW_GITHUB_RUN_ID: ${{ github.run_id }} + GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }} + GH_AW_MCP_CLI_SERVERS_LIST: '- `safeoutputs` — run `safeoutputs --help` to see available tools' + GH_AW_NEEDS_PRE_ACTIVATION_OUTPUTS_ACTIVATED: ${{ needs.pre_activation.outputs.activated }} + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + + const substitutePlaceholders = require('${{ runner.temp }}/gh-aw/actions/substitute_placeholders.cjs'); + + // Call the substitution function + return await substitutePlaceholders({ + file: process.env.GH_AW_PROMPT, + substitutions: { + GH_AW_GITHUB_ACTOR: process.env.GH_AW_GITHUB_ACTOR, + GH_AW_GITHUB_EVENT_COMMENT_ID: process.env.GH_AW_GITHUB_EVENT_COMMENT_ID, + GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER: process.env.GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER, + GH_AW_GITHUB_EVENT_ISSUE_NUMBER: process.env.GH_AW_GITHUB_EVENT_ISSUE_NUMBER, + GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER: process.env.GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER, + GH_AW_GITHUB_REPOSITORY: process.env.GH_AW_GITHUB_REPOSITORY, + GH_AW_GITHUB_RUN_ID: process.env.GH_AW_GITHUB_RUN_ID, + GH_AW_GITHUB_WORKSPACE: process.env.GH_AW_GITHUB_WORKSPACE, + GH_AW_MCP_CLI_SERVERS_LIST: process.env.GH_AW_MCP_CLI_SERVERS_LIST, + GH_AW_NEEDS_PRE_ACTIVATION_OUTPUTS_ACTIVATED: process.env.GH_AW_NEEDS_PRE_ACTIVATION_OUTPUTS_ACTIVATED + } + }); + - name: Validate prompt placeholders + env: + GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt + # poutine:ignore untrusted_checkout_exec + run: bash "${RUNNER_TEMP}/gh-aw/actions/validate_prompt_placeholders.sh" + - name: Print prompt + env: + GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt + # poutine:ignore untrusted_checkout_exec + run: bash "${RUNNER_TEMP}/gh-aw/actions/print_prompt_summary.sh" + - name: Upload activation artifact + if: success() + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: activation + include-hidden-files: true + path: | + /tmp/gh-aw/aw_info.json + /tmp/gh-aw/aw-prompts/prompt.txt + /tmp/gh-aw/github_rate_limits.jsonl + /tmp/gh-aw/base + if-no-files-found: ignore + retention-days: 1 + + agent: + needs: activation + runs-on: ubuntu-latest + permissions: + contents: read + issues: read + pull-requests: read + env: + DEFAULT_BRANCH: ${{ github.event.repository.default_branch }} + GH_AW_ASSETS_ALLOWED_EXTS: "" + GH_AW_ASSETS_BRANCH: "" + GH_AW_ASSETS_MAX_SIZE_KB: 0 + GH_AW_MCP_LOG_DIR: /tmp/gh-aw/mcp-logs/safeoutputs + GH_AW_WORKFLOW_ID_SANITIZED: issuetriage + outputs: + agentic_engine_timeout: ${{ steps.detect-copilot-errors.outputs.agentic_engine_timeout || 'false' }} + checkout_pr_success: ${{ steps.checkout-pr.outputs.checkout_pr_success || 'true' }} + effective_tokens: ${{ steps.parse-mcp-gateway.outputs.effective_tokens }} + has_patch: ${{ steps.collect_output.outputs.has_patch }} + inference_access_error: ${{ steps.detect-copilot-errors.outputs.inference_access_error || 'false' }} + mcp_policy_error: ${{ steps.detect-copilot-errors.outputs.mcp_policy_error || 'false' }} + model: ${{ needs.activation.outputs.model }} + model_not_supported_error: ${{ steps.detect-copilot-errors.outputs.model_not_supported_error || 'false' }} + output: ${{ steps.collect_output.outputs.output }} + output_types: ${{ steps.collect_output.outputs.output_types }} + setup-trace-id: ${{ steps.setup.outputs.trace-id }} + steps: + - name: Setup Scripts + id: setup + uses: github/gh-aw-actions/setup@b8068426813005612b960b5ab0b8bd2c27142323 # v0.71.5 + with: + destination: ${{ runner.temp }}/gh-aw/actions + job-name: ${{ github.job }} + trace-id: ${{ needs.activation.outputs.setup-trace-id }} + env: + GH_AW_SETUP_WORKFLOW_NAME: "Issue 自动分类与回复" + GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/issue-triage.lock.yml@${{ github.ref }} + GH_AW_INFO_VERSION: "1.0.40" + - name: Set runtime paths + id: set-runtime-paths + run: | + { + echo "GH_AW_SAFE_OUTPUTS=${RUNNER_TEMP}/gh-aw/safeoutputs/outputs.jsonl" + echo "GH_AW_SAFE_OUTPUTS_CONFIG_PATH=${RUNNER_TEMP}/gh-aw/safeoutputs/config.json" + echo "GH_AW_SAFE_OUTPUTS_TOOLS_PATH=${RUNNER_TEMP}/gh-aw/safeoutputs/tools.json" + } >> "$GITHUB_OUTPUT" + - name: Checkout repository + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + persist-credentials: false + - name: Create gh-aw temp directory + run: bash "${RUNNER_TEMP}/gh-aw/actions/create_gh_aw_tmp_dir.sh" + - name: Configure gh CLI for GitHub Enterprise + run: bash "${RUNNER_TEMP}/gh-aw/actions/configure_gh_for_ghe.sh" + env: + GH_TOKEN: ${{ github.token }} + - name: Configure Git credentials + env: + REPO_NAME: ${{ github.repository }} + SERVER_URL: ${{ github.server_url }} + GITHUB_TOKEN: ${{ github.token }} + run: | + git config --global user.email "github-actions[bot]@users.noreply.github.com" + git config --global user.name "github-actions[bot]" + git config --global am.keepcr true + # Re-authenticate git with GitHub token + SERVER_URL_STRIPPED="${SERVER_URL#https://}" + git remote set-url origin "https://x-access-token:${GITHUB_TOKEN}@${SERVER_URL_STRIPPED}/${REPO_NAME}.git" + echo "Git configured with standard GitHub Actions identity" + - name: Checkout PR branch + id: checkout-pr + if: | + github.event.pull_request || github.event.issue.pull_request + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + with: + github-token: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/checkout_pr_branch.cjs'); + await main(); + - name: Install GitHub Copilot CLI + run: bash "${RUNNER_TEMP}/gh-aw/actions/install_copilot_cli.sh" 1.0.40 + env: + GH_HOST: github.com + - name: Parse integrity filter lists + id: parse-guard-vars + env: + GH_AW_BLOCKED_USERS_VAR: ${{ vars.GH_AW_GITHUB_BLOCKED_USERS || '' }} + GH_AW_TRUSTED_USERS_VAR: ${{ vars.GH_AW_GITHUB_TRUSTED_USERS || '' }} + GH_AW_APPROVAL_LABELS_VAR: ${{ vars.GH_AW_GITHUB_APPROVAL_LABELS || '' }} + run: bash "${RUNNER_TEMP}/gh-aw/actions/parse_guard_list.sh" + - name: Download activation artifact + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + name: activation + path: /tmp/gh-aw + - name: Restore agent config folders from base branch + if: steps.checkout-pr.outcome == 'success' + env: + GH_AW_AGENT_FOLDERS: ".agents .claude .codex .crush .gemini .github .opencode .pi" + GH_AW_AGENT_FILES: ".crush.json AGENTS.md CLAUDE.md GEMINI.md PI.md opencode.jsonc" + run: bash "${RUNNER_TEMP}/gh-aw/actions/restore_base_github_folders.sh" + - name: Download container images + run: bash "${RUNNER_TEMP}/gh-aw/actions/download_docker_images.sh" ghcr.io/github/github-mcp-server:v1.0.3@sha256:2ac27ef03461ef2b877031b838a7d1fd7f12b12d4ace7796d8cad91446d55959 node:lts-alpine@sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f + - name: Generate Safe Outputs Config + run: | + mkdir -p "${RUNNER_TEMP}/gh-aw/safeoutputs" + mkdir -p /tmp/gh-aw/safeoutputs + mkdir -p /tmp/gh-aw/mcp-logs/safeoutputs + cat > "${RUNNER_TEMP}/gh-aw/safeoutputs/config.json" << 'GH_AW_SAFE_OUTPUTS_CONFIG_18efef56cd5f6986_EOF' + {"add_comment":{"max":1},"add_labels":{"allowed":["bug","feature","enhancement","documentation","question","duplicate","invalid"]},"create_report_incomplete_issue":{},"missing_data":{},"missing_tool":{},"noop":{"max":1,"report-as-issue":"true"},"report_incomplete":{}} + GH_AW_SAFE_OUTPUTS_CONFIG_18efef56cd5f6986_EOF + - name: Generate Safe Outputs Tools + env: + GH_AW_TOOLS_META_JSON: | + { + "description_suffixes": { + "add_comment": " CONSTRAINTS: Maximum 1 comment(s) can be added. Supports reply_to_id for discussion threading.", + "add_labels": " CONSTRAINTS: Only these labels are allowed: [\"bug\" \"feature\" \"enhancement\" \"documentation\" \"question\" \"duplicate\" \"invalid\"]." + }, + "repo_params": {}, + "dynamic_tools": [] + } + GH_AW_VALIDATION_JSON: | + { + "add_comment": { + "defaultMax": 1, + "fields": { + "body": { + "required": true, + "type": "string", + "sanitize": true, + "maxLength": 65000 + }, + "item_number": { + "issueOrPRNumber": true + }, + "reply_to_id": { + "type": "string", + "maxLength": 256 + }, + "repo": { + "type": "string", + "maxLength": 256 + } + } + }, + "add_labels": { + "defaultMax": 5, + "fields": { + "item_number": { + "issueNumberOrTemporaryId": true + }, + "labels": { + "required": true, + "type": "array", + "itemType": "string", + "itemSanitize": true, + "itemMaxLength": 128 + }, + "repo": { + "type": "string", + "maxLength": 256 + } + } + }, + "missing_data": { + "defaultMax": 20, + "fields": { + "alternatives": { + "type": "string", + "sanitize": true, + "maxLength": 256 + }, + "context": { + "type": "string", + "sanitize": true, + "maxLength": 256 + }, + "data_type": { + "type": "string", + "sanitize": true, + "maxLength": 128 + }, + "reason": { + "type": "string", + "sanitize": true, + "maxLength": 256 + } + } + }, + "missing_tool": { + "defaultMax": 20, + "fields": { + "alternatives": { + "type": "string", + "sanitize": true, + "maxLength": 512 + }, + "reason": { + "required": true, + "type": "string", + "sanitize": true, + "maxLength": 256 + }, + "tool": { + "type": "string", + "sanitize": true, + "maxLength": 128 + } + } + }, + "noop": { + "defaultMax": 1, + "fields": { + "message": { + "required": true, + "type": "string", + "sanitize": true, + "maxLength": 65000 + } + } + }, + "report_incomplete": { + "defaultMax": 5, + "fields": { + "details": { + "type": "string", + "sanitize": true, + "maxLength": 65000 + }, + "reason": { + "required": true, + "type": "string", + "sanitize": true, + "maxLength": 1024 + } + } + } + } + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/generate_safe_outputs_tools.cjs'); + await main(); + - name: Generate Safe Outputs MCP Server Config + id: safe-outputs-config + run: | + # Generate a secure random API key (360 bits of entropy, 40+ chars) + # Mask immediately to prevent timing vulnerabilities + API_KEY=$(openssl rand -base64 45 | tr -d '/+=') + echo "::add-mask::${API_KEY}" + + PORT=3001 + + # Set outputs for next steps + { + echo "safe_outputs_api_key=${API_KEY}" + echo "safe_outputs_port=${PORT}" + } >> "$GITHUB_OUTPUT" + + echo "Safe Outputs MCP server will run on port ${PORT}" + + - name: Start Safe Outputs MCP HTTP Server + id: safe-outputs-start + env: + DEBUG: '*' + GH_AW_SAFE_OUTPUTS: ${{ steps.set-runtime-paths.outputs.GH_AW_SAFE_OUTPUTS }} + GH_AW_SAFE_OUTPUTS_PORT: ${{ steps.safe-outputs-config.outputs.safe_outputs_port }} + GH_AW_SAFE_OUTPUTS_API_KEY: ${{ steps.safe-outputs-config.outputs.safe_outputs_api_key }} + GH_AW_SAFE_OUTPUTS_TOOLS_PATH: ${{ runner.temp }}/gh-aw/safeoutputs/tools.json + GH_AW_SAFE_OUTPUTS_CONFIG_PATH: ${{ runner.temp }}/gh-aw/safeoutputs/config.json + GH_AW_MCP_LOG_DIR: /tmp/gh-aw/mcp-logs/safeoutputs + run: | + # Environment variables are set above to prevent template injection + export DEBUG + export GH_AW_SAFE_OUTPUTS + export GH_AW_SAFE_OUTPUTS_PORT + export GH_AW_SAFE_OUTPUTS_API_KEY + export GH_AW_SAFE_OUTPUTS_TOOLS_PATH + export GH_AW_SAFE_OUTPUTS_CONFIG_PATH + export GH_AW_MCP_LOG_DIR + + bash "${RUNNER_TEMP}/gh-aw/actions/start_safe_outputs_server.sh" + + - name: Start MCP Gateway + id: start-mcp-gateway + env: + GH_AW_SAFE_OUTPUTS: ${{ steps.set-runtime-paths.outputs.GH_AW_SAFE_OUTPUTS }} + GH_AW_SAFE_OUTPUTS_API_KEY: ${{ steps.safe-outputs-start.outputs.api_key }} + GH_AW_SAFE_OUTPUTS_PORT: ${{ steps.safe-outputs-start.outputs.port }} + GITHUB_MCP_SERVER_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + run: | + set -eo pipefail + mkdir -p "${RUNNER_TEMP}/gh-aw/mcp-config" + + # Export gateway environment variables for MCP config and gateway script + export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_DOMAIN="localhost" + export MCP_GATEWAY_HOST_DOMAIN="localhost" + MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') + echo "::add-mask::${MCP_GATEWAY_API_KEY}" + export MCP_GATEWAY_API_KEY + export MCP_GATEWAY_PAYLOAD_DIR="/tmp/gh-aw/mcp-payloads" + mkdir -p "${MCP_GATEWAY_PAYLOAD_DIR}" + export MCP_GATEWAY_PAYLOAD_SIZE_THRESHOLD="524288" + export DEBUG="*" + + export GH_AW_ENGINE="copilot" + MCP_GATEWAY_UID=$(id -u 2>/dev/null || echo '0') + MCP_GATEWAY_GID=$(id -g 2>/dev/null || echo '0') + DOCKER_SOCK_GID=$(stat -c '%g' /var/run/docker.sock 2>/dev/null || echo '0') + export MCP_GATEWAY_DOCKER_COMMAND='docker run -i --rm --network host --add-host host.docker.internal:127.0.0.1 --user '"${MCP_GATEWAY_UID}"':'"${MCP_GATEWAY_GID}"' --group-add '"${DOCKER_SOCK_GID}"' -v /var/run/docker.sock:/var/run/docker.sock -e MCP_GATEWAY_PORT -e MCP_GATEWAY_DOMAIN -e MCP_GATEWAY_API_KEY -e MCP_GATEWAY_PAYLOAD_DIR -e MCP_GATEWAY_PAYLOAD_SIZE_THRESHOLD -e DEBUG -e MCP_GATEWAY_LOG_DIR -e GH_AW_MCP_LOG_DIR -e GH_AW_SAFE_OUTPUTS -e GH_AW_SAFE_OUTPUTS_CONFIG_PATH -e GH_AW_SAFE_OUTPUTS_TOOLS_PATH -e GH_AW_ASSETS_BRANCH -e GH_AW_ASSETS_MAX_SIZE_KB -e GH_AW_ASSETS_ALLOWED_EXTS -e DEFAULT_BRANCH -e GITHUB_MCP_SERVER_TOKEN -e GITHUB_MCP_GUARD_MIN_INTEGRITY -e GITHUB_MCP_GUARD_REPOS -e GITHUB_REPOSITORY -e GITHUB_SERVER_URL -e GITHUB_SHA -e GITHUB_WORKSPACE -e GITHUB_TOKEN -e GITHUB_RUN_ID -e GITHUB_RUN_NUMBER -e GITHUB_RUN_ATTEMPT -e GITHUB_JOB -e GITHUB_ACTION -e GITHUB_EVENT_NAME -e GITHUB_EVENT_PATH -e GITHUB_ACTOR -e GITHUB_ACTOR_ID -e GITHUB_TRIGGERING_ACTOR -e GITHUB_WORKFLOW -e GITHUB_WORKFLOW_REF -e GITHUB_WORKFLOW_SHA -e GITHUB_REF -e GITHUB_REF_NAME -e GITHUB_REF_TYPE -e GITHUB_HEAD_REF -e GITHUB_BASE_REF -e GH_AW_SAFE_OUTPUTS_PORT -e GH_AW_SAFE_OUTPUTS_API_KEY -v /tmp/gh-aw/mcp-payloads:/tmp/gh-aw/mcp-payloads:rw -v /opt:/opt:ro -v /tmp:/tmp:rw -v '"${GITHUB_WORKSPACE}"':'"${GITHUB_WORKSPACE}"':rw ghcr.io/github/gh-aw-mcpg:v0.3.6' + + mkdir -p /home/runner/.copilot + GH_AW_NODE=$(which node 2>/dev/null || command -v node 2>/dev/null || echo node) + cat << GH_AW_MCP_CONFIG_0138aecd21cfde50_EOF | "$GH_AW_NODE" "${RUNNER_TEMP}/gh-aw/actions/start_mcp_gateway.cjs" + { + "mcpServers": { + "github": { + "type": "stdio", + "container": "ghcr.io/github/github-mcp-server:v1.0.3", + "env": { + "GITHUB_HOST": "\${GITHUB_SERVER_URL}", + "GITHUB_PERSONAL_ACCESS_TOKEN": "\${GITHUB_MCP_SERVER_TOKEN}", + "GITHUB_READ_ONLY": "1", + "GITHUB_TOOLSETS": "context,repos,issues,pull_requests" + }, + "guard-policies": { + "allow-only": { + "approval-labels": ${{ steps.parse-guard-vars.outputs.approval_labels }}, + "blocked-users": ${{ steps.parse-guard-vars.outputs.blocked_users }}, + "min-integrity": "none", + "repos": "all", + "trusted-users": ${{ steps.parse-guard-vars.outputs.trusted_users }} + } + } + }, + "safeoutputs": { + "type": "http", + "url": "http://localhost:$GH_AW_SAFE_OUTPUTS_PORT", + "headers": { + "Authorization": "\${GH_AW_SAFE_OUTPUTS_API_KEY}" + }, + "guard-policies": { + "write-sink": { + "accept": [ + "*" + ] + } + } + } + }, + "gateway": { + "port": $MCP_GATEWAY_PORT, + "domain": "${MCP_GATEWAY_DOMAIN}", + "apiKey": "${MCP_GATEWAY_API_KEY}", + "payloadDir": "${MCP_GATEWAY_PAYLOAD_DIR}" + } + } + GH_AW_MCP_CONFIG_0138aecd21cfde50_EOF + - name: Mount MCP servers as CLIs + id: mount-mcp-clis + continue-on-error: true + env: + MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} + MCP_GATEWAY_DOMAIN: ${{ steps.start-mcp-gateway.outputs.gateway-domain }} + MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io); + const { main } = require('${{ runner.temp }}/gh-aw/actions/mount_mcp_as_cli.cjs'); + await main(); + - name: Clean credentials + continue-on-error: true + run: bash "${RUNNER_TEMP}/gh-aw/actions/clean_git_credentials.sh" + - name: Audit pre-agent workspace + id: pre_agent_audit + continue-on-error: true + run: bash "${RUNNER_TEMP}/gh-aw/actions/audit_pre_agent_workspace.sh" + - name: Execute GitHub Copilot CLI + id: agentic_execution + # Copilot CLI tool arguments (sorted): + # --allow-tool github + # --allow-tool safeoutputs + timeout-minutes: 20 + run: | + set -o pipefail + touch /tmp/gh-aw/agent-step-summary.md + (umask 177 && touch /tmp/gh-aw/agent-stdio.log) + mkdir -p /tmp/ + mkdir -p /tmp/gh-aw/ + mkdir -p /tmp/gh-aw/agent/ + mkdir -p /tmp/gh-aw/sandbox/agent/logs/ + GH_AW_NODE_EXEC="${GH_AW_NODE_BIN:-}"; if [ -z "$GH_AW_NODE_EXEC" ] || [ ! -x "$GH_AW_NODE_EXEC" ]; then GH_AW_NODE_EXEC="$(command -v node 2>/dev/null || echo node)"; fi; "$GH_AW_NODE_EXEC" ${RUNNER_TEMP}/gh-aw/actions/copilot_harness.cjs copilot --add-dir /tmp/ --add-dir /tmp/gh-aw/ --add-dir /tmp/gh-aw/agent/ --log-level all --log-dir /tmp/gh-aw/sandbox/agent/logs/ --disable-builtin-mcps --no-ask-user --allow-tool github --allow-tool safeoutputs --prompt-file /tmp/gh-aw/aw-prompts/prompt.txt 2>&1 | tee /tmp/gh-aw/agent-stdio.log + env: + COPILOT_AGENT_RUNNER_TYPE: STANDALONE + COPILOT_API_KEY: dummy-byok-key-for-offline-mode + COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }} + COPILOT_MODEL: doubao-seed-2-0-code-preview-260215 + COPILOT_PROVIDER_API_KEY: ${{ secrets.OPENAI_API_KEY }} + COPILOT_PROVIDER_BASE_URL: https://ark.cn-beijing.volces.com/api/v3 + COPILOT_PROVIDER_TYPE: openai + GH_AW_MCP_CONFIG: /home/runner/.copilot/mcp-config.json + GH_AW_PHASE: agent + GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt + GH_AW_SAFE_OUTPUTS: ${{ steps.set-runtime-paths.outputs.GH_AW_SAFE_OUTPUTS }} + GH_AW_VERSION: v0.71.5 + GITHUB_API_URL: ${{ github.api_url }} + GITHUB_AW: true + GITHUB_COPILOT_INTEGRATION_ID: agentic-workflows + GITHUB_HEAD_REF: ${{ github.head_ref }} + GITHUB_MCP_SERVER_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + GITHUB_REF_NAME: ${{ github.ref_name }} + GITHUB_SERVER_URL: ${{ github.server_url }} + GITHUB_STEP_SUMMARY: /tmp/gh-aw/agent-step-summary.md + GITHUB_WORKSPACE: ${{ github.workspace }} + XDG_CONFIG_HOME: /home/runner + - name: Detect Copilot errors + id: detect-copilot-errors + if: always() + continue-on-error: true + run: node "${RUNNER_TEMP}/gh-aw/actions/detect_copilot_errors.cjs" + - name: Configure Git credentials + env: + REPO_NAME: ${{ github.repository }} + SERVER_URL: ${{ github.server_url }} + GITHUB_TOKEN: ${{ github.token }} + run: | + git config --global user.email "github-actions[bot]@users.noreply.github.com" + git config --global user.name "github-actions[bot]" + git config --global am.keepcr true + # Re-authenticate git with GitHub token + SERVER_URL_STRIPPED="${SERVER_URL#https://}" + git remote set-url origin "https://x-access-token:${GITHUB_TOKEN}@${SERVER_URL_STRIPPED}/${REPO_NAME}.git" + echo "Git configured with standard GitHub Actions identity" + - name: Copy Copilot session state files to logs + if: always() + continue-on-error: true + run: bash "${RUNNER_TEMP}/gh-aw/actions/copy_copilot_session_state.sh" + - name: Stop MCP Gateway + if: always() + continue-on-error: true + env: + MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} + GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} + run: | + bash "${RUNNER_TEMP}/gh-aw/actions/stop_mcp_gateway.sh" "$GATEWAY_PID" + - name: Redact secrets in logs + if: always() + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/redact_secrets.cjs'); + await main(); + env: + GH_AW_SECRET_NAMES: 'COPILOT_GITHUB_TOKEN,GH_AW_GITHUB_MCP_SERVER_TOKEN,GH_AW_GITHUB_TOKEN,GITHUB_TOKEN,OPENAI_API_KEY' + SECRET_COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }} + SECRET_GH_AW_GITHUB_MCP_SERVER_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN }} + SECRET_GH_AW_GITHUB_TOKEN: ${{ secrets.GH_AW_GITHUB_TOKEN }} + SECRET_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + SECRET_OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} + - name: Append agent step summary + if: always() + run: bash "${RUNNER_TEMP}/gh-aw/actions/append_agent_step_summary.sh" + - name: Copy Safe Outputs + if: always() + env: + GH_AW_SAFE_OUTPUTS: ${{ steps.set-runtime-paths.outputs.GH_AW_SAFE_OUTPUTS }} + run: | + mkdir -p /tmp/gh-aw + cp "$GH_AW_SAFE_OUTPUTS" /tmp/gh-aw/safeoutputs.jsonl 2>/dev/null || true + - name: Ingest agent output + id: collect_output + if: always() + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_SAFE_OUTPUTS: ${{ steps.set-runtime-paths.outputs.GH_AW_SAFE_OUTPUTS }} + GH_AW_ALLOWED_DOMAINS: "api.business.githubcopilot.com,api.enterprise.githubcopilot.com,api.github.com,api.githubcopilot.com,api.individual.githubcopilot.com,api.snapcraft.io,archive.ubuntu.com,ark.cn-beijing.volces.com,azure.archive.ubuntu.com,crl.geotrust.com,crl.globalsign.com,crl.identrust.com,crl.sectigo.com,crl.thawte.com,crl.usertrust.com,crl.verisign.com,crl3.digicert.com,crl4.digicert.com,crls.ssl.com,github.com,host.docker.internal,json-schema.org,json.schemastore.org,keyserver.ubuntu.com,ocsp.digicert.com,ocsp.geotrust.com,ocsp.globalsign.com,ocsp.identrust.com,ocsp.sectigo.com,ocsp.ssl.com,ocsp.thawte.com,ocsp.usertrust.com,ocsp.verisign.com,packagecloud.io,packages.cloud.google.com,packages.microsoft.com,ppa.launchpad.net,raw.githubusercontent.com,registry.npmjs.org,s.symcb.com,s.symcd.com,security.ubuntu.com,telemetry.enterprise.githubcopilot.com,ts-crl.ws.symantec.com,ts-ocsp.ws.symantec.com,www.googleapis.com" + GITHUB_SERVER_URL: ${{ github.server_url }} + GITHUB_API_URL: ${{ github.api_url }} + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/collect_ndjson_output.cjs'); + await main(); + - name: Parse agent logs for step summary + if: always() + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_AGENT_OUTPUT: /tmp/gh-aw/sandbox/agent/logs/ + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/parse_copilot_log.cjs'); + await main(); + - name: Parse MCP Gateway logs for step summary + if: always() + id: parse-mcp-gateway + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/parse_mcp_gateway_log.cjs'); + await main(); + - name: Write agent output placeholder if missing + if: always() + run: | + if [ ! -f /tmp/gh-aw/agent_output.json ]; then + echo '{"items":[]}' > /tmp/gh-aw/agent_output.json + fi + - name: Upload agent artifacts + if: always() + continue-on-error: true + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: agent + path: | + /tmp/gh-aw/aw-prompts/prompt.txt + /tmp/gh-aw/sandbox/agent/logs/ + /tmp/gh-aw/redacted-urls.log + /tmp/gh-aw/mcp-logs/ + /tmp/gh-aw/proxy-logs/ + !/tmp/gh-aw/proxy-logs/proxy-tls/ + /tmp/gh-aw/agent-stdio.log + /tmp/gh-aw/pre-agent-audit.txt + /tmp/gh-aw/agent/ + /tmp/gh-aw/github_rate_limits.jsonl + /tmp/gh-aw/safeoutputs.jsonl + /tmp/gh-aw/agent_output.json + if-no-files-found: ignore + + conclusion: + needs: + - activation + - agent + - safe_outputs + if: > + always() && (needs.agent.result != 'skipped' || needs.activation.outputs.lockdown_check_failed == 'true' || + needs.activation.outputs.stale_lock_file_failed == 'true') + runs-on: ubuntu-slim + permissions: + contents: read + discussions: write + issues: write + pull-requests: write + concurrency: + group: "gh-aw-conclusion-issue-triage" + cancel-in-progress: false + outputs: + incomplete_count: ${{ steps.report_incomplete.outputs.incomplete_count }} + noop_message: ${{ steps.noop.outputs.noop_message }} + tools_reported: ${{ steps.missing_tool.outputs.tools_reported }} + total_count: ${{ steps.missing_tool.outputs.total_count }} + steps: + - name: Setup Scripts + id: setup + uses: github/gh-aw-actions/setup@b8068426813005612b960b5ab0b8bd2c27142323 # v0.71.5 + with: + destination: ${{ runner.temp }}/gh-aw/actions + job-name: ${{ github.job }} + trace-id: ${{ needs.activation.outputs.setup-trace-id }} + env: + GH_AW_SETUP_WORKFLOW_NAME: "Issue 自动分类与回复" + GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/issue-triage.lock.yml@${{ github.ref }} + GH_AW_INFO_VERSION: "1.0.40" + - name: Download agent output artifact + id: download-agent-output + continue-on-error: true + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + name: agent + path: /tmp/gh-aw/ + - name: Setup agent output environment variable + id: setup-agent-output-env + if: steps.download-agent-output.outcome == 'success' + run: | + mkdir -p /tmp/gh-aw/ + find "/tmp/gh-aw/" -type f -print + echo "GH_AW_AGENT_OUTPUT=/tmp/gh-aw/agent_output.json" >> "$GITHUB_OUTPUT" + - name: Process no-op messages + id: noop + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }} + GH_AW_NOOP_MAX: "1" + GH_AW_WORKFLOW_NAME: "Issue 自动分类与回复" + GH_AW_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} + GH_AW_AGENT_CONCLUSION: ${{ needs.agent.result }} + GH_AW_NOOP_REPORT_AS_ISSUE: "true" + with: + github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_noop_message.cjs'); + await main(); + - name: Record missing tool + id: missing_tool + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }} + GH_AW_MISSING_TOOL_CREATE_ISSUE: "true" + GH_AW_WORKFLOW_NAME: "Issue 自动分类与回复" + with: + github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/missing_tool.cjs'); + await main(); + - name: Record incomplete + id: report_incomplete + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }} + GH_AW_REPORT_INCOMPLETE_CREATE_ISSUE: "true" + GH_AW_WORKFLOW_NAME: "Issue 自动分类与回复" + with: + github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/report_incomplete_handler.cjs'); + await main(); + - name: Handle agent failure + id: handle_agent_failure + if: always() + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }} + GH_AW_WORKFLOW_NAME: "Issue 自动分类与回复" + GH_AW_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} + GH_AW_AGENT_CONCLUSION: ${{ needs.agent.result }} + GH_AW_WORKFLOW_ID: "issue-triage" + GH_AW_ACTION_FAILURE_ISSUE_EXPIRES_HOURS: "168" + GH_AW_ENGINE_ID: "copilot" + GH_AW_CHECKOUT_PR_SUCCESS: ${{ needs.agent.outputs.checkout_pr_success }} + GH_AW_INFERENCE_ACCESS_ERROR: ${{ needs.agent.outputs.inference_access_error }} + GH_AW_MCP_POLICY_ERROR: ${{ needs.agent.outputs.mcp_policy_error }} + GH_AW_AGENTIC_ENGINE_TIMEOUT: ${{ needs.agent.outputs.agentic_engine_timeout }} + GH_AW_MODEL_NOT_SUPPORTED_ERROR: ${{ needs.agent.outputs.model_not_supported_error }} + GH_AW_ENGINE_API_HOSTS: "api.enterprise.githubcopilot.com,api.githubcopilot.com,api.business.githubcopilot.com,api.individual.githubcopilot.com" + GH_AW_LOCKDOWN_CHECK_FAILED: ${{ needs.activation.outputs.lockdown_check_failed }} + GH_AW_STALE_LOCK_FILE_FAILED: ${{ needs.activation.outputs.stale_lock_file_failed }} + GH_AW_GROUP_REPORTS: "false" + GH_AW_FAILURE_REPORT_AS_ISSUE: "true" + GH_AW_MISSING_TOOL_REPORT_AS_FAILURE: "true" + GH_AW_MISSING_DATA_REPORT_AS_FAILURE: "true" + GH_AW_TIMEOUT_MINUTES: "20" + with: + github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); + await main(); + + pre_activation: + runs-on: ubuntu-slim + outputs: + activated: ${{ steps.check_membership.outputs.is_team_member == 'true' }} + matched_command: '' + setup-trace-id: ${{ steps.setup.outputs.trace-id }} + steps: + - name: Setup Scripts + id: setup + uses: github/gh-aw-actions/setup@b8068426813005612b960b5ab0b8bd2c27142323 # v0.71.5 + with: + destination: ${{ runner.temp }}/gh-aw/actions + job-name: ${{ github.job }} + env: + GH_AW_SETUP_WORKFLOW_NAME: "Issue 自动分类与回复" + GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/issue-triage.lock.yml@${{ github.ref }} + GH_AW_INFO_VERSION: "1.0.40" + - name: Check team membership for workflow + id: check_membership + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_REQUIRED_ROLES: "admin,maintainer,write" + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/check_membership.cjs'); + await main(); + + safe_outputs: + needs: + - activation + - agent + if: (!cancelled()) && needs.agent.result != 'skipped' + runs-on: ubuntu-slim + permissions: + contents: read + discussions: write + issues: write + pull-requests: write + timeout-minutes: 15 + env: + GH_AW_CALLER_WORKFLOW_ID: "${{ github.repository }}/issue-triage" + GH_AW_EFFECTIVE_TOKENS: ${{ needs.agent.outputs.effective_tokens }} + GH_AW_ENGINE_ID: "copilot" + GH_AW_ENGINE_MODEL: ${{ needs.agent.outputs.model }} + GH_AW_ENGINE_VERSION: "1.0.40" + GH_AW_WORKFLOW_ID: "issue-triage" + GH_AW_WORKFLOW_NAME: "Issue 自动分类与回复" + outputs: + code_push_failure_count: ${{ steps.process_safe_outputs.outputs.code_push_failure_count }} + code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} + comment_id: ${{ steps.process_safe_outputs.outputs.comment_id }} + comment_url: ${{ steps.process_safe_outputs.outputs.comment_url }} + create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} + create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} + process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} + steps: + - name: Setup Scripts + id: setup + uses: github/gh-aw-actions/setup@b8068426813005612b960b5ab0b8bd2c27142323 # v0.71.5 + with: + destination: ${{ runner.temp }}/gh-aw/actions + job-name: ${{ github.job }} + trace-id: ${{ needs.activation.outputs.setup-trace-id }} + env: + GH_AW_SETUP_WORKFLOW_NAME: "Issue 自动分类与回复" + GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/issue-triage.lock.yml@${{ github.ref }} + GH_AW_INFO_VERSION: "1.0.40" + - name: Download agent output artifact + id: download-agent-output + continue-on-error: true + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + name: agent + path: /tmp/gh-aw/ + - name: Setup agent output environment variable + id: setup-agent-output-env + if: steps.download-agent-output.outcome == 'success' + run: | + mkdir -p /tmp/gh-aw/ + find "/tmp/gh-aw/" -type f -print + echo "GH_AW_AGENT_OUTPUT=/tmp/gh-aw/agent_output.json" >> "$GITHUB_OUTPUT" + - name: Configure GH_HOST for enterprise compatibility + id: ghes-host-config + shell: bash + run: | + # Derive GH_HOST from GITHUB_SERVER_URL so the gh CLI targets the correct + # GitHub instance (GHES/GHEC). On github.com this is a harmless no-op. + GH_HOST="${GITHUB_SERVER_URL#https://}" + GH_HOST="${GH_HOST#http://}" + echo "GH_HOST=${GH_HOST}" >> "$GITHUB_ENV" + - name: Process Safe Outputs + id: process_safe_outputs + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }} + GH_AW_ALLOWED_DOMAINS: "api.business.githubcopilot.com,api.enterprise.githubcopilot.com,api.github.com,api.githubcopilot.com,api.individual.githubcopilot.com,api.snapcraft.io,archive.ubuntu.com,ark.cn-beijing.volces.com,azure.archive.ubuntu.com,crl.geotrust.com,crl.globalsign.com,crl.identrust.com,crl.sectigo.com,crl.thawte.com,crl.usertrust.com,crl.verisign.com,crl3.digicert.com,crl4.digicert.com,crls.ssl.com,github.com,host.docker.internal,json-schema.org,json.schemastore.org,keyserver.ubuntu.com,ocsp.digicert.com,ocsp.geotrust.com,ocsp.globalsign.com,ocsp.identrust.com,ocsp.sectigo.com,ocsp.ssl.com,ocsp.thawte.com,ocsp.usertrust.com,ocsp.verisign.com,packagecloud.io,packages.cloud.google.com,packages.microsoft.com,ppa.launchpad.net,raw.githubusercontent.com,registry.npmjs.org,s.symcb.com,s.symcd.com,security.ubuntu.com,telemetry.enterprise.githubcopilot.com,ts-crl.ws.symantec.com,ts-ocsp.ws.symantec.com,www.googleapis.com" + GITHUB_SERVER_URL: ${{ github.server_url }} + GITHUB_API_URL: ${{ github.api_url }} + GH_AW_SAFE_OUTPUTS_HANDLER_CONFIG: "{\"add_comment\":{\"max\":1},\"add_labels\":{\"allowed\":[\"bug\",\"feature\",\"enhancement\",\"documentation\",\"question\",\"duplicate\",\"invalid\"]},\"create_report_incomplete_issue\":{},\"missing_data\":{},\"missing_tool\":{},\"noop\":{\"max\":1,\"report-as-issue\":\"true\"},\"report_incomplete\":{}}" + with: + github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/safe_output_handler_manager.cjs'); + await main(); + - name: Upload Safe Outputs Items + if: always() + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: safe-outputs-items + path: | + /tmp/gh-aw/safe-output-items.jsonl + /tmp/gh-aw/temporary-id-map.json + if-no-files-found: ignore + diff --git a/.github/workflows/issue-triage.md b/.github/workflows/issue-triage.md new file mode 100644 index 0000000..f384730 --- /dev/null +++ b/.github/workflows/issue-triage.md @@ -0,0 +1,68 @@ +--- +on: + issues: + types: [opened, reopened] + +engine: + id: copilot + env: + COPILOT_PROVIDER_BASE_URL: "https://ark.cn-beijing.volces.com/api/v3" + COPILOT_MODEL: doubao-seed-2-0-code-preview-260215 + COPILOT_PROVIDER_API_KEY: ${{ secrets.OPENAI_API_KEY }} + COPILOT_PROVIDER_TYPE: openai + +network: + allowed: + - defaults + - ark.cn-beijing.volces.com + +sandbox: + agent: false +strict: false + +tools: + github: + min-integrity: none + +permissions: + issues: read + contents: read + pull-requests: read + +safe-outputs: + threat-detection: false + add-comment: + max: 1 + add-labels: + allowed: + - bug + - feature + - enhancement + - documentation + - question + - duplicate + - invalid +--- + +# Issue 自动分类与回复 + +分析仓库 ${{ github.repository }} 中新开的 Issue。 + +## 任务 + +1. 阅读 Issue 的标题和正文 +2. 判断类型,添加合适的标签: + - `bug`:程序出错、功能异常 + - `feature`:新功能请求 + - `enhancement`:改进现有功能 + - `documentation`:文档问题 + - `question`:使用疑问 + - `duplicate`:与已有 Issue 重复 + - `invalid`:信息不完整或无效 + +3. 根据用户的提问语言按照用户语言回复一条友好的评论,包含: + - 感谢用户提交 Issue + - 说明你打的标签和原因 + - 如果是 bug,请用户补充:复现步骤、环境信息、错误日志 + - 如果是 question,尝试根据仓库代码和文档给出初步解答 + - 预计处理时间(普通问题 3 个工作日内) \ No newline at end of file From 5fcb2a4d87a8785a3774f3ddff7c7313af2d117f Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Sat, 9 May 2026 11:39:08 +0800 Subject: [PATCH 10/28] update:depend library --- XEngine_Source/XEngine_DependLibrary | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/XEngine_Source/XEngine_DependLibrary b/XEngine_Source/XEngine_DependLibrary index fa19ea8..e388b23 160000 --- a/XEngine_Source/XEngine_DependLibrary +++ b/XEngine_Source/XEngine_DependLibrary @@ -1 +1 @@ -Subproject commit fa19ea8880dfa312221b5d17ece40c3bbc0f00cf +Subproject commit e388b2353f5530dd9dfde647a0c7b9a6c3666163 From ea2855f3c4dd0dbc7f41a6d1a382ee9c2da64075 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Sat, 9 May 2026 13:38:27 +0800 Subject: [PATCH 11/28] added:mint build support and codeql-to-commit.yml --- .github/workflows/Mintbuild.yml | 71 +++++++++ .github/workflows/codeql-to-commit.yml | 194 +++++++++++++++++++++++++ .github/workflows/codeql.yml | 12 +- 3 files changed, 275 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/Mintbuild.yml create mode 100644 .github/workflows/codeql-to-commit.yml diff --git a/.github/workflows/Mintbuild.yml b/.github/workflows/Mintbuild.yml new file mode 100644 index 0000000..3799479 --- /dev/null +++ b/.github/workflows/Mintbuild.yml @@ -0,0 +1,71 @@ +name: MintLinux build workflows + +on: + push: + branches: + - 'master' + +permissions: + contents: read + +jobs: + build: + runs-on: ${{ matrix.runner }} + container: + image: ${{ matrix.name }} + options: --platform ${{ matrix.platform }} + strategy: + matrix: + include: + - arch: amd64 + runner: ubuntu-24.04 + platform: linux/amd64 + artifact: x86-64 + name: linuxmintd/mint22-amd64 + version: 22 + + steps: + - name: Checkout main repository code + uses: actions/checkout@v6 + + - name: Checkout dependency repository (xengine) + uses: actions/checkout@v6 + with: + repository: libxengine/libxengine + path: libxengine + + - name: sub module checkout (opensource) + uses: actions/checkout@v6 + with: + repository: libxengine/XEngine_OPenSource + path: XEngine_Source/XEngine_DependLibrary + + - name: Set TERM variable + run: echo "TERM=xterm" >> $GITHUB_ENV + + - name: Set up Dependency ubuntu24.04 Environment + run: | + cd libxengine + chmod 777 * + sudo ./XEngine_LINEnv.sh -i 3 + + - name: make + run: | + cd XEngine_Source + make + make FLAGS=InstallAll + make FLAGS=CleanAll + + make RELEASE=1 + make FLAGS=InstallAll + make FLAGS=CleanAll + cd .. + + - name: test + run: | + cd XEngine_Release + ./XEngine_CenterApp -t + ./XEngine_Http2App -t + ./XEngine_HttpApp -t + ./XEngine_SimpleApp -t + ./XEngine_WebSocketApp -t \ No newline at end of file diff --git a/.github/workflows/codeql-to-commit.yml b/.github/workflows/codeql-to-commit.yml new file mode 100644 index 0000000..d297c94 --- /dev/null +++ b/.github/workflows/codeql-to-commit.yml @@ -0,0 +1,194 @@ +name: Auto Copilot Autofix (High & Medium Only) + +on: + workflow_dispatch: + workflow_run: + workflows: ["CodeQL Advanced"] + types: [completed] + +jobs: + auto-fix: + runs-on: ubuntu-latest + if: ${{ github.event_name == 'workflow_dispatch' || github.event.workflow_run.conclusion == 'success' }} + permissions: + security-events: read + contents: write + pull-requests: write + + steps: + - name: Trigger Autofix for High & Medium alerts + env: + GH_TOKEN: ${{ secrets.AUTOFIX_TOKEN }} + OWNER: ${{ github.repository_owner }} + REPO: ${{ github.event.repository.name }} + run: | + set +e + DEFAULT_BRANCH=$(gh api /repos/$OWNER/$REPO --jq '.default_branch') + echo "Default branch: $DEFAULT_BRANCH" + + ALERTS=$(gh api "/repos/$OWNER/$REPO/code-scanning/alerts?state=open&per_page=100" \ + --jq '[.[] | select(.rule.security_severity_level == "high" or .rule.security_severity_level == "medium" or .rule.severity == "warning") | {number: .number, level: (.rule.security_severity_level // .rule.severity)}]') + + COUNT=$(echo $ALERTS | jq 'length') + echo "Found $COUNT alerts with high / medium / warning" + echo "$ALERTS" | jq -r '.[] | " Alert #\(.number) [\(.level)]"' + + if [ "$COUNT" -eq 0 ]; then + echo "No alerts to process, exiting." + exit 0 + fi + + for ROW in $(echo $ALERTS | jq -r '.[] | @base64'); do + _jq() { echo "$ROW" | base64 -d | jq -r "$1"; } + + NUMBER=$(_jq '.number') + SEC_LEVEL=$(_jq '.level') + BRANCH="autofix/${SEC_LEVEL}/alert-${NUMBER}" + + echo "--- Alert #$NUMBER [$SEC_LEVEL] ---" + + # 检查是否已有 autofix + EXISTING=$(gh api \ + /repos/$OWNER/$REPO/code-scanning/alerts/$NUMBER/autofix \ + --jq '.status' 2>/dev/null || echo "none") + + if [ "$EXISTING" = "success" ]; then + echo "✅ Fix already exists" + else + echo "⏳ Generating fix..." + gh api -X POST \ + /repos/$OWNER/$REPO/code-scanning/alerts/$NUMBER/autofix || { + echo "⚠️ Failed to trigger autofix for #$NUMBER, skipping" + continue + } + + for i in 1 2 3; do + sleep 30 + EXISTING=$(gh api \ + /repos/$OWNER/$REPO/code-scanning/alerts/$NUMBER/autofix \ + --jq '.status' 2>/dev/null || echo "none") + echo " Attempt $i: status = $EXISTING" + [ "$EXISTING" = "success" ] && break + done + fi + + if [ "$EXISTING" != "success" ]; then + echo "⚠️ Autofix not available for alert #$NUMBER (status: $EXISTING), skipping" + continue + fi + + # 检查分支是否已存在 + BRANCH_STATUS=$(gh api \ + /repos/$OWNER/$REPO/git/refs/heads/$BRANCH \ + --silent 2>/dev/null && echo "exists" || echo "not_found") + echo "DEBUG branch status: $BRANCH_STATUS" + + if [ "$BRANCH_STATUS" = "not_found" ]; then + # 创建分支 + SHA=$(gh api /repos/$OWNER/$REPO/git/refs/heads/$DEFAULT_BRANCH \ + --jq '.object.sha') + + gh api -X POST /repos/$OWNER/$REPO/git/refs \ + -f ref="refs/heads/$BRANCH" \ + -f sha="$SHA" 2>/dev/null || true + echo "🌿 Created branch: $BRANCH" + + # 提交 fix + COMMIT_RESULT=$(gh api -X POST \ + /repos/$OWNER/$REPO/code-scanning/alerts/$NUMBER/autofix/commits \ + -f target_ref="$BRANCH" 2>&1) + echo "DEBUG commit result: $COMMIT_RESULT" + + if echo "$COMMIT_RESULT" | grep -q "target_ref"; then + echo "✅ Committed fix to branch: $BRANCH" + else + echo "⚠️ No code changes generated, deleting branch and skipping" + gh api -X DELETE \ + /repos/$OWNER/$REPO/git/refs/heads/$BRANCH 2>/dev/null || true + continue + fi + else + # 分支已存在,检查是否已有 open PR + EXISTING_PR=$(gh pr list \ + --repo "$OWNER/$REPO" \ + --head "$BRANCH" \ + --state open \ + --json number \ + --jq '.[0].number // empty') + + if [ -n "$EXISTING_PR" ]; then + echo "⏭️ PR #$EXISTING_PR already exists, skipping" + continue + fi + + echo "🌿 Branch exists, creating PR with existing branch" + fi + + # 获取 alert 详情 + ALERT_INFO=$(gh api \ + /repos/$OWNER/$REPO/code-scanning/alerts/$NUMBER) + + ALERT_TITLE=$(echo $ALERT_INFO | jq -r '.rule.description') + ALERT_HELP=$(echo $ALERT_INFO | jq -r '.rule.help // "暂无详细说明"' | head -c 800) + ALERT_TAGS=$(echo $ALERT_INFO | jq -r '.rule.tags // [] | join(", ")') + ALERT_FILE=$(echo $ALERT_INFO | jq -r '.most_recent_instance.location.path // "未知文件"') + ALERT_LINE=$(echo $ALERT_INFO | jq -r '.most_recent_instance.location.start_line // "未知行"') + ALERT_URL=$(echo $ALERT_INFO | jq -r '.html_url') + CWE_TAGS=$(echo $ALERT_INFO | jq -r '[.rule.tags[] | select(startswith("external/cwe/"))] | join(", ")') + + AUTOFIX_DESC=$(gh api \ + /repos/$OWNER/$REPO/code-scanning/alerts/$NUMBER/autofix \ + --jq '.description // "暂无 AI 修复说明"') + + # 创建 Draft PR + gh pr create \ + --repo "$OWNER/$REPO" \ + --base "$DEFAULT_BRANCH" \ + --head "$BRANCH" \ + --draft \ + --title "[Autofix][$SEC_LEVEL] Alert #$NUMBER: $ALERT_TITLE" \ + --body "## 🤖 Copilot Autofix 自动修复报告 + + --- + + ### 📋 基本信息 + + | 字段 | 内容 | + |------|------| + | **Alert ID** | [#$NUMBER]($ALERT_URL) | + | **安全级别** | $SEC_LEVEL | + | **规则名称** | $ALERT_TITLE | + | **问题文件** | \`$ALERT_FILE\` 第 $ALERT_LINE 行 | + | **CWE 分类** | $CWE_TAGS | + | **规则标签** | $ALERT_TAGS | + + --- + + ### 🔍 问题说明 + + $ALERT_HELP + + --- + + ### 🤖 AI 修复思路 + + $AUTOFIX_DESC + + --- + + ### ✅ Review 检查清单 + + - [ ] 理解了漏洞的成因和影响范围 + - [ ] 确认 AI 修复逻辑正确,没有遗漏边界情况 + - [ ] 确认修复没有改变原有业务逻辑 + - [ ] 确认没有引入新的安全问题 + - [ ] CI / 单元测试全部通过 + - [ ] 如有必要,已补充对应的测试用例 + + --- + + > 此 PR 由 GitHub Copilot Autofix 自动生成,请仔细审核后再 merge。" && \ + echo "🎉 PR created for alert #$NUMBER" || \ + echo "❌ Failed to create PR for alert #$NUMBER" + + done diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 2a851db..129f7ac 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -23,6 +23,8 @@ jobs: matrix: include: - language: c-cpp + build-mode: manual + steps: - name: Checkout repository uses: actions/checkout@v6 @@ -49,17 +51,23 @@ jobs: chmod +x ./XEngine_LINEnv.sh sudo ./XEngine_LINEnv.sh -i 3 + - name: make pre + run: | + cd XEngine_Source + make BUILDTYPE=1 + - name: Initialize CodeQL uses: github/codeql-action/init@v4 with: languages: ${{ matrix.language }} build-mode: manual queries: security-and-quality + config-file: .github/workflows/codeql/codeql-config.yml - - name: make + - name: make check run: | cd XEngine_Source - make + make BUILDTYPE=2 - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@v4 From 5b4ae8642677ea6ad6d5617bce4b79d8acb86ed3 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Sat, 9 May 2026 13:43:43 +0800 Subject: [PATCH 12/28] ci:fixed --- .github/workflows/codeql.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 129f7ac..168c921 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -62,7 +62,6 @@ jobs: languages: ${{ matrix.language }} build-mode: manual queries: security-and-quality - config-file: .github/workflows/codeql/codeql-config.yml - name: make check run: | From be24dc2357aaa1c40120b18c203b6c40353c3c7e Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Sat, 9 May 2026 13:55:36 +0800 Subject: [PATCH 13/28] update:make file build --- XEngine_Source/Makefile | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/XEngine_Source/Makefile b/XEngine_Source/Makefile index 8437ab2..48163de 100644 --- a/XEngine_Source/Makefile +++ b/XEngine_Source/Makefile @@ -1,6 +1,7 @@ RELEASE = 0 UNICODE = 0 PLATFORM=linux +BUILDTYPE=0 FLAGS= #要编译的模块 THIRDPART_MODULE_JSONCPP = ./XEngine_DependLibrary/XEngine_Module/jsoncpp @@ -19,9 +20,20 @@ else ifeq ($(PLATFORM),mac) FILEEXT = dylib endif -XENGINE_MODULES = libjsoncpp.so libXEngine_InfoReport.so libXEngine_Verification.so \ - libXEngine_ModuleConfigure.so libXEngine_ModuleProtocol.so libXEngine_ModuleSession.so libXEngine_ModuleHelp.so \ - XEngine_ServiceApp.exe +# 第三方库模块 +MODULES_THIRD = libjsoncpp.so libXEngine_InfoReport.so libXEngine_Verification.so +# 业务模块 + 应用 +MODULES_APP = libXEngine_ModuleConfigure.so libXEngine_ModuleProtocol.so libXEngine_ModuleSession.so libXEngine_ModuleHelp.so \ + XEngine_ServiceApp.exe + +# 根据 BUILDTYPE 决定编译目标 +ifeq ($(BUILDTYPE),0) + XENGINE_MODULES = $(MODULES_THIRD) $(MODULES_APP) +else ifeq ($(BUILDTYPE),1) + XENGINE_MODULES = $(MODULES_THIRD) +else ifeq ($(BUILDTYPE),2) + XENGINE_MODULES = $(MODULES_APP) +endif .PHONY:MakeAll MakeAll:$(XENGINE_MODULES) From d80d098b64d23d2719170958867fbf8a76008009 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Sat, 9 May 2026 06:00:44 +0000 Subject: [PATCH 14/28] Potential fix for code scanning alert no. 59 Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> --- .../ModuleConfigure_Json/ModuleConfigure_Json.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/XEngine_Source/XEngine_ModuleConfigure/ModuleConfigure_Json/ModuleConfigure_Json.cpp b/XEngine_Source/XEngine_ModuleConfigure/ModuleConfigure_Json/ModuleConfigure_Json.cpp index 70bd524..ec2a074 100644 --- a/XEngine_Source/XEngine_ModuleConfigure/ModuleConfigure_Json/ModuleConfigure_Json.cpp +++ b/XEngine_Source/XEngine_ModuleConfigure/ModuleConfigure_Json/ModuleConfigure_Json.cpp @@ -42,18 +42,23 @@ CModuleConfigure_Json::~CModuleConfigure_Json() *********************************************************************/ bool CModuleConfigure_Json::ModuleConfigure_Json_File(LPCXSTR lpszConfigFile, XENGINE_SERVICECONFIG* pSt_ServerConfig) { + // 约定:每次进入函数先清除错误状态,后续任一步失败都设置错误码并返回 false。 Config_IsErrorOccur = false; + // 第一步:校验输入参数,配置文件路径和输出结构体都不能为空。 if ((NULL == lpszConfigFile) || (NULL == pSt_ServerConfig)) { Config_IsErrorOccur = true; Config_dwErrorCode = ERROR_MODULE_CONFIGURE_JSON_PARAMENT; return false; } + + // 第二步:准备 JSON 解析器对象与错误信息缓冲。 Json::Value st_JsonRoot; JSONCPP_STRING st_JsonError; Json::CharReaderBuilder st_JsonBuilder; - //读取配置文件所有内容到缓冲区 + + // 第三步:读取配置文件内容到固定缓冲区(当前实现最多读取 8192 字节)。 FILE* pSt_File = _xtfopen(lpszConfigFile, _X("rb")); if (NULL == pSt_File) { @@ -64,7 +69,8 @@ bool CModuleConfigure_Json::ModuleConfigure_Json_File(LPCXSTR lpszConfigFile, XE XCHAR tszMsgBuffer[8192]; int nRet = fread(tszMsgBuffer, 1, sizeof(tszMsgBuffer), pSt_File); fclose(pSt_File); - //开始解析配置文件 + + // 第四步:解析 JSON 文本。解析失败时返回统一的解析错误码。 std::unique_ptr const pSt_JsonReader(st_JsonBuilder.newCharReader()); if (!pSt_JsonReader->parse(tszMsgBuffer, tszMsgBuffer + nRet, &st_JsonRoot, &st_JsonError)) { @@ -72,6 +78,8 @@ bool CModuleConfigure_Json::ModuleConfigure_Json_File(LPCXSTR lpszConfigFile, XE Config_dwErrorCode = ERROR_MODULE_CONFIGURE_JSON_PARSE; return false; } + + // 第五步:将 JSON 字段映射到服务配置结构体,供调用方后续使用。 _tcsxcpy(pSt_ServerConfig->tszIPAddr, st_JsonRoot["tszIPAddr"].asCString()); pSt_ServerConfig->bDeamon = st_JsonRoot["bDeamon"].asBool(); pSt_ServerConfig->nHttpPort = st_JsonRoot["nHttpPort"].asInt(); From db9fbd6c745423d727b506447a21c2aa7fefa816 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 9 Jun 2026 14:05:09 +0800 Subject: [PATCH 15/28] update:vs to 2026 version an depend library --- XEngine_Source/XEngine_DependLibrary | 2 +- .../XEngine_ModuleConfigure.vcxproj | 12 ++++++------ .../XEngine_ModuleHelp/XEngine_ModuleHelp.vcxproj | 12 ++++++------ .../XEngine_ModuleProtocol.vcxproj | 12 ++++++------ .../XEngine_ModuleSession.vcxproj | 12 ++++++------ .../XEngine_ServiceApp/XEngine_ServiceApp.vcxproj | 12 ++++++------ 6 files changed, 31 insertions(+), 31 deletions(-) diff --git a/XEngine_Source/XEngine_DependLibrary b/XEngine_Source/XEngine_DependLibrary index e388b23..a4447a4 160000 --- a/XEngine_Source/XEngine_DependLibrary +++ b/XEngine_Source/XEngine_DependLibrary @@ -1 +1 @@ -Subproject commit e388b2353f5530dd9dfde647a0c7b9a6c3666163 +Subproject commit a4447a423b8b5f5f1377f115de6fafde15a0dcc4 diff --git a/XEngine_Source/XEngine_ModuleConfigure/XEngine_ModuleConfigure.vcxproj b/XEngine_Source/XEngine_ModuleConfigure/XEngine_ModuleConfigure.vcxproj index 1e0aa03..01042d5 100644 --- a/XEngine_Source/XEngine_ModuleConfigure/XEngine_ModuleConfigure.vcxproj +++ b/XEngine_Source/XEngine_ModuleConfigure/XEngine_ModuleConfigure.vcxproj @@ -37,39 +37,39 @@ DynamicLibrary true - v143 + v145 Unicode DynamicLibrary false - v143 + v145 true Unicode DynamicLibrary true - v143 + v145 Unicode DynamicLibrary true - v143 + v145 Unicode DynamicLibrary false - v143 + v145 true Unicode DynamicLibrary false - v143 + v145 true Unicode diff --git a/XEngine_Source/XEngine_ModuleHelp/XEngine_ModuleHelp.vcxproj b/XEngine_Source/XEngine_ModuleHelp/XEngine_ModuleHelp.vcxproj index 2a4819e..1e768a3 100644 --- a/XEngine_Source/XEngine_ModuleHelp/XEngine_ModuleHelp.vcxproj +++ b/XEngine_Source/XEngine_ModuleHelp/XEngine_ModuleHelp.vcxproj @@ -37,39 +37,39 @@ DynamicLibrary true - v143 + v145 Unicode DynamicLibrary false - v143 + v145 true Unicode DynamicLibrary true - v143 + v145 Unicode DynamicLibrary true - v143 + v145 Unicode DynamicLibrary false - v143 + v145 true Unicode DynamicLibrary false - v143 + v145 true Unicode diff --git a/XEngine_Source/XEngine_ModuleProtocol/XEngine_ModuleProtocol.vcxproj b/XEngine_Source/XEngine_ModuleProtocol/XEngine_ModuleProtocol.vcxproj index 9bdddab..cd5c13a 100644 --- a/XEngine_Source/XEngine_ModuleProtocol/XEngine_ModuleProtocol.vcxproj +++ b/XEngine_Source/XEngine_ModuleProtocol/XEngine_ModuleProtocol.vcxproj @@ -37,39 +37,39 @@ DynamicLibrary true - v143 + v145 Unicode DynamicLibrary false - v143 + v145 true Unicode DynamicLibrary true - v143 + v145 Unicode DynamicLibrary true - v143 + v145 Unicode DynamicLibrary false - v143 + v145 true Unicode DynamicLibrary false - v143 + v145 true Unicode diff --git a/XEngine_Source/XEngine_ModuleSession/XEngine_ModuleSession.vcxproj b/XEngine_Source/XEngine_ModuleSession/XEngine_ModuleSession.vcxproj index 4b04841..47cc1b2 100644 --- a/XEngine_Source/XEngine_ModuleSession/XEngine_ModuleSession.vcxproj +++ b/XEngine_Source/XEngine_ModuleSession/XEngine_ModuleSession.vcxproj @@ -37,39 +37,39 @@ DynamicLibrary true - v143 + v145 Unicode DynamicLibrary false - v143 + v145 true Unicode DynamicLibrary true - v143 + v145 Unicode DynamicLibrary true - v143 + v145 Unicode DynamicLibrary false - v143 + v145 true Unicode DynamicLibrary false - v143 + v145 true Unicode diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_ServiceApp.vcxproj b/XEngine_Source/XEngine_ServiceApp/XEngine_ServiceApp.vcxproj index 1397cf6..89c06b5 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_ServiceApp.vcxproj +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_ServiceApp.vcxproj @@ -37,39 +37,39 @@ Application true - v143 + v145 Unicode Application false - v143 + v145 true Unicode Application true - v143 + v145 Unicode Application true - v143 + v145 Unicode Application false - v143 + v145 true Unicode Application false - v143 + v145 true Unicode From 43e8f70414a244c9b22500facb9caee6b9800839 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 9 Jun 2026 14:07:22 +0800 Subject: [PATCH 16/28] update:msbuild.yml --- .github/workflows/msbuild.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/msbuild.yml b/.github/workflows/msbuild.yml index b29ff69..d5834d5 100644 --- a/.github/workflows/msbuild.yml +++ b/.github/workflows/msbuild.yml @@ -17,7 +17,7 @@ jobs: configuration: [Debug ,Release] platform: [x86 ,x64, ARM64] - runs-on: windows-latest # 最新的 Windows 环境 + runs-on: windows-2025-vs2026 steps: # 检出您的主仓库代码 From e9cfd54a949d47bb33472f8cc834aef0f2165cca Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Wed, 10 Jun 2026 13:57:05 +0800 Subject: [PATCH 17/28] ci:added critical level support for codeql --- .github/workflows/codeql-to-commit.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/codeql-to-commit.yml b/.github/workflows/codeql-to-commit.yml index d297c94..98ab97f 100644 --- a/.github/workflows/codeql-to-commit.yml +++ b/.github/workflows/codeql-to-commit.yml @@ -27,7 +27,7 @@ jobs: echo "Default branch: $DEFAULT_BRANCH" ALERTS=$(gh api "/repos/$OWNER/$REPO/code-scanning/alerts?state=open&per_page=100" \ - --jq '[.[] | select(.rule.security_severity_level == "high" or .rule.security_severity_level == "medium" or .rule.severity == "warning") | {number: .number, level: (.rule.security_severity_level // .rule.severity)}]') + --jq '[.[] | select(.rule.security_severity_level == "critical" or .rule.security_severity_level == "high" or .rule.security_severity_level == "medium" or .rule.severity == "warning") | {number: .number, level: (.rule.security_severity_level // .rule.severity)}]') COUNT=$(echo $ALERTS | jq 'length') echo "Found $COUNT alerts with high / medium / warning" From 13aa6d090fe8c7b8b305a202258994118671dc3f Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Mon, 29 Jun 2026 14:11:10 +0800 Subject: [PATCH 18/28] added:crypt data for forward proxy --- .../XEngine_Config/XEngine_Config.json | 7 +++ XEngine_Source/XEngine_DependLibrary | 2 +- .../ModuleConfig_Define.h | 8 +++ .../ModuleConfig_Error.h | 3 +- .../ModuleConfigure_Json.cpp | 14 ++++- .../XEngine_ForwardTask.cpp | 4 ++ .../XEngine_ServiceApp/XEngine_Network.cpp | 51 ++++++++++++++++--- 7 files changed, 80 insertions(+), 9 deletions(-) diff --git a/XEngine_Release/XEngine_Config/XEngine_Config.json b/XEngine_Release/XEngine_Config/XEngine_Config.json index 1fa6fb8..81a0199 100644 --- a/XEngine_Release/XEngine_Config/XEngine_Config.json +++ b/XEngine_Release/XEngine_Config/XEngine_Config.json @@ -28,6 +28,13 @@ "LogType": 17, "tszLogFile": "./XEngine_Log/XEngine_ProxyServiceApp.log" }, + "XCrpytion": { + "bEnable": true, + "nCType": 3, + "tszPassword": "123123aa", + "tszIVInit": "3420663059460898171726768181188", + "tszSalt": "56559658155301135991954081650" + }, "XVerification": { "tszUserName": "xyry", "tszUserPass": "11", diff --git a/XEngine_Source/XEngine_DependLibrary b/XEngine_Source/XEngine_DependLibrary index a4447a4..8b6a941 160000 --- a/XEngine_Source/XEngine_DependLibrary +++ b/XEngine_Source/XEngine_DependLibrary @@ -1 +1 @@ -Subproject commit a4447a423b8b5f5f1377f115de6fafde15a0dcc4 +Subproject commit 8b6a9413ad3407b06abea611a7b89a0e968e36c0 diff --git a/XEngine_Source/XEngine_ModuleConfigure/ModuleConfig_Define.h b/XEngine_Source/XEngine_ModuleConfigure/ModuleConfig_Define.h index e8e2451..84ea04f 100644 --- a/XEngine_Source/XEngine_ModuleConfigure/ModuleConfig_Define.h +++ b/XEngine_Source/XEngine_ModuleConfigure/ModuleConfig_Define.h @@ -48,6 +48,14 @@ typedef struct tag_XEngine_ServiceConfig int nLogType; //日志类型 }st_XLog; struct + { + XCHAR tszIVInit[XPATH_MIN]; + XCHAR tszSalt[XPATH_MIN]; + XCHAR tszPassword[XPATH_MIN]; + int nCType; + bool bEnable; + }st_XCryption; + struct { XCHAR tszUserName[XPATH_MAX]; XCHAR tszUserPass[XPATH_MAX]; diff --git a/XEngine_Source/XEngine_ModuleConfigure/ModuleConfig_Error.h b/XEngine_Source/XEngine_ModuleConfigure/ModuleConfig_Error.h index 9ff051a..2f45799 100644 --- a/XEngine_Source/XEngine_ModuleConfigure/ModuleConfig_Error.h +++ b/XEngine_Source/XEngine_ModuleConfigure/ModuleConfig_Error.h @@ -19,4 +19,5 @@ #define ERROR_MODULE_CONFIGURE_JSON_XVER 0xA0008 //没有版本配置 #define ERROR_MODULE_CONFIGURE_JSON_XREPORT 0xA0009 //没有报告配置 #define ERROR_MODULE_CONFIGURE_JSON_XPROXY 0xA0010 //没有代理配置 -#define ERROR_MODULE_CONFIGURE_JSON_XVERICATION 0xA0011 //没有验证配置 \ No newline at end of file +#define ERROR_MODULE_CONFIGURE_JSON_XVERICATION 0xA0011 //没有验证配置 +#define ERROR_MODULE_CONFIGURE_JSON_XCRYPTION 0xA0012 //没有加解密配置 \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModuleConfigure/ModuleConfigure_Json/ModuleConfigure_Json.cpp b/XEngine_Source/XEngine_ModuleConfigure/ModuleConfigure_Json/ModuleConfigure_Json.cpp index 70bd524..4e22d7c 100644 --- a/XEngine_Source/XEngine_ModuleConfigure/ModuleConfigure_Json/ModuleConfigure_Json.cpp +++ b/XEngine_Source/XEngine_ModuleConfigure/ModuleConfigure_Json/ModuleConfigure_Json.cpp @@ -120,6 +120,19 @@ bool CModuleConfigure_Json::ModuleConfigure_Json_File(LPCXSTR lpszConfigFile, XE pSt_ServerConfig->st_XLog.nLogType = st_JsonXLog["LogType"].asInt(); _tcsxcpy(pSt_ServerConfig->st_XLog.tszLogFile, st_JsonXLog["tszLogFile"].asCString()); + if (st_JsonRoot["XCrpytion"].empty() || (5 != st_JsonRoot["XCrpytion"].size())) + { + Config_IsErrorOccur = true; + Config_dwErrorCode = ERROR_MODULE_CONFIGURE_JSON_XCRYPTION; + return false; + } + Json::Value st_JsonXCryption = st_JsonRoot["XCrpytion"]; + pSt_ServerConfig->st_XCryption.bEnable = st_JsonXCryption["bEnable"].asBool(); + pSt_ServerConfig->st_XCryption.nCType = st_JsonXCryption["nCType"].asInt(); + _tcsxcpy(pSt_ServerConfig->st_XCryption.tszIVInit, st_JsonXCryption["tszIVInit"].asCString()); + _tcsxcpy(pSt_ServerConfig->st_XCryption.tszSalt, st_JsonXCryption["tszSalt"].asCString()); + _tcsxcpy(pSt_ServerConfig->st_XCryption.tszPassword, st_JsonXCryption["tszPassword"].asCString()); + if (st_JsonRoot["XVerification"].empty() || (4 != st_JsonRoot["XVerification"].size())) { Config_IsErrorOccur = true; @@ -127,7 +140,6 @@ bool CModuleConfigure_Json::ModuleConfigure_Json_File(LPCXSTR lpszConfigFile, XE return false; } Json::Value st_JsonXVerifcation = st_JsonRoot["XVerification"]; - pSt_ServerConfig->st_XVerifcation.bEnable = st_JsonXVerifcation["bEnable"].asBool(); pSt_ServerConfig->st_XVerifcation.nVType = st_JsonXVerifcation["nVType"].asInt(); _tcsxcpy(pSt_ServerConfig->st_XVerifcation.tszUserName, st_JsonXVerifcation["tszUserName"].asCString()); diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_ForwardTask.cpp b/XEngine_Source/XEngine_ServiceApp/XEngine_ForwardTask.cpp index 84296c6..13bb2aa 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_ForwardTask.cpp +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_ForwardTask.cpp @@ -33,6 +33,10 @@ XHTHREAD XCALLBACK XEngine_Forward_Thread(XPVOID lParam) if (HelpComponents_Datas_GetMemoryEx(xhForwardPacket, ppSt_ListClient[i]->tszClientAddr, &ptszMsgBuffer, &nMsgLen, &st_ProtocolHdr)) { + if (st_ServiceConfig.st_XCryption.bEnable) + { + Cryption_Api_CryptDecodec(NULL, (XBYTE*)ptszMsgBuffer, &nMsgLen, st_ServiceConfig.st_XCryption.tszPassword, (ENUM_XENGINE_CRYPTION_SYMMETRIC)st_ServiceConfig.st_XCryption.nCType, (XBYTE*)st_ServiceConfig.st_XCryption.tszIVInit, (XBYTE*)st_ServiceConfig.st_XCryption.tszSalt); + } XEngine_Forward_Handle(ppSt_ListClient[i]->tszClientAddr, ptszMsgBuffer, nMsgLen, &st_ProtocolHdr); BaseLib_Memory_FreeCStyle((XPPMEM)&ptszMsgBuffer); } diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_Network.cpp b/XEngine_Source/XEngine_ServiceApp/XEngine_Network.cpp index a64a0ef..37e6f00 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_Network.cpp +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_Network.cpp @@ -102,13 +102,31 @@ void XCALLBACK Network_Callback_ForwardRecv(LPCXSTR lpszClientAddr, XSOCKET hSoc if (st_ForwardClinet.bAnony) { //匿名转发 - if (XClient_TCPSelect_SendEx(xhForwardClient, st_ForwardClinet.xhClient, lpszRecvMsg, nMsgLen)) + if (st_ServiceConfig.st_XCryption.bEnable) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_DEBUG, _X("Forward客户端:%s,匿名转发数据成功,大小:%d"), lpszClientAddr, nMsgLen); + XCHAR* ptszMSGBuffer = (XCHAR*)malloc(XENGINE_MEMORY_SIZE_MAX); + if (NULL == ptszMSGBuffer) + { + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_FATAL, _X("Forward客户端:%s,发送数据失败,申请内存失败,严重错误"), lpszClientAddr); + return; + } + memset(ptszMSGBuffer, 0, XENGINE_MEMORY_SIZE_MAX); + memcpy(ptszMSGBuffer, lpszRecvMsg, nMsgLen); + Cryption_Api_CryptEncodec(NULL, (XBYTE*)ptszMSGBuffer, &nMsgLen, st_ServiceConfig.st_XCryption.tszPassword, (ENUM_XENGINE_CRYPTION_SYMMETRIC)st_ServiceConfig.st_XCryption.nCType, (XBYTE*)st_ServiceConfig.st_XCryption.tszIVInit, (XBYTE*)st_ServiceConfig.st_XCryption.tszSalt); + + if (!XClient_TCPSelect_SendEx(xhForwardClient, st_ForwardClinet.xhClient, ptszMSGBuffer, nMsgLen)) + { + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("Forward客户端:%s,匿名转发数据失败,大小:%d,错误:%lX"), lpszClientAddr, nMsgLen, XClient_GetLastError()); + } + free(ptszMSGBuffer); + ptszMSGBuffer = NULL; } else { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("Forward客户端:%s,匿名转发数据失败,大小:%d,错误:%lX"), lpszClientAddr, nMsgLen, XClient_GetLastError()); + if (!XClient_TCPSelect_SendEx(xhForwardClient, st_ForwardClinet.xhClient, lpszRecvMsg, nMsgLen)) + { + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("Forward客户端:%s,匿名转发数据失败,大小:%d,错误:%lX"), lpszClientAddr, nMsgLen, XClient_GetLastError()); + } } } else @@ -314,10 +332,31 @@ bool XEngine_Network_Send(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMs } else if (XENGINE_CLIENT_NETTYPE_FORWARD == nIPProto) { - if (!NetCore_TCPXCore_SendEx(xhForwardSocket, lpszClientAddr, lpszMsgBuffer, nMsgLen, 1, 1)) + if (st_ServiceConfig.st_XCryption.bEnable) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("Forward客户端:%s,发送数据失败,错误:%lX"), lpszClientAddr, NetCore_GetLastError()); - return false; + XCHAR* ptszMSGBuffer = (XCHAR*)malloc(XENGINE_MEMORY_SIZE_MAX); + if (NULL == ptszMSGBuffer) + { + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_FATAL, _X("Forward客户端:%s,发送数据失败,申请内存失败,严重错误"), lpszClientAddr); + return false; + } + memset(ptszMSGBuffer, 0, XENGINE_MEMORY_SIZE_MAX); + memcpy(ptszMSGBuffer, lpszMsgBuffer, nMsgLen); + Cryption_Api_CryptEncodec(NULL, (XBYTE*)ptszMSGBuffer, &nMsgLen, st_ServiceConfig.st_XCryption.tszPassword, (ENUM_XENGINE_CRYPTION_SYMMETRIC)st_ServiceConfig.st_XCryption.nCType, (XBYTE*)st_ServiceConfig.st_XCryption.tszIVInit, (XBYTE*)st_ServiceConfig.st_XCryption.tszSalt); + if (!NetCore_TCPXCore_SendEx(xhForwardSocket, lpszClientAddr, ptszMSGBuffer, nMsgLen, 1, 1)) + { + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("Forward客户端:%s,发送数据失败,错误:%lX"), lpszClientAddr, NetCore_GetLastError()); + } + free(ptszMSGBuffer); + ptszMSGBuffer = NULL; + } + else + { + if (!NetCore_TCPXCore_SendEx(xhForwardSocket, lpszClientAddr, lpszMsgBuffer, nMsgLen, 1, 1)) + { + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("Forward客户端:%s,发送数据失败,错误:%lX"), lpszClientAddr, NetCore_GetLastError()); + return false; + } } SocketOpt_HeartBeat_ActiveAddrEx(xhForwardHeart, lpszClientAddr); } From 3e8ad80d1450199346d570f1dadae885a8e97fda Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Thu, 30 Jul 2026 09:20:07 +0800 Subject: [PATCH 19/28] feat: add agentic workflows for issue triage and auto fix --- .github/workflows/agentics-maintenance.yml | 607 +++++++++++++++++++++ .github/workflows/auto-code.lock.yml | 334 ++++++++---- .github/workflows/auto-code.md | 61 ++- .github/workflows/codeql.yml | 5 +- .github/workflows/issue-triage.lock.yml | 306 ++++++++--- .github/workflows/issue-triage.md | 18 +- 6 files changed, 1125 insertions(+), 206 deletions(-) create mode 100644 .github/workflows/agentics-maintenance.yml diff --git a/.github/workflows/agentics-maintenance.yml b/.github/workflows/agentics-maintenance.yml new file mode 100644 index 0000000..6bd015f --- /dev/null +++ b/.github/workflows/agentics-maintenance.yml @@ -0,0 +1,607 @@ +# ___ _ _ +# / _ \ | | (_) +# | |_| | __ _ ___ _ __ | |_ _ ___ +# | _ |/ _` |/ _ \ '_ \| __| |/ __| +# | | | | (_| | __/ | | | |_| | (__ +# \_| |_/\__, |\___|_| |_|\__|_|\___| +# __/ | +# _ _ |___/ +# | | | | / _| | +# | | | | ___ _ __ _ __| |_| | _____ ____ +# | |/\| |/ _ \ '__| |/ /| _| |/ _ \ \ /\ / / ___| +# \ /\ / (_) | | | | ( | | | | (_) \ V V /\__ \ +# \/ \/ \___/|_| |_|\_\|_| |_|\___/ \_/\_/ |___/ +# +# This file was automatically generated by pkg/workflow/maintenance_workflow.go (v0.79.6). DO NOT EDIT. +# +# To regenerate this workflow, run: +# gh aw compile +# Not all edits will cause changes to this file. +# +# For more information: https://github.github.com/gh-aw/introduction/overview/ +# +# Alternative regeneration methods: +# make recompile +# +# Or use the gh-aw CLI directly: +# ./gh-aw compile --validate --verbose +# +# The workflow is generated when any workflow uses the 'expires' field +# in create-discussions, create-issues, or create-pull-request safe-outputs configuration. +# Schedule frequency is automatically determined by the shortest expiration time. +# +name: Agentic Maintenance + +on: + schedule: + - cron: "37 0 * * *" # Daily (based on minimum expires: 30 days) + workflow_dispatch: + inputs: + operation: + description: 'Optional maintenance operation to run' + required: false + type: choice + default: '' + options: + - '' + - 'disable' + - 'enable' + - 'update' + - 'upgrade' + - 'safe_outputs' + - 'create_labels' + - 'activity_report' + - 'close_agentic_workflows_issues' + - 'clean_cache_memories' + - 'update_pull_request_branches' + - 'validate' + - 'forecast' + run_url: + description: 'Run URL or run ID to replay safe outputs from (e.g. https://github.com/owner/repo/actions/runs/12345 or 12345). Required when operation is safe_outputs.' + required: false + type: string + default: '' + workflow_call: + inputs: + operation: + description: 'Optional maintenance operation to run (disable, enable, update, upgrade, safe_outputs, create_labels, activity_report, close_agentic_workflows_issues, clean_cache_memories, update_pull_request_branches, validate, forecast)' + required: false + type: string + default: '' + run_url: + description: 'Run URL or run ID to replay safe outputs from (e.g. https://github.com/owner/repo/actions/runs/12345 or 12345). Required when operation is safe_outputs.' + required: false + type: string + default: '' + outputs: + operation_completed: + description: 'The maintenance operation that was completed (empty when none ran or a scheduled job ran)' + value: ${{ jobs.run_operation.outputs.operation || inputs.operation }} + applied_run_url: + description: 'The run URL that safe outputs were applied from' + value: ${{ jobs.apply_safe_outputs.outputs.run_url }} + +permissions: {} + +jobs: + close-expired-entities: + if: ${{ (!(github.event.repository.fork)) && github.event_name != 'push' && (github.event_name != 'workflow_dispatch' && github.event_name != 'workflow_call' || inputs.operation == '') }} + runs-on: ubuntu-slim + permissions: + discussions: write + issues: write + pull-requests: write + steps: + - name: Setup Scripts + uses: github/gh-aw-actions/setup@5c2fe865bb4dc46e1450f6ee0d0541d759aea73a # v0.79.6 + with: + destination: ${{ runner.temp }}/gh-aw/actions + + - name: Close expired discussions + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/close_expired_discussions.cjs'); + await main(); + + - name: Close expired issues + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/close_expired_issues.cjs'); + await main(); + + - name: Close expired pull requests + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/close_expired_pull_requests.cjs'); + await main(); + + cleanup-cache-memory: + if: ${{ (!(github.event.repository.fork)) && github.event_name != 'push' && (github.event_name != 'workflow_dispatch' && github.event_name != 'workflow_call' || inputs.operation == '' || inputs.operation == 'clean_cache_memories') }} + runs-on: ubuntu-slim + permissions: + actions: write + steps: + - name: Setup Scripts + uses: github/gh-aw-actions/setup@5c2fe865bb4dc46e1450f6ee0d0541d759aea73a # v0.79.6 + with: + destination: ${{ runner.temp }}/gh-aw/actions + + - name: Cleanup outdated cache-memory entries + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/cleanup_cache_memory.cjs'); + await main(); + + run_operation: + if: ${{ (github.event_name == 'workflow_dispatch' || github.event_name == 'workflow_call') && inputs.operation != '' && inputs.operation != 'safe_outputs' && inputs.operation != 'create_labels' && inputs.operation != 'activity_report' && inputs.operation != 'close_agentic_workflows_issues' && inputs.operation != 'clean_cache_memories' && inputs.operation != 'update_pull_request_branches' && inputs.operation != 'validate' && inputs.operation != 'forecast' && (!(github.event.repository.fork)) }} + runs-on: ubuntu-slim + permissions: + actions: write + contents: write + pull-requests: write + outputs: + operation: ${{ steps.record.outputs.operation }} + steps: + - name: Checkout repository + uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + with: + persist-credentials: false + + - name: Setup Scripts + uses: github/gh-aw-actions/setup@5c2fe865bb4dc46e1450f6ee0d0541d759aea73a # v0.79.6 + with: + destination: ${{ runner.temp }}/gh-aw/actions + + - name: Check admin/maintainer permissions + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/check_team_member.cjs'); + await main(); + + - name: Install gh-aw + uses: github/gh-aw-actions/setup-cli@5c2fe865bb4dc46e1450f6ee0d0541d759aea73a # v0.79.6 + with: + version: v0.79.6 + + - name: Run operation + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GH_AW_OPERATION: ${{ inputs.operation }} + GH_AW_CMD_PREFIX: gh aw + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/run_operation_update_upgrade.cjs'); + await main(); + + - name: Record outputs + id: record + run: echo "operation=${{ inputs.operation }}" >> "$GITHUB_OUTPUT" + + update_pull_request_branches: + if: ${{ (github.event_name == 'workflow_dispatch' || github.event_name == 'workflow_call') && inputs.operation == 'update_pull_request_branches' && (!(github.event.repository.fork)) }} + runs-on: ubuntu-slim + permissions: + contents: write + pull-requests: write + steps: + - name: Setup Scripts + uses: github/gh-aw-actions/setup@5c2fe865bb4dc46e1450f6ee0d0541d759aea73a # v0.79.6 + with: + destination: ${{ runner.temp }}/gh-aw/actions + + - name: Check admin/maintainer permissions + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/check_team_member.cjs'); + await main(); + + - name: Update pull request branches + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/update_pull_request_branches.cjs'); + await main(); + + apply_safe_outputs: + if: ${{ (github.event_name == 'workflow_dispatch' || github.event_name == 'workflow_call') && inputs.operation == 'safe_outputs' && (!(github.event.repository.fork)) }} + runs-on: ubuntu-slim + permissions: + actions: read + contents: write + discussions: write + issues: write + pull-requests: write + outputs: + run_url: ${{ steps.record.outputs.run_url }} + steps: + - name: Checkout actions folder + uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + with: + sparse-checkout: | + actions + persist-credentials: false + + - name: Setup Scripts + uses: github/gh-aw-actions/setup@5c2fe865bb4dc46e1450f6ee0d0541d759aea73a # v0.79.6 + with: + destination: ${{ runner.temp }}/gh-aw/actions + + - name: Check admin/maintainer permissions + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/check_team_member.cjs'); + await main(); + + - name: Apply Safe Outputs + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GH_AW_RUN_URL: ${{ inputs.run_url }} + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/apply_safe_outputs_replay.cjs'); + await main(); + + - name: Record outputs + id: record + run: echo "run_url=${{ inputs.run_url }}" >> "$GITHUB_OUTPUT" + + create_labels: + if: ${{ (github.event_name == 'workflow_dispatch' || github.event_name == 'workflow_call') && inputs.operation == 'create_labels' && (!(github.event.repository.fork)) }} + runs-on: ubuntu-slim + permissions: + contents: read + issues: write + steps: + - name: Checkout repository + uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + with: + persist-credentials: false + + - name: Setup Scripts + uses: github/gh-aw-actions/setup@5c2fe865bb4dc46e1450f6ee0d0541d759aea73a # v0.79.6 + with: + destination: ${{ runner.temp }}/gh-aw/actions + + - name: Check admin/maintainer permissions + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/check_team_member.cjs'); + await main(); + + - name: Install gh-aw + uses: github/gh-aw-actions/setup-cli@5c2fe865bb4dc46e1450f6ee0d0541d759aea73a # v0.79.6 + with: + version: v0.79.6 + + - name: Create missing labels + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_CMD_PREFIX: gh aw + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/create_labels.cjs'); + await main(); + + activity_report: + if: ${{ (github.event_name == 'workflow_dispatch' || github.event_name == 'workflow_call') && inputs.operation == 'activity_report' && (!(github.event.repository.fork)) }} + runs-on: ubuntu-slim + timeout-minutes: 120 + permissions: + actions: read + contents: read + issues: write + steps: + - name: Checkout repository + uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + with: + persist-credentials: false + + - name: Setup Scripts + uses: github/gh-aw-actions/setup@5c2fe865bb4dc46e1450f6ee0d0541d759aea73a # v0.79.6 + with: + destination: ${{ runner.temp }}/gh-aw/actions + + - name: Check admin/maintainer permissions + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/check_team_member.cjs'); + await main(); + + - name: Install gh-aw + uses: github/gh-aw-actions/setup-cli@5c2fe865bb4dc46e1450f6ee0d0541d759aea73a # v0.79.6 + with: + version: v0.79.6 + + - name: Restore activity report logs cache + id: activity_report_logs_cache + uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5 + with: + path: ./.cache/gh-aw/activity-report-logs + key: ${{ runner.os }}-activity-report-logs-${{ github.repository }}-${{ github.ref_name }}-${{ github.run_id }} + restore-keys: | + ${{ runner.os }}-activity-report-logs-${{ github.repository }}- + ${{ runner.os }}-activity-report-logs- + - name: Download activity report logs + timeout-minutes: 20 + shell: bash + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GH_AW_CMD_PREFIX: gh aw + run: | + ${GH_AW_CMD_PREFIX} logs \ + --repo "${{ github.repository }}" \ + --start-date -1w \ + --count 100 \ + --output ./.cache/gh-aw/activity-report-logs \ + --format markdown \ + > ./.cache/gh-aw/activity-report-logs/report.md + + - name: Save activity report logs cache + if: ${{ always() }} + uses: actions/cache/save@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5 + with: + path: ./.cache/gh-aw/activity-report-logs + key: ${{ steps.activity_report_logs_cache.outputs.cache-primary-key }} + + - name: Generate activity report issue + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const fs = require('node:fs'); + const reportPath = './.cache/gh-aw/activity-report-logs/report.md'; + if (!fs.existsSync(reportPath)) { + core.warning('Activity report markdown not found at ' + reportPath + '; skipping issue creation.'); + return; + } + let reportBody = ''; + try { + reportBody = fs.readFileSync(reportPath, 'utf8').trim(); + } catch (error) { + core.warning('Failed to read activity report markdown at ' + reportPath + ': ' + error.message); + return; + } + if (!reportBody) { + core.warning('Activity report markdown is empty at ' + reportPath + '; skipping issue creation.'); + return; + } + const repoSlug = context.repo.owner + '/' + context.repo.repo; + const body = [ + '### Agentic workflow activity report', + '', + 'Repository: ' + repoSlug, + 'Generated at: ' + new Date().toISOString(), + '', + reportBody, + ].join('\n'); + const createdIssue = await github.rest.issues.create({ + owner: context.repo.owner, + repo: context.repo.repo, + title: '[aw] agentic status report', + body, + labels: ['agentic-workflows'], + }); + core.info('Created issue #' + createdIssue.data.number + ': ' + createdIssue.data.html_url); + + forecast_report: + if: ${{ (github.event_name == 'workflow_dispatch' || github.event_name == 'workflow_call') && inputs.operation == 'forecast' && (!(github.event.repository.fork)) }} + runs-on: ubuntu-slim + timeout-minutes: 60 + permissions: + actions: read + contents: read + issues: write + steps: + - name: Checkout repository + uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + with: + persist-credentials: false + + - name: Setup Scripts + uses: github/gh-aw-actions/setup@5c2fe865bb4dc46e1450f6ee0d0541d759aea73a # v0.79.6 + with: + destination: ${{ runner.temp }}/gh-aw/actions + + - name: Check admin/maintainer permissions + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/check_team_member.cjs'); + await main(); + + - name: Install gh-aw + uses: github/gh-aw-actions/setup-cli@5c2fe865bb4dc46e1450f6ee0d0541d759aea73a # v0.79.6 + with: + version: v0.79.6 + + - name: Restore forecast report logs cache + id: forecast_report_logs_cache + uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5 + with: + path: ./.github/aw/logs + key: ${{ runner.os }}-forecast-report-logs-${{ github.repository }}-${{ github.ref_name }}-${{ github.run_id }} + restore-keys: | + ${{ runner.os }}-forecast-report-logs-${{ github.repository }}- + ${{ runner.os }}-forecast-report-logs- + + - name: Generate forecast report + id: generate_forecast_report + timeout-minutes: 30 + shell: bash + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + DEBUG: "*" + GH_AW_CMD_PREFIX: gh aw + run: | + mkdir -p ./.cache/gh-aw/forecast + set +e + ${GH_AW_CMD_PREFIX} forecast --repo "${{ github.repository }}" --timeout 30 --verbose --json > ./.cache/gh-aw/forecast/report.json + forecast_exit_code=$? + set -e + if [ "${forecast_exit_code}" -eq 124 ]; then + echo '{"outcome":"timeout","message":"Forecast computation timed out after 30 minutes."}' > ./.cache/gh-aw/forecast/error.json + echo "::error::Forecast computation timed out after 30 minutes." + exit 1 + fi + if [ "${forecast_exit_code}" -ne 0 ]; then + echo '{"outcome":"error","message":"Forecast computation failed before producing a report."}' > ./.cache/gh-aw/forecast/error.json + echo "::error::Forecast computation failed with exit code ${forecast_exit_code}." + exit 1 + fi + + - name: Debug forecast logs folder + if: ${{ always() }} + shell: bash + run: | + if [ ! -d ./.github/aw/logs ]; then + echo "Logs directory not found: ./.github/aw/logs" + exit 0 + fi + echo "Files under ./.github/aw/logs:" + find ./.github/aw/logs -type f | sort + + - name: Save forecast report logs cache + if: ${{ always() }} + uses: actions/cache/save@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5 + with: + path: ./.github/aw/logs + key: ${{ runner.os }}-forecast-report-logs-${{ github.repository }}-${{ github.ref_name }}-${{ github.run_id }} + + - name: Generate forecast issue + if: ${{ always() }} + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + FORECAST_STEP_OUTCOME: ${{ steps.generate_forecast_report.outcome }} + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/create_forecast_issue.cjs'); + await main(); + + close_agentic_workflows_issues: + if: ${{ (github.event_name == 'workflow_dispatch' || github.event_name == 'workflow_call') && inputs.operation == 'close_agentic_workflows_issues' && (!(github.event.repository.fork)) }} + runs-on: ubuntu-slim + permissions: + issues: write + steps: + - name: Setup Scripts + uses: github/gh-aw-actions/setup@5c2fe865bb4dc46e1450f6ee0d0541d759aea73a # v0.79.6 + with: + destination: ${{ runner.temp }}/gh-aw/actions + + - name: Check admin/maintainer permissions + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/check_team_member.cjs'); + await main(); + + - name: Close no-repro agentic-workflows issues + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/close_agentic_workflows_issues.cjs'); + await main(); + + validate_workflows: + if: ${{ (github.event_name == 'workflow_dispatch' || github.event_name == 'workflow_call') && inputs.operation == 'validate' && (!(github.event.repository.fork)) }} + runs-on: ubuntu-latest + permissions: + contents: read + issues: write + steps: + - name: Checkout repository + uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + with: + persist-credentials: false + + - name: Setup Scripts + uses: github/gh-aw-actions/setup@5c2fe865bb4dc46e1450f6ee0d0541d759aea73a # v0.79.6 + with: + destination: ${{ runner.temp }}/gh-aw/actions + + - name: Check admin/maintainer permissions + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/check_team_member.cjs'); + await main(); + + - name: Install gh-aw + uses: github/gh-aw-actions/setup-cli@5c2fe865bb4dc46e1450f6ee0d0541d759aea73a # v0.79.6 + with: + version: v0.79.6 + + - name: Validate workflows and file issue on findings + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_CMD_PREFIX: gh aw + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/run_validate_workflows.cjs'); + await main(); diff --git a/.github/workflows/auto-code.lock.yml b/.github/workflows/auto-code.lock.yml index 919efe7..2a10a78 100644 --- a/.github/workflows/auto-code.lock.yml +++ b/.github/workflows/auto-code.lock.yml @@ -1,5 +1,5 @@ -# gh-aw-metadata: {"schema_version":"v3","frontmatter_hash":"158e10df0b3421742ed672f7a5667899e0977be63eed6a6fa996ccb9de250211","compiler_version":"v0.71.5","agent_id":"copilot"} -# gh-aw-manifest: {"version":1,"secrets":["COPILOT_GITHUB_TOKEN","GH_AW_CI_TRIGGER_TOKEN","GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GITHUB_TOKEN","OPENAI_API_KEY"],"actions":[{"repo":"actions/checkout","sha":"de0fac2e4500dabe0009e67214ff5f5447ce83dd","version":"v6.0.2"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"},{"repo":"github/gh-aw-actions/setup","sha":"b8068426813005612b960b5ab0b8bd2c27142323","version":"v0.71.5"}],"containers":[{"image":"ghcr.io/github/github-mcp-server:v1.0.3","digest":"sha256:2ac27ef03461ef2b877031b838a7d1fd7f12b12d4ace7796d8cad91446d55959","pinned_image":"ghcr.io/github/github-mcp-server:v1.0.3@sha256:2ac27ef03461ef2b877031b838a7d1fd7f12b12d4ace7796d8cad91446d55959"},{"image":"node:lts-alpine","digest":"sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f","pinned_image":"node:lts-alpine@sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f"}]} +# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"2db2d71c8e339e852eac5725e4d115b95a5f802b476179caca5c78d07e99d221","body_hash":"f4631eca0387739bc44c8ad08d5c0670c98c72198743c2ea9240d97915dca04e","compiler_version":"v0.79.6","agent_id":"copilot","engine_versions":{"copilot":"1.0.60"}} +# gh-aw-manifest: {"version":1,"secrets":["GH_AW_CI_TRIGGER_TOKEN","GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GITHUB_TOKEN","OPENAI_API_KEY"],"actions":[{"repo":"actions/checkout","sha":"df4cb1c069e1874edd31b4311f1884172cec0e10","version":"v6.0.3"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"},{"repo":"github/gh-aw-actions/setup","sha":"5c2fe865bb4dc46e1450f6ee0d0541d759aea73a","version":"v0.79.6"}],"containers":[{"image":"ghcr.io/github/github-mcp-server:v1.1.2","digest":"sha256:30197479d8036c7811892bc07e06f9a05c9ef3cdd79bc59f256d50647f95788c","pinned_image":"ghcr.io/github/github-mcp-server:v1.1.2@sha256:30197479d8036c7811892bc07e06f9a05c9ef3cdd79bc59f256d50647f95788c"}]} # ___ _ _ # / _ \ | | (_) # | |_| | __ _ ___ _ __ | |_ _ ___ @@ -14,7 +14,7 @@ # \ /\ / (_) | | | | ( | | | | (_) \ V V /\__ \ # \/ \/ \___/|_| |_|\_\|_| |_|\___/ \_/\_/ |___/ # -# This file was automatically generated by gh-aw (v0.71.5). DO NOT EDIT. +# This file was automatically generated by gh-aw (v0.79.6). DO NOT EDIT. # # To update this file, edit the corresponding .md file and run: # gh aw compile @@ -24,7 +24,6 @@ # # # Secrets used: -# - COPILOT_GITHUB_TOKEN # - GH_AW_CI_TRIGGER_TOKEN # - GH_AW_GITHUB_MCP_SERVER_TOKEN # - GH_AW_GITHUB_TOKEN @@ -32,18 +31,17 @@ # - OPENAI_API_KEY # # Custom actions used: -# - actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 +# - actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 # - actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 # - actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 # - actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 -# - github/gh-aw-actions/setup@b8068426813005612b960b5ab0b8bd2c27142323 # v0.71.5 +# - github/gh-aw-actions/setup@5c2fe865bb4dc46e1450f6ee0d0541d759aea73a # v0.79.6 # # Container images used: -# - ghcr.io/github/github-mcp-server:v1.0.3@sha256:2ac27ef03461ef2b877031b838a7d1fd7f12b12d4ace7796d8cad91446d55959 -# - node:lts-alpine@sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f +# - ghcr.io/github/github-mcp-server:v1.1.2@sha256:30197479d8036c7811892bc07e06f9a05c9ef3cdd79bc59f256d50647f95788c name: "自动处理 Issue" -"on": +on: issues: types: - labeled @@ -63,13 +61,20 @@ jobs: permissions: actions: read contents: read + env: + GH_AW_MAX_DAILY_AI_CREDITS: ${{ vars.GH_AW_DEFAULT_MAX_DAILY_AI_CREDITS || '5000' }} outputs: body: ${{ steps.sanitized.outputs.body }} comment_id: "" comment_repo: "" + daily_effective_workflow_exceeded: ${{ steps.daily-effective-workflow-guardrail.outputs.daily_effective_workflow_exceeded == 'true' }} + daily_effective_workflow_threshold: ${{ steps.daily-effective-workflow-guardrail.outputs.daily_effective_workflow_threshold || '' }} + daily_effective_workflow_total_effective_tokens: ${{ steps.daily-effective-workflow-guardrail.outputs.daily_effective_workflow_total_effective_tokens || '' }} engine_id: ${{ steps.generate_aw_info.outputs.engine_id }} lockdown_check_failed: ${{ steps.generate_aw_info.outputs.lockdown_check_failed == 'true' }} model: ${{ steps.generate_aw_info.outputs.model }} + setup-parent-span-id: ${{ steps.setup.outputs.parent-span-id || steps.setup.outputs.span-id }} + setup-span-id: ${{ steps.setup.outputs.span-id }} setup-trace-id: ${{ steps.setup.outputs.trace-id }} stale_lock_file_failed: ${{ steps.check-lock-file.outputs.stale_lock_file_failed == 'true' }} text: ${{ steps.sanitized.outputs.text }} @@ -77,24 +82,27 @@ jobs: steps: - name: Setup Scripts id: setup - uses: github/gh-aw-actions/setup@b8068426813005612b960b5ab0b8bd2c27142323 # v0.71.5 + uses: github/gh-aw-actions/setup@5c2fe865bb4dc46e1450f6ee0d0541d759aea73a # v0.79.6 with: destination: ${{ runner.temp }}/gh-aw/actions job-name: ${{ github.job }} trace-id: ${{ needs.pre_activation.outputs.setup-trace-id }} + parent-span-id: ${{ needs.pre_activation.outputs.setup-parent-span-id || needs.pre_activation.outputs.setup-span-id }} + safe-output-artifact-client: ${{ env.GH_AW_MAX_DAILY_AI_CREDITS != '' }} env: GH_AW_SETUP_WORKFLOW_NAME: "自动处理 Issue" GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/auto-code.lock.yml@${{ github.ref }} - GH_AW_INFO_VERSION: "1.0.40" + GH_AW_INFO_VERSION: "1.0.60" + GH_AW_INFO_ENGINE_ID: "copilot" - name: Generate agentic run info id: generate_aw_info env: GH_AW_INFO_ENGINE_ID: "copilot" GH_AW_INFO_ENGINE_NAME: "GitHub Copilot CLI" - GH_AW_INFO_MODEL: ${{ vars.GH_AW_MODEL_AGENT_COPILOT || 'claude-sonnet-4.6' }} - GH_AW_INFO_VERSION: "1.0.40" - GH_AW_INFO_AGENT_VERSION: "1.0.40" - GH_AW_INFO_CLI_VERSION: "v0.71.5" + GH_AW_INFO_MODEL: ${{ vars.GH_AW_MODEL_AGENT_COPILOT || vars.GH_AW_DEFAULT_MODEL_COPILOT || 'claude-sonnet-4.6' }} + GH_AW_INFO_VERSION: "1.0.60" + GH_AW_INFO_AGENT_VERSION: "1.0.60" + GH_AW_INFO_CLI_VERSION: "v0.79.6" GH_AW_INFO_WORKFLOW_NAME: "自动处理 Issue" GH_AW_INFO_EXPERIMENTAL: "false" GH_AW_INFO_SUPPORTS_TOOLS_ALLOWLIST: "true" @@ -112,13 +120,32 @@ jobs: setupGlobals(core, github, context, exec, io, getOctokit); const { main } = require('${{ runner.temp }}/gh-aw/actions/generate_aw_info.cjs'); await main(core, context); + - name: Check daily workflow token guardrail + id: daily-effective-workflow-guardrail + if: ${{ env.GH_AW_MAX_DAILY_AI_CREDITS != '' }} + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_WORKFLOW_NAME: "自动处理 Issue" + GH_AW_WORKFLOW_ID: "auto-code" + GH_AW_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} + GH_AW_WORKFLOW_DISPATCH_AW_CONTEXT: ${{ github.event.inputs.aw_context || '' }} + GH_AW_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GH_AW_MAX_DAILY_AI_CREDITS: ${{ vars.GH_AW_DEFAULT_MAX_DAILY_AI_CREDITS || '5000' }} + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/check_daily_aic_workflow_guardrail.cjs'); + await main(); - name: Checkout .github and .agents folders - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 with: persist-credentials: false sparse-checkout: | .github .agents + .antigravity .claude .codex .crush @@ -129,8 +156,8 @@ jobs: fetch-depth: 1 - name: Save agent config folders for base branch restoration env: - GH_AW_AGENT_FOLDERS: ".agents .claude .codex .crush .gemini .github .opencode .pi" - GH_AW_AGENT_FILES: ".crush.json AGENTS.md CLAUDE.md GEMINI.md PI.md opencode.jsonc" + GH_AW_AGENT_FOLDERS: ".agents .antigravity .claude .codex .crush .gemini .github .opencode .pi" + GH_AW_AGENT_FILES: ".crush.json AGENTS.md ANTIGRAVITY.md CLAUDE.md GEMINI.md PI.md opencode.jsonc" # poutine:ignore untrusted_checkout_exec run: bash "${RUNNER_TEMP}/gh-aw/actions/save_base_github_folders.sh" - name: Check workflow lock file @@ -148,7 +175,7 @@ jobs: - name: Check compile-agentic version uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 env: - GH_AW_COMPILED_VERSION: "v0.71.5" + GH_AW_COMPILED_VERSION: "v0.79.6" with: script: | const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); @@ -170,11 +197,12 @@ jobs: env: GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt GH_AW_SAFE_OUTPUTS: ${{ runner.temp }}/gh-aw/safeoutputs/outputs.jsonl + GH_AW_EXPR_1A3A194A: ${{ github.event.discussion.number || (fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_type == 'discussion' && fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_number) }} + GH_AW_EXPR_463A214A: ${{ github.event.pull_request.number || (fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_type == 'pull_request' && fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_number) }} + GH_AW_EXPR_802A9F6A: ${{ github.event.issue.number || (fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_type == 'issue' && fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_number) }} + GH_AW_EXPR_FF1D34CE: ${{ github.event.comment.id || fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').comment_id }} GH_AW_GITHUB_ACTOR: ${{ github.actor }} - GH_AW_GITHUB_EVENT_COMMENT_ID: ${{ github.event.comment.id }} - GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER: ${{ github.event.discussion.number }} GH_AW_GITHUB_EVENT_ISSUE_NUMBER: ${{ github.event.issue.number }} - GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER: ${{ github.event.pull_request.number }} GH_AW_GITHUB_REPOSITORY: ${{ github.repository }} GH_AW_GITHUB_RUN_ID: ${{ github.run_id }} GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }} @@ -182,57 +210,57 @@ jobs: run: | bash "${RUNNER_TEMP}/gh-aw/actions/create_prompt_first.sh" { - cat << 'GH_AW_PROMPT_de410bcdbc8f0b37_EOF' + cat << 'GH_AW_PROMPT_791c723be483e095_EOF' - GH_AW_PROMPT_de410bcdbc8f0b37_EOF + GH_AW_PROMPT_791c723be483e095_EOF cat "${RUNNER_TEMP}/gh-aw/prompts/xpia.md" cat "${RUNNER_TEMP}/gh-aw/prompts/temp_folder_prompt.md" cat "${RUNNER_TEMP}/gh-aw/prompts/markdown.md" cat "${RUNNER_TEMP}/gh-aw/prompts/safe_outputs_prompt.md" - cat << 'GH_AW_PROMPT_de410bcdbc8f0b37_EOF' + cat << 'GH_AW_PROMPT_791c723be483e095_EOF' Tools: add_comment, create_pull_request, missing_tool, missing_data, noop - GH_AW_PROMPT_de410bcdbc8f0b37_EOF + GH_AW_PROMPT_791c723be483e095_EOF cat "${RUNNER_TEMP}/gh-aw/prompts/safe_outputs_create_pull_request.md" - cat << 'GH_AW_PROMPT_de410bcdbc8f0b37_EOF' + cat << 'GH_AW_PROMPT_791c723be483e095_EOF' - GH_AW_PROMPT_de410bcdbc8f0b37_EOF + GH_AW_PROMPT_791c723be483e095_EOF cat "${RUNNER_TEMP}/gh-aw/prompts/mcp_cli_tools_prompt.md" - cat << 'GH_AW_PROMPT_de410bcdbc8f0b37_EOF' + cat << 'GH_AW_PROMPT_791c723be483e095_EOF' The following GitHub context information is available for this workflow: - {{#if __GH_AW_GITHUB_ACTOR__ }} + {{#if github.actor}} - **actor**: __GH_AW_GITHUB_ACTOR__ {{/if}} - {{#if __GH_AW_GITHUB_REPOSITORY__ }} + {{#if github.repository}} - **repository**: __GH_AW_GITHUB_REPOSITORY__ {{/if}} - {{#if __GH_AW_GITHUB_WORKSPACE__ }} + {{#if github.workspace}} - **workspace**: __GH_AW_GITHUB_WORKSPACE__ {{/if}} - {{#if __GH_AW_GITHUB_EVENT_ISSUE_NUMBER__ }} - - **issue-number**: #__GH_AW_GITHUB_EVENT_ISSUE_NUMBER__ + {{#if github.event.issue.number || (github.aw.context.item_type == 'issue' && github.aw.context.item_number)}} + - **issue-number**: #__GH_AW_EXPR_802A9F6A__ {{/if}} - {{#if __GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER__ }} - - **discussion-number**: #__GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER__ + {{#if github.event.discussion.number || (github.aw.context.item_type == 'discussion' && github.aw.context.item_number)}} + - **discussion-number**: #__GH_AW_EXPR_1A3A194A__ {{/if}} - {{#if __GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER__ }} - - **pull-request-number**: #__GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER__ + {{#if github.event.pull_request.number || (github.aw.context.item_type == 'pull_request' && github.aw.context.item_number)}} + - **pull-request-number**: #__GH_AW_EXPR_463A214A__ {{/if}} - {{#if __GH_AW_GITHUB_EVENT_COMMENT_ID__ }} - - **comment-id**: __GH_AW_GITHUB_EVENT_COMMENT_ID__ + {{#if github.event.comment.id || github.aw.context.comment_id}} + - **comment-id**: __GH_AW_EXPR_FF1D34CE__ {{/if}} - {{#if __GH_AW_GITHUB_RUN_ID__ }} + {{#if github.run_id}} - **workflow-run-id**: __GH_AW_GITHUB_RUN_ID__ {{/if}} - GH_AW_PROMPT_de410bcdbc8f0b37_EOF + GH_AW_PROMPT_791c723be483e095_EOF cat "${RUNNER_TEMP}/gh-aw/prompts/github_mcp_tools_with_safeoutputs_prompt.md" - cat << 'GH_AW_PROMPT_de410bcdbc8f0b37_EOF' + cat << 'GH_AW_PROMPT_791c723be483e095_EOF' {{#runtime-import .github/workflows/auto-code.md}} - GH_AW_PROMPT_de410bcdbc8f0b37_EOF + GH_AW_PROMPT_791c723be483e095_EOF } > "$GH_AW_PROMPT" - name: Interpolate variables and render templates uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 @@ -250,11 +278,12 @@ jobs: uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 env: GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt + GH_AW_EXPR_1A3A194A: ${{ github.event.discussion.number || (fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_type == 'discussion' && fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_number) }} + GH_AW_EXPR_463A214A: ${{ github.event.pull_request.number || (fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_type == 'pull_request' && fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_number) }} + GH_AW_EXPR_802A9F6A: ${{ github.event.issue.number || (fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_type == 'issue' && fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_number) }} + GH_AW_EXPR_FF1D34CE: ${{ github.event.comment.id || fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').comment_id }} GH_AW_GITHUB_ACTOR: ${{ github.actor }} - GH_AW_GITHUB_EVENT_COMMENT_ID: ${{ github.event.comment.id }} - GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER: ${{ github.event.discussion.number }} GH_AW_GITHUB_EVENT_ISSUE_NUMBER: ${{ github.event.issue.number }} - GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER: ${{ github.event.pull_request.number }} GH_AW_GITHUB_REPOSITORY: ${{ github.repository }} GH_AW_GITHUB_RUN_ID: ${{ github.run_id }} GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }} @@ -271,11 +300,12 @@ jobs: return await substitutePlaceholders({ file: process.env.GH_AW_PROMPT, substitutions: { + GH_AW_EXPR_1A3A194A: process.env.GH_AW_EXPR_1A3A194A, + GH_AW_EXPR_463A214A: process.env.GH_AW_EXPR_463A214A, + GH_AW_EXPR_802A9F6A: process.env.GH_AW_EXPR_802A9F6A, + GH_AW_EXPR_FF1D34CE: process.env.GH_AW_EXPR_FF1D34CE, GH_AW_GITHUB_ACTOR: process.env.GH_AW_GITHUB_ACTOR, - GH_AW_GITHUB_EVENT_COMMENT_ID: process.env.GH_AW_GITHUB_EVENT_COMMENT_ID, - GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER: process.env.GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER, GH_AW_GITHUB_EVENT_ISSUE_NUMBER: process.env.GH_AW_GITHUB_EVENT_ISSUE_NUMBER, - GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER: process.env.GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER, GH_AW_GITHUB_REPOSITORY: process.env.GH_AW_GITHUB_REPOSITORY, GH_AW_GITHUB_RUN_ID: process.env.GH_AW_GITHUB_RUN_ID, GH_AW_GITHUB_WORKSPACE: process.env.GH_AW_GITHUB_WORKSPACE, @@ -301,17 +331,25 @@ jobs: include-hidden-files: true path: | /tmp/gh-aw/aw_info.json + /tmp/gh-aw/model_multipliers.json + /tmp/gh-aw/models.json /tmp/gh-aw/aw-prompts/prompt.txt + /tmp/gh-aw/aw-prompts/prompt-template.txt + /tmp/gh-aw/aw-prompts/prompt-import-tree.json /tmp/gh-aw/github_rate_limits.jsonl /tmp/gh-aw/base + /tmp/gh-aw/.github/agents + /tmp/gh-aw/.github/skills if-no-files-found: ignore retention-days: 1 agent: needs: activation + if: needs.activation.outputs.daily_effective_workflow_exceeded != 'true' runs-on: ubuntu-latest permissions: contents: read + copilot-requests: write issues: read pull-requests: read env: @@ -322,29 +360,37 @@ jobs: GH_AW_MCP_LOG_DIR: /tmp/gh-aw/mcp-logs/safeoutputs GH_AW_WORKFLOW_ID_SANITIZED: autocode outputs: - agentic_engine_timeout: ${{ steps.detect-copilot-errors.outputs.agentic_engine_timeout || 'false' }} + agentic_engine_timeout: ${{ steps.detect-agent-errors.outputs.agentic_engine_timeout || 'false' }} + ai_credits_rate_limit_error: ${{ steps.parse-mcp-gateway.outputs.ai_credits_rate_limit_error || 'false' }} + aic: ${{ steps.parse-mcp-gateway.outputs.aic }} + ambient_context: ${{ steps.parse-mcp-gateway.outputs.ambient_context }} checkout_pr_success: ${{ steps.checkout-pr.outputs.checkout_pr_success || 'true' }} effective_tokens: ${{ steps.parse-mcp-gateway.outputs.effective_tokens }} has_patch: ${{ steps.collect_output.outputs.has_patch }} - inference_access_error: ${{ steps.detect-copilot-errors.outputs.inference_access_error || 'false' }} - mcp_policy_error: ${{ steps.detect-copilot-errors.outputs.mcp_policy_error || 'false' }} + inference_access_error: ${{ steps.detect-agent-errors.outputs.inference_access_error || 'false' }} + mcp_policy_error: ${{ steps.detect-agent-errors.outputs.mcp_policy_error || 'false' }} model: ${{ needs.activation.outputs.model }} - model_not_supported_error: ${{ steps.detect-copilot-errors.outputs.model_not_supported_error || 'false' }} + model_not_supported_error: ${{ steps.detect-agent-errors.outputs.model_not_supported_error || 'false' }} output: ${{ steps.collect_output.outputs.output }} output_types: ${{ steps.collect_output.outputs.output_types }} + setup-parent-span-id: ${{ steps.setup.outputs.parent-span-id || steps.setup.outputs.span-id }} + setup-span-id: ${{ steps.setup.outputs.span-id }} setup-trace-id: ${{ steps.setup.outputs.trace-id }} + unknown_model_ai_credits: ${{ steps.parse-mcp-gateway.outputs.unknown_model_ai_credits || 'false' }} steps: - name: Setup Scripts id: setup - uses: github/gh-aw-actions/setup@b8068426813005612b960b5ab0b8bd2c27142323 # v0.71.5 + uses: github/gh-aw-actions/setup@5c2fe865bb4dc46e1450f6ee0d0541d759aea73a # v0.79.6 with: destination: ${{ runner.temp }}/gh-aw/actions job-name: ${{ github.job }} trace-id: ${{ needs.activation.outputs.setup-trace-id }} + parent-span-id: ${{ needs.activation.outputs.setup-parent-span-id || needs.activation.outputs.setup-span-id }} env: GH_AW_SETUP_WORKFLOW_NAME: "自动处理 Issue" GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/auto-code.lock.yml@${{ github.ref }} - GH_AW_INFO_VERSION: "1.0.40" + GH_AW_INFO_VERSION: "1.0.60" + GH_AW_INFO_ENGINE_ID: "copilot" - name: Set runtime paths id: set-runtime-paths run: | @@ -354,7 +400,7 @@ jobs: echo "GH_AW_SAFE_OUTPUTS_TOOLS_PATH=${RUNNER_TEMP}/gh-aw/safeoutputs/tools.json" } >> "$GITHUB_OUTPUT" - name: Checkout repository - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 with: persist-credentials: false - name: Create gh-aw temp directory @@ -379,7 +425,7 @@ jobs: - name: Checkout PR branch id: checkout-pr if: | - github.event.pull_request || github.event.issue.pull_request + github.event.pull_request || github.event.issue.pull_request || github.event_name == 'workflow_dispatch' && fromJSON(github.event.inputs.aw_context || '{}').item_type == 'pull_request' uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 env: GH_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} @@ -391,7 +437,7 @@ jobs: const { main } = require('${{ runner.temp }}/gh-aw/actions/checkout_pr_branch.cjs'); await main(); - name: Install GitHub Copilot CLI - run: bash "${RUNNER_TEMP}/gh-aw/actions/install_copilot_cli.sh" 1.0.40 + run: bash "${RUNNER_TEMP}/gh-aw/actions/install_copilot_cli.sh" 1.0.60 env: GH_HOST: github.com - name: Parse integrity filter lists @@ -409,19 +455,28 @@ jobs: - name: Restore agent config folders from base branch if: steps.checkout-pr.outcome == 'success' env: - GH_AW_AGENT_FOLDERS: ".agents .claude .codex .crush .gemini .github .opencode .pi" - GH_AW_AGENT_FILES: ".crush.json AGENTS.md CLAUDE.md GEMINI.md PI.md opencode.jsonc" + GH_AW_AGENT_FOLDERS: ".agents .antigravity .claude .codex .crush .gemini .github .opencode .pi" + GH_AW_AGENT_FILES: ".crush.json AGENTS.md ANTIGRAVITY.md CLAUDE.md GEMINI.md PI.md opencode.jsonc" run: bash "${RUNNER_TEMP}/gh-aw/actions/restore_base_github_folders.sh" + - name: Restore inline sub-agents from activation artifact + env: + GH_AW_SUB_AGENT_DIR: ".github/agents" + GH_AW_SUB_AGENT_EXT: ".agent.md" + run: bash "${RUNNER_TEMP}/gh-aw/actions/restore_inline_sub_agents.sh" + - name: Restore inline skills from activation artifact + env: + GH_AW_SKILL_DIR: ".github/skills" + run: bash "${RUNNER_TEMP}/gh-aw/actions/restore_inline_skills.sh" - name: Download container images - run: bash "${RUNNER_TEMP}/gh-aw/actions/download_docker_images.sh" ghcr.io/github/github-mcp-server:v1.0.3@sha256:2ac27ef03461ef2b877031b838a7d1fd7f12b12d4ace7796d8cad91446d55959 node:lts-alpine@sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f + run: bash "${RUNNER_TEMP}/gh-aw/actions/download_docker_images.sh" ghcr.io/github/github-mcp-server:v1.1.2@sha256:30197479d8036c7811892bc07e06f9a05c9ef3cdd79bc59f256d50647f95788c - name: Generate Safe Outputs Config run: | mkdir -p "${RUNNER_TEMP}/gh-aw/safeoutputs" mkdir -p /tmp/gh-aw/safeoutputs mkdir -p /tmp/gh-aw/mcp-logs/safeoutputs - cat > "${RUNNER_TEMP}/gh-aw/safeoutputs/config.json" << 'GH_AW_SAFE_OUTPUTS_CONFIG_982fd4401303461a_EOF' - {"add_comment":{"max":1},"create_pull_request":{"base_branch":"develop","max":1,"max_patch_files":100,"max_patch_size":1024,"protect_top_level_dot_folders":true,"protected_files":["package.json","bun.lockb","bunfig.toml","deno.json","deno.jsonc","deno.lock","global.json","NuGet.Config","Directory.Packages.props","mix.exs","mix.lock","go.mod","go.sum","stack.yaml","stack.yaml.lock","pom.xml","build.gradle","build.gradle.kts","settings.gradle","settings.gradle.kts","gradle.properties","package-lock.json","yarn.lock","pnpm-lock.yaml","npm-shrinkwrap.json","requirements.txt","Pipfile","Pipfile.lock","pyproject.toml","setup.py","setup.cfg","Gemfile","Gemfile.lock","uv.lock","CODEOWNERS","DESIGN.md","README.md","CONTRIBUTING.md","CHANGELOG.md","SECURITY.md","CODE_OF_CONDUCT.md","AGENTS.md","CLAUDE.md","GEMINI.md"]},"create_report_incomplete_issue":{},"missing_data":{},"missing_tool":{},"noop":{"max":1,"report-as-issue":"true"},"report_incomplete":{}} - GH_AW_SAFE_OUTPUTS_CONFIG_982fd4401303461a_EOF + cat > "${RUNNER_TEMP}/gh-aw/safeoutputs/config.json" << 'GH_AW_SAFE_OUTPUTS_CONFIG_b5dafa3335f30723_EOF' + {"add_comment":{"max":1},"create_pull_request":{"base_branch":"develop","max":1,"max_patch_files":100,"max_patch_size":1024,"protect_top_level_dot_folders":true,"protected_files":["package.json","bun.lockb","bunfig.toml","deno.json","deno.jsonc","deno.lock","global.json","NuGet.Config","Directory.Packages.props","mix.exs","mix.lock","go.mod","go.sum","stack.yaml","stack.yaml.lock","pom.xml","build.gradle","build.gradle.kts","settings.gradle","settings.gradle.kts","gradle.properties","package-lock.json","yarn.lock","pnpm-lock.yaml","npm-shrinkwrap.json","requirements.txt","Pipfile","Pipfile.lock","pyproject.toml","setup.py","setup.cfg","Gemfile","Gemfile.lock","uv.lock","CODEOWNERS","DESIGN.md","README.md","CONTRIBUTING.md","CHANGELOG.md","SECURITY.md","CODE_OF_CONDUCT.md","AGENTS.md","CLAUDE.md","GEMINI.md"],"protected_files_policy":"allowed"},"create_report_incomplete_issue":{},"missing_data":{},"missing_tool":{},"noop":{"max":1,"report-as-issue":"true"},"report_incomplete":{}} + GH_AW_SAFE_OUTPUTS_CONFIG_b5dafa3335f30723_EOF - name: Generate Safe Outputs Tools env: GH_AW_TOOLS_META_JSON: | @@ -645,17 +700,22 @@ jobs: export GH_AW_ENGINE="copilot" MCP_GATEWAY_UID=$(id -u 2>/dev/null || echo '0') MCP_GATEWAY_GID=$(id -g 2>/dev/null || echo '0') - DOCKER_SOCK_GID=$(stat -c '%g' /var/run/docker.sock 2>/dev/null || echo '0') - export MCP_GATEWAY_DOCKER_COMMAND='docker run -i --rm --network host --add-host host.docker.internal:127.0.0.1 --user '"${MCP_GATEWAY_UID}"':'"${MCP_GATEWAY_GID}"' --group-add '"${DOCKER_SOCK_GID}"' -v /var/run/docker.sock:/var/run/docker.sock -e MCP_GATEWAY_PORT -e MCP_GATEWAY_DOMAIN -e MCP_GATEWAY_API_KEY -e MCP_GATEWAY_PAYLOAD_DIR -e MCP_GATEWAY_PAYLOAD_SIZE_THRESHOLD -e DEBUG -e MCP_GATEWAY_LOG_DIR -e GH_AW_MCP_LOG_DIR -e GH_AW_SAFE_OUTPUTS -e GH_AW_SAFE_OUTPUTS_CONFIG_PATH -e GH_AW_SAFE_OUTPUTS_TOOLS_PATH -e GH_AW_ASSETS_BRANCH -e GH_AW_ASSETS_MAX_SIZE_KB -e GH_AW_ASSETS_ALLOWED_EXTS -e DEFAULT_BRANCH -e GITHUB_MCP_SERVER_TOKEN -e GITHUB_MCP_GUARD_MIN_INTEGRITY -e GITHUB_MCP_GUARD_REPOS -e GITHUB_REPOSITORY -e GITHUB_SERVER_URL -e GITHUB_SHA -e GITHUB_WORKSPACE -e GITHUB_TOKEN -e GITHUB_RUN_ID -e GITHUB_RUN_NUMBER -e GITHUB_RUN_ATTEMPT -e GITHUB_JOB -e GITHUB_ACTION -e GITHUB_EVENT_NAME -e GITHUB_EVENT_PATH -e GITHUB_ACTOR -e GITHUB_ACTOR_ID -e GITHUB_TRIGGERING_ACTOR -e GITHUB_WORKFLOW -e GITHUB_WORKFLOW_REF -e GITHUB_WORKFLOW_SHA -e GITHUB_REF -e GITHUB_REF_NAME -e GITHUB_REF_TYPE -e GITHUB_HEAD_REF -e GITHUB_BASE_REF -e GH_AW_SAFE_OUTPUTS_PORT -e GH_AW_SAFE_OUTPUTS_API_KEY -v /tmp/gh-aw/mcp-payloads:/tmp/gh-aw/mcp-payloads:rw -v /opt:/opt:ro -v /tmp:/tmp:rw -v '"${GITHUB_WORKSPACE}"':'"${GITHUB_WORKSPACE}"':rw ghcr.io/github/gh-aw-mcpg:v0.3.6' + case "${DOCKER_HOST:-}" in + unix://* ) DOCKER_SOCK_PATH="${DOCKER_HOST#unix://}" ;; + /* ) DOCKER_SOCK_PATH="$DOCKER_HOST" ;; + * ) DOCKER_SOCK_PATH=/var/run/docker.sock ;; + esac + DOCKER_SOCK_GID=$(stat -c '%g' "$DOCKER_SOCK_PATH" 2>/dev/null || echo '0') + export MCP_GATEWAY_DOCKER_COMMAND='docker run -i --rm --network host --add-host host.docker.internal:127.0.0.1 --user '"${MCP_GATEWAY_UID}"':'"${MCP_GATEWAY_GID}"' --group-add '"${DOCKER_SOCK_GID}"' -v '"${DOCKER_SOCK_PATH}"':/var/run/docker.sock -e MCP_GATEWAY_PORT -e MCP_GATEWAY_DOMAIN -e MCP_GATEWAY_API_KEY -e MCP_GATEWAY_PAYLOAD_DIR -e MCP_GATEWAY_PAYLOAD_SIZE_THRESHOLD -e DOCKER_HOST=unix:///var/run/docker.sock -e DEBUG -e MCP_GATEWAY_LOG_DIR -e GH_AW_MCP_LOG_DIR -e GH_AW_SAFE_OUTPUTS -e GH_AW_SAFE_OUTPUTS_CONFIG_PATH -e GH_AW_SAFE_OUTPUTS_TOOLS_PATH -e GH_AW_ASSETS_BRANCH -e GH_AW_ASSETS_MAX_SIZE_KB -e GH_AW_ASSETS_ALLOWED_EXTS -e DEFAULT_BRANCH -e GITHUB_MCP_SERVER_TOKEN -e GITHUB_MCP_GUARD_MIN_INTEGRITY -e GITHUB_MCP_GUARD_REPOS -e GITHUB_REPOSITORY -e GITHUB_SERVER_URL -e GITHUB_SHA -e GITHUB_WORKSPACE -e GITHUB_TOKEN -e GITHUB_RUN_ID -e GITHUB_RUN_NUMBER -e GITHUB_RUN_ATTEMPT -e GITHUB_JOB -e GITHUB_ACTION -e GITHUB_EVENT_NAME -e GITHUB_EVENT_PATH -e GITHUB_ACTOR -e GITHUB_ACTOR_ID -e GITHUB_TRIGGERING_ACTOR -e GITHUB_WORKFLOW -e GITHUB_WORKFLOW_REF -e GITHUB_WORKFLOW_SHA -e GITHUB_REF -e GITHUB_REF_NAME -e GITHUB_REF_TYPE -e GITHUB_HEAD_REF -e GITHUB_BASE_REF -e GH_AW_SAFE_OUTPUTS_PORT -e GH_AW_SAFE_OUTPUTS_API_KEY -v /tmp/gh-aw/mcp-payloads:/tmp/gh-aw/mcp-payloads:rw -v /opt:/opt:ro -v /tmp:/tmp:rw -v '"${GITHUB_WORKSPACE}"':'"${GITHUB_WORKSPACE}"':rw ghcr.io/github/gh-aw-mcpg:v0.3.25' mkdir -p /home/runner/.copilot GH_AW_NODE=$(which node 2>/dev/null || command -v node 2>/dev/null || echo node) - cat << GH_AW_MCP_CONFIG_01a7963a8b9bf043_EOF | "$GH_AW_NODE" "${RUNNER_TEMP}/gh-aw/actions/start_mcp_gateway.cjs" + cat << GH_AW_MCP_CONFIG_f41962abaffbda74_EOF | "$GH_AW_NODE" "${RUNNER_TEMP}/gh-aw/actions/start_mcp_gateway.cjs" { "mcpServers": { "github": { "type": "stdio", - "container": "ghcr.io/github/github-mcp-server:v1.0.3", + "container": "ghcr.io/github/github-mcp-server:v1.1.2", "env": { "GITHUB_HOST": "\${GITHUB_SERVER_URL}", "GITHUB_PERSONAL_ACCESS_TOKEN": "\${GITHUB_MCP_SERVER_TOKEN}", @@ -694,7 +754,7 @@ jobs: "payloadDir": "${MCP_GATEWAY_PAYLOAD_DIR}" } } - GH_AW_MCP_CONFIG_01a7963a8b9bf043_EOF + GH_AW_MCP_CONFIG_f41962abaffbda74_EOF - name: Mount MCP servers as CLIs id: mount-mcp-clis continue-on-error: true @@ -735,6 +795,7 @@ jobs: # --allow-tool shell(grep) # --allow-tool shell(head) # --allow-tool shell(ls) + # --allow-tool shell(printf) # --allow-tool shell(pwd) # --allow-tool shell(safeoutputs:*) # --allow-tool shell(sort) @@ -746,26 +807,31 @@ jobs: timeout-minutes: 20 run: | set -o pipefail + printf '%s' "$(date +%s%3N)" > /tmp/gh-aw/agent_cli_start_ms.txt touch /tmp/gh-aw/agent-step-summary.md (umask 177 && touch /tmp/gh-aw/agent-stdio.log) + trap 'rm -f /home/runner/.copilot/settings.json' EXIT + mkdir -p /home/runner/.copilot + printf '%s' '{"builtInAgents":{"rubberDuck":false}}' > /home/runner/.copilot/settings.json mkdir -p /tmp/ mkdir -p /tmp/gh-aw/ mkdir -p /tmp/gh-aw/agent/ mkdir -p /tmp/gh-aw/sandbox/agent/logs/ - GH_AW_NODE_EXEC="${GH_AW_NODE_BIN:-}"; if [ -z "$GH_AW_NODE_EXEC" ] || [ ! -x "$GH_AW_NODE_EXEC" ]; then GH_AW_NODE_EXEC="$(command -v node 2>/dev/null || echo node)"; fi; "$GH_AW_NODE_EXEC" ${RUNNER_TEMP}/gh-aw/actions/copilot_harness.cjs copilot --add-dir /tmp/ --add-dir /tmp/gh-aw/ --add-dir /tmp/gh-aw/agent/ --log-level all --log-dir /tmp/gh-aw/sandbox/agent/logs/ --disable-builtin-mcps --no-ask-user --allow-tool github --allow-tool safeoutputs --allow-tool 'shell(cat)' --allow-tool 'shell(date)' --allow-tool 'shell(echo)' --allow-tool 'shell(git add:*)' --allow-tool 'shell(git branch:*)' --allow-tool 'shell(git checkout:*)' --allow-tool 'shell(git commit:*)' --allow-tool 'shell(git merge:*)' --allow-tool 'shell(git rm:*)' --allow-tool 'shell(git status)' --allow-tool 'shell(git switch:*)' --allow-tool 'shell(grep)' --allow-tool 'shell(head)' --allow-tool 'shell(ls)' --allow-tool 'shell(pwd)' --allow-tool 'shell(safeoutputs:*)' --allow-tool 'shell(sort)' --allow-tool 'shell(tail)' --allow-tool 'shell(uniq)' --allow-tool 'shell(wc)' --allow-tool 'shell(yq)' --allow-tool write --allow-all-paths --prompt-file /tmp/gh-aw/aw-prompts/prompt.txt 2>&1 | tee /tmp/gh-aw/agent-stdio.log + GH_AW_NODE_EXEC="${GH_AW_NODE_BIN:-}"; if [ -z "$GH_AW_NODE_EXEC" ] || [ ! -x "$GH_AW_NODE_EXEC" ]; then GH_AW_NODE_EXEC="$(command -v node 2>/dev/null || true)"; fi; if [ -z "$GH_AW_NODE_EXEC" ]; then echo "node runtime missing on this runner — check runtimes.node in workflow YAML" >&2; exit 127; fi; GH_AW_NPM_GLOBAL_ROOT="$(npm root -g 2>/dev/null || true)"; if [ -n "$GH_AW_NPM_GLOBAL_ROOT" ]; then export NODE_PATH="${GH_AW_NPM_GLOBAL_ROOT}${NODE_PATH:+:${NODE_PATH}}"; fi; "$GH_AW_NODE_EXEC" ${RUNNER_TEMP}/gh-aw/actions/copilot_harness.cjs copilot --add-dir /tmp/ --add-dir /tmp/gh-aw/ --add-dir /tmp/gh-aw/agent/ --log-level all --log-dir /tmp/gh-aw/sandbox/agent/logs/ --disable-builtin-mcps --no-ask-user --allow-tool github --allow-tool safeoutputs --allow-tool 'shell(cat)' --allow-tool 'shell(date)' --allow-tool 'shell(echo)' --allow-tool 'shell(git add:*)' --allow-tool 'shell(git branch:*)' --allow-tool 'shell(git checkout:*)' --allow-tool 'shell(git commit:*)' --allow-tool 'shell(git merge:*)' --allow-tool 'shell(git rm:*)' --allow-tool 'shell(git status)' --allow-tool 'shell(git switch:*)' --allow-tool 'shell(grep)' --allow-tool 'shell(head)' --allow-tool 'shell(ls)' --allow-tool 'shell(printf)' --allow-tool 'shell(pwd)' --allow-tool 'shell(safeoutputs:*)' --allow-tool 'shell(sort)' --allow-tool 'shell(tail)' --allow-tool 'shell(uniq)' --allow-tool 'shell(wc)' --allow-tool 'shell(yq)' --allow-tool write --allow-all-paths --prompt-file /tmp/gh-aw/aw-prompts/prompt.txt 2>&1 | tee /tmp/gh-aw/agent-stdio.log env: COPILOT_AGENT_RUNNER_TYPE: STANDALONE - COPILOT_API_KEY: dummy-byok-key-for-offline-mode - COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }} - COPILOT_MODEL: doubao-seed-2-0-code-preview-260215 - COPILOT_PROVIDER_API_KEY: ${{ secrets.OPENAI_API_KEY }} + COPILOT_MODEL: doubao-seed-evolving COPILOT_PROVIDER_BASE_URL: https://ark.cn-beijing.volces.com/api/v3 + COPILOT_PROVIDER_BEARER_TOKEN: ${{ secrets.OPENAI_API_KEY }} COPILOT_PROVIDER_TYPE: openai + COPILOT_PROVIDER_WIRE_API: responses + GH_AW_MAX_TURNS: ${{ vars.GH_AW_DEFAULT_MAX_TURNS || '' }} GH_AW_MCP_CONFIG: /home/runner/.copilot/mcp-config.json GH_AW_PHASE: agent GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt GH_AW_SAFE_OUTPUTS: ${{ steps.set-runtime-paths.outputs.GH_AW_SAFE_OUTPUTS }} - GH_AW_VERSION: v0.71.5 + GH_AW_TIMEOUT_MINUTES: 20 + GH_AW_VERSION: v0.79.6 GITHUB_API_URL: ${{ github.api_url }} GITHUB_AW: true GITHUB_COPILOT_INTEGRATION_ID: agentic-workflows @@ -775,12 +841,14 @@ jobs: GITHUB_SERVER_URL: ${{ github.server_url }} GITHUB_STEP_SUMMARY: /tmp/gh-aw/agent-step-summary.md GITHUB_WORKSPACE: ${{ github.workspace }} + RUNNER_TEMP: ${{ runner.temp }} + S2STOKENS: true XDG_CONFIG_HOME: /home/runner - - name: Detect Copilot errors - id: detect-copilot-errors + - name: Detect agent errors if: always() + id: detect-agent-errors continue-on-error: true - run: node "${RUNNER_TEMP}/gh-aw/actions/detect_copilot_errors.cjs" + run: node "${RUNNER_TEMP}/gh-aw/actions/detect_agent_errors.cjs" - name: Configure Git credentials env: REPO_NAME: ${{ github.repository }} @@ -817,8 +885,7 @@ jobs: const { main } = require('${{ runner.temp }}/gh-aw/actions/redact_secrets.cjs'); await main(); env: - GH_AW_SECRET_NAMES: 'COPILOT_GITHUB_TOKEN,GH_AW_GITHUB_MCP_SERVER_TOKEN,GH_AW_GITHUB_TOKEN,GITHUB_TOKEN,OPENAI_API_KEY' - SECRET_COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }} + GH_AW_SECRET_NAMES: 'GH_AW_GITHUB_MCP_SERVER_TOKEN,GH_AW_GITHUB_TOKEN,GITHUB_TOKEN,OPENAI_API_KEY' SECRET_GH_AW_GITHUB_MCP_SERVER_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN }} SECRET_GH_AW_GITHUB_TOKEN: ${{ secrets.GH_AW_GITHUB_TOKEN }} SECRET_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -905,7 +972,7 @@ jobs: - safe_outputs if: > always() && (needs.agent.result != 'skipped' || needs.activation.outputs.lockdown_check_failed == 'true' || - needs.activation.outputs.stale_lock_file_failed == 'true') + needs.activation.outputs.stale_lock_file_failed == 'true' || needs.activation.outputs.daily_effective_workflow_exceeded == 'true') runs-on: ubuntu-slim permissions: contents: write @@ -915,6 +982,7 @@ jobs: concurrency: group: "gh-aw-conclusion-auto-code" cancel-in-progress: false + queue: max outputs: incomplete_count: ${{ steps.report_incomplete.outputs.incomplete_count }} noop_message: ${{ steps.noop.outputs.noop_message }} @@ -923,15 +991,17 @@ jobs: steps: - name: Setup Scripts id: setup - uses: github/gh-aw-actions/setup@b8068426813005612b960b5ab0b8bd2c27142323 # v0.71.5 + uses: github/gh-aw-actions/setup@5c2fe865bb4dc46e1450f6ee0d0541d759aea73a # v0.79.6 with: destination: ${{ runner.temp }}/gh-aw/actions job-name: ${{ github.job }} trace-id: ${{ needs.activation.outputs.setup-trace-id }} + parent-span-id: ${{ needs.activation.outputs.setup-parent-span-id || needs.activation.outputs.setup-span-id }} env: GH_AW_SETUP_WORKFLOW_NAME: "自动处理 Issue" GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/auto-code.lock.yml@${{ github.ref }} - GH_AW_INFO_VERSION: "1.0.40" + GH_AW_INFO_VERSION: "1.0.60" + GH_AW_INFO_ENGINE_ID: "copilot" - name: Download agent output artifact id: download-agent-output continue-on-error: true @@ -946,6 +1016,40 @@ jobs: mkdir -p /tmp/gh-aw/ find "/tmp/gh-aw/" -type f -print echo "GH_AW_AGENT_OUTPUT=/tmp/gh-aw/agent_output.json" >> "$GITHUB_OUTPUT" + - name: Collect usage artifact files + if: always() + continue-on-error: true + run: | + mkdir -p /tmp/gh-aw/usage/agent /tmp/gh-aw/usage/detection + echo "Usage artifact source file status:" + for file in /tmp/gh-aw/aw-info.jsonl /tmp/gh-aw/agent_usage.jsonl /tmp/gh-aw/detection_usage.jsonl /tmp/gh-aw/sandbox/firewall-audit-logs/api-proxy-logs/token-usage.jsonl /tmp/gh-aw/sandbox/firewall/logs/api-proxy-logs/token-usage.jsonl /tmp/gh-aw/sandbox/firewall/audit/api-proxy-logs/token-usage.jsonl /tmp/gh-aw/threat-detection/sandbox/firewall-audit-logs/api-proxy-logs/token-usage.jsonl /tmp/gh-aw/threat-detection/sandbox/firewall/logs/api-proxy-logs/token-usage.jsonl /tmp/gh-aw/threat-detection/sandbox/firewall/audit/api-proxy-logs/token-usage.jsonl; do + [ -f "$file" ] && echo "FOUND: $file" || echo "MISSING: $file" + done + [ -f /tmp/gh-aw/aw-info.jsonl ] && cp /tmp/gh-aw/aw-info.jsonl /tmp/gh-aw/usage/aw-info.jsonl || true + [ -f /tmp/gh-aw/agent_usage.jsonl ] && cp /tmp/gh-aw/agent_usage.jsonl /tmp/gh-aw/usage/agent_usage.jsonl || true + [ -f /tmp/gh-aw/detection_usage.jsonl ] && cp /tmp/gh-aw/detection_usage.jsonl /tmp/gh-aw/usage/detection_usage.jsonl || true + [ -f /tmp/gh-aw/sandbox/firewall-audit-logs/api-proxy-logs/token-usage.jsonl ] && cp /tmp/gh-aw/sandbox/firewall-audit-logs/api-proxy-logs/token-usage.jsonl /tmp/gh-aw/usage/agent/token_usage.jsonl || true + [ -f /tmp/gh-aw/sandbox/firewall/logs/api-proxy-logs/token-usage.jsonl ] && cp /tmp/gh-aw/sandbox/firewall/logs/api-proxy-logs/token-usage.jsonl /tmp/gh-aw/usage/agent/token_usage.jsonl || true + [ -f /tmp/gh-aw/sandbox/firewall/audit/api-proxy-logs/token-usage.jsonl ] && cp /tmp/gh-aw/sandbox/firewall/audit/api-proxy-logs/token-usage.jsonl /tmp/gh-aw/usage/agent/token_usage.jsonl || true + [ -f /tmp/gh-aw/threat-detection/sandbox/firewall-audit-logs/api-proxy-logs/token-usage.jsonl ] && cp /tmp/gh-aw/threat-detection/sandbox/firewall-audit-logs/api-proxy-logs/token-usage.jsonl /tmp/gh-aw/usage/detection/token_usage.jsonl || true + [ -f /tmp/gh-aw/threat-detection/sandbox/firewall/logs/api-proxy-logs/token-usage.jsonl ] && cp /tmp/gh-aw/threat-detection/sandbox/firewall/logs/api-proxy-logs/token-usage.jsonl /tmp/gh-aw/usage/detection/token_usage.jsonl || true + [ -f /tmp/gh-aw/threat-detection/sandbox/firewall/audit/api-proxy-logs/token-usage.jsonl ] && cp /tmp/gh-aw/threat-detection/sandbox/firewall/audit/api-proxy-logs/token-usage.jsonl /tmp/gh-aw/usage/detection/token_usage.jsonl || true + [ -f /tmp/gh-aw/usage/agent/token_usage.jsonl ] || : > /tmp/gh-aw/usage/agent/token_usage.jsonl + [ -f /tmp/gh-aw/usage/detection/token_usage.jsonl ] || : > /tmp/gh-aw/usage/detection/token_usage.jsonl + find /tmp/gh-aw/usage -type f -print | sort + - name: Upload usage artifact + if: always() + continue-on-error: true + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: usage + path: | + /tmp/gh-aw/usage/aw-info.jsonl + /tmp/gh-aw/usage/agent_usage.jsonl + /tmp/gh-aw/usage/detection_usage.jsonl + /tmp/gh-aw/usage/agent/token_usage.jsonl + /tmp/gh-aw/usage/detection/token_usage.jsonl + if-no-files-found: ignore - name: Process no-op messages id: noop uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 @@ -953,9 +1057,13 @@ jobs: GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }} GH_AW_NOOP_MAX: "1" GH_AW_WORKFLOW_NAME: "自动处理 Issue" + GH_AW_WORKFLOW_SOURCE_URL: "${{ github.server_url }}/${{ github.repository }}/blob/${{ github.ref_name }}/.github/workflows/auto-code.md" GH_AW_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} GH_AW_AGENT_CONCLUSION: ${{ needs.agent.result }} GH_AW_NOOP_REPORT_AS_ISSUE: "true" + GH_AW_AIC: ${{ needs.agent.outputs.aic }} + GH_AW_AMBIENT_CONTEXT: ${{ needs.agent.outputs.ambient_context }} + GH_AW_WORKFLOW_ID: "auto-code" with: github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} script: | @@ -970,6 +1078,7 @@ jobs: GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }} GH_AW_MISSING_TOOL_CREATE_ISSUE: "true" GH_AW_WORKFLOW_NAME: "自动处理 Issue" + GH_AW_WORKFLOW_SOURCE_URL: "${{ github.server_url }}/${{ github.repository }}/blob/${{ github.ref_name }}/.github/workflows/auto-code.md" with: github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} script: | @@ -984,6 +1093,7 @@ jobs: GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }} GH_AW_REPORT_INCOMPLETE_CREATE_ISSUE: "true" GH_AW_WORKFLOW_NAME: "自动处理 Issue" + GH_AW_WORKFLOW_SOURCE_URL: "${{ github.server_url }}/${{ github.repository }}/blob/${{ github.ref_name }}/.github/workflows/auto-code.md" with: github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} script: | @@ -998,12 +1108,18 @@ jobs: env: GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }} GH_AW_WORKFLOW_NAME: "自动处理 Issue" + GH_AW_WORKFLOW_SOURCE_URL: "${{ github.server_url }}/${{ github.repository }}/blob/${{ github.ref_name }}/.github/workflows/auto-code.md" GH_AW_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} GH_AW_AGENT_CONCLUSION: ${{ needs.agent.result }} GH_AW_WORKFLOW_ID: "auto-code" GH_AW_ACTION_FAILURE_ISSUE_EXPIRES_HOURS: "168" GH_AW_ENGINE_ID: "copilot" GH_AW_CHECKOUT_PR_SUCCESS: ${{ needs.agent.outputs.checkout_pr_success }} + GH_AW_EFFECTIVE_TOKENS: ${{ needs.agent.outputs.effective_tokens || '' }} + GH_AW_AI_CREDITS_RATE_LIMIT_ERROR: ${{ needs.agent.outputs.ai_credits_rate_limit_error || 'false' }} + GH_AW_UNKNOWN_MODEL_AI_CREDITS: ${{ needs.agent.outputs.unknown_model_ai_credits || 'false' }} + GH_AW_AIC: ${{ needs.agent.outputs.aic }} + GH_AW_MAX_AI_CREDITS: ${{ vars.GH_AW_DEFAULT_MAX_AI_CREDITS || '1000' }} GH_AW_INFERENCE_ACCESS_ERROR: ${{ needs.agent.outputs.inference_access_error }} GH_AW_MCP_POLICY_ERROR: ${{ needs.agent.outputs.mcp_policy_error }} GH_AW_AGENTIC_ENGINE_TIMEOUT: ${{ needs.agent.outputs.agentic_engine_timeout }} @@ -1013,6 +1129,9 @@ jobs: GH_AW_CODE_PUSH_FAILURE_COUNT: ${{ needs.safe_outputs.outputs.code_push_failure_count }} GH_AW_LOCKDOWN_CHECK_FAILED: ${{ needs.activation.outputs.lockdown_check_failed }} GH_AW_STALE_LOCK_FILE_FAILED: ${{ needs.activation.outputs.stale_lock_file_failed }} + GH_AW_DAILY_EFFECTIVE_WORKFLOW_EXCEEDED: ${{ needs.activation.outputs.daily_effective_workflow_exceeded }} + GH_AW_DAILY_EFFECTIVE_WORKFLOW_TOTAL_EFFECTIVE_TOKENS: ${{ needs.activation.outputs.daily_effective_workflow_total_effective_tokens }} + GH_AW_DAILY_EFFECTIVE_WORKFLOW_THRESHOLD: ${{ needs.activation.outputs.daily_effective_workflow_threshold }} GH_AW_GROUP_REPORTS: "false" GH_AW_FAILURE_REPORT_AS_ISSUE: "true" GH_AW_MISSING_TOOL_REPORT_AS_FAILURE: "true" @@ -1031,18 +1150,21 @@ jobs: outputs: activated: ${{ steps.check_membership.outputs.is_team_member == 'true' }} matched_command: '' + setup-parent-span-id: ${{ steps.setup.outputs.parent-span-id || steps.setup.outputs.span-id }} + setup-span-id: ${{ steps.setup.outputs.span-id }} setup-trace-id: ${{ steps.setup.outputs.trace-id }} steps: - name: Setup Scripts id: setup - uses: github/gh-aw-actions/setup@b8068426813005612b960b5ab0b8bd2c27142323 # v0.71.5 + uses: github/gh-aw-actions/setup@5c2fe865bb4dc46e1450f6ee0d0541d759aea73a # v0.79.6 with: destination: ${{ runner.temp }}/gh-aw/actions job-name: ${{ github.job }} env: GH_AW_SETUP_WORKFLOW_NAME: "自动处理 Issue" GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/auto-code.lock.yml@${{ github.ref }} - GH_AW_INFO_VERSION: "1.0.40" + GH_AW_INFO_VERSION: "1.0.60" + GH_AW_INFO_ENGINE_ID: "copilot" - name: Check team membership for workflow id: check_membership uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 @@ -1067,15 +1189,19 @@ jobs: discussions: write issues: write pull-requests: write - timeout-minutes: 15 + timeout-minutes: 45 env: + GH_AW_AGENT_AIC: ${{ needs.agent.outputs.aic }} + GH_AW_AIC: ${{ needs.agent.outputs.aic }} + GH_AW_AMBIENT_CONTEXT: ${{ needs.agent.outputs.ambient_context }} GH_AW_CALLER_WORKFLOW_ID: "${{ github.repository }}/auto-code" GH_AW_EFFECTIVE_TOKENS: ${{ needs.agent.outputs.effective_tokens }} GH_AW_ENGINE_ID: "copilot" GH_AW_ENGINE_MODEL: ${{ needs.agent.outputs.model }} - GH_AW_ENGINE_VERSION: "1.0.40" + GH_AW_ENGINE_VERSION: "1.0.60" GH_AW_WORKFLOW_ID: "auto-code" GH_AW_WORKFLOW_NAME: "自动处理 Issue" + GH_AW_WORKFLOW_SOURCE_URL: "${{ github.server_url }}/${{ github.repository }}/blob/${{ github.ref_name }}/.github/workflows/auto-code.md" outputs: code_push_failure_count: ${{ steps.process_safe_outputs.outputs.code_push_failure_count }} code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} @@ -1090,15 +1216,17 @@ jobs: steps: - name: Setup Scripts id: setup - uses: github/gh-aw-actions/setup@b8068426813005612b960b5ab0b8bd2c27142323 # v0.71.5 + uses: github/gh-aw-actions/setup@5c2fe865bb4dc46e1450f6ee0d0541d759aea73a # v0.79.6 with: destination: ${{ runner.temp }}/gh-aw/actions job-name: ${{ github.job }} trace-id: ${{ needs.activation.outputs.setup-trace-id }} + parent-span-id: ${{ needs.activation.outputs.setup-parent-span-id || needs.activation.outputs.setup-span-id }} env: GH_AW_SETUP_WORKFLOW_NAME: "自动处理 Issue" GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/auto-code.lock.yml@${{ github.ref }} - GH_AW_INFO_VERSION: "1.0.40" + GH_AW_INFO_VERSION: "1.0.60" + GH_AW_INFO_ENGINE_ID: "copilot" - name: Download agent output artifact id: download-agent-output continue-on-error: true @@ -1119,9 +1247,27 @@ jobs: with: name: agent path: /tmp/gh-aw/ + - name: Extract base branch from agent output + id: extract-base-branch + if: steps.download-agent-output.outcome == 'success' + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/extract_base_branch_from_agent_output.cjs'); + await main(); + - name: Checkout repository (trusted default branch for comment events) + if: (!cancelled()) && needs.agent.result != 'skipped' && contains(needs.agent.outputs.output_types, 'create_pull_request') && (github.event_name == 'issue_comment' || github.event_name == 'pull_request_review_comment') + uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + with: + ref: ${{ github.event.repository.default_branch }} + token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + persist-credentials: false + fetch-depth: 1 - name: Checkout repository - if: (!cancelled()) && needs.agent.result != 'skipped' && contains(needs.agent.outputs.output_types, 'create_pull_request') - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + if: (!cancelled()) && needs.agent.result != 'skipped' && contains(needs.agent.outputs.output_types, 'create_pull_request') && github.event_name != 'issue_comment' && github.event_name != 'pull_request_review_comment' + uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 with: ref: develop token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} @@ -1144,6 +1290,7 @@ jobs: - name: Configure GH_HOST for enterprise compatibility id: ghes-host-config shell: bash + # zizmor: ignore[github-env] - GITHUB_SERVER_URL is set by GitHub Actions, not user input. run: | # Derive GH_HOST from GITHUB_SERVER_URL so the gh CLI targets the correct # GitHub instance (GHES/GHEC). On github.com this is a harmless no-op. @@ -1155,10 +1302,11 @@ jobs: uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 env: GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }} + GH_AW_COMMENT_ID: ${{ needs.activation.outputs.comment_id }} GH_AW_ALLOWED_DOMAINS: "api.business.githubcopilot.com,api.enterprise.githubcopilot.com,api.github.com,api.githubcopilot.com,api.individual.githubcopilot.com,api.snapcraft.io,archive.ubuntu.com,ark.cn-beijing.volces.com,azure.archive.ubuntu.com,crl.geotrust.com,crl.globalsign.com,crl.identrust.com,crl.sectigo.com,crl.thawte.com,crl.usertrust.com,crl.verisign.com,crl3.digicert.com,crl4.digicert.com,crls.ssl.com,github.com,host.docker.internal,json-schema.org,json.schemastore.org,keyserver.ubuntu.com,ocsp.digicert.com,ocsp.geotrust.com,ocsp.globalsign.com,ocsp.identrust.com,ocsp.sectigo.com,ocsp.ssl.com,ocsp.thawte.com,ocsp.usertrust.com,ocsp.verisign.com,packagecloud.io,packages.cloud.google.com,packages.microsoft.com,ppa.launchpad.net,raw.githubusercontent.com,registry.npmjs.org,s.symcb.com,s.symcd.com,security.ubuntu.com,telemetry.enterprise.githubcopilot.com,ts-crl.ws.symantec.com,ts-ocsp.ws.symantec.com,www.googleapis.com" GITHUB_SERVER_URL: ${{ github.server_url }} GITHUB_API_URL: ${{ github.api_url }} - GH_AW_SAFE_OUTPUTS_HANDLER_CONFIG: "{\"add_comment\":{\"max\":1},\"create_pull_request\":{\"base_branch\":\"develop\",\"max\":1,\"max_patch_files\":100,\"max_patch_size\":1024,\"protect_top_level_dot_folders\":true,\"protected_files\":[\"package.json\",\"bun.lockb\",\"bunfig.toml\",\"deno.json\",\"deno.jsonc\",\"deno.lock\",\"global.json\",\"NuGet.Config\",\"Directory.Packages.props\",\"mix.exs\",\"mix.lock\",\"go.mod\",\"go.sum\",\"stack.yaml\",\"stack.yaml.lock\",\"pom.xml\",\"build.gradle\",\"build.gradle.kts\",\"settings.gradle\",\"settings.gradle.kts\",\"gradle.properties\",\"package-lock.json\",\"yarn.lock\",\"pnpm-lock.yaml\",\"npm-shrinkwrap.json\",\"requirements.txt\",\"Pipfile\",\"Pipfile.lock\",\"pyproject.toml\",\"setup.py\",\"setup.cfg\",\"Gemfile\",\"Gemfile.lock\",\"uv.lock\",\"CODEOWNERS\",\"DESIGN.md\",\"README.md\",\"CONTRIBUTING.md\",\"CHANGELOG.md\",\"SECURITY.md\",\"CODE_OF_CONDUCT.md\",\"AGENTS.md\",\"CLAUDE.md\",\"GEMINI.md\"]},\"create_report_incomplete_issue\":{},\"missing_data\":{},\"missing_tool\":{},\"noop\":{\"max\":1,\"report-as-issue\":\"true\"},\"report_incomplete\":{}}" + GH_AW_SAFE_OUTPUTS_HANDLER_CONFIG: "{\"add_comment\":{\"max\":1},\"create_pull_request\":{\"base_branch\":\"develop\",\"max\":1,\"max_patch_files\":100,\"max_patch_size\":1024,\"protect_top_level_dot_folders\":true,\"protected_files\":[\"package.json\",\"bun.lockb\",\"bunfig.toml\",\"deno.json\",\"deno.jsonc\",\"deno.lock\",\"global.json\",\"NuGet.Config\",\"Directory.Packages.props\",\"mix.exs\",\"mix.lock\",\"go.mod\",\"go.sum\",\"stack.yaml\",\"stack.yaml.lock\",\"pom.xml\",\"build.gradle\",\"build.gradle.kts\",\"settings.gradle\",\"settings.gradle.kts\",\"gradle.properties\",\"package-lock.json\",\"yarn.lock\",\"pnpm-lock.yaml\",\"npm-shrinkwrap.json\",\"requirements.txt\",\"Pipfile\",\"Pipfile.lock\",\"pyproject.toml\",\"setup.py\",\"setup.cfg\",\"Gemfile\",\"Gemfile.lock\",\"uv.lock\",\"CODEOWNERS\",\"DESIGN.md\",\"README.md\",\"CONTRIBUTING.md\",\"CHANGELOG.md\",\"SECURITY.md\",\"CODE_OF_CONDUCT.md\",\"AGENTS.md\",\"CLAUDE.md\",\"GEMINI.md\"],\"protected_files_policy\":\"allowed\"},\"create_report_incomplete_issue\":{},\"missing_data\":{},\"missing_tool\":{},\"noop\":{\"max\":1,\"report-as-issue\":\"true\"},\"report_incomplete\":{}}" GH_AW_CI_TRIGGER_TOKEN: ${{ secrets.GH_AW_CI_TRIGGER_TOKEN }} with: github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/auto-code.md b/.github/workflows/auto-code.md index 5a51003..f73bb47 100644 --- a/.github/workflows/auto-code.md +++ b/.github/workflows/auto-code.md @@ -7,19 +7,22 @@ engine: id: copilot env: COPILOT_PROVIDER_BASE_URL: "https://ark.cn-beijing.volces.com/api/v3" - COPILOT_MODEL: doubao-seed-2-0-code-preview-260215 - COPILOT_PROVIDER_API_KEY: ${{ secrets.OPENAI_API_KEY }} + COPILOT_PROVIDER_BEARER_TOKEN: ${{ secrets.OPENAI_API_KEY }} + COPILOT_MODEL: doubao-seed-evolving COPILOT_PROVIDER_TYPE: openai + COPILOT_PROVIDER_WIRE_API: responses + +features: + dangerously-disable-sandbox-agent: "controlled environment for issue triage automation" +sandbox: + agent: false +strict: false network: allowed: - defaults - ark.cn-beijing.volces.com -sandbox: - agent: false -strict: false - tools: github: min-integrity: none @@ -28,32 +31,41 @@ permissions: contents: read issues: read pull-requests: read + copilot-requests: write safe-outputs: threat-detection: false create-pull-request: base-branch: develop + protected-files: allowed add-comment: max: 1 --- # 自动处理 Issue -当 Issue 被打上 `bug` 或 `enhancement` 标签时触发。其他标签直接退出,不做任何操作。 +当 Issue 被打上 `bug` 或 `enhancement` 或 `feature` 标签时触发。其他标签直接退出,不做任何操作。 ## 判断任务类型 读取 Issue #${{ github.event.issue.number }} 当前的标签: - 如果包含 `bug` 标签 → 执行【Bug 修复流程】 -- 如果包含 `enhancement` 标签 → 执行【新功能开发流程】 +- 如果包含 `feature` 标签 → 执行【新功能开发流程】 +- 如果包含 `enhancement` 标签 → 执行【功能改进开发流程】 - 其他情况 → 直接退出 +## 任务执行限制 +- 根据需求查找相对应的可能关联的代码文件 +- 尽量只读取相关代码文件和文档,不去操作无关代码和文件 +- 尽量减少操作时间和步骤,减少TOKEN和时间消耗 + --- + ## Bug 修复流程 1. 阅读 Issue 的完整标题和正文,理解问题现象 -2. 浏览仓库代码和文档,定位问题所在的文件和函数 +2. 浏览仓库相关代码和文档,定位问题所在的文件和函数 3. 分析根本原因 4. 实现修复方案,注意: - 保持与现有代码风格一致 @@ -62,7 +74,7 @@ safe-outputs: - 问题根因 - 修复方式 - 如何验证 -6. 在原 Issue 下用中文回复,说明已提交 PR 及修复思路 +6. 在原 Issue 下使用用户提问的语言进行回复,说明已提交 PR 及修复思路 如果问题过于复杂或信息不足,在 Issue 下用中文说明原因,不创建 PR。 @@ -71,7 +83,7 @@ safe-outputs: ## 新功能开发流程 1. 阅读 Issue 的完整标题和正文,理解需求目标 -2. 浏览仓库现有代码结构和文档,找到最相关的模块和文件 +2. 浏览仓库相关代码结构和文档,找到最相关的模块和文件 3. 制定实现方案: - 需要新增哪些文件或函数 - 需要修改哪些现有文件 @@ -83,6 +95,29 @@ safe-outputs: - 实现了哪些功能 - 涉及哪些文件改动 - 如何验证/测试 -6. 在原 Issue 下用用户提问的语言进行回复,说明已提交 PR、实现思路和测试建议 +6. 在原 Issue 下使用用户提问的语言进行回复,说明已提交 PR、实现思路和测试建议 + +如果需求描述不清晰或实现风险过大,在 Issue 下用中文说明原因,不创建 PR。 + +--- -如果需求描述不清晰或实现风险过大,在 Issue 下用用户提问的语言说明原因,不创建 PR。 \ No newline at end of file +## 功能改进开发流程 + +1. 阅读 Issue 的完整标题和正文,明确功能改进与优化的具体目标(如性能提升、代码结构重构、用户体验优化等)。 +2. 浏览仓库相关代码,评估受影响的范围,定位需要进行优化或重构的核心文件及函数。 +3. 制定改进方案,需特别注意: + - **向下兼容性**:确保本次改进不会破坏现有的公开接口(API)和已有功能。 + - **防御性编程**:优化逻辑的同时,不能降低代码的健壮性。 +4. 按照方案实施代码改动,注意: + - 保持与现有代码风格高度一致。 + - 仅针对性能、可读性或结构进行局部优化,严禁引入未经需求的无关大范围改动。 +5. 创建 Pull Request,根据改进的核心侧重点选择标题格式: + - 侧重于代码重构/可读性优化:`refactor: ` + - 侧重于运行运行效率/性能优化:`perf: ` + 在 PR 描述中说明: + - 优化的动机与改进点 + - 改进前后的对比或预期收益 + - 验证优化是否生效的测试方法 +6. 在原 Issue 下使用用户提问的语言进行回复,说明已提交 PR、优化思路及预期的提升效果。 + +如果功能改进可能带来重大的破坏性变更(Breaking Changes)或者现有代码结构不支持盲目优化,在 Issue 下用中文说明原因,保持维持原状,不创建 PR。 \ No newline at end of file diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 168c921..598759b 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -11,7 +11,7 @@ on: jobs: analyze: - runs-on: ubuntu-24.04 + runs-on: ubuntu-latest permissions: security-events: write packages: read @@ -24,7 +24,6 @@ jobs: include: - language: c-cpp build-mode: manual - steps: - name: Checkout repository uses: actions/checkout@v6 @@ -44,7 +43,7 @@ jobs: - name: Set TERM variable run: echo "TERM=xterm" >> $GITHUB_ENV - + - name: Set up Dependency Environment run: | cd libxengine diff --git a/.github/workflows/issue-triage.lock.yml b/.github/workflows/issue-triage.lock.yml index 4dd0549..c4c7adb 100644 --- a/.github/workflows/issue-triage.lock.yml +++ b/.github/workflows/issue-triage.lock.yml @@ -1,5 +1,5 @@ -# gh-aw-metadata: {"schema_version":"v3","frontmatter_hash":"49f1529d95cbf3c8e3d0da1df4b6cee935245532511b98ca9ecd7a44f1d0bb68","compiler_version":"v0.71.5","agent_id":"copilot"} -# gh-aw-manifest: {"version":1,"secrets":["COPILOT_GITHUB_TOKEN","GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GITHUB_TOKEN","OPENAI_API_KEY"],"actions":[{"repo":"actions/checkout","sha":"de0fac2e4500dabe0009e67214ff5f5447ce83dd","version":"v6.0.2"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"},{"repo":"github/gh-aw-actions/setup","sha":"b8068426813005612b960b5ab0b8bd2c27142323","version":"v0.71.5"}],"containers":[{"image":"ghcr.io/github/github-mcp-server:v1.0.3","digest":"sha256:2ac27ef03461ef2b877031b838a7d1fd7f12b12d4ace7796d8cad91446d55959","pinned_image":"ghcr.io/github/github-mcp-server:v1.0.3@sha256:2ac27ef03461ef2b877031b838a7d1fd7f12b12d4ace7796d8cad91446d55959"},{"image":"node:lts-alpine","digest":"sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f","pinned_image":"node:lts-alpine@sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f"}]} +# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"01651461ea771a40a1d9a25bbf950f25e913d6b556796467343b77b45eabdd15","body_hash":"b17fdb8754e311cfac38664fbaa575804386c0027689ce0def213670917f77f0","compiler_version":"v0.79.6","agent_id":"copilot","engine_versions":{"copilot":"1.0.60"}} +# gh-aw-manifest: {"version":1,"secrets":["GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GITHUB_TOKEN","OPENAI_API_KEY"],"actions":[{"repo":"actions/checkout","sha":"df4cb1c069e1874edd31b4311f1884172cec0e10","version":"v6.0.3"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"},{"repo":"github/gh-aw-actions/setup","sha":"5c2fe865bb4dc46e1450f6ee0d0541d759aea73a","version":"v0.79.6"}],"containers":[{"image":"ghcr.io/github/github-mcp-server:v1.1.2","digest":"sha256:30197479d8036c7811892bc07e06f9a05c9ef3cdd79bc59f256d50647f95788c","pinned_image":"ghcr.io/github/github-mcp-server:v1.1.2@sha256:30197479d8036c7811892bc07e06f9a05c9ef3cdd79bc59f256d50647f95788c"}]} # ___ _ _ # / _ \ | | (_) # | |_| | __ _ ___ _ __ | |_ _ ___ @@ -14,7 +14,7 @@ # \ /\ / (_) | | | | ( | | | | (_) \ V V /\__ \ # \/ \/ \___/|_| |_|\_\|_| |_|\___/ \_/\_/ |___/ # -# This file was automatically generated by gh-aw (v0.71.5). DO NOT EDIT. +# This file was automatically generated by gh-aw (v0.79.6). DO NOT EDIT. # # To update this file, edit the corresponding .md file and run: # gh aw compile @@ -24,25 +24,23 @@ # # # Secrets used: -# - COPILOT_GITHUB_TOKEN # - GH_AW_GITHUB_MCP_SERVER_TOKEN # - GH_AW_GITHUB_TOKEN # - GITHUB_TOKEN # - OPENAI_API_KEY # # Custom actions used: -# - actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 +# - actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 # - actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 # - actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 # - actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 -# - github/gh-aw-actions/setup@b8068426813005612b960b5ab0b8bd2c27142323 # v0.71.5 +# - github/gh-aw-actions/setup@5c2fe865bb4dc46e1450f6ee0d0541d759aea73a # v0.79.6 # # Container images used: -# - ghcr.io/github/github-mcp-server:v1.0.3@sha256:2ac27ef03461ef2b877031b838a7d1fd7f12b12d4ace7796d8cad91446d55959 -# - node:lts-alpine@sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f +# - ghcr.io/github/github-mcp-server:v1.1.2@sha256:30197479d8036c7811892bc07e06f9a05c9ef3cdd79bc59f256d50647f95788c name: "Issue 自动分类与回复" -"on": +on: issues: types: - opened @@ -63,13 +61,20 @@ jobs: permissions: actions: read contents: read + env: + GH_AW_MAX_DAILY_AI_CREDITS: ${{ vars.GH_AW_DEFAULT_MAX_DAILY_AI_CREDITS || '5000' }} outputs: body: ${{ steps.sanitized.outputs.body }} comment_id: "" comment_repo: "" + daily_effective_workflow_exceeded: ${{ steps.daily-effective-workflow-guardrail.outputs.daily_effective_workflow_exceeded == 'true' }} + daily_effective_workflow_threshold: ${{ steps.daily-effective-workflow-guardrail.outputs.daily_effective_workflow_threshold || '' }} + daily_effective_workflow_total_effective_tokens: ${{ steps.daily-effective-workflow-guardrail.outputs.daily_effective_workflow_total_effective_tokens || '' }} engine_id: ${{ steps.generate_aw_info.outputs.engine_id }} lockdown_check_failed: ${{ steps.generate_aw_info.outputs.lockdown_check_failed == 'true' }} model: ${{ steps.generate_aw_info.outputs.model }} + setup-parent-span-id: ${{ steps.setup.outputs.parent-span-id || steps.setup.outputs.span-id }} + setup-span-id: ${{ steps.setup.outputs.span-id }} setup-trace-id: ${{ steps.setup.outputs.trace-id }} stale_lock_file_failed: ${{ steps.check-lock-file.outputs.stale_lock_file_failed == 'true' }} text: ${{ steps.sanitized.outputs.text }} @@ -77,24 +82,27 @@ jobs: steps: - name: Setup Scripts id: setup - uses: github/gh-aw-actions/setup@b8068426813005612b960b5ab0b8bd2c27142323 # v0.71.5 + uses: github/gh-aw-actions/setup@5c2fe865bb4dc46e1450f6ee0d0541d759aea73a # v0.79.6 with: destination: ${{ runner.temp }}/gh-aw/actions job-name: ${{ github.job }} trace-id: ${{ needs.pre_activation.outputs.setup-trace-id }} + parent-span-id: ${{ needs.pre_activation.outputs.setup-parent-span-id || needs.pre_activation.outputs.setup-span-id }} + safe-output-artifact-client: ${{ env.GH_AW_MAX_DAILY_AI_CREDITS != '' }} env: GH_AW_SETUP_WORKFLOW_NAME: "Issue 自动分类与回复" GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/issue-triage.lock.yml@${{ github.ref }} - GH_AW_INFO_VERSION: "1.0.40" + GH_AW_INFO_VERSION: "1.0.60" + GH_AW_INFO_ENGINE_ID: "copilot" - name: Generate agentic run info id: generate_aw_info env: GH_AW_INFO_ENGINE_ID: "copilot" GH_AW_INFO_ENGINE_NAME: "GitHub Copilot CLI" - GH_AW_INFO_MODEL: ${{ vars.GH_AW_MODEL_AGENT_COPILOT || 'claude-sonnet-4.6' }} - GH_AW_INFO_VERSION: "1.0.40" - GH_AW_INFO_AGENT_VERSION: "1.0.40" - GH_AW_INFO_CLI_VERSION: "v0.71.5" + GH_AW_INFO_MODEL: ${{ vars.GH_AW_MODEL_AGENT_COPILOT || vars.GH_AW_DEFAULT_MODEL_COPILOT || 'claude-sonnet-4.6' }} + GH_AW_INFO_VERSION: "1.0.60" + GH_AW_INFO_AGENT_VERSION: "1.0.60" + GH_AW_INFO_CLI_VERSION: "v0.79.6" GH_AW_INFO_WORKFLOW_NAME: "Issue 自动分类与回复" GH_AW_INFO_EXPERIMENTAL: "false" GH_AW_INFO_SUPPORTS_TOOLS_ALLOWLIST: "true" @@ -112,13 +120,32 @@ jobs: setupGlobals(core, github, context, exec, io, getOctokit); const { main } = require('${{ runner.temp }}/gh-aw/actions/generate_aw_info.cjs'); await main(core, context); + - name: Check daily workflow token guardrail + id: daily-effective-workflow-guardrail + if: ${{ env.GH_AW_MAX_DAILY_AI_CREDITS != '' }} + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_WORKFLOW_NAME: "Issue 自动分类与回复" + GH_AW_WORKFLOW_ID: "issue-triage" + GH_AW_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} + GH_AW_WORKFLOW_DISPATCH_AW_CONTEXT: ${{ github.event.inputs.aw_context || '' }} + GH_AW_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GH_AW_MAX_DAILY_AI_CREDITS: ${{ vars.GH_AW_DEFAULT_MAX_DAILY_AI_CREDITS || '5000' }} + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/check_daily_aic_workflow_guardrail.cjs'); + await main(); - name: Checkout .github and .agents folders - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 with: persist-credentials: false sparse-checkout: | .github .agents + .antigravity .claude .codex .crush @@ -129,8 +156,8 @@ jobs: fetch-depth: 1 - name: Save agent config folders for base branch restoration env: - GH_AW_AGENT_FOLDERS: ".agents .claude .codex .crush .gemini .github .opencode .pi" - GH_AW_AGENT_FILES: ".crush.json AGENTS.md CLAUDE.md GEMINI.md PI.md opencode.jsonc" + GH_AW_AGENT_FOLDERS: ".agents .antigravity .claude .codex .crush .gemini .github .opencode .pi" + GH_AW_AGENT_FILES: ".crush.json AGENTS.md ANTIGRAVITY.md CLAUDE.md GEMINI.md PI.md opencode.jsonc" # poutine:ignore untrusted_checkout_exec run: bash "${RUNNER_TEMP}/gh-aw/actions/save_base_github_folders.sh" - name: Check workflow lock file @@ -148,7 +175,7 @@ jobs: - name: Check compile-agentic version uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 env: - GH_AW_COMPILED_VERSION: "v0.71.5" + GH_AW_COMPILED_VERSION: "v0.79.6" with: script: | const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); @@ -170,11 +197,11 @@ jobs: env: GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt GH_AW_SAFE_OUTPUTS: ${{ runner.temp }}/gh-aw/safeoutputs/outputs.jsonl + GH_AW_EXPR_1A3A194A: ${{ github.event.discussion.number || (fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_type == 'discussion' && fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_number) }} + GH_AW_EXPR_463A214A: ${{ github.event.pull_request.number || (fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_type == 'pull_request' && fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_number) }} + GH_AW_EXPR_802A9F6A: ${{ github.event.issue.number || (fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_type == 'issue' && fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_number) }} + GH_AW_EXPR_FF1D34CE: ${{ github.event.comment.id || fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').comment_id }} GH_AW_GITHUB_ACTOR: ${{ github.actor }} - GH_AW_GITHUB_EVENT_COMMENT_ID: ${{ github.event.comment.id }} - GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER: ${{ github.event.discussion.number }} - GH_AW_GITHUB_EVENT_ISSUE_NUMBER: ${{ github.event.issue.number }} - GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER: ${{ github.event.pull_request.number }} GH_AW_GITHUB_REPOSITORY: ${{ github.repository }} GH_AW_GITHUB_RUN_ID: ${{ github.run_id }} GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }} @@ -182,54 +209,54 @@ jobs: run: | bash "${RUNNER_TEMP}/gh-aw/actions/create_prompt_first.sh" { - cat << 'GH_AW_PROMPT_1857816c8098cba9_EOF' + cat << 'GH_AW_PROMPT_72243dd344875363_EOF' - GH_AW_PROMPT_1857816c8098cba9_EOF + GH_AW_PROMPT_72243dd344875363_EOF cat "${RUNNER_TEMP}/gh-aw/prompts/xpia.md" cat "${RUNNER_TEMP}/gh-aw/prompts/temp_folder_prompt.md" cat "${RUNNER_TEMP}/gh-aw/prompts/markdown.md" cat "${RUNNER_TEMP}/gh-aw/prompts/safe_outputs_prompt.md" - cat << 'GH_AW_PROMPT_1857816c8098cba9_EOF' + cat << 'GH_AW_PROMPT_72243dd344875363_EOF' Tools: add_comment, add_labels, missing_tool, missing_data, noop - GH_AW_PROMPT_1857816c8098cba9_EOF + GH_AW_PROMPT_72243dd344875363_EOF cat "${RUNNER_TEMP}/gh-aw/prompts/mcp_cli_tools_prompt.md" - cat << 'GH_AW_PROMPT_1857816c8098cba9_EOF' + cat << 'GH_AW_PROMPT_72243dd344875363_EOF' The following GitHub context information is available for this workflow: - {{#if __GH_AW_GITHUB_ACTOR__ }} + {{#if github.actor}} - **actor**: __GH_AW_GITHUB_ACTOR__ {{/if}} - {{#if __GH_AW_GITHUB_REPOSITORY__ }} + {{#if github.repository}} - **repository**: __GH_AW_GITHUB_REPOSITORY__ {{/if}} - {{#if __GH_AW_GITHUB_WORKSPACE__ }} + {{#if github.workspace}} - **workspace**: __GH_AW_GITHUB_WORKSPACE__ {{/if}} - {{#if __GH_AW_GITHUB_EVENT_ISSUE_NUMBER__ }} - - **issue-number**: #__GH_AW_GITHUB_EVENT_ISSUE_NUMBER__ + {{#if github.event.issue.number || (github.aw.context.item_type == 'issue' && github.aw.context.item_number)}} + - **issue-number**: #__GH_AW_EXPR_802A9F6A__ {{/if}} - {{#if __GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER__ }} - - **discussion-number**: #__GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER__ + {{#if github.event.discussion.number || (github.aw.context.item_type == 'discussion' && github.aw.context.item_number)}} + - **discussion-number**: #__GH_AW_EXPR_1A3A194A__ {{/if}} - {{#if __GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER__ }} - - **pull-request-number**: #__GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER__ + {{#if github.event.pull_request.number || (github.aw.context.item_type == 'pull_request' && github.aw.context.item_number)}} + - **pull-request-number**: #__GH_AW_EXPR_463A214A__ {{/if}} - {{#if __GH_AW_GITHUB_EVENT_COMMENT_ID__ }} - - **comment-id**: __GH_AW_GITHUB_EVENT_COMMENT_ID__ + {{#if github.event.comment.id || github.aw.context.comment_id}} + - **comment-id**: __GH_AW_EXPR_FF1D34CE__ {{/if}} - {{#if __GH_AW_GITHUB_RUN_ID__ }} + {{#if github.run_id}} - **workflow-run-id**: __GH_AW_GITHUB_RUN_ID__ {{/if}} - GH_AW_PROMPT_1857816c8098cba9_EOF + GH_AW_PROMPT_72243dd344875363_EOF cat "${RUNNER_TEMP}/gh-aw/prompts/github_mcp_tools_with_safeoutputs_prompt.md" - cat << 'GH_AW_PROMPT_1857816c8098cba9_EOF' + cat << 'GH_AW_PROMPT_72243dd344875363_EOF' {{#runtime-import .github/workflows/issue-triage.md}} - GH_AW_PROMPT_1857816c8098cba9_EOF + GH_AW_PROMPT_72243dd344875363_EOF } > "$GH_AW_PROMPT" - name: Interpolate variables and render templates uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 @@ -247,11 +274,11 @@ jobs: uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 env: GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt + GH_AW_EXPR_1A3A194A: ${{ github.event.discussion.number || (fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_type == 'discussion' && fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_number) }} + GH_AW_EXPR_463A214A: ${{ github.event.pull_request.number || (fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_type == 'pull_request' && fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_number) }} + GH_AW_EXPR_802A9F6A: ${{ github.event.issue.number || (fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_type == 'issue' && fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_number) }} + GH_AW_EXPR_FF1D34CE: ${{ github.event.comment.id || fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').comment_id }} GH_AW_GITHUB_ACTOR: ${{ github.actor }} - GH_AW_GITHUB_EVENT_COMMENT_ID: ${{ github.event.comment.id }} - GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER: ${{ github.event.discussion.number }} - GH_AW_GITHUB_EVENT_ISSUE_NUMBER: ${{ github.event.issue.number }} - GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER: ${{ github.event.pull_request.number }} GH_AW_GITHUB_REPOSITORY: ${{ github.repository }} GH_AW_GITHUB_RUN_ID: ${{ github.run_id }} GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }} @@ -268,11 +295,11 @@ jobs: return await substitutePlaceholders({ file: process.env.GH_AW_PROMPT, substitutions: { + GH_AW_EXPR_1A3A194A: process.env.GH_AW_EXPR_1A3A194A, + GH_AW_EXPR_463A214A: process.env.GH_AW_EXPR_463A214A, + GH_AW_EXPR_802A9F6A: process.env.GH_AW_EXPR_802A9F6A, + GH_AW_EXPR_FF1D34CE: process.env.GH_AW_EXPR_FF1D34CE, GH_AW_GITHUB_ACTOR: process.env.GH_AW_GITHUB_ACTOR, - GH_AW_GITHUB_EVENT_COMMENT_ID: process.env.GH_AW_GITHUB_EVENT_COMMENT_ID, - GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER: process.env.GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER, - GH_AW_GITHUB_EVENT_ISSUE_NUMBER: process.env.GH_AW_GITHUB_EVENT_ISSUE_NUMBER, - GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER: process.env.GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER, GH_AW_GITHUB_REPOSITORY: process.env.GH_AW_GITHUB_REPOSITORY, GH_AW_GITHUB_RUN_ID: process.env.GH_AW_GITHUB_RUN_ID, GH_AW_GITHUB_WORKSPACE: process.env.GH_AW_GITHUB_WORKSPACE, @@ -298,17 +325,25 @@ jobs: include-hidden-files: true path: | /tmp/gh-aw/aw_info.json + /tmp/gh-aw/model_multipliers.json + /tmp/gh-aw/models.json /tmp/gh-aw/aw-prompts/prompt.txt + /tmp/gh-aw/aw-prompts/prompt-template.txt + /tmp/gh-aw/aw-prompts/prompt-import-tree.json /tmp/gh-aw/github_rate_limits.jsonl /tmp/gh-aw/base + /tmp/gh-aw/.github/agents + /tmp/gh-aw/.github/skills if-no-files-found: ignore retention-days: 1 agent: needs: activation + if: needs.activation.outputs.daily_effective_workflow_exceeded != 'true' runs-on: ubuntu-latest permissions: contents: read + copilot-requests: write issues: read pull-requests: read env: @@ -319,29 +354,37 @@ jobs: GH_AW_MCP_LOG_DIR: /tmp/gh-aw/mcp-logs/safeoutputs GH_AW_WORKFLOW_ID_SANITIZED: issuetriage outputs: - agentic_engine_timeout: ${{ steps.detect-copilot-errors.outputs.agentic_engine_timeout || 'false' }} + agentic_engine_timeout: ${{ steps.detect-agent-errors.outputs.agentic_engine_timeout || 'false' }} + ai_credits_rate_limit_error: ${{ steps.parse-mcp-gateway.outputs.ai_credits_rate_limit_error || 'false' }} + aic: ${{ steps.parse-mcp-gateway.outputs.aic }} + ambient_context: ${{ steps.parse-mcp-gateway.outputs.ambient_context }} checkout_pr_success: ${{ steps.checkout-pr.outputs.checkout_pr_success || 'true' }} effective_tokens: ${{ steps.parse-mcp-gateway.outputs.effective_tokens }} has_patch: ${{ steps.collect_output.outputs.has_patch }} - inference_access_error: ${{ steps.detect-copilot-errors.outputs.inference_access_error || 'false' }} - mcp_policy_error: ${{ steps.detect-copilot-errors.outputs.mcp_policy_error || 'false' }} + inference_access_error: ${{ steps.detect-agent-errors.outputs.inference_access_error || 'false' }} + mcp_policy_error: ${{ steps.detect-agent-errors.outputs.mcp_policy_error || 'false' }} model: ${{ needs.activation.outputs.model }} - model_not_supported_error: ${{ steps.detect-copilot-errors.outputs.model_not_supported_error || 'false' }} + model_not_supported_error: ${{ steps.detect-agent-errors.outputs.model_not_supported_error || 'false' }} output: ${{ steps.collect_output.outputs.output }} output_types: ${{ steps.collect_output.outputs.output_types }} + setup-parent-span-id: ${{ steps.setup.outputs.parent-span-id || steps.setup.outputs.span-id }} + setup-span-id: ${{ steps.setup.outputs.span-id }} setup-trace-id: ${{ steps.setup.outputs.trace-id }} + unknown_model_ai_credits: ${{ steps.parse-mcp-gateway.outputs.unknown_model_ai_credits || 'false' }} steps: - name: Setup Scripts id: setup - uses: github/gh-aw-actions/setup@b8068426813005612b960b5ab0b8bd2c27142323 # v0.71.5 + uses: github/gh-aw-actions/setup@5c2fe865bb4dc46e1450f6ee0d0541d759aea73a # v0.79.6 with: destination: ${{ runner.temp }}/gh-aw/actions job-name: ${{ github.job }} trace-id: ${{ needs.activation.outputs.setup-trace-id }} + parent-span-id: ${{ needs.activation.outputs.setup-parent-span-id || needs.activation.outputs.setup-span-id }} env: GH_AW_SETUP_WORKFLOW_NAME: "Issue 自动分类与回复" GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/issue-triage.lock.yml@${{ github.ref }} - GH_AW_INFO_VERSION: "1.0.40" + GH_AW_INFO_VERSION: "1.0.60" + GH_AW_INFO_ENGINE_ID: "copilot" - name: Set runtime paths id: set-runtime-paths run: | @@ -351,7 +394,7 @@ jobs: echo "GH_AW_SAFE_OUTPUTS_TOOLS_PATH=${RUNNER_TEMP}/gh-aw/safeoutputs/tools.json" } >> "$GITHUB_OUTPUT" - name: Checkout repository - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 with: persist-credentials: false - name: Create gh-aw temp directory @@ -376,7 +419,7 @@ jobs: - name: Checkout PR branch id: checkout-pr if: | - github.event.pull_request || github.event.issue.pull_request + github.event.pull_request || github.event.issue.pull_request || github.event_name == 'workflow_dispatch' && fromJSON(github.event.inputs.aw_context || '{}').item_type == 'pull_request' uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 env: GH_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} @@ -388,7 +431,7 @@ jobs: const { main } = require('${{ runner.temp }}/gh-aw/actions/checkout_pr_branch.cjs'); await main(); - name: Install GitHub Copilot CLI - run: bash "${RUNNER_TEMP}/gh-aw/actions/install_copilot_cli.sh" 1.0.40 + run: bash "${RUNNER_TEMP}/gh-aw/actions/install_copilot_cli.sh" 1.0.60 env: GH_HOST: github.com - name: Parse integrity filter lists @@ -406,19 +449,28 @@ jobs: - name: Restore agent config folders from base branch if: steps.checkout-pr.outcome == 'success' env: - GH_AW_AGENT_FOLDERS: ".agents .claude .codex .crush .gemini .github .opencode .pi" - GH_AW_AGENT_FILES: ".crush.json AGENTS.md CLAUDE.md GEMINI.md PI.md opencode.jsonc" + GH_AW_AGENT_FOLDERS: ".agents .antigravity .claude .codex .crush .gemini .github .opencode .pi" + GH_AW_AGENT_FILES: ".crush.json AGENTS.md ANTIGRAVITY.md CLAUDE.md GEMINI.md PI.md opencode.jsonc" run: bash "${RUNNER_TEMP}/gh-aw/actions/restore_base_github_folders.sh" + - name: Restore inline sub-agents from activation artifact + env: + GH_AW_SUB_AGENT_DIR: ".github/agents" + GH_AW_SUB_AGENT_EXT: ".agent.md" + run: bash "${RUNNER_TEMP}/gh-aw/actions/restore_inline_sub_agents.sh" + - name: Restore inline skills from activation artifact + env: + GH_AW_SKILL_DIR: ".github/skills" + run: bash "${RUNNER_TEMP}/gh-aw/actions/restore_inline_skills.sh" - name: Download container images - run: bash "${RUNNER_TEMP}/gh-aw/actions/download_docker_images.sh" ghcr.io/github/github-mcp-server:v1.0.3@sha256:2ac27ef03461ef2b877031b838a7d1fd7f12b12d4ace7796d8cad91446d55959 node:lts-alpine@sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f + run: bash "${RUNNER_TEMP}/gh-aw/actions/download_docker_images.sh" ghcr.io/github/github-mcp-server:v1.1.2@sha256:30197479d8036c7811892bc07e06f9a05c9ef3cdd79bc59f256d50647f95788c - name: Generate Safe Outputs Config run: | mkdir -p "${RUNNER_TEMP}/gh-aw/safeoutputs" mkdir -p /tmp/gh-aw/safeoutputs mkdir -p /tmp/gh-aw/mcp-logs/safeoutputs - cat > "${RUNNER_TEMP}/gh-aw/safeoutputs/config.json" << 'GH_AW_SAFE_OUTPUTS_CONFIG_18efef56cd5f6986_EOF' + cat > "${RUNNER_TEMP}/gh-aw/safeoutputs/config.json" << 'GH_AW_SAFE_OUTPUTS_CONFIG_33a8e71ee9b45c67_EOF' {"add_comment":{"max":1},"add_labels":{"allowed":["bug","feature","enhancement","documentation","question","duplicate","invalid"]},"create_report_incomplete_issue":{},"missing_data":{},"missing_tool":{},"noop":{"max":1,"report-as-issue":"true"},"report_incomplete":{}} - GH_AW_SAFE_OUTPUTS_CONFIG_18efef56cd5f6986_EOF + GH_AW_SAFE_OUTPUTS_CONFIG_33a8e71ee9b45c67_EOF - name: Generate Safe Outputs Tools env: GH_AW_TOOLS_META_JSON: | @@ -620,17 +672,22 @@ jobs: export GH_AW_ENGINE="copilot" MCP_GATEWAY_UID=$(id -u 2>/dev/null || echo '0') MCP_GATEWAY_GID=$(id -g 2>/dev/null || echo '0') - DOCKER_SOCK_GID=$(stat -c '%g' /var/run/docker.sock 2>/dev/null || echo '0') - export MCP_GATEWAY_DOCKER_COMMAND='docker run -i --rm --network host --add-host host.docker.internal:127.0.0.1 --user '"${MCP_GATEWAY_UID}"':'"${MCP_GATEWAY_GID}"' --group-add '"${DOCKER_SOCK_GID}"' -v /var/run/docker.sock:/var/run/docker.sock -e MCP_GATEWAY_PORT -e MCP_GATEWAY_DOMAIN -e MCP_GATEWAY_API_KEY -e MCP_GATEWAY_PAYLOAD_DIR -e MCP_GATEWAY_PAYLOAD_SIZE_THRESHOLD -e DEBUG -e MCP_GATEWAY_LOG_DIR -e GH_AW_MCP_LOG_DIR -e GH_AW_SAFE_OUTPUTS -e GH_AW_SAFE_OUTPUTS_CONFIG_PATH -e GH_AW_SAFE_OUTPUTS_TOOLS_PATH -e GH_AW_ASSETS_BRANCH -e GH_AW_ASSETS_MAX_SIZE_KB -e GH_AW_ASSETS_ALLOWED_EXTS -e DEFAULT_BRANCH -e GITHUB_MCP_SERVER_TOKEN -e GITHUB_MCP_GUARD_MIN_INTEGRITY -e GITHUB_MCP_GUARD_REPOS -e GITHUB_REPOSITORY -e GITHUB_SERVER_URL -e GITHUB_SHA -e GITHUB_WORKSPACE -e GITHUB_TOKEN -e GITHUB_RUN_ID -e GITHUB_RUN_NUMBER -e GITHUB_RUN_ATTEMPT -e GITHUB_JOB -e GITHUB_ACTION -e GITHUB_EVENT_NAME -e GITHUB_EVENT_PATH -e GITHUB_ACTOR -e GITHUB_ACTOR_ID -e GITHUB_TRIGGERING_ACTOR -e GITHUB_WORKFLOW -e GITHUB_WORKFLOW_REF -e GITHUB_WORKFLOW_SHA -e GITHUB_REF -e GITHUB_REF_NAME -e GITHUB_REF_TYPE -e GITHUB_HEAD_REF -e GITHUB_BASE_REF -e GH_AW_SAFE_OUTPUTS_PORT -e GH_AW_SAFE_OUTPUTS_API_KEY -v /tmp/gh-aw/mcp-payloads:/tmp/gh-aw/mcp-payloads:rw -v /opt:/opt:ro -v /tmp:/tmp:rw -v '"${GITHUB_WORKSPACE}"':'"${GITHUB_WORKSPACE}"':rw ghcr.io/github/gh-aw-mcpg:v0.3.6' + case "${DOCKER_HOST:-}" in + unix://* ) DOCKER_SOCK_PATH="${DOCKER_HOST#unix://}" ;; + /* ) DOCKER_SOCK_PATH="$DOCKER_HOST" ;; + * ) DOCKER_SOCK_PATH=/var/run/docker.sock ;; + esac + DOCKER_SOCK_GID=$(stat -c '%g' "$DOCKER_SOCK_PATH" 2>/dev/null || echo '0') + export MCP_GATEWAY_DOCKER_COMMAND='docker run -i --rm --network host --add-host host.docker.internal:127.0.0.1 --user '"${MCP_GATEWAY_UID}"':'"${MCP_GATEWAY_GID}"' --group-add '"${DOCKER_SOCK_GID}"' -v '"${DOCKER_SOCK_PATH}"':/var/run/docker.sock -e MCP_GATEWAY_PORT -e MCP_GATEWAY_DOMAIN -e MCP_GATEWAY_API_KEY -e MCP_GATEWAY_PAYLOAD_DIR -e MCP_GATEWAY_PAYLOAD_SIZE_THRESHOLD -e DOCKER_HOST=unix:///var/run/docker.sock -e DEBUG -e MCP_GATEWAY_LOG_DIR -e GH_AW_MCP_LOG_DIR -e GH_AW_SAFE_OUTPUTS -e GH_AW_SAFE_OUTPUTS_CONFIG_PATH -e GH_AW_SAFE_OUTPUTS_TOOLS_PATH -e GH_AW_ASSETS_BRANCH -e GH_AW_ASSETS_MAX_SIZE_KB -e GH_AW_ASSETS_ALLOWED_EXTS -e DEFAULT_BRANCH -e GITHUB_MCP_SERVER_TOKEN -e GITHUB_MCP_GUARD_MIN_INTEGRITY -e GITHUB_MCP_GUARD_REPOS -e GITHUB_REPOSITORY -e GITHUB_SERVER_URL -e GITHUB_SHA -e GITHUB_WORKSPACE -e GITHUB_TOKEN -e GITHUB_RUN_ID -e GITHUB_RUN_NUMBER -e GITHUB_RUN_ATTEMPT -e GITHUB_JOB -e GITHUB_ACTION -e GITHUB_EVENT_NAME -e GITHUB_EVENT_PATH -e GITHUB_ACTOR -e GITHUB_ACTOR_ID -e GITHUB_TRIGGERING_ACTOR -e GITHUB_WORKFLOW -e GITHUB_WORKFLOW_REF -e GITHUB_WORKFLOW_SHA -e GITHUB_REF -e GITHUB_REF_NAME -e GITHUB_REF_TYPE -e GITHUB_HEAD_REF -e GITHUB_BASE_REF -e GH_AW_SAFE_OUTPUTS_PORT -e GH_AW_SAFE_OUTPUTS_API_KEY -v /tmp/gh-aw/mcp-payloads:/tmp/gh-aw/mcp-payloads:rw -v /opt:/opt:ro -v /tmp:/tmp:rw -v '"${GITHUB_WORKSPACE}"':'"${GITHUB_WORKSPACE}"':rw ghcr.io/github/gh-aw-mcpg:v0.3.25' mkdir -p /home/runner/.copilot GH_AW_NODE=$(which node 2>/dev/null || command -v node 2>/dev/null || echo node) - cat << GH_AW_MCP_CONFIG_0138aecd21cfde50_EOF | "$GH_AW_NODE" "${RUNNER_TEMP}/gh-aw/actions/start_mcp_gateway.cjs" + cat << GH_AW_MCP_CONFIG_f41962abaffbda74_EOF | "$GH_AW_NODE" "${RUNNER_TEMP}/gh-aw/actions/start_mcp_gateway.cjs" { "mcpServers": { "github": { "type": "stdio", - "container": "ghcr.io/github/github-mcp-server:v1.0.3", + "container": "ghcr.io/github/github-mcp-server:v1.1.2", "env": { "GITHUB_HOST": "\${GITHUB_SERVER_URL}", "GITHUB_PERSONAL_ACCESS_TOKEN": "\${GITHUB_MCP_SERVER_TOKEN}", @@ -669,7 +726,7 @@ jobs: "payloadDir": "${MCP_GATEWAY_PAYLOAD_DIR}" } } - GH_AW_MCP_CONFIG_0138aecd21cfde50_EOF + GH_AW_MCP_CONFIG_f41962abaffbda74_EOF - name: Mount MCP servers as CLIs id: mount-mcp-clis continue-on-error: true @@ -699,26 +756,31 @@ jobs: timeout-minutes: 20 run: | set -o pipefail + printf '%s' "$(date +%s%3N)" > /tmp/gh-aw/agent_cli_start_ms.txt touch /tmp/gh-aw/agent-step-summary.md (umask 177 && touch /tmp/gh-aw/agent-stdio.log) + trap 'rm -f /home/runner/.copilot/settings.json' EXIT + mkdir -p /home/runner/.copilot + printf '%s' '{"builtInAgents":{"rubberDuck":false}}' > /home/runner/.copilot/settings.json mkdir -p /tmp/ mkdir -p /tmp/gh-aw/ mkdir -p /tmp/gh-aw/agent/ mkdir -p /tmp/gh-aw/sandbox/agent/logs/ - GH_AW_NODE_EXEC="${GH_AW_NODE_BIN:-}"; if [ -z "$GH_AW_NODE_EXEC" ] || [ ! -x "$GH_AW_NODE_EXEC" ]; then GH_AW_NODE_EXEC="$(command -v node 2>/dev/null || echo node)"; fi; "$GH_AW_NODE_EXEC" ${RUNNER_TEMP}/gh-aw/actions/copilot_harness.cjs copilot --add-dir /tmp/ --add-dir /tmp/gh-aw/ --add-dir /tmp/gh-aw/agent/ --log-level all --log-dir /tmp/gh-aw/sandbox/agent/logs/ --disable-builtin-mcps --no-ask-user --allow-tool github --allow-tool safeoutputs --prompt-file /tmp/gh-aw/aw-prompts/prompt.txt 2>&1 | tee /tmp/gh-aw/agent-stdio.log + GH_AW_NODE_EXEC="${GH_AW_NODE_BIN:-}"; if [ -z "$GH_AW_NODE_EXEC" ] || [ ! -x "$GH_AW_NODE_EXEC" ]; then GH_AW_NODE_EXEC="$(command -v node 2>/dev/null || true)"; fi; if [ -z "$GH_AW_NODE_EXEC" ]; then echo "node runtime missing on this runner — check runtimes.node in workflow YAML" >&2; exit 127; fi; GH_AW_NPM_GLOBAL_ROOT="$(npm root -g 2>/dev/null || true)"; if [ -n "$GH_AW_NPM_GLOBAL_ROOT" ]; then export NODE_PATH="${GH_AW_NPM_GLOBAL_ROOT}${NODE_PATH:+:${NODE_PATH}}"; fi; "$GH_AW_NODE_EXEC" ${RUNNER_TEMP}/gh-aw/actions/copilot_harness.cjs copilot --add-dir /tmp/ --add-dir /tmp/gh-aw/ --add-dir /tmp/gh-aw/agent/ --log-level all --log-dir /tmp/gh-aw/sandbox/agent/logs/ --disable-builtin-mcps --no-ask-user --allow-tool github --allow-tool safeoutputs --prompt-file /tmp/gh-aw/aw-prompts/prompt.txt 2>&1 | tee /tmp/gh-aw/agent-stdio.log env: COPILOT_AGENT_RUNNER_TYPE: STANDALONE - COPILOT_API_KEY: dummy-byok-key-for-offline-mode - COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }} - COPILOT_MODEL: doubao-seed-2-0-code-preview-260215 - COPILOT_PROVIDER_API_KEY: ${{ secrets.OPENAI_API_KEY }} + COPILOT_MODEL: doubao-seed-evolving COPILOT_PROVIDER_BASE_URL: https://ark.cn-beijing.volces.com/api/v3 + COPILOT_PROVIDER_BEARER_TOKEN: ${{ secrets.OPENAI_API_KEY }} COPILOT_PROVIDER_TYPE: openai + COPILOT_PROVIDER_WIRE_API: responses + GH_AW_MAX_TURNS: ${{ vars.GH_AW_DEFAULT_MAX_TURNS || '' }} GH_AW_MCP_CONFIG: /home/runner/.copilot/mcp-config.json GH_AW_PHASE: agent GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt GH_AW_SAFE_OUTPUTS: ${{ steps.set-runtime-paths.outputs.GH_AW_SAFE_OUTPUTS }} - GH_AW_VERSION: v0.71.5 + GH_AW_TIMEOUT_MINUTES: 20 + GH_AW_VERSION: v0.79.6 GITHUB_API_URL: ${{ github.api_url }} GITHUB_AW: true GITHUB_COPILOT_INTEGRATION_ID: agentic-workflows @@ -728,12 +790,14 @@ jobs: GITHUB_SERVER_URL: ${{ github.server_url }} GITHUB_STEP_SUMMARY: /tmp/gh-aw/agent-step-summary.md GITHUB_WORKSPACE: ${{ github.workspace }} + RUNNER_TEMP: ${{ runner.temp }} + S2STOKENS: true XDG_CONFIG_HOME: /home/runner - - name: Detect Copilot errors - id: detect-copilot-errors + - name: Detect agent errors if: always() + id: detect-agent-errors continue-on-error: true - run: node "${RUNNER_TEMP}/gh-aw/actions/detect_copilot_errors.cjs" + run: node "${RUNNER_TEMP}/gh-aw/actions/detect_agent_errors.cjs" - name: Configure Git credentials env: REPO_NAME: ${{ github.repository }} @@ -770,8 +834,7 @@ jobs: const { main } = require('${{ runner.temp }}/gh-aw/actions/redact_secrets.cjs'); await main(); env: - GH_AW_SECRET_NAMES: 'COPILOT_GITHUB_TOKEN,GH_AW_GITHUB_MCP_SERVER_TOKEN,GH_AW_GITHUB_TOKEN,GITHUB_TOKEN,OPENAI_API_KEY' - SECRET_COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }} + GH_AW_SECRET_NAMES: 'GH_AW_GITHUB_MCP_SERVER_TOKEN,GH_AW_GITHUB_TOKEN,GITHUB_TOKEN,OPENAI_API_KEY' SECRET_GH_AW_GITHUB_MCP_SERVER_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN }} SECRET_GH_AW_GITHUB_TOKEN: ${{ secrets.GH_AW_GITHUB_TOKEN }} SECRET_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -856,7 +919,7 @@ jobs: - safe_outputs if: > always() && (needs.agent.result != 'skipped' || needs.activation.outputs.lockdown_check_failed == 'true' || - needs.activation.outputs.stale_lock_file_failed == 'true') + needs.activation.outputs.stale_lock_file_failed == 'true' || needs.activation.outputs.daily_effective_workflow_exceeded == 'true') runs-on: ubuntu-slim permissions: contents: read @@ -866,6 +929,7 @@ jobs: concurrency: group: "gh-aw-conclusion-issue-triage" cancel-in-progress: false + queue: max outputs: incomplete_count: ${{ steps.report_incomplete.outputs.incomplete_count }} noop_message: ${{ steps.noop.outputs.noop_message }} @@ -874,15 +938,17 @@ jobs: steps: - name: Setup Scripts id: setup - uses: github/gh-aw-actions/setup@b8068426813005612b960b5ab0b8bd2c27142323 # v0.71.5 + uses: github/gh-aw-actions/setup@5c2fe865bb4dc46e1450f6ee0d0541d759aea73a # v0.79.6 with: destination: ${{ runner.temp }}/gh-aw/actions job-name: ${{ github.job }} trace-id: ${{ needs.activation.outputs.setup-trace-id }} + parent-span-id: ${{ needs.activation.outputs.setup-parent-span-id || needs.activation.outputs.setup-span-id }} env: GH_AW_SETUP_WORKFLOW_NAME: "Issue 自动分类与回复" GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/issue-triage.lock.yml@${{ github.ref }} - GH_AW_INFO_VERSION: "1.0.40" + GH_AW_INFO_VERSION: "1.0.60" + GH_AW_INFO_ENGINE_ID: "copilot" - name: Download agent output artifact id: download-agent-output continue-on-error: true @@ -897,6 +963,40 @@ jobs: mkdir -p /tmp/gh-aw/ find "/tmp/gh-aw/" -type f -print echo "GH_AW_AGENT_OUTPUT=/tmp/gh-aw/agent_output.json" >> "$GITHUB_OUTPUT" + - name: Collect usage artifact files + if: always() + continue-on-error: true + run: | + mkdir -p /tmp/gh-aw/usage/agent /tmp/gh-aw/usage/detection + echo "Usage artifact source file status:" + for file in /tmp/gh-aw/aw-info.jsonl /tmp/gh-aw/agent_usage.jsonl /tmp/gh-aw/detection_usage.jsonl /tmp/gh-aw/sandbox/firewall-audit-logs/api-proxy-logs/token-usage.jsonl /tmp/gh-aw/sandbox/firewall/logs/api-proxy-logs/token-usage.jsonl /tmp/gh-aw/sandbox/firewall/audit/api-proxy-logs/token-usage.jsonl /tmp/gh-aw/threat-detection/sandbox/firewall-audit-logs/api-proxy-logs/token-usage.jsonl /tmp/gh-aw/threat-detection/sandbox/firewall/logs/api-proxy-logs/token-usage.jsonl /tmp/gh-aw/threat-detection/sandbox/firewall/audit/api-proxy-logs/token-usage.jsonl; do + [ -f "$file" ] && echo "FOUND: $file" || echo "MISSING: $file" + done + [ -f /tmp/gh-aw/aw-info.jsonl ] && cp /tmp/gh-aw/aw-info.jsonl /tmp/gh-aw/usage/aw-info.jsonl || true + [ -f /tmp/gh-aw/agent_usage.jsonl ] && cp /tmp/gh-aw/agent_usage.jsonl /tmp/gh-aw/usage/agent_usage.jsonl || true + [ -f /tmp/gh-aw/detection_usage.jsonl ] && cp /tmp/gh-aw/detection_usage.jsonl /tmp/gh-aw/usage/detection_usage.jsonl || true + [ -f /tmp/gh-aw/sandbox/firewall-audit-logs/api-proxy-logs/token-usage.jsonl ] && cp /tmp/gh-aw/sandbox/firewall-audit-logs/api-proxy-logs/token-usage.jsonl /tmp/gh-aw/usage/agent/token_usage.jsonl || true + [ -f /tmp/gh-aw/sandbox/firewall/logs/api-proxy-logs/token-usage.jsonl ] && cp /tmp/gh-aw/sandbox/firewall/logs/api-proxy-logs/token-usage.jsonl /tmp/gh-aw/usage/agent/token_usage.jsonl || true + [ -f /tmp/gh-aw/sandbox/firewall/audit/api-proxy-logs/token-usage.jsonl ] && cp /tmp/gh-aw/sandbox/firewall/audit/api-proxy-logs/token-usage.jsonl /tmp/gh-aw/usage/agent/token_usage.jsonl || true + [ -f /tmp/gh-aw/threat-detection/sandbox/firewall-audit-logs/api-proxy-logs/token-usage.jsonl ] && cp /tmp/gh-aw/threat-detection/sandbox/firewall-audit-logs/api-proxy-logs/token-usage.jsonl /tmp/gh-aw/usage/detection/token_usage.jsonl || true + [ -f /tmp/gh-aw/threat-detection/sandbox/firewall/logs/api-proxy-logs/token-usage.jsonl ] && cp /tmp/gh-aw/threat-detection/sandbox/firewall/logs/api-proxy-logs/token-usage.jsonl /tmp/gh-aw/usage/detection/token_usage.jsonl || true + [ -f /tmp/gh-aw/threat-detection/sandbox/firewall/audit/api-proxy-logs/token-usage.jsonl ] && cp /tmp/gh-aw/threat-detection/sandbox/firewall/audit/api-proxy-logs/token-usage.jsonl /tmp/gh-aw/usage/detection/token_usage.jsonl || true + [ -f /tmp/gh-aw/usage/agent/token_usage.jsonl ] || : > /tmp/gh-aw/usage/agent/token_usage.jsonl + [ -f /tmp/gh-aw/usage/detection/token_usage.jsonl ] || : > /tmp/gh-aw/usage/detection/token_usage.jsonl + find /tmp/gh-aw/usage -type f -print | sort + - name: Upload usage artifact + if: always() + continue-on-error: true + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: usage + path: | + /tmp/gh-aw/usage/aw-info.jsonl + /tmp/gh-aw/usage/agent_usage.jsonl + /tmp/gh-aw/usage/detection_usage.jsonl + /tmp/gh-aw/usage/agent/token_usage.jsonl + /tmp/gh-aw/usage/detection/token_usage.jsonl + if-no-files-found: ignore - name: Process no-op messages id: noop uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 @@ -904,9 +1004,13 @@ jobs: GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }} GH_AW_NOOP_MAX: "1" GH_AW_WORKFLOW_NAME: "Issue 自动分类与回复" + GH_AW_WORKFLOW_SOURCE_URL: "${{ github.server_url }}/${{ github.repository }}/blob/${{ github.ref_name }}/.github/workflows/issue-triage.md" GH_AW_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} GH_AW_AGENT_CONCLUSION: ${{ needs.agent.result }} GH_AW_NOOP_REPORT_AS_ISSUE: "true" + GH_AW_AIC: ${{ needs.agent.outputs.aic }} + GH_AW_AMBIENT_CONTEXT: ${{ needs.agent.outputs.ambient_context }} + GH_AW_WORKFLOW_ID: "issue-triage" with: github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} script: | @@ -921,6 +1025,7 @@ jobs: GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }} GH_AW_MISSING_TOOL_CREATE_ISSUE: "true" GH_AW_WORKFLOW_NAME: "Issue 自动分类与回复" + GH_AW_WORKFLOW_SOURCE_URL: "${{ github.server_url }}/${{ github.repository }}/blob/${{ github.ref_name }}/.github/workflows/issue-triage.md" with: github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} script: | @@ -935,6 +1040,7 @@ jobs: GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }} GH_AW_REPORT_INCOMPLETE_CREATE_ISSUE: "true" GH_AW_WORKFLOW_NAME: "Issue 自动分类与回复" + GH_AW_WORKFLOW_SOURCE_URL: "${{ github.server_url }}/${{ github.repository }}/blob/${{ github.ref_name }}/.github/workflows/issue-triage.md" with: github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} script: | @@ -949,12 +1055,18 @@ jobs: env: GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }} GH_AW_WORKFLOW_NAME: "Issue 自动分类与回复" + GH_AW_WORKFLOW_SOURCE_URL: "${{ github.server_url }}/${{ github.repository }}/blob/${{ github.ref_name }}/.github/workflows/issue-triage.md" GH_AW_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} GH_AW_AGENT_CONCLUSION: ${{ needs.agent.result }} GH_AW_WORKFLOW_ID: "issue-triage" GH_AW_ACTION_FAILURE_ISSUE_EXPIRES_HOURS: "168" GH_AW_ENGINE_ID: "copilot" GH_AW_CHECKOUT_PR_SUCCESS: ${{ needs.agent.outputs.checkout_pr_success }} + GH_AW_EFFECTIVE_TOKENS: ${{ needs.agent.outputs.effective_tokens || '' }} + GH_AW_AI_CREDITS_RATE_LIMIT_ERROR: ${{ needs.agent.outputs.ai_credits_rate_limit_error || 'false' }} + GH_AW_UNKNOWN_MODEL_AI_CREDITS: ${{ needs.agent.outputs.unknown_model_ai_credits || 'false' }} + GH_AW_AIC: ${{ needs.agent.outputs.aic }} + GH_AW_MAX_AI_CREDITS: ${{ vars.GH_AW_DEFAULT_MAX_AI_CREDITS || '1000' }} GH_AW_INFERENCE_ACCESS_ERROR: ${{ needs.agent.outputs.inference_access_error }} GH_AW_MCP_POLICY_ERROR: ${{ needs.agent.outputs.mcp_policy_error }} GH_AW_AGENTIC_ENGINE_TIMEOUT: ${{ needs.agent.outputs.agentic_engine_timeout }} @@ -962,6 +1074,9 @@ jobs: GH_AW_ENGINE_API_HOSTS: "api.enterprise.githubcopilot.com,api.githubcopilot.com,api.business.githubcopilot.com,api.individual.githubcopilot.com" GH_AW_LOCKDOWN_CHECK_FAILED: ${{ needs.activation.outputs.lockdown_check_failed }} GH_AW_STALE_LOCK_FILE_FAILED: ${{ needs.activation.outputs.stale_lock_file_failed }} + GH_AW_DAILY_EFFECTIVE_WORKFLOW_EXCEEDED: ${{ needs.activation.outputs.daily_effective_workflow_exceeded }} + GH_AW_DAILY_EFFECTIVE_WORKFLOW_TOTAL_EFFECTIVE_TOKENS: ${{ needs.activation.outputs.daily_effective_workflow_total_effective_tokens }} + GH_AW_DAILY_EFFECTIVE_WORKFLOW_THRESHOLD: ${{ needs.activation.outputs.daily_effective_workflow_threshold }} GH_AW_GROUP_REPORTS: "false" GH_AW_FAILURE_REPORT_AS_ISSUE: "true" GH_AW_MISSING_TOOL_REPORT_AS_FAILURE: "true" @@ -980,18 +1095,21 @@ jobs: outputs: activated: ${{ steps.check_membership.outputs.is_team_member == 'true' }} matched_command: '' + setup-parent-span-id: ${{ steps.setup.outputs.parent-span-id || steps.setup.outputs.span-id }} + setup-span-id: ${{ steps.setup.outputs.span-id }} setup-trace-id: ${{ steps.setup.outputs.trace-id }} steps: - name: Setup Scripts id: setup - uses: github/gh-aw-actions/setup@b8068426813005612b960b5ab0b8bd2c27142323 # v0.71.5 + uses: github/gh-aw-actions/setup@5c2fe865bb4dc46e1450f6ee0d0541d759aea73a # v0.79.6 with: destination: ${{ runner.temp }}/gh-aw/actions job-name: ${{ github.job }} env: GH_AW_SETUP_WORKFLOW_NAME: "Issue 自动分类与回复" GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/issue-triage.lock.yml@${{ github.ref }} - GH_AW_INFO_VERSION: "1.0.40" + GH_AW_INFO_VERSION: "1.0.60" + GH_AW_INFO_ENGINE_ID: "copilot" - name: Check team membership for workflow id: check_membership uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 @@ -1016,15 +1134,19 @@ jobs: discussions: write issues: write pull-requests: write - timeout-minutes: 15 + timeout-minutes: 45 env: + GH_AW_AGENT_AIC: ${{ needs.agent.outputs.aic }} + GH_AW_AIC: ${{ needs.agent.outputs.aic }} + GH_AW_AMBIENT_CONTEXT: ${{ needs.agent.outputs.ambient_context }} GH_AW_CALLER_WORKFLOW_ID: "${{ github.repository }}/issue-triage" GH_AW_EFFECTIVE_TOKENS: ${{ needs.agent.outputs.effective_tokens }} GH_AW_ENGINE_ID: "copilot" GH_AW_ENGINE_MODEL: ${{ needs.agent.outputs.model }} - GH_AW_ENGINE_VERSION: "1.0.40" + GH_AW_ENGINE_VERSION: "1.0.60" GH_AW_WORKFLOW_ID: "issue-triage" GH_AW_WORKFLOW_NAME: "Issue 自动分类与回复" + GH_AW_WORKFLOW_SOURCE_URL: "${{ github.server_url }}/${{ github.repository }}/blob/${{ github.ref_name }}/.github/workflows/issue-triage.md" outputs: code_push_failure_count: ${{ steps.process_safe_outputs.outputs.code_push_failure_count }} code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} @@ -1037,15 +1159,17 @@ jobs: steps: - name: Setup Scripts id: setup - uses: github/gh-aw-actions/setup@b8068426813005612b960b5ab0b8bd2c27142323 # v0.71.5 + uses: github/gh-aw-actions/setup@5c2fe865bb4dc46e1450f6ee0d0541d759aea73a # v0.79.6 with: destination: ${{ runner.temp }}/gh-aw/actions job-name: ${{ github.job }} trace-id: ${{ needs.activation.outputs.setup-trace-id }} + parent-span-id: ${{ needs.activation.outputs.setup-parent-span-id || needs.activation.outputs.setup-span-id }} env: GH_AW_SETUP_WORKFLOW_NAME: "Issue 自动分类与回复" GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/issue-triage.lock.yml@${{ github.ref }} - GH_AW_INFO_VERSION: "1.0.40" + GH_AW_INFO_VERSION: "1.0.60" + GH_AW_INFO_ENGINE_ID: "copilot" - name: Download agent output artifact id: download-agent-output continue-on-error: true @@ -1063,6 +1187,7 @@ jobs: - name: Configure GH_HOST for enterprise compatibility id: ghes-host-config shell: bash + # zizmor: ignore[github-env] - GITHUB_SERVER_URL is set by GitHub Actions, not user input. run: | # Derive GH_HOST from GITHUB_SERVER_URL so the gh CLI targets the correct # GitHub instance (GHES/GHEC). On github.com this is a harmless no-op. @@ -1074,6 +1199,7 @@ jobs: uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 env: GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }} + GH_AW_COMMENT_ID: ${{ needs.activation.outputs.comment_id }} GH_AW_ALLOWED_DOMAINS: "api.business.githubcopilot.com,api.enterprise.githubcopilot.com,api.github.com,api.githubcopilot.com,api.individual.githubcopilot.com,api.snapcraft.io,archive.ubuntu.com,ark.cn-beijing.volces.com,azure.archive.ubuntu.com,crl.geotrust.com,crl.globalsign.com,crl.identrust.com,crl.sectigo.com,crl.thawte.com,crl.usertrust.com,crl.verisign.com,crl3.digicert.com,crl4.digicert.com,crls.ssl.com,github.com,host.docker.internal,json-schema.org,json.schemastore.org,keyserver.ubuntu.com,ocsp.digicert.com,ocsp.geotrust.com,ocsp.globalsign.com,ocsp.identrust.com,ocsp.sectigo.com,ocsp.ssl.com,ocsp.thawte.com,ocsp.usertrust.com,ocsp.verisign.com,packagecloud.io,packages.cloud.google.com,packages.microsoft.com,ppa.launchpad.net,raw.githubusercontent.com,registry.npmjs.org,s.symcb.com,s.symcd.com,security.ubuntu.com,telemetry.enterprise.githubcopilot.com,ts-crl.ws.symantec.com,ts-ocsp.ws.symantec.com,www.googleapis.com" GITHUB_SERVER_URL: ${{ github.server_url }} GITHUB_API_URL: ${{ github.api_url }} diff --git a/.github/workflows/issue-triage.md b/.github/workflows/issue-triage.md index f384730..ae11740 100644 --- a/.github/workflows/issue-triage.md +++ b/.github/workflows/issue-triage.md @@ -7,19 +7,22 @@ engine: id: copilot env: COPILOT_PROVIDER_BASE_URL: "https://ark.cn-beijing.volces.com/api/v3" - COPILOT_MODEL: doubao-seed-2-0-code-preview-260215 - COPILOT_PROVIDER_API_KEY: ${{ secrets.OPENAI_API_KEY }} + COPILOT_PROVIDER_BEARER_TOKEN: ${{ secrets.OPENAI_API_KEY }} + COPILOT_MODEL: doubao-seed-evolving COPILOT_PROVIDER_TYPE: openai + COPILOT_PROVIDER_WIRE_API: responses + +features: + dangerously-disable-sandbox-agent: "controlled environment for issue triage automation" +sandbox: + agent: false +strict: false network: allowed: - defaults - ark.cn-beijing.volces.com -sandbox: - agent: false -strict: false - tools: github: min-integrity: none @@ -28,6 +31,7 @@ permissions: issues: read contents: read pull-requests: read + copilot-requests: write safe-outputs: threat-detection: false @@ -60,7 +64,7 @@ safe-outputs: - `duplicate`:与已有 Issue 重复 - `invalid`:信息不完整或无效 -3. 根据用户的提问语言按照用户语言回复一条友好的评论,包含: +3. 使用用户提问的语言回复一条友好的评论,包含: - 感谢用户提交 Issue - 说明你打的标签和原因 - 如果是 bug,请用户补充:复现步骤、环境信息、错误日志 From b8e610aa6db0440f303147725ee20cce473e9981 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Thu, 30 Jul 2026 17:29:34 +0800 Subject: [PATCH 20/28] update:depend library --- XEngine_Source/XEngine_DependLibrary | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/XEngine_Source/XEngine_DependLibrary b/XEngine_Source/XEngine_DependLibrary index 8b6a941..2004d12 160000 --- a/XEngine_Source/XEngine_DependLibrary +++ b/XEngine_Source/XEngine_DependLibrary @@ -1 +1 @@ -Subproject commit 8b6a9413ad3407b06abea611a7b89a0e968e36c0 +Subproject commit 2004d12bf037c35c4e9d24cf2af6bca9af118dbf From ae1003e6696bea1680e4fce213d3d90354324649 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Thu, 30 Jul 2026 17:30:35 +0800 Subject: [PATCH 21/28] modify:detach http post and get method to new code file --- .../ModuleProtocol_Define.h | 16 +++--- .../ModuleProtocol_Packet.cpp | 33 +++++++----- .../ModuleProtocol_Packet.h | 2 +- XEngine_Source/XEngine_ModuleProtocol/pch.cpp | 4 +- XEngine_Source/XEngine_ServiceApp/Makefile | 9 +++- .../ProxyHttp/ProxyHttp_Get.cpp | 40 ++++++++++++++ .../ProxyHttp/ProxyHttp_Get.h | 3 ++ .../ProxyHttp/ProxyHttp_Post.cpp | 30 +++++++++++ .../ProxyHttp/ProxyHttp_Post.h | 3 ++ .../XEngine_ForwardTask.cpp | 2 +- .../XEngine_ServiceApp/XEngine_HTTPTask.cpp | 52 +++---------------- .../XEngine_ServiceApp/XEngine_Hdr.h | 2 + .../XEngine_ServiceApp.vcxproj | 4 ++ .../XEngine_ServiceApp.vcxproj.filters | 18 +++++++ 14 files changed, 149 insertions(+), 69 deletions(-) create mode 100644 XEngine_Source/XEngine_ServiceApp/ProxyHttp/ProxyHttp_Get.cpp create mode 100644 XEngine_Source/XEngine_ServiceApp/ProxyHttp/ProxyHttp_Get.h create mode 100644 XEngine_Source/XEngine_ServiceApp/ProxyHttp/ProxyHttp_Post.cpp create mode 100644 XEngine_Source/XEngine_ServiceApp/ProxyHttp/ProxyHttp_Post.h diff --git a/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Define.h b/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Define.h index b233daf..46dcf02 100644 --- a/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Define.h +++ b/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Define.h @@ -59,27 +59,27 @@ extern "C" bool ModuleProtocol_Packet_Comm(XCHAR* ptszMSGBuffer, int* pInt_MSGLe 类型:整数型指针 可空:N 意思:输出封装大小 - 参数.三:pSt_ProtocolHdr - In/Out:In - 类型:协议头 - 可空:N - 意思:输入请求的头 - 参数.四:pppSt_ListUser + 参数.三:pppSt_ListUser In/Out:In 类型:三级指针 可空:N 意思:输入要处理的列表 - 参数.五:nCount + 参数.四:nCount In/Out:In 类型:整数型 可空:N 意思:输入列表个数 + 参数.五:pSt_ProtocolHdr + In/Out:In + 类型:协议头 + 可空:N + 意思:输入请求的头 返回值 类型:逻辑型 意思:是否成功 备注: *********************************************************************/ -extern "C" bool ModuleProtocol_Packet_ForwardList(XCHAR* ptszMsgBuffer, int* pInt_Len, XENGINE_PROTOCOLHDR* pSt_ProtocolHdr, SESSION_FORWARD * **pppSt_ListUser, int nCount); +extern "C" bool ModuleProtocol_Packet_ForwardList(XCHAR* ptszMsgBuffer, int* pInt_Len, SESSION_FORWARD * **pppSt_ListUser, int nCount, XENGINE_PROTOCOLHDR* pSt_ProtocolHdr = NULL); /******************************************************************** 函数名称:ModuleProtocol_Packet_GetProxyRuleList 函数功能:代理转发规则列表信息 diff --git a/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Packet/ModuleProtocol_Packet.cpp b/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Packet/ModuleProtocol_Packet.cpp index b158cc0..93b4704 100644 --- a/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Packet/ModuleProtocol_Packet.cpp +++ b/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Packet/ModuleProtocol_Packet.cpp @@ -83,27 +83,27 @@ bool CModuleProtocol_Packet::ModuleProtocol_Packet_Comm(XCHAR* ptszMSGBuffer, in 类型:整数型指针 可空:N 意思:输出封装大小 - 参数.三:pSt_ProtocolHdr - In/Out:In - 类型:协议头 - 可空:N - 意思:输入请求的头 - 参数.四:pppSt_ListUser + 参数.三:pppSt_ListUser In/Out:In 类型:三级指针 可空:N 意思:输入要处理的列表 - 参数.五:nCount + 参数.四:nCount In/Out:In 类型:整数型 可空:N 意思:输入列表个数 + 参数.五:pSt_ProtocolHdr + In/Out:In + 类型:协议头 + 可空:N + 意思:输入请求的头 返回值 类型:逻辑型 意思:是否成功 备注: *********************************************************************/ -bool CModuleProtocol_Packet::ModuleProtocol_Packet_ForwardList(XCHAR* ptszMsgBuffer, int* pInt_Len, XENGINE_PROTOCOLHDR* pSt_ProtocolHdr, SESSION_FORWARD*** pppSt_ListUser, int nCount) +bool CModuleProtocol_Packet::ModuleProtocol_Packet_ForwardList(XCHAR* ptszMsgBuffer, int* pInt_Len, SESSION_FORWARD*** pppSt_ListUser, int nCount, XENGINE_PROTOCOLHDR* pSt_ProtocolHdr) { Protocol_IsErrorOccur = false; @@ -138,11 +138,20 @@ bool CModuleProtocol_Packet::ModuleProtocol_Packet_ForwardList(XCHAR* ptszMsgBuf st_JsonRoot["Count"] = nCount; st_JsonRoot["Array"] = st_JsonArray; - pSt_ProtocolHdr->unPacketSize = st_JsonRoot.toStyledString().length(); + if (NULL == pSt_ProtocolHdr) + { + *pInt_Len = st_JsonRoot.toStyledString().length(); + memcpy(ptszMsgBuffer, st_JsonRoot.toStyledString().c_str(), *pInt_Len); + } + else + { + pSt_ProtocolHdr->unPacketSize = st_JsonRoot.toStyledString().length(); - *pInt_Len = sizeof(XENGINE_PROTOCOLHDR) + pSt_ProtocolHdr->unPacketSize; - memcpy(ptszMsgBuffer, pSt_ProtocolHdr, sizeof(XENGINE_PROTOCOLHDR)); - memcpy(ptszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR), st_JsonRoot.toStyledString().c_str(), pSt_ProtocolHdr->unPacketSize); + memcpy(ptszMsgBuffer, pSt_ProtocolHdr, sizeof(XENGINE_PROTOCOLHDR)); + memcpy(ptszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR), st_JsonRoot.toStyledString().c_str(), pSt_ProtocolHdr->unPacketSize); + *pInt_Len = sizeof(XENGINE_PROTOCOLHDR) + pSt_ProtocolHdr->unPacketSize; + } + return true; } /******************************************************************** diff --git a/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Packet/ModuleProtocol_Packet.h b/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Packet/ModuleProtocol_Packet.h index 5d1e2b0..efe19bd 100644 --- a/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Packet/ModuleProtocol_Packet.h +++ b/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Packet/ModuleProtocol_Packet.h @@ -18,7 +18,7 @@ class CModuleProtocol_Packet ~CModuleProtocol_Packet(); public: bool ModuleProtocol_Packet_Comm(XCHAR* ptszMSGBuffer, int* pInt_MSGLen, int nCode = 0, LPCXSTR lpszMSGBuffer = _X("success")); - bool ModuleProtocol_Packet_ForwardList(XCHAR* ptszMsgBuffer, int* pInt_Len, XENGINE_PROTOCOLHDR* pSt_ProtocolHdr, SESSION_FORWARD*** pppSt_ListUser, int nCount); + bool ModuleProtocol_Packet_ForwardList(XCHAR* ptszMsgBuffer, int* pInt_Len, SESSION_FORWARD*** pppSt_ListUser, int nCount, XENGINE_PROTOCOLHDR* pSt_ProtocolHdr = NULL); bool ModuleProtocol_Packet_GetProxyRuleList(XCHAR* ptszMSGBuffer, int* pInt_MSGLen, SESSION_IPCONUT*** pppSt_IPCount, int nListCount); private: }; \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModuleProtocol/pch.cpp b/XEngine_Source/XEngine_ModuleProtocol/pch.cpp index ab467ab..e565951 100644 --- a/XEngine_Source/XEngine_ModuleProtocol/pch.cpp +++ b/XEngine_Source/XEngine_ModuleProtocol/pch.cpp @@ -35,9 +35,9 @@ extern "C" bool ModuleProtocol_Packet_Comm(XCHAR* ptszMSGBuffer, int* pInt_MSGLe { return m_ProtocolPacket.ModuleProtocol_Packet_Comm(ptszMSGBuffer, pInt_MSGLen, nCode, lpszMSGBuffer); } -extern "C" bool ModuleProtocol_Packet_ForwardList(XCHAR * ptszMsgBuffer, int* pInt_Len, XENGINE_PROTOCOLHDR * pSt_ProtocolHdr, SESSION_FORWARD * **pppSt_ListUser, int nCount) +extern "C" bool ModuleProtocol_Packet_ForwardList(XCHAR * ptszMsgBuffer, int* pInt_Len, SESSION_FORWARD * **pppSt_ListUser, int nCount, XENGINE_PROTOCOLHDR* pSt_ProtocolHdr) { - return m_ProtocolPacket.ModuleProtocol_Packet_ForwardList(ptszMsgBuffer, pInt_Len, pSt_ProtocolHdr, pppSt_ListUser, nCount); + return m_ProtocolPacket.ModuleProtocol_Packet_ForwardList(ptszMsgBuffer, pInt_Len, pppSt_ListUser, nCount, pSt_ProtocolHdr); } extern "C" bool ModuleProtocol_Packet_GetProxyRuleList(XCHAR* ptszMSGBuffer, int* pInt_MSGLen, SESSION_IPCONUT*** pppSt_IPCount, int nListCount) { diff --git a/XEngine_Source/XEngine_ServiceApp/Makefile b/XEngine_Source/XEngine_ServiceApp/Makefile index 44a8ebd..6515206 100644 --- a/XEngine_Source/XEngine_ServiceApp/Makefile +++ b/XEngine_Source/XEngine_ServiceApp/Makefile @@ -7,7 +7,9 @@ LIB = -lXEngine_BaseLib -lXEngine_Algorithm -lXEngine_Core -lXEngine_Cryption -l -lXEngine_ModuleConfigure -lXEngine_ModuleSession -lXEngine_ModuleProtocol -lXEngine_ModuleHelp \ -ljsoncpp -lXEngine_InfoReport -lXEngine_Verification LIBEX = -OBJECTS = XEngine_Configure.o XEngine_Network.o XEngine_HTTPTask.o XEngine_SocksTask.o XEngine_TunnelTask.o XEngine_ForwardTask.o XEngine_ProxyTask.o XEngine_ServiceApp.o +OBJECTS = XEngine_Configure.o XEngine_Network.o XEngine_HTTPTask.o XEngine_SocksTask.o XEngine_TunnelTask.o XEngine_ForwardTask.o XEngine_ProxyTask.o \ + ProxyHttp_Get.o ProxyHttp_Post.o \ + XEngine_ServiceApp.o ifeq ($(RELEASE),1) FLAGS = -c -D _RELEASE @@ -61,6 +63,11 @@ XEngine_ForwardTask.o:./XEngine_ForwardTask.cpp XEngine_ProxyTask.o:./XEngine_ProxyTask.cpp $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./XEngine_ProxyTask.cpp +ProxyHttp_Get.o:./ProxyHttp/ProxyHttp_Get.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./ProxyHttp/ProxyHttp_Get.cpp +ProxyHttp_Post.o:./ProxyHttp/ProxyHttp_Post.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./ProxyHttp/ProxyHttp_Post.cpp + XEngine_ServiceApp.o:./XEngine_ServiceApp.cpp $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./XEngine_ServiceApp.cpp diff --git a/XEngine_Source/XEngine_ServiceApp/ProxyHttp/ProxyHttp_Get.cpp b/XEngine_Source/XEngine_ServiceApp/ProxyHttp/ProxyHttp_Get.cpp new file mode 100644 index 0000000..a453b67 --- /dev/null +++ b/XEngine_Source/XEngine_ServiceApp/ProxyHttp/ProxyHttp_Get.cpp @@ -0,0 +1,40 @@ +#include "../XEngine_Hdr.h" + +bool XEngine_ProxyHTTP_Get(LPCXSTR lpszClientAddr, LPCXSTR lpszAPIName, LPCXSTR lpszAPIType, LPCXSTR lpszMsgBuffer, int nMsgLen) +{ + int nSDLen = 0; + LPCXSTR lpszAPIReload = _X("reload"); + LPCXSTR lpszAPIProxyRule = _X("proxyrule"); + + XCHAR tszSDBuffer[XPATH_8MAX] = {}; + + if (0 == _tcsxncmp(lpszAPIReload, lpszAPIName, _tcsxlen(lpszAPIReload))) + { + delete st_ProxyConfig.pStl_ListDestAddr; + delete st_ProxyConfig.pStl_ListRuleAddr; + //http://127.0.0.1:5400/api?function=reload&type=0 + LPCXSTR lpszConfigProxy = _X("./XEngine_Config/XEngine_ProxyConfig.json"); + ModuleConfigure_Json_ProxyFile(lpszConfigProxy, &st_ProxyConfig); + ModuleProtocol_Packet_Comm(tszSDBuffer, &nSDLen); + XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_CLIENT_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("HTTP客户端:%s,发送重载配置请求成功"), lpszClientAddr); + } + else if (0 == _tcsxncmp(lpszAPIProxyRule, lpszAPIName, _tcsxlen(lpszAPIProxyRule))) + { + //http://127.0.0.1:5400/api?function=proxyrule + int nListCount = 0; + SESSION_IPCONUT** ppSt_IPCountList; + ModuleSession_ProxyRule_GetList(&ppSt_IPCountList, &nListCount); + ModuleProtocol_Packet_GetProxyRuleList(tszSDBuffer, &nSDLen, &ppSt_IPCountList, nListCount); + XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_CLIENT_NETTYPE_HTTP); + BaseLib_Memory_Free((XPPPMEM)&ppSt_IPCountList, nListCount); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,发送获取转发规则列表请求处理成功"), lpszClientAddr); + } + else + { + ModuleProtocol_Packet_Comm(tszSDBuffer, &nSDLen, ERROR_XENGINE_PROXY_PROTOCOL_NOTSUPPORT, _X("unknow protocol")); + XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_CLIENT_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("HTTP客户端:%s,发送GET请求名称:%s,类型:%s,处理失败,不支持"), lpszClientAddr, lpszAPIName, lpszAPIType); + } + return true; +} \ No newline at end of file diff --git a/XEngine_Source/XEngine_ServiceApp/ProxyHttp/ProxyHttp_Get.h b/XEngine_Source/XEngine_ServiceApp/ProxyHttp/ProxyHttp_Get.h new file mode 100644 index 0000000..52d3615 --- /dev/null +++ b/XEngine_Source/XEngine_ServiceApp/ProxyHttp/ProxyHttp_Get.h @@ -0,0 +1,3 @@ +#pragma once + +bool XEngine_ProxyHTTP_Get(LPCXSTR lpszClientAddr, LPCXSTR lpszAPIName, LPCXSTR lpszAPIType, LPCXSTR lpszMsgBuffer, int nMsgLen); \ No newline at end of file diff --git a/XEngine_Source/XEngine_ServiceApp/ProxyHttp/ProxyHttp_Post.cpp b/XEngine_Source/XEngine_ServiceApp/ProxyHttp/ProxyHttp_Post.cpp new file mode 100644 index 0000000..ecabfb3 --- /dev/null +++ b/XEngine_Source/XEngine_ServiceApp/ProxyHttp/ProxyHttp_Post.cpp @@ -0,0 +1,30 @@ +#include "../XEngine_Hdr.h" + +bool XEngine_ProxyHTTP_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszAPIName, LPCXSTR lpszAPIType, LPCXSTR lpszMsgBuffer, int nMsgLen) +{ + int nSDLen = 0; + LPCXSTR lpszAPIList = _X("list"); + LPCXSTR lpszAPIForward = _X("forward"); + + XCHAR tszSDBuffer[XPATH_8MAX] = {}; + + if (0 == _tcsxncmp(lpszAPIName, lpszAPIForward, _tcsxlen(lpszAPIForward))) + { + //http://127.0.0.1:5400/api?function=list&value=forward + int nListCount = 0; + SESSION_FORWARD** ppSt_ListUser; + ModuleSession_Forward_List(&ppSt_ListUser, &nListCount); + + ModuleProtocol_Packet_ForwardList(tszSDBuffer, &nSDLen, &ppSt_ListUser, nListCount); + XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_CLIENT_NETTYPE_HTTP); + BaseLib_Memory_Free((XPPPMEM)&ppSt_ListUser, nListCount); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,转发列表请求成功"), lpszClientAddr); + } + else + { + ModuleProtocol_Packet_Comm(tszSDBuffer, &nSDLen, ERROR_XENGINE_PROXY_PROTOCOL_NOTSUPPORT, _X("unknow protocol")); + XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_CLIENT_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("HTTP客户端:%s,发送POST请求名称:%s,类型:%s,处理失败,不支持"), lpszClientAddr, lpszAPIName, lpszAPIType); + } + return true; +} \ No newline at end of file diff --git a/XEngine_Source/XEngine_ServiceApp/ProxyHttp/ProxyHttp_Post.h b/XEngine_Source/XEngine_ServiceApp/ProxyHttp/ProxyHttp_Post.h new file mode 100644 index 0000000..31b9ce6 --- /dev/null +++ b/XEngine_Source/XEngine_ServiceApp/ProxyHttp/ProxyHttp_Post.h @@ -0,0 +1,3 @@ +#pragma once + +bool XEngine_ProxyHTTP_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszAPIName, LPCXSTR lpszAPIType, LPCXSTR lpszMsgBuffer, int nMsgLen); \ No newline at end of file diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_ForwardTask.cpp b/XEngine_Source/XEngine_ServiceApp/XEngine_ForwardTask.cpp index 13bb2aa..257f9e5 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_ForwardTask.cpp +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_ForwardTask.cpp @@ -97,7 +97,7 @@ bool XEngine_Forward_Handle(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int n pSt_ProtocolHdr->unPacketSize = 0; pSt_ProtocolHdr->unOperatorCode = XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_FORWARD_LISTREP; ModuleSession_Forward_List(&ppSt_ListUser, &nListCount, lpszClientAddr); - ModuleProtocol_Packet_ForwardList(tszSDBuffer, &nSDLen, pSt_ProtocolHdr, &ppSt_ListUser, nListCount); + ModuleProtocol_Packet_ForwardList(tszSDBuffer, &nSDLen, &ppSt_ListUser, nListCount, pSt_ProtocolHdr); BaseLib_Memory_Free((XPPPMEM)&ppSt_ListUser, nListCount); XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_CLIENT_NETTYPE_FORWARD); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("Forward客户端:%s,请求可用转发列表成功"), lpszClientAddr); diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HTTPTask.cpp b/XEngine_Source/XEngine_ServiceApp/XEngine_HTTPTask.cpp index ea4e260..5e5b955 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HTTPTask.cpp +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HTTPTask.cpp @@ -145,62 +145,26 @@ bool XEngine_HTTPTask_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCXSTR return false; } } - XCHAR tszKey[128] = {}; - XCHAR tszValue[128] = {}; - LPCXSTR lpszAPIProxyRule = _X("proxyrule"); - LPCXSTR lpszAPIReload = _X("reload"); + XCHAR tszKeyStr[XPATH_MIN] = {}; + XCHAR tszAPIName[XPATH_MIN] = {}; + XCHAR tszAPIType[XPATH_MIN] = {}; //获得函数名 - BaseLib_String_GetKeyValue(pptszList[0], "=", tszKey, tszValue); + BaseLib_String_GetKeyValue(pptszList[0], "=", tszKeyStr, tszAPIName); + BaseLib_String_GetKeyValue(pptszList[1], "=", tszKeyStr, tszAPIType); //得到客户端请求的方法 if (0 == _tcsxncmp(lpszMethodPost, pSt_HTTPParam->tszHttpMethod, _tcsxlen(lpszMethodPost))) { - if (0 == _tcsxncmp(lpszAPIProxyRule, tszValue, _tcsxlen(lpszAPIProxyRule))) - { - //http://127.0.0.1:5400/api?function=get&value=proxyrule - } - else - { - ModuleProtocol_Packet_Comm(tszSDBuffer, &nSDLen, ERROR_XENGINE_PROXY_PROTOCOL_NOTSUPPORT, _X("unknow protocol")); - XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_CLIENT_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("HTTP客户端:%s,发送POST请求:%s,处理失败,不支持"), lpszClientAddr, pSt_HTTPParam->tszHttpUri); - } + XEngine_ProxyHTTP_Post(lpszClientAddr, tszAPIName, tszAPIType, lpszMsgBuffer, nMsgLen); } else if (0 == _tcsxncmp(lpszMethodGet, pSt_HTTPParam->tszHttpMethod, _tcsxlen(lpszMethodGet))) { - if (0 == _tcsxncmp(lpszAPIReload, tszValue, _tcsxlen(lpszAPIReload))) - { - delete st_ProxyConfig.pStl_ListDestAddr; - delete st_ProxyConfig.pStl_ListRuleAddr; - //http://127.0.0.1:5400/api?function=reload&type=0 - LPCXSTR lpszConfigProxy = _X("./XEngine_Config/XEngine_ProxyConfig.json"); - ModuleConfigure_Json_ProxyFile(lpszConfigProxy, &st_ProxyConfig); - ModuleProtocol_Packet_Comm(tszSDBuffer, &nSDLen); - XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_CLIENT_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("HTTP客户端:%s,发送重载配置请求成功"), lpszClientAddr); - } - else if (0 == _tcsxncmp(lpszAPIProxyRule, tszValue, _tcsxlen(lpszAPIProxyRule))) - { - //http://127.0.0.1:5400/api?function=proxyrule - int nListCount = 0; - SESSION_IPCONUT** ppSt_IPCountList; - ModuleSession_ProxyRule_GetList(&ppSt_IPCountList, &nListCount); - ModuleProtocol_Packet_GetProxyRuleList(tszSDBuffer, &nSDLen, &ppSt_IPCountList, nListCount); - XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_CLIENT_NETTYPE_HTTP); - BaseLib_Memory_Free((XPPPMEM)&ppSt_IPCountList, nListCount); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,发送获取转发规则列表请求处理成功"), lpszClientAddr, pSt_HTTPParam->tszHttpUri); - } - else - { - ModuleProtocol_Packet_Comm(tszSDBuffer, &nSDLen, ERROR_XENGINE_PROXY_PROTOCOL_NOTSUPPORT, _X("unknow protocol")); - XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_CLIENT_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("HTTP客户端:%s,发送GET请求:%s,处理失败,不支持"), lpszClientAddr, pSt_HTTPParam->tszHttpUri); - } + XEngine_ProxyHTTP_Get(lpszClientAddr, tszAPIName, tszAPIType, lpszMsgBuffer, nMsgLen); } else { ModuleProtocol_Packet_Comm(tszSDBuffer, &nSDLen, ERROR_XENGINE_PROXY_PROTOCOL_NOTSUPPORT, _X("unknow protocol")); XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_CLIENT_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("HTTP客户端:%s,协议错误"), lpszClientAddr); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("HTTP客户端:%s,请求方法名称:%s 不支持"), lpszClientAddr, pSt_HTTPParam->tszHttpMethod); } return true; } \ No newline at end of file diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_Hdr.h b/XEngine_Source/XEngine_ServiceApp/XEngine_Hdr.h index a7c1e0d..05b6d5a 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_Hdr.h +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_Hdr.h @@ -73,6 +73,8 @@ using namespace std; #include "XEngine_TunnelTask.h" #include "XEngine_ForwardTask.h" #include "XEngine_ProxyTask.h" +#include "ProxyHttp/ProxyHttp_Post.h" +#include "ProxyHttp/ProxyHttp_Get.h" /******************************************************************** // Created: 2021/12/02 16:34:41 // File Name: D:\XEngine_ServiceApp\XEngine_Source\XEngine_ServiceApp\XEngine_Hdr.h diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_ServiceApp.vcxproj b/XEngine_Source/XEngine_ServiceApp/XEngine_ServiceApp.vcxproj index 89c06b5..467d310 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_ServiceApp.vcxproj +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_ServiceApp.vcxproj @@ -234,6 +234,8 @@ + + @@ -244,6 +246,8 @@ + + diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_ServiceApp.vcxproj.filters b/XEngine_Source/XEngine_ServiceApp/XEngine_ServiceApp.vcxproj.filters index d309d84..bed11a9 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_ServiceApp.vcxproj.filters +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_ServiceApp.vcxproj.filters @@ -13,6 +13,12 @@ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + {0e05662c-fc2b-4adc-9018-0db1c970acbf} + + + {343dc5d1-a59f-4758-887a-f9c5e898745e} + @@ -39,6 +45,12 @@ 源文件 + + 源文件\ProxyHttp + + + 源文件\ProxyHttp + @@ -65,5 +77,11 @@ 头文件 + + 头文件\ProxyHttp + + + 头文件\ProxyHttp + \ No newline at end of file From 6f5524c31fff66eba728ff94f7471b8ab6937e75 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Thu, 30 Jul 2026 17:35:35 +0800 Subject: [PATCH 22/28] added:list function support and list forward for http api --- .../ProxyHttp/ProxyHttp_Get.cpp | 46 +++++++++++++------ .../ProxyHttp/ProxyHttp_Post.cpp | 12 +---- 2 files changed, 33 insertions(+), 25 deletions(-) diff --git a/XEngine_Source/XEngine_ServiceApp/ProxyHttp/ProxyHttp_Get.cpp b/XEngine_Source/XEngine_ServiceApp/ProxyHttp/ProxyHttp_Get.cpp index a453b67..bf77b37 100644 --- a/XEngine_Source/XEngine_ServiceApp/ProxyHttp/ProxyHttp_Get.cpp +++ b/XEngine_Source/XEngine_ServiceApp/ProxyHttp/ProxyHttp_Get.cpp @@ -3,12 +3,41 @@ bool XEngine_ProxyHTTP_Get(LPCXSTR lpszClientAddr, LPCXSTR lpszAPIName, LPCXSTR lpszAPIType, LPCXSTR lpszMsgBuffer, int nMsgLen) { int nSDLen = 0; - LPCXSTR lpszAPIReload = _X("reload"); - LPCXSTR lpszAPIProxyRule = _X("proxyrule"); + LPCXSTR lpszAPIList = _X("list"); + LPCXSTR lpszAPIReload = _X("reload"); XCHAR tszSDBuffer[XPATH_8MAX] = {}; - if (0 == _tcsxncmp(lpszAPIReload, lpszAPIName, _tcsxlen(lpszAPIReload))) + if (0 == _tcsxncmp(lpszAPIList, lpszAPIName, _tcsxlen(lpszAPIList))) + { + LPCXSTR lpszAPIProxyRule = _X("proxyrule"); + LPCXSTR lpszAPIForward = _X("forward"); + + if (0 == _tcsxncmp(lpszAPIProxyRule, lpszAPIName, _tcsxlen(lpszAPIProxyRule))) + { + //http://127.0.0.1:5400/api?function=proxyrule&type=0 + int nListCount = 0; + SESSION_IPCONUT** ppSt_IPCountList; + ModuleSession_ProxyRule_GetList(&ppSt_IPCountList, &nListCount); + ModuleProtocol_Packet_GetProxyRuleList(tszSDBuffer, &nSDLen, &ppSt_IPCountList, nListCount); + XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_CLIENT_NETTYPE_HTTP); + BaseLib_Memory_Free((XPPPMEM)&ppSt_IPCountList, nListCount); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,发送获取转发规则列表请求处理成功"), lpszClientAddr); + } + else if (0 == _tcsxncmp(lpszAPIName, lpszAPIForward, _tcsxlen(lpszAPIForward))) + { + //http://127.0.0.1:5400/api?function=list&value=forward + int nListCount = 0; + SESSION_FORWARD** ppSt_ListUser; + ModuleSession_Forward_List(&ppSt_ListUser, &nListCount); + + ModuleProtocol_Packet_ForwardList(tszSDBuffer, &nSDLen, &ppSt_ListUser, nListCount); + XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_CLIENT_NETTYPE_HTTP); + BaseLib_Memory_Free((XPPPMEM)&ppSt_ListUser, nListCount); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,转发列表请求成功"), lpszClientAddr); + } + } + else if (0 == _tcsxncmp(lpszAPIReload, lpszAPIName, _tcsxlen(lpszAPIReload))) { delete st_ProxyConfig.pStl_ListDestAddr; delete st_ProxyConfig.pStl_ListRuleAddr; @@ -19,17 +48,6 @@ bool XEngine_ProxyHTTP_Get(LPCXSTR lpszClientAddr, LPCXSTR lpszAPIName, LPCXSTR XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_CLIENT_NETTYPE_HTTP); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("HTTP客户端:%s,发送重载配置请求成功"), lpszClientAddr); } - else if (0 == _tcsxncmp(lpszAPIProxyRule, lpszAPIName, _tcsxlen(lpszAPIProxyRule))) - { - //http://127.0.0.1:5400/api?function=proxyrule - int nListCount = 0; - SESSION_IPCONUT** ppSt_IPCountList; - ModuleSession_ProxyRule_GetList(&ppSt_IPCountList, &nListCount); - ModuleProtocol_Packet_GetProxyRuleList(tszSDBuffer, &nSDLen, &ppSt_IPCountList, nListCount); - XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_CLIENT_NETTYPE_HTTP); - BaseLib_Memory_Free((XPPPMEM)&ppSt_IPCountList, nListCount); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,发送获取转发规则列表请求处理成功"), lpszClientAddr); - } else { ModuleProtocol_Packet_Comm(tszSDBuffer, &nSDLen, ERROR_XENGINE_PROXY_PROTOCOL_NOTSUPPORT, _X("unknow protocol")); diff --git a/XEngine_Source/XEngine_ServiceApp/ProxyHttp/ProxyHttp_Post.cpp b/XEngine_Source/XEngine_ServiceApp/ProxyHttp/ProxyHttp_Post.cpp index ecabfb3..e137288 100644 --- a/XEngine_Source/XEngine_ServiceApp/ProxyHttp/ProxyHttp_Post.cpp +++ b/XEngine_Source/XEngine_ServiceApp/ProxyHttp/ProxyHttp_Post.cpp @@ -4,21 +4,11 @@ bool XEngine_ProxyHTTP_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszAPIName, LPCXSTR { int nSDLen = 0; LPCXSTR lpszAPIList = _X("list"); - LPCXSTR lpszAPIForward = _X("forward"); XCHAR tszSDBuffer[XPATH_8MAX] = {}; - if (0 == _tcsxncmp(lpszAPIName, lpszAPIForward, _tcsxlen(lpszAPIForward))) + if (0 == _tcsxncmp(lpszAPIName, lpszAPIList, _tcsxlen(lpszAPIList))) { - //http://127.0.0.1:5400/api?function=list&value=forward - int nListCount = 0; - SESSION_FORWARD** ppSt_ListUser; - ModuleSession_Forward_List(&ppSt_ListUser, &nListCount); - - ModuleProtocol_Packet_ForwardList(tszSDBuffer, &nSDLen, &ppSt_ListUser, nListCount); - XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_CLIENT_NETTYPE_HTTP); - BaseLib_Memory_Free((XPPPMEM)&ppSt_ListUser, nListCount); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,转发列表请求成功"), lpszClientAddr); } else { From 6004f9d656a861fd95766da6cf52717c3fc291ad Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Fri, 31 Jul 2026 13:13:55 +0800 Subject: [PATCH 23/28] added:get list for http with proxy --- .../ProxyHttp/ProxyHttp_Get.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/XEngine_Source/XEngine_ServiceApp/ProxyHttp/ProxyHttp_Get.cpp b/XEngine_Source/XEngine_ServiceApp/ProxyHttp/ProxyHttp_Get.cpp index bf77b37..afd1345 100644 --- a/XEngine_Source/XEngine_ServiceApp/ProxyHttp/ProxyHttp_Get.cpp +++ b/XEngine_Source/XEngine_ServiceApp/ProxyHttp/ProxyHttp_Get.cpp @@ -10,7 +10,8 @@ bool XEngine_ProxyHTTP_Get(LPCXSTR lpszClientAddr, LPCXSTR lpszAPIName, LPCXSTR if (0 == _tcsxncmp(lpszAPIList, lpszAPIName, _tcsxlen(lpszAPIList))) { - LPCXSTR lpszAPIProxyRule = _X("proxyrule"); + LPCXSTR lpszAPIProxyRule = _X("rule"); + LPCXSTR lpszAPIProxy = _X("proxy"); LPCXSTR lpszAPIForward = _X("forward"); if (0 == _tcsxncmp(lpszAPIProxyRule, lpszAPIName, _tcsxlen(lpszAPIProxyRule))) @@ -34,7 +35,18 @@ bool XEngine_ProxyHTTP_Get(LPCXSTR lpszClientAddr, LPCXSTR lpszAPIName, LPCXSTR ModuleProtocol_Packet_ForwardList(tszSDBuffer, &nSDLen, &ppSt_ListUser, nListCount); XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_CLIENT_NETTYPE_HTTP); BaseLib_Memory_Free((XPPPMEM)&ppSt_ListUser, nListCount); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,转发列表请求成功"), lpszClientAddr); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,转发forward 列表请求成功"), lpszClientAddr); + } + else if (0 == _tcsxncmp(lpszAPIProxy, lpszAPIName, _tcsxlen(lpszAPIProxy))) + { + //http://127.0.0.1:5400/api?function=list&value=proxy + int nListCount = 0; + SESSION_FORWARD** ppSt_ListUser; + ModuleSession_Proxy_List(&ppSt_ListUser, &nListCount); + ModuleProtocol_Packet_ForwardList(tszSDBuffer, &nSDLen, &ppSt_ListUser, nListCount); + XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_CLIENT_NETTYPE_HTTP); + BaseLib_Memory_Free((XPPPMEM)&ppSt_ListUser, nListCount); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,转发proxy 列表请求成功"), lpszClientAddr); } } else if (0 == _tcsxncmp(lpszAPIReload, lpszAPIName, _tcsxlen(lpszAPIReload))) From c8d96c70a221767cba446505ce82283f8dadfb71 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Fri, 31 Jul 2026 13:15:47 +0800 Subject: [PATCH 24/28] fixed:does not set http send message buff size --- XEngine_Source/XEngine_ServiceApp/XEngine_Network.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_Network.cpp b/XEngine_Source/XEngine_ServiceApp/XEngine_Network.cpp index 37e6f00..0015bc1 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_Network.cpp +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_Network.cpp @@ -294,8 +294,8 @@ bool XEngine_Network_Send(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMs //根据客户端类型来处理发送业务逻辑 if (XENGINE_CLIENT_NETTYPE_HTTP == nIPProto) { - int nMSGSize = 0; //发送数据的大小 - XCHAR tszMSGBuffer[4096] = {}; //发送数据的缓冲区 + int nMSGSize = XPATH_8MAX; //发送数据的大小 + XCHAR tszMSGBuffer[XPATH_8MAX] = {}; //发送数据的缓冲区 RFCCOMPONENTS_HTTP_HDRPARAM st_HDRParam = {}; st_HDRParam.nHttpCode = 200; st_HDRParam.bIsClose = true; From 117d3181436d84b503662b7bf66156e2dea4b63e Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Fri, 31 Jul 2026 14:10:04 +0800 Subject: [PATCH 25/28] fixed:api name process failure --- .../XEngine_ServiceApp/ProxyHttp/ProxyHttp_Get.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/XEngine_Source/XEngine_ServiceApp/ProxyHttp/ProxyHttp_Get.cpp b/XEngine_Source/XEngine_ServiceApp/ProxyHttp/ProxyHttp_Get.cpp index afd1345..0b71bf1 100644 --- a/XEngine_Source/XEngine_ServiceApp/ProxyHttp/ProxyHttp_Get.cpp +++ b/XEngine_Source/XEngine_ServiceApp/ProxyHttp/ProxyHttp_Get.cpp @@ -14,9 +14,9 @@ bool XEngine_ProxyHTTP_Get(LPCXSTR lpszClientAddr, LPCXSTR lpszAPIName, LPCXSTR LPCXSTR lpszAPIProxy = _X("proxy"); LPCXSTR lpszAPIForward = _X("forward"); - if (0 == _tcsxncmp(lpszAPIProxyRule, lpszAPIName, _tcsxlen(lpszAPIProxyRule))) + if (0 == _tcsxncmp(lpszAPIProxyRule, lpszAPIType, _tcsxlen(lpszAPIProxyRule))) { - //http://127.0.0.1:5400/api?function=proxyrule&type=0 + //http://127.0.0.1:5400/api?function=list&type=rule int nListCount = 0; SESSION_IPCONUT** ppSt_IPCountList; ModuleSession_ProxyRule_GetList(&ppSt_IPCountList, &nListCount); @@ -25,7 +25,7 @@ bool XEngine_ProxyHTTP_Get(LPCXSTR lpszClientAddr, LPCXSTR lpszAPIName, LPCXSTR BaseLib_Memory_Free((XPPPMEM)&ppSt_IPCountList, nListCount); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,发送获取转发规则列表请求处理成功"), lpszClientAddr); } - else if (0 == _tcsxncmp(lpszAPIName, lpszAPIForward, _tcsxlen(lpszAPIForward))) + else if (0 == _tcsxncmp(lpszAPIForward, lpszAPIType, _tcsxlen(lpszAPIForward))) { //http://127.0.0.1:5400/api?function=list&value=forward int nListCount = 0; @@ -37,7 +37,7 @@ bool XEngine_ProxyHTTP_Get(LPCXSTR lpszClientAddr, LPCXSTR lpszAPIName, LPCXSTR BaseLib_Memory_Free((XPPPMEM)&ppSt_ListUser, nListCount); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,转发forward 列表请求成功"), lpszClientAddr); } - else if (0 == _tcsxncmp(lpszAPIProxy, lpszAPIName, _tcsxlen(lpszAPIProxy))) + else if (0 == _tcsxncmp(lpszAPIProxy, lpszAPIType, _tcsxlen(lpszAPIProxy))) { //http://127.0.0.1:5400/api?function=list&value=proxy int nListCount = 0; @@ -48,6 +48,12 @@ bool XEngine_ProxyHTTP_Get(LPCXSTR lpszClientAddr, LPCXSTR lpszAPIName, LPCXSTR BaseLib_Memory_Free((XPPPMEM)&ppSt_ListUser, nListCount); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,转发proxy 列表请求成功"), lpszClientAddr); } + else + { + ModuleProtocol_Packet_Comm(tszSDBuffer, &nSDLen, ERROR_XENGINE_PROXY_PROTOCOL_NOTSUPPORT, _X("unknow protocol")); + XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_CLIENT_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("HTTP客户端:%s,发送GET请求名称:%s,类型:%s,处理失败,不支持"), lpszClientAddr, lpszAPIName, lpszAPIType); + } } else if (0 == _tcsxncmp(lpszAPIReload, lpszAPIName, _tcsxlen(lpszAPIReload))) { From ae03a579b10478560e2be359c66d4879ad2caa56 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Fri, 31 Jul 2026 14:10:19 +0800 Subject: [PATCH 26/28] update:vs to 2026 version --- .../APPClient_ForwardExample/APPClient_ForwardExample.cpp | 6 +++--- .../APPClient_ForwardExample.vcxproj | 8 ++++---- .../APPClient_SocksExample/APPClient_SocksExample.cpp | 2 +- .../APPClient_SocksExample/APPClient_SocksExample.vcxproj | 8 ++++---- .../APPClient_TunnelExample/APPClient_TunnelExample.cpp | 2 +- .../APPClient_TunnelExample.vcxproj | 8 ++++---- 6 files changed, 17 insertions(+), 17 deletions(-) diff --git a/XEngine_APPClient/APPClient_ForwardExample/APPClient_ForwardExample.cpp b/XEngine_APPClient/APPClient_ForwardExample/APPClient_ForwardExample.cpp index 29c423d..fd6f82a 100644 --- a/XEngine_APPClient/APPClient_ForwardExample/APPClient_ForwardExample.cpp +++ b/XEngine_APPClient/APPClient_ForwardExample/APPClient_ForwardExample.cpp @@ -36,7 +36,7 @@ int Proxy_NamedTest() { XSOCKET m_Socket; LPCXSTR lpszServiceAddr = _X("127.0.0.1"); - if (!XClient_TCPSelect_Create(&m_Socket, lpszServiceAddr, 5402)) + if (!XClient_TCPSelect_Create(&m_Socket, lpszServiceAddr, 5404)) { printf("连接失败!错误:%lX\n", XClient_GetLastError()); return 0; @@ -190,7 +190,7 @@ int Proxy_AnonyTest() { XSOCKET m_Socket; LPCXSTR lpszServiceAddr = _X("127.0.0.1"); - if (!XClient_TCPSelect_Create(&m_Socket, lpszServiceAddr, 5402)) + if (!XClient_TCPSelect_Create(&m_Socket, lpszServiceAddr, 5403)) { printf("连接失败!错误:%lX\n", XClient_GetLastError()); return 0; @@ -236,7 +236,7 @@ int Proxy_AnonyTest() BaseLib_Memory_FreeCStyle((XPPMEM)&ptszMsgBuffer); //匿名转发请求 Json::Value st_JsonRoot; - st_JsonRoot["tszDstAddr"] = "127.0.0.1:5401"; + st_JsonRoot["tszDstAddr"] = "127.0.0.1:5403"; st_ProtocolHdr.wHeader = XENGIEN_COMMUNICATION_PACKET_PROTOCOL_HEADER; st_ProtocolHdr.wTail = XENGIEN_COMMUNICATION_PACKET_PROTOCOL_TAIL; diff --git a/XEngine_APPClient/APPClient_ForwardExample/APPClient_ForwardExample.vcxproj b/XEngine_APPClient/APPClient_ForwardExample/APPClient_ForwardExample.vcxproj index ebcb4b9..d285765 100644 --- a/XEngine_APPClient/APPClient_ForwardExample/APPClient_ForwardExample.vcxproj +++ b/XEngine_APPClient/APPClient_ForwardExample/APPClient_ForwardExample.vcxproj @@ -29,26 +29,26 @@ Application true - v143 + v145 MultiByte Application false - v143 + v145 true Unicode Application true - v143 + v145 Unicode Application false - v143 + v145 true Unicode diff --git a/XEngine_APPClient/APPClient_SocksExample/APPClient_SocksExample.cpp b/XEngine_APPClient/APPClient_SocksExample/APPClient_SocksExample.cpp index fbb17a7..fca47ba 100644 --- a/XEngine_APPClient/APPClient_SocksExample/APPClient_SocksExample.cpp +++ b/XEngine_APPClient/APPClient_SocksExample/APPClient_SocksExample.cpp @@ -32,7 +32,7 @@ int main(int argc, char** argv) #endif XSOCKET m_Socket; LPCXSTR lpszServiceAddr = _X("127.0.0.1"); - if (!XClient_TCPSelect_Create(&m_Socket, lpszServiceAddr, 5400)) + if (!XClient_TCPSelect_Create(&m_Socket, lpszServiceAddr, 5401)) { printf("连接失败!错误:%lX\n", XClient_GetLastError()); return 0; diff --git a/XEngine_APPClient/APPClient_SocksExample/APPClient_SocksExample.vcxproj b/XEngine_APPClient/APPClient_SocksExample/APPClient_SocksExample.vcxproj index efc974a..54e31eb 100644 --- a/XEngine_APPClient/APPClient_SocksExample/APPClient_SocksExample.vcxproj +++ b/XEngine_APPClient/APPClient_SocksExample/APPClient_SocksExample.vcxproj @@ -29,26 +29,26 @@ Application true - v143 + v145 MultiByte Application false - v143 + v145 true Unicode Application true - v143 + v145 Unicode Application false - v143 + v145 true Unicode diff --git a/XEngine_APPClient/APPClient_TunnelExample/APPClient_TunnelExample.cpp b/XEngine_APPClient/APPClient_TunnelExample/APPClient_TunnelExample.cpp index c308164..e7c54bc 100644 --- a/XEngine_APPClient/APPClient_TunnelExample/APPClient_TunnelExample.cpp +++ b/XEngine_APPClient/APPClient_TunnelExample/APPClient_TunnelExample.cpp @@ -33,7 +33,7 @@ int main(int argc, char** argv) XSOCKET m_Socket; LPCXSTR lpszServiceAddr = _X("127.0.0.1"); - if (!XClient_TCPSelect_Create(&m_Socket, lpszServiceAddr, 5401)) + if (!XClient_TCPSelect_Create(&m_Socket, lpszServiceAddr, 5402)) { printf("连接失败!错误:%lX\n", XClient_GetLastError()); return 0; diff --git a/XEngine_APPClient/APPClient_TunnelExample/APPClient_TunnelExample.vcxproj b/XEngine_APPClient/APPClient_TunnelExample/APPClient_TunnelExample.vcxproj index 44d08b2..b223baf 100644 --- a/XEngine_APPClient/APPClient_TunnelExample/APPClient_TunnelExample.vcxproj +++ b/XEngine_APPClient/APPClient_TunnelExample/APPClient_TunnelExample.vcxproj @@ -29,26 +29,26 @@ Application true - v143 + v145 MultiByte Application false - v143 + v145 true Unicode Application true - v143 + v145 Unicode Application false - v143 + v145 true Unicode From 825b32d120275941dfc7e93d169f67b1f3551afe Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Sat, 1 Aug 2026 09:04:49 +0800 Subject: [PATCH 27/28] modify:match runtime crt for every compiler choice --- .../XEngine_ModuleConfigure/XEngine_ModuleConfigure.vcxproj | 2 +- XEngine_Source/XEngine_ModuleHelp/XEngine_ModuleHelp.vcxproj | 1 + .../XEngine_ModuleProtocol/XEngine_ModuleProtocol.vcxproj | 1 + .../XEngine_ModuleSession/XEngine_ModuleSession.vcxproj | 1 + XEngine_Source/XEngine_ServiceApp/XEngine_ServiceApp.vcxproj | 2 +- 5 files changed, 5 insertions(+), 2 deletions(-) diff --git a/XEngine_Source/XEngine_ModuleConfigure/XEngine_ModuleConfigure.vcxproj b/XEngine_Source/XEngine_ModuleConfigure/XEngine_ModuleConfigure.vcxproj index 01042d5..d731d42 100644 --- a/XEngine_Source/XEngine_ModuleConfigure/XEngine_ModuleConfigure.vcxproj +++ b/XEngine_Source/XEngine_ModuleConfigure/XEngine_ModuleConfigure.vcxproj @@ -217,7 +217,7 @@ true Use pch.h - MultiThreaded + MultiThreadedDLL 4819 stdcpp20 stdc17 diff --git a/XEngine_Source/XEngine_ModuleHelp/XEngine_ModuleHelp.vcxproj b/XEngine_Source/XEngine_ModuleHelp/XEngine_ModuleHelp.vcxproj index 1e768a3..b92c456 100644 --- a/XEngine_Source/XEngine_ModuleHelp/XEngine_ModuleHelp.vcxproj +++ b/XEngine_Source/XEngine_ModuleHelp/XEngine_ModuleHelp.vcxproj @@ -199,6 +199,7 @@ true Use pch.h + MultiThreadedDLL Windows diff --git a/XEngine_Source/XEngine_ModuleProtocol/XEngine_ModuleProtocol.vcxproj b/XEngine_Source/XEngine_ModuleProtocol/XEngine_ModuleProtocol.vcxproj index cd5c13a..79ba4bc 100644 --- a/XEngine_Source/XEngine_ModuleProtocol/XEngine_ModuleProtocol.vcxproj +++ b/XEngine_Source/XEngine_ModuleProtocol/XEngine_ModuleProtocol.vcxproj @@ -207,6 +207,7 @@ stdcpp20 stdc17 /utf-8 %(AdditionalOptions) + MultiThreadedDLL Windows diff --git a/XEngine_Source/XEngine_ModuleSession/XEngine_ModuleSession.vcxproj b/XEngine_Source/XEngine_ModuleSession/XEngine_ModuleSession.vcxproj index 47cc1b2..3550a86 100644 --- a/XEngine_Source/XEngine_ModuleSession/XEngine_ModuleSession.vcxproj +++ b/XEngine_Source/XEngine_ModuleSession/XEngine_ModuleSession.vcxproj @@ -211,6 +211,7 @@ stdcpp20 stdc17 /utf-8 %(AdditionalOptions) + MultiThreadedDLL Windows diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_ServiceApp.vcxproj b/XEngine_Source/XEngine_ServiceApp/XEngine_ServiceApp.vcxproj index 467d310..3054bcd 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_ServiceApp.vcxproj +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_ServiceApp.vcxproj @@ -199,7 +199,7 @@ true NDEBUG;_CONSOLE;_WINDOWS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true - MultiThreaded + MultiThreadedDLL 4819 stdcpp20 stdc17 From 69c4a5c7d2672f5c3c5d3ebd05c5c947e5259f37 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Sat, 1 Aug 2026 09:19:37 +0800 Subject: [PATCH 28/28] update:document and configure and CHANGELOG --- CHANGELOG | 38 ++++++++++++++++++ XEngine_Docment/Docment_en.docx | Bin 120286 -> 120424 bytes XEngine_Docment/Docment_zh.docx | Bin 119288 -> 120228 bytes .../XEngine_Config/XEngine_Config.json | 2 +- .../XEngine_Config/XEngine_Version.json | 2 + 5 files changed, 41 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index b9f84d0..13d9ee0 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,41 @@ +XEngine_ProxyServer V1.18.0.1001 + +ci:增加问题自动修正检查提交的AI代理 +ci:增加问题和需求自动实现的AI代理 +ci:更新ci版本并且进行了多余的删除和优化 +增加:forward代理加密数据支持 +增加:http列举forward的客户端列表支持 +增加:http获取proxy代理客户端列表支持 +更新:依赖库 +更新:VS升级到2026版本 +修改:ci扫描的问题代码 +修改:分离了http代码,现在区分get和post +修改:匹配了每个运行时库的编译选项 +修正:没有设置http发送缓冲区大小导致的问题 +修正:api名称处理错误 + +ci:add mint build support and codeql-to-commit.yml +ci:add agentic workflows for issue triage and auto fix +ci:update last version and delete cppcheck.yml and improved codeql.yml +added:crypt data for forward proxy +added:list function support and list forward for http api +added:get list for http with proxy +update:depend library +update:vs to 2026 version +modify:ci scan code error +modify:detach http post and get method to new code file +modify:match runtime crt for every compiler choice +fixed:does not set http send message buff size +fixed:api name process failure +====================================================================================== +XEngine_ProxyServer V1.17.0.1001 + +更新:版本号错误 +修改:大小写区分错误 + +update:version and fixed version error +modify:do not case-sensitive +====================================================================================== XEngine_ProxyServer V1.16.0.1001 增加:验证模块 diff --git a/XEngine_Docment/Docment_en.docx b/XEngine_Docment/Docment_en.docx index 0f6965a0cdd2212cbd789039f2b09a8351297ec2..f2a5fdb81917075e3918cd0207a80ef3f1ab25d9 100644 GIT binary patch delta 101755 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

eUfqC*{TbNFqNklDAyt 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 Cb4cC* delta 101605 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

;_eUN6lOawO3SD9w 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

%q^QZ_O(KNgsCzUT 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 diff --git a/XEngine_Docment/Docment_zh.docx b/XEngine_Docment/Docment_zh.docx index 76f3ef4565388f7c9bb63717f459f93554b5e975..54d0cbc10abba0e6d0ae0451da1af7b245042061 100644 GIT binary patch delta 110522 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 z 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 bc9;X