Summary
pi-web 的工具预设目前只有三档(lib/tool-presets.ts):
| 预设 |
激活工具 |
效果 |
| off |
(无) |
模型无法读取项目文件,只能纯知识问答,无法针对代码库回答 |
| default |
read / bash / edit / write |
能读也能改,且 bash 可执行任意命令,存在误修改风险 |
| full |
以上 + grep / find / ls |
同上 |
缺少一个「只读问答」档:能读代码、不能改任何东西。很多用户希望像其他 AI 编程工具(如 Claude Code 的 ask 模式)一样:针对当前代码库回答问题,但绝不修改文件、绝不执行命令。
Expected behavior
新增第四档「Ask(只读)」:
- 激活只读工具:
read、grep、find、ls
- 不激活:
bash、edit、write
- 可选:配套注入只读系统指令(如「只分析并回答,禁止修改文件、禁止执行命令」),防止模型尝试绕过限制
Implementation notes
lib/tool-presets.ts:新增 PRESET_ASK = ["read", "grep", "find", "ls"],并在 getToolNamesForPreset / getPresetFromTools 中识别该组合。
- 传给 AgentSession 时必须用非空只读列表:
lib/rpc-manager.ts(startRpcSession,L1198-1206)中 toolNames === [] 走「all off」分支;
- 且 L1271-1283 会对空工具列表
setForceEmptySystemPrompt(true),把 systemPrompt 强制清空——这会连带丢掉 AGENTS.md 等 context files(buildSystemPrompt 包含 contextFiles),模型连「这是什么项目」都不知道。
- 因此 Ask 模式必须传非空列表(如
["read","grep","find","ls"]),既禁用写工具,又保留正常系统提示与项目指令。
components/ChatInput.tsx:TOOL_PRESETS 增加 "ask" 档,UI 增加一个预设按钮/选项。
- 协议无需改动:
POST /api/agent/new 已支持 toolNames[] 透传;已有会话可沿用 get_tools / setActiveToolsByName 机制。
- (可选)只读指令:通过扩展
before_agent_start 钩子修改 event.systemPrompt,或在 Ask 预设激活时向系统提示追加只读约束。
Related code
lib/tool-presets.ts — PRESET_NONE / PRESET_DEFAULT / PRESET_FULL
lib/rpc-manager.ts — startRpcSession() 中 toolsOption 与 setForceEmptySystemPrompt 的处理
components/ChatInput.tsx — TOOL_PRESETS 与预设切换 UI
Environment
Summary
pi-web 的工具预设目前只有三档(
lib/tool-presets.ts):缺少一个「只读问答」档:能读代码、不能改任何东西。很多用户希望像其他 AI 编程工具(如 Claude Code 的 ask 模式)一样:针对当前代码库回答问题,但绝不修改文件、绝不执行命令。
Expected behavior
新增第四档「Ask(只读)」:
read、grep、find、lsbash、edit、writeImplementation notes
lib/tool-presets.ts:新增PRESET_ASK = ["read", "grep", "find", "ls"],并在getToolNamesForPreset/getPresetFromTools中识别该组合。lib/rpc-manager.ts(startRpcSession,L1198-1206)中toolNames === []走「all off」分支;setForceEmptySystemPrompt(true),把systemPrompt强制清空——这会连带丢掉 AGENTS.md 等 context files(buildSystemPrompt包含contextFiles),模型连「这是什么项目」都不知道。["read","grep","find","ls"]),既禁用写工具,又保留正常系统提示与项目指令。components/ChatInput.tsx:TOOL_PRESETS增加"ask"档,UI 增加一个预设按钮/选项。POST /api/agent/new已支持toolNames[]透传;已有会话可沿用get_tools/setActiveToolsByName机制。before_agent_start钩子修改event.systemPrompt,或在 Ask 预设激活时向系统提示追加只读约束。Related code
lib/tool-presets.ts—PRESET_NONE/PRESET_DEFAULT/PRESET_FULLlib/rpc-manager.ts—startRpcSession()中toolsOption与setForceEmptySystemPrompt的处理components/ChatInput.tsx—TOOL_PRESETS与预设切换 UIEnvironment
@agegr/pi-web0.8.6