P1 修复面收口: v0.6.3 截断自愈推全量(Anthropic/Ollama/非流式/引擎兜底); SSE 上游错误帧检测进重试通道; clearMessages 摘要游标根治; truncateResult 内联图片白名单统一; 前端四 bug(确认弹窗锁死/MemoryViewer/ Virtuoso Footer/abort 尾部过滤) + reasoning 缓冲跨迭代污染; 托盘通知过滤与新建会话死链接线 P2 安全纵深: MCP 审批闭环(ConfirmationHook×PolicyEngine 联动+重名拒注册); SSRF 收敛 ssrf-guard 共享模块 (web_fetch 双通道校验+重定向终态复检); Electron 加固(preload CJS 化→sandbox:true/CSP/权限白名单/will-navigate); run_command cmd.exe 白名单通道元字符守门; diff_viewer 10MB 预检; Anthropic thinking 预算下限; Agnes 思考显式关闭 P3 架构还债: OpenAICompatibleAdapter 中间基类收敛四家样板; 错误分类单轨化(删 mapError/getFetchSignal, 超时显式 ETIMEDOUT); PRAGMA user_version 迁移版本化; 死代码清理专项(cn.ts/SHORTCUTS/ContextMenu 分支/ getWindowState/modifiedArgs/sandbox 空壳); i18next 引入; a11y 第一轮; SearXNG 页批量草稿模型统一 P4 能力演进: Ollama pull 可取消/capabilities 探测/num_ctx 实测缓存; UpdateService feed 比对式自动更新 (app:updateCheck IPC + StatusBar 入口); MiMo providerOptions(web_search 服务端工具/strict JSON); web_fetch extract_mode=markdown(turndown); network.proxyUrl 全局代理(Chromium sessions+undici dispatcher) 测试: 264 → 507 用例(Electron ABI 全绿零跳过), 覆盖引擎压缩管线/重试竞速/MEMORY.md 闸门/file_editor 五操作/ filesystem 七工具实体夹具/git 真实仓库/SSE 错误帧/全线截断自愈/Provider 请求形态矩阵/SSRF 表测/钩子分级矩阵/ OutputValidator 全量/SLO 指标/MCP 安全纯函数/task_manager 链路/渲染层纯域/i18n 桥契约
87 lines
3.1 KiB
TypeScript
87 lines
3.1 KiB
TypeScript
import { defineConfig, externalizeDepsPlugin } from 'electron-vite';
|
||
import react from '@vitejs/plugin-react';
|
||
import tailwindcss from '@tailwindcss/vite';
|
||
import { resolve } from 'path';
|
||
import { readFileSync } from 'fs';
|
||
|
||
// P2-12: 从 package.json 读取版本号,构建期注入渲染进程(StatusBar 兜底显示)
|
||
const pkg = JSON.parse(readFileSync(resolve(__dirname, 'package.json'), 'utf-8')) as { version: string };
|
||
|
||
export default defineConfig({
|
||
main: {
|
||
plugins: [externalizeDepsPlugin()],
|
||
build: {
|
||
outDir: 'dist-electron/main',
|
||
rollupOptions: {
|
||
input: { main: resolve(__dirname, 'electron/main.ts') },
|
||
},
|
||
},
|
||
},
|
||
preload: {
|
||
plugins: [externalizeDepsPlugin()],
|
||
build: {
|
||
outDir: 'dist-electron/preload',
|
||
rollupOptions: {
|
||
input: { preload: resolve(__dirname, 'electron/preload.ts') },
|
||
// v0.6.4 安全加固: 强制 CJS 输出(.cjs)—— package.json "type":"module" 下
|
||
// electron-vite 默认产出 ESM .mjs,而 Electron sandbox 不支持 ESM preload。
|
||
// CJS 化后 window-manager 可启用 sandbox:true(Electron 安全清单第 1 条)。
|
||
// 注意:electron-vite 的 preload 构建不支持多输出数组,必须用单对象配置。
|
||
output: {
|
||
format: 'cjs',
|
||
entryFileNames: '[name].cjs',
|
||
chunkFileNames: '[name].cjs',
|
||
assetFileNames: '[name].[ext]',
|
||
},
|
||
},
|
||
},
|
||
},
|
||
renderer: {
|
||
root: '.',
|
||
plugins: [react(), tailwindcss()],
|
||
define: {
|
||
__APP_VERSION__: JSON.stringify(pkg.version),
|
||
},
|
||
resolve: {
|
||
alias: {
|
||
'@renderer': resolve(__dirname, 'src'),
|
||
'@shared': resolve(__dirname, 'electron/harness/types'),
|
||
},
|
||
},
|
||
build: {
|
||
outDir: 'dist',
|
||
rollupOptions: {
|
||
input: { main: resolve(__dirname, 'index.html') },
|
||
output: {
|
||
// v0.5.0: 代码分割 — 此前全部打进单个 2.6MB chunk,首屏加载随业务代码线性膨胀。
|
||
// 拆出稳定的第三方 vendor chunk(缓存友好:业务代码变更不再使整个 bundle 失效)
|
||
manualChunks(id: string): string | undefined {
|
||
if (!id.includes('node_modules')) return undefined;
|
||
// React 运行时 + 状态管理
|
||
if (/[\\/]node_modules[\\/](react|react-dom|scheduler|zustand)[\\/]/.test(id)) {
|
||
return 'vendor-react';
|
||
}
|
||
// MUI 组件体系 + Emotion 样式引擎
|
||
if (id.includes('@mui') || id.includes('@emotion')) {
|
||
return 'vendor-mui';
|
||
}
|
||
// Markdown 渲染链(react-markdown/remark/rehype/micromark/highlight.js 等)
|
||
if (
|
||
/(react-markdown|remark-|rehype-|micromark|mdast-|unified|unist-|hast-|highlight\.js|lowlight|vfile|trough|bail)/.test(
|
||
id,
|
||
)
|
||
) {
|
||
return 'vendor-markdown';
|
||
}
|
||
// 图标库(lucide 按需引入但仍占可观体积)
|
||
if (id.includes('lucide-react')) {
|
||
return 'vendor-icons';
|
||
}
|
||
return undefined;
|
||
},
|
||
},
|
||
},
|
||
},
|
||
},
|
||
});
|