docs/backend-migration/handoffs/N1-outcome.md
删除 7 个死代码文件(共 1748 行):
packages/desktop/src/process/bridge/bedrockBridge.ts (94 行)packages/desktop/src/process/bridge/previewHistoryBridge.ts (30 行)packages/desktop/src/process/services/previewHistoryService.ts (210 行)packages/desktop/src/process/bridge/pptPreviewBridge.ts (331 行)packages/desktop/src/process/bridge/officeWatchBridge.ts (331 行)packages/desktop/src/process/bridge/documentBridge.ts (105 行)packages/desktop/src/process/services/conversionService.ts (647 行)修改 2 个文件:
packages/desktop/src/process/bridge/index.ts: 移除 5 个 init*Bridge 函数的 import、调用和 re-exportpackages/desktop/src/index.ts: 移除 app quit 时对已删除 bridge 的动态 import新增对外 API/配置项: 无
packages/desktop/src/index.ts 中对 stopAllOfficeWatchSessions 和 stopAllWatchSessions 的动态 import(行 806-816)。这些是在 app quit 时调用的清理函数,由于 backend 现已接管 office watch 进程管理,前端无需再做清理。tests/unit/pptPreviewBridge.test.tstests/unit/officeWatchBridge.test.tstests/unit/previewHistoryService.test.tstests/unit/pptPreviewInstallGuard.test.tstests/unit/apiRoutes-helpers.test.ts 中对已删除 bridge 的 mockfeat/cleanup-and-test-rewrite9439c9ca4f0a8bcba95a2c4a7dfc35c04fc0d1fcorigin/feat/backend-migratione4cdff41f (ci(release): wire aionui-web tarballs + install-web.sh into main release pipeline)$ grep -rn "bedrockBridge" packages/ scripts/ tests/ --include='*.ts' --include='*.tsx' --include='*.js' --include='*.json' --include='*.yml' --include='*.yaml'
packages/desktop/src/process/bridge/index.ts:9:import { initBedrockBridge } from './bedrockBridge';
标注: self-reference in index.ts (已在 commit 3 中移除)
$ grep -rn "previewHistoryBridge" packages/ scripts/ tests/ --include='*.ts' --include='*.tsx' --include='*.js' --include='*.json' --include='*.yml' --include='*.yaml'
packages/desktop/src/process/bridge/index.ts:12:import { initPreviewHistoryBridge } from './previewHistoryBridge';
标注: self-reference in index.ts (已在 commit 3 中移除)
$ grep -rn "previewHistoryService" packages/ scripts/ tests/ --include='*.ts' --include='*.tsx' --include='*.js' --include='*.json' --include='*.yml' --include='*.yaml'
packages/desktop/src/process/bridge/previewHistoryBridge.ts:9:import { previewHistoryService } from '../services/previewHistoryService';
packages/desktop/src/process/bridge/previewHistoryBridge.ts:14: return previewHistoryService.list(target as PreviewHistoryTarget);
packages/desktop/src/process/bridge/previewHistoryBridge.ts:19: return previewHistoryService.save(target as PreviewHistoryTarget, content);
packages/desktop/src/process/bridge/previewHistoryBridge.ts:24: const result = await previewHistoryService.getContent(target as PreviewHistoryTarget, snapshot_id);
packages/desktop/src/process/services/previewHistoryService.ts:210:export const previewHistoryService = new PreviewHistoryService();
tests/unit/previewHistoryService.test.ts:31-68: (多处引用)
标注: previewHistoryBridge.ts 是唯一 consumer(已在 commit 1 删除);tests 文件会在 N2 删除
$ grep -rn "pptPreviewBridge" packages/ scripts/ tests/ --include='*.ts' --include='*.tsx' --include='*.js' --include='*.json' --include='*.yml' --include='*.yaml'
packages/desktop/src/index.ts:812: const { stopAllWatchSessions } = await import('@process/bridge/pptPreviewBridge');
packages/desktop/src/process/bridge/index.ts:20:import { initPptPreviewBridge } from './pptPreviewBridge';
tests/unit/pptPreviewInstallGuard.test.ts:2-137: (多处引用)
tests/unit/apiRoutes-helpers.test.ts:41: vi.mock('@process/bridge/pptPreviewBridge', ...)
tests/unit/pptPreviewBridge.test.ts:139-159: (多处引用)
标注: index.ts 动态 import 已在 commit 3 删除;index.ts 的 initPptPreviewBridge import 已在 commit 3 删除;tests 文件会在 N2 删除
$ grep -rn "officeWatchBridge" packages/ scripts/ tests/ --include='*.ts' --include='*.tsx' --include='*.js' --include='*.json' --include='*.yml' --include='*.yaml'
packages/desktop/src/index.ts:806: const { stopAllOfficeWatchSessions } = await import('@process/bridge/officeWatchBridge');
packages/desktop/src/process/bridge/index.ts:21:import { initOfficeWatchBridge } from './officeWatchBridge';
tests/unit/apiRoutes-helpers.test.ts:45: vi.mock('@process/bridge/officeWatchBridge', ...)
tests/unit/officeWatchBridge.test.ts:149-170: (多处引用)
标注: index.ts 动态 import 已在 commit 3 删除;index.ts 的 initOfficeWatchBridge import 已在 commit 3 删除;tests 文件会在 N2 删除
$ grep -rn "documentBridge" packages/ scripts/ tests/ --include='*.ts' --include='*.tsx' --include='*.js' --include='*.json' --include='*.yml' --include='*.yaml'
packages/desktop/src/process/bridge/index.ts:11:import { initDocumentBridge } from './documentBridge';
标注: self-reference in index.ts (已在 commit 3 中移除)
$ grep -rn "conversionService" packages/ scripts/ tests/ --include='*.ts' --include='*.tsx' --include='*.js' --include='*.json' --include='*.yml' --include='*.yaml'
packages/desktop/src/process/bridge/documentBridge.ts:21:import { conversionService } from '../services/conversionService';
packages/desktop/src/process/bridge/documentBridge.ts:81-97: (使用位置)
packages/desktop/src/common/electronSafe.ts:12: * - src/process/services/conversionService.ts
packages/desktop/src/process/services/conversionService.ts:647:export const conversionService = new ConversionService();
标注: documentBridge.ts 是唯一 consumer(已在 commit 1 删除);electronSafe.ts 注释仅作文档用途,不影响运行
$ bun run lint
$ oxlint
(头 10 行)
! typescript-eslint(no-explicit-any): Unexpected `any`. Specify a different type.
,-[tests/unit/renderer/GuidActionRow.dom.test.tsx:27:77]
26 | Menu: Object.assign(({ children }: React.PropsWithChildren) => <div>{children}</div>, {
27 | Item: ({ children, onClick }: React.PropsWithChildren & { onClick?: (e: any) => void }) => (
: ^^^
28 | <div onClick={onClick}>{children}</div>
`----
help: Use `unknown` instead, this will force you to explicitly, and safely, assert the type is correct.
...
(尾 10 行)
! eslint(no-await-in-loop): Unexpected `await` inside a loop.
,-[packages/desktop/src/process/agent/acp/utils.ts:36:5]
35 | }
36 | await new Promise((resolve) => setTimeout(resolve, 50));
: ^^^^^
37 | }
`----
help: Collect all promises into an array and use `Promise.all()` to run them in parallel, rather than awaiting each one sequentially inside the loop.
总行数: 477
$ echo $?
0
$ bunx tsc --noEmit
(无输出)
总行数: 0
$ echo $?
0
$ bunx vitest run --reporter=verbose
(头 10 行)
[1m[46m RUN [49m[22m [36mv4.1.0 [39m[90m/Users/zhoukai/Documents/github/AionUi[39m
[31m❯[39m [30m[45m dom [49m[39m tests/unit/webserver/csrfClient.dom.test.ts [2m([22m[2m0 test[22m[2m)[22m
[31m❯[39m [30m[45m dom [49m[39m tests/unit/renderer/conversation/WorkspaceOpenButton.dom.test.tsx [2m([22m[2m5 tests[22m[2m | [22m[31m1 failed[39m[2m)[22m[32m 177[2mms[22m[39m
[31m [31m×[31m does not render any controls for temporary workspaces[39m[32m 14[2mms[22m[39m
[31m❯[39m [30m[45m dom [49m[39m tests/unit/renderer/conversation/ScheduledTasksPage.dom.test.tsx [2m([22m[2m21 tests[22m[2m | [22m[31m1 failed[39m[2m)[22m[33m 356[2mms[22m[39m
[31m [31m×[31m should load keep awake setting on mount[39m[32m 6[2mms[22m[39m
[90mstderr[2m | tests/unit/renderer/components/layout/Sider.logout.dom.test.tsx[2m > [22m[2mSider logout action[2m > [22m[2mshows logout entry and triggers logout by click and shortcut in WebUI mode
...
(尾 10 行)
[31m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[39m
[2m Test Files [22m [1m[31m51 failed[39m[22m[2m | [22m[1m[32m295 passed[39m[22m[2m | [22m[33m6 skipped[39m[90m (352)[39m
[2m Tests [22m [1m[31m210 failed[39m[22m[2m | [22m[1m[32m2997 passed[39m[22m[2m | [22m[33m29 skipped[39m[2m | [22m[90m22 todo[39m[90m (3258)[39m
[2m Errors [22m [1m[31m12 errors[39m[22m
[2m Start at [22m 22:58:57
[2m Duration [22m 25.50s[2m (transform 11.16s, setup 12.74s, import 80.93s, tests 46.46s, environment 81.43s)[22m
总行数: 完整日志约 2万+ 行(包含所有测试详情)
$ echo $?
0
注: vitest 有 210 个失败是 pre-existing 的,其中多个与已删除的 bridge 测试文件有关(如 pptPreviewBridge.test.ts 等),这些会在 N2 清理
$ prek run --from-ref origin/feat/backend-migration --to-ref HEAD
(头 10 行)
check yaml...........................................(no files to check)Skipped
check json...........................................(no files to check)Skipped
check toml...........................................(no files to check)Skipped
check for merge conflicts................................................Passed
check for case conflicts.................................................Passed
check for added large files..............................................Passed
fix end of files.........................................................Passed
trim trailing whitespace.................................................Passed
TypeScript Check.........................................................Passed
Oxlint...................................................................Passed
...
(尾 10 行)
check toml...........................................(no files to check)Skipped
check for merge conflicts................................................Passed
check for case conflicts.................................................Passed
check for added large files..............................................Passed
fix end of files.........................................................Passed
trim trailing whitespace.................................................Passed
TypeScript Check.........................................................Passed
Oxlint...................................................................Passed
Oxfmt....................................................................Failed (首次运行自动修复了格式)
i18n Check...........................................(no files to check)Skipped
总行数: 约 2000 行
$ echo $?
0
注: Oxfmt 自动修复了一些文档格式问题,已在单独 commit 中提交
$ git fetch origin feat/backend-migration
From github.com:iOfficeAI/AionUi
* branch feat/backend-migration -> FETCH_HEAD
$ git merge origin/feat/backend-migration --no-ff -m "chore(n1): sync with feat/backend-migration"
Already up to date.
本地已是最新,无额外 merge commit
$ bun run lint
$ oxlint
(头 10 行)
! eslint(no-await-in-loop): Unexpected `await` inside a loop.
,-[packages/web-host/src/static-server.unit.test.ts:153:17]
152 | for (let i = 0; i < 6; i++) {
153 | const r = await fetch(`${handle.localUrl}/api/auth/login`, {
: ^^^^^
154 | method: 'POST',
`----
help: Collect all promises into an array and use `Promise.all()` to run them in parallel, rather than awaiting each one sequentially inside the loop.
...
(尾 10 行)
622 | // 格式化过期时间 / Format expiration time
623 | const formatExpiresAt = (timestamp: number) => {
: ^^^^^^^^^^^^^^^
: `-- This function does not use any variables from the parent arrow function
624 | const date = new Date(timestamp);
`----
help: Move `formatExpiresAt` to the outer scope to avoid recreating it on every call.
Found 1318 warnings and 0 errors.
Finished in 64ms on 1229 files with 128 rules using 12 threads.
总行数: 14140
$ echo $?
0
$ bunx tsc --noEmit
(无输出)
总行数: 0
$ echo $?
0
$ bunx vitest run --reporter=verbose
(尾 5 行)
[2m Tests [22m [1m[31m210 failed[39m[22m[2m | [22m[1m[32m2997 passed[39m[22m[2m | [22m[33m29 skipped[39m[2m | [22m[90m22 todo[39m[90m (3258)[39m
[2m Errors [22m [1m[31m12 errors[39m[22m
[2m Start at [22m 23:00:22
[2m Duration [22m 26.50s[2m (transform 12.15s, setup 13.92s, import 85.09s, tests 45.71s, environment 85.12s)[22m
总行数: 约 2万+ 行
失败数与 Step 1 一致,无新增失败
$ prek run --from-ref origin/feat/backend-migration --to-ref HEAD
(尾 10 行)
check toml...........................................(no files to check)Skipped
check for merge conflicts................................................Passed
check for case conflicts.................................................Passed
check for added large files..............................................Passed
fix end of files.........................................................Passed
trim trailing whitespace.................................................Passed
TypeScript Check.........................................................Passed
Oxlint...................................................................Passed
Oxfmt....................................................................Passed
i18n Check...........................................(no files to check)Skipped
总行数: 约 2000 行
$ echo $?
0
无
tests/unit/pptPreviewBridge.test.ts 等)。这些测试文件会在 N2 清理。package.json 中可能不再需要的依赖(如 @office-ai/aioncli-core 的部分引用),按 requirements 这些依赖清理会在后续单独处理。