Finalize desktop pet feature set and GitHub export

This commit is contained in:
2026-06-17 04:50:25 +08:00
parent 6c2926b57a
commit 6812dbb110
62 changed files with 7774 additions and 504 deletions
@@ -32,12 +32,16 @@
- 删除用户导入角色
- 本地一次性/重复提醒、提醒列表、取消提醒和到点通知
- 内置/用户提醒音效切换、导入、删除和试听
- 天气查询、默认城市、公网 IP 定位兜底和多候选提示
- 本地文件操作安全入口:读取文本、列目录、复制、备份、重命名
- 联网模式:输入框开关、OpenAI/Gemini 原生联网、DeepSeek/Custom 不支持提示
- 本地应用启动:登记应用、开始菜单 / App Paths 发现、手选 `.exe` 和二次确认
- Windows 打包脚本和 Inno Setup 安装器脚本
- Release exe 双击不弹控制台窗口
项目已经从早期 MVP 进入到“可扩展桌面应用原型”阶段,可以开始规划工具能力扩展。
但是,在正式加入定时提醒、天气、本地文件操作、联网搜索之前,建议先做一轮结构收口。
但是,在正式加入定时提醒、天气、本地文件操作、联网模式之前,建议先做一轮结构收口。
---
@@ -98,7 +102,7 @@ loadCharacterPackage() 重新构建动画状态并从 idle 状态开始播放
```text
提醒解析
天气查询
联网搜索
联网模式
本地文件读写
AI 工具调度
复杂业务状态管理
@@ -126,7 +130,8 @@ ToolCommandDispatcher
定时提醒
天气查询
本地文件操作
联网搜索
联网模式
本地应用启动
普通 AI 对话
```
@@ -165,7 +170,7 @@ enum class UserIntentType
Reminder,
Weather,
FileOperation,
Search
LaunchApp
};
```
@@ -178,7 +183,7 @@ IntentRouter 判断意图
CommandDispatcher 分发
ReminderManager / WeatherManager / FileOperationManager / WebSearchManager / ConversationManager
ReminderManager / WeatherManager / FileOperationManager / WebChatManager / AppLaunchManager / ConversationManager
```
第一版意图识别不需要复杂,规则优先即可。
@@ -192,7 +197,7 @@ ReminderManager / WeatherManager / FileOperationManager / WebSearchManager / Con
推荐:
```text
Reminder > FileOperation > Weather > Search > Chat
Reminder > FileOperation > Weather > LaunchApp > Chat/WebChat
```
原因:
@@ -205,7 +210,7 @@ Reminder > FileOperation > Weather > Search > Chat
可能是文件操作,而不是单纯天气查询。
“搜索一下明天天气”
可能是搜索请求,但如果已有 WeatherTool,应优先走天气工具。
新版不再作为独立搜索工具处理;如果已有 WeatherTool,应优先走天气工具,否则按普通聊天或输入框联网开关进入 Chat/WebChat
```
---
@@ -229,7 +234,7 @@ set(CMAKE_AUTOMOC ON)
当前阶段选择方案 B:继续保持 `CMAKE_AUTOMOC OFF`,新增意图分发模块使用普通 C++ 类和同步返回值,不引入 `Q_OBJECT`
后续如果 Reminder / Weather / Search 等模块需要大量跨对象异步信号,再单独评估是否切换到方案 A。
后续如果 Reminder / Weather / WebChat 等模块需要大量跨对象异步信号,再单独评估是否切换到方案 A。
---
@@ -253,7 +258,7 @@ set(CMAKE_AUTOMOC ON)
天气 API 请求说明
IP 定位隐私说明
本地文件操作权限说明
联网搜索来源和隐私说明
联网模式来源和隐私说明
```
---
@@ -292,7 +297,7 @@ IP 定位隐私说明
阶段 1:定时提醒
阶段 2:天气查询
阶段 3:本地文件操作
阶段 4:联网搜索
阶段 4:联网模式
阶段 5:语音对话 / 更复杂 Agent 能力
```
@@ -301,7 +306,7 @@ IP 定位隐私说明
```text
1. 天气查询
2. 本地文件操作安全边界
3. 联网搜索
3. 联网模式
```
---
@@ -330,7 +335,7 @@ src/assistant/CommandDispatcher.cpp
- 定时提醒
- 天气查询
- 本地文件操作
- 联网搜索
- 联网模式
```
第一版可以使用规则判断,不依赖 AI。
@@ -634,9 +639,35 @@ Windows 托盘通知后端不可用:记录日志,不补气泡,不进入可
# 6. 阶段 2:天气查询功能
当前天气查询 v1 已进入实现阶段:
- 已新增独立 `src/weather/` 模块
- 已支持 Open-Meteo 市级城市优先的基础地理编码和基础天气查询
- 已支持设置页默认城市
- 已支持默认城市为空时通过公网 IP 定位兜底
- 已支持当前/今天、明天、后天和未来 1-3 天模板回复
- 已支持读取前 5 个地理编码候选;多候选时仍查首项,并在回复中提示同名城市风险和其他候选
- 已支持设置页测试默认城市;测试只展示匹配结果,不自动保存配置
- 已通过 `CommandDispatcher` 将 Weather 意图接入聊天入口
- 已保持 `PetWindow` 只负责 UI 展示,不承载天气解析或网络逻辑
v1 明确暂不支持:
- AI 润色天气回复
- 空气质量
- 天气预警
- 天气提醒联动
- 多天气源切换
- 小时级精细降雨判断
- 穿衣指数
默认城市为空且启用公网 IP 定位时,会请求 ipapi.co 判断城市;回复必须说明“根据公网 IP 判断城市”。设置页默认城市和公网 IP 定位都属于非用户明确城市来源,回复必须说明来源。
当前 v1 推荐填写市级城市名;区县、乡镇、街道不保证精确识别,可能无法匹配或被匹配到上级/同名城市。同名城市当前使用天气源返回的第一个结果,并在回复或测试结果中提示其他候选。后续优先补可交互候选选择、区县级定位和国内天气源增强。
## 6.1 功能定位
天气是独立工具能力,不放进联网搜索
天气是独立工具能力,不放进联网模式
正确流程:
@@ -654,9 +685,9 @@ AI 根据结构化数据自然语言回复
不要让 AI 自己搜索天气,也不要让 AI 自己拼 URL。
## 6.2 为什么不用联网搜索做天气
## 6.2 为什么不用联网模式做天气
搜索天气有几个问题:
用联网模式查询天气有几个问题:
```text
结果格式不稳定
@@ -706,10 +737,10 @@ src/weather/
├── WeatherConfig.h
├── WeatherStore.h
├── WeatherStore.cpp
├── WeatherProvider.h
├── WeatherProvider.cpp
├── OpenMeteoWeatherProvider.h
├── OpenMeteoWeatherProvider.cpp
├── WeatherParser.h
├── WeatherParser.cpp
├── WeatherSummaryFormatter.h
├── WeatherSummaryFormatter.cpp
├── WeatherManager.h
└── WeatherManager.cpp
```
@@ -836,6 +867,8 @@ VPN / 代理会导致定位错误
## 6.10 AI 回复上下文
当前 v1 采用模板优先,不依赖 AI 润色;本节作为 v1.1 预留方向。
程序应把结构化天气数据交给 AI
```text
@@ -872,6 +905,27 @@ VPN / 代理会导致定位错误
本地文件操作是高风险功能,必须后置,不能早于提醒和天气。
当前本地文件操作 v1 已进入实现阶段:
- 已新增独立 `src/fileops/` 模块
- 已通过 `CommandDispatcher` 将 FileOperation 意图接入聊天入口
- 已支持读取用户主动选择的常见文本文件
- 已支持列出用户主动选择的文件夹
- 已支持复制文件、创建备份、重命名文件
- 写操作会展示操作计划并二次确认
- 聊天文本不会直接变成本地路径,所有路径必须由用户通过文件选择框选择
- 已拒绝删除、覆盖、移动、执行脚本、运行命令和系统目录访问
- 已拒绝符号链接路径,降低路径逃逸风险
v1 明确暂不支持:
- zip 打包
- 删除文件
- 覆盖文件
- 移动文件
- 执行脚本或命令
- 修改源码
目标是让桌宠能辅助用户处理本地文件,例如:
```text
@@ -930,8 +984,6 @@ AI 自己决定访问系统目录
```text
src/fileops/
├── FileOperationTypes.h
├── FileOperationPlanner.h
├── FileOperationPlanner.cpp
├── FileOperationManager.h
├── FileOperationManager.cpp
├── FileSandbox.h
@@ -953,6 +1005,8 @@ src/fileops/
重命名文件,需确认
```
当前 v1 中 zip 打包延期,因为 Qt 公共 API 没有稳定内置写 zip 能力;不为此引入重依赖。后续如果要补 zip,优先选择明确许可和可维护的压缩库。
暂不做:
```text
@@ -978,82 +1032,95 @@ D:/xxx/b.txt
是否继续?
```
---
## 7.7 应用启动独立模块
# 8. 阶段 4:联网搜索功能
## 8.1 功能定位
联网搜索后置,不要现在优先做。
联网搜索是通用增强能力:
当前已新增独立 `src/launcher/` 模块,不放进 `src/fileops/`
```text
查询最新信息
查官网
查报错
查新闻
查版本
查文档
src/launcher/
├── AppLaunchTypes.h
├── AppLaunchStore.h
├── AppLaunchStore.cpp
├── AppDiscovery.h
├── AppDiscovery.cpp
├── AppLaunchManager.h
└── AppLaunchManager.cpp
```
## 8.2 不要给每家模型各自配置搜索
不建议:
应用启动支持:
```text
OpenAIProvider 自己一套搜索
GeminiProvider 自己一套搜索
DeepSeekProvider 自己一套搜索
CustomProvider 自己一套搜索
打开 Codex
启动酷狗音乐
帮我打开 VSCode
```
推荐
解析和发现顺序
```text
WebSearchManager 独立负责搜索
LLMProvider 只负责回答
ConversationManager / CommandDispatcher 负责把搜索结果注入给 AI
用户在设置页登记的应用别名
Windows 开始菜单快捷方式
Windows App Paths 注册表
未知应用时由用户手动选择 .exe
```
## 8.3 建议目录
启动安全边界:
```text
src/search/
├── SearchTypes.h
├── SearchProvider.h
├── SearXNGSearchProvider.h
├── SearXNGSearchProvider.cpp
├── WebSearchManager.h
└── WebSearchManager.cpp
启动前始终二次确认
只允许 .exe 或开始菜单 .lnk
不执行 .bat / .cmd / .ps1 / .vbs / .js / .msi
不执行聊天文本里的命令
不拼接聊天文本参数
不以管理员权限启动
```
第一版只做
配置保存到
```text
SearXNG + 自定义 Base URL
QStandardPaths::AppConfigLocation/launcher_config.json
```
后续再加
损坏时备份为
```text
Tavily
Brave Search
CustomSearchProvider
```
## 8.4 安全边界
```text
不要让 AI 自己生成任意 URL 给程序访问
不要做网页全文抓取第一版
不要默认每次都联网
不要把用户隐私查询写日志
搜索结果要显示来源
launcher_config.broken.yyyyMMdd-HHmmss.json
```
---
# 8. 阶段 4:联网模式
联网能力已从旧“搜索引擎聚合器”重做为 Web 端 AI 对话式联网模式。
当前已落地:
- 已删除旧 `src/search/` 模块,不再维护 Google/百度/360/搜狗页面解析、SearXNG 旧配置、多源聚合和旧 `search_config.json` 兼容。
- 已新增独立 `src/web/` 模块:`WebConfig``WebStore``WebCapabilityDetector``WebChatManager` 和 Web citation 类型。
- 输入框新增“联网”开关;开关开启后,普通聊天进入 WebChat 流程。
- 支持 OpenAI 官方 Provider 的 Responses API Web Search。
- 支持 Google Gemini Provider 的 Google Search grounding。
- DeepSeek 官方 API 当前不提供托管联网搜索工具,显示“不支持原生联网”。
- Custom / 第三方 OpenAI-Compatible 默认无法确认联网能力,不发送未知联网参数,不做旧搜索页抓取。
- 设置页改为“联网模式”:显示当前能力状态、开关记忆、默认开关、Provider 模式、超时、来源展示和测试联网模式。
-`search_config.json` 已废弃;新版使用 `web_config.json`,损坏时备份为 `web_config.broken.yyyyMMdd-HHmmss.json`
边界:
- 不再默认每次联网,模型可判断稳定常识无需联网。
- 不做搜索结果页 HTML 解析,避免登录、帮助、反馈、验证码页面污染答案。
- 不实现 Tavily / Brave / Bing Search API、自建搜索后端、网页全文抓取或长期缓存。
- 天气仍是独立工具能力,不放进联网模式。
后续可选:
- 更多 AI Provider 原生联网适配。
- 结构化搜索 API 或自建联网后端,用于不支持原生联网的模型。
- 更强的引用 UI、证据片段摘录和来源可点击展示。
# 9. 建议最终开发顺序
## 9.1 第一步:收口架构
@@ -1076,33 +1143,30 @@ CustomSearchProvider
## 9.3 第三步:天气查询
```text
1. WeatherTypes
2. WeatherConfig / WeatherStore
3. OpenMeteoWeatherProvider
4. WeatherManager
5. IntentRouter 天气识别
6. AI 回复 / 模板兜底
当前已落地天气 v1WeatherTypes、WeatherConfig / WeatherStore、WeatherParser、WeatherManager、模板回复、设置页默认城市、公网 IP 定位兜底和 Weather 意图接入。
当前已落地天气 v1.2 / v1.3:多候选城市提示和设置页默认城市测试。后续可继续补可交互候选选择、区县级定位、国内天气源增强、AI 润色、空气质量、天气预警、多天气源切换、小时级降雨判断和天气提醒联动。
```
## 9.4 第四步:本地文件操作
```text
1. FileSandbox
2. FileOperationTypes
3. FileOperationPlanner
4. FileOperationManager
5. 用户确认 UI
6. 备份机制
当前已落地 FileSandbox、FileOperationTypes、FileOperationManager、FileBackupManager 和用户确认 UI。
v1 支持读取文本、列出文件夹、复制、备份、重命名。
v1 不支持 zip、删除、覆盖、移动、脚本/命令执行和系统目录访问。
```
## 9.5 第五步:联网搜索
## 9.5 第五步:联网模式
```text
1. SearchTypes
2. SearchProvider
3. SearXNGSearchProvider
4. WebSearchManager
5. 来源展示
当前已落地 WebConfig、WebStore、WebCapabilityDetector、WebChatManager 和输入框联网开关。新版支持 OpenAI/Gemini 原生联网;DeepSeek/Custom 明确提示不支持或无法确认;旧搜索聚合与 SearXNG 旧配置已废弃。
```
## 9.6 第六步:应用启动
```text
当前已落地 AppLaunchStore、AppDiscovery、AppLaunchManager 和设置页应用登记。
v1 支持已登记应用、开始菜单快捷方式、App Paths 注册表和用户确认手选 .exe。
v1 不支持脚本、聊天参数、命令执行、管理员权限和跨平台应用发现。
```
---
@@ -1112,17 +1176,17 @@ CustomSearchProvider
下面这段可以直接作为后续任务总说明:
```text
当前不要急着直接实现提醒、天气、文件操作或联网搜索
当前不要急着直接实现提醒、天气、文件操作或联网模式
请先审查当前 QtDesktopPet 项目结构,并完成以下准备工作:
1. 角色切换在设置保存后已确认立即生效,后续只需保留回归检查。
2. 新增 IntentRouter / CommandDispatcher,使用户输入先经过统一意图分发。
3. 意图类型包括 Chat、Reminder、Weather、FileOperation、Search。
4. 意图优先级为 Reminder > FileOperation > Weather > Search > Chat。
3. 意图类型包括 Chat、Reminder、Weather、FileOperation、LaunchApp;联网模式由输入框开关决定,不再是独立 Search 意图
4. 意图优先级为 Reminder > FileOperation > Weather > LaunchApp > Chat/WebChat。
5. 普通聊天继续走现有 AI 对话流程。
6. 新功能不得继续直接塞进 PetWindow。
7. 后续 Reminder、Weather、FileOperation、Search 均应作为独立模块接入。
7. 后续 Reminder、Weather、FileOperation、LaunchApp、WebChat 均应作为独立模块接入。
8. 当前阶段保持 CMAKE_AUTOMOC OFF,后续模块不要使用 Q_OBJECT;确需 Qt 信号槽时再单独评估。
9. 保持现有隐私策略:API Key、Authorization、完整用户消息、完整错误响应不得写入日志。
10. 保持现有文件安全策略:路径校验、危险操作确认、修改前备份。
@@ -1137,7 +1201,7 @@ CustomSearchProvider
建议先做:
```text
结构收口 → IntentRouter / CommandDispatcher → 定时提醒 → 天气 → 本地文件操作 → 联网搜索
结构收口 → IntentRouter / CommandDispatcher → 定时提醒 → 天气 → 本地文件操作 → 联网模式
```
其中:
@@ -1146,5 +1210,5 @@ CustomSearchProvider
定时提醒:已作为第一个工具能力落地
天气:建议第二个落地
本地文件操作:风险较高,第三个落地
联网搜索:通用能力,最后落地
联网模式:通用 AI 对话增强,最后落地
```