From 4272f8689479521fa92a14bb80b0d0ac6d7c2c5b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 30 May 2026 14:31:05 +0000 Subject: [PATCH] fix: address CI failures, harden JSON parsing, and restrict subprocess env - Add enablement parameter to GitHub Pages workflow to fix deploy failures - Add try-catch around JSON.parse in ollamaClient, openAiCompatibleClient, and gammaClient to handle non-JSON responses gracefully - Restrict environment variables passed to CLI subprocess (PATH, HOME, LANG, TERM only) --- .github/workflows/pages.yml | 2 ++ src/server/cliRunner.js | 7 ++++++- src/server/gammaClient.js | 11 ++++++++++- src/server/ollamaClient.js | 11 ++++++++++- src/server/openAiCompatibleClient.js | 11 ++++++++++- 5 files changed, 38 insertions(+), 4 deletions(-) diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index 4108fb2..a804f68 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -23,6 +23,8 @@ jobs: steps: - uses: actions/checkout@v4 - uses: actions/configure-pages@v5 + with: + enablement: true - uses: actions/upload-pages-artifact@v3 with: path: public/ diff --git a/src/server/cliRunner.js b/src/server/cliRunner.js index 1338ef9..c2b16f0 100644 --- a/src/server/cliRunner.js +++ b/src/server/cliRunner.js @@ -62,7 +62,12 @@ function runProcess(binary, args, timeoutMs) { const child = spawn(binary, args, { shell: false, windowsHide: true, - env: process.env + env: { + PATH: process.env.PATH, + HOME: process.env.HOME, + LANG: process.env.LANG, + TERM: process.env.TERM + } }); let stdout = ''; diff --git a/src/server/gammaClient.js b/src/server/gammaClient.js index 452f135..0f2b801 100644 --- a/src/server/gammaClient.js +++ b/src/server/gammaClient.js @@ -10,7 +10,16 @@ async function fetchJson(url) { headers: { Accept: 'application/json' } }); const text = await response.text(); - const data = text ? JSON.parse(text) : {}; + let data = {}; + if (text) { + try { + data = JSON.parse(text); + } catch { + throw new Error( + `Gamma API returned non-JSON response (${response.status}): ${text.slice(0, 200)}` + ); + } + } if (!response.ok) { throw new Error( diff --git a/src/server/ollamaClient.js b/src/server/ollamaClient.js index fd6bdbf..4329b0f 100644 --- a/src/server/ollamaClient.js +++ b/src/server/ollamaClient.js @@ -20,7 +20,16 @@ async function fetchJson(url, options = {}) { try { const response = await fetch(url, { ...options, signal: controller.signal }); const text = await response.text(); - const data = text ? JSON.parse(text) : {}; + let data = {}; + if (text) { + try { + data = JSON.parse(text); + } catch { + throw new Error( + `Ollama returned non-JSON response (${response.status}): ${text.slice(0, 200)}` + ); + } + } if (!response.ok) { throw new Error( diff --git a/src/server/openAiCompatibleClient.js b/src/server/openAiCompatibleClient.js index 2d8a654..3f4c7c9 100644 --- a/src/server/openAiCompatibleClient.js +++ b/src/server/openAiCompatibleClient.js @@ -6,7 +6,16 @@ async function fetchJson(url, options = {}) { try { const response = await fetch(url, { ...options, signal: controller.signal }); const text = await response.text(); - const payload = text ? JSON.parse(text) : {}; + let payload = {}; + if (text) { + try { + payload = JSON.parse(text); + } catch { + throw new Error( + `Provider returned non-JSON response (${response.status}): ${text.slice(0, 200)}` + ); + } + } if (!response.ok) { throw new Error(