Files
clawpanel/docs/assistant-features-plan.md

778 lines
28 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# AI 助手功能扩展规划
> 基于现有工具架构TOOL_DEFS + executeTool + getEnabledTools扩展 6 大能力模块。
> 每个模块独立开关,遵循现有的 `_config.tools.xxx` + 设置面板 toggle 模式。
---
## 当前架构概览
```
TOOL_DEFS = {
system: [get_system_info] // 始终可用
process: [list_processes, check_port] // 始终可用
interaction: [ask_user] // 始终可用
terminal: [run_command] // 开关控制
fileOps: [read_file, write_file, list_directory] // 开关控制
}
_config.tools = { terminal: true/false, fileOps: true/false }
```
扩展后:
```
TOOL_DEFS = {
...existing,
docker: [docker_list, docker_exec, docker_logs, wsl_exec] // 新增
webSearch: [web_search, fetch_url] // 新增
ssh: [ssh_exec, ssh_read_file, ssh_write_file] // 新增
knowledge: [search_knowledge] // 新增
}
_config.tools = {
...existing,
docker: false, // 默认关闭
webSearch: false, // 默认关闭
ssh: false, // 默认关闭
knowledge: false, // 默认关闭
}
```
---
## 模块一Docker / WSL 管理工具
### 场景
- 用户的 OpenClaw 可能安装在 Docker 容器或 WSL 中
- 本地检测不到时,帮用户在容器/WSL 内操作
- 查看容器日志、进入容器执行命令、管理容器生命周期
### 工具定义
| 工具名 | 描述 | 参数 | 危险等级 |
|--------|------|------|----------|
| `docker_list` | 列出 Docker 容器 | `filter?`, `all?` | 安全 |
| `docker_exec` | 在容器内执行命令 | `container`, `command` | ⚠️ 危险 |
| `docker_logs` | 查看容器日志 | `container`, `lines?` | 安全 |
| `docker_compose` | 执行 docker-compose 命令 | `action`, `file?`, `service?` | ⚠️ 危险 |
| `wsl_exec` | 在 WSL 内执行命令 | `distro?`, `command` | ⚠️ 危险 |
| `wsl_list` | 列出 WSL 发行版 | — | 安全 |
### 后端实现
```
Tauri (Rust):
- docker_list → Command::new("docker").args(["ps", ...])
- docker_exec → Command::new("docker").args(["exec", container, ...])
- wsl_exec → Command::new("wsl").args(["-d", distro, "-e", ...]) (Windows only)
dev-api.js (Web):
- execSync('docker ps --format json')
- execSync(`docker exec ${container} ${command}`)
- execSync(`wsl -d ${distro} -e ${command}`) (Windows only)
```
### 安全围栏
- `docker_exec` / `wsl_exec` 归入 DANGEROUS_TOOLS
- `docker rm`, `docker rmi`, `docker system prune` 归入 CRITICAL_PATTERNS
### UI 扩展
- 设置面板工具权限 tab 新增 toggle
```
Docker / WSL 工具 — 允许管理容器和 WSL 环境
```
### 内置技能卡片
```js
{
id: 'detect-docker-openclaw',
icon: '🐳',
name: '检测 Docker/WSL 中的 OpenClaw',
desc: '扫描 Docker 容器和 WSL查找 OpenClaw 安装',
tools: ['docker'],
prompt: `请帮我检查 Docker 和 WSL 中是否安装了 OpenClaw。
1. 调用 get_system_info 判断操作系统
2. 用 docker_list 列出所有容器,过滤包含 openclaw/gateway 的
3. 如果是 Windows用 wsl_list 列出 WSL 发行版
4. 对每个 WSL 发行版,用 wsl_exec 执行 "which openclaw" 检测
5. 汇总发现的 OpenClaw 实例及其状态`
}
```
### 优先级:🔴 高(解决用户最常见困惑)
### 工时估算1-2 天
---
## 模块二:联网搜索工具
### 场景
- 用户遇到不常见的错误AI 知识库可能没有
- 搜索 GitHub Issues、文档、Stack Overflow 找到解决方案
- 查找最新版本信息、API 文档等
### 工具定义
| 工具名 | 描述 | 参数 | 危险等级 |
|--------|------|------|----------|
| `web_search` | 联网搜索关键词 | `query`, `max_results?` | 安全 |
| `fetch_url` | 抓取网页内容 | `url` | 安全 |
### 后端实现方案3 选 1
#### 方案 ADuckDuckGo Instant Answer API推荐免费无 Key
```js
// 搜索
const resp = await fetch(`https://api.duckduckgo.com/?q=${encodeURIComponent(query)}&format=json`)
// 但 Instant Answer 只返回摘要,不返回搜索结果列表
// 实际搜索需要用 DuckDuckGo HTML 页面解析或第三方库
```
#### 方案 BSearXNG 代理(自托管,最灵活)
```js
// 部署一个 SearXNG 实例,或者用公共实例
const resp = await fetch(`https://searx.example.com/search?q=${query}&format=json`)
```
#### 方案 CJina Reader API推荐搭配使用免费
```js
// 将任意 URL 转为纯文本/Markdown
const resp = await fetch(`https://r.jina.ai/${targetUrl}`)
const text = await resp.text()
```
### 推荐组合
- **搜索**:使用 DuckDuckGo 的 `html.duckduckgo.com/html/?q=xxx` 页面解析结果
- **内容抓取**:使用 Jina Reader `r.jina.ai/URL` 获取纯文本
- 两者都 **免费无 Key**,无需用户配置
### 系统提示词补充
```
## web_search 使用指南
当你无法确定答案或需要最新信息时,可以使用 web_search 搜索互联网。
搜索后,如果需要更多内容,可以用 fetch_url 抓取具体页面。
搜索技巧:
- 加 site:github.com 搜索 GitHub
- 加 site:stackoverflow.com 搜索 StackOverflow
- 搜索错误信息时,用引号包裹关键错误文本
```
### 安全围栏
- 搜索和抓取不涉及破坏性操作,不归入 DANGEROUS_TOOLS
- 但需要网络请求添加超时保护10 秒)
- URL 抓取限制最大内容长度100KB → 截断)
### UI 扩展
```
联网搜索 — 允许搜索互联网和抓取网页内容(需联网)
```
### 优先级:🔴 高(大幅提升问题解决能力)
### 工时估算0.5-1 天
---
## 模块三SSH 远程管理工具
### 场景
- 用户的 OpenClaw 部署在远程服务器上
- 帮用户远程安装、配置、排查 OpenClaw
- 远程查看日志、重启服务、修改配置
### 工具定义
| 工具名 | 描述 | 参数 | 危险等级 |
|--------|------|------|----------|
| `ssh_exec` | 在远程服务器执行命令 | `connection_id`, `command` | ⚠️ 危险 |
| `ssh_read_file` | 读取远程文件 | `connection_id`, `path` | 安全 |
| `ssh_write_file` | 写入远程文件 | `connection_id`, `path`, `content` | ⚠️ 危险 |
### 配置数据结构
```js
_config.sshConnections = [
{
id: 'my-server',
name: '生产服务器',
host: '192.168.1.100',
port: 22,
user: 'root',
authType: 'key', // 'key' | 'password'
keyPath: '~/.ssh/id_rsa',
// password 不存储在 localStorage每次询问或用 keytar 安全存储
}
]
```
### 后端实现
```
Tauri (Rust):
- 使用 ssh2 crate 或调用系统 ssh CLI
- ssh_exec → Command::new("ssh").args(["-p", port, "user@host", command])
- ssh_read_file → ssh + cat
- ssh_write_file → 通过 stdin pipe 写入
dev-api.js (Web):
- 使用 node-ssh 或 ssh2 npm 包
- 或者直接调用 ssh CLI
```
### 设置 UI新增 tab「远程连接」
```
┌─────────────────────────────────────────────┐
│ 模型配置 │ 工具权限 │ 远程连接 │ 助手人设 │
├─────────────────────────────────────────────┤
│ │
│ ┌─ 生产服务器 ──────────────── [编辑] [删] │
│ │ root@192.168.1.100:22 (密钥认证) │
│ └──────────────────────────────────────────│
│ │
│ ┌─ 测试服务器 ──────────────── [编辑] [删] │
│ │ admin@10.0.0.5:22 (密码认证) │
│ └──────────────────────────────────────────│
│ │
│ [+ 添加连接] │
│ │
│ 提示:推荐使用 SSH 密钥认证。 │
│ 生成密钥ssh-keygen -t ed25519 │
│ 复制公钥ssh-copy-id user@host │
│ │
└─────────────────────────────────────────────┘
```
### 安全围栏
- `ssh_exec`, `ssh_write_file` 归入 DANGEROUS_TOOLS
- 密码认证:每次执行时用 ask_user 确认,或使用系统密钥链
- SSH 密钥路径验证:检查文件是否存在
- 关键命令rm -rf, reboot 等)在远程同样走 CRITICAL_PATTERNS
### 系统提示词补充
```
## SSH 远程管理
用户可能配置了远程服务器连接。当操作远程服务器时:
- 先用 ask_user 确认要操作哪个连接
- 远程命令比本地更谨慎,优先使用只读操作
- 修改配置前先备份cp xxx xxx.bak
```
### 内置技能卡片
```js
{
id: 'remote-manage',
icon: '🌐',
name: '远程管理 OpenClaw',
desc: '通过 SSH 连接远程服务器,管理 OpenClaw',
tools: ['ssh', 'fileOps'],
prompt: `请帮我管理远程服务器上的 OpenClaw。
1. 获取系统信息,列出已配置的 SSH 连接
2. 用 ask_user 让我选择要操作的服务器
3. 用 ssh_exec 检查远程 OpenClaw 状态
4. 检查 Gateway 进程和端口
5. 读取远程配置和日志
6. 汇总远程 OpenClaw 状态报告`
}
```
### 优先级:🟡 中(用户量较少但价值极高)
### 工时估算2-3 天
---
## 模块四:知识库 + 灵魂移植(借尸还魂 🔥)
### 核心理念
OpenClaw 的 Agent 有一套完整的**身份系统**,由工作区引导文件定义:
```
~/.openclaw/workspace/ ← Agent 的"灵魂"所在
├── AGENTS.md ← 操作指令、规则、记忆管理方式
├── SOUL.md ← 人设、边界、语气("Who You Are"
├── IDENTITY.md ← 名称、物种、风格、表情符号、头像
├── USER.md ← 用户档案(名字、称呼、时区、偏好)
├── TOOLS.md ← 工具本地笔记SSH 配置、设备名等)
├── HEARTBEAT.md ← 心跳任务清单
├── MEMORY.md ← 精选长期记忆(仅主会话加载)
└── memory/ ← 每日记忆日志
├── 2026-03-04-1609.md
└── ...
~/.openclaw/agents/<agentId>/agent/ ← Agent 的运行时状态
├── models.json ← 模型提供商配置baseUrl + apiKey + models
├── auth-profiles.json ← 认证配置文件
└── auth.json
```
**"借尸还魂"不是复用知识库,而是完整接管 Agent 的灵魂**——
ClawPanel 的 AI 助手直接读取这些文件,像 OpenClaw 一样把它们注入 system prompt
从而变成那个 Agent有他的名字、他的性格、他的记忆、他认识的用户。
### 4A灵魂移植Agent Identity Takeover
#### 工作流程
1. **扫描** `~/.openclaw/workspace/``~/.openclaw/agents/` 目录
2. **发现** 所有可用的 Agent 身份main、test 等)
3. **用户选择** 要附身的 Agent
4. **读取** 该 Agent 的全部引导文件:
- `SOUL.md` → 注入为人设(替换 ClawPanel 助手的默认人设)
- `IDENTITY.md` → 提取名称/表情/风格(替换助手名称和性格描述)
- `USER.md` → 注入用户上下文(知道用户叫什么、偏好什么)
- `AGENTS.md` → 注入操作规则Agent 的行为准则)
- `TOOLS.md` → 注入工具笔记
- `MEMORY.md` → 注入长期记忆
- `memory/` → 注入最近的每日记忆(最近 3 天)
5. **注入**`buildSystemPrompt()` 中,完全替代默认人设
#### 实现
```js
// 新增配置项
_config.soulSource = null // null = 使用 ClawPanel 默认 | 'openclaw:main' | 'openclaw:test' | 'custom'
_config.soulCache = null // 缓存读取的灵魂文件内容
// buildSystemPrompt 改造
function buildSystemPrompt() {
if (_config.soulSource?.startsWith('openclaw:')) {
// 借尸还魂模式:使用 OpenClaw Agent 的灵魂
return buildOpenClawSoulPrompt()
}
// 默认模式:使用 ClawPanel 自带的系统提示词
return buildDefaultPrompt()
}
function buildOpenClawSoulPrompt() {
const soul = _config.soulCache
if (!soul) return buildDefaultPrompt() // fallback
let prompt = ''
// 1. 身份注入
if (soul.identity) {
prompt += `# Identity\n${soul.identity}\n\n`
}
// 2. 灵魂注入(人设、边界、语气)
if (soul.soul) {
prompt += `# Soul\n${soul.soul}\n\n`
}
// 3. 用户上下文
if (soul.user) {
prompt += `# User\n${soul.user}\n\n`
}
// 4. 操作规则
if (soul.agents) {
prompt += `# Operating Instructions\n${soul.agents}\n\n`
}
// 5. 工具笔记
if (soul.tools) {
prompt += `# Tool Notes\n${soul.tools}\n\n`
}
// 6. 长期记忆
if (soul.memory) {
prompt += `# Long-term Memory\n${soul.memory}\n\n`
}
// 7. 最近的每日记忆
if (soul.recentMemories?.length) {
prompt += `# Recent Memory\n`
for (const m of soul.recentMemories) {
prompt += `## ${m.date}\n${m.content}\n\n`
}
}
// 8. 追加 ClawPanel 特有的工具说明(保持工具能力)
prompt += buildToolInstructions()
return prompt
}
```
#### 灵魂加载函数
```js
async function loadOpenClawSoul(agentId = 'main') {
const home = await getHomeDir()
const ws = `${home}/.openclaw/workspace` // 工作区是全局的,不按 agentId 分
const readSafe = async (path) => {
try { return await api.assistantReadFile(path) }
catch { return null }
}
const soul = {
identity: await readSafe(`${ws}/IDENTITY.md`),
soul: await readSafe(`${ws}/SOUL.md`),
user: await readSafe(`${ws}/USER.md`),
agents: await readSafe(`${ws}/AGENTS.md`),
tools: await readSafe(`${ws}/TOOLS.md`),
memory: await readSafe(`${ws}/MEMORY.md`),
recentMemories: [],
}
// 读取最近 3 天的每日记忆
try {
const memDir = await api.assistantListDir(`${ws}/memory`)
const files = memDir.split('\n').filter(f => f.match(/\d{4}-\d{2}-\d{2}/))
const recent = files.sort().slice(-3)
for (const f of recent) {
const content = await readSafe(`${ws}/memory/${f.trim()}`)
if (content) soul.recentMemories.push({ date: f.trim(), content })
}
} catch {}
return soul
}
```
#### UI设置面板「助手人设」Tab 改造
```
┌─────────────────────────────────────────────┐
│ 模型配置 │ 工具权限 │ 知识库 │ 远程连接 │ 人设 │
├─────────────────────────────────────────────┤
│ │
│ 身份来源 │
│ ┌──────────────────────────────────────────│
│ │ ● ClawPanel 默认人设 │ ← 当前默认
│ │ ○ OpenClaw Agent 身份(借尸还魂) │ ← 新增
│ │ ○ 自定义人设 │
│ └──────────────────────────────────────────│
│ │
│ ─── 当选择「OpenClaw Agent」时显示 ──── │
│ │
│ 选择 Agent: [main ▼] │
│ │
│ 📜 灵魂文件预览 │
│ ┌──────────────────────────────────────────│
│ │ SOUL.md ✅ 已加载 (1.6KB) │
│ │ IDENTITY.md ✅ 已加载 (636B) │
│ │ USER.md ✅ 已加载 (237B) │
│ │ AGENTS.md ✅ 已加载 (7.8KB) │
│ │ TOOLS.md ✅ 已加载 (860B) │
│ │ MEMORY.md ❌ 未找到 │
│ │ memory/ 📝 2 个日志文件 │
│ └──────────────────────────────────────────│
│ │
│ [👻 附身!] [🔄 刷新] │
│ │
│ ⚠️ 附身后,助手将使用该 Agent 的人格、 │
│ 记忆和用户偏好。可随时切回默认。 │
│ │
│ ─── 当选择「ClawPanel 默认」时显示 ──── │
│ │
│ 助手名称: [晴辰助手 ] │
│ 助手性格: [________________________] │
│ │
└─────────────────────────────────────────────┘
```
#### 附身后的效果
| 维度 | 默认模式 | 附身模式 |
|------|----------|----------|
| 名称 | "晴辰助手" | IDENTITY.md 中的名称 |
| 性格 | 简洁专业 | SOUL.md 定义的风格 |
| 称呼用户 | "你" | USER.md 中的称呼(如"爸爸" |
| 行为规则 | ClawPanel 内置 | AGENTS.md 的规则体系 |
| 记忆 | 无 | MEMORY.md + 每日记忆 |
| 工具知识 | ClawPanel 内置 | TOOLS.md 的本地笔记 |
| 工具能力 | 保持不变 | 保持 ClawPanel 的工具 |
**关键设计**:附身只替换"灵魂"system prompt**工具能力保持 ClawPanel 的**。
因为 OpenClaw 的工具exec/read/edit/write和 ClawPanel 的工具本质相同,
但 ClawPanel 有独有的 docker/ssh/搜索等扩展工具,这些要保留。
### 4B自定义知识库
在灵魂移植之外,仍然支持用户上传额外的知识文档:
#### 数据存储
```
~/.openclaw/clawpanel-kb/
├── index.json # 知识库索引
├── docs/
│ ├── api-guide.md # 用户上传的文档
│ ├── faq.md
│ └── deploy-notes.txt
└── chunks/ # 分块索引(可选,用于大文档)
└── ...
```
#### 实现方案
**V1简单方案**
- 小文档(<8KB直接全文注入 system prompt 尾部
- 大文档做关键词搜索(正则匹配 + 上下文窗口)
- 总注入 token 上限4000 tokens
- 知识库和灵魂移植可叠加使用
**V2进阶方案**
- embedding 语义搜索
- `search_knowledge` 工具让 AI 按需检索
### 优先级<E7BAA7> 高(灵魂移植是杀手级差异化功能)
### 工时估算:灵魂移植 1-2 天,自定义知识库 V1 额外 1 天
---
## 模块五:模型配置自动导入
### 场景
- 用户已安装 OpenClaw 并配置了模型
- ClawPanel AI 助手需要单独配置模型(目前手动填写)
- 一键从 OpenClaw 配置导入,省去重复配置
### 实现
#### 数据来源(两个层级)
**层级 1全局配置** `~/.openclaw/openclaw.json`
```json
{
"models": {
"providers": {
"shengsuanyun": {
"baseUrl": "http://127.0.0.1:8082/v1",
"apiKey": "sk-xxx",
"api": "openai-completions"
}
}
}
}
```
**层级 2Agent 模型注册表** `~/.openclaw/agents/<agentId>/agent/models.json`
```json
{
"providers": {
"openai": {
"baseUrl": "http://127.0.0.1:8082/v1",
"apiKey": "sk-eB3ybVNFvqB4fGrTUp3F8Lq16QxF7tut",
"api": "openai-completions",
"models": [
{ "id": "gpt-5.4", "name": "gpt-5.4", "contextWindow": 200000, "maxTokens": 8192 },
{ "id": "gpt-5.2-codex", "name": "gpt-5.2-codex", ... }
]
}
}
}
```
**推荐优先读取 Agent 的 models.json**——它有完整的 baseUrl + apiKey + models 列表,
一键就能填充 ClawPanel 助手的配置。
#### 读取逻辑
```js
async function discoverOpenClawModels() {
const home = await getHomeDir()
const results = []
// 1. 扫描所有 Agent 的 models.json
try {
const agents = await api.assistantListDir(`${home}/.openclaw/agents`)
for (const agentId of agents.split('\n').map(s => s.trim()).filter(Boolean)) {
try {
const raw = await api.assistantReadFile(`${home}/.openclaw/agents/${agentId}/agent/models.json`)
const data = JSON.parse(raw)
for (const [providerId, provider] of Object.entries(data.providers || {})) {
results.push({
source: `Agent: ${agentId}`,
providerId,
baseUrl: provider.baseUrl,
apiKey: provider.apiKey,
apiType: provider.api === 'openai-completions' ? 'openai' : provider.api,
models: (provider.models || []).map(m => m.id || m.name),
})
}
} catch {}
}
} catch {}
// 2. 读取全局 openclaw.json 作为补充
try {
const raw = await api.assistantReadFile(`${home}/.openclaw/openclaw.json`)
const config = JSON.parse(raw)
for (const [providerId, provider] of Object.entries(config.models?.providers || {})) {
// 去重:如果 Agent models.json 已有相同 providerId跳过
if (!results.find(r => r.providerId === providerId)) {
results.push({
source: '全局配置',
providerId,
baseUrl: provider.baseUrl,
apiKey: provider.apiKey,
apiType: 'openai',
models: [], // 全局配置没有 models 列表
})
}
}
} catch {}
return results
}
```
#### UI模型配置 tab 新增「导入」按钮
```
┌─────────────────────────────────────────────┐
│ API Base URL API 类型 │
│ [________________________] [OpenAI 兼容 ▼] │
│ │
│ API Key [测试] [拉取] [📥 导入] │ ← 新增「导入」按钮
│ [________________________] │
│ │
│ 模型 温度 │
│ [________________________] [0.7] │
│ │
└─────────────────────────────────────────────┘
```
点击「📥 导入」弹出选择面板:
```
┌─────────────────────────────────────────────┐
│ 从 OpenClaw 导入模型配置 │
│ │
│ 检测到以下已配置的服务商: │
│ │
│ ○ OpenAI │
│ https://api.openai.com/v1 │
│ 模型: gpt-4o, gpt-4o-mini │
│ │
│ ○ DeepSeek │
│ https://api.deepseek.com │
│ 模型: deepseek-chat, deepseek-reasoner │
│ │
│ ○ 本地 Ollama │
│ http://127.0.0.1:11434/v1 │
│ 模型: qwen2.5:7b │
│ │
│ 选择一个服务商,自动填充配置。 │
│ [取消] [导入] │
└─────────────────────────────────────────────┘
```
### 后端
```
Tauri: 已有 read_openclaw_config 命令
dev-api.js: 已有 read_config handler
// 只需在前端加一个读取+解析+填充的逻辑
```
### 优先级:🔴 高(零成本,纯前端,极大提升体验)
### 工时估算0.5 天
---
## 实施路线图
### Phase 1快速见效1-2 天)
| 序号 | 功能 | 工时 | 理由 |
|------|------|------|------|
| 1 | **模型配置自动导入** | 0.5d | 读 Agent models.json → 一键填充,纯前端零风险 |
| 2 | **联网搜索工具** | 0.5-1d | DuckDuckGo + Jina免费无 Key |
| 3 | **灵魂移植(借尸还魂)** | 1-2d | 杀手级差异化——读 SOUL/IDENTITY/USER/AGENTS/MEMORY → 变身 |
### Phase 2核心扩展2-3 天)
| 序号 | 功能 | 工时 | 理由 |
|------|------|------|------|
| 4 | **Docker/WSL 工具** | 1-2d | 解决用户最常见的安装困惑 |
| 5 | **自定义知识库 V1** | 1d | 用户上传 md/txt → 注入 prompt |
### Phase 3高级功能3-5 天)
| 序号 | 功能 | 工时 | 理由 |
|------|------|------|------|
| 6 | **SSH 远程管理** | 2-3d | 价值最高但复杂度也最高 |
| 7 | **知识库 V2语义搜索** | 3-5d | 依赖 embedding API |
---
## 设置面板 Tab 规划
当前 3 个 Tab → 扩展为 5 个 Tab
```
模型配置 │ 工具权限 │ 知识库 │ 远程连接 │ 助手人设
```
### 工具权限 Tab 最终形态
```
基础工具
☑ 终端工具 — 允许执行 Shell 命令
☑ 文件工具 — 允许读写文件和浏览目录
扩展工具
☐ Docker/WSL — 允许管理容器和 WSL 环境
☐ 联网搜索 — 允许搜索互联网和抓取网页
☐ SSH 远程 — 允许连接远程服务器(需先配置连接)
☐ 知识库 — 允许检索知识库内容
进程列表、端口检测、系统信息工具始终可用(非聊天模式下)。
```
---
## 技术注意事项
### 1. Token 预算管理
灵魂移植 + 知识库注入会占用 context window需要精细管理
| 组件 | 预算 | 说明 |
|------|------|------|
| ClawPanel 基础 prompt | ~2000 tokens | 产品介绍、工具指南、技能卡片 |
| SOUL.md | ~500 tokens | 人设通常简短 |
| IDENTITY.md | ~200 tokens | 名称/风格 |
| USER.md | ~200 tokens | 用户档案 |
| AGENTS.md | ~3000 tokens | 操作规则(最大,可截断) |
| TOOLS.md | ~300 tokens | 工具笔记 |
| MEMORY.md | ~2000 tokens | 长期记忆(截断保留最近部分) |
| 每日记忆 (3天) | ~1500 tokens | 自动截断 |
| 自定义知识库 | ~4000 tokens | 用户上传文档 |
| 搜索结果 | ~2000 tokens | web_search 返回内容 |
| **总计上限** | **~16000 tokens** | 留足空间给对话历史 |
策略:
- AGENTS.md 超过 3000 tokens 时截断尾部,保留前面的核心规则
- MEMORY.md 超过 2000 tokens 时只保留最后 2000 tokens
- 每日记忆超过 500 tokens/天时截断
- 灵魂文件加载时计算总 token 并在 UI 中显示
### 2. 跨平台兼容
- Docker CLI 在 Windows/Mac/Linux 都可用
- WSL 仅 Windows
- SSH 密钥路径Windows 用 `%USERPROFILE%\.ssh\`Mac/Linux 用 `~/.ssh/`
### 3. 安全存储
- SSH 密码/API Key
- Tauri 模式:使用 keytar 或 tauri-plugin-store 加密存储
- Web 模式:仅支持密钥认证(不存储密码)
- 知识库文件:存储在 `~/.openclaw/` 下,与用户数据同目录
### 4. 工具发现
AI 模型需要知道哪些工具可用。当前已在 `buildSystemPrompt()` 中列出技能卡片。
新增工具后,需要在系统提示词中补充使用指南(类似现有的 `ask_user` 指南)。
---
## 文件变更预估
| 文件 | 变更 |
|------|------|
| `src/pages/assistant.js` | TOOL_DEFS 新增 4 类 · executeTool 新增 case · getEnabledTools 新增分支 · 设置面板 UI · 模型导入弹窗 |
| `src-tauri/src/commands/assistant.rs` | 新增 Rust 命令docker_*, wsl_*, ssh_*, web_search, fetch_url |
| `scripts/dev-api.js` | 新增 Web 模式 handler同上 |
| `src/style/assistant.css` | 知识库管理 UI · SSH 连接管理 UI · 导入弹窗样式 |
| `src/pages/assistant.js` (prompt) | 系统提示词新增各工具使用指南 |