Skip to content

🔥 移除 Wiki 知识库功能 - #432

Merged
CavinHuang merged 13 commits into
mainfrom
feat/remove-wiki-feature
Aug 22, 2026
Merged

🔥 移除 Wiki 知识库功能#432
CavinHuang merged 13 commits into
mainfrom
feat/remove-wiki-feature

Conversation

@CavinHuang

Copy link
Copy Markdown
Owner

概述

整体移除 Wiki 受保护知识库功能:数据域、Agent 工具面、特权写入通道、桌面与 Web UI 全链路下线。

删除范围

功能本体

  • services/wiki 服务域:页面存储(ownership marker / provenance 来源库 / staging 草案协调器)、混合检索索引、lint 与语义健康、ACL、能力矩阵与 OS 沙箱探针
  • Agent 工具:wiki.search / wiki.read / wiki.follow_links / wiki.propose_changes,及 agent-wiki 默认技能
  • 保护根策略(唯一保护对象即 Wiki 根)及网关、工具包装接线
  • Web:Wiki 三栏工作台、聊天内提案确认卡、quoted-selection wiki 采集源
  • Desktop:五个 desktop_wiki_* 特权命令、wiki:privileged-* RPC、打包冒烟探活链

保留并通用化

  • 安全抓取服务迁至 services/infra/safe-http-fetch.ts(IM 媒体下载继续复用)
  • 特权凭证门迁至 services/infra/privileged-auth.ts,注入 method 更名 system.privileged-credential,插件包特权通道沿用同一凭证机制

验证

  • bun run typecheck 六包全绿(shared / ui / agent-sdk / sidecar / web / desktop)
  • shared 179 测试、desktop 277 测试全过;web 40 个测试批次 0 fail
  • sidecar 定向回归(tools / im / node-repl / gateway / permissions / settings / skills / mcp / runtime-core / runner)全部通过,1 例时序 flaky 复跑归零并与 main 基线一致
  • 打包校验与冒烟脚本语法检查通过

🤖 Generated with Claude Code

TaTaLiao and others added 7 commits August 22, 2026 18:10
- 删除 types/wiki.ts(页面/来源/草案/批次/能力矩阵/IPC 通道全量类型)
- AgentThreadMeta 移除 wikiProfile 签发字段
- renderer allowlist 移除 WIKI_IPC_CHANNELS
- 数据管理业务数据分组移除 wiki 扫描项

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- WikiSafeHttpFetchService → SafeHttpFetchService(IM 媒体下载继续复用)
- Wiki 特权凭证门 → 通用 privileged-auth(插件包特权通道沿用同一凭证)
- 凭证注入 method 更名 system.privileged-credential

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- services/wiki 全域:页面存储(ownership marker/provenance/staging 协调器/
  混合检索/lint/语义健康/ACL/能力矩阵与沙箱探针)
- wiki.search/read/follow_links/propose_changes 工具、agent-wiki 技能与
  保护根策略(唯一保护对象即 Wiki 根)
- web Wiki 视图三栏工作台与聊天内提案确认卡

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- runner 不再解析 Wiki 沙箱能力矩阵,查询回归无沙箱缺省
- ask-wiki 会话专用分支(插件/MCP 隔离、工具分组)收敛为单一通路
- 工具注入移除 wiki 工具组与提案开关透传;node-repl 子进程环境清理对应凭证项
- 线程元数据、项目销毁序列、向量索引清理、记忆提示词与技能清单同步去 Wiki 化

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- 主进程删除五个 desktop_wiki_* 命令与 wiki:privileged-* 转发
- 凭证生命周期保留并更名 privilegedCredential(插件包特权通道沿用)
- electron-security allowlist、IPC contract 同步收缩
- 打包产物校验与 utility sidecar 冒烟脚本移除 Wiki 探活链

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Lume 特性导航移除 Wiki 页签,quoted-selection 移除 wiki 采集源
- 聊天流移除 wiki_proposal 分组与确认卡渲染分支
- desktop-api 移除 Wiki 通道封装;容器查询样式清理
- SDK 公网判定注释去除过时出处说明

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
自审发现:移除 Wiki Phase B 沙箱接线时误将 per-session disposeWorkspace
改为对全局单例无条件执行,并发会话会互拆共享的 MCP 连接。
恢复原语义——仅 transient manager(pluginMcpManager)需要会话级清理。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@CavinHuang

