Skip to content

test111 #9

@phantom5099

Description

@phantom5099

一、环境隔离层:安全与兼容性的边界
路径白名单的绕过风险
仅限制「../ 上级目录」不够,需补充对软链接(symlink) 的校验 —— 若用户在当前目录下创建指向系统目录的软链接,Agent 可能通过软链接访问敏感路径。建议在文件操作前,先通过 os.Readlink 解析真实路径,再校验是否在白名单内。
命令黑名单的局限性
黑名单难以覆盖所有危险操作(如 :(){ :|:& };: fork 炸弹、通过 sed/awk 间接修改系统文件、curl | bash 执行远程脚本等)。建议:
采用「白名单机制」替代黑名单(仅允许 go build/npm test/python 等常见开发命令);
对命令参数做严格校验(如禁止 rm 带 -rf 参数、禁止管道符 |/ 重定向 > 等组合操作,MVP 阶段可先简化为「仅允许无管道的单命令」)。
跨平台 pty 兼容性
github.com/creack/pty 在 Windows 上需依赖 ConPTY(Windows 10 1809+),建议补充:
Windows 环境下的版本检测;
若不支持 ConPTY,降级为「非交互模式执行命令」(MVP 阶段可优先覆盖 Linux/macOS,Windows 做简化处理)。
二、工具链与感知层:精准性与落地细节
ripgrep 的跨平台嵌入问题
go:embed 只能嵌入静态文件,无法自动适配不同操作系统(Windows/macOS/Linux 的 ripgrep 二进制不同)。建议:
构建时通过 GOOS/GOARCH 环境变量选择对应二进制嵌入(需在构建脚本中处理);
或运行时检测平台,从 GitHub Releases 动态下载 ripgrep(需处理网络失败、版本兼容问题,MVP 阶段可优先嵌入主流平台二进制)。
行级文件读写的局限性
用 ReadLines/ReplaceLines 做行级替换,在以下场景可能出错:
代码格式化导致行号变化(如用户手动格式化后,Agent 记忆的行号失效);
多行逻辑修改(如替换一个函数的前半部分,后半部分行号偏移)。建议:
修改前先读取文件最新内容,重新校验行号对应的代码片段是否匹配预期;
若不匹配,让 LLM 基于最新文件重新定位(MVP 阶段可先做「片段匹配校验」,失败则提示用户手动确认)。
「语义搜索」的定义澄清
ripgrep 是文本关键词搜索,而非真正的「语义搜索」(如无法理解「查找处理用户认证的函数」)。建议:
将功能描述调整为「精准代码文本搜索」,避免用户预期偏差;
后续迭代再引入 LSP(如 go-lsp)做符号级搜索(如按函数名、变量名定位)。
三、决策与会话层:避免死循环与上下文丢失
Token 剪枝的策略细化
仅提「Token 剪枝」不够,需明确剪枝规则,否则可能丢失关键上下文:
优先级保留:工具执行结果(尤其是报错信息)> 用户最新需求 > 模型历史思考;
滑动窗口:保留最近 N 轮对话,但强制保留「任务初始需求」和「最近一次工具执行结果」;
建议在会话管理层加一个「关键上下文标记」,让 LLM 在思考时标记哪些信息不能剪枝(如「当前修改的文件路径」「编译报错的核心信息」)。
重复操作检测的可执行性
需明确「重复操作」的定义和处理逻辑:
定义:连续 2 次以上执行完全相同的工具调用(如相同的 bash 命令、相同的文件行替换);
处理:检测到后强制中断,让 LLM 重新思考(可在 System Prompt 中提示「若连续执行相同操作无效,需尝试新方法或向用户确认」)。
任务清单的落地细节
提到用「显式任务清单」避免死循环,建议补充:
任务清单由 LLM 在首次思考时生成,并在每轮迭代后更新(标记完成 / 失败 / 新增);
若任务失败,让 LLM 先分析失败原因,再决定是「重试当前任务」还是「调整任务清单」;
MVP 阶段可将任务清单打印到终端,方便用户调试(如 [ ] 1. 读取main.go [x] 2. 修改login函数)。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions