docs/backend-migration/plans/2026-05-12-frontend-dead-code-audit.md
feat/backend-migration(或从其派生的清理分支)packages/desktop/src/process/**/*.ts(不含 renderer/、tests/、preload/)common/adapter/ipcBridge.ts 路由类型 + 对照 aionui-backend crate 覆盖范围2026-05-08-cleanup-and-test-rewrite-design.md(总设计 / UC-A / UC-B / 关键事实 A-C)2026-05-08-cleanup-team-playbook.md(team playbook)2026-05-08-cleanup-teammate-cheatsheet.md(teammate cheatsheet)2026-05-08-n1-dead-code-cleanup-requirements.md(N1 requirements —— 已覆盖 7 个 bridge/service 文件;现场确认已全部删除)process/ 文件,给出新一轮 DELETE / MODIFY / KEEP / NEEDS-DECISION 分类aionui-backend(Rust)在 M1-M9 期间接管了绝大多数业务能力。common/adapter/ipcBridge.ts 被重写为 HTTP/WS 适配层:所有 httpGet / httpPost / httpPut / httpPatch / httpDelete / stubProvider / wsEmitter 返回的对象 .provider 字段都是 () => {}(见 httpBridge.ts:197/209/222/236/250/263/277)。ipcBridge.xxx.provider(...) 调用、且 xxx 走 HTTP/WS 适配的 bridge 文件,其 .provider() 注册在 runtime 完全不会被调用,是死代码。2026-05-08 系列清理已删除 7 个纯死 bridge/service(bedrock / previewHistory / pptPreview / officeWatch / document / previewHistoryService / conversionService,共 1748 行)。process/ 目录仍有一大批由该机制产生的残留,以及若干孤儿 service / util,需要一次性扫清。process/ 下所有文件,按 DELETE / MODIFY / KEEP / NEEDS-DECISION 分类。2026-05-08 三份文档重叠、不重复处理。packages/desktop/src/common/adapter/httpBridge.ts(grep 结果):
188: provider: (handler: (params: Params) => Promise<Data>) => void;
197: provider: () => {},
209: provider: () => {},
222: provider: () => {},
236: provider: () => {},
250: provider: () => {},
263: provider: () => {},
277: provider: () => {},
对比 common/adapter/ipcBridge.ts 的顶层 namespace 绑定类型:
bridge.buildProvider(...) / bridge.buildEmitter(...) → 真实 Electron IPC(@office-ai/platform),provider() 处理器会被调用 → LIVE。httpGet / httpPost / httpPut / httpPatch / httpDelete / stubProvider / wsEmitter / wsMappedEmitter / withResponseMap → HTTP/WS/桩,provider() 是 no-op → DEAD。对每个候选文件:
grep -rn '<basename>' packages/desktop/src/ --include='*.ts' --include='*.tsx' | grep -v '\.test\.'export 名字单独 grep 一次(类型 + 值)。按 aionui-backend crate 名匹配前端领域:
| 前端领域 / 模块 | 对应 backend crate | adapter 路由 |
|---|---|---|
| conversation / message | aionui-conversation + aionui-db | /api/conversations/*, /api/messages/* |
| assistants | aionui-assistant | /api/assistants/* |
| providers / model fetch | aionui-system + aionui-api-types | /api/providers/* |
| cron | aionui-cron | /api/cron/jobs/* |
| mcp | aionui-mcp | /api/mcp/* |
| office / preview | aionui-office | /api/ppt-preview/*, /api/preview-history/*, /api/document/* |
| shell / file-open | aionui-shell | /api/shell/* |
| fs (read/write/snapshot) | aionui-file | /api/fs/* |
| speech-to-text | aionui-system | /api/stt |
| team | aionui-team | /api/team/* |
| channel (lark / telegram / 飞书) | aionui-channel | /api/channel/* |
| auth (SSO / password / webui) | aionui-auth | /api/auth/*, /api/webui/* |
Electron-native 仍保留 IPC 的领域(不经过 backend):
每个表格的 exports 列只列关键 symbol;consumers 列格式为
外部引用数(文件列表);adapter 列标注该文件涉及的ipcBridge.xxx在 adapter 中的类型。
process/bridge/*.tsbridge/applicationBridge.ts(199 行) —— KEEPapplication.restart / openDevTools / isDevToolsOpened / getZoomFactor / setZoomFactor / getCdpStatus / updateCdpConfig / getStartOnBootStatus / setStartOnBoot 全部 bridge.buildProvider(真 IPC)。wasLaunchedAtLogin / setApplicationMainWindow 被 src/index.ts、process/utils/mainWindowLifecycle.ts 直接调用:
src/index.ts:29:import { wasLaunchedAtLogin } from '@process/bridge/applicationBridge';
src/process/utils/mainWindowLifecycle.ts:8:import { setApplicationMainWindow } from '../bridge/applicationBridge';
bridge/applicationBridgeCore.ts(44 行) —— KEEPapplication.systemInfo 走 httpGet('/api/system/info')(no-op);application.updateSystemInfo 和 application.getPath 是 bridge.buildProvider(LIVE)。initApplicationBridgeCore() 被 applicationBridge.ts:99 调用。systemInfo 的 .provider() 是死注册但其余两个是真 IPC → KEEP。可选微优化:systemInfo.provider(...) 代码块删掉节省 3 行(归入 MODIFY 的可选项,不强制)。bridge/authBridge.ts(59 行) —— DELETEgoogleAuth.status 是 stubProvider<..>('googleAuth.status', { success: false, msg: 'Google Auth not available in backend mode' })(adapter ipcBridge.ts:578-583)→ 整个 .provider(handler) 注册完全 no-op,handler 永远不会触发。$ grep -rn 'initAuthBridge' packages/desktop/src/ | grep -v '\.test\.'
packages/desktop/src/process/bridge/index.ts:8:import { initAuthBridge } from './authBridge';
packages/desktop/src/process/bridge/index.ts:30: initAuthBridge();
packages/desktop/src/process/bridge/index.ts:44: initAuthBridge,
bridge/index.ts 在串联调用;renderer 端 ipcBridge.googleAuth.status.invoke(...) 调到的是 stub(success: false)。bridge/index.ts 移除 3 处 initAuthBridge 引用。getOauthInfoWithCache 在 backend 模式下不可用,adapter 明确返回 "Google Auth not available in backend mode")。Storage.getOAuthCredsPath 文件存在性检查等代码只是噪声。bridge/dialogBridge.ts(28 行) —— KEEPdialog.showOpen 是 bridge.buildProvider(LIVE,Electron dialog.showOpenDialog 必须在主进程)。initDialogBridge 被 bridge/index.ts 调用。bridge/feedbackBridge.ts(104 行) —— KEEPipcBridge 走,直接 ipcMain.handle('feedback:collect-logs') / ipcMain.handle('feedback:capture-screenshot')。src/preload/main.ts:45: collectFeedbackLogs: () => ipcRenderer.invoke('feedback:collect-logs')
src/preload/main.ts:47: captureFeedbackScreenshot: () => ipcRenderer.invoke('feedback:capture-screenshot')
src/index.ts:28:import './process/bridge/feedbackBridge';
bridge/index.ts(59 行) —— MODIFYprocess/utils/initBridge.ts:8。import / initAllBridges 调用 / export 段引用。详见 §5.bridge/notificationBridge.ts(73 行) —— KEEPnotification.show 是 bridge.buildProvider(LIVE)。showNotification 是主进程直接调用的函数;initNotificationBridge 被 bridge/index.ts 串联。bridge/remoteAgentBridge.ts(21 行) —— DELETEremoteAgent.* 全部 HTTP(ipcBridge.ts:818-848)。initRemoteAgentBridge()。注释自己写明"Intentionally empty"。bridge/index.ts 在串联调用。bridge/index.ts 移除 3 处 initRemoteAgentBridge 引用。bridge/shellBridge.ts(273 行) —— DELETEshell.openFile / showItemInFolder / openExternal / checkToolInstalled / openFolderWith 全部 httpPost('/api/shell/*')(backend aionui-shell 接管)→ 所有 .provider() 注册均 no-op。$ grep -rn 'initShellBridge' packages/desktop/src/ | grep -v '\.test\.'
packages/desktop/src/process/bridge/index.ts:10:import { initShellBridge } from './shellBridge';
packages/desktop/src/process/bridge/index.ts:28: initShellBridge();
packages/desktop/src/process/bridge/index.ts:47: initShellBridge,
isVSCodeInstalled / commandExists / findVSCodeExecutable / openFolderWithTool 都是局部函数,只在 .provider() 回调中使用)。aionui-shell 有等价的 VSCode / Terminal / Explorer / openExternal 实现。bridge/speechToTextBridge.ts(14 行) —— DELETEspeechToText.transcribe 是 httpPost('/api/stt')(ipcBridge.ts:518)→ .provider() 注册 no-op。$ grep -rn 'initSpeechToTextBridge' packages/desktop/src/ | grep -v '\.test\.'
packages/desktop/src/process/bridge/index.ts:11:import { initSpeechToTextBridge } from './speechToTextBridge';
packages/desktop/src/process/bridge/index.ts:36: initSpeechToTextBridge();
packages/desktop/src/process/bridge/index.ts:48: initSpeechToTextBridge,
bridge/systemSettingsBridge.ts(206 行) —— KEEP(UC-B 保留)getCloseToTray / setCloseToTray / getNotificationEnabled / setNotificationEnabled / getCronNotificationEnabled / setCronNotificationEnabled / getKeepAwake / setKeepAwake / changeLanguage / languageChanged / getSaveUploadToWorkspace / setSaveUploadToWorkspace / getAutoPreviewOfficeFiles / setAutoPreviewOfficeFiles 全部 HTTP → .provider() 这 14 处是死注册;但 getPetEnabled / setPetEnabled / getPetSize / setPetSize / getPetDnd / setPetDnd / getPetConfirmEnabled / setPetConfirmEnabled 是 bridge.buildProvider → LIVE(需要本地驱动 pet 窗口)。此外 setKeepAwake 的本地 power.preventDisplaySleep() 副作用仍然需要(backend 无法控制 Electron 的 powerSaveBlocker)。.provider() 注册(节省 ~90 行),保留 pet + keepAwake + language broadcast 的本地副作用。如做此瘦身,归入 NEEDS-DECISION(见 §7)。bridge/taskBridge.ts(45 行) —— DELETEtask.stopAll / getRunningCount 是 stubProvider(...{ success: true, count: 0 })(ipcBridge.ts:1032-1036)→ .provider() no-op,renderer 收到固定桩。$ grep -rn 'initTaskBridge' packages/desktop/src/ | grep -v '\.test\.'
packages/desktop/src/process/bridge/index.ts:12:import { initTaskBridge } from './taskBridge';
packages/desktop/src/process/bridge/index.ts:35: initTaskBridge(deps.workerTaskManager);
packages/desktop/src/process/bridge/index.ts:50: initTaskBridge,
workerTaskManager.listTasks() 为数据源;由于 task 注册路径(AgentFactory)在后端迁移后已空(见 §4.7),listTasks() 实际上永远返回 [],stub 给出 count=0 已经等价。bridge/updateBridge.ts(666 行) —— KEEPupdate.* 和 autoUpdate.* 全部 bridge.buildProvider(LIVE,Electron electron-updater 必须主进程)。bridge/index.ts + autoUpdaterService.ts 串联;createAutoUpdateStatusBroadcast 被 src/index.ts:339 调用。bridge/webuiBridge.ts(107 行) —— KEEPwebui.getStatus / start / stop / statusChanged 是 bridge.buildProvider / bridge.buildEmitter(LIVE —— 本进程必须拥有 WebUI 启停能力,backend 自己不能 spawn WebUI 壳);changePassword / changeUsername / resetPassword / generateQRToken 是 httpPost(由 renderer 直接打 backend,不经过此文件)。initWebuiBridge 被 bridge/index.ts 串联。bridge/windowControlsBridge.ts(91 行) —— KEEPwindowControls.* 全部 bridge.buildProvider(LIVE)。registerWindowMaximizeListeners 被 bridge/index.ts re-export,initWindowControlsBridge 被串联。bridge/workspaceSnapshotBridge.ts(68 行) —— DELETEadapter:fileSnapshot.init / compare / getBaselineContent / getInfo / dispose / stageFile / stageAll / unstageFile / unstageAll / discardFile / resetFile / getBranches 全部 httpPost('/api/fs/snapshot/*')(ipcBridge.ts:551-572)→ .provider() 全部 no-op。
consumers:
$ grep -rn 'initWorkspaceSnapshotBridge\|workspaceSnapshotBridge' packages/desktop/src/ | grep -v '\.test\.'
packages/desktop/src/process/bridge/workspaceSnapshotBridge.ts:12:export function initWorkspaceSnapshotBridge(): void {
packages/desktop/src/process/bridge/index.ts:17:import { initWorkspaceSnapshotBridge } from './workspaceSnapshotBridge';
packages/desktop/src/process/bridge/index.ts:37: initWorkspaceSnapshotBridge();
packages/desktop/src/process/bridge/index.ts:54: initWorkspaceSnapshotBridge,
packages/desktop/src/process/bridge/index.ts:57:export { disposeAllSnapshots } from './workspaceSnapshotBridge';
$ grep -rn 'disposeAllSnapshots' packages/desktop/src/ | grep -v '\.test\.'
packages/desktop/src/process/bridge/index.ts:57:export { disposeAllSnapshots } from './workspaceSnapshotBridge';
packages/desktop/src/process/bridge/workspaceSnapshotBridge.ts:66:export function disposeAllSnapshots(): Promise<void> {
disposeAllSnapshots 被 re-export 但没有任何消费者。
结论:DELETE。级联删 process/services/WorkspaceSnapshotService.ts(433 行,见 §4.2.2)。
process/bridge/services/*.tsbridge/services/SpeechToTextService.ts(260 行) —— DELETE(级联)bridge/speechToTextBridge.ts:8 import { SpeechToTextService } from './services/SpeechToTextService'。当 speechToTextBridge.ts 被删除时,该文件失去唯一消费者。/api/stt 由 aionui-system crate 实现(或通过 backend 转发到 OpenAI/Deepgram/Gemini)。process/services/*.tsservices/ConversationServiceImpl.ts(160 行) —— DELETE$ grep -rn 'ConversationServiceImpl' packages/desktop/src/ | grep -v '\.test\.'
packages/desktop/src/process/services/conversationServiceSingleton.ts:8: * Singleton ConversationServiceImpl wired with the backend-backed repository.
packages/desktop/src/process/services/conversationServiceSingleton.ts:13:import { ConversationServiceImpl } from './ConversationServiceImpl';
packages/desktop/src/process/services/conversationServiceSingleton.ts:16:export const conversationServiceSingleton: IConversationService = new ConversationServiceImpl(
packages/desktop/src/process/services/ConversationServiceImpl.ts:23:export class ConversationServiceImpl implements IConversationService {
conversationServiceSingleton.ts,而 singleton 本身无消费者(见下)。IConversationService.ts、conversationServiceSingleton.ts、initAgent.ts、openclawUtils.ts(详见 §5)。services/IConversationService.ts(58 行) —— DELETEConversationServiceImpl.ts:7 与 conversationServiceSingleton.ts:14。services/conversationServiceSingleton.ts(18 行) —— DELETE$ grep -rn 'conversationServiceSingleton' packages/desktop/src/ | grep -v '\.test\.'
packages/desktop/src/process/services/conversationServiceSingleton.ts:16:export const conversationServiceSingleton: IConversationService = new ConversationServiceImpl(
services/autoUpdaterService.ts(335 行) —— KEEPsrc/index.ts:338 与 bridge/updateBridge.ts:21 调用。services/ccSwitchModelSource.ts(236 行) —— DELETEUC-B 状态:2026-05-08-cleanup-and-test-rewrite-design.md 第 109 行明确保留:"被 process/agent/acp/* 和 process/acp/compat/AcpAgentV2.ts 使用"。
当前实地核查:
$ ls packages/desktop/src/process/agent/ packages/desktop/src/process/acp/ 2>&1
ls: /Users/.../process/acp/: No such file or directory
packages/desktop/src/process/agent/:
remote
$ grep -rn 'ccSwitchModelSource\|CcSwitchModelSource\|getCcSwitchPaths\|buildClaudeModelInfoFromCcSwitchConfig\|readClaudeModelInfoFromCcSwitch\|readClaudeProviderEnvFromCcSwitch\|ClaudeProviderEnv' packages/ | grep -v 'ccSwitchModelSource.ts'
(无输出)
结论:DELETE。UC-B 保留理由已失效(process/agent/acp/ 和 process/acp/compat/ 都已删除)。
注意:本条改写了 2026-05-08-cleanup-and-test-rewrite-design.md §UC-B 的结论,属于新发现。
services/openclawConflictDetector.ts(208 行) —— DELETEdetectLarkConflict / detectTelegramConflict / hasOpenClawChannelsEnabled / getOpenClawConfigPath / getConflictResolutionSteps$ grep -rn 'detectLarkConflict\|detectTelegramConflict\|hasOpenClawChannelsEnabled\|getOpenClawConfigPath\|getConflictResolutionSteps' packages/desktop/src/ | grep -v 'openclawConflictDetector.ts'
(无输出)
aionui-channel crate 未继承"检查 OpenClaw 本地配置冲突"这个能力,若未来需要由 backend 接管。services/WorkspaceSnapshotService.ts(433 行) —— DELETE(级联)bridge/workspaceSnapshotBridge.ts:8 和 workspaceSnapshotBridge.ts:14 WorkspaceSnapshotService.cleanupStaleSnapshots()。aionui-file::snapshot_manager 已完全接管 /api/fs/snapshot/*。process/services/i18n/*.tsservices/i18n/index.ts(88 行) —— KEEPsrc/index.ts:667: await setInitialLanguage(savedLanguage);
process/index.ts:21: import './services/i18n'; // Initialize i18n for main process
process/bridge/systemSettingsBridge.ts:18: import { changeLanguage } from '@process/services/i18n';
process/bridge/updateBridge.ts:27: _i18nCache = import('../services/i18n');
process/services/database/**.tsdatabase/IConversationRepository.ts(39 行) —— KEEPWorkerTaskManager.ts:11(类型)、workerTaskManagerSingleton.ts:15(类型+实例)、ConversationServiceImpl.ts:8(类型,DELETE 后消失)、SqliteConversationRepository.ts:8(类型,DELETE 后消失)。workerTaskManagerSingleton.ts:19-85 直接 inline 了一个基于 ipcBridge.conversation.* / ipcBridge.database.* 的 IConversationRepository 实例,该接口仍是 live 契约。database/SqliteConversationRepository.ts(109 行) —— DELETEipcBridge.conversation.* / ipcBridge.database.* 走 HTTP。但 workerTaskManagerSingleton.ts 已 inline 同逻辑,此类是重复代码。conversationServiceSingleton.ts:12,17。database/migrations.ts(1392 行) —— KEEPrunLegacyDatabaseMigrations.ts:11 导入 runMigrations。aionui.db 首启升级到 v26 baseline 所必需,后续才由 backend 接管)。database/runLegacyDatabaseMigrations.ts(86 行) —— KEEPprocess/utils/initStorage.ts:31,587。database/schema.ts(154 行) —— KEEPrunLegacyDatabaseMigrations.ts:13-17、migrations.ts(间接)。database/drivers/BetterSqlite3Driver.ts(49 行) —— KEEPrunLegacyDatabaseMigrations.ts:62,63(动态 import)。database/drivers/ISqliteDriver.ts(15 行) —— KEEPBetterSqlite3Driver.ts:5、schema.ts:7、migrations.ts:7、runLegacyDatabaseMigrations.ts:10。process/utils/*.tsutils/analyticsId.ts(41 行) —— KEEPsrc/index.ts / 分析场景)。utils/appMenu.ts(77 行) —— KEEPsrc/index.ts)。utils/configureChromium.ts(389 行) —— KEEPsrc/index.ts:9、process/index.ts:9、bridge/applicationBridge.ts(CDP 状态)。utils/configureConsole.ts(21 行) —— DELETE$ grep -rn 'configureConsole\b' packages/desktop/src/
(无输出 —— 除自身外)
configureConsoleLog.ts 不是它)。configureConsoleLog.ts 或直接在 src/index.ts 顶部执行;但当前无人使用。utils/configureConsoleLog.ts(81 行) —— KEEPsrc/index.ts:16(side-effect import)。utils/credentialCrypto.ts(109 行) —— DELETEisEncryptionAvailable / encryptString / decryptString / encryptCredentials / decryptCredentials$ grep -rn 'isEncryptionAvailable\|encryptCredentials\|decryptCredentials\|encryptString\|decryptString\|credentialCrypto' packages/desktop/src/ | grep -v 'process/utils/credentialCrypto.ts'
(无输出)
aionui-auth + aionui-db 接管所有凭证加密;前端 Electron safeStorage 流程已废弃。utils/deepLink.ts(78 行) —— KEEPsrc/index.ts(deep link 协议注册必须主进程)。utils/ensureAdminUser.ts(78 行) —— KEEPsrc/index.ts:510(WebUI bootstrap 迁移)。utils/index.ts(18 行) —— KEEP@process/utils barrel,re-export utils.ts 中的文件系统 helper。utils/initAgent.ts(414 行) —— DELETEcreateAcpAgent / createOpenClawAgent / createNanobotAgent / createRemoteAgent / createAionrsAgent$ grep -rn 'createAcpAgent\|createOpenClawAgent\|createNanobotAgent\|createRemoteAgent\|createAionrsAgent' packages/desktop/src/ | grep -v 'process/utils/initAgent'
packages/desktop/src/process/services/ConversationServiceImpl.ts:12-16 + :109,113,117,121,125
ConversationServiceImpl,已被分类为 DELETE(§4.3.1)。aionui-conversation::create_conversation 接管(adapter ipcBridge.conversation.create 路由到 POST /api/conversations)。utils/initBridge.ts(15 行) —— KEEPprocess/index.ts:20(side-effect import,驱动 bridge 初始化)。utils/initStorage.ts(633 行) —— KEEPprocess/index.ts:19、多个 bridge / service(ProcessConfig / ProcessEnv / getSystemDir 等)。utils/mainLogger.ts(43 行) —— KEEPbridge/services/SpeechToTextService.ts(DELETE 后级联损失消费者)+ 可能其他。$ grep -rn 'mainLog\|mainError\|mainWarn' packages/desktop/src/process/ | grep -v 'mainLogger.ts' | head
(SpeechToTextService 是唯一消费者)
utils/mainWindowLifecycle.ts(39 行) —— KEEPsrc/index.ts(BrowserWindow 生命周期钩子)。utils/message.ts(143 行) —— DELETEaddMessage / removeFromMessageCache / addOrUpdateMessage / nextTickToLocalFinish / executePendingCallbacks / nextTickToLocalRunning$ grep -rn 'from.*process/utils/message\|from.*utils/message\b' packages/desktop/src/ | grep -v '\.test\.'
(无输出 —— renderer 的 addOrUpdateMessage 同名但来自 renderer/hooks/)
aionui-conversation 完全接管消息持久化 + 更新 WS 推送。utils/migrateAssistants.ts(270 行) —— KEEP(UC-B)utils/runBackendMigrations.ts:10 → migrateAssistantsToBackend。utils/openclawUtils.ts(30 行) —— DELETE(级联)computeOpenClawIdentityHashutils/initAgent.ts:15,383。utils/previewUtils.ts(84 行) —— DELETEUC-B 状态:2026-05-08-cleanup-and-test-rewrite-design.md 第 109 行保留:"task/AcpAgentManager.ts:25 的 handlePreviewOpenEvent"。
当前实地核查:
$ grep -rn 'handlePreviewOpenEvent\|NAVIGATION_TOOLS\|createPreviewOpenMessage\|extractNavigationUrl' packages/desktop/src/ | grep -v 'process/utils/previewUtils.ts'
(NAVIGATION_TOOLS 的命中在 common/chat/navigation/NavigationInterceptor.ts —— 是独立重复定义,不消费本文件;其余无命中)
$ find packages/desktop/src/process/task -name 'AcpAgentManager*'
(无结果 —— 文件已不存在)
结论:DELETE。UC-B 保留理由已失效(AcpAgentManager.ts 已随 ACP 后端化删除)。
注意:和 §4.3.5 一样是新发现,改写了 2026-05-08-cleanup-and-test-rewrite-design.md §UC-B 的结论。
utils/resetPasswordCLI.ts(70 行) —— KEEPsrc/index.ts:533(--resetpass CLI 模式)。utils/runBackendMigrations.ts(93 行) —— KEEP(UC-B)src/index.ts:233。utils/safeExec.ts(173 行) —— DELETEsafeExec / safeExecFile / 相关 types$ grep -rn 'safeExec\|safeExecFile' packages/desktop/src/ | grep -v 'process/utils/safeExec.ts'
(无输出)
aionui-shell / aionui-runtime 接管所有受控命令执行;前端不再需要在主进程执行外部 CLI。utils/tray.ts(296 行) —— KEEPsrc/index.ts(托盘必须主进程)。utils/utils.ts(460 行) —— KEEPapplicationBridgeCore.ts:16 / runLegacyDatabaseMigrations.ts:9 / 经 utils/index.ts barrel 散布)。utils/webuiConfig.ts(336 行) —— KEEPbridge/webuiBridge.ts、utils/ensureAdminUser.ts。utils/zoom.ts(136 行) —— KEEPbridge/applicationBridge.ts、src/index.ts。process/agent/**.tsagent/remote/types.ts(51 行) —— KEEPrenderer/pages/settings/AgentSettings/RemoteAgentManagement.tsx:8: import type { RemoteAgentConfig, RemoteAgentInput } from '@process/agent/remote/types'
common/adapter/ipcBridge.ts:818,819,823-826: import('@process/agent/remote/types').RemoteAgent* 作为类型参数
process/agent/ 目录下唯一剩余文件。文件名本意是 "定义前端用的 agent 契约"。考虑到目录只剩一个 types 文件、又被 renderer 和 adapter 消费,建议后续将其搬到 common/types/remoteAgentTypes.ts(语义上更合理)。NEEDS-DECISION(§7)。process/backend/**.tsbackend/binaryResolver.ts(60 行) —— KEEPsrc/index.ts:27 经 backend/index.ts barrel。backend/index.ts(1 行) —— KEEPprocess/task/**.ts —— 全部 DELETE(条件式,附替换方案)2026-05-12 复审:整目录处于"架构空壳"状态。进一步对照 aionui-backend 能力后确认:三个真实消费点均有 backend 替代方案,整目录可以整体 DELETE。
$ grep -rn 'agentFactory.register\|\.register\(' packages/desktop/src/process/task/ packages/desktop/src/index.ts packages/desktop/src/process/
(无命中 —— AgentFactory 虽被实例化但没有任何 agent creator 被注册)
$ grep -rn '\.addTask\b\|getOrBuildTask\b' packages/desktop/src/ | grep -v '\.test\.' | grep -v 'process/task/'
(无命中 —— WorkerTaskManager 的注册/构建 API 没有任何外部调用者)
| # | 消费点 | 前端现有调用 | 替代方案 | 可行性 |
|---|---|---|---|---|
| 1 | index.ts:787 —— 应用退出清理 | await workerTaskManager.clear() | 直接删除调用。backend aionui-backend 子进程由 backendManager.stop()(第 784 行)终止,backend 退出时会杀光它 spawn 的所有 agent 子进程。前端 taskList 永远为空,.clear() 什么都没杀。 | ✅ 零成本 |
| 2 | applicationBridge.ts:103 —— restart 清理 | await workerTaskManager.clear() | 同 #1,直接删除调用。app.relaunch() 会触发 before-quit hook,走同一套 backend shutdown 流程。 | ✅ 零成本 |
| 3 | petConfirmManager.ts:361 —— 提交 tool-call 确认 | workerTaskManager.getTask(cid)?.confirm(msgId, callId, data) | 改用现有 HTTP 接口:ipcBridge.confirmation.confirm.invoke({ conversation_id, call_id, msg_id, data, always_allow }) —— common/adapter/ipcBridge.ts:287-293 已封装为 POST /api/conversations/{id}/confirmations/{callId}/confirm,backend 路由 aionui-conversation/src/routes.rs:40 已实现。 | ✅ backend HTTP 已就绪,前端改 1 行 |
| 4 | tray.ts:71 —— 托盘 badge "运行任务数" | workerTaskManager.listTasks().length | 短期:硬编码返回 0(与当前行为等价 —— 由于 taskList 永远为空)。中期:后端补 GET /api/conversations/active-count 路由(aionui-ai-agent/src/task_manager.rs:160 active_count() 已有内部实现,只差 HTTP 暴露),前端改用 ipcBridge.conversation.activeCount.invoke()。 | ⚠️ 短期零成本(硬编码 0);中期需后端补 1 个路由 |
process/task/ 前置步骤)src/index.ts:783-787 —— 删除 import { workerTaskManager } 及 await workerTaskManager.clear() 调用。src/process/bridge/applicationBridge.ts
import type { IWorkerTaskManager }(line 10)initApplicationBridge(workerTaskManager: IWorkerTaskManager) → initApplicationBridge()(去掉参数)await workerTaskManager.clear()(line 103)src/process/bridge/index.ts —— 去掉 BridgeInitDeps.workerTaskManager 字段,调整 initAllBridges(deps) 入参。src/process/utils/initBridge.ts —— 去掉 workerTaskManager 相关 import 和 wiring。src/process/utils/tray.ts:69-75 —— getRunningTasksCount() 改为 return 0(或改用新 HTTP 路由,二选一)。src/process/pet/petConfirmManager.ts:357-364
new IpcAgentEventEmitter().emitConfirmationRemove(...) 改为 ipcBridge.confirmation.remove.emit({ conversation_id, id })(wsEmitter,见 ipcBridge.ts:297)workerTaskManager.getTask(cid)?.confirm(...) 改为 await ipcBridge.confirmation.confirm.invoke({ conversation_id, msg_id, call_id, data })src/process/pet/petManager.ts —— 搜 workerTaskManager / IpcAgentEventEmitter 其他引用并清理(grep -rn 'workerTaskManager\|IpcAgentEventEmitter' packages/desktop/src/process/pet/)。GET /api/conversations/active-count —— 暴露 task_manager.active_count() 为 HTTP 路由,返回 { count: number }。conversation.activeCount: httpGet<{count:number}>('/api/conversations/active-count')。| 文件 | 行数 | 替换后状态 |
|---|---|---|
task/AgentFactory.ts | 25 | DELETE(从未注册 creator) |
task/ConversationBusyGuard.ts | 96 | DELETE(仅 killIdleCliAgents 调用,而 taskList 永远空) |
task/IAgentEventEmitter.ts | 23 | DELETE(接口仅被 IpcAgentEventEmitter 实现,后者随 §4.9.3 #6 删除) |
task/IAgentFactory.ts | 28 | DELETE(仅 AgentFactory.ts 消费) |
task/IAgentManager.ts | 30 | DELETE(没有实现类;类型仅 task/ 内部互引) |
task/IpcAgentEventEmitter.ts | 53 | DELETE(pet 改用 ipcBridge.confirmation.remove.emit(...) WS 发射器) |
task/IWorkerTaskManager.ts | 19 | DELETE(bridge/index.ts / applicationBridge.ts 的消费随 §4.9.3 #2-#4 清除) |
task/WorkerTaskManager.ts | 123 | DELETE(所有方法均无 live 消费者) |
task/agentTypes.ts | 17 | DELETE(AgentType 仅被 task/ 内部 + pet 间接引用;pet 可直接用字符串字面量或 common/types/agentTypes.ts 同义类型) |
task/workerTaskManagerSingleton.ts | 86 | DELETE(conversationRepo inline 实现从未触发) |
总计:process/task/ 目录 10 个文件,~600 行,全部 DELETE。
process/pet/**.ts| 文件 | 行数 | 分类 | consumers |
|---|---|---|---|
pet/petConfirmManager.ts | 384 | KEEP | pet/petManager.ts 动态 import |
pet/petEventBridge.ts | 89 | KEEP | pet/petManager.ts |
pet/petIdleTicker.ts | 164 | KEEP | pet/petManager.ts |
pet/petManager.ts | 691 | KEEP | bridge/systemSettingsBridge.ts(动态 import)/ utils/tray.ts(动态 import)/ src/index.ts |
pet/petStateMachine.ts | 137 | KEEP | pet/petManager.ts |
pet/petTypes.ts | 110 | KEEP | pet/petManager.ts / bridge/systemSettingsBridge.ts |
process/resources/**.ts| 文件 | 行数 | 分类 | consumers |
|---|---|---|---|
resources/builtinMcp/constants.ts | 31 | KEEP | utils/initStorage.ts(BUILTIN_IMAGE_GEN_*)+ resources/builtinMcp/imageGenServer.ts(自身 entry) |
resources/builtinMcp/imageGenServer.ts | 136 | KEEP | scripts/build-mcp-servers.js 作为 esbuild 入口编译为 out/main/builtin-mcp-image-gen.js,打包进 asar.unpacked(electron-builder.yml:210)由 MCP 客户端 spawn |
resources/skills/ | —— | KEEP | 只有 .DS_Store;非源码目录 |
process/index.ts(顶层)| 文件 | 行数 | 分类 | consumers |
|---|---|---|---|
process/index.ts | 29 | KEEP | src/index.ts:23: import { initializeProcess } from './process' |
| 分类 | 文件数 | 行数 |
|---|---|---|
DELETE(含 task/ 10 + mainLogger + 其余级联) | 32 | ~3579 |
| MODIFY(前端调整消费点 / 瘦身 / 搬迁) | 10 | —— |
| KEEP | 38 | —— |
| 总计审计 | ~80 | —— |
NEEDS-DECISION 在 §7 逐项决议后归零:
task/ 整目录 → DELETE(见 §4.9)utils/mainLogger.ts → DELETE(SpeechToTextService 的级联)agent/remote/types.ts → MOVE 到 common/types/ (MODIFY)systemSettingsBridge.ts → 瘦身 (MODIFY,净减 ~90 行)applicationBridgeCore.ts → 瘦身 (MODIFY,净减 3 行)initStorage 迁移打标 → 超出范围,留作 future-worktask/ 目录)| # | 路径 | 行数 | 理由 |
|---|---|---|---|
| 1 | process/services/WorkspaceSnapshotService.ts | 433 | 级联:workspaceSnapshotBridge 唯一消费者 |
| 2 | process/utils/initAgent.ts | 414 | 级联:ConversationServiceImpl 的唯一消费者;backend aionui-conversation 接管 |
| 3 | process/bridge/shellBridge.ts | 273 | 全文 httpPost → no-op 注册 |
| 4 | process/bridge/services/SpeechToTextService.ts | 260 | 级联:speechToTextBridge 的唯一消费者 |
| 5 | process/services/ccSwitchModelSource.ts | 236 | UC-B 已失效;零消费者 |
| 6 | process/services/openclawConflictDetector.ts | 208 | 零消费者 |
| 7 | process/utils/safeExec.ts | 173 | 零消费者 |
| 8 | process/services/ConversationServiceImpl.ts | 160 | 级联:仅被 singleton 消费,而 singleton 零消费 |
| 9 | process/utils/message.ts | 143 | 零消费者;ACP era 消息缓存 |
| 10 | process/task/WorkerTaskManager.ts | 123 | process/task/ 目录整体 DELETE(§4.9) |
| 11 | process/utils/credentialCrypto.ts | 109 | 零消费者 |
| 12 | process/services/database/SqliteConversationRepository.ts | 109 | 级联:conversationServiceSingleton 唯一消费者 |
| 13 | process/task/ConversationBusyGuard.ts | 96 | process/task/ 目录整体 DELETE(§4.9) |
| 14 | process/task/workerTaskManagerSingleton.ts | 86 | process/task/ 目录整体 DELETE(§4.9) |
| 15 | process/utils/previewUtils.ts | 84 | UC-B 已失效;AcpAgentManager 已删 |
| 16 | process/bridge/workspaceSnapshotBridge.ts | 68 | 全文 httpPost → no-op |
| 17 | process/bridge/authBridge.ts | 59 | googleAuth.status 是 stubProvider |
| 18 | process/services/IConversationService.ts | 58 | 级联 |
| 19 | process/task/IpcAgentEventEmitter.ts | 53 | process/task/ 目录整体 DELETE(§4.9) |
| 20 | process/bridge/taskBridge.ts | 45 | task.stopAll/getRunningCount 是 stubProvider |
| 21 | process/task/IAgentManager.ts | 30 | process/task/ 目录整体 DELETE(§4.9) |
| 22 | process/utils/openclawUtils.ts | 30 | 级联:仅被 initAgent.ts 消费 |
| 23 | process/task/IAgentFactory.ts | 28 | process/task/ 目录整体 DELETE(§4.9) |
| 24 | process/task/AgentFactory.ts | 25 | process/task/ 目录整体 DELETE(§4.9) |
| 25 | process/task/IAgentEventEmitter.ts | 23 | process/task/ 目录整体 DELETE(§4.9) |
| 26 | process/bridge/remoteAgentBridge.ts | 21 | 空函数,自述 "Intentionally empty" |
| 27 | process/utils/configureConsole.ts | 21 | 零消费者 |
| 28 | process/task/IWorkerTaskManager.ts | 19 | process/task/ 目录整体 DELETE(§4.9) |
| 29 | process/services/conversationServiceSingleton.ts | 18 | 零消费者 |
| 30 | process/task/agentTypes.ts | 17 | process/task/ 目录整体 DELETE(§4.9) |
| 31 | process/bridge/speechToTextBridge.ts | 14 | speechToText.transcribe 是 httpPost |
| 32 | process/utils/mainLogger.ts | 43 | 级联:唯一消费者 SpeechToTextService 已 DELETE(§7.2) |
合计:32 文件,~3579 行(原 21 文件 2936 行 + task/ 10 文件 600 行 + mainLogger 43 行)。
| 路径 | 改动 | 来源章节 |
|---|---|---|
process/bridge/index.ts | 移除对已删 bridge 的 import / init 调用 / export;移除 BridgeInitDeps.workerTaskManager | §4.1.6 / §4.9.3 |
process/utils/initBridge.ts | 移除 workerTaskManager 相关 import 和 wiring | §4.9.3 |
src/index.ts | 删除 import { workerTaskManager } 和 await workerTaskManager.clear() | §4.9.3 |
process/bridge/applicationBridge.ts | 删除 IWorkerTaskManager import、initApplicationBridge 参数、await workerTaskManager.clear() | §4.9.3 |
process/utils/tray.ts | getRunningTasksCount() 改为 return 0,或改用新 HTTP 路由 | §4.9.3 |
process/pet/petConfirmManager.ts | new IpcAgentEventEmitter().emitConfirmationRemove(...) → ipcBridge.confirmation.remove.emit(...);workerTaskManager.getTask().confirm(...) → ipcBridge.confirmation.confirm.invoke(...) | §4.9.3 |
process/pet/petManager.ts | 清理残留的 workerTaskManager / IpcAgentEventEmitter import | §4.9.3 |
process/agent/remote/types.ts → common/types/remoteAgentTypes.ts | 文件搬迁:更新 5 处 @process/agent/remote/types import 到 @/common/types/remoteAgentTypes,然后删除空的 process/agent/ 目录 | §7.3 |
process/bridge/systemSettingsBridge.ts | 瘦身:删除 11 处 HTTP no-op .provider() 块(getCloseToTray/setCloseToTray/getNotificationEnabled/setNotificationEnabled/getCronNotificationEnabled/setCronNotificationEnabled/getKeepAwake getter/getSaveUploadToWorkspace/setSaveUploadToWorkspace/getAutoPreviewOfficeFiles/setAutoPreviewOfficeFiles),保留 setKeepAwake + changeLanguage 本地副作用 + 8 处 pet buildProvider。净减 ~90 行 | §7.4 |
process/bridge/applicationBridgeCore.ts | 瘦身:删除 systemInfo.provider(...) 3 行,保留 updateSystemInfo / getPath 真 IPC | §7.5 |
bridge/index.ts (MODIFY: 先移除 import/调用/export 中对已删 bridge 的引用)
│
├── DELETE: bridge/authBridge.ts
├── DELETE: bridge/remoteAgentBridge.ts
├── DELETE: bridge/shellBridge.ts
├── DELETE: bridge/taskBridge.ts
├── DELETE: bridge/workspaceSnapshotBridge.ts ──┐
│ └── DELETE: services/WorkspaceSnapshotService.ts
└── DELETE: bridge/speechToTextBridge.ts ──────┐
└── DELETE: bridge/services/SpeechToTextService.ts
(services 层独立删除链,需先于 bridge 修改或同一 commit)
services/conversationServiceSingleton.ts ← 先删(没有外部依赖)
│
├── DELETE: services/ConversationServiceImpl.ts
│ │
│ ├── DELETE: services/IConversationService.ts
│ └── DELETE: utils/initAgent.ts
│ └── DELETE: utils/openclawUtils.ts
│
└── DELETE: services/database/SqliteConversationRepository.ts
(services 孤儿)
DELETE: services/ccSwitchModelSource.ts (独立)
DELETE: services/openclawConflictDetector.ts (独立)
(utils 孤儿)
DELETE: utils/credentialCrypto.ts (独立)
DELETE: utils/safeExec.ts (独立)
DELETE: utils/message.ts (独立)
DELETE: utils/previewUtils.ts (独立)
DELETE: utils/configureConsole.ts (独立)
(task/ 目录整体删除 —— 前置消费点改造)
前置 MODIFY(必须先做,否则 TS 报错):
- src/index.ts: 删 workerTaskManager import + .clear() 调用
- process/bridge/applicationBridge.ts: 删 IWorkerTaskManager import + 参数 + .clear()
- process/bridge/index.ts: 删 BridgeInitDeps.workerTaskManager
- process/utils/initBridge.ts: 删 wiring
- process/utils/tray.ts: getRunningTasksCount → return 0
- process/pet/petConfirmManager.ts: 改用 ipcBridge.confirmation.confirm/remove
- process/pet/petManager.ts: 清理残留 import
│
└── DELETE: process/task/ 目录(10 个文件,~600 行)
bunx tsc --noEmit 通过)| Commit | 内容 | 行数 |
|---|---|---|
| C1 | bridge/index.ts 先行 MODIFY + 4 个纯 no-op bridge 删除(authBridge / remoteAgentBridge / shellBridge / taskBridge) | ~400 |
| C2 | workspaceSnapshotBridge + WorkspaceSnapshotService 联合删 + bridge/index.ts 同步 | ~500 |
| C3 | speechToTextBridge + bridge/services/SpeechToTextService + mainLogger 联合删 + bridge/index.ts 同步(§7.2 级联) | ~320 |
| C4 | ConversationService 四件套(singleton / Impl / IConvSvc / SqliteConvRepo)联合删 | ~345 |
| C5 | initAgent + openclawUtils 联合删(依赖 C4) | ~444 |
| C6 | 零消费者孤儿:ccSwitchModelSource / openclawConflictDetector / credentialCrypto / safeExec / message / previewUtils / configureConsole | ~871 |
| C7 | process/task/ 目录整体删除 —— 先改 6 个消费点(§4.9.3),再删 10 个文件 | ~600 |
| C8 | MODIFY 瘦身:systemSettingsBridge 删 11 处 no-op + applicationBridgeCore 删 3 行(§7.4 / §7.5) | ~-93 净减 |
| C9 | MOVE:process/agent/remote/types.ts → common/types/remoteAgentTypes.ts,更新 5 处 import,删空 process/agent/ 目录(§7.3) | ~0 净 |
总:9 个 commit,净删 ~3579 行(§5.2 DELETE 合计 3579 行 + C8 额外瘦身 ~93 行)。
task/ 目录整体 —— 已决策:DELETE2026-05-12 复审已给出完整替换方案,详见 §4.9.2 / §4.9.3 / §4.9.4。本节保留作为决策记录:
GET /api/conversations/active-count 路由(§4.9.4),使 tray badge 显示真实数据;短期硬编码 0 也可接受。utils/mainLogger.ts —— 已决策:DELETE$ grep -rn "mainLog\|mainError\|mainWarn\|mainLogger" packages/desktop/src/ --include='*.ts' --include='*.tsx' | grep -v "mainLogger.ts"
packages/desktop/src/process/bridge/services/SpeechToTextService.ts:14 / :121 / :147 / :154 / :165 / :176
SpeechToTextService(DELETE 对象)。删除 SpeechToTextService 后,mainLogger.ts 归零消费。console.log/warn/error + electron-log(configureConsoleLog.ts)已覆盖主进程日志需求。SpeechToTextService 级联项的级联项(串联顺序:speechToTextBridge → SpeechToTextService → mainLogger)。process/agent/remote/types.ts —— 已决策:MOVE(MODIFY,非 DELETE)$ grep -rn "from.*@process/agent/remote/types\|from.*process/agent/remote/types" packages/desktop/src/
renderer/pages/settings/AgentSettings/RemoteAgentManagement.tsx:8
common/adapter/ipcBridge.ts:818,819,823,824,826 (5 处 import('@process/agent/remote/types') 类型引用)
@process/agent/remote/types 导入 RemoteAgentConfig / RemoteAgentInput 作为类型契约。process/agent/remote/types.ts 搬到 common/types/remoteAgentTypes.ts,更新 5 处 @process/agent/remote/types 引用,然后删除空的 process/agent/ 目录。process/ 层违反分层原则(renderer 不应依赖 process 路径);common/ 是 renderer + process 共享的正确位置。process/agent/remote/types.ts → common/types/remoteAgentTypes.ts,5 处导入更新"。bridge/systemSettingsBridge.ts —— 已决策:瘦身(MODIFY)adapter/ipcBridge.ts:978-1009 实地对照):
.provider() 注册(整体可删):getCloseToTray / setCloseToTray / getNotificationEnabled / setNotificationEnabled / getCronNotificationEnabled / setCronNotificationEnabled / getKeepAwake 的 getter 部分 / getSaveUploadToWorkspace / setSaveUploadToWorkspace / getAutoPreviewOfficeFiles / setAutoPreviewOfficeFilessetKeepAwake.provider(调用 power.preventDisplaySleep() 控制 Electron powerSaveBlocker); changeLanguage.provider(主进程 i18n 广播 + keepAwake 副作用重触发)buildProvider(整体保留): getPetEnabled / setPetEnabled / getPetSize / setPetSize / getPetDnd / setPetDnd / getPetConfirmEnabled / setPetConfirmEnabled.provider() 块,保留带本地副作用的 2 处 + 8 处 pet 真 IPC。预计净减 ~90 行。bridge/applicationBridgeCore.ts —— 已决策:瘦身(MODIFY)applicationBridgeCore.ts:19-21):
ipcBridge.application.systemInfo.provider(() => {
return Promise.resolve(getSystemDir());
});
adapter/ipcBridge.ts:345-356,application.systemInfo 是 withResponseMap(httpGet('/api/system/info'), ...) → no-op。
同文件第 23-32 / 34-43 行的 updateSystemInfo / getPath 是 buildProvider 真 IPC,必须保留。systemInfo.provider(...) 3 行。initStorage.ts 里的 runLegacyDatabaseMigrations 调用时机 —— 超出范围runLegacyDatabaseMigrations 每次启动都跑一次(initStorage.ts:587);老用户早已迁完。services/WorkspaceSnapshotService.ts 里 cleanupStaleSnapshots() 的遗留数据 —— 决策:release notes 提醒~/Library/Application Support/<AionUi>/.aionui-snapshots/*)。aionui-file 启动时增加一次性 cleanup pass,扫描 .aionui-snapshots/ 并删除(单独的后端任务,不属本审计范围)。以下 7 个文件已经在 feat/backend-migration 的 N1 工作中删除(实地 ls 确认不存在)。本审计不重复列出:
process/bridge/bedrockBridge.tsprocess/bridge/previewHistoryBridge.tsprocess/services/previewHistoryService.tsprocess/bridge/pptPreviewBridge.tsprocess/bridge/officeWatchBridge.tsprocess/bridge/documentBridge.tsprocess/services/conversionService.tsN1 只覆盖 7 个文件 + bridge/index.ts 5 处 init 引用的移除。本审计额外提出:
IConversationService.ts / conversationServiceSingleton.ts / SqliteConversationRepository.ts / initAgent.ts / openclawUtils.ts / SpeechToTextService.ts / WorkspaceSnapshotService.ts)ccSwitchModelSource.ts + previewUtils.ts 在 2026-05-08-cleanup-and-test-rewrite-design.md §UC-B 中保留的理由已完全失效(对应的 process/acp/* / process/agent/acp/* / task/AcpAgentManager.ts 已全部删除)。tests/**。如果删除某个 source 文件后对应 test 需要失效,由执行清理的 agent 同时在该 commit 里删 test(N2 里程碑的本份工作)。process/ 层内(common/ / renderer/ / preload/ 不碰),符合 UC-A "清理而非重构"的底线。bunx vitest run 的动作由 feat/cleanup-and-test-rewrite 分支末端执行。2026-05-08-cleanup-and-test-rewrite-design.md 的修正提议ccSwitchModelSource.ts 和 previewUtils.ts 的保留条目应改为可删(附本审计 §4.3.5 / §4.6.18 的 grep 证据)。2026-05-08-cleanup-team-playbook.md UC-F 硬约束(原始命令输出、真实验证)。| # | 相对路径 | 行数 | 分类 |
|---|---|---|---|
| 1 | process/index.ts | 29 | KEEP |
| 2 | process/backend/binaryResolver.ts | 60 | KEEP |
| 3 | process/backend/index.ts | 1 | KEEP |
| 4 | process/agent/remote/types.ts | 51 | MODIFY(搬迁到 common/types/remoteAgentTypes.ts,§7.3) |
| 5 | process/bridge/applicationBridge.ts | 199 | KEEP |
| 6 | process/bridge/applicationBridgeCore.ts | 44 | MODIFY(瘦身,删 systemInfo no-op 3 行,§7.5) |
| 7 | process/bridge/authBridge.ts | 59 | DELETE |
| 8 | process/bridge/dialogBridge.ts | 28 | KEEP |
| 9 | process/bridge/feedbackBridge.ts | 104 | KEEP |
| 10 | process/bridge/index.ts | 59 | MODIFY |
| 11 | process/bridge/notificationBridge.ts | 73 | KEEP |
| 12 | process/bridge/remoteAgentBridge.ts | 21 | DELETE |
| 13 | process/bridge/shellBridge.ts | 273 | DELETE |
| 14 | process/bridge/speechToTextBridge.ts | 14 | DELETE |
| 15 | process/bridge/systemSettingsBridge.ts | 206 | MODIFY(瘦身,删 11 处 HTTP no-op provider,§7.4) |
| 16 | process/bridge/taskBridge.ts | 45 | DELETE |
| 17 | process/bridge/updateBridge.ts | 666 | KEEP |
| 18 | process/bridge/webuiBridge.ts | 107 | KEEP |
| 19 | process/bridge/windowControlsBridge.ts | 91 | KEEP |
| 20 | process/bridge/workspaceSnapshotBridge.ts | 68 | DELETE |
| 21 | process/bridge/services/SpeechToTextService.ts | 260 | DELETE (级联) |
| 22 | process/pet/petConfirmManager.ts | 384 | KEEP |
| 23 | process/pet/petEventBridge.ts | 89 | KEEP |
| 24 | process/pet/petIdleTicker.ts | 164 | KEEP |
| 25 | process/pet/petManager.ts | 691 | KEEP |
| 26 | process/pet/petStateMachine.ts | 137 | KEEP |
| 27 | process/pet/petTypes.ts | 110 | KEEP |
| 28 | process/resources/builtinMcp/constants.ts | 31 | KEEP |
| 29 | process/resources/builtinMcp/imageGenServer.ts | 136 | KEEP |
| 30 | process/services/autoUpdaterService.ts | 335 | KEEP |
| 31 | process/services/ccSwitchModelSource.ts | 236 | DELETE |
| 32 | process/services/ConversationServiceImpl.ts | 160 | DELETE |
| 33 | process/services/conversationServiceSingleton.ts | 18 | DELETE |
| 34 | process/services/IConversationService.ts | 58 | DELETE |
| 35 | process/services/openclawConflictDetector.ts | 208 | DELETE |
| 36 | process/services/WorkspaceSnapshotService.ts | 433 | DELETE (级联) |
| 37 | process/services/i18n/index.ts | 88 | KEEP |
| 38 | process/services/database/IConversationRepository.ts | 39 | KEEP |
| 39 | process/services/database/SqliteConversationRepository.ts | 109 | DELETE |
| 40 | process/services/database/migrations.ts | 1392 | KEEP |
| 41 | process/services/database/runLegacyDatabaseMigrations.ts | 86 | KEEP |
| 42 | process/services/database/schema.ts | 154 | KEEP |
| 43 | process/services/database/drivers/BetterSqlite3Driver.ts | 49 | KEEP |
| 44 | process/services/database/drivers/ISqliteDriver.ts | 15 | KEEP |
| 45 | process/task/AgentFactory.ts | 25 | DELETE (§4.9) |
| 46 | process/task/ConversationBusyGuard.ts | 96 | DELETE (§4.9) |
| 47 | process/task/IAgentEventEmitter.ts | 23 | DELETE (§4.9) |
| 48 | process/task/IAgentFactory.ts | 28 | DELETE (§4.9) |
| 49 | process/task/IAgentManager.ts | 30 | DELETE (§4.9) |
| 50 | process/task/IpcAgentEventEmitter.ts | 53 | DELETE (§4.9) |
| 51 | process/task/IWorkerTaskManager.ts | 19 | DELETE (§4.9) |
| 52 | process/task/WorkerTaskManager.ts | 123 | DELETE (§4.9) |
| 53 | process/task/agentTypes.ts | 17 | DELETE (§4.9) |
| 54 | process/task/workerTaskManagerSingleton.ts | 86 | DELETE (§4.9) |
| 55 | process/utils/analyticsId.ts | 41 | KEEP |
| 56 | process/utils/appMenu.ts | 77 | KEEP |
| 57 | process/utils/configureChromium.ts | 389 | KEEP |
| 58 | process/utils/configureConsole.ts | 21 | DELETE |
| 59 | process/utils/configureConsoleLog.ts | 81 | KEEP |
| 60 | process/utils/credentialCrypto.ts | 109 | DELETE |
| 61 | process/utils/deepLink.ts | 78 | KEEP |
| 62 | process/utils/ensureAdminUser.ts | 78 | KEEP |
| 63 | process/utils/index.ts | 18 | KEEP |
| 64 | process/utils/initAgent.ts | 414 | DELETE (级联) |
| 65 | process/utils/initBridge.ts | 15 | KEEP |
| 66 | process/utils/initStorage.ts | 633 | KEEP |
| 67 | process/utils/mainLogger.ts | 43 | DELETE(级联,§7.2) |
| 68 | process/utils/mainWindowLifecycle.ts | 39 | KEEP |
| 69 | process/utils/message.ts | 143 | DELETE |
| 70 | process/utils/migrateAssistants.ts | 270 | KEEP (UC-B) |
| 71 | process/utils/openclawUtils.ts | 30 | DELETE (级联) |
| 72 | process/utils/previewUtils.ts | 84 | DELETE |
| 73 | process/utils/resetPasswordCLI.ts | 70 | KEEP |
| 74 | process/utils/runBackendMigrations.ts | 93 | KEEP (UC-B) |
| 75 | process/utils/safeExec.ts | 173 | DELETE |
| 76 | process/utils/tray.ts | 296 | KEEP |
| 77 | process/utils/utils.ts | 460 | KEEP |
| 78 | process/utils/webuiConfig.ts | 336 | KEEP |
| 79 | process/utils/zoom.ts | 136 | KEEP |
(process/resources/skills/ 目录只含 .DS_Store,不计)
文档结束。