Copy link
Copy Markdown
Owner Author

🔍 自审 Review(PR 作者自查)

逐文件过了一遍 main...feat/remove-wiki-feature 全量 diff,重点核对每处"简化分支"是否等价还原了原非 Wiki 路径的语义。

🐛 发现 1 个 must-fix,已修复(51aa8e2db)

run.ts 会话清理误伤进程级 WorkspaceMCP 单例。
原代码里 per-session disposeWorkspace 只作用于 Wiki Phase B 的 transient 沙箱 manager(new WorkspaceMcpManager(...),会话独占);非沙箱路径用的是进程级单例且从不做会话级 dispose。我删除沙箱接线时把条件一并删掉,变成所有带 workspace 的会话结束都向全局单例发 disposeWorkspace——它会 state.sdk.dispose() 并从 map 删除,并发使用同一 workspace 的其他线程会被互拆共享 MCP 连接

修复:两处(pendingCleanup 与 session dispose 路径)恢复"单例不做会话级清理"的原语义;每次会话新建的 transient pluginMcpManager 的清理保留不动。

✅ 逐项排查确认无误

  • lume-runner.ts:普通会话原本就只拿 createWikiProtectedSandbox()(仅 deny Wiki 根、无 processIsolation),processSandbox?.processIsolation?.enabled 恒 false → 删除后对普通会话零行为变化;Phase B 进程隔离随功能整体消失,符合移除意图。
  • run.ts 其余简化askWikiOnly 三处分支(pluginMcpRuntime / cleanup / 工具分组)在无 ask-wiki 会话后与无条件执行等价;buildPluginAgentHooks.sandboxstdioSandbox 在非 Phase B 路径本来就恒 undefined。
  • 凭证门迁移assertPrivilegedCredential 仍被插件包特权通道(PREPARE/FINALIZE/REVOKE)复用;electron-security allowlist 同步更新为新 method 名;错误码更名后全仓无字符串匹配依赖。
  • smoke-utility-sidecar.mjs:行级摘除后重读全文,finishWhenHealthy 收敛为 sidecar + XHR 双条件,id 2–6 探活链与 credential 注入无残留引用。
  • 打包校验脚本:孤儿函数 listTarEntries/readTarEntry 已随唯一调用方一起删除。
  • quoted-selection / LumeView:持久化的 'wiki' 值经 normalizeContextSourceType 回落 agent-history、localStorage 特性选择回落 reading,旧数据安全降级。
  • safe-http-fetch 迁移:仅改名+文案,DNS 校验/固定 IP 连接/代理 fail-closed 逻辑未动;IM 调用点行为不变(UA 由 Lume-Wiki/1 更名 Lume-Fetch/1,对外可见但无语义影响)。
  • 测试 fixture 误报排除wikipedia/wikidata scraper、sdk agent.test.ts 的 agent-wiki skill fixture、grep-result.test / "D:/wiki" 等任意测试路径均与本功能无关,未动。

⚖️ 已知取舍(有意为之)

  1. verify-desktop-package-artifacts.mjs 对 default-skills.tar 只校验存在性,不再校验其中 agent-wiki 技能文本(该段本就是 Wiki 专属校验)。
  2. ~/.lume/wiki 用户数据目录成为孤儿:代码层不删用户数据;后续如需清理可在数据管理中手动处理。
  3. 主进程日志 tag desktop.wiki.securitydesktop.sidecar.security(若有按 tag 过滤的日志面板需知晓)。

🧪 验证(修复后)

  • typecheck 六包全绿
  • workspace-mcp-manager / run.delegate / lume-runner 测试全绿
  • shared 179 ✓ · desktop 277 ✓ · web 40 批次 0 fail
  • run.test.ts 按基线判定法对照:分支 7 fail vs main 基线 8 fail(本地/worktree 既有环境噪声,分支不多不少)

@CavinHuang

