fr-cli 2.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- fr_cli/README.md +148 -0
- fr_cli/WEAPON.MD +186 -0
- fr_cli/__init__.py +4 -0
- fr_cli/addon/plugin.py +69 -0
- fr_cli/agent/__init__.py +9 -0
- fr_cli/agent/builtins/__init__.py +4 -0
- fr_cli/agent/builtins/_utils.py +48 -0
- fr_cli/agent/builtins/db.py +269 -0
- fr_cli/agent/builtins/local.py +105 -0
- fr_cli/agent/builtins/rag.py +652 -0
- fr_cli/agent/builtins/rag_watcher_daemon.py +156 -0
- fr_cli/agent/builtins/remote.py +214 -0
- fr_cli/agent/builtins/spider.py +247 -0
- fr_cli/agent/client.py +164 -0
- fr_cli/agent/executor.py +86 -0
- fr_cli/agent/generator.py +104 -0
- fr_cli/agent/manager.py +193 -0
- fr_cli/agent/master.py +604 -0
- fr_cli/agent/master_prompt.py +118 -0
- fr_cli/agent/remote.py +70 -0
- fr_cli/agent/server.py +279 -0
- fr_cli/agent/workflow.py +164 -0
- fr_cli/breakthrough/update.py +154 -0
- fr_cli/command/__init__.py +4 -0
- fr_cli/command/executor.py +276 -0
- fr_cli/command/registry.py +1034 -0
- fr_cli/command/security.py +30 -0
- fr_cli/conf/config.py +126 -0
- fr_cli/conf/wizard.py +172 -0
- fr_cli/core/chat.py +280 -0
- fr_cli/core/core.py +111 -0
- fr_cli/core/intent.py +129 -0
- fr_cli/core/recommender.py +71 -0
- fr_cli/core/stream.py +83 -0
- fr_cli/core/sysmon.py +117 -0
- fr_cli/core/thinking.py +215 -0
- fr_cli/gatekeeper/__init__.py +7 -0
- fr_cli/gatekeeper/daemon.py +216 -0
- fr_cli/gatekeeper/manager.py +218 -0
- fr_cli/lang/i18n.py +827 -0
- fr_cli/main.py +329 -0
- fr_cli/memory/context.py +119 -0
- fr_cli/memory/history.py +96 -0
- fr_cli/memory/session.py +134 -0
- fr_cli/repl/__init__.py +0 -0
- fr_cli/repl/commands.py +1098 -0
- fr_cli/security/security.py +46 -0
- fr_cli/ui/ui.py +116 -0
- fr_cli/weapon/cron.py +217 -0
- fr_cli/weapon/dataframe.py +97 -0
- fr_cli/weapon/disk.py +141 -0
- fr_cli/weapon/fs.py +206 -0
- fr_cli/weapon/launcher.py +249 -0
- fr_cli/weapon/loader.py +98 -0
- fr_cli/weapon/mail.py +227 -0
- fr_cli/weapon/mcp.py +204 -0
- fr_cli/weapon/vision.py +74 -0
- fr_cli/weapon/web.py +88 -0
- fr_cli-2.1.0.dist-info/METADATA +227 -0
- fr_cli-2.1.0.dist-info/RECORD +64 -0
- fr_cli-2.1.0.dist-info/WHEEL +5 -0
- fr_cli-2.1.0.dist-info/entry_points.txt +2 -0
- fr_cli-2.1.0.dist-info/licenses/LICENSE +21 -0
- fr_cli-2.1.0.dist-info/top_level.txt +1 -0
fr_cli/README.md
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
# 凡人打字机 (fr-cli)
|
|
2
|
+
|
|
3
|
+
基于智谱 AI (ZhipuAI / GLM) 的终极全能终端工具。
|
|
4
|
+
|
|
5
|
+
**🇨🇳 中文简介**
|
|
6
|
+
|
|
7
|
+
支持:AI 智能对话、MasterAgent 自我进化主控、思维模式切换(direct/CoT/ToT/ReAct)、文件沙盒操作、联网搜索(SSRF 防护)、图片生成与识别、邮件收发、定时任务(shlex 安全解析)、云盘集成、会话记忆、按日期自动存档、插件进化(子进程隔离)、四阶安全拦截、Shell 管道直通 AI。
|
|
8
|
+
|
|
9
|
+
**🇺🇸 English Intro**
|
|
10
|
+
|
|
11
|
+
The ultimate all-knowing terminal tool based on Zhipu AI. Supports AI chat, MasterAgent self-evolving controller, thinking modes (direct/CoT/ToT/ReAct), virtual filesystem, web search (SSRF-protected), image generation & vision, email, cron jobs (shlex-safe), cloud drive, session memory, auto date-based archiving, self-evolving plugins (subprocess-isolated), and powerful Shell piping.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 🚀 快速开始
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
pip install fr-cli
|
|
19
|
+
fr-cli
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
首次运行会引导输入智谱 API Key。
|
|
23
|
+
|
|
24
|
+
## 🎮 使用方式
|
|
25
|
+
|
|
26
|
+
### 用户直接命令
|
|
27
|
+
|
|
28
|
+
在 `>>>` 提示符下输入 `/` 命令:
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
/ls 列出当前目录文件
|
|
32
|
+
/cat <file> 查看文件内容
|
|
33
|
+
/write <file> 写入文件(多行输入,Ctrl+D 结束)
|
|
34
|
+
/cd <dir> 切换工作目录
|
|
35
|
+
/delete <file> 删除文件
|
|
36
|
+
/search <query> 联网搜索
|
|
37
|
+
/save <name> 保存会话
|
|
38
|
+
/load 加载历史会话
|
|
39
|
+
/export 导出会话为 Markdown
|
|
40
|
+
/session_list 列出按日期存档的会话
|
|
41
|
+
/session_load <idx> 加载存档会话
|
|
42
|
+
/mode direct|cot|tot|react 切换思维模式
|
|
43
|
+
/master on|off|status MasterAgent 主控
|
|
44
|
+
/mcp_list 列出 MCP 服务器及工具
|
|
45
|
+
/mcp_add <名> <命令> [参数] 添加 MCP 服务器
|
|
46
|
+
/mcp_del <名> 删除 MCP 服务器
|
|
47
|
+
/help 查看全部命令
|
|
48
|
+
/exit 退出
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### AI 自动工具调用
|
|
52
|
+
|
|
53
|
+
当请求涉及文件、搜索、画图等操作时,AI 会自动调用内置工具:
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
【调用:write_file({"path": "hello.md", "content": "# Hello\n\nWorld"})】
|
|
57
|
+
【调用:search_web({"query": "Python 教程"})】
|
|
58
|
+
【调用:generate_image({"prompt": "一只猫在月球上"})】
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### 插件(Skills)
|
|
62
|
+
|
|
63
|
+
自定义插件通过命令方式调用:
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
【命令:/my_plugin 参数】
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## 📂 项目结构
|
|
72
|
+
|
|
73
|
+
```
|
|
74
|
+
fr_cli/
|
|
75
|
+
├── main.py # 核心入口:REPL 循环、AI 交互编排(~600行)
|
|
76
|
+
├── repl/
|
|
77
|
+
│ └── commands.py # 40个命令处理器(从 main.py 提取)
|
|
78
|
+
├── WEAPON.MD # 法宝图谱(工具清单,人类可读,不再参与程序逻辑)
|
|
79
|
+
├── agent/ # Agent 分身系统 + MasterAgent 主控
|
|
80
|
+
│ ├── master.py # 自我进化主控 Agent(ReAct 循环)
|
|
81
|
+
│ ├── master_prompt.py # MasterAgent 系统提示词模板
|
|
82
|
+
│ ├── manager.py # Agent 生命周期管理
|
|
83
|
+
│ ├── executor.py # Agent 执行器(run/delegate/multi-agent)
|
|
84
|
+
│ ├── workflow.py # 工作流引擎(workflow.md 解析与执行)
|
|
85
|
+
│ └── server.py # HTTP 服务(默认 127.0.0.1 + Bearer Token)
|
|
86
|
+
├── command/
|
|
87
|
+
│ ├── executor.py # 命令执行引擎(动态构建依赖,消除 _deps 快照)
|
|
88
|
+
│ ├── registry.py # 统一工具注册表
|
|
89
|
+
│ └── security.py # 四阶安全确认管理器
|
|
90
|
+
├── weapon/ # 武器库/扩展子系统
|
|
91
|
+
│ ├── fs.py # 虚拟文件系统 VFS
|
|
92
|
+
│ ├── web.py # 网络搜索与网页抓取(SSRF 防护)
|
|
93
|
+
│ ├── vision.py # 图片生成 (CogView) / 多模态 (GLM-4V)
|
|
94
|
+
│ ├── mail.py # 邮件客户端(防头注入)
|
|
95
|
+
│ ├── disk.py # 云盘适配器
|
|
96
|
+
│ ├── cron.py # 定时任务(shlex + shell=False)
|
|
97
|
+
│ ├── launcher.py # 本地应用启动器(跨平台)
|
|
98
|
+
│ ├── dataframe.py # Excel / CSV 读取与分析
|
|
99
|
+
│ └── loader.py # 从注册表动态生成工具描述
|
|
100
|
+
├── memory/
|
|
101
|
+
│ ├── history.py # 会话历史保存/加载/导出
|
|
102
|
+
│ ├── context.py # 上下文记忆(最近 5 轮摘要)
|
|
103
|
+
│ └── session.py # 按日期自动存档会话引擎
|
|
104
|
+
├── core/
|
|
105
|
+
│ ├── core.py # AppState 全局状态容器(DI 容器)
|
|
106
|
+
│ ├── stream.py # 流式输出与代码块高亮
|
|
107
|
+
│ ├── recommender.py # 功能推荐引擎
|
|
108
|
+
│ ├── sysmon.py # 系统状态监控
|
|
109
|
+
│ └── thinking.py # 思维模式引擎(CoT/ToT/ReAct)
|
|
110
|
+
├── addon/
|
|
111
|
+
│ └── plugin.py # 插件加载与执行(runpy + json.dumps)
|
|
112
|
+
├── conf/
|
|
113
|
+
│ └── config.py # 配置读写(mkstemp + 0o600 原子写入)
|
|
114
|
+
├── lang/
|
|
115
|
+
│ └── i18n.py # 国际化 (zh/en)
|
|
116
|
+
├── security/
|
|
117
|
+
│ └── security.py # 安全确认引擎
|
|
118
|
+
└── ui/
|
|
119
|
+
└── ui.py # 终端 UI、颜色、动画
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## 📦 可选依赖
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
pip install fr-cli[all] # 全功能(含网盘)
|
|
128
|
+
pip install fr-cli[baidu] # 百度网盘
|
|
129
|
+
pip install fr-cli[aliyun] # 阿里云盘
|
|
130
|
+
pip install fr-cli[onedrive] # OneDrive
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## 🔧 开发
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
git clone https://github.com/yourname/fr-cli.git
|
|
139
|
+
cd fr-cli
|
|
140
|
+
pip install -e ".[all]"
|
|
141
|
+
python -m pytest tests/ -v
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
## 📄 License
|
|
147
|
+
|
|
148
|
+
MIT
|
fr_cli/WEAPON.MD
ADDED
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
# 法宝图谱 (WEAPON.MD)
|
|
2
|
+
|
|
3
|
+
> 本文档描述凡人打字机所有可用工具(武器/法宝)。
|
|
4
|
+
> 程序运行时会从此文件读取工具信息,动态注入大模型上下文。
|
|
5
|
+
> 修改本文件后重启程序即可生效,无需改动源码。
|
|
6
|
+
> **调用格式**:所有内置工具使用 `【调用:tool_name({"参数": "值"})】` 格式,参数为标准 JSON。
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## file_operations
|
|
11
|
+
- **名称**: 文件操作工具
|
|
12
|
+
- **功能**: 列出文件、查看文件内容、切换目录、写入文件、追加内容、删除文件等
|
|
13
|
+
- **程序路径**: fr_cli/weapon/fs.py
|
|
14
|
+
- **调用方式**: write_file, read_file, list_files, change_dir, append_file, delete_file
|
|
15
|
+
- **触发关键词**: 文件, 目录, folder, 读取, read, 保存到, save to, 写入文件, 创建文件, 生成文件, ls , cat , cd , write , append , delete
|
|
16
|
+
|
|
17
|
+
## image_analysis
|
|
18
|
+
- **名称**: 图片分析工具
|
|
19
|
+
- **功能**: 查看和分析图片内容、生成图片
|
|
20
|
+
- **程序路径**: fr_cli/weapon/vision.py
|
|
21
|
+
- **调用方式**: analyze_image, generate_image
|
|
22
|
+
- **触发关键词**: 分析图片, 识图, 看图, describe image, 图片内容, 识别图片, 生成图片, 画图, 画一张
|
|
23
|
+
|
|
24
|
+
## email_management
|
|
25
|
+
- **名称**: 邮件管理工具
|
|
26
|
+
- **功能**: 查看收件箱、读取邮件、发送邮件
|
|
27
|
+
- **程序路径**: fr_cli/weapon/mail.py
|
|
28
|
+
- **调用方式**: mail_inbox, mail_read, mail_send
|
|
29
|
+
- **触发关键词**: 邮件, mail, email, 发邮件, 收件箱, inbox, 发送邮件, 查看邮件
|
|
30
|
+
|
|
31
|
+
## web_search
|
|
32
|
+
- **名称**: 网络搜索工具
|
|
33
|
+
- **功能**: 搜索网络内容和获取网页
|
|
34
|
+
- **程序路径**: fr_cli/weapon/web.py
|
|
35
|
+
- **调用方式**: search_web, fetch_web
|
|
36
|
+
- **触发关键词**: 搜索, search, 查一下, 查询, look up, 最新新闻, 今天天气, 股价, 汇率, 查百度, 查谷歌
|
|
37
|
+
|
|
38
|
+
## scheduled_tasks
|
|
39
|
+
- **名称**: 定时任务工具
|
|
40
|
+
- **功能**: 添加、列出和删除定时任务。支持 shell 命令和 Agent 分身两种任务类型。
|
|
41
|
+
- **程序路径**: fr_cli/weapon/cron.py
|
|
42
|
+
- **调用方式**:
|
|
43
|
+
- shell 类型: `cron_add`, `cron_list`, `cron_del`(由 Gatekeeper 持久化执行)
|
|
44
|
+
- Agent 类型: `/agent_cron_add <agent> <秒> [输入]`, `/agent_cron_list`, `/agent_cron_del <ID>`
|
|
45
|
+
- **触发关键词**: 定时任务, 定时执行, 周期性执行, cron job, scheduled task, 定时器
|
|
46
|
+
|
|
47
|
+
## cloud_storage
|
|
48
|
+
- **名称**: 云盘管理工具
|
|
49
|
+
- **功能**: 上传、下载和列出云盘文件
|
|
50
|
+
- **程序路径**: fr_cli/weapon/disk.py
|
|
51
|
+
- **调用方式**: disk_ls, disk_up, disk_down
|
|
52
|
+
- **触发关键词**: 云盘, 上传文件, 下载文件, cloud disk, upload file, download file, 云端
|
|
53
|
+
|
|
54
|
+
## session_management
|
|
55
|
+
- **名称**: 会话管理工具
|
|
56
|
+
- **功能**: 保存、加载和导出会话
|
|
57
|
+
- **程序路径**: fr_cli/memory/history.py
|
|
58
|
+
- **调用方式**: save_session, list_sessions, export_session
|
|
59
|
+
- **触发关键词**: 保存会话, 加载会话, 导出会话, save session, load session, export session
|
|
60
|
+
|
|
61
|
+
## configuration
|
|
62
|
+
- **名称**: 配置管理工具
|
|
63
|
+
- **功能**: 设置模型、API密钥、语言等
|
|
64
|
+
- **程序路径**: fr_cli/conf/config.py
|
|
65
|
+
- **调用方式**: set_model, set_key, set_limit, set_lang
|
|
66
|
+
- **触发关键词**: 切换模型, 换模型, 改模型, set model, api key, api密钥, 切换语言, 设置上限
|
|
67
|
+
|
|
68
|
+
## plugin_system
|
|
69
|
+
- **名称**: 插件系统工具
|
|
70
|
+
- **功能**: 查看和执行自定义插件(skills)
|
|
71
|
+
- **程序路径**: fr_cli/addon/plugin.py
|
|
72
|
+
- **调用方式**: 【命令:/skills】, 【命令:/<plugin_name>】
|
|
73
|
+
- **触发关键词**: 插件, plugin, 技能, skill, 法宝, 自定义工具
|
|
74
|
+
|
|
75
|
+
## system_commands
|
|
76
|
+
- **名称**: 系统命令工具
|
|
77
|
+
- **功能**: 执行shell命令和管道操作
|
|
78
|
+
- **程序路径**: 内置 (main.py)
|
|
79
|
+
- **调用方式**: !<command>, !<cmd> | <prompt>
|
|
80
|
+
- **触发关键词**: 执行命令, shell, bash, 系统命令, 运行命令, terminal
|
|
81
|
+
|
|
82
|
+
## launcher_system
|
|
83
|
+
- **名称**: 本机应用启动器
|
|
84
|
+
- **功能**: 跨平台调用浏览器、办公软件、通讯工具、媒体播放器等本地程序
|
|
85
|
+
- **程序路径**: fr_cli/weapon/launcher.py
|
|
86
|
+
- **调用方式**: /open <路径/URL>, /launch <应用> [目标], /apps
|
|
87
|
+
- **触发关键词**: 打开, open, 启动, launch, 浏览, 播放, 查看, 打开微信, 打开浏览器, 打开 Word
|
|
88
|
+
|
|
89
|
+
## agent_system
|
|
90
|
+
- **名称**: Agent 分身系统
|
|
91
|
+
- **功能**: 创建独立 Agent(角色设定/记忆/技能/工作流),支持 HTTP API 调用
|
|
92
|
+
- **程序路径**: fr_cli/agent/
|
|
93
|
+
- **调用方式**:
|
|
94
|
+
- `/agent_create <name> <desc>` — AI 自动生成完整 Agent
|
|
95
|
+
- `/agent_forge <name>` — 从最近 AI 回复中提取代码铸造 Agent
|
|
96
|
+
- `/agent_list`, `/agent_show`, `/agent_edit`, `/agent_run`, `/agent_delete` — 管理 Agent
|
|
97
|
+
- `/agent_server start [port]`, `/agent_server stop`, `/agent_server status` — HTTP 服务
|
|
98
|
+
- **触发关键词**: agent, 分身, 工作流, workflow, API, HTTP 服务
|
|
99
|
+
- **创建方式**: 1) AI 自动生成 2) `/agent_forge` 从代码铸造 3) 自动检测提示 4) 手动创建 `~/.fr_cli_agents/<name>/agent.py`
|
|
100
|
+
|
|
101
|
+
## builtin_local
|
|
102
|
+
- **名称**: @local 本机助手
|
|
103
|
+
- **功能**: 拦截 `@local <需求>`,AI 自动生成并执行本机系统命令,结果保存到 Agent 记忆
|
|
104
|
+
- **程序路径**: fr_cli/agent/builtins/local.py
|
|
105
|
+
- **调用方式**: `@local <需求描述>`
|
|
106
|
+
- **触发关键词**: 本地操作, 本机, 系统命令, 终端, shell
|
|
107
|
+
|
|
108
|
+
## builtin_remote
|
|
109
|
+
- **名称**: @remote 远程运维助手
|
|
110
|
+
- **功能**: 管理多机 SSH 连接,`@remote [IP/别名] <需求>` 自动探测远程 OS 并生成命令
|
|
111
|
+
- **程序路径**: fr_cli/agent/builtins/remote.py
|
|
112
|
+
- **调用方式**: `@remote <需求>` 或 `@remote [别名] <需求>`
|
|
113
|
+
- **触发关键词**: 远程, 服务器, SSH, 运维, Linux, 主机管理
|
|
114
|
+
|
|
115
|
+
## builtin_spider
|
|
116
|
+
- **名称**: @spider 爬虫助手
|
|
117
|
+
- **功能**: requests → selenium 降级策略,模拟真人行为,深度爬取,保存到 `web_YYYYMMDD/`
|
|
118
|
+
- **程序路径**: fr_cli/agent/builtins/spider.py
|
|
119
|
+
- **调用方式**: `@spider <需求>`
|
|
120
|
+
- **触发关键词**: 爬取, 爬虫, 抓取, spider, 采集, 网页下载, 批量下载
|
|
121
|
+
|
|
122
|
+
## builtin_db
|
|
123
|
+
- **名称**: @db 数据库助手
|
|
124
|
+
- **功能**: MySQL/PostgreSQL/SQL Server/Oracle 通用交互,自动分析 Schema 生成 SQL,危险操作警告
|
|
125
|
+
- **程序路径**: fr_cli/agent/builtins/db.py
|
|
126
|
+
- **调用方式**: `@db <需求>` 或 `@db [别名] <需求>`
|
|
127
|
+
- **触发关键词**: 数据库, SQL, MySQL, PostgreSQL, 查询, 表结构, DB
|
|
128
|
+
|
|
129
|
+
## builtin_rag
|
|
130
|
+
- **名称**: @RAG 本地知识库助手
|
|
131
|
+
- **功能**: ChromaDB 向量检索 + CrossEncoder 重排序(Rerank) + 大模型最佳片段判定。后台自动向量化监控目录。支持两种监控模式:
|
|
132
|
+
- 向量检索:使用 all-MiniLM-L6-v2 嵌入模型,检索 top-15 候选
|
|
133
|
+
- Rerank 重排序:使用 cross-encoder/ms-marco-MiniLM-L-6-v2 对候选重新打分,取 top-3
|
|
134
|
+
- 大模型判定:让 LLM 从 top-3 中评估相关性/完整性/准确性,选出最佳片段 ★【最佳】
|
|
135
|
+
- 最终生成:优先基于最佳片段回答,可综合其他片段补充
|
|
136
|
+
- 内置模式(daemon 线程):`/rag_dir <目录>` 后自动启动
|
|
137
|
+
- 独立模式(系统进程):`/rag_watch start [目录] [--interval N]`,退出终端后仍继续运行
|
|
138
|
+
- **程序路径**: fr_cli/agent/builtins/rag.py
|
|
139
|
+
- **调用方式**: `@RAG <问题>` / `/rag_dir <路径>` / `/rag_sync` / `/rag_watch start|stop|status|log`
|
|
140
|
+
- **触发关键词**: 知识库, RAG, 检索, 向量搜索, 文档问答, 本地文档
|
|
141
|
+
|
|
142
|
+
## data_scroll
|
|
143
|
+
- **名称**: 数据卷轴
|
|
144
|
+
- **功能**: 读取 Excel/CSV,输出列名、类型、统计信息和数据预览
|
|
145
|
+
- **程序路径**: fr_cli/weapon/dataframe.py
|
|
146
|
+
- **调用方式**: `/read_excel <文件>`, `/read_csv <文件>`
|
|
147
|
+
- **触发关键词**: Excel, CSV, 表格, 数据分析, 数据预览, 统计
|
|
148
|
+
|
|
149
|
+
## gatekeeper
|
|
150
|
+
- **名称**: 结界守护进程
|
|
151
|
+
- **功能**: 独立于主程序运行的守护进程,持久化 Agent HTTP 服务、全局定时任务(shell)和 Agent 分身定时任务。每30秒热重载配置,自动同步主进程新增/删除的任务。
|
|
152
|
+
- **程序路径**: fr_cli/gatekeeper/daemon.py, fr_cli/gatekeeper/manager.py
|
|
153
|
+
- **调用方式**: `/gatekeeper start|stop|status`, `/agent_cron_add <agent> <秒> [输入]`, `/agent_cron_list`, `/agent_cron_del <ID>`
|
|
154
|
+
- **触发关键词**: 守护进程, 后台, daemon, gatekeeper, 持久化, Agent 定时任务
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
## thinking_mode
|
|
158
|
+
- **名称**: 思维推演模式
|
|
159
|
+
- **功能**: 在最终回答前,让大模型按照人类思维范式进行问题拆解和自我反馈验证。支持 CoT(思维链)、ToT(思维树)、ReAct(推理+行动)三种模式。
|
|
160
|
+
- **程序路径**: fr_cli/core/thinking.py
|
|
161
|
+
- **调用方式**: `/mode direct|cot|tot|react`
|
|
162
|
+
- **触发关键词**: 深度思考, 推理, 思维链, 思维树, ReAct, 拆解问题, 自我验证
|
|
163
|
+
|
|
164
|
+
模式说明:
|
|
165
|
+
- direct(默认):直接回答,不增加额外推理步骤
|
|
166
|
+
- cot:先进行问题拆解、假设提出、验证评估、方案整合、自我检查,再将推理结果注入最终回答
|
|
167
|
+
- tot:生成多分支策略树,逐层评估打分,选择最优路径并给出备选方案
|
|
168
|
+
- react:每一步先思考(Thought)再行动(Action),基于观察结果(Observation)循环迭代,直到问题解决
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
## mcp_tools
|
|
172
|
+
- **名称**: MCP 外部神通
|
|
173
|
+
- **功能**: 连接外部 MCP (Model Context Protocol) 服务器,将其工具纳入统一注册表。支持 stdio 传输方式,可动态发现服务器提供的工具并调用。
|
|
174
|
+
- **程序路径**: fr_cli/weapon/mcp.py
|
|
175
|
+
- **调用方式**:
|
|
176
|
+
- AI 调用: `mcp_call({"server": "服务器名", "tool": "工具名", "arguments": {...}})`
|
|
177
|
+
- REPL 管理: `/mcp_list`, `/mcp_add`, `/mcp_del`, `/mcp_enable`, `/mcp_disable`, `/mcp_refresh`
|
|
178
|
+
- **触发关键词**: mcp, 外部工具, 外部神通, 调用工具, use tool, invoke tool
|
|
179
|
+
- **配置持久化**: `~/.zhipu_cli_config.json` 的 `mcp.servers` 字段
|
|
180
|
+
- **示例**:
|
|
181
|
+
```
|
|
182
|
+
/mcp_add fs npx -y @modelcontextprotocol/server-filesystem /tmp
|
|
183
|
+
/mcp_refresh
|
|
184
|
+
>>> 用 MCP 工具读取 /tmp/hello.txt
|
|
185
|
+
🧙 仙人 【调用:mcp_call({"server": "fs", "tool": "read_file", "arguments": {"path": "/tmp/hello.txt"}})】
|
|
186
|
+
```
|
fr_cli/__init__.py
ADDED
fr_cli/addon/plugin.py
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"""
|
|
2
|
+
插件进化引擎
|
|
3
|
+
负责本地技能的扫描、动态落盘与沙盒执行
|
|
4
|
+
"""
|
|
5
|
+
import re, subprocess, sys
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
from fr_cli.lang.i18n import T
|
|
8
|
+
from fr_cli.ui.ui import RED, DIM, RESET
|
|
9
|
+
|
|
10
|
+
PLUGIN_DIR = Path.home() / ".zhipu_cli_plugins"
|
|
11
|
+
|
|
12
|
+
def init_plugins():
|
|
13
|
+
"""扫描并初始化本地插件字典 {名字: 绝对路径}"""
|
|
14
|
+
PLUGIN_DIR.mkdir(parents=True, exist_ok=True)
|
|
15
|
+
plugins = {}
|
|
16
|
+
for f in PLUGIN_DIR.glob("*.py"):
|
|
17
|
+
name = f.stem.lower()
|
|
18
|
+
plugins[name] = str(f)
|
|
19
|
+
return plugins
|
|
20
|
+
|
|
21
|
+
def extract_code(text):
|
|
22
|
+
"""提取 AI 回复中的首段 Python 代码段"""
|
|
23
|
+
pattern = r"```python\s*\n(.*?)```"
|
|
24
|
+
match = re.search(pattern, text, re.DOTALL | re.IGNORECASE)
|
|
25
|
+
if match:
|
|
26
|
+
return match.group(1).strip()
|
|
27
|
+
return ""
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def exec_plugin(name, path, args, lang):
|
|
31
|
+
"""
|
|
32
|
+
在子进程中安全执行插件
|
|
33
|
+
约定:插件必须包含 def run(args='')
|
|
34
|
+
"""
|
|
35
|
+
# 安全检查:插件名必须是合法 Python 标识符
|
|
36
|
+
if not name.isidentifier():
|
|
37
|
+
print(f"{RED}❌ 非法插件名: {name}{RESET}")
|
|
38
|
+
return
|
|
39
|
+
|
|
40
|
+
import json, shlex
|
|
41
|
+
# 使用 json.dumps 安全序列化参数,防止字符串逃逸注入
|
|
42
|
+
safe_args = json.dumps(args)
|
|
43
|
+
runner_code = f"""
|
|
44
|
+
import sys, json, runpy
|
|
45
|
+
sys.path.insert(0, {shlex.quote(str(PLUGIN_DIR))})
|
|
46
|
+
mod = runpy.run_module({shlex.quote(name)}, run_name='__main__')
|
|
47
|
+
run_fn = mod.get('run')
|
|
48
|
+
if run_fn is None:
|
|
49
|
+
print("Error: 插件缺少 run 函数", file=sys.stderr)
|
|
50
|
+
else:
|
|
51
|
+
try:
|
|
52
|
+
print(run_fn(json.loads({safe_args})))
|
|
53
|
+
except Exception as e:
|
|
54
|
+
print(f"Error: {{e}}", file=sys.stderr)
|
|
55
|
+
"""
|
|
56
|
+
try:
|
|
57
|
+
# 使用子进程执行,限制超时时间为 15 秒
|
|
58
|
+
res = subprocess.run(
|
|
59
|
+
[sys.executable, "-c", runner_code],
|
|
60
|
+
capture_output=True, text=True, timeout=15
|
|
61
|
+
)
|
|
62
|
+
if res.stdout.strip():
|
|
63
|
+
print(res.stdout.strip())
|
|
64
|
+
if res.stderr.strip():
|
|
65
|
+
print(f"{DIM}{res.stderr.strip()}{RESET}")
|
|
66
|
+
except subprocess.TimeoutExpired:
|
|
67
|
+
print(f"{RED}⏳ {T('err_posix', lang)} Timeout (15s){RESET}")
|
|
68
|
+
except Exception as e:
|
|
69
|
+
print(f"{RED}{T('err_posix', lang)} {e}{RESET}")
|
fr_cli/agent/__init__.py
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"""
|
|
2
|
+
内置 Agent 公共工具库
|
|
3
|
+
提取各内置 Agent 中的重复逻辑:Markdown 清理、确认对话框、JSON 配置读写等。
|
|
4
|
+
"""
|
|
5
|
+
import json
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def strip_code_blocks(text):
|
|
10
|
+
"""去除 markdown 代码块标记(```language ... ```)"""
|
|
11
|
+
text = text.strip()
|
|
12
|
+
if text.startswith("```"):
|
|
13
|
+
text = text.split("\n", 1)[1] if "\n" in text else ""
|
|
14
|
+
if text.endswith("```"):
|
|
15
|
+
text = text.rsplit("\n", 1)[0]
|
|
16
|
+
text = text.strip()
|
|
17
|
+
return text
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def confirm_execute(prompt="是否执行", default_yes=True):
|
|
21
|
+
"""交互式确认执行
|
|
22
|
+
返回 True 表示用户确认执行,False 表示取消。
|
|
23
|
+
"""
|
|
24
|
+
from fr_cli.ui.ui import DIM, RESET
|
|
25
|
+
suffix = "[Y/n]" if default_yes else "[y/N]"
|
|
26
|
+
confirm = input(f"{DIM}{prompt}? {suffix}: {RESET}").strip().lower()
|
|
27
|
+
if default_yes:
|
|
28
|
+
return not confirm or confirm in ("y", "yes")
|
|
29
|
+
return confirm in ("y", "yes")
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def load_json_config(path, default=None):
|
|
33
|
+
"""安全加载 JSON 配置文件"""
|
|
34
|
+
if default is None:
|
|
35
|
+
default = {}
|
|
36
|
+
path = Path(path)
|
|
37
|
+
if not path.exists():
|
|
38
|
+
return default
|
|
39
|
+
try:
|
|
40
|
+
return json.loads(path.read_text(encoding="utf-8"))
|
|
41
|
+
except Exception:
|
|
42
|
+
return default
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def save_json_config(path, data):
|
|
46
|
+
"""安全保存 JSON 配置文件"""
|
|
47
|
+
path = Path(path)
|
|
48
|
+
path.write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
|