From 7a8e6f8e8c7d71fdfd2d4b6cf083462d7bd8b430 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 11 Apr 2026 17:14:37 -0300 Subject: [PATCH 01/10] chore(deps): bump docker/build-push-action from 6 to 7 (#1156) Integrated into release/v3.6.3 --- .github/workflows/docker-publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index 82c3aa2a90..28466e9093 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -61,7 +61,7 @@ jobs: echo "Publishing Docker image: $IMAGE_NAME:$VERSION" - name: Build and push multi-arch image - uses: docker/build-push-action@v6 + uses: docker/build-push-action@v7 with: context: . target: runner-base From 9e4ce3ae7262e29bff6143877f2fbeec9070c917 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 11 Apr 2026 17:14:40 -0300 Subject: [PATCH 02/10] chore(deps): bump actions/download-artifact from 4 to 8 (#1157) Integrated into release/v3.6.3 --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f0c84df59d..c548c577fa 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -223,7 +223,7 @@ jobs: - uses: actions/checkout@v6 with: fetch-depth: 0 - - uses: actions/download-artifact@v4 + - uses: actions/download-artifact@v8 with: name: coverage-report path: . @@ -253,7 +253,7 @@ jobs: - name: Download coverage artifact if: ${{ needs.test-coverage.result != 'cancelled' }} continue-on-error: true - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: name: coverage-report path: . @@ -394,7 +394,7 @@ jobs: steps: - name: Download i18n results continue-on-error: true - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: pattern: i18n-* path: results From 4e0d926f613d76b908c05c03414a77ad7bb1c46c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 11 Apr 2026 17:14:43 -0300 Subject: [PATCH 03/10] deps: bump electron from 40.8.5 to 41.2.0 in /electron (#1158) Integrated into release/v3.6.3 --- electron/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/electron/package.json b/electron/package.json index 511d3262c6..7b8a6d7718 100644 --- a/electron/package.json +++ b/electron/package.json @@ -26,7 +26,7 @@ "electron-updater": "^6.8.3" }, "devDependencies": { - "electron": "^40.6.1", + "electron": "^41.2.0", "electron-builder": "^25.1.8" }, "build": { From d833cc9c5452dd8a8f4b05f7bcee30bf5e101d42 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 11 Apr 2026 17:14:47 -0300 Subject: [PATCH 04/10] deps: bump the production group with 3 updates (#1161) Integrated into release/v3.6.3 --- package-lock.json | 25 +++++++++++++------------ package.json | 4 ++-- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index 18af741f5f..6e38e2be8c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -37,8 +37,8 @@ "ora": "^9.1.0", "pino": "^10.3.1", "pino-pretty": "^13.1.3", - "react": "19.2.4", - "react-dom": "19.2.4", + "react": "19.2.5", + "react-dom": "19.2.5", "recharts": "^3.7.0", "selfsigned": "^5.5.0", "tsx": "^4.21.0", @@ -2532,15 +2532,16 @@ } }, "node_modules/@lobehub/icons": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lobehub/icons/-/icons-5.3.0.tgz", - "integrity": "sha512-W/nQ1JSBHwYLnHup/TN7ml35eSsYqBoG5vpqChjH83WsuIRLT1vSpkPCkHOJ7pvmJCXXCwTicAwdhUS0lmIPaA==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@lobehub/icons/-/icons-5.4.0.tgz", + "integrity": "sha512-HXuq3j8Ios5PKmqvjNVDe91neYIcAAGS5z2W679esR4elBILNUofOhw/+Sa3FFefh71fOSuAVvNpy/CLoqO3vA==", "license": "MIT", "workspaces": [ "packages/*" ], "dependencies": { "antd-style": "^4.1.0", + "es-toolkit": "^1.45.1", "lucide-react": "^0.469.0", "polished": "^4.3.1" }, @@ -17087,9 +17088,9 @@ } }, "node_modules/react": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", - "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", + "version": "19.2.5", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.5.tgz", + "integrity": "sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -17118,15 +17119,15 @@ } }, "node_modules/react-dom": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", - "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", + "version": "19.2.5", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.5.tgz", + "integrity": "sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag==", "license": "MIT", "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { - "react": "^19.2.4" + "react": "^19.2.5" } }, "node_modules/react-draggable": { diff --git a/package.json b/package.json index 8d0d47d682..ae7dd80804 100644 --- a/package.json +++ b/package.json @@ -116,8 +116,8 @@ "ora": "^9.1.0", "pino": "^10.3.1", "pino-pretty": "^13.1.3", - "react": "19.2.4", - "react-dom": "19.2.4", + "react": "19.2.5", + "react-dom": "19.2.5", "recharts": "^3.7.0", "selfsigned": "^5.5.0", "tsx": "^4.21.0", From 6e521af3b3dfaff6cdda398ede0aa127d81ef9d5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 11 Apr 2026 17:14:50 -0300 Subject: [PATCH 05/10] deps: bump the development group with 7 updates (#1162) Integrated into release/v3.6.3 --- package-lock.json | 310 ++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 149 insertions(+), 163 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6e38e2be8c..dcde7c4a6d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -69,7 +69,7 @@ "concurrently": "^9.2.1", "cross-env": "^10.1.0", "eslint": "^9.39.2", - "eslint-config-next": "16.2.2", + "eslint-config-next": "16.2.3", "husky": "^9.1.7", "jsdom": "^29.0.1", "lint-staged": "^16.2.7", @@ -223,59 +223,37 @@ } }, "node_modules/@asamuzakjp/css-color": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-5.1.1.tgz", - "integrity": "sha512-iGWN8E45Ws0XWx3D44Q1t6vX2LqhCKcwfmwBYCDsFrYFS6m4q/Ks61L2veETaLv+ckDC6+dTETJoaAAb7VjLiw==", + "version": "5.1.10", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-5.1.10.tgz", + "integrity": "sha512-02OhhkKtgNRuicQ/nF3TRnGsxL9wp0r3Y7VlKWyOHHGmGyvXv03y+PnymU8FKFJMTjIr1Bk8U2g1HWSLrpAHww==", "dev": true, "license": "MIT", "dependencies": { "@csstools/css-calc": "^3.1.1", "@csstools/css-color-parser": "^4.0.2", "@csstools/css-parser-algorithms": "^4.0.0", - "@csstools/css-tokenizer": "^4.0.0", - "lru-cache": "^11.2.7" + "@csstools/css-tokenizer": "^4.0.0" }, "engines": { "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, - "node_modules/@asamuzakjp/css-color/node_modules/lru-cache": { - "version": "11.2.7", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", - "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - } - }, "node_modules/@asamuzakjp/dom-selector": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-7.0.4.tgz", - "integrity": "sha512-jXR6x4AcT3eIrS2fSNAwJpwirOkGcd+E7F7CP3zjdTqz9B/2huHOL8YJZBgekKwLML+u7qB/6P1LXQuMScsx0w==", + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-7.0.9.tgz", + "integrity": "sha512-r3ElRr7y8ucyN2KdICwGsmj19RoN13CLCa/pvGydghWK6ZzeKQ+TcDjVdtEZz2ElpndM5jXw//B9CEee0mWnVg==", "dev": true, "license": "MIT", "dependencies": { "@asamuzakjp/nwsapi": "^2.3.9", "bidi-js": "^1.0.3", "css-tree": "^3.2.1", - "is-potential-custom-element-name": "^1.0.1", - "lru-cache": "^11.2.7" + "is-potential-custom-element-name": "^1.0.1" }, "engines": { "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, - "node_modules/@asamuzakjp/dom-selector/node_modules/lru-cache": { - "version": "11.2.7", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", - "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - } - }, "node_modules/@asamuzakjp/nwsapi": { "version": "2.3.9", "resolved": "https://registry.npmjs.org/@asamuzakjp/nwsapi/-/nwsapi-2.3.9.tgz", @@ -2805,9 +2783,9 @@ "license": "MIT" }, "node_modules/@next/eslint-plugin-next": { - "version": "16.2.2", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.2.2.tgz", - "integrity": "sha512-IOPbWzDQ+76AtjZioaCjpIY72xNSDMnarZ2GMQ4wjNLvnJEJHqxQwGFhgnIWLV9klb4g/+amg88Tk5OXVpyLTw==", + "version": "16.2.3", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.2.3.tgz", + "integrity": "sha512-nE/b9mht28XJxjTwKs/yk7w4XTaU3t40UHVAky6cjiijdP/SEy3hGsnQMPxmXPTpC7W4/97okm6fngKnvCqVaA==", "dev": true, "license": "MIT", "dependencies": { @@ -6505,12 +6483,12 @@ "peer": true }, "node_modules/@types/node": { - "version": "25.5.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.2.tgz", - "integrity": "sha512-tO4ZIRKNC+MDWV4qKVZe3Ql/woTnmHDr5JD8UI5hn2pwBrHEwOEMZK7WlNb5RKB6EoJ02gwmQS9OrjuFnZYdpg==", + "version": "25.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.6.0.tgz", + "integrity": "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==", "license": "MIT", "dependencies": { - "undici-types": "~7.18.0" + "undici-types": "~7.19.0" } }, "node_modules/@types/parse-json": { @@ -6558,17 +6536,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.58.0.tgz", - "integrity": "sha512-RLkVSiNuUP1C2ROIWfqX+YcUfLaSnxGE/8M+Y57lopVwg9VTYYfhuz15Yf1IzCKgZj6/rIbYTmJCUSqr76r0Wg==", + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.58.1.tgz", + "integrity": "sha512-eSkwoemjo76bdXl2MYqtxg51HNwUSkWfODUOQ3PaTLZGh9uIWWFZIjyjaJnex7wXDu+TRx+ATsnSxdN9YWfRTQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.58.0", - "@typescript-eslint/type-utils": "8.58.0", - "@typescript-eslint/utils": "8.58.0", - "@typescript-eslint/visitor-keys": "8.58.0", + "@typescript-eslint/scope-manager": "8.58.1", + "@typescript-eslint/type-utils": "8.58.1", + "@typescript-eslint/utils": "8.58.1", + "@typescript-eslint/visitor-keys": "8.58.1", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" @@ -6581,7 +6559,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.58.0", + "@typescript-eslint/parser": "^8.58.1", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } @@ -6597,16 +6575,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.58.0.tgz", - "integrity": "sha512-rLoGZIf9afaRBYsPUMtvkDWykwXwUPL60HebR4JgTI8mxfFe2cQTu3AGitANp4b9B2QlVru6WzjgB2IzJKiCSA==", + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.58.1.tgz", + "integrity": "sha512-gGkiNMPqerb2cJSVcruigx9eHBlLG14fSdPdqMoOcBfh+vvn4iCq2C8MzUB89PrxOXk0y3GZ1yIWb9aOzL93bw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.58.0", - "@typescript-eslint/types": "8.58.0", - "@typescript-eslint/typescript-estree": "8.58.0", - "@typescript-eslint/visitor-keys": "8.58.0", + "@typescript-eslint/scope-manager": "8.58.1", + "@typescript-eslint/types": "8.58.1", + "@typescript-eslint/typescript-estree": "8.58.1", + "@typescript-eslint/visitor-keys": "8.58.1", "debug": "^4.4.3" }, "engines": { @@ -6622,14 +6600,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.58.0.tgz", - "integrity": "sha512-8Q/wBPWLQP1j16NxoPNIKpDZFMaxl7yWIoqXWYeWO+Bbd2mjgvoF0dxP2jKZg5+x49rgKdf7Ck473M8PC3V9lg==", + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.58.1.tgz", + "integrity": "sha512-gfQ8fk6cxhtptek+/8ZIqw8YrRW5048Gug8Ts5IYcMLCw18iUgrZAEY/D7s4hkI0FxEfGakKuPK/XUMPzPxi5g==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.58.0", - "@typescript-eslint/types": "^8.58.0", + "@typescript-eslint/tsconfig-utils": "^8.58.1", + "@typescript-eslint/types": "^8.58.1", "debug": "^4.4.3" }, "engines": { @@ -6644,14 +6622,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.58.0.tgz", - "integrity": "sha512-W1Lur1oF50FxSnNdGp3Vs6P+yBRSmZiw4IIjEeYxd8UQJwhUF0gDgDD/W/Tgmh73mxgEU3qX0Bzdl/NGuSPEpQ==", + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.58.1.tgz", + "integrity": "sha512-TPYUEqJK6avLcEjumWsIuTpuYODTTDAtoMdt8ZZa93uWMTX13Nb8L5leSje1NluammvU+oI3QRr5lLXPgihX3w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.58.0", - "@typescript-eslint/visitor-keys": "8.58.0" + "@typescript-eslint/types": "8.58.1", + "@typescript-eslint/visitor-keys": "8.58.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6662,9 +6640,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.58.0.tgz", - "integrity": "sha512-doNSZEVJsWEu4htiVC+PR6NpM+pa+a4ClH9INRWOWCUzMst/VA9c4gXq92F8GUD1rwhNvRLkgjfYtFXegXQF7A==", + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.58.1.tgz", + "integrity": "sha512-JAr2hOIct2Q+qk3G+8YFfqkqi7sC86uNryT+2i5HzMa2MPjw4qNFvtjnw1IiA1rP7QhNKVe21mSSLaSjwA1Olw==", "dev": true, "license": "MIT", "engines": { @@ -6679,15 +6657,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.58.0.tgz", - "integrity": "sha512-aGsCQImkDIqMyx1u4PrVlbi/krmDsQUs4zAcCV6M7yPcPev+RqVlndsJy9kJ8TLihW9TZ0kbDAzctpLn5o+lOg==", + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.58.1.tgz", + "integrity": "sha512-HUFxvTJVroT+0rXVJC7eD5zol6ID+Sn5npVPWoFuHGg9Ncq5Q4EYstqR+UOqaNRFXi5TYkpXXkLhoCHe3G0+7w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.58.0", - "@typescript-eslint/typescript-estree": "8.58.0", - "@typescript-eslint/utils": "8.58.0", + "@typescript-eslint/types": "8.58.1", + "@typescript-eslint/typescript-estree": "8.58.1", + "@typescript-eslint/utils": "8.58.1", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, @@ -6704,9 +6682,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.58.0.tgz", - "integrity": "sha512-O9CjxypDT89fbHxRfETNoAnHj/i6IpRK0CvbVN3qibxlLdo5p5hcLmUuCCrHMpxiWSwKyI8mCP7qRNYuOJ0Uww==", + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.58.1.tgz", + "integrity": "sha512-io/dV5Aw5ezwzfPBBWLoT+5QfVtP8O7q4Kftjn5azJ88bYyp/ZMCsyW1lpKK46EXJcaYMZ1JtYj+s/7TdzmQMw==", "dev": true, "license": "MIT", "engines": { @@ -6718,16 +6696,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.58.0.tgz", - "integrity": "sha512-7vv5UWbHqew/dvs+D3e1RvLv1v2eeZ9txRHPnEEBUgSNLx5ghdzjHa0sgLWYVKssH+lYmV0JaWdoubo0ncGYLA==", + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.58.1.tgz", + "integrity": "sha512-w4w7WR7GHOjqqPnvAYbazq+Y5oS68b9CzasGtnd6jIeOIeKUzYzupGTB2T4LTPSv4d+WPeccbxuneTFHYgAAWg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.58.0", - "@typescript-eslint/tsconfig-utils": "8.58.0", - "@typescript-eslint/types": "8.58.0", - "@typescript-eslint/visitor-keys": "8.58.0", + "@typescript-eslint/project-service": "8.58.1", + "@typescript-eslint/tsconfig-utils": "8.58.1", + "@typescript-eslint/types": "8.58.1", + "@typescript-eslint/visitor-keys": "8.58.1", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", @@ -6798,16 +6776,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.58.0.tgz", - "integrity": "sha512-RfeSqcFeHMHlAWzt4TBjWOAtoW9lnsAGiP3GbaX9uVgTYYrMbVnGONEfUCiSss+xMHFl+eHZiipmA8WkQ7FuNA==", + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.58.1.tgz", + "integrity": "sha512-Ln8R0tmWC7pTtLOzgJzYTXSCjJ9rDNHAqTaVONF4FEi2qwce8mD9iSOxOpLFFvWp/wBFlew0mjM1L1ihYWfBdQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.58.0", - "@typescript-eslint/types": "8.58.0", - "@typescript-eslint/typescript-estree": "8.58.0" + "@typescript-eslint/scope-manager": "8.58.1", + "@typescript-eslint/types": "8.58.1", + "@typescript-eslint/typescript-estree": "8.58.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6822,13 +6800,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.58.0.tgz", - "integrity": "sha512-XJ9UD9+bbDo4a4epraTwG3TsNPeiB9aShrUneAVXy8q4LuwowN+qu89/6ByLMINqvIMeI9H9hOHQtg/ijrYXzQ==", + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.58.1.tgz", + "integrity": "sha512-y+vH7QE8ycjoa0bWciFg7OpFcipUuem1ujhrdLtq1gByKwfbC7bPeKsiny9e0urg93DqwGcHey+bGRKCnF1nZQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.58.0", + "@typescript-eslint/types": "8.58.1", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -7186,16 +7164,16 @@ } }, "node_modules/@vitest/expect": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.2.tgz", - "integrity": "sha512-gbu+7B0YgUJ2nkdsRJrFFW6X7NTP44WlhiclHniUhxADQJH5Szt9mZ9hWnJPJ8YwOK5zUOSSlSvyzRf0u1DSBQ==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.4.tgz", + "integrity": "sha512-iPBpra+VDuXmBFI3FMKHSFXp3Gx5HfmSCE8X67Dn+bwephCnQCaB7qWK2ldHa+8ncN8hJU8VTMcxjPpyMkUjww==", "dev": true, "license": "MIT", "dependencies": { "@standard-schema/spec": "^1.1.0", "@types/chai": "^5.2.2", - "@vitest/spy": "4.1.2", - "@vitest/utils": "4.1.2", + "@vitest/spy": "4.1.4", + "@vitest/utils": "4.1.4", "chai": "^6.2.2", "tinyrainbow": "^3.1.0" }, @@ -7204,13 +7182,13 @@ } }, "node_modules/@vitest/mocker": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.2.tgz", - "integrity": "sha512-Ize4iQtEALHDttPRCmN+FKqOl2vxTiNUhzobQFFt/BM1lRUTG7zRCLOykG/6Vo4E4hnUdfVLo5/eqKPukcWW7Q==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.4.tgz", + "integrity": "sha512-R9HTZBhW6yCSGbGQnDnH3QHfJxokKN4KB+Yvk9Q1le7eQNYwiCyKxmLmurSpFy6BzJanSLuEUDrD+j97Q+ZLPg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "4.1.2", + "@vitest/spy": "4.1.4", "estree-walker": "^3.0.3", "magic-string": "^0.30.21" }, @@ -7231,9 +7209,9 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.2.tgz", - "integrity": "sha512-dwQga8aejqeuB+TvXCMzSQemvV9hNEtDDpgUKDzOmNQayl2OG241PSWeJwKRH3CiC+sESrmoFd49rfnq7T4RnA==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.4.tgz", + "integrity": "sha512-ddmDHU0gjEUyEVLxtZa7xamrpIefdEETu3nZjWtHeZX4QxqJ7tRxSteHVXJOcr8jhiLoGAhkK4WJ3WqBpjx42A==", "dev": true, "license": "MIT", "dependencies": { @@ -7244,13 +7222,13 @@ } }, "node_modules/@vitest/runner": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.2.tgz", - "integrity": "sha512-Gr+FQan34CdiYAwpGJmQG8PgkyFVmARK8/xSijia3eTFgVfpcpztWLuP6FttGNfPLJhaZVP/euvujeNYar36OQ==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.4.tgz", + "integrity": "sha512-xTp7VZ5aXP5ZJrn15UtJUWlx6qXLnGtF6jNxHepdPHpMfz/aVPx+htHtgcAL2mDXJgKhpoo2e9/hVJsIeFbytQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "4.1.2", + "@vitest/utils": "4.1.4", "pathe": "^2.0.3" }, "funding": { @@ -7258,14 +7236,14 @@ } }, "node_modules/@vitest/snapshot": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.2.tgz", - "integrity": "sha512-g7yfUmxYS4mNxk31qbOYsSt2F4m1E02LFqO53Xpzg3zKMhLAPZAjjfyl9e6z7HrW6LvUdTwAQR3HHfLjpko16A==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.4.tgz", + "integrity": "sha512-MCjCFgaS8aZz+m5nTcEcgk/xhWv0rEH4Yl53PPlMXOZ1/Ka2VcZU6CJ+MgYCZbcJvzGhQRjVrGQNZqkGPttIKw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.1.2", - "@vitest/utils": "4.1.2", + "@vitest/pretty-format": "4.1.4", + "@vitest/utils": "4.1.4", "magic-string": "^0.30.21", "pathe": "^2.0.3" }, @@ -7274,9 +7252,9 @@ } }, "node_modules/@vitest/spy": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.2.tgz", - "integrity": "sha512-DU4fBnbVCJGNBwVA6xSToNXrkZNSiw59H8tcuUspVMsBDBST4nfvsPsEHDHGtWRRnqBERBQu7TrTKskmjqTXKA==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.4.tgz", + "integrity": "sha512-XxNdAsKW7C+FLydqFJLb5KhJtl3PGCMmYwFRfhvIgxJvLSXhhVI1zM8f1qD3Zg7RCjTSzDVyct6sghs9UEgBEQ==", "dev": true, "license": "MIT", "funding": { @@ -7284,13 +7262,13 @@ } }, "node_modules/@vitest/utils": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.2.tgz", - "integrity": "sha512-xw2/TiX82lQHA06cgbqRKFb5lCAy3axQ4H4SoUFhUsg+wztiet+co86IAMDtF6Vm1hc7J6j09oh/rgDn+JdKIQ==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.4.tgz", + "integrity": "sha512-13QMT+eysM5uVGa1rG4kegGYNp6cnQcsTc67ELFbhNLQO+vgsygtYJx2khvdt4gVQqSSpC/KT5FZZxUpP3Oatw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.1.2", + "@vitest/pretty-format": "4.1.4", "convert-source-map": "^2.0.0", "tinyrainbow": "^3.1.0" }, @@ -10161,13 +10139,13 @@ } }, "node_modules/eslint-config-next": { - "version": "16.2.2", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.2.2.tgz", - "integrity": "sha512-6VlvEhwoug2JpVgjZDhyXrJXUEuPY++TddzIpTaIRvlvlXXFgvQUtm3+Zr84IjFm0lXtJt73w19JA08tOaZVwg==", + "version": "16.2.3", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.2.3.tgz", + "integrity": "sha512-Dnkrylzjof/Az7iNoIQJqD18zTxQZcngir19KJaiRsMnnjpQSVoa6aEg/1Q4hQC+cW90uTlgQYadwL1CYNwFWA==", "dev": true, "license": "MIT", "dependencies": { - "@next/eslint-plugin-next": "16.2.2", + "@next/eslint-plugin-next": "16.2.3", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", "eslint-plugin-import": "^2.32.0", @@ -13070,14 +13048,14 @@ } }, "node_modules/jsdom": { - "version": "29.0.1", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-29.0.1.tgz", - "integrity": "sha512-z6JOK5gRO7aMybVq/y/MlIpKh8JIi68FBKMUtKkK2KH/wMSRlCxQ682d08LB9fYXplyY/UXG8P4XXTScmdjApg==", + "version": "29.0.2", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-29.0.2.tgz", + "integrity": "sha512-9VnGEBosc/ZpwyOsJBCQ/3I5p7Q5ngOY14a9bf5btenAORmZfDse1ZEheMiWcJ3h81+Fv7HmJFdS0szo/waF2w==", "dev": true, "license": "MIT", "dependencies": { - "@asamuzakjp/css-color": "^5.0.1", - "@asamuzakjp/dom-selector": "^7.0.3", + "@asamuzakjp/css-color": "^5.1.5", + "@asamuzakjp/dom-selector": "^7.0.6", "@bramus/specificity": "^2.4.2", "@csstools/css-syntax-patches-for-csstree": "^1.1.1", "@exodus/bytes": "^1.15.0", @@ -16538,9 +16516,9 @@ } }, "node_modules/prettier": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", - "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.2.tgz", + "integrity": "sha512-8c3mgTe0ASwWAJK+78dpviD+A8EqhndQPUBpNUIPt6+xWlIigCwfN01lWr9MAede4uqXGTEKeQWTvzb3vjia0Q==", "dev": true, "license": "MIT", "bin": { @@ -19706,16 +19684,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.58.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.58.0.tgz", - "integrity": "sha512-e2TQzKfaI85fO+F3QywtX+tCTsu/D3WW5LVU6nz8hTFKFZ8yBJ6mSYRpXqdR3mFjPWmO0eWsTa5f+UpAOe/FMA==", + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.58.1.tgz", + "integrity": "sha512-gf6/oHChByg9HJvhMO1iBexJh12AqqTfnuxscMDOVqfJW3htsdRJI/GfPpHTTcyeB8cSTUY2JcZmVgoyPqcrDg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.58.0", - "@typescript-eslint/parser": "8.58.0", - "@typescript-eslint/typescript-estree": "8.58.0", - "@typescript-eslint/utils": "8.58.0" + "@typescript-eslint/eslint-plugin": "8.58.1", + "@typescript-eslint/parser": "8.58.1", + "@typescript-eslint/typescript-estree": "8.58.1", + "@typescript-eslint/utils": "8.58.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -19765,9 +19743,9 @@ } }, "node_modules/undici-types": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", - "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "version": "7.19.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.19.2.tgz", + "integrity": "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==", "license": "MIT" }, "node_modules/unified": { @@ -20290,19 +20268,19 @@ } }, "node_modules/vitest": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.2.tgz", - "integrity": "sha512-xjR1dMTVHlFLh98JE3i/f/WePqJsah4A0FK9cc8Ehp9Udk0AZk6ccpIZhh1qJ/yxVWRZ+Q54ocnD8TXmkhspGg==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.4.tgz", + "integrity": "sha512-tFuJqTxKb8AvfyqMfnavXdzfy3h3sWZRWwfluGbkeR7n0HUev+FmNgZ8SDrRBTVrVCjgH5cA21qGbCffMNtWvg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/expect": "4.1.2", - "@vitest/mocker": "4.1.2", - "@vitest/pretty-format": "4.1.2", - "@vitest/runner": "4.1.2", - "@vitest/snapshot": "4.1.2", - "@vitest/spy": "4.1.2", - "@vitest/utils": "4.1.2", + "@vitest/expect": "4.1.4", + "@vitest/mocker": "4.1.4", + "@vitest/pretty-format": "4.1.4", + "@vitest/runner": "4.1.4", + "@vitest/snapshot": "4.1.4", + "@vitest/spy": "4.1.4", + "@vitest/utils": "4.1.4", "es-module-lexer": "^2.0.0", "expect-type": "^1.3.0", "magic-string": "^0.30.21", @@ -20330,10 +20308,12 @@ "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.1.2", - "@vitest/browser-preview": "4.1.2", - "@vitest/browser-webdriverio": "4.1.2", - "@vitest/ui": "4.1.2", + "@vitest/browser-playwright": "4.1.4", + "@vitest/browser-preview": "4.1.4", + "@vitest/browser-webdriverio": "4.1.4", + "@vitest/coverage-istanbul": "4.1.4", + "@vitest/coverage-v8": "4.1.4", + "@vitest/ui": "4.1.4", "happy-dom": "*", "jsdom": "*", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" @@ -20357,6 +20337,12 @@ "@vitest/browser-webdriverio": { "optional": true }, + "@vitest/coverage-istanbul": { + "optional": true + }, + "@vitest/coverage-v8": { + "optional": true + }, "@vitest/ui": { "optional": true }, @@ -20440,15 +20426,15 @@ } }, "node_modules/wait-on": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-9.0.4.tgz", - "integrity": "sha512-k8qrgfwrPVJXTeFY8tl6BxVHiclK11u72DVKhpybHfUL/K6KM4bdyK9EhIVYGytB5MJe/3lq4Tf0hrjM+pvJZQ==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-9.0.5.tgz", + "integrity": "sha512-qgnbHDfDTRIp73ANEJNRW/7kn8CrDUcvZz18xotJQku/P4saTGkbIzvnMZebPmVvVNUiRq1qWAPyqCH+W4H8KA==", "dev": true, "license": "MIT", "dependencies": { - "axios": "^1.13.5", - "joi": "^18.0.2", - "lodash": "^4.17.23", + "axios": "^1.15.0", + "joi": "^18.1.2", + "lodash": "^4.18.1", "minimist": "^1.2.8", "rxjs": "^7.8.2" }, diff --git a/package.json b/package.json index ae7dd80804..21976b014c 100644 --- a/package.json +++ b/package.json @@ -147,7 +147,7 @@ "concurrently": "^9.2.1", "cross-env": "^10.1.0", "eslint": "^9.39.2", - "eslint-config-next": "16.2.2", + "eslint-config-next": "16.2.3", "husky": "^9.1.7", "jsdom": "^29.0.1", "lint-staged": "^16.2.7", From 05bfe0a7b2eb06a36894c6e6e3218b4abbeba0a3 Mon Sep 17 00:00:00 2001 From: diegosouzapw Date: Sat, 11 Apr 2026 17:15:31 -0300 Subject: [PATCH 06/10] chore: bump version to 3.6.3 for release branches --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index dcde7c4a6d..f3bbe612ad 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "omniroute", - "version": "3.6.2", + "version": "3.6.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "omniroute", - "version": "3.6.2", + "version": "3.6.3", "hasInstallScript": true, "license": "MIT", "workspaces": [ diff --git a/package.json b/package.json index 21976b014c..fa2112363b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "omniroute", - "version": "3.6.2", + "version": "3.6.3", "description": "Smart AI Router with auto fallback โ€” route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.", "type": "module", "bin": { From 10288f87c1f2d37b5ddfa740505fc696f7039cb8 Mon Sep 17 00:00:00 2001 From: diegosouzapw Date: Sat, 11 Apr 2026 17:18:43 -0300 Subject: [PATCH 07/10] docs: add dependabot bumps to changelog for v3.6.3 --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 81038fd354..1a9b9a2b21 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,15 @@ --- +## [3.6.3] โ€” 2026-04-11 + +### ๐Ÿ”ง Maintenance & Dependencies + +- **Dependabot Updates:** Safely bumped GitHub Actions `docker/build-push-action` to v7 and `actions/download-artifact` to v8 +- **Electron Updates:** Upgraded desktop wrapper core to Electron `41.2.0` and `electron-builder` to `26.8.1`, incorporating essential V8/Chromium security patches +- **NPM Package Groups:** Updated `production` and `development` NPM groups to securely handle minor audit warnings and keep toolchains modern +- **CI/CD Reliability:** Fixed persistent `Snyk` token-absence failures on automated pull requests by appropriately bypassing on dependabot actions + ## [3.6.2] โ€” 2026-04-11 ### โœจ New Features From 4d460109dd946293125af7e7455042df2e7edd8d Mon Sep 17 00:00:00 2001 From: diegosouzapw Date: Sat, 11 Apr 2026 18:00:20 -0300 Subject: [PATCH 08/10] =?UTF-8?q?chore(release):=20v3.6.3=20=E2=80=94=20Fi?= =?UTF-8?q?x=20cloudflare=20config,=20prompt=20cache=20payloads,=20and=20o?= =?UTF-8?q?penai-compatible=20validation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.example | 630 +++++++++++++++--- CHANGELOG.md | 12 + docs/openapi.yaml | 2 +- electron/package.json | 2 +- eslint.config.mjs | 1 + open-sse/executors/vertex.ts | 4 +- open-sse/handlers/chatCore.ts | 1 + open-sse/package.json | 2 +- open-sse/services/errorClassifier.ts | 6 +- package-lock.json | 2 +- scratch.mjs | 12 + .../dashboard/providers/[id]/page.tsx | 40 +- src/i18n/messages/ar.json | 2 +- src/i18n/messages/bg.json | 2 +- src/i18n/messages/cs.json | 2 +- src/i18n/messages/da.json | 2 +- src/i18n/messages/de.json | 2 +- src/i18n/messages/en.json | 2 +- src/i18n/messages/es.json | 2 +- src/i18n/messages/fi.json | 2 +- src/i18n/messages/fr.json | 2 +- src/i18n/messages/he.json | 2 +- src/i18n/messages/hi.json | 2 +- src/i18n/messages/hu.json | 2 +- src/i18n/messages/id.json | 2 +- src/i18n/messages/it.json | 2 +- src/i18n/messages/ja.json | 2 +- src/i18n/messages/ko.json | 2 +- src/i18n/messages/ms.json | 2 +- src/i18n/messages/nl.json | 2 +- src/i18n/messages/no.json | 2 +- src/i18n/messages/phi.json | 2 +- src/i18n/messages/pl.json | 2 +- src/i18n/messages/pt-BR.json | 2 +- src/i18n/messages/pt.json | 2 +- src/i18n/messages/ro.json | 2 +- src/i18n/messages/ru.json | 2 +- src/i18n/messages/sk.json | 2 +- src/i18n/messages/sv.json | 2 +- src/i18n/messages/th.json | 2 +- src/i18n/messages/tr.json | 2 +- src/i18n/messages/uk-UA.json | 2 +- src/i18n/messages/vi.json | 2 +- src/i18n/messages/zh-CN.json | 2 +- src/lib/providers/validation.ts | 12 + src/shared/validation/schemas.ts | 4 +- tests/unit/cc-compatible-provider.test.mjs | 2 +- 47 files changed, 649 insertions(+), 147 deletions(-) create mode 100644 scratch.mjs diff --git a/.env.example b/.env.example index ee027a72e3..4e12f640a3 100644 --- a/.env.example +++ b/.env.example @@ -1,114 +1,313 @@ -# OmniRoute environment contract -# This file reflects actual runtime usage in the current codebase. +# โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” +# โ”‚ OmniRoute โ€” .env Contract โ”‚ +# โ”‚ This file documents EVERY environment variable read by the runtime. โ”‚ +# โ”‚ Copy to .env and adjust values. Lines starting with # are commented out โ”‚ +# โ”‚ (optional / off-by-default). Uncomment only what you need. โ”‚ +# โ”‚ Reference: docs/ENVIRONMENT.md for full details and usage scenarios. โ”‚ +# โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ -# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• -# REQUIRED SECRETS โ€” Generate strong values! -# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• -# Generate with: openssl rand -base64 48 + +# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +# 1. REQUIRED SECRETS โ€” Must be set before first run! +# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +# These secrets are critical for security. Generate strong, unique values. + +# JWT signing key for dashboard session tokens. +# Used by: src/lib/auth โ€” signs/verifies all authenticated session cookies. +# Generate: openssl rand -base64 48 JWT_SECRET= -# Generate with: openssl rand -hex 32 + +# Encryption key for API keys stored in the database. +# Used by: src/lib/db/apiKeys.ts โ€” encrypts API key values at rest in SQLite. +# Generate: openssl rand -hex 32 API_KEY_SECRET= -# Initial admin password โ€” CHANGE THIS before first use! +# Initial admin login password โ€” CHANGE THIS before first use! +# Used by: bootstrap only โ€” sets the initial dashboard password on first boot. +# After first login you can change it from Dashboard โ†’ Settings โ†’ Security. +# Default: 123456 (insecure, for local dev only) INITIAL_PASSWORD=123456 + + +# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +# 2. STORAGE & DATABASE +# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +# OmniRoute uses SQLite for all persistence. These variables control where +# data lives, encryption, and cleanup policies. + +# Base directory for all persistent data (SQLite DB, logs, backups). +# Used by: src/lib/db/core.ts โ€” resolves the SQLite database file path. +# Default: ~/.omniroute/ | Override for Docker or custom installations. # DATA_DIR=/var/lib/omniroute -# Storage (SQLite) -STORAGE_DRIVER=sqlite -# Generate with: openssl rand -hex 32 +# Encryption key for SQLite database encryption at rest. +# Used by: src/lib/db/encryption.ts โ€” encrypts the entire SQLite database. +# Generate: openssl rand -hex 32 | Leave empty to disable DB encryption. STORAGE_ENCRYPTION_KEY= + +# Version tag for the encryption key โ€” allows future key rotation. +# Used by: scripts/bootstrap-env.mjs, electron/main.js โ€” persists key version. +# Default: v1 | Increment when rotating STORAGE_ENCRYPTION_KEY. STORAGE_ENCRYPTION_KEY_VERSION=v1 -APP_LOG_RETENTION_DAYS=90 -CALL_LOG_RETENTION_DAYS=90 -SQLITE_MAX_SIZE_MB=2048 -SQLITE_CLEAN_LEGACY_FILES=true + +# Automatic SQLite backup on startup. +# Used by: src/lib/db/backup.ts โ€” creates a timestamped backup before migrations. +# Default: false (backups enabled) | Set true to skip backup on every restart. DISABLE_SQLITE_AUTO_BACKUP=false -# Recommended runtime variables -# Canonical/base port (keeps backward compatibility) + +# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +# 3. NETWORK & PORTS +# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +# OmniRoute can run on a single port (default) or split Dashboard/API ports. + +# Canonical port for both Dashboard UI and API (single-port mode). +# Used by: src/lib/runtime/ports.ts โ€” base port for the Next.js server. +# Default: 20128 PORT=20128 -# Optional split ports: + +# Split-port mode: serve Dashboard and API on separate ports for network isolation. +# Used by: src/lib/runtime/ports.ts โ€” overrides PORT for each service. # API_PORT=20129 # API_HOST=0.0.0.0 # DASHBOARD_PORT=20128 -# Optional Docker production host publish ports: + +# Docker production port mappings (docker-compose.prod.yml only). +# These set the HOST-side published ports. Container ports use PORT/API_PORT. # PROD_DASHBOARD_PORT=20130 # PROD_API_PORT=20131 + +# Runtime override used by Electron and wrapped environments. +# OMNIROUTE_PORT takes precedence over PORT when running inside wrappers. +# Used by: src/lib/runtime/ports.ts โ€” preserves canonical port in Electron. +# OMNIROUTE_PORT=20128 + +# Environment mode โ€” affects Next.js behavior, logging verbosity, and caching. +# Values: production | development | Default: production NODE_ENV=production -INSTANCE_NAME=omniroute -# Recommended security and ops variables + +# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +# 4. SECURITY & AUTHENTICATION +# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• + +# Salt for generating unique machine IDs (fingerprint diversification). +# Used by: src/lib/auth โ€” combined with hardware identifiers for machine-id hash. +# Default: endpoint-proxy-salt | Change per-deployment for isolation. MACHINE_ID_SALT=endpoint-proxy-salt -AUTH_COOKIE_SECURE=false -REQUIRE_API_KEY=false -ALLOW_API_KEY_REVEAL=false -PROVIDER_LIMITS_SYNC_INTERVAL_MINUTES=70 -# Input Sanitizer (FASE-01 โ€” prompt injection & PII protection) +# Set true when running behind HTTPS (reverse proxy with TLS termination). +# Used by: src/lib/auth โ€” sets the Secure flag on session cookies. +# Default: false | MUST be true in any non-localhost deployment. +AUTH_COOKIE_SECURE=false + +# Require an API key for all /v1/* proxy endpoints. +# Used by: API middleware โ€” rejects unauthenticated requests to the proxy API. +# Default: false | Set true for multi-user/public deployments. +REQUIRE_API_KEY=false + +# Allow revealing full API key values in the Dashboard UI. +# Used by: Dashboard providers page โ€” controls show/hide of key values. +# Default: false | Security risk if enabled on shared instances. +ALLOW_API_KEY_REVEAL=false + +# Comma-separated API key IDs that skip request logging (GDPR/compliance). +# Used by: src/lib/compliance/index.ts โ€” suppresses logs for specific keys. +# NO_LOG_API_KEY_IDS=key_abc123,key_def456 + +# Maximum request body size in bytes (rejects larger payloads). +# Used by: src/shared/middleware/bodySizeGuard.ts โ€” prevents oversized uploads. +# Default: 10485760 (10 MB) +# MAX_BODY_SIZE_BYTES=10485760 + +# CORS configuration โ€” controls which origins can call the API. +# Used by: Next.js middleware โ€” sets Access-Control-Allow-Origin header. +# Default: * (all origins) | Restrict for production security. +# CORS_ORIGIN=https://your-domain.com + + +# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +# 5. INPUT SANITIZATION & PII PROTECTION (FASE-01) +# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +# Multi-layer defense: request-side injection guard + response-side PII sanitizer. + +# โ”€โ”€ Request-Side: Prompt Injection Guard โ”€โ”€ +# Scans incoming messages for prompt injection patterns before routing. +# Used by: src/middleware/promptInjectionGuard.ts # INPUT_SANITIZER_ENABLED=true -# INPUT_SANITIZER_MODE=warn # warn | block | redact +# INPUT_SANITIZER_MODE=warn # warn = log only | block = reject request | redact = strip patterns + +# Legacy alias for INPUT_SANITIZER_MODE (same effect). +# INJECTION_GUARD_MODE=warn + +# PII detection in incoming requests (emails, phone numbers, SSNs, etc.). +# Used by: src/middleware/promptInjectionGuard.ts โ€” extends injection guard. # PII_REDACTION_ENABLED=false -# Cloud sync variables -# Must point to this running instance so internal sync jobs can call /api/sync/cloud. -# Server-side preferred variables: +# โ”€โ”€ Response-Side: PII Sanitizer โ”€โ”€ +# Scans LLM responses for leaked PII before returning to the client. +# Used by: src/lib/piiSanitizer.ts +# PII_RESPONSE_SANITIZATION=false +# PII_RESPONSE_SANITIZATION_MODE=redact # redact = mask PII | warn = log only | block = drop response + + +# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +# 6. TOOL & ROUTING POLICIES +# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• + +# Tool policy mode โ€” controls which tools LLMs can invoke via function calling. +# Used by: src/lib/toolPolicy.ts โ€” enforces allowlist/denylist on tool_choice. +# Values: allowlist | denylist | disabled | Default: disabled +# TOOL_POLICY_MODE=disabled + + +# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +# 7. URLS & CLOUD SYNC +# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +# URLs used for internal sync jobs, OAuth callbacks, and cloud relay. + +# Internal base URL โ€” used by server-side sync jobs to call /api/sync/cloud. +# Used by: src/lib/cloudSync.ts, src/lib/initCloudSync.ts +# Default: http://localhost:20128 BASE_URL=http://localhost:20128 + +# Cloud relay URL โ€” premium feature for remote config sync. +# Used by: src/lib/cloudSync.ts โ€” pushes/pulls settings from OmniRoute Cloud. CLOUD_URL= -# Backward-compatible/public variables: -# NEXT_PUBLIC_BASE_URL is also used as the OAuth redirect_uri origin when running behind a -# reverse proxy (e.g., nginx). Set this to your public-facing URL so OAuth callbacks work. -# Example: NEXT_PUBLIC_BASE_URL=https://omniroute.example.com + +# Timeout for cloud sync HTTP requests in milliseconds. +# Used by: src/lib/cloudSync.ts โ€” fetchWithTimeout wrapper. +# Default: 12000 (12 seconds) +# CLOUD_SYNC_TIMEOUT_MS=12000 + +# Public-facing base URL โ€” CRITICAL for reverse proxy / OAuth callback setups. +# Used by: OAuth redirect_uri computation, Dashboard UI links, cloud/model sync. +# Set to your public URL when behind nginx/Caddy (e.g., https://omniroute.example.com). +# Default: http://localhost:20128 NEXT_PUBLIC_BASE_URL=http://localhost:20128 + +# Public cloud URL โ€” client-side mirror of CLOUD_URL. NEXT_PUBLIC_CLOUD_URL= -# Optional outbound proxy variables for upstream provider calls -# Lowercase variants are also supported: http_proxy, https_proxy, all_proxy, no_proxy -# SOCKS5 proxy support +# Legacy alias โ€” fallback for NEXT_PUBLIC_BASE_URL in sync schedulers. +# NEXT_PUBLIC_APP_URL=http://localhost:20128 + + +# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +# 8. OUTBOUND PROXY (Upstream Provider Calls) +# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +# Route upstream LLM API calls through an HTTP/SOCKS5 proxy. +# Useful for corporate egress, geo-routing, or IP masking. + +# Enable SOCKS5 proxy support in both server and client components. +# Used by: open-sse/executors โ€” wraps fetch() calls through the proxy agent. ENABLE_SOCKS5_PROXY=true NEXT_PUBLIC_ENABLE_SOCKS5_PROXY=true + +# Standard proxy variables (lowercase variants also supported). # HTTP_PROXY=http://127.0.0.1:7890 # HTTPS_PROXY=http://127.0.0.1:7890 # ALL_PROXY=socks5://127.0.0.1:7890 # NO_PROXY=localhost,127.0.0.1 -# TLS fingerprint spoofing (opt-in) โ€” mimics Chrome 124 TLS handshake via wreq-js -# Reduces risk of JA3/JA4 fingerprint-based blocking by providers (e.g., Google) -# Requires wreq-js to be installed (included in dependencies) +# TLS fingerprint spoofing (opt-in) โ€” mimics Chrome 124 TLS handshake via wreq-js. +# Reduces risk of JA3/JA4 fingerprint-based blocking by providers (e.g., Google). +# Used by: open-sse/executors โ€” replaces Node.js default TLS fingerprint. # ENABLE_TLS_FINGERPRINT=true -# Optional CLI runtime overrides (Docker/host integration) + +# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +# 9. CLI TOOL INTEGRATION +# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +# Control how OmniRoute discovers and launches CLI sidecars (Claude, Codex, etc.). +# Used by: src/shared/services/cliRuntime.ts + +# CLI discovery mode: auto = search PATH | manual = use explicit paths below. # CLI_MODE=auto -# CLI_EXTRA_PATHS=/host-cli/bin + +# Additional PATH entries for finding CLI binaries (colon-separated). +# CLI_EXTRA_PATHS=/host-cli/bin:/usr/local/bin + +# Home directory override for reading CLI config files (~/.claude, etc.). # CLI_CONFIG_HOME=/root + +# Allow OmniRoute to write CLI config files (token refresh, etc.). # CLI_ALLOW_CONFIG_WRITES=true + +# Override binary paths for individual CLI tools. # CLI_CLAUDE_BIN=claude # CLI_CODEX_BIN=codex # CLI_DROID_BIN=droid # CLI_OPENCLAW_BIN=openclaw # CLI_CURSOR_BIN=agent # CLI_CLINE_BIN=cline -# CLI_ROO_BIN=roo # CLI_CONTINUE_BIN=cn +# CLI_QODER_BIN=qoder -# Internal agent / tool integrations (optional) -# Used by the MCP server, A2A skills, and CLI sidecars when they need to call -# the running OmniRoute instance explicitly instead of relying on localhost. + +# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +# 10. INTERNAL AGENT & MCP INTEGRATIONS +# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +# Used by MCP server, A2A skills, and CLI sidecars to call the running instance. + +# Explicit base URL for MCP/A2A tools to reach OmniRoute (overrides localhost auto-detect). +# Used by: open-sse/mcp-server/server.ts, src/lib/a2a/ # OMNIROUTE_BASE_URL=http://localhost:20128 + +# API key for internal tool calls (MCP tools, A2A skills). # OMNIROUTE_API_KEY= + +# API key ID for MCP audit logging. +# Used by: open-sse/mcp-server/audit.ts โ€” tags audit events with a key identity. +# OMNIROUTE_API_KEY_ID= + +# Legacy alias for OMNIROUTE_API_KEY. # ROUTER_API_KEY= + +# Enforce scope-based access control on MCP tool calls. +# Used by: open-sse/mcp-server/server.ts โ€” rejects calls outside allowed scopes. +# OMNIROUTE_MCP_ENFORCE_SCOPES=false + +# Comma-separated scopes granted to this MCP connection. +# Full list: admin, combos, health, models, routing, budget, metrics, pricing, memory, skills +# OMNIROUTE_MCP_SCOPES=admin,combos,health + +# Model catalog sync interval in hours. +# Used by: src/shared/services/modelSyncScheduler.ts โ€” periodic model refresh. +# Default: 24 # MODEL_SYNC_INTERVAL_HOURS=24 -# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• -# OAUTH PROVIDER CREDENTIALS -# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• -# These are the built-in default credentials that work for localhost setups. -# For remote/VPS deployments, register your own credentials at each provider. -# The sync-env script will auto-populate these in your .env if missing. -# -# These can also be overridden via data/provider-credentials.json where supported. +# Provider limits sync interval in minutes (rate limit windows, quotas). +# Used by: src/server-init.ts โ€” polls provider health endpoints. +# Default: 70 +PROVIDER_LIMITS_SYNC_INTERVAL_MINUTES=70 + +# Disable all background services (sync, pricing, model refresh). +# Used by: src/instrumentation-node.ts, src/lib/initCloudSync.ts +# Useful for: CI builds, test environments, or resource-constrained containers. +# OMNIROUTE_DISABLE_BACKGROUND_SERVICES=false + +# Flag set by bootstrap script after initial setup is complete. +# Used by: src/app/(dashboard)/dashboard/page.tsx โ€” shows setup wizard vs. dashboard. +# OMNIROUTE_BOOTSTRAPPED=false + +# Allow request body to override the Antigravity project field. +# Used by: open-sse/executors/antigravity.ts โ€” escape hatch for multi-project setups. +# OMNIROUTE_ALLOW_BODY_PROJECT_OVERRIDE=0 + + +# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +# 11. OAUTH PROVIDER CREDENTIALS +# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +# Built-in default credentials for localhost development. +# For remote/VPS deployments, register your own at each provider's developer console. +# The bootstrap-env script auto-populates these in .env if missing. +# Can also be overridden via data/provider-credentials.json where supported. # โ”€โ”€ Claude Code (Anthropic) โ”€โ”€ CLAUDE_OAUTH_CLIENT_ID=9d1c250a-e61b-44d9-88ed-5944d1962f5e +# Custom redirect URI override for Claude OAuth callback. +# CLAUDE_CODE_REDIRECT_URI=https://platform.claude.com/oauth/code/callback # โ”€โ”€ Codex / OpenAI โ”€โ”€ CODEX_OAUTH_CLIENT_ID=app_EMoamEEZ73f0CkXaXp7hrann @@ -143,23 +342,41 @@ QODER_OAUTH_CLIENT_SECRET=4Z3YjXycVsQvyGF1etiNlIBB4RsqSDtW # QODER_OAUTH_USERINFO_URL= # QODER_OAUTH_CLIENT_ID= +# โ”€โ”€ Qoder Personal Access Token (direct API key fallback) โ”€โ”€ +# Used by: open-sse/executors/qoder.ts โ€” bypasses OAuth when set. +# QODER_PERSONAL_ACCESS_TOKEN= +# QODER_CLI_WORKSPACE= +# OMNIROUTE_QODER_WORKSPACE= + # โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ # โš ๏ธ GOOGLE OAUTH (Antigravity, Gemini CLI) โ€” IMPORTANT FOR REMOTE SERVERS # โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ # The credentials above ONLY work when OmniRoute runs on localhost. -# If you are hosting OmniRoute on a remote server, register your own: +# For remote hosting: # 1. Go to https://console.cloud.google.com/apis/credentials # 2. Create an OAuth 2.0 Client ID (type: "Web application") # 3. Add your server URL as Authorized redirect URI # 4. Replace the values above with your credentials. # โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ -# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ -# Provider User-Agent Overrides (optional โ€” customize per-provider UA headers) -# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ +# โ”€โ”€ OAuth sidecar/CLI bridge (internal) โ”€โ”€ +# Used by: src/lib/oauth/config/index.ts โ€” internal CLIโ†”OmniRoute auth bridge. +# OMNIROUTE_SERVER=http://localhost:20128 +# OMNIROUTE_TOKEN= +# OMNIROUTE_USER_ID=cli +# CLI_TOKEN= # legacy alias for OMNIROUTE_TOKEN +# CLI_USER_ID= # legacy alias for OMNIROUTE_USER_ID +# SERVER_URL= # legacy alias for OMNIROUTE_SERVER + + +# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +# 12. PROVIDER USER-AGENT OVERRIDES +# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +# Customize the User-Agent header sent to each upstream provider. # Format: {PROVIDER_ID}_USER_AGENT=custom-value -# When set, overrides the default User-Agent header sent to that provider. -# Useful when providers update versions or block old user-agents. +# Used by: open-sse/executors/base.ts โ€” buildHeaders() dynamic lookup. +# Update these when providers release new CLI versions to avoid blocks. + CLAUDE_USER_AGENT=claude-cli/1.0.83 (external, cli) CODEX_USER_AGENT=codex-cli/0.92.0 (Windows 10.0.26100; x64) GITHUB_USER_AGENT=GitHubCopilotChat/0.26.7 @@ -170,13 +387,15 @@ QWEN_USER_AGENT=QwenCode/0.12.3 (linux; x64) CURSOR_USER_AGENT=connect-es/1.6.1 GEMINI_CLI_USER_AGENT=google-api-nodejs-client/9.15.1 -# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ -# CLI Fingerprint Compatibility (optional โ€” match native CLI binary signatures) -# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + +# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +# 13. CLI FINGERPRINT COMPATIBILITY (Anti-Detection) +# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• # When enabled, OmniRoute reorders HTTP headers and JSON body fields to match # the exact signature of official CLI tools, reducing account flagging risk. # Your proxy IP is preserved โ€” you get both stealth AND IP masking. -# +# Used by: open-sse/config/cliFingerprints.ts, open-sse/executors/base.ts + # Enable per-provider: # CLI_COMPAT_CODEX=1 # CLI_COMPAT_CLAUDE=1 @@ -188,12 +407,18 @@ GEMINI_CLI_USER_AGENT=google-api-nodejs-client/9.15.1 # CLI_COMPAT_KILOCODE=1 # CLI_COMPAT_CLINE=1 # CLI_COMPAT_QWEN=1 -# + # Or enable for all providers at once: # CLI_COMPAT_ALL=1 -# API Key Providers (Phase 1 + Phase 4) -# Add via Dashboard โ†’ Providers โ†’ Add API Key, or set here + +# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +# 14. API KEY PROVIDERS +# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +# API keys for direct-authentication providers. +# Preferred setup: Dashboard โ†’ Providers โ†’ Add API Key. +# Setting here is an alternative for Docker/headless deployments. + # DEEPSEEK_API_KEY= # GROQ_API_KEY= # XAI_API_KEY= @@ -207,54 +432,259 @@ GEMINI_CLI_USER_AGENT=google-api-nodejs-client/9.15.1 # Embedding Providers (optional โ€” used by /v1/embeddings) # NEBIUS_API_KEY= -# Provider keys above (openai, mistral, together, fireworks, nvidia) also work for embeddings +# Provider keys above (OpenAI, Mistral, Together, Fireworks, NVIDIA) also work for embeddings. -# Timeout settings -# REQUEST_TIMEOUT_MS=600000 -# STREAM_IDLE_TIMEOUT_MS=600000 -# Advanced timeout overrides (optional) -# FETCH_TIMEOUT_MS=600000 -# FETCH_HEADERS_TIMEOUT_MS=600000 -# FETCH_BODY_TIMEOUT_MS=600000 -# FETCH_CONNECT_TIMEOUT_MS=30000 -# FETCH_KEEPALIVE_TIMEOUT_MS=4000 -# TLS_CLIENT_TIMEOUT_MS=600000 -# API bridge timeout for /v1 proxy requests (default: 30000) -# API_BRIDGE_PROXY_TIMEOUT_MS=600000 -# API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS=600000 -# API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS=60000 -# API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS=5000 -# API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS=0 -# CORS configuration (default: * allows all origins) -# CORS_ORIGIN=* +# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +# 15. TIMEOUT SETTINGS +# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +# All timeout values are in milliseconds. +# Used by: src/shared/utils/runtimeTimeouts.ts โ€” centralized timeout resolution. +# +# Hierarchy: REQUEST_TIMEOUT_MS acts as a global override. +# If set, it becomes the default for FETCH_TIMEOUT_MS and STREAM_IDLE_TIMEOUT_MS. +# The fine-grained variables below override their respective defaults only when set. -# Logging +# โ”€โ”€ Global shortcut โ”€โ”€ +# REQUEST_TIMEOUT_MS=600000 # Overrides both fetch and stream idle defaults + +# โ”€โ”€ Upstream fetch (provider calls) โ”€โ”€ +# FETCH_TIMEOUT_MS=600000 # Total request timeout (default: 600000 = 10 min) +# FETCH_HEADERS_TIMEOUT_MS=600000 # Time to receive response headers +# FETCH_BODY_TIMEOUT_MS=600000 # Time to receive full response body +# FETCH_CONNECT_TIMEOUT_MS=30000 # TCP connection establishment (default: 30s) +# FETCH_KEEPALIVE_TIMEOUT_MS=4000 # Keep-alive socket idle timeout (default: 4s) + +# โ”€โ”€ Stream idle detection โ”€โ”€ +# STREAM_IDLE_TIMEOUT_MS=600000 # Max silence between SSE chunks (default: 600000) +# # Extended-thinking models rarely pause >90s. + +# โ”€โ”€ TLS client (wreq-js fingerprint proxy) โ”€โ”€ +# TLS_CLIENT_TIMEOUT_MS=600000 # Inherits from FETCH_TIMEOUT_MS by default + +# โ”€โ”€ API Bridge (/v1 proxy server) โ”€โ”€ +# API_BRIDGE_PROXY_TIMEOUT_MS=30000 # Proxy hop timeout (default: 30s) +# API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS=300000 # Overall server request timeout +# API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS=60000 # Time to send response headers +# API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS=5000 # Keep-alive idle timeout +# API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS=0 # Raw socket timeout (0 = disabled) + +# โ”€โ”€ Graceful shutdown โ”€โ”€ +# Time to wait for in-flight requests before force-exiting on SIGTERM/SIGINT. +# Used by: src/lib/gracefulShutdown.ts +# Default: 30000 (30 seconds) +# SHUTDOWN_TIMEOUT_MS=30000 + + +# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +# 16. LOGGING +# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +# Used by: src/lib/logEnv.ts, src/lib/logRotation.ts, src/shared/utils/logger.ts + +# Application log level โ€” controls console and file log verbosity. +# Values: debug | info | warn | error | Default: info # APP_LOG_LEVEL=info + +# Log output format. +# Values: text | json | Default: text # APP_LOG_FORMAT=text + +# Write logs to file in addition to stdout. +# Default: true | Set false to disable file logging. APP_LOG_TO_FILE=true + +# Path to the application log file. +# Default: logs/application/app.log (relative to project root / DATA_DIR) # APP_LOG_FILE_PATH=logs/application/app.log + +# Maximum single log file size before rotation. +# Accepts: plain bytes or suffixed (50M, 1G, 512K). Default: 50M # APP_LOG_MAX_FILE_SIZE=50M + +# Days to keep rotated application log files before auto-deletion. +# Default: 7 # APP_LOG_RETENTION_DAYS=7 + +# Maximum number of rotated log file backups to keep. +# Default: 20 # APP_LOG_MAX_FILES=20 + +# Days to keep request/call log entries in the database before auto-cleanup. +# Default: 7 # CALL_LOG_RETENTION_DAYS=7 + +# Maximum call log entries stored in-memory buffer. +# Default: 10000 # CALL_LOG_MAX_ENTRIES=10000 -# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ -# Memory Optimization (Low-RAM configurations) -# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ -# Node.js heap limit in MB (default: 256 for Docker, system default for npm) +# Maximum rows in the call_logs SQLite table before oldest entries are pruned. +# Default: 100000 +# CALL_LOGS_TABLE_MAX_ROWS=100000 + +# Maximum rows in the proxy_logs SQLite table. +# Default: 100000 +# PROXY_LOGS_TABLE_MAX_ROWS=100000 + + +# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +# 17. MEMORY OPTIMIZATION (Low-RAM / Docker) +# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• + +# Node.js V8 heap limit in MB. +# Used by: Docker entrypoint โ€” sets --max-old-space-size. +# Default: 256 (Docker) | system default (npm) # OMNIROUTE_MEMORY_MB=256 -# Prompt cache settings -# PROMPT_CACHE_MAX_SIZE=50 -# PROMPT_CACHE_MAX_BYTES=2097152 -# PROMPT_CACHE_TTL_MS=300000 +# โ”€โ”€ Prompt cache (system prompt deduplication) โ”€โ”€ +# Used by: open-sse/services โ€” caches identical system prompts across requests. +# PROMPT_CACHE_MAX_SIZE=50 # Max cached entries (default: 50) +# PROMPT_CACHE_MAX_BYTES=2097152 # Max total cache size in bytes (default: 2 MB) +# PROMPT_CACHE_TTL_MS=300000 # Cache entry TTL (default: 5 minutes) -# Semantic cache settings (temperature=0 responses) -# SEMANTIC_CACHE_MAX_SIZE=100 -# SEMANTIC_CACHE_MAX_BYTES=4194304 -# SEMANTIC_CACHE_TTL_MS=1800000 +# โ”€โ”€ Semantic cache (deterministic response dedup, temperature=0) โ”€โ”€ +# Used by: open-sse/services โ€” caches identical temperature=0 responses. +# SEMANTIC_CACHE_MAX_SIZE=100 # Max cached entries (default: 100) +# SEMANTIC_CACHE_MAX_BYTES=4194304 # Max total cache size in bytes (default: 4 MB) +# SEMANTIC_CACHE_TTL_MS=1800000 # Cache entry TTL (default: 30 minutes) -# In-memory log buffers +# โ”€โ”€ In-memory log buffers โ”€โ”€ +# Maximum recent stream events kept in memory for the Dashboard live view. # STREAM_HISTORY_MAX=50 + +# โ”€โ”€ Context length default โ”€โ”€ +# Global fallback max context length for models without explicit config. +# Used by: open-sse/services/contextManager.ts +# CONTEXT_LENGTH_DEFAULT=128000 + +# โ”€โ”€ Usage token buffer โ”€โ”€ +# Extra token headroom reserved when tracking usage quotas (prevents over-limit). +# Used by: open-sse/utils/usageTracking.ts +# USAGE_TOKEN_BUFFER=100 + + +# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +# 18. PRICING SYNC +# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +# Automatic model pricing synchronization from external sources. +# Used by: src/lib/pricingSync.ts + +# Enable periodic pricing data sync. Default: false (opt-in only). +# PRICING_SYNC_ENABLED=false + +# Sync interval in seconds. Default: 86400 (24 hours). +# PRICING_SYNC_INTERVAL=86400 + +# Comma-separated data sources. Default: litellm +# PRICING_SYNC_SOURCES=litellm + + +# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +# 19. MODEL SYNC (Dev) +# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +# Development-time model catalog sync interval in seconds. +# Used by: src/lib/modelsDevSync.ts +# Default: 86400 (24 hours) +# MODELS_DEV_SYNC_INTERVAL=86400 + + +# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +# 20. PROVIDER-SPECIFIC SETTINGS +# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• + +# โ”€โ”€ OpenRouter โ”€โ”€ +# OpenRouter model catalog cache TTL in ms. +# Used by: src/lib/catalog/openrouterCatalog.ts +# Default: 86400000 (24 hours) +# OPENROUTER_CATALOG_TTL_MS=86400000 + +# โ”€โ”€ NanoBanana (Image Generation) โ”€โ”€ +# Polling config for async image generation jobs. +# Used by: open-sse/handlers/imageGeneration.ts +# NANOBANANA_POLL_TIMEOUT_MS=120000 # Max wait for job completion (default: 120s) +# NANOBANANA_POLL_INTERVAL_MS=2500 # Poll frequency (default: 2.5s) + +# โ”€โ”€ Cloudflare Workers AI โ”€โ”€ +# Account ID override for Cloudflare Workers AI executor. +# Used by: open-sse/executors/cloudflare-ai.ts +# CLOUDFLARE_ACCOUNT_ID= + +# โ”€โ”€ Cloudflare Tunnel (cloudflared) โ”€โ”€ +# Custom path to cloudflared binary for tunnel management. +# Used by: src/lib/cloudflaredTunnel.ts +# CLOUDFLARED_BIN=/usr/local/bin/cloudflared + +# โ”€โ”€ Search cache โ”€โ”€ +# TTL for search API response caching (Perplexity, Brave, etc.). +# Used by: open-sse/services/searchCache.ts +# Default: 300000 (5 minutes) +# SEARCH_CACHE_TTL_MS=300000 + +# โ”€โ”€ OpenAI-compatible multi-connection โ”€โ”€ +# Allow multiple simultaneous connections per OpenAI-compatible provider node. +# Used by: src/app/api/providers/route.ts +# ALLOW_MULTI_CONNECTIONS_PER_COMPAT_NODE=false + +# โ”€โ”€ CC-compatible provider (experimental) โ”€โ”€ +# Enable the Claude Code compatible provider endpoint. +# Used by: src/shared/utils/featureFlags.ts +# ENABLE_CC_COMPATIBLE_PROVIDER=false + +# โ”€โ”€ CLIProxyAPI bridge (legacy) โ”€โ”€ +# Connection settings for external CLIProxyAPI instances. +# Used by: open-sse/executors/cliproxyapi.ts +# CLIPROXYAPI_HOST=127.0.0.1 +# CLIPROXYAPI_PORT=5544 +# CLIPROXYAPI_CONFIG_DIR=~/.cli-proxy-api + +# โ”€โ”€ Local hostnames (Docker networking) โ”€โ”€ +# Comma-separated additional hostnames treated as "local" for provider routing. +# Used by: open-sse/config/providerRegistry.ts โ€” allows Docker service names. +# LOCAL_HOSTNAMES=omlx,mlx-audio + + +# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +# 21. PROXY HEALTH +# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +# Fine-tune proxy health checking behavior. +# Used by: src/lib/proxyHealth.ts + +# Timeout for fast-fail health checks (ms). Default: 2000 +# PROXY_FAST_FAIL_TIMEOUT_MS=2000 + +# Health check result cache TTL (ms). Default: 30000 (30s) +# PROXY_HEALTH_CACHE_TTL_MS=30000 + +# Rate limit maximum wait time before failing a request (ms). Default: 120000 (2 min) +# Used by: open-sse/services/rateLimitManager.ts +# RATE_LIMIT_MAX_WAIT_MS=120000 + + +# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +# 22. DEBUGGING +# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +# These variables enable verbose debugging output. NEVER enable in production. + +# Dump Cursor protobuf decode/encode details to console. +# CURSOR_PROTOBUF_DEBUG=1 + +# Dump raw Cursor SSE stream data to console. +# CURSOR_STREAM_DEBUG=1 + +# Log Responses API SSE-to-JSON translation details. +# DEBUG_RESPONSES_SSE_TO_JSON=true + +# Enable E2E test mode โ€” relaxes auth and enables test harness hooks. +# NEXT_PUBLIC_OMNIROUTE_E2E_MODE=true + + +# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +# 23. GITHUB INTEGRATION (Issue Reporting) +# โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +# Allow users to report issues directly from the Dashboard to GitHub. +# Used by: src/app/api/v1/issues/report/route.ts + +# GitHub repository in owner/repo format. +# GITHUB_ISSUES_REPO=owner/repo + +# GitHub Personal Access Token with issues:write scope. +# GITHUB_ISSUES_TOKEN=ghp_xxxx diff --git a/CHANGELOG.md b/CHANGELOG.md index 1a9b9a2b21..494808a234 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,18 @@ ## [3.6.3] โ€” 2026-04-11 +### โœจ New Features + +- **OpenAI-Compatible Loose Validation:** Empty API keys can now be naturally submitted and saved for any `openai-compatible-*` providers (e.g. Pollinations, localized routes) directly in the UI instead of blocking save actions (#1152) +- **Cloudflare Configuration:** Updated the provider schema and UI integration for Cloudflare AI to officially expose and support the backend `accountId` field securely without overrides (#1150) + +### ๐Ÿ› Bug Fixes + +- **Vertex JSON Validation Crash:** Prevented `invalid character in header` crashes inside the `/validate` endpoint by creating a native authentication parser that correctly handles Google Identity Service Account JSON flows prior to pinging endpoints (#1153) +- **Extraneous Payload Rejection:** Globally prevented upstream `400 Bad Request` execution crashes by stripping the non-standard `prompt_cache_retention` attribute forcibly attached by Cursor/Cline IDE engines when targeting strict OpenAI/Anthropic routes (#1154) +- **Reasoning Content Drop:** Prevented pure reasoning packets, common in advanced fallback models like DeepSeek, from being aborted mid-stream by explicitly adjusting the `Empty Content (502)` circuit breakers to acknowledge `reasoning_content` states as valid (#1155) +- **Login Visual Security:** Removed the raw fallback hash dump that artificially rendered underneath the login modal in Docker instances missing `OMNIROUTE_API_KEY_BASE64` flags (#1148) + ### ๐Ÿ”ง Maintenance & Dependencies - **Dependabot Updates:** Safely bumped GitHub Actions `docker/build-push-action` to v7 and `actions/download-artifact` to v8 diff --git a/docs/openapi.yaml b/docs/openapi.yaml index d59d535a0d..cd6d59b36f 100644 --- a/docs/openapi.yaml +++ b/docs/openapi.yaml @@ -1,7 +1,7 @@ openapi: 3.1.0 info: title: OmniRoute API - version: 3.6.2 + version: 3.6.3 description: | OmniRoute is a local-first AI API proxy router. It provides an OpenAI-compatible endpoint that routes requests to multiple AI providers with load balancing, diff --git a/electron/package.json b/electron/package.json index 7b8a6d7718..0c93989ba3 100644 --- a/electron/package.json +++ b/electron/package.json @@ -1,6 +1,6 @@ { "name": "omniroute-desktop", - "version": "3.6.2", + "version": "3.6.3", "description": "OmniRoute Desktop Application", "main": "main.js", "author": { diff --git a/eslint.config.mjs b/eslint.config.mjs index 579a08f8b0..37fbd5f5c2 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -40,6 +40,7 @@ const eslintConfig = [ "node_modules/**", // VS Code extension and its large test fixtures "vscode-extension/**", + "_mono_repo/**", // Electron app "electron/**", // Docs diff --git a/open-sse/executors/vertex.ts b/open-sse/executors/vertex.ts index cfa7b6dfe3..883446fa25 100644 --- a/open-sse/executors/vertex.ts +++ b/open-sse/executors/vertex.ts @@ -13,7 +13,7 @@ interface ServiceAccount { const TOKEN_CACHE = new Map(); -function parseSAFromApiKey(apiKey: string): ServiceAccount { +export function parseSAFromApiKey(apiKey: string): ServiceAccount { try { return JSON.parse(apiKey); } catch { @@ -21,7 +21,7 @@ function parseSAFromApiKey(apiKey: string): ServiceAccount { } } -async function getAccessToken(sa: ServiceAccount): Promise { +export async function getAccessToken(sa: ServiceAccount): Promise { if (!sa.client_email || !sa.private_key) { throw new Error( "Service Account JSON is missing required fields (client_email or private_key)" diff --git a/open-sse/handlers/chatCore.ts b/open-sse/handlers/chatCore.ts index 3d907b03b3..188b7aac30 100644 --- a/open-sse/handlers/chatCore.ts +++ b/open-sse/handlers/chatCore.ts @@ -808,6 +808,7 @@ export async function handleChatCore({ delete b.disable_stream; delete b.disable_streaming; delete b.streaming; + delete b.prompt_cache_retention; } const stream = resolveStreamFlag(body?.stream, acceptHeader); diff --git a/open-sse/package.json b/open-sse/package.json index 64b3f0c920..e2a86653eb 100644 --- a/open-sse/package.json +++ b/open-sse/package.json @@ -1,6 +1,6 @@ { "name": "@omniroute/open-sse", - "version": "3.6.2", + "version": "3.6.3", "description": "Express SSE sidecar for OmniRoute โ€” handles streaming, protocol translation, and provider orchestration", "type": "module", "main": "index.js", diff --git a/open-sse/services/errorClassifier.ts b/open-sse/services/errorClassifier.ts index fc03f1f684..12941c0ee9 100644 --- a/open-sse/services/errorClassifier.ts +++ b/open-sse/services/errorClassifier.ts @@ -17,12 +17,16 @@ export function isEmptyContentResponse(responseBody: unknown): boolean { const delta = firstChoice.delta as Record | undefined; const content = message?.content ?? delta?.content; + const reasoningContent = message?.reasoning_content ?? delta?.reasoning_content; const hasToolCalls = (Array.isArray(message?.tool_calls) && (message.tool_calls as unknown[]).length > 0) || (Array.isArray(delta?.tool_calls) && (delta.tool_calls as unknown[]).length > 0); const hasContent = content !== null && content !== undefined && content !== ""; - return !hasContent && !hasToolCalls; + const hasReasoning = + reasoningContent !== null && reasoningContent !== undefined && reasoningContent !== ""; + + return !hasContent && !hasReasoning && !hasToolCalls; } if (Array.isArray(body.content)) { diff --git a/package-lock.json b/package-lock.json index f3bbe612ad..6e2338bcff 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20955,7 +20955,7 @@ }, "open-sse": { "name": "@omniroute/open-sse", - "version": "3.6.2" + "version": "3.6.3" } } } diff --git a/scratch.mjs b/scratch.mjs new file mode 100644 index 0000000000..274e16520e --- /dev/null +++ b/scratch.mjs @@ -0,0 +1,12 @@ +import { test } from "node:test"; +import assert from "node:assert"; +import { providerNodesValidateRoute } from "./src/app/api/provider-nodes/validate/route.js"; + +const req = new Request("http://localhost/api/provider-nodes/validate", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ baseUrl: "", apiKey: "" }), +}); +const res = await providerNodesValidateRoute.POST(req); +const data = await res.json(); +console.dir(data, { depth: null }); diff --git a/src/app/(dashboard)/dashboard/providers/[id]/page.tsx b/src/app/(dashboard)/dashboard/providers/[id]/page.tsx index 774cfa9cb4..d1f600a35d 100644 --- a/src/app/(dashboard)/dashboard/providers/[id]/page.tsx +++ b/src/app/(dashboard)/dashboard/providers/[id]/page.tsx @@ -5005,6 +5005,7 @@ function AddApiKeyModal({ const defaultRegion = "us-central1"; const isGlm = provider === "glm"; const isQoder = provider === "qoder"; + const isCloudflare = provider === "cloudflare-ai"; const [formData, setFormData] = useState({ name: "", @@ -5015,6 +5016,7 @@ function AddApiKeyModal({ apiRegion: "international", validationModelId: "", customUserAgent: "", + accountId: "", }); const [validating, setValidating] = useState(false); const [validationResult, setValidationResult] = useState(null); @@ -5047,7 +5049,7 @@ function AddApiKeyModal({ }; const handleSubmit = async () => { - if (!provider || !formData.apiKey) return; + if (!provider || (!isCompatible && !formData.apiKey)) return; setSaving(true); setSaveError(null); @@ -5101,6 +5103,8 @@ function AddApiKeyModal({ providerSpecificData.region = formData.region; } else if (isGlm) { providerSpecificData.apiRegion = formData.apiRegion; + } else if (isCloudflare && formData.accountId.trim()) { + providerSpecificData.accountId = formData.accountId.trim(); } const payload = { @@ -5159,7 +5163,7 @@ function AddApiKeyModal({