Copy link
Copy Markdown
Owner Author

Code Review

对 138 文件做了全量删除面核查(含临时 worktree 全量验证)。功能删除本身质量很高:无悬空引用、无误删无关功能、迁移完整。但有两个 P1 阻塞项需处理后才能合。

重点核查项(全部通过)

  • wikipedia scraper 未被误删 ✅:packages/sdk/src/tools/web/scrapers/wikipedia.tswikidata.ts 完好保留,它是 web 搜索抓取器,与 wiki 知识库无关
  • safe-fetch 迁移语义等价 ✅:新 services/infra/safe-http-fetch.ts 与旧实现逐段对比仅命名/文案变化;DNS 全公网校验、固定 IP 连接、fake-IP 放行、重定向上限、代理双策略全保留;唯一调用方 IM 媒体下载已接新路径
  • 特权凭证门迁移完整、三方对齐 ✅:sidecar 安装侧、消费侧三处 assert、desktop 注入侧、安全 allowlist 全部对齐新 method 名 system.privileged-credential;旧符号全仓零残留
  • protected-root-policy 链路自洽删除 ✅:其唯一保护对象即 wiki 根,四处接线同删;processSandbox 唯一来源就是 wikiCapability.sandbox,属本体删除非误伤
  • UI/入口删干净 ✅:源码层仅剩 textmate scope wikiword.xi(高亮数据,无关);LumeView.tsx 对 localStorage 遗留 'wiki' 值正确回落
  • run.ts dispose 回归已自修 ✅:旧 commit 曾把会话 cleanup 从 if (workspaceSlug && processIsolation.enabled) 放宽为 if (workspaceSlug)(会拆掉全局 MCP 单例),51aa8e2db 已恢复原语义,逐行核对与 main 等价

阻塞项

[P1] 54 个测试残留文件被误提交进分支,含二进制 sqlite

  • 位置:apps/sidecar/.tmp-test-config-34256-*/(已验证 git ls-tree 计数 = 54);根因 apps/sidecar/scripts/run-unit-tests.mjs:52仓库目录内创建 LUME_CONFIG_DIR.tmp-test-config-<pid>-<n>)且正常路径不清理
  • 内容含 lume.yaml、memory config、interruptions/*.json、plugins-audit.jsonl 及 6 个二进制 planning.sqlite/-shm/-wal。PR 的 +1726 行中相当比例是这批垃圾。已抽查无密钥泄露。.gitignore 无任何 .tmp-test-config 规则。
  • 建议:分支上 git rm -r apps/sidecar/.tmp-test-config-*.gitignore.tmp-test-config-*;顺手让 run-unit-tests.mjs 退出时清理或把目录移到 os.tmpdir()(防复发)。

[P1] CI 红灯对应旧 commit,且 web/ui 批次从未在该 PR 上执行过

  • CI run 32567015646 的 headSha 是 2d70b4cd3,非当前 head 51aa8e2db。失败点是 sidecar run.test.ts 某用例 7ms 断言失败;test:core&& 链,sidecar 失败后 web/ui 批次被短路,从未跑过
  • 我在 head worktree 复跑整个 run.test.ts 47/47 全绿,无法复现,与 PR 描述「时序 flaky」说法一致但未获证实(7ms 断言失败不像超时类 flaky)。shared 179、agent-sdk、web、ui 本地补跑均 0 fail,typecheck 六包全绿。
  • 建议:清除残留文件后 push 并重跑 CI;若再挂同一用例需留日志定位。

非阻塞

[P2] 存量 wiki 数据孤儿化:升级用户磁盘数据无任何清理/导出途径

  • wiki 页面持久化在 configDir/wiki/(页面 md + 向量索引 + ACL + trash)。本 PR 同时移除了三条触达它的路径:数据管理 scanPaths 删去 "wiki"data-management.ts:87)、vectorIndex 缓存清理删去该路径(general-settings-service.ts:296)、assertSafeCacheTarget 白名单删去同路径(:318)。老用户升级后 wiki 数据永久残留磁盘,UI 不扫描不导出不重置。
  • 建议:最小改法是 vectorIndex 缓存清理继续覆盖 configDir/wiki/.lume/index(一行白名单+一行路径),或发布说明中明确指引手动删除 configDir/wiki

结论

删除干净、迁移完整,是一次高质量的减法 PR。清除 54 个残留文件 + 最新 head 重跑 CI(补验 web/ui 批次)后可合;wiki 孤儿数据建议至少留一条缓存清理路径。

- git rm 54 个 .tmp-test-config-* 残留文件(含 sqlite 二进制,review P1)
- run-unit-tests.mjs 的 LUME_CONFIG_DIR 从仓库内移至 os.tmpdir(),防复发
- .gitignore 增加 .tmp-test-config-*/ 规则
@CavinHuang

