Adnify — AI 原生工程工作台
| 项目 | 内容 |
|---|---|
| 仓库 | ad-naan/Adnify |
| 官网 | adnaan.one |
| 许可证 | Custom License |
| 技术栈 | Electron · React 18 · TypeScript · Monaco · SQLite / LanceDB |
| 我的角色 | 核心贡献者(贡献量第二,约 194 commits) |
| 文档语言 | 中文 README · English |
Adnify 是一款 local-first 的 AI Agent IDE:把代码编辑、AI 执行、素材生成和浏览器验证放进同一个桌面工作区。
它不是「聊天窗 + 编辑器」的拼装,而是两套目标明确的工作流:
| 模式 | 做什么 | 适合 |
|---|---|---|
| Agent Mode | 同一线程里问答、检索、改文件、跑命令、验结果 | 直接干活 |
| Plan Mode | 需求确认 → 任务图审查 → 依赖感知执行 → 结果验收 | 大任务、要可审查的编排 |
工具权限、检查点、诊断、循环检测和异常恢复,让自动执行过程可观察、可审批、可回退。
架构(为什么值得读)
Section titled “架构(为什么值得读)”Adnify 用 Electron 把「会碰机器的部分」和「只负责交互的部分」切开:
Renderer (React UI / Agent kernel / Plan workbench) │ typed contextBridge ▼Preload → IPC handlers ▼Main process (fs / shell / LLM / MCP / LSP / notifications) ▼Utility processes (索引 · 会话 SQLite · 素材 · 大文档解析)要点:
- Renderer 负责编辑器、Agent 界面、Plan 工作台、终端体验;Agent 与 Plan 任务复用同一套执行内核(模型路由、工具策略、审批、预算、恢复)。
- Main 是特权边界:文件系统、shell、更新、通知都走 IPC,preload 不直接把 Node 暴露给页面。
- 独立服务进程按需拉起索引和 SQLite;同工作区多窗口共用索引服务,避免每个窗各起一套重活。
对贡献者来说,这意味着:改 UI 时要想清状态落在 store 还是会话进程;改终端 / 远程文件 / 更新时,优先落在 main + IPC 契约,而不是在 renderer 里偷跑特权 API。
官方架构图与进程隔离说明见仓库 README 架构章节 与 process-isolation。
- 工作区操作:作用域授权 + Diff 预览下的读写删移
- 代码智能:文本 / 正则检索、LanceDB 语义搜索、LSP 符号与诊断
- 终端:前台 / 后台命令、实时输出、交互输入、可靠退出码
- 研究与集成:Web 搜索、URL 读取、MCP、可复用 Skills
- 上下文引用:
@codebase、@git、@terminal、@symbols、@web,也可拖入文件 - 模型:OpenAI / Anthropic / Google / DeepSeek / Ollama 及兼容接口
- 素材能力:接自己的图 / 视频 / 音频 HTTP API,任务内生成并入库
- 浏览器验证:打开预览页查 DOM / 样式 / 控制台,多设备视图,项目级登录态隔离
我参与过的方向
Section titled “我参与过的方向”下面按主题整理,便于以后回看「当时为什么要改」,而不是只列 PR 号。完整列表见 我的 PR。
1. 安全与终端边界
Section titled “1. 安全与终端边界”Agent 能跑 shell,边界必须硬。
- #108 — shell 命令白名单校验,收紧危险执行面
- #74 — 整理
secureTerminal后端与注释,分清职责 - #130 — dugite 不可用时的警告去重,避免噪音淹没真错误
- #18 — 终端崩溃与错误处理加固
2. 远程文件与更新通道
Section titled “2. 远程文件与更新通道”国内网络下,下载 / 更新经常是「功能有了但装不上」。
3. Agent 流式体验与工具审批
Section titled “3. Agent 流式体验与工具审批”流式输出和工具卡如果有竞态,用户会看到「字跳了 / 点了没反应」。
- #72 — 直接订阅 store,真正做到流式输出
- #71 — 修 streaming edit 索引竞态、
Promise.race定时器泄漏、LSP completion 泄漏 - #54 — AgentStatusBar / ChatPanel 工具审批按钮(#51)
- #42 — FileChangeCard / ToolCallCard 实时参数展示
4. 编辑器与工作区 UX
Section titled “4. 编辑器与工作区 UX”- #81 — 打开文件的滚动位置保存 / 恢复
- #163 — Git diff 与文件变更处理增强
- #15 / #16 — AI 内容里的 GFM 表格渲染
- #25 —
SafeHTML/SafeMarkdownHTML,避免不可信 HTML 直接进 DOM
5. 索引、构建与工程卫生
Section titled “5. 索引、构建与工程卫生”- #70 — 索引服务错误处理与工作区健壮性
- #129 / #86 — postinstall / WASM / electron-builder 依赖处理
- #161 — 统一抬高 Node 版本到 24.19.0,文档与配置对齐
- #12 — 防止更新检查无限挂起
6. Emotion-aware Agent(实验能力)
Section titled “6. Emotion-aware Agent(实验能力)”早期还做过一套「情绪感知」反馈链路:检测 → 上下文分析 → 编辑器条 / 音频提示 / adapter 回退。
以仓库当前文档为准;通常需要较新的 Node 与 pnpm:
git clone https://github.com/ad-naan/Adnify.gitcd Adnifypnpm installpnpm dev贡献前建议先读仓库的 Contributing 说明,并熟悉 src/main/ipc 与 src/shared 的契约边界——跨进程改动最容易在这里踩坑。