Skip to content

[Feature Request] 新增 Ask(只读)模式:可读代码但不允许修改/执行命令 #376

Description

@cloudinnng

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(只读)」:

  • 激活只读工具:readgrepfindls
  • 不激活:basheditwrite
  • 可选:配套注入只读系统指令(如「只分析并回答,禁止修改文件、禁止执行命令」),防止模型尝试绕过限制

Implementation notes

  1. lib/tool-presets.ts:新增 PRESET_ASK = ["read", "grep", "find", "ls"],并在 getToolNamesForPreset / getPresetFromTools 中识别该组合。
  2. 传给 AgentSession 时必须用非空只读列表
    • lib/rpc-manager.tsstartRpcSession,L1198-1206)中 toolNames === [] 走「all off」分支;
    • 且 L1271-1283 会对空工具列表 setForceEmptySystemPrompt(true),把 systemPrompt 强制清空——这会连带丢掉 AGENTS.md 等 context files(buildSystemPrompt 包含 contextFiles),模型连「这是什么项目」都不知道。
    • 因此 Ask 模式必须传非空列表(如 ["read","grep","find","ls"]),既禁用写工具,又保留正常系统提示与项目指令。
  3. components/ChatInput.tsxTOOL_PRESETS 增加 "ask" 档,UI 增加一个预设按钮/选项。
  4. 协议无需改动POST /api/agent/new 已支持 toolNames[] 透传;已有会话可沿用 get_tools / setActiveToolsByName 机制。
  5. (可选)只读指令:通过扩展 before_agent_start 钩子修改 event.systemPrompt,或在 Ask 预设激活时向系统提示追加只读约束。

Related code

  • lib/tool-presets.tsPRESET_NONE / PRESET_DEFAULT / PRESET_FULL
  • lib/rpc-manager.tsstartRpcSession()toolsOptionsetForceEmptySystemPrompt 的处理
  • components/ChatInput.tsxTOOL_PRESETS 与预设切换 UI

Environment

  • @agegr/pi-web 0.8.6

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