Copy link
Copy Markdown
Owner Author

阻塞项处置

P1-1(测试残留)已直接修复并推送:

  • git rm 全部 54 个 .tmp-test-config-* 残留文件(-1634 行)
  • run-unit-tests.mjsLUME_CONFIG_DIR 移至 os.tmpdir()(防复发)
  • .gitignore 增加 .tmp-test-config-*/ 规则

P1-2(CI 旧 commit):当前 head 已全绿 6/6。本次 push 后等新一轮 CI 跑完即可合并。

P2 wiki 孤儿数据 维持非阻塞,建议按原 review 意见留一条缓存清理路径或发布说明指引。

@CavinHuang
CavinHuang merged commit 33e617b into main Aug 22, 2026
6 checks passed
CavinHuang pushed a commit that referenced this pull request Aug 22, 2026
link/wiki 两家族已随功能移除删除(#418/#432),残存的手写 asObject/asString 校验仅剩 channel 家族:DECRYPT_KEY/TEST/SYNC_MODELS/OAUTH_* 全部迁入 schemas.ts 严格 schema,接受/拒绝面与迁移前一致(OAUTH_CANCEL 缺 sessionId 仍为静默 no-op),新增边界 case 单测。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
CavinHuang pushed a commit that referenced this pull request Aug 22, 2026
link/wiki 两家族已随功能移除删除(#418/#432),残存的手写 asObject/asString 校验仅剩 channel 家族:DECRYPT_KEY/TEST/SYNC_MODELS/OAUTH_* 全部迁入 schemas.ts 严格 schema,接受/拒绝面与迁移前一致(OAUTH_CANCEL 缺 sessionId 仍为静默 no-op),新增边界 case 单测。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
CavinHuang added a commit that referenced this pull request Aug 23, 2026
…468)

* 🐛 fix(sidecar): Retry-After 解析收敛至 SDK 导出——sidecar 传输层去重实现

parseRetryAfterHeader/computeRetryDelay/120s 硬上限补进 @lume/agent-sdk 导出面;pi-ai-provider 删除本地重复解析,改用共享实现(delta-seconds 与 HTTP-date 双格式行为不变,SDK retry.test.ts 已覆盖验收格式与 clamp)。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* 🔥 chore(sidecar): 拆除 prompt 组装假抽象与零消费预算比例

composePromptSections/PromptSection/PromptSectionMode 全仓仅自测试引用,连同 context-budget.ts 的 DEFAULT_CONTEXT_BUDGET 一并删除;context-assembler 保留指纹 trace,budget 元数据收敛为真实 tokenBudget 总额。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* ♻️ refactor(sidecar): channel handlers 入参校验统一 zod,终结 RPC 校验双轨制

link/wiki 两家族已随功能移除删除(#418/#432),残存的手写 asObject/asString 校验仅剩 channel 家族:DECRYPT_KEY/TEST/SYNC_MODELS/OAUTH_* 全部迁入 schemas.ts 严格 schema,接受/拒绝面与迁移前一致(OAUTH_CANCEL 缺 sessionId 仍为静默 no-op),新增边界 case 单测。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* 🐛 fix(sidecar): Retry-After clamp 统一 120s——复用 sdk computeRetryDelay 消除双 cap 并存

依据 issue #422 验收口径:clamp 120s,与 sdk withRetry 的 MAX_RETRY_AFTER_DELAY_MS 一致。

---------

Co-authored-by: Leo <huangchunmao1993@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants