chore: remove build-release.sh, docs/BUILD.md, release-notes.md, restore-build-cache.sh
This commit is contained in:
@@ -1,157 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
set -e
|
|
||||||
|
|
||||||
PROJECT_DIR="/root/.openclaw/workspace/metona-ollama-desktop"
|
|
||||||
TOKEN="2faf8da068ae0944f7d40c265d21e651"
|
|
||||||
REPO="thzxx/metona-ollama-desktop"
|
|
||||||
VERSION="5.1.4"
|
|
||||||
LOG_FILE="/root/.openclaw/workspace/metona-ollama-desktop/build-v5.1.4.log"
|
|
||||||
|
|
||||||
exec > >(tee -a "$LOG_FILE") 2>&1
|
|
||||||
|
|
||||||
echo "══════════════════════════════════════════════"
|
|
||||||
echo " Metona Ollama Desktop v${VERSION} 构建开始"
|
|
||||||
echo " $(date '+%Y-%m-%d %H:%M:%S')"
|
|
||||||
echo "══════════════════════════════════════════════"
|
|
||||||
|
|
||||||
cd "$PROJECT_DIR"
|
|
||||||
|
|
||||||
# ── Step 1: 检查环境 ──
|
|
||||||
echo ""
|
|
||||||
echo "▶ Step 1: 检查构建环境"
|
|
||||||
echo "──────────────────────"
|
|
||||||
node --version
|
|
||||||
npm --version
|
|
||||||
echo "OS: $(uname -a)"
|
|
||||||
echo "Wine: $(wine --version 2>/dev/null || echo 'NOT INSTALLED')"
|
|
||||||
echo "p7zip: $(7z 2>/dev/null | head -1 || echo 'NOT INSTALLED')"
|
|
||||||
|
|
||||||
# ── Step 2: 确保在正确分支 ──
|
|
||||||
echo ""
|
|
||||||
echo "▶ Step 2: 确认分支"
|
|
||||||
echo "──────────────────────"
|
|
||||||
git checkout develop
|
|
||||||
git log --oneline -1
|
|
||||||
|
|
||||||
# ── Step 3: 安装依赖 ──
|
|
||||||
echo ""
|
|
||||||
echo "▶ Step 3: npm install"
|
|
||||||
echo "──────────────────────"
|
|
||||||
npm config set registry https://registry.npmmirror.com
|
|
||||||
ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ npm install 2>&1
|
|
||||||
echo "npm install 完成"
|
|
||||||
|
|
||||||
# ── Step 4: 构建 ──
|
|
||||||
echo ""
|
|
||||||
echo "▶ Step 4: npm run build"
|
|
||||||
echo "──────────────────────"
|
|
||||||
npm run build 2>&1
|
|
||||||
echo "npm run build 完成"
|
|
||||||
|
|
||||||
# ── Step 5: 打包 Windows 安装包 ──
|
|
||||||
echo ""
|
|
||||||
echo "▶ Step 5: npm run dist (Windows NSIS)"
|
|
||||||
echo "──────────────────────────────────────"
|
|
||||||
# 先尝试恢复构建缓存
|
|
||||||
if [ -f restore-build-cache.sh ]; then
|
|
||||||
echo "尝试恢复构建缓存..."
|
|
||||||
bash restore-build-cache.sh 2>&1 || echo "构建缓存恢复失败,electron-builder 将自动下载"
|
|
||||||
fi
|
|
||||||
|
|
||||||
ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ npm run dist 2>&1
|
|
||||||
echo "npm run dist 完成"
|
|
||||||
|
|
||||||
# ── Step 6: 检查产物 ──
|
|
||||||
echo ""
|
|
||||||
echo "▶ Step 6: 检查构建产物"
|
|
||||||
echo "────────────────────────"
|
|
||||||
ls -lh release/*.exe 2>/dev/null || echo "未找到 .exe 文件!"
|
|
||||||
EXE_FILE=$(ls release/*Setup*.exe 2>/dev/null | head -1)
|
|
||||||
if [ -z "$EXE_FILE" ]; then
|
|
||||||
echo "❌ 构建失败:未找到安装包"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
echo "✅ 安装包: $EXE_FILE ($(du -h "$EXE_FILE" | cut -f1))"
|
|
||||||
|
|
||||||
# ── Step 7: Gitee 发布 ──
|
|
||||||
echo ""
|
|
||||||
echo "▶ Step 7: Gitee 发布"
|
|
||||||
echo "──────────────────────"
|
|
||||||
|
|
||||||
# 删除旧的 v5.1.4-desktop release(如有)
|
|
||||||
echo "检查旧 release..."
|
|
||||||
RELEASES=$(curl -s "https://gitee.com/api/v5/repos/${REPO}/releases?access_token=${TOKEN}&page=1&per_page=50")
|
|
||||||
OLD_RELEASE_ID=$(echo "$RELEASES" | python3 -c "
|
|
||||||
import sys, json
|
|
||||||
try:
|
|
||||||
releases = json.load(sys.stdin)
|
|
||||||
for r in releases:
|
|
||||||
if r.get('tag_name') == 'v${VERSION}-desktop':
|
|
||||||
print(r['id'])
|
|
||||||
break
|
|
||||||
except: pass
|
|
||||||
" 2>/dev/null)
|
|
||||||
|
|
||||||
if [ -n "$OLD_RELEASE_ID" ]; then
|
|
||||||
echo "删除旧 release ID: $OLD_RELEASE_ID"
|
|
||||||
curl -s -X DELETE "https://gitee.com/api/v5/repos/${REPO}/releases/${OLD_RELEASE_ID}?access_token=${TOKEN}" > /dev/null
|
|
||||||
echo "旧 release 已删除"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 创建新 release
|
|
||||||
echo "创建 v${VERSION}-desktop release..."
|
|
||||||
RELEASE_RESPONSE=$(curl -s -X POST "https://gitee.com/api/v5/repos/${REPO}/releases?access_token=${TOKEN}" \
|
|
||||||
-H "Content-Type: application/json" \
|
|
||||||
-d "{
|
|
||||||
\"tag_name\": \"v${VERSION}-desktop\",
|
|
||||||
\"name\": \"v${VERSION}-desktop\",
|
|
||||||
\"body\": \"Metona Ollama Desktop v${VERSION}\\n\\n详见 [更新日志](https://gitee.com/thzxx/metona-ollama-desktop/blob/develop/docs/CHANGELOG.md)\",
|
|
||||||
\"target_commitish\": \"develop\"
|
|
||||||
}")
|
|
||||||
|
|
||||||
RELEASE_ID=$(echo "$RELEASE_RESPONSE" | python3 -c "
|
|
||||||
import sys, json
|
|
||||||
try:
|
|
||||||
r = json.load(sys.stdin)
|
|
||||||
print(r.get('id', ''))
|
|
||||||
except: pass
|
|
||||||
" 2>/dev/null)
|
|
||||||
|
|
||||||
if [ -z "$RELEASE_ID" ]; then
|
|
||||||
echo "❌ 创建 release 失败"
|
|
||||||
echo "$RELEASE_RESPONSE"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
echo "✅ Release 创建成功,ID: $RELEASE_ID"
|
|
||||||
|
|
||||||
# 上传附件
|
|
||||||
echo "上传安装包附件..."
|
|
||||||
UPLOAD_RESPONSE=$(curl -s -X POST "https://gitee.com/api/v5/repos/${REPO}/releases/${RELEASE_ID}/attach_files?access_token=${TOKEN}" \
|
|
||||||
-H "Content-Type: multipart/form-data" \
|
|
||||||
-F "file=@${EXE_FILE}")
|
|
||||||
|
|
||||||
UPLOAD_SUCCESS=$(echo "$UPLOAD_RESPONSE" | python3 -c "
|
|
||||||
import sys, json
|
|
||||||
try:
|
|
||||||
r = json.load(sys.stdin)
|
|
||||||
if r.get('browser_download_url'):
|
|
||||||
print('OK')
|
|
||||||
else:
|
|
||||||
print('FAIL: ' + str(r))
|
|
||||||
except Exception as e:
|
|
||||||
print('FAIL: ' + str(e))
|
|
||||||
" 2>/dev/null)
|
|
||||||
|
|
||||||
if [ "$UPLOAD_SUCCESS" = "OK" ]; then
|
|
||||||
echo "✅ 安装包上传成功"
|
|
||||||
else
|
|
||||||
echo "❌ 上传失败: $UPLOAD_RESPONSE"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
echo "══════════════════════════════════════════════"
|
|
||||||
echo " 构建完成!v${VERSION}"
|
|
||||||
echo " $(date '+%Y-%m-%d %H:%M:%S')"
|
|
||||||
echo " Release: https://gitee.com/${REPO}/releases"
|
|
||||||
echo "══════════════════════════════════════════════"
|
|
||||||
-183
@@ -1,183 +0,0 @@
|
|||||||
# Windows 安装包构建指南
|
|
||||||
|
|
||||||
## 环境要求
|
|
||||||
|
|
||||||
- Ubuntu 24.04 (amd64)
|
|
||||||
- Node.js v22+
|
|
||||||
- Wine 9.0+(用于 electron-builder 交叉编译)
|
|
||||||
- i386 架构已启用(`dpkg --add-architecture i386`)
|
|
||||||
- p7zip-full(解压构建资源)
|
|
||||||
|
|
||||||
## 快速构建(3 步)
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# 1. 克隆并安装依赖
|
|
||||||
git clone https://gitee.com/thzxx/metona-ollama-desktop.git
|
|
||||||
cd metona-ollama-desktop
|
|
||||||
npm config set registry https://registry.npmmirror.com
|
|
||||||
npm install
|
|
||||||
|
|
||||||
# 2. 恢复构建缓存(首次从镜像下载,后续使用本地缓存)
|
|
||||||
bash restore-build-cache.sh
|
|
||||||
|
|
||||||
# 3. 构建
|
|
||||||
ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ npm run dist
|
|
||||||
```
|
|
||||||
|
|
||||||
产出文件在 `release/` 目录。
|
|
||||||
|
|
||||||
## 构建资源管理
|
|
||||||
|
|
||||||
构建需要以下资源(共 ~145MB),通过 `restore-build-cache.sh` 自动管理:
|
|
||||||
|
|
||||||
| 资源 | 大小 | 来源 |
|
|
||||||
|------|------|------|
|
|
||||||
| Electron v33.4.11 win32-x64 | 110MB | npmmirror |
|
|
||||||
| NSIS 3.0.4.1 | 7.8MB | GitHub (ghfast.top 代理) |
|
|
||||||
| NSIS Resources 3.4.1 | 3.0MB | GitHub (ghfast.top 代理) |
|
|
||||||
| winCodeSign 2.6.0 | 24MB | GitHub (ghfast.top 代理) |
|
|
||||||
|
|
||||||
**工作原理**:
|
|
||||||
- 首次运行:从镜像下载 → 自动缓存到 `build-resources/` 和 `~/.cache/`
|
|
||||||
- 后续运行:从 `build-resources/` 复制到 `~/.cache/`(秒级完成)
|
|
||||||
- `build-resources/` 在 `.gitignore` 中,不进 git(Electron 二进制 110MB 超 git 限制)
|
|
||||||
|
|
||||||
**自定义镜像**:
|
|
||||||
```bash
|
|
||||||
GITHUB_PROXY=https://gh-proxy.com/ bash restore-build-cache.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
## 详细步骤
|
|
||||||
|
|
||||||
### 1. 安装 Wine
|
|
||||||
|
|
||||||
```bash
|
|
||||||
dpkg --add-architecture i386
|
|
||||||
apt-get update
|
|
||||||
apt-get install -y wine wine32 p7zip-full
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2. 安装 npm 依赖
|
|
||||||
|
|
||||||
```bash
|
|
||||||
npm config set registry https://registry.npmmirror.com
|
|
||||||
npm install
|
|
||||||
```
|
|
||||||
|
|
||||||
### 3. 恢复构建缓存
|
|
||||||
|
|
||||||
```bash
|
|
||||||
bash restore-build-cache.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
首次会从镜像下载约 145MB 资源,后续构建只需秒级恢复。
|
|
||||||
|
|
||||||
### 4. 构建 Windows 安装包
|
|
||||||
|
|
||||||
```bash
|
|
||||||
ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ npm run dist
|
|
||||||
```
|
|
||||||
|
|
||||||
## 常用命令
|
|
||||||
|
|
||||||
```bash
|
|
||||||
npm start # 开发运行
|
|
||||||
npm run pack # 仅构建目录(不打包)
|
|
||||||
npm run dist:nsis # 仅 NSIS 安装包
|
|
||||||
npm run dist # NSIS 安装包
|
|
||||||
```
|
|
||||||
|
|
||||||
## 构建产物
|
|
||||||
|
|
||||||
| 文件 | 说明 |
|
|
||||||
|------|------|
|
|
||||||
| `release/Metona Ollama Setup v0.12.2.exe` | NSIS 安装包(可选目录、创建快捷方式) |
|
|
||||||
|
|
||||||
> 仅提供 NSIS 安装包。
|
|
||||||
|
|
||||||
## 发布到 Gitee
|
|
||||||
|
|
||||||
### 创建 Release
|
|
||||||
|
|
||||||
```bash
|
|
||||||
TOKEN="your_access_token"
|
|
||||||
curl -X POST "https://gitee.com/api/v5/repos/thzxx/metona-ollama-desktop/releases?access_token=$TOKEN" \
|
|
||||||
-H "Content-Type: application/json" \
|
|
||||||
-d '{"tag_name":"v0.12.2","name":"v0.12.2","body":"Release notes","target_commitish":"master"}'
|
|
||||||
```
|
|
||||||
|
|
||||||
### 上传附件
|
|
||||||
|
|
||||||
```bash
|
|
||||||
TOKEN="your_access_token"
|
|
||||||
RELEASE_ID="<release_id>"
|
|
||||||
curl -X POST "https://gitee.com/api/v5/repos/thzxx/metona-ollama-desktop/releases/$RELEASE_ID/attach_files?access_token=$TOKEN" \
|
|
||||||
-H "Content-Type: multipart/form-data" -F "file=@release/Metona Ollama Setup v0.12.2.exe"
|
|
||||||
```
|
|
||||||
|
|
||||||
## 故障排查
|
|
||||||
|
|
||||||
| 问题 | 解决方案 |
|
|
||||||
|------|----------|
|
|
||||||
| apt 源超时(mirrors.cloud.aliyuncs.com 不可达) | `sed -i 's\|mirrors.cloud.aliyuncs.com\|archive.ubuntu.com\|g' /etc/apt/sources.list && apt-get update` |
|
|
||||||
| npm install 卡住无输出 | 终止后重试 `npm install --prefer-offline`,通常首次已装大部分包,二次秒完成 |
|
|
||||||
| npmmirror 缺少 Electron 包(restore-build-cache.sh 失败,NoSuchKey) | npmmirror 可能未同步特定版本。跳过缓存脚本,直接 `npm run dist`,electron-builder 会自动从 npmmirror 下载(`ELECTRON_MIRROR` 环境变量生效) |
|
|
||||||
| electron-builder 报错 "wine is required" | Wine 是签名步骤的硬依赖,必须安装:`dpkg --add-architecture i386 && apt-get update && apt-get install -y wine wine32` |
|
|
||||||
| apt 源 i386 架构下载失败 | 先确保主源可用(切 archive.ubuntu.com),再 `apt-get update`,最后装 wine |
|
|
||||||
| Electron 下载超时 | 设 `ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/` 或直接用 `npm run dist`(electron-builder 自动处理) |
|
|
||||||
| NSIS/winCodeSign 下载超时 | `GITHUB_PROXY=https://gh-proxy.com/ bash restore-build-cache.sh` |
|
|
||||||
| winCodeSign 下载 EOF 错误(github.com 连接中断) | 手动下载并缓存(见下方) |
|
|
||||||
| npm install 时 Electron "socket hang up" | 设置 `ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/` 后重试 |
|
|
||||||
| restore-build-cache.sh 因 Electron 失败导致后续缓存全部跳过 | 跳过脚本,手动下载缺失资源(见下方) |
|
|
||||||
| "symbol already declared" | 检查 TS 文件中的重复 `const`/`let` 声明 |
|
|
||||||
|
|
||||||
### 手动下载构建缓存(逐项修复)
|
|
||||||
|
|
||||||
当 `restore-build-cache.sh` 部分失败时,可手动下载缺失资源:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
GITHUB_PROXY="https://ghfast.top/"
|
|
||||||
GITHUB_ORIG="https://github.com/electron-userland/electron-builder-binaries/releases/download"
|
|
||||||
CACHE="$HOME/.cache/electron-builder"
|
|
||||||
|
|
||||||
# winCodeSign(构建签名步骤硬依赖)
|
|
||||||
mkdir -p "$CACHE/winCodeSign"
|
|
||||||
wget -O "/tmp/winCodeSign-2.6.0.7z" \
|
|
||||||
"${GITHUB_PROXY}${GITHUB_ORIG}/winCodeSign-2.6.0/winCodeSign-2.6.0.7z"
|
|
||||||
cd "$CACHE/winCodeSign" && 7z x -y "/tmp/winCodeSign-2.6.0.7z" -o"winCodeSign-2.6.0"
|
|
||||||
|
|
||||||
# NSIS
|
|
||||||
mkdir -p "$CACHE/nsis"
|
|
||||||
wget -O "/tmp/nsis-3.0.4.1.7z" \
|
|
||||||
"${GITHUB_PROXY}${GITHUB_ORIG}/nsis-3.0.4.1/nsis-3.0.4.1.7z"
|
|
||||||
cd "$CACHE/nsis" && 7z x -y "/tmp/nsis-3.0.4.1.7z" -o"nsis-3.0.4.1"
|
|
||||||
|
|
||||||
# NSIS Resources
|
|
||||||
wget -O "/tmp/nsis-resources-3.4.1.7z" \
|
|
||||||
"${GITHUB_PROXY}${GITHUB_ORIG}/nsis-resources-3.4.1/nsis-resources-3.4.1.7z"
|
|
||||||
cd "$CACHE/nsis" && 7z x -y "/tmp/nsis-resources-3.4.1.7z" -o"nsis-resources-3.4.1"
|
|
||||||
|
|
||||||
# 清理临时文件
|
|
||||||
rm -f /tmp/winCodeSign-2.6.0.7z /tmp/nsis-3.0.4.1.7z /tmp/nsis-resources-3.4.1.7z
|
|
||||||
```
|
|
||||||
|
|
||||||
> Electron 无需手动下载——设置 `ELECTRON_MIRROR` 后 electron-builder 会自动处理。
|
|
||||||
|
|
||||||
### ⚠️ 已知问题:npmmirror 与 restore-build-cache.sh 兼容性
|
|
||||||
|
|
||||||
`restore-build-cache.sh` 第一步从 npmmirror 下载 Electron zip 时可能遇到 **NoSuchKey** 错误,因为 npmmirror 未同步该版本。此时脚本会因 `set -e` 直接退出,后续 NSIS/winCodeSign 缓存也不会恢复。
|
|
||||||
|
|
||||||
**推荐做法**:跳过 `restore-build-cache.sh`,直接执行:
|
|
||||||
```bash
|
|
||||||
ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ npm run dist
|
|
||||||
```
|
|
||||||
electron-builder 会自动处理所有依赖下载(Electron、NSIS、winCodeSign),虽然首次较慢(~5分钟),但无需手动管理缓存。
|
|
||||||
|
|
||||||
## 提速清单
|
|
||||||
|
|
||||||
| 环节 | 默认 → 加速 | 效果 |
|
|
||||||
|------|------------|------|
|
|
||||||
| apt 源 | aliyuncs → archive.ubuntu.com | 稳定 |
|
|
||||||
| npm | npmjs → npmmirror | ~17s |
|
|
||||||
| Electron | github → npmmirror | ~3s |
|
|
||||||
| NSIS/winCodeSign | github → ghfast + 本地缓存 | 秒级 |
|
|
||||||
@@ -1,147 +0,0 @@
|
|||||||
# Metona Ollama Desktop v1.1.0
|
|
||||||
|
|
||||||
> 本地 Ollama AI 桌面客户端 — 首个稳定版本
|
|
||||||
|
|
||||||
## 项目简介
|
|
||||||
|
|
||||||
Metona Ollama Desktop 是一个基于 **Ollama** 的本地 AI 桌面客户端,采用 TypeScript + Electron 构建。所有 AI 推理均在本地完成,数据不离开本机。支持 ReAct Agent Loop、42 个内置工具、智能记忆系统、MCP 协议扩展、四引擎联网搜索、浏览器控制等能力。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 核心功能
|
|
||||||
|
|
||||||
### 🤖 ReAct Agent Loop
|
|
||||||
- Thought → Action → Observation → Reflection 完整循环
|
|
||||||
- 默认最大 85 轮迭代,支持自动重试(最多 2 次)
|
|
||||||
- 工具调用去重机制:调用缓存 + 同轮重复检测 + 跨轮次重复检测
|
|
||||||
- 并行工具调用:互相独立的工具可在同一次回复中同时执行
|
|
||||||
- 链式工具调用:web_search → web_fetch、list_directory → read_file 等模式
|
|
||||||
- 文本解析兜底:当模型未通过 tool_calls 返回时,从文本中提取 Action/Input
|
|
||||||
|
|
||||||
### 🔧 42 个内置工具
|
|
||||||
|
|
||||||
| 分类 | 数量 | 工具 |
|
|
||||||
|------|------|------|
|
|
||||||
| 文件系统 | 17 | read_file, write_file, list_directory, search_files, create_directory, delete_file, move_file, copy_file, append_file, edit_file, get_file_info, tree, download_file, diff_files, replace_in_files, read_multiple_files, compress |
|
|
||||||
| 命令执行 | 1 | run_command(实时流式输出,工作空间终端集成) |
|
|
||||||
| 联网搜索 | 2 | web_search(Bing + 百度 + 搜狗 + 360搜索 四引擎), web_fetch |
|
|
||||||
| 浏览器控制 | 8 | browser_open, browser_screenshot, browser_evaluate, browser_extract, browser_click, browser_type, browser_scroll, browser_close |
|
|
||||||
| Git | 1 | git(init/clone/add/commit/push/pull/diff/log/status/branch/checkout/merge/stash/reset/tag/remote) |
|
|
||||||
| 记忆管理 | 4 | memory_search, memory_add, memory_replace, memory_remove |
|
|
||||||
| 会话管理 | 2 | session_list, session_read |
|
|
||||||
| 子代理 | 1 | spawn_task(独立上下文 + 超时保护) |
|
|
||||||
| 系统工具 | 6 | datetime / calculator / random / uuid / json_format / hash |
|
|
||||||
|
|
||||||
### 🧠 智能记忆系统
|
|
||||||
- **三类记忆**:fact(事实)、preference(偏好)、rule(规则,始终注入上下文)
|
|
||||||
- **双模式检索**:FTS5 全文搜索 + 向量语义搜索(IVF 索引)
|
|
||||||
- **安全扫描**:写入前检测 prompt injection、敏感信息泄露、不可见 Unicode 字符
|
|
||||||
- **容量管理**:上限 500 条,超限自动清理低价值条目(rule 类型受保护)
|
|
||||||
- **过期衰减**:90 天未使用的记忆自动降低 importance
|
|
||||||
|
|
||||||
### 🌐 MCP 协议支持
|
|
||||||
- JSON-RPC 2.0 over stdio 标准协议
|
|
||||||
- 动态工具发现与执行
|
|
||||||
- Shadowing 防护(防止 MCP 工具覆盖内置工具名)
|
|
||||||
- 60 秒请求超时保护
|
|
||||||
|
|
||||||
### 🔍 四引擎联网搜索
|
|
||||||
- Bing + 百度 + 搜狗 + 360搜索 四引擎聚合
|
|
||||||
- web_search 返回标题、URL、摘要(默认 15 条)
|
|
||||||
- web_fetch 支持网页内容抓取(默认不截断)
|
|
||||||
- 工具链规则:搜索后自动引导抓取详情
|
|
||||||
|
|
||||||
### 🖥️ 工作空间面板
|
|
||||||
- 终端(实时流式输出)+ 文件浏览器一体化
|
|
||||||
- AI 通过 run_command 工具执行命令,输出实时显示
|
|
||||||
- 命令安全检查:路径黑名单 + 命令黑名单 + 三种执行模式
|
|
||||||
|
|
||||||
### 🎨 Token 实时监控仪表盘
|
|
||||||
- 全局统计(跨会话累计 Token 分析)和当前会话统计双视图
|
|
||||||
- Token 消耗趋势图(输入/输出分色显示)
|
|
||||||
- 2 秒自动刷新
|
|
||||||
|
|
||||||
### 🔒 安全机制
|
|
||||||
- 文件路径安全检查(checkPathAllowed)
|
|
||||||
- 命令执行安全检查(checkCommandAllowed)
|
|
||||||
- 前端 HTML 净化器(白名单标签 + 属性过滤 + URI 协议检查)
|
|
||||||
- contextIsolation: true + IPC 白名单
|
|
||||||
- AES-256-GCM 加密支持
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 技术架构
|
|
||||||
|
|
||||||
```
|
|
||||||
用户消息 → Agent Loop(ReAct)
|
|
||||||
↓
|
|
||||||
记忆检索(FTS5 + 向量搜索)→ 上下文注入
|
|
||||||
↓
|
|
||||||
Ollama API(流式响应)
|
|
||||||
↓
|
|
||||||
工具调用(39 内置 + MCP 动态)
|
|
||||||
↓
|
|
||||||
观察结果 → 反思 → 循环/最终回答
|
|
||||||
```
|
|
||||||
|
|
||||||
### 数据层
|
|
||||||
- **SQLite (sql.js WASM)**:6 张表(sessions, messages, tool_calls, memories, settings, traces)
|
|
||||||
- **FTS5 全文搜索**:memories 表支持全文检索
|
|
||||||
- **WAL 模式 + NORMAL 同步**:零原生依赖,无需 electron-rebuild
|
|
||||||
|
|
||||||
### 上下文管理(v5.0)
|
|
||||||
- 三层策略:滑动窗口 + LLM 摘要压缩 + 记忆注入
|
|
||||||
- `/compress` 手动触发上下文压缩
|
|
||||||
- 自动压缩阈值:消息 token 占 context window 50% 时触发
|
|
||||||
- Token 估算:中文 1.5 字/token,英文 4 字符/token
|
|
||||||
|
|
||||||
### 技术栈
|
|
||||||
| 层级 | 技术 |
|
|
||||||
|------|------|
|
|
||||||
| 语言 | TypeScript (strict mode) |
|
|
||||||
| 桌面框架 | Electron 33+ |
|
|
||||||
| 构建 | Vite(渲染进程)+ tsc(主进程) |
|
|
||||||
| 数据库 | sql.js (WASM) + FTS5 |
|
|
||||||
| 第三方库 | marked(Markdown), DOMPurify(HTML 净化) |
|
|
||||||
| 打包 | electron-builder (NSIS) |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 最近改进
|
|
||||||
|
|
||||||
- **`/compress` 上下文压缩**:支持手动触发 LLM 摘要压缩,长对话不再丢失上下文
|
|
||||||
- **Token 全局统计**:仪表盘新增跨会话累计 Token 分析视图
|
|
||||||
- **图表重写**:Token 消耗趋势图重写 — 网格线 + 正确高度计算 + 柱子底部对齐
|
|
||||||
- **Agent Loop 稳定性**:修复 abortController 在自动压缩前未定义的严重 bug
|
|
||||||
- **工具调用修复**:修复工具卡片状态更新、错误信息显示、执行中状态残留等问题
|
|
||||||
- **消息渲染修复**:修复用户消息不显示、AI 消息时间戳、思考气泡残留等 UI 问题
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 系统要求
|
|
||||||
|
|
||||||
- **操作系统**:Windows 10/11(64 位)
|
|
||||||
- **Ollama**:需要本地运行 Ollama 服务(默认 http://localhost:11434)
|
|
||||||
- **磁盘空间**:安装包约 82MB,运行时根据模型大小需要额外空间
|
|
||||||
- **内存**:建议 8GB+(取决于使用的 AI 模型)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 安装说明
|
|
||||||
|
|
||||||
1. 下载 `Metona Ollama Setup v1.1.0.exe`
|
|
||||||
2. 运行安装程序,可自定义安装目录
|
|
||||||
3. 确保本地已安装并运行 [Ollama](https://ollama.com)
|
|
||||||
4. 启动 Metona Ollama,在设置中配置 Ollama 服务地址
|
|
||||||
5. 选择模型,开始对话
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 已知限制
|
|
||||||
|
|
||||||
- 仅支持 Windows x64 平台
|
|
||||||
- 需要本地运行 Ollama 服务,不支持远程 Ollama 服务器(后续版本考虑支持)
|
|
||||||
- 浏览器控制工具依赖系统 Chromium,部分 SPA 页面抓取可能不完整
|
|
||||||
- 向量搜索需要配置嵌入模型(embedding model),未配置时仅支持关键词搜索
|
|
||||||
- MCP 工具目前仅支持 stdio 传输方式
|
|
||||||
- 子代理(spawn_task)为独立上下文,无法共享主对话记忆
|
|
||||||
@@ -1,97 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# restore-build-cache.sh
|
|
||||||
# 从 build-resources/ 恢复 electron-builder 缓存,加速构建
|
|
||||||
# 如果本地资源不存在,自动从镜像下载
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
||||||
CACHE_ELECTRON="$HOME/.cache/electron"
|
|
||||||
CACHE_BUILDER="$HOME/.cache/electron-builder"
|
|
||||||
LOCAL="$SCRIPT_DIR/build-resources"
|
|
||||||
|
|
||||||
ELECTRON_MIRROR="${ELECTRON_MIRROR:-https://npmmirror.com/mirrors/electron/}"
|
|
||||||
GITHUB_PROXY="${GITHUB_PROXY:-https://ghfast.top/}"
|
|
||||||
GITHUB_ORIG="https://github.com/electron-userland/electron-builder-binaries/releases/download"
|
|
||||||
|
|
||||||
ELECTRON_VERSION="33.4.11"
|
|
||||||
NSIS_VERSION="3.0.4.1"
|
|
||||||
NSIS_RES_VERSION="3.4.1"
|
|
||||||
WINCODESIGN_VERSION="2.6.0"
|
|
||||||
|
|
||||||
echo "===== 恢复构建缓存 ====="
|
|
||||||
|
|
||||||
ELECTRON_FILE="electron-v${ELECTRON_VERSION}-win32-x64.zip"
|
|
||||||
mkdir -p "$CACHE_ELECTRON"
|
|
||||||
if [ -f "$LOCAL/electron/$ELECTRON_FILE" ]; then
|
|
||||||
echo "[1/4] Electron ← 本地缓存"
|
|
||||||
cp "$LOCAL/electron/$ELECTRON_FILE" "$CACHE_ELECTRON/"
|
|
||||||
elif [ -f "$CACHE_ELECTRON/$ELECTRON_FILE" ]; then
|
|
||||||
echo "[1/4] Electron ← 缓存已存在"
|
|
||||||
else
|
|
||||||
echo "[1/4] Electron ← 下载 ${ELECTRON_MIRROR}${ELECTRON_FILE}"
|
|
||||||
mkdir -p "$LOCAL/electron"
|
|
||||||
wget -q --show-progress -O "$CACHE_ELECTRON/$ELECTRON_FILE" "${ELECTRON_MIRROR}${ELECTRON_FILE}"
|
|
||||||
cp "$CACHE_ELECTRON/$ELECTRON_FILE" "$LOCAL/electron/"
|
|
||||||
fi
|
|
||||||
|
|
||||||
mkdir -p "$CACHE_BUILDER/nsis"
|
|
||||||
NSIS_DIR="$CACHE_BUILDER/nsis/nsis-${NSIS_VERSION}"
|
|
||||||
if [ -d "$LOCAL/electron-builder/nsis-${NSIS_VERSION}" ]; then
|
|
||||||
echo "[2/4] NSIS ${NSIS_VERSION} ← 本地缓存"
|
|
||||||
cp -r "$LOCAL/electron-builder/nsis-${NSIS_VERSION}" "$NSIS_DIR"
|
|
||||||
elif [ -d "$NSIS_DIR" ]; then
|
|
||||||
echo "[2/4] NSIS ${NSIS_VERSION} ← 缓存已存在"
|
|
||||||
else
|
|
||||||
echo "[2/4] NSIS ${NSIS_VERSION} ← 下载"
|
|
||||||
mkdir -p "$LOCAL/electron-builder"
|
|
||||||
wget -q --show-progress -O "/tmp/nsis-${NSIS_VERSION}.7z" \
|
|
||||||
"${GITHUB_PROXY}${GITHUB_ORIG}/nsis-${NSIS_VERSION}/nsis-${NSIS_VERSION}.7z"
|
|
||||||
cd "$CACHE_BUILDER/nsis"
|
|
||||||
7z x -y "/tmp/nsis-${NSIS_VERSION}.7z" -o"nsis-${NSIS_VERSION}" >/dev/null
|
|
||||||
rm -f "/tmp/nsis-${NSIS_VERSION}.7z"
|
|
||||||
cp -r "$NSIS_DIR" "$LOCAL/electron-builder/"
|
|
||||||
cd "$SCRIPT_DIR"
|
|
||||||
fi
|
|
||||||
|
|
||||||
NSIS_RES_DIR="$CACHE_BUILDER/nsis/nsis-resources-${NSIS_RES_VERSION}"
|
|
||||||
if [ -d "$LOCAL/electron-builder/nsis-resources-${NSIS_RES_VERSION}" ]; then
|
|
||||||
echo "[3/4] NSIS Resources ${NSIS_RES_VERSION} ← 本地缓存"
|
|
||||||
cp -r "$LOCAL/electron-builder/nsis-resources-${NSIS_RES_VERSION}" "$NSIS_RES_DIR"
|
|
||||||
elif [ -d "$NSIS_RES_DIR" ]; then
|
|
||||||
echo "[3/4] NSIS Resources ${NSIS_RES_VERSION} ← 缓存已存在"
|
|
||||||
else
|
|
||||||
echo "[3/4] NSIS Resources ${NSIS_RES_VERSION} ← 下载"
|
|
||||||
mkdir -p "$LOCAL/electron-builder"
|
|
||||||
wget -q --show-progress -O "/tmp/nsis-resources-${NSIS_RES_VERSION}.7z" \
|
|
||||||
"${GITHUB_PROXY}${GITHUB_ORIG}/nsis-resources-${NSIS_RES_VERSION}/nsis-resources-${NSIS_RES_VERSION}.7z"
|
|
||||||
cd "$CACHE_BUILDER/nsis"
|
|
||||||
7z x -y "/tmp/nsis-resources-${NSIS_RES_VERSION}.7z" -o"nsis-resources-${NSIS_RES_VERSION}" >/dev/null
|
|
||||||
rm -f "/tmp/nsis-resources-${NSIS_RES_VERSION}.7z"
|
|
||||||
cp -r "$NSIS_RES_DIR" "$LOCAL/electron-builder/"
|
|
||||||
cd "$SCRIPT_DIR"
|
|
||||||
fi
|
|
||||||
|
|
||||||
WINCS_DIR="$CACHE_BUILDER/winCodeSign/winCodeSign-${WINCODESIGN_VERSION}"
|
|
||||||
if [ -d "$LOCAL/electron-builder/winCodeSign-${WINCODESIGN_VERSION}" ]; then
|
|
||||||
echo "[4/4] winCodeSign ${WINCODESIGN_VERSION} ← 本地缓存"
|
|
||||||
mkdir -p "$CACHE_BUILDER/winCodeSign"
|
|
||||||
cp -r "$LOCAL/electron-builder/winCodeSign-${WINCODESIGN_VERSION}" "$WINCS_DIR"
|
|
||||||
elif [ -d "$WINCS_DIR" ]; then
|
|
||||||
echo "[4/4] winCodeSign ${WINCODESIGN_VERSION} ← 缓存已存在"
|
|
||||||
else
|
|
||||||
echo "[4/4] winCodeSign ${WINCODESIGN_VERSION} ← 下载"
|
|
||||||
mkdir -p "$LOCAL/electron-builder"
|
|
||||||
mkdir -p "$CACHE_BUILDER/winCodeSign"
|
|
||||||
wget -q --show-progress -O "/tmp/winCodeSign-${WINCODESIGN_VERSION}.7z" \
|
|
||||||
"${GITHUB_PROXY}${GITHUB_ORIG}/winCodeSign-${WINCODESIGN_VERSION}/winCodeSign-${WINCODESIGN_VERSION}.7z"
|
|
||||||
cd "$CACHE_BUILDER/winCodeSign"
|
|
||||||
7z x -y "/tmp/winCodeSign-${WINCODESIGN_VERSION}.7z" -o"winCodeSign-${WINCODESIGN_VERSION}" >/dev/null
|
|
||||||
rm -f "/tmp/winCodeSign-${WINCODESIGN_VERSION}.7z"
|
|
||||||
cp -r "$WINCS_DIR" "$LOCAL/electron-builder/"
|
|
||||||
cd "$SCRIPT_DIR"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
echo "===== 缓存恢复完成 ====="
|
|
||||||
echo "现在可以运行: ELECTRON_MIRROR=$ELECTRON_MIRROR npm run dist"
|
|
||||||
Reference in New Issue
Block a user