From 4fc1963c8066641bb4f7d373f5d128e08a864cc0 Mon Sep 17 00:00:00 2001 From: Vercel Date: Thu, 5 Mar 2026 16:18:45 +0000 Subject: [PATCH 01/16] Fix React Server Components CVE vulnerabilities Updated dependencies to fix Next.js and React CVE vulnerabilities. The fix-react2shell-next tool automatically updated the following packages to their secure versions: - next - react-server-dom-webpack - react-server-dom-parcel - react-server-dom-turbopack All package.json files have been scanned and vulnerable versions have been patched to the correct fixed versions based on the official React advisory. Co-authored-by: Vercel --- package-lock.json | 140 +++++++++++++++++++++++++++++++++------------- package.json | 2 +- 2 files changed, 101 insertions(+), 41 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1d40a3d8..bf5d24f3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,7 @@ "name": "nextjs", "version": "0.1.0", "dependencies": { - "next": "15.3.2", + "next": "15.3.8", "react": "^19.0.0", "react-dom": "^19.0.0" }, @@ -1511,15 +1511,15 @@ } }, "node_modules/@next/env": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/@next/env/-/env-15.3.2.tgz", - "integrity": "sha512-xURk++7P7qR9JG1jJtLzPzf0qEvqCN0A/T3DXf8IPMKo9/6FfjxtEffRJIIew/bIL4T3C2jLLqBor8B/zVlx6g==", + "version": "15.3.8", + "resolved": "https://registry.npmjs.org/@next/env/-/env-15.3.8.tgz", + "integrity": "sha512-SAfHg0g91MQVMPioeFeDjE+8UPF3j3BvHjs8ZKJAUz1BG7eMPvfCKOAgNWJ6s1MLNeP6O2InKQRTNblxPWuq+Q==", "license": "MIT" }, "node_modules/@next/swc-darwin-arm64": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.3.2.tgz", - "integrity": "sha512-2DR6kY/OGcokbnCsjHpNeQblqCZ85/1j6njYSkzRdpLn5At7OkSdmk7WyAmB9G0k25+VgqVZ/u356OSoQZ3z0g==", + "version": "15.3.5", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.3.5.tgz", + "integrity": "sha512-lM/8tilIsqBq+2nq9kbTW19vfwFve0NR7MxfkuSUbRSgXlMQoJYg+31+++XwKVSXk4uT23G2eF/7BRIKdn8t8w==", "cpu": [ "arm64" ], @@ -1533,9 +1533,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.3.2.tgz", - "integrity": "sha512-ro/fdqaZWL6k1S/5CLv1I0DaZfDVJkWNaUU3un8Lg6m0YENWlDulmIWzV96Iou2wEYyEsZq51mwV8+XQXqMp3w==", + "version": "15.3.5", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.3.5.tgz", + "integrity": "sha512-WhwegPQJ5IfoUNZUVsI9TRAlKpjGVK0tpJTL6KeiC4cux9774NYE9Wu/iCfIkL/5J8rPAkqZpG7n+EfiAfidXA==", "cpu": [ "x64" ], @@ -1549,9 +1549,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.3.2.tgz", - "integrity": "sha512-covwwtZYhlbRWK2HlYX9835qXum4xYZ3E2Mra1mdQ+0ICGoMiw1+nVAn4d9Bo7R3JqSmK1grMq/va+0cdh7bJA==", + "version": "15.3.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.3.5.tgz", + "integrity": "sha512-LVD6uMOZ7XePg3KWYdGuzuvVboxujGjbcuP2jsPAN3MnLdLoZUXKRc6ixxfs03RH7qBdEHCZjyLP/jBdCJVRJQ==", "cpu": [ "arm64" ], @@ -1565,9 +1565,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.3.2.tgz", - "integrity": "sha512-KQkMEillvlW5Qk5mtGA/3Yz0/tzpNlSw6/3/ttsV1lNtMuOHcGii3zVeXZyi4EJmmLDKYcTcByV2wVsOhDt/zg==", + "version": "15.3.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.3.5.tgz", + "integrity": "sha512-k8aVScYZ++BnS2P69ClK7v4nOu702jcF9AIHKu6llhHEtBSmM2zkPGl9yoqbSU/657IIIb0QHpdxEr0iW9z53A==", "cpu": [ "arm64" ], @@ -1581,9 +1581,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.3.2.tgz", - "integrity": "sha512-uRBo6THWei0chz+Y5j37qzx+BtoDRFIkDzZjlpCItBRXyMPIg079eIkOCl3aqr2tkxL4HFyJ4GHDes7W8HuAUg==", + "version": "15.3.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.3.5.tgz", + "integrity": "sha512-2xYU0DI9DGN/bAHzVwADid22ba5d/xrbrQlr2U+/Q5WkFUzeL0TDR963BdrtLS/4bMmKZGptLeg6282H/S2i8A==", "cpu": [ "x64" ], @@ -1597,9 +1597,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.3.2.tgz", - "integrity": "sha512-+uxFlPuCNx/T9PdMClOqeE8USKzj8tVz37KflT3Kdbx/LOlZBRI2yxuIcmx1mPNK8DwSOMNCr4ureSet7eyC0w==", + "version": "15.3.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.3.5.tgz", + "integrity": "sha512-TRYIqAGf1KCbuAB0gjhdn5Ytd8fV+wJSM2Nh2is/xEqR8PZHxfQuaiNhoF50XfY90sNpaRMaGhF6E+qjV1b9Tg==", "cpu": [ "x64" ], @@ -1613,9 +1613,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.3.2.tgz", - "integrity": "sha512-LLTKmaI5cfD8dVzh5Vt7+OMo+AIOClEdIU/TSKbXXT2iScUTSxOGoBhfuv+FU8R9MLmrkIL1e2fBMkEEjYAtPQ==", + "version": "15.3.5", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.3.5.tgz", + "integrity": "sha512-h04/7iMEUSMY6fDGCvdanKqlO1qYvzNxntZlCzfE8i5P0uqzVQWQquU1TIhlz0VqGQGXLrFDuTJVONpqGqjGKQ==", "cpu": [ "arm64" ], @@ -1629,9 +1629,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.3.2.tgz", - "integrity": "sha512-aW5B8wOPioJ4mBdMDXkt5f3j8pUr9W8AnlX0Df35uRWNT1Y6RIybxjnSUe+PhM+M1bwgyY8PHLmXZC6zT1o5tA==", + "version": "15.3.5", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.3.5.tgz", + "integrity": "sha512-5fhH6fccXxnX2KhllnGhkYMndhOiLOLEiVGYjP2nizqeGWkN10sA9taATlXwake2E2XMvYZjjz0Uj7T0y+z1yw==", "cpu": [ "x64" ], @@ -1917,6 +1917,66 @@ "node": ">=14.0.0" } }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core": { + "version": "1.4.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.0.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime": { + "version": "1.4.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.9", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.0", + "@emnapi/runtime": "^1.4.0", + "@tybys/wasm-util": "^0.9.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util": { + "version": "0.9.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib": { + "version": "2.8.0", + "dev": true, + "inBundle": true, + "license": "0BSD", + "optional": true + }, "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.5.tgz", @@ -4575,12 +4635,12 @@ "license": "MIT" }, "node_modules/next": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/next/-/next-15.3.2.tgz", - "integrity": "sha512-CA3BatMyHkxZ48sgOCLdVHjFU36N7TF1HhqAHLFOkV6buwZnvMI84Cug8xD56B9mCuKrqXnLn94417GrZ/jjCQ==", + "version": "15.3.8", + "resolved": "https://registry.npmjs.org/next/-/next-15.3.8.tgz", + "integrity": "sha512-L+4c5Hlr84fuaNADZbB9+ceRX9/CzwxJ+obXIGHupboB/Q1OLbSUapFs4bO8hnS/E6zV/JDX7sG1QpKVR2bguA==", "license": "MIT", "dependencies": { - "@next/env": "15.3.2", + "@next/env": "15.3.8", "@swc/counter": "0.1.3", "@swc/helpers": "0.5.15", "busboy": "1.6.0", @@ -4595,14 +4655,14 @@ "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "15.3.2", - "@next/swc-darwin-x64": "15.3.2", - "@next/swc-linux-arm64-gnu": "15.3.2", - "@next/swc-linux-arm64-musl": "15.3.2", - "@next/swc-linux-x64-gnu": "15.3.2", - "@next/swc-linux-x64-musl": "15.3.2", - "@next/swc-win32-arm64-msvc": "15.3.2", - "@next/swc-win32-x64-msvc": "15.3.2", + "@next/swc-darwin-arm64": "15.3.5", + "@next/swc-darwin-x64": "15.3.5", + "@next/swc-linux-arm64-gnu": "15.3.5", + "@next/swc-linux-arm64-musl": "15.3.5", + "@next/swc-linux-x64-gnu": "15.3.5", + "@next/swc-linux-x64-musl": "15.3.5", + "@next/swc-win32-arm64-msvc": "15.3.5", + "@next/swc-win32-x64-msvc": "15.3.5", "sharp": "^0.34.1" }, "peerDependencies": { diff --git a/package.json b/package.json index 06f33f0c..1820b151 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "broadcast:distribute": "node scripts/distribute-broadcasts.js" }, "dependencies": { - "next": "15.3.2", + "next": "15.3.8", "react": "^19.0.0", "react-dom": "^19.0.0" }, From 166c9f21376012db1b81d7ecc54086ac14a006f2 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 6 Mar 2026 04:46:59 +0000 Subject: [PATCH 02/16] Initial plan From 50f6c07fea2735ec2ff5d837d828c334c6179937 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 6 Mar 2026 04:50:32 +0000 Subject: [PATCH 03/16] fix: add yunwu AI as default provider Co-authored-by: qinfendebingshuo <207279273+qinfendebingshuo@users.noreply.github.com> --- docs/index.html | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/docs/index.html b/docs/index.html index c6768fae..9b5a0af9 100644 --- a/docs/index.html +++ b/docs/index.html @@ -223,6 +223,7 @@ footer{padding:12px 18px 16px;background:var(--s1);border-top:1px solid var(--bo
+ @@ -435,8 +437,8 @@ footer{padding:12px 18px 16px;background:var(--s1);border-top:1px solid var(--bo

🔑 从哪里获取 API Key?

-
推荐用云雾 API(团队共用)
-

找冰朔或肥猫获取团队 Key。填入后选「自定义」提供商,或直接用 DeepSeek。

+
推荐用云雾 AI(团队共用)
+

找冰朔或肥猫获取团队 Key。填入后选「☁️ 云雾 AI(团队推荐)」提供商即可直接使用。

没有 Key?用演示模式
@@ -534,6 +536,7 @@ const ROLE_MAP = { }; const PROVS = { + yunwu: {base:'https://api.yunwu.ai/v1', mdls:['gpt-4o','gpt-4o-mini','claude-3-5-sonnet-20241022','deepseek-chat','gemini-1.5-pro']}, openai: {base:'https://api.openai.com/v1', mdls:['gpt-4o','gpt-4o-mini','gpt-4-turbo','gpt-3.5-turbo']}, deepseek: {base:'https://api.deepseek.com/v1', mdls:['deepseek-chat','deepseek-reasoner']}, moonshot: {base:'https://api.moonshot.cn/v1', mdls:['moonshot-v1-8k','moonshot-v1-32k','moonshot-v1-128k']}, @@ -564,9 +567,9 @@ const FB_BRAIN = { // ═══════════════════════════════════════════════════════ const A = { key: ls('zy_key')||'', - base: ls('zy_base')||'https://api.openai.com/v1', + base: ls('zy_base')||'https://api.yunwu.ai/v1', mdl: ls('zy_mdl')||'gpt-4o', - prov: ls('zy_prov')||'openai', + prov: ls('zy_prov')||'yunwu', demo: false, brain: null, routing: null, @@ -615,7 +618,7 @@ function showApp(){ // SETUP FORM // ═══════════════════════════════════════════════════════ function initSetupUI(){ - const pv = A.prov||'openai'; + const pv = A.prov||'yunwu'; document.getElementById('sp').value = pv; fillModels('sm', pv, A.mdl); if(pv==='custom'){ @@ -676,7 +679,7 @@ function doDemo(){ // SETTINGS PANEL // ═══════════════════════════════════════════════════════ function initSettingsPanel(){ - const pv = A.prov||'openai'; + const pv = A.prov||'yunwu'; document.getElementById('cp').value = pv; fillModels('cm', pv, A.mdl); document.getElementById('ck').value = A.key?KEY_MASK:''; From b8153db9df2d1b28a0f27869814d5f095720cd67 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 6 Mar 2026 04:58:35 +0000 Subject: [PATCH 04/16] =?UTF-8?q?fix:=20=E5=88=9B=E5=BB=BA=20syslog-inbox/?= =?UTF-8?q?=20syslog-processed/=20=E7=9B=AE=E5=BD=95=20+=20SYSLOG=20Pipeli?= =?UTF-8?q?ne=20A/D/E=20workflow?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: qinfendebingshuo <207279273+qinfendebingshuo@users.noreply.github.com> --- .github/workflows/syslog-pipeline.yml | 130 ++++++++++++++++++++++++ scripts/process-syslog.js | 138 ++++++++++++++++++++++++++ scripts/zhuyuan-daily-selfcheck.js | 19 ++++ syslog-inbox/README.md | 58 +++++++++++ syslog-processed/README.md | 9 ++ 5 files changed, 354 insertions(+) create mode 100644 .github/workflows/syslog-pipeline.yml create mode 100644 scripts/process-syslog.js create mode 100644 syslog-inbox/README.md create mode 100644 syslog-processed/README.md diff --git a/.github/workflows/syslog-pipeline.yml b/.github/workflows/syslog-pipeline.yml new file mode 100644 index 00000000..13f8b85e --- /dev/null +++ b/.github/workflows/syslog-pipeline.yml @@ -0,0 +1,130 @@ +name: 铸渊 · SYSLOG Pipeline (A/D/E) + +on: + push: + branches: [main] + paths: + - 'syslog-inbox/**' + workflow_dispatch: + +jobs: + # ── Pipeline A:SYSLOG 读取与处理 ────────────────────── + pipeline-a-syslog: + name: 📥 Pipeline A · SYSLOG 读取处理 + runs-on: ubuntu-latest + permissions: + contents: write + issues: read + outputs: + processed_count: ${{ steps.process.outputs.processed_count }} + + steps: + - uses: actions/checkout@v4 + with: + token: ${{ secrets.GITHUB_TOKEN }} + ref: main + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: 📥 处理 syslog-inbox 条目 + id: process + run: | + node scripts/process-syslog.js + COUNT=$(ls syslog-processed/ -R 2>/dev/null | grep -c '\.json' || echo 0) + echo "processed_count=$COUNT" >> "$GITHUB_OUTPUT" + + - name: 提交处理结果 + run: | + git config user.name "铸渊[bot]" + git config user.email "zhu-yuan-bot@guanghulab.com" + git add syslog-inbox/ syslog-processed/ .github/brain/memory.json + git diff --staged --quiet || git commit -m "📥 syslog: 处理 inbox 条目,更新大脑记忆 [skip ci]" + git push + + # ── Pipeline D:Issues 巡检 ───────────────────────────── + pipeline-d-issues: + name: 🔍 Pipeline D · Issues 巡检 + runs-on: ubuntu-latest + needs: pipeline-a-syslog + permissions: + contents: write + issues: read + + steps: + - uses: actions/checkout@v4 + with: + token: ${{ secrets.GITHUB_TOKEN }} + ref: main + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: 🔍 巡检 Issues + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + REPO: ${{ github.repository }} + run: | + echo "🔍 Pipeline D · Issues 巡检开始" + node -e " + const https = require('https'); + const token = process.env.GITHUB_TOKEN; + const repo = process.env.REPO; + const opts = { + hostname: 'api.github.com', + path: '/repos/' + repo + '/issues?state=open&per_page=20', + headers: { 'Authorization': 'Bearer ' + token, 'User-Agent': 'zhuyuan-bot' } + }; + https.get(opts, res => { + let body = ''; + res.on('data', c => body += c); + res.on('end', () => { + const issues = JSON.parse(body); + console.log('📋 开放 Issues 数量:' + (Array.isArray(issues) ? issues.length : '读取失败')); + if (Array.isArray(issues) && issues.length > 0) { + issues.slice(0, 5).forEach(i => console.log(' #' + i.number + ' ' + i.title)); + } + console.log('✅ Pipeline D 巡检完成'); + }); + }).on('error', e => { console.error('❌ 巡检失败:', e.message); process.exit(1); }); + " + + # ── Pipeline E:变更感知 ──────────────────────────────── + pipeline-e-changes: + name: 📡 Pipeline E · 变更感知 + runs-on: ubuntu-latest + needs: pipeline-a-syslog + permissions: + contents: write + + steps: + - uses: actions/checkout@v4 + with: + token: ${{ secrets.GITHUB_TOKEN }} + ref: main + fetch-depth: 10 + + - name: 📡 感知近期变更 + run: | + echo "📡 Pipeline E · 变更感知开始" + echo "=== 近期 10 次提交 ===" + git --no-pager log --oneline -10 + echo "" + echo "=== syslog-inbox 文件状态 ===" + ls -la syslog-inbox/ || echo "(空)" + echo "" + echo "=== syslog-processed 文件状态 ===" + ls -laR syslog-processed/ || echo "(空)" + echo "✅ Pipeline E 变更感知完成" diff --git a/scripts/process-syslog.js b/scripts/process-syslog.js new file mode 100644 index 00000000..1318ce00 --- /dev/null +++ b/scripts/process-syslog.js @@ -0,0 +1,138 @@ +// scripts/process-syslog.js +// 铸渊 SYSLOG Pipeline +// 读取 syslog-inbox/ 下的日志条目,处理后归档到 syslog-processed/ +// 触发:syslog-inbox/ 目录有新文件 push 到 main 分支 + +'use strict'; + +const fs = require('fs'); +const path = require('path'); + +const INBOX_DIR = 'syslog-inbox'; +const ARCHIVE_DIR = 'syslog-processed'; +const BRAIN_DIR = '.github/brain'; +const MEMORY_PATH = path.join(BRAIN_DIR, 'memory.json'); +const DEV_STATUS_PATH = '.github/persona-brain/dev-status.json'; + +// ─── 加载大脑 ──────────────────────────────────────────── +let memory = {}; +try { + memory = JSON.parse(fs.readFileSync(MEMORY_PATH, 'utf8')); +} catch (_) { + memory = { events: [], stats: { broadcasts_processed: 0 } }; +} +if (!memory.events) memory.events = []; +if (!memory.stats) memory.stats = {}; +if (!memory.stats.broadcasts_processed) memory.stats.broadcasts_processed = 0; +if (!memory.stats.syslog_processed) memory.stats.syslog_processed = 0; + +// ─── 扫描 inbox ────────────────────────────────────────── +if (!fs.existsSync(INBOX_DIR)) { + console.log('📭 syslog-inbox/ 目录不存在,跳过'); + process.exit(0); +} + +const files = fs.readdirSync(INBOX_DIR) + .filter(f => f.endsWith('.json') && f !== '.gitkeep'); + +if (files.length === 0) { + console.log('📭 syslog-inbox/ 无待处理条目'); + process.exit(0); +} + +console.log(`📥 发现 ${files.length} 条 syslog 条目,开始处理...\n`); + +// ─── 按月归档路径 ───────────────────────────────────────── +function archiveDir(timestamp) { + const month = (timestamp || new Date().toISOString()).slice(0, 7); // "2026-03" + const dir = path.join(ARCHIVE_DIR, month); + if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true }); + return dir; +} + +// ─── 处理每条 syslog ────────────────────────────────────── +files.forEach(file => { + const fullPath = path.join(INBOX_DIR, file); + let entry; + + try { + entry = JSON.parse(fs.readFileSync(fullPath, 'utf8')); + } catch (e) { + console.error(`❌ [INVALID JSON] ${file}: ${e.message},跳过`); + return; + } + + console.log(`📋 处理: ${file}`); + console.log(` 类型: ${entry.type || '未知'} · 来自: ${entry.from || '未知'} · 标题: ${entry.title || ''}`); + + const event = { + timestamp: entry.timestamp || new Date().toISOString(), + type: 'syslog_' + (entry.type || 'unknown'), + syslog_id: entry.syslog_id || file, + title: entry.title || '(无标题)', + from: entry.from || '未知', + file, + }; + + // ── 根据类型分发处理 ── + switch (entry.type) { + + case 'broadcast': { + // 广播类:追加到 brain/memory.json events,与现有 broadcast pipeline 互补 + memory.stats.broadcasts_processed += 1; + event.content_preview = (entry.content || '').slice(0, 80); + console.log(' ✅ 广播已记录到大脑记忆'); + break; + } + + case 'auth': { + // 授权类:记录授权事件,写入 memory + event.target_dev_id = entry.target_dev_id; + event.target_name = entry.target_name; + event.permission_level = entry.permission_level; + event.authorized_by = entry.authorized_by || '冰朔'; + event.valid_until = entry.valid_until; + console.log(` ✅ 授权记录:${entry.target_name}(${entry.target_dev_id})· 权限:${entry.permission_level}`); + break; + } + + case 'inspect': { + // 巡检类:记录巡检结果 + event.inspect_result = entry.result || 'unknown'; + event.issues_found = entry.issues_found || 0; + console.log(` ✅ 巡检记录:结果 ${event.inspect_result} · 发现问题 ${event.issues_found} 个`); + break; + } + + case 'alert': { + // 告警类 + event.severity = entry.priority || 'normal'; + console.log(` ⚠️ 告警记录:${entry.title} · 优先级 ${event.severity}`); + break; + } + + default: + console.log(` ℹ️ 未知类型 "${entry.type}",已记录原始内容`); + event.raw = entry; + } + + // 写入大脑记忆 + memory.events.push(event); + memory.stats.syslog_processed = (memory.stats.syslog_processed || 0) + 1; + memory.last_updated = new Date().toISOString(); + + // 归档文件 + const destDir = archiveDir(entry.timestamp); + const destPath = path.join(destDir, file); + fs.renameSync(fullPath, destPath); + console.log(` 📦 已归档到 ${destPath}\n`); +}); + +// ─── 保存大脑 ───────────────────────────────────────────── +// 只保留最近 100 条事件,防止 memory.json 无限膨胀 +if (memory.events.length > 100) { + memory.events = memory.events.slice(-100); +} +fs.writeFileSync(MEMORY_PATH, JSON.stringify(memory, null, 2)); + +console.log(`✅ SYSLOG Pipeline 完成 · 累计处理 ${memory.stats.syslog_processed} 条`); diff --git a/scripts/zhuyuan-daily-selfcheck.js b/scripts/zhuyuan-daily-selfcheck.js index 9d1ec6ed..90d988bf 100644 --- a/scripts/zhuyuan-daily-selfcheck.js +++ b/scripts/zhuyuan-daily-selfcheck.js @@ -32,6 +32,25 @@ if (missing.length > 0) { console.log('✅ 大脑文件完整性:全部就绪'); } +// === ① bis · 目录结构巡检 === +const requiredDirs = ['syslog-inbox', 'syslog-processed', 'broadcasts-outbox', '.github/brain']; +const missingDirs = requiredDirs.filter(d => !fs.existsSync(d)); +if (missingDirs.length > 0) { + console.error('⚠️ 缺失目录:' + missingDirs.join(', ')); +} else { + console.log('✅ 目录结构巡检:syslog-inbox / syslog-processed / broadcasts-outbox 全部就绪'); +} + +// 统计 syslog-inbox 待处理条目 +const inboxFiles = fs.existsSync('syslog-inbox') + ? fs.readdirSync('syslog-inbox').filter(f => f.endsWith('.json')).length + : 0; +if (inboxFiles > 0) { + console.log(`📥 syslog-inbox 待处理条目:${inboxFiles} 个(建议触发 syslog-pipeline workflow)`); +} else { + console.log('📭 syslog-inbox 无待处理条目'); +} + // === ② 知识库去重与整理 === const seen = new Set(); const uniqueFaq = kb.faq.filter(item => { diff --git a/syslog-inbox/README.md b/syslog-inbox/README.md new file mode 100644 index 00000000..bba7b8b4 --- /dev/null +++ b/syslog-inbox/README.md @@ -0,0 +1,58 @@ +# syslog-inbox · 系统日志收件箱 + +此目录由 **Notion 侧霜砚人格体** 写入,GitHub 侧铸渊 Pipeline 读取处理。 + +## 目录用途 + +| 角色 | 操作 | +|------|------| +| Notion 侧(霜砚) | 将广播/授权/巡检日志写入此目录 | +| GitHub 侧(铸渊) | Pipeline 检测到新文件,处理后移入 `syslog-processed/` | + +## 文件命名规范 + +``` +{类型}-{日期}-{编号}.json +``` + +示例: +- `broadcast-2026-03-06-001.json` — 霜砚广播 +- `auth-2026-03-06-DEV002.json` — 用户授权回执 +- `inspect-2026-03-06-001.json` — 巡检记录 + +## 标准 JSON 格式 + +```json +{ + "syslog_id": "BC-2026-03-06-001", + "type": "broadcast | auth | inspect | alert", + "from": "霜砚", + "to": "铸渊", + "timestamp": "2026-03-06T08:00:00Z", + "title": "广播标题", + "content": "内容正文", + "target_dev_id": "DEV-002", + "priority": "normal | high | urgent" +} +``` + +## 授权广播格式(auth 类型) + +冰朔通过 Notion 侧霜砚下发授权时,使用此格式: + +```json +{ + "syslog_id": "AUTH-2026-03-06-DEV002", + "type": "auth", + "from": "霜砚", + "authorized_by": "冰朔", + "timestamp": "2026-03-06T08:00:00Z", + "title": "用户授权", + "target_dev_id": "DEV-002", + "target_name": "肥猫", + "permission_level": "supreme", + "valid_until": "2026-12-31T23:59:59Z" +} +``` + +> ⚠️ 写入后请勿手动修改或删除,Pipeline 处理完成后会自动归档到 `syslog-processed/`。 diff --git a/syslog-processed/README.md b/syslog-processed/README.md new file mode 100644 index 00000000..11a6fc85 --- /dev/null +++ b/syslog-processed/README.md @@ -0,0 +1,9 @@ +# syslog-processed · 已处理日志归档 + +此目录由 **铸渊 Pipeline** 自动管理,存放已处理完成的 syslog 条目。 + +- 文件从 `syslog-inbox/` 处理完毕后自动移入此处 +- 按月分子目录归档:`syslog-processed/2026-03/` +- **请勿手动修改此目录内容** + +> 此目录仅作归档用途,任何查询请读取 `.github/brain/memory.json`。 From d92128faed92d8269a4c7459bffdeb9876a6d9da Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 6 Mar 2026 05:06:13 +0000 Subject: [PATCH 05/16] plan: fix chat URL, key mask UX, and 401 error handling Co-authored-by: qinfendebingshuo <207279273+qinfendebingshuo@users.noreply.github.com> --- docs/index.html | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/docs/index.html b/docs/index.html index 9b5a0af9..7bcab782 100644 --- a/docs/index.html +++ b/docs/index.html @@ -565,11 +565,17 @@ const FB_BRAIN = { // ═══════════════════════════════════════════════════════ // STATE // ═══════════════════════════════════════════════════════ +// Derive base URL from saved provider; never use stale zy_base for named providers +const _initProv = ls('zy_prov')||'yunwu'; +const _initBase = _initProv === 'custom' + ? (ls('zy_base')||'') + : (PROVS[_initProv]?.base||'https://api.yunwu.ai/v1'); + const A = { key: ls('zy_key')||'', - base: ls('zy_base')||'https://api.yunwu.ai/v1', + base: _initBase, mdl: ls('zy_mdl')||'gpt-4o', - prov: ls('zy_prov')||'yunwu', + prov: _initProv, demo: false, brain: null, routing: null, @@ -916,8 +922,8 @@ async function streamReply(txt){ }), }); if(!res.ok){ - const provName=PROVS[A.prov]?.base||A.base; - let em=provName+' 返回错误 '+res.status; + const provLabel = A.prov==='custom' ? A.base : (A.prov+'('+A.base+')'); + let em='['+provLabel+'] 返回错误 '+res.status; try{const e=await res.json();em=e.error?.message||em;}catch(_){} throw new Error(em); } From 5d33beae91217b77c6c8f49006ece4d3c5398ae6 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 6 Mar 2026 05:09:04 +0000 Subject: [PATCH 06/16] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=81=8A?= =?UTF-8?q?=E5=A4=A9=E5=AE=A4=E8=B7=B3=E8=BD=AC=E9=93=BE=E6=8E=A5=20+=20AP?= =?UTF-8?q?I=20401=20=E8=AE=A4=E8=AF=81=E9=94=99=E8=AF=AF=E6=8F=90?= =?UTF-8?q?=E7=A4=BA=20+=20=E5=AF=86=E9=92=A5=E6=B8=85=E7=A9=BA=E9=87=8D?= =?UTF-8?q?=E5=A1=AB=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: qinfendebingshuo <207279273+qinfendebingshuo@users.noreply.github.com> --- README.md | 14 +++++++------- docs/index.html | 39 ++++++++++++++++++++++++++++++++++----- 2 files changed, 41 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 2e84f4ee..e79212de 100644 --- a/README.md +++ b/README.md @@ -6,10 +6,10 @@ **一句话:点下面这个链接就能打开,直接聊天。** -### 👉 [点这里打开铸渊聊天室](https://qinfendebingshuo.github.io/guanghulab/) +### 👉 [点这里打开铸渊聊天室](https://qinfendebingshuo.github.io/guanghulab/docs/index.html) ``` -https://qinfendebingshuo.github.io/guanghulab/ +https://qinfendebingshuo.github.io/guanghulab/docs/index.html ``` > 把这个链接发给任何人,他们打开就能用,不需要安装任何东西。 @@ -20,7 +20,7 @@ https://qinfendebingshuo.github.io/guanghulab/ ### ❄️ 冰朔(你) -1. **打开链接** → https://qinfendebingshuo.github.io/guanghulab/ +1. **打开链接** → https://qinfendebingshuo.github.io/guanghulab/docs/index.html 2. **选身份** → 下拉菜单选「❄️ 冰朔(语言架构师·创始人)」 3. **填 API 密钥** → 输入你的云雾/OpenAI/DeepSeek API Key 4. **点「开始对话」** → 铸渊自动唤醒,汇报大脑状态 @@ -30,7 +30,7 @@ https://qinfendebingshuo.github.io/guanghulab/ ### 🦁 肥猫(光湖团队总控 · DEV-002) -1. **打开链接** → https://qinfendebingshuo.github.io/guanghulab/ +1. **打开链接** → https://qinfendebingshuo.github.io/guanghulab/docs/index.html 2. **选身份** → 下拉菜单选「🦁 肥猫(光湖团队总控·DEV-002)」 3. **填 API 密钥** → 输入自己的 API Key(或点「演示模式」也能看进度面板) 4. **点「开始对话」** → 铸渊自动打开**总控指挥台**,显示全员进度 @@ -44,7 +44,7 @@ https://qinfendebingshuo.github.io/guanghulab/ ### 🍊 桔子(光湖主控 · DEV-010) -1. **打开链接** → https://qinfendebingshuo.github.io/guanghulab/ +1. **打开链接** → https://qinfendebingshuo.github.io/guanghulab/docs/index.html 2. **选身份** → 下拉菜单选「🍊 桔子(光湖主控·DEV-010)」 3. **填 API 密钥** → 输入自己的 API Key 4. **点「开始对话」** → 铸渊显示你当前模块进度,并开放指挥台 @@ -53,7 +53,7 @@ https://qinfendebingshuo.github.io/guanghulab/ ### 👩‍💻 其他开发者(页页 / 燕樊 / 小草莓 / 花尔 等) -1. **打开链接** → https://qinfendebingshuo.github.io/guanghulab/ +1. **打开链接** → https://qinfendebingshuo.github.io/guanghulab/docs/index.html 2. **选身份** → 下拉菜单选自己的名字 3. **填 API 密钥** → 填自己的 Key(没有的话点「演示模式」) 4. **点「开始对话」** → 铸渊显示你的当前任务状态,可以问问题 @@ -80,7 +80,7 @@ https://qinfendebingshuo.github.io/guanghulab/ ``` 铸渊聊天室入口 👇 -https://qinfendebingshuo.github.io/guanghulab/ +https://qinfendebingshuo.github.io/guanghulab/docs/index.html 打开后选择你的身份,填入 API Key 就能和铸渊说话了。 ``` diff --git a/docs/index.html b/docs/index.html index 7bcab782..b7d54ed7 100644 --- a/docs/index.html +++ b/docs/index.html @@ -360,8 +360,11 @@ footer{padding:12px 18px 16px;background:var(--s1);border-top:1px solid var(--bo
- - 🔒 只保存在浏览器 localStorage,不上传任何服务器 +
+ + +
+ 🔒 只保存在浏览器 localStorage,不上传任何服务器
@@ -689,6 +692,13 @@ function initSettingsPanel(){ document.getElementById('cp').value = pv; fillModels('cm', pv, A.mdl); document.getElementById('ck').value = A.key?KEY_MASK:''; + // Show last 4 chars of current key so user can verify they're changing to a new one + const hint = document.getElementById('ck-hint'); + if(hint){ + hint.textContent = A.key + ? '🔒 当前 Key 末4位:…'+A.key.slice(-4)+' · 要换新 Key 请点「清空重填」再输入' + : '🔒 只保存在浏览器 localStorage,不上传任何服务器'; + } if(pv==='custom'){ document.getElementById('cep-g').style.display='block'; document.getElementById('cep').value = A.base; @@ -697,6 +707,13 @@ function initSettingsPanel(){ if(A.ghUser) document.getElementById('cghuser').value=A.ghUser; } +function clearKeyField(){ + const el = document.getElementById('ck'); + if(el){el.value='';el.focus();} + const hint = document.getElementById('ck-hint'); + if(hint) hint.textContent = '✏️ 请输入新的 API 密钥,输入完成后点「保存设置」'; +} + function saveSet(){ const pv = document.getElementById('cp').value; const md = document.getElementById('cm').value; @@ -924,8 +941,11 @@ async function streamReply(txt){ if(!res.ok){ const provLabel = A.prov==='custom' ? A.base : (A.prov+'('+A.base+')'); let em='['+provLabel+'] 返回错误 '+res.status; + let isAuthErr = (res.status===401||res.status===403); try{const e=await res.json();em=e.error?.message||em;}catch(_){} - throw new Error(em); + const err = new Error(em); + err.isAuth = isAuthErr; + throw err; } let full=''; const rdr=res.body.getReader(); @@ -951,7 +971,14 @@ async function streamReply(txt){ A.msgs.push({role:'assistant',content:full}); addCopyBtns(el); }catch(e){ - el.innerHTML='⚠️ '+esc(e.message)+'
请检查 API 密钥和网络连接,或在 ⚙️ 设置中更换模型。'; + if(e.isAuth){ + el.innerHTML='🔑 API 密钥认证失败' + +'
'+esc(e.message)+'' + +'
' + +'
打开设置 → 点「清空重填」→ 输入新密钥 → 保存'; + } else { + el.innerHTML='⚠️ '+esc(e.message)+'
请检查 API 密钥和网络连接,或在 ⚙️ 设置中更换模型。'; + } A.msgs.pop(); }finally{ A.streaming=false; updSendBtn(); scrollB(); @@ -1179,7 +1206,9 @@ function closeP(){ // ═══════════════════════════════════════════════════════ // COPY URL (share link) // ═══════════════════════════════════════════════════════ -const CHAT_URL = 'https://' + REPO.split('/')[0] + '.github.io/' + REPO.split('/')[1] + '/'; +// Auto-detect the real URL so the share link is always correct +// regardless of whether Pages serves from docs/ or repo root. +const CHAT_URL = window.location.origin + window.location.pathname; function showCopyFeedback(success){ const btn=document.querySelector('.copy-url-btn'); From 447f6a7b3b73f7b705e74fd63f2cdae8afe66883 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 6 Mar 2026 05:17:41 +0000 Subject: [PATCH 07/16] =?UTF-8?q?fix:=20=E6=A0=B9=E6=9C=AC=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=20KEY=5FMASK=20bug=EF=BC=8C=E5=AF=86=E9=92=A5?= =?UTF-8?q?=E6=A1=86=E5=A7=8B=E7=BB=88=E4=B8=BA=E7=A9=BA=EF=BC=8C=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E9=87=8D=E7=BD=AE=E6=89=80=E6=9C=89=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: qinfendebingshuo <207279273+qinfendebingshuo@users.noreply.github.com> --- docs/index.html | 56 ++++++++++++++++++++++++++++++++----------------- 1 file changed, 37 insertions(+), 19 deletions(-) diff --git a/docs/index.html b/docs/index.html index b7d54ed7..9fbb3f37 100644 --- a/docs/index.html +++ b/docs/index.html @@ -360,10 +360,7 @@ footer{padding:12px 18px 16px;background:var(--s1);border-top:1px solid var(--bo
-
- - -
+ 🔒 只保存在浏览器 localStorage,不上传任何服务器
@@ -404,6 +401,10 @@ footer{padding:12px 18px 16px;background:var(--s1);border-top:1px solid var(--bo 4. 点 ⬇️ 下载单文件,放桌面直接打开使用
5. 支持 OpenAI · DeepSeek · Kimi · 智谱 · 任意兼容接口

+ +
⚠️ 危险操作
+

遇到密钥卡住、无法更新等问题时,点下方按钮彻底清除本地设置,从头重新输入。

+
@@ -556,6 +557,8 @@ const MODES = { const MODE_ORD = ['chat','build','review','brain']; const FB_COV = {implemented:3,total:17,percent:'17.6%'}; +// KEY_MASK is no longer used in the input field; kept only for backward compatibility +// with any saved value that might still be in localStorage. const KEY_MASK = '(已保存)'; const FB_BRAIN = { @@ -601,6 +604,11 @@ function lss(k,v){localStorage.setItem(k,v)} // INIT // ═══════════════════════════════════════════════════════ async function boot(){ + // Sanitize: if a previous version accidentally stored the KEY_MASK string as the key, clear it. + if(ls('zy_key') === KEY_MASK){ + localStorage.removeItem('zy_key'); + A.key = ''; + } initSetupUI(); // Restore identity from localStorage if(A.userName) A.userMeta = ROLE_MAP[A.userName]||null; @@ -691,13 +699,14 @@ function initSettingsPanel(){ const pv = A.prov||'yunwu'; document.getElementById('cp').value = pv; fillModels('cm', pv, A.mdl); - document.getElementById('ck').value = A.key?KEY_MASK:''; - // Show last 4 chars of current key so user can verify they're changing to a new one + // Always show EMPTY field — never prefill with a mask string. + // Empty on save = keep old key; any typed value = replace key. + document.getElementById('ck').value = ''; const hint = document.getElementById('ck-hint'); if(hint){ hint.textContent = A.key - ? '🔒 当前 Key 末4位:…'+A.key.slice(-4)+' · 要换新 Key 请点「清空重填」再输入' - : '🔒 只保存在浏览器 localStorage,不上传任何服务器'; + ? '🔒 当前已保存 Key 末4位:…'+(A.key.length>=4?A.key.slice(-4):A.key)+' · 留空保持不变,直接输入新 Key 即可替换' + : '🔒 尚未设置 API 密钥,请输入后保存'; } if(pv==='custom'){ document.getElementById('cep-g').style.display='block'; @@ -707,18 +716,13 @@ function initSettingsPanel(){ if(A.ghUser) document.getElementById('cghuser').value=A.ghUser; } -function clearKeyField(){ - const el = document.getElementById('ck'); - if(el){el.value='';el.focus();} - const hint = document.getElementById('ck-hint'); - if(hint) hint.textContent = '✏️ 请输入新的 API 密钥,输入完成后点「保存设置」'; -} - function saveSet(){ const pv = document.getElementById('cp').value; const md = document.getElementById('cm').value; const raw = document.getElementById('ck').value.trim(); - const k = raw===KEY_MASK? A.key : raw; + // Empty field = keep existing key; any non-empty input = use as new key. + // Never use KEY_MASK string comparison — that caused mixed-input bugs. + const k = raw || A.key; let base = PROVS[pv]?.base||''; if(pv==='custom') base=(document.getElementById('cep').value.trim())||base; A.key=k; A.base=base; A.mdl=md; A.prov=pv; A.demo=!k; @@ -731,7 +735,18 @@ function saveSet(){ document.getElementById('bbdemo').style.display=A.demo?'inline':'none'; applyIdentityUI(); closeP(); - botMsg('✅ 设置已保存。模型:'+esc(md)+''+(un?' · 身份:'+esc(un):'')+(A.demo?'
⚠️ 未设置 API 密钥,演示模式仍然开启。':'')); + const keyNote = raw ? ' · 🔑 新密钥已保存(末4位:…'+(k.length>=4?k.slice(-4):k)+')' : ' · 🔑 密钥未变更'; + botMsg('✅ 设置已保存。模型:'+esc(md)+''+keyNote+(un?' · 身份:'+esc(un):'')+(A.demo?'
⚠️ 未设置 API 密钥,演示模式仍然开启。':'')); +} + +// ═══════════════════════════════════════════════════════ +// RESET ALL SETTINGS +// ═══════════════════════════════════════════════════════ +function resetAllSettings(){ + if(!confirm('确定要清除所有本地设置吗?\n\n· API 密钥会被删除\n· 身份设置会被删除\n· 将返回初始设置界面\n\n这不会影响任何聊天记录或云端数据。')) return; + const keys = ['zy_key','zy_base','zy_mdl','zy_prov','zy_uname','zy_ghuser','zy_role']; + keys.forEach(k => localStorage.removeItem(k)); + window.location.reload(); } // ═══════════════════════════════════════════════════════ @@ -974,8 +989,11 @@ async function streamReply(txt){ if(e.isAuth){ el.innerHTML='🔑 API 密钥认证失败' +'
'+esc(e.message)+'' - +'
' - +'
打开设置 → 点「清空重填」→ 输入新密钥 → 保存'; + +'
' + +'' + +'' + +'
' + +'打开设置 → 直接输入新密钥 → 保存(无需清空,留空 = 保留旧密钥)'; } else { el.innerHTML='⚠️ '+esc(e.message)+'
请检查 API 密钥和网络连接,或在 ⚙️ 设置中更换模型。'; } From a42675d2a5e477f4319d279cbee0184edc0fd18b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 6 Mar 2026 05:33:24 +0000 Subject: [PATCH 08/16] =?UTF-8?q?fix:=20=E5=A4=9A=E5=B1=82=E9=98=B2?= =?UTF-8?q?=E5=BE=A1=E4=BF=AE=E5=A4=8D=E6=8C=81=E7=BB=AD=E6=8A=A5=E9=94=99?= =?UTF-8?q?=E6=97=A7=20Key=20=E2=80=94=20no-cache=E3=80=81URL=20reset?= =?UTF-8?q?=E3=80=81header=20=E9=87=8D=E7=BD=AE=E6=8C=89=E9=92=AE=E3=80=81?= =?UTF-8?q?=E6=89=A9=E5=B1=95=20sanitization?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: qinfendebingshuo <207279273+qinfendebingshuo@users.noreply.github.com> --- docs/index.html | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/docs/index.html b/docs/index.html index 9fbb3f37..c0df8ad6 100644 --- a/docs/index.html +++ b/docs/index.html @@ -3,6 +3,9 @@ + + + 铸渊助手 · HoloLake AI