From f3f4ead417bc09ba7e9e8928f95a7439e2757c61 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 13 Mar 2026 05:59:53 +0000 Subject: [PATCH] fix: address code review feedback - path traversal protection, error msg fallback, named constant Co-authored-by: qinfendebingshuo <207279273+qinfendebingshuo@users.noreply.github.com> --- persona-studio/backend/brain/agent-workflow.js | 9 +++++++-- persona-studio/frontend/chat.js | 9 ++++++--- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/persona-studio/backend/brain/agent-workflow.js b/persona-studio/backend/brain/agent-workflow.js index 01766e25..aeacc4b4 100644 --- a/persona-studio/backend/brain/agent-workflow.js +++ b/persona-studio/backend/brain/agent-workflow.js @@ -24,6 +24,10 @@ const path = require('path'); const https = require('https'); const http = require('http'); +// ── 常量 ── +// 传入 LLM 的对话文本最大字符数(防止超出模型上下文窗口) +const MAX_CONVERSATION_CHARS = 4000; + // ── 核心大脑模块 ── const memoryManager = require('./memory-manager'); const personaEngine = require('./persona-engine'); @@ -328,7 +332,7 @@ async function analyzeIntentWithLLM(brainContext, conversation, apiBase, apiKey, model: model, messages: [ { role: 'system', content: systemParts.join('\n') }, - { role: 'user', content: '以下是和开发者的完整对话,请分析意图并生成开发计划:\n\n' + conversationText.substring(0, 4000) } + { role: 'user', content: '以下是和开发者的完整对话,请分析意图并生成开发计划:\n\n' + conversationText.substring(0, MAX_CONVERSATION_CHARS) } ], maxTokens: 2000, temperature: 0.2, @@ -442,7 +446,8 @@ async function agentExecute(developmentPlan, devId, apiBase, apiKey, model, broa var entries = Object.entries(files); for (var j = 0; j < entries.length; j++) { var safeName = path.basename(entries[j][0]); - if (!safeName || safeName.startsWith('.')) continue; + // 安全检查:防止路径遍历和隐藏文件 + if (!safeName || safeName.startsWith('.') || /[/\\]/.test(entries[j][0])) continue; fs.writeFileSync(path.join(projectDir, safeName), entries[j][1], 'utf-8'); fileList.push(safeName); } diff --git a/persona-studio/frontend/chat.js b/persona-studio/frontend/chat.js index 279c6135..2d263e98 100644 --- a/persona-studio/frontend/chat.js +++ b/persona-studio/frontend/chat.js @@ -664,9 +664,12 @@ async function confirmBuild() { }); if (!buildRes.ok) { - var errData = {}; - try { errData = await buildRes.json(); } catch (_e) { /* ignore */ } - appendMessage('system', '⚠️ 铸渊代理启动失败: ' + (errData.message || 'HTTP ' + buildRes.status)); + var errMsg = 'HTTP ' + buildRes.status + ' ' + buildRes.statusText; + try { + var errData = await buildRes.json(); + if (errData.message) errMsg = errData.message; + } catch (_e) { /* use status text fallback */ } + appendMessage('system', '⚠️ 铸渊代理启动失败: ' + errMsg); updatePreviewStatus('error', '启动失败'); } } catch (_err) {