故障排查

WesCraft 使用过程中常见问题的排查指南。

Go 后端启动失败

检查日志

WesCraft Go 后端日志位于 XDG 数据目录下:

# macOS
~/Library/Application Support/wescraft/logs/

# Linux
~/.local/share/wescraft/logs/

常见原因

症状可能原因解决方案
进程立即退出配置文件缺失运行 wescraft init 创建默认配置
端口冲突:3100 被占用检查端口占用或修改配置
数据目录不可写权限问题检查目录权限
Provider 加载失败API Key 无效检查 config.yaml 中的 Provider 配置

配置文件位置

# 配置目录
$XDG_CONFIG_HOME/wescraft/config.yaml

# 环境变量覆盖
WESCRAFT_DATA_DIR    # 数据目录
WESCRAFT_CONFIG      # 配置文件路径

初始化修复

# 重新初始化配置
wescraft init

# 检查配置是否有效
cat ~/.config/wescraft/config.yaml

FileIntelligence 索引异常

检查关注目录

FileIntelligence 的关注目录列表存储在 per-cell 的 wc_watched_paths 表中:

-- 检查当前 Cell 的关注目录
SELECT * FROM wc_watched_paths WHERE cell_id = 'personal';

索引不更新

  1. 检查 fsnotify 事件:确认文件变更事件是否被正确捕获
  2. 检查索引 DB:目前索引仍在共享 wescraft.db 中
  3. 手动触发重建:通过设置页面的"重建索引"按钮

清理已删除文件的索引

// PruneDeleted() 清理磁盘已删文件的残留索引(修复 R-4)
fileintel.PruneDeleted()

如果索引中出现"幽灵文件"(磁盘已删但索引残留),等待下次自动扫描或手动触发 PruneDeleted()。

路径校验失败

如果出现路径校验错误,可能是符号链接问题(修复 W-1):

// PathValidator 使用 filepath.EvalSymlinks 解析真实路径
// 使用 os.UserHomeDir() 而非 filepath.Abs("~") 展开 home

macOS 上 /var → /private/var 的符号链接可能导致路径不匹配。

知识管线不工作

检查 Pipeline 触发

知识管线使用 time.AfterFunc + per-pageID timer(修复 R-3),不再使用 go func() { sleep(5s) }:

// 正确的触发方式:每个 pageID 一个 timer,防止 goroutine 爆炸
pipeline.Trigger(pageID)  // 内部使用 time.AfterFunc

查看每 Stage 日志

# 每个 Stage 完成后都有 slog.Info 日志
grep "knowledge.pipeline" ~/Library/Application\ Support/wescraft/logs/*.log

常见问题

阶段症状排查
Stage 1 采集内容未被采集检查来源连接(扩展/文件/URL)
Stage 3 分块分块异常检查文件格式是否支持
Stage 4 索引搜索无结果检查 FTS5 索引状态
Stage 5 标签标签不准检查 AI 模型连接
Stage 6 关联无关联需要足够的内容量

AI 交互无响应

步骤一:检查 Provider 配置

# 测试 Provider 连通性
POST /cells/{cellID}/providers/test
{
  "mode": "chat"  // chat / embedding / vision
}

步骤二:检查 Agent 配置

# 列出已注册的 Agent
GET /cells/{cellID}/agents

步骤三:检查 Cell 状态

确认当前 activeCell 是否正常运行,检查 Cell 温度状态(Hot/Warm/Cool/Cold)。

步骤四:检查模型配置

确认 config.yaml 中的模型声明包含 ContextWindow 字段:

providers:
  - name: my-provider
    type: openai
    models:
      - name: gpt-4o
        context_window: 128000  # 必须声明

浏览器扩展不工作

排查清单

  1. 扩展已安装:在浏览器扩展管理页面确认扩展已启用
  2. 后端运行中:确认 WesCraft 桌面端正在运行(检查 :3100 端口)
  3. 网络连接:确认浏览器能访问 http://localhost:3100
  4. 权限授予:确认扩展已获得必要权限
  5. Content Security Policy:某些网站的 CSP 策略可能阻止扩展注入

手动测试

# 检查后端是否可达
curl http://localhost:3100/health

页面删除不彻底

问题描述

删除页面后,子页面和版本记录可能残留(修复 R-1)。

正确的删除流程

// 递归 SoftDeletePage 子页面
// PurgePage 同时删除 wc_page_versions
contentEngine.DeletePage(ctx, pageID)
// 内部递归:
// 1. SoftDeletePage(pageID) — 标记当前页面
// 2. SoftDeletePage(childIDs...) — 递归标记子页面
// 3. PurgePage — 物理删除 + 清理 wc_page_versions

手动清理

如果发现残留数据,可以在设置中使用"数据库维护"功能清理孤儿记录。

搜索结果不全

WesCraft 有三种搜索源,需要分别检查:

搜索源索引方式检查方式
FTS5 全文搜索SQLite FTS5 虚拟表检查 FTS5 trigger 和索引完整性
FileIntelligence本地文件索引检查关注目录和索引更新
语义搜索Embedding 向量检查 Embedding Provider 是否配置

重建搜索索引

// per-boot 安全网:RebuildFTS
store.RebuildFTS()

SavePage 错误被静默

问题描述

早期版本中 SyncPageFTS 和 saveVersion 的错误被 _ 忽略(修复 R-2)。

现在的行为

// 错误通过 slog.Warn 输出,不再静默忽略
if err := store.SyncPageFTS(ctx, pageID); err != nil {
    slog.Warn("sync page FTS failed", "page_id", pageID, "error", err)
}
if err := store.saveVersion(ctx, pageID, content); err != nil {
    slog.Warn("save version failed", "page_id", pageID, "error", err)
}

如果在日志中看到这些警告,说明 FTS 同步或版本保存有问题,需要检查数据库状态。

数据迁移问题

INV-MIGRATE-01 机制

WesCraft 使用 MigrationStep 管理 schema 变更:

// internal/store/appdb_migrations.go
// 每步一个事务:DDL + PRAGMA user_version = N + commit
// 步骤编号从 1 开始连续递增

迁移失败的降级策略

1. 迁移步骤失败
2. → 关闭 DB
3. → 归档旧文件为 .migration-failed
4. → 清除 -wal / -shm
5. → 重新打开全新 DB
6. → 再次执行完整迁移链
7. → 第二次失败才返回 fatal error

代价:丢失页面、数据库、采集箱、任务、文件索引等数据。远好过启动崩溃。

手动修复

如果自动迁移失败,可以:

  1. 备份 wescraft.db 文件
  2. 删除数据库文件
  3. 重启 WesCraft(自动创建新库)
  4. 从备份中手动恢复需要的数据