- wire SQLite control-plane access/session paths into Rust web local-folder routes - preserve local Markdown attachment semantics across upload, reload, and secondary-pane resource tabs - refresh design governance docs, Reasonix task templates, and bug records - retire root .mcp.json local MCP config
14 KiB
3-4 [done] mnote-web 3104 边界收口与退役方案 v1
更新时间:2026-04-23
关联文档:
/mnt/Data1T/mnote/ARCHITECTURE.md/mnt/Data1T/mnote/design/01-05-current-priority-overview.md/mnt/Data1T/mnote/design/03-rust-web/reference/3-rust-web-long-term-architecture-v1.md/mnt/Data1T/mnote/design/03-rust-web/process/3-3-rust-web-tree-realtime-event-stream-v1.md/mnt/Data1T/mnote/design/05-editor-mainline/process/5-5-page-aggregate-single-truth-alignment-v1.md
1. 文档目的
这份文档只回答一个已经进入架构层的问题:
当前
127.0.0.1:3104还有没有存在意义,是否应从系统主链中移除。
先给结论:
3104不应该继续作为用户、浏览器、前端 runtime 可感知的端口存在。在当前代码基线上,它已经不再是默认开发链、前端主链或 AI 主链的必需端口;
mnote-web若仍启动,也应退回为显式 debug/internal runtime。
因此当前正确目标不是:
- 继续接受多端口长期并存
- 或者为了“看起来只剩 3000”而直接硬删
3104
而是:
先把
3104收口为 internal-only 边界,再按依赖拆解顺序逐步退役,最终让前端公开主链只剩3000。
1.1 完成结论
截至 2026-04-23,这份方案针对“3104 作为默认/公开边界”的收口已经完成,当前可固定为:
3000是唯一前端公开入口- 正式主链已移除
MNOTE_WEB_BASE_URL、浏览器侧mnoteWebBaseUrl / mnoteWebTreeShellEnabled mnote-web默认监听地址已改为127.0.0.1:0,不再默认绑定3104/tree、/document-debug等 debug 壳仅在显式环境变量下注册- legacy smoke 只有在显式设置
MNOTE_WEB_SMOKE_BASE_URL时才会命中 debug runtime
需要额外说明的是:
若本机仍看到
127.0.0.1:3104监听,应视为旧mnote-web进程残留,不代表当前默认启动链。
2. 当前真实状态
2.1 3104 当前是什么
3104 曾对应 Rust mnote-web 的默认监听地址,而不是首页入口端口。
当前 mnote-web crate 仍承载的能力包括:
/health/tree/document-debug/api/tree/commands/api/stream/events/api/hermes/bridge/api/compat/next/sidebar
这说明它不是单纯“没人用的历史残留壳”,而是:
一个仍保留 debug / compat / internal transport 能力的 Rust Web 组件。
2.2 当前真正的问题不在“它存在”,而在“它泄漏”
当前最不应该发生的事情,不是 mnote-web 作为内部服务存在,而是:
- 浏览器 runtime 直接知道
mnoteWebBaseUrl - 前端页面逻辑直接拼
3104 - smoke / 调试脚本把
3104当成正式主入口前提 - 新功能继续优先接到
mnote-web compat路由
换句话说,问题的关键不是:
“有没有本机内部回源端口”
而是:
“这个内部回源边界是否继续污染前端主链与长期架构”。
2.3 当前已经完成的一次收口
当前已经确认完成的收口包括:
- 浏览器公开 runtime 不再暴露
mnoteWebBaseUrl - Sidebar tree stream 浏览器侧统一走同源
3000/api/mnote-web/stream public/mnote-env.json不再公开mnoteWebBaseUrl- AI orchestrator 主链已不再依赖
MNOTE_WEB_BASE_URL - 默认开发链不再启动或要求
mnote-web:3104 - legacy smoke 不再默认指向
3104,必须显式传入 debug runtime 地址 mnote-web默认监听地址已不再固定为127.0.0.1:3104
因此现在的架构判断应改写为:
3000已经是前端唯一公开主入口,而3104已从默认边界退回到显式 debug/internal-only。
3. 为什么现在还不能直接删除 3104
当前已经不再存在正式产品链必须依赖 3104 的情况,但仍保留三类遗留能力面需要继续降级:
3.1 Tree realtime contract 仍未完全对齐最终主链协议
当前 3000/api/mnote-web/stream 已不再回源 mnote-web /api/stream/events,但它仍是一个 Next route 级的过渡 transport,而不是最终的统一 realtime 主链。
因此当前现实不是:
3000已经原生持有 tree realtime transport
而是:
3000已完成对3104的切断- 正式 realtime contract 仍需继续向
snapshot / delta / resync单一主链收口
3.2 Hermes / AI tool registry 归属仍需继续收口
2026-05-13 口径更新:本文记录的是 3104 退役阶段的历史边界判断,不再代表当前 AI 长期编排主线。当前 AI 长期方向已改为 Hermes 页面内客户端 + mnote Hermes skill/plugin;旧 openai-agents-python 编排层与旧 /api/hermes/bridge 只作为历史或兼容路径看待。
当前前端 AI route 与后端 openai-agents-python 编排层已经不再通过 MNOTE_WEB_BASE_URL 回源 mnote-web /api/hermes/bridge 获取 runtime tool 结果,而是走后端 orchestration + 本地 bridge-runtime。
这意味着:
3104已不再阻塞 AI 主链- 但 AI tool registry / tool result contract 的正式归属还需继续明确
3.3 仍保留实验 / 调试 / compat 壳
以下链路仍带有明显过渡期性质:
/tree/document-debugcompat/next/sidebar- 旧 smoke 脚本仍可在显式传入 runtime 地址后命中 debug runtime
/api/auth/mnote-web-token仍保留给 legacy debug/runtime smoke
这些路径已不在当前主路径上,但说明:
mnote-web仍处于“内核能力 + compat + 调试壳”混杂状态。
在这种状态下直接删掉全部 debug/runtime 入口,会丢失排障和对照手段;因此当前应做的是“默认退役 + 显式 debug 化”,而不是直接物理删除所有相关代码。
4. 当前必须立即固定的架构口径
4.1 对用户与浏览器的公开口径
当前必须固定为:
- 页面访问入口只有
3000 - 浏览器不得显式依赖
3104 - 前端公开 runtime / public config 不得再暴露
mnoteWebBaseUrl
4.2 对系统内部的口径
当前必须固定为:
3104只允许作为 loopback internal service 存在- 它不是产品入口
- 它不是长期对外 contract
- 它只是 Rust Web transport 尚未并入最终主链前的内部边界
4.3 对未来收口方向的口径
当前必须固定为:
长期目标不是保留
3000 + 3104双长期入口,而是把3104承担的正式能力迁走,最终退役3104。
5. 需要立即回退或禁止继续扩散的方向
下面这些方向应该立即视为错误方向:
5.1 禁止浏览器继续读取 mnoteWebBaseUrl
包括但不限于:
- 浏览器组件中直接构造
http://127.0.0.1:3104 - 通过 runtime config 让前端知道
mnote-web基址 - 新页面逻辑绕过同源
3000,直接访问3104
5.2 禁止把新长期业务继续堆进 compat
尤其不能继续把以下长期语义放进 mnote-web compat:
- 正式 sidebar 数据 contract
- 正式 page aggregate contract
- 正式 tree realtime contract
- 正式 AI tool orchestration contract
compat 只能继续承担:
- 过渡转接
- 旧链路对照
- fixture / smoke 支持
不能继续成为新增长期业务的落点。
5.3 禁止把 /tree 与 /document-debug 当成正式页面主链
它们可以保留为:
- 实验壳
- 调试入口
- 迁移对照入口
但不能继续被当成:
- 首页入口前置条件
- 正式文档页 transport
- 页面内主编辑区 runtime 壳
5.4 禁止新 smoke 把 3104 当产品主链前提
后续 smoke 要区分两类:
3000主站 smokemnote-web内部服务 smoke
不能再写成:
“只要功能涉及 Rust,就默认直接打
3104”
6. 3104 退役的阶段方案
6.1 Phase 0:公开边界收口
目标:
- 前端主链只公开
3000 - 浏览器不再感知
3104 3104收回 internal-only
当前状态:
- 已完成
完成定义:
- 浏览器公开 runtime 不再暴露
mnoteWebBaseUrl - Sidebar realtime 浏览器侧走同源
3000/api/mnote-web/stream public/mnote-env.json不再公开3104- 浏览器主链已不再消费
mnoteWebBaseUrl / mnoteWebTreeShellEnabled public/mnote-env.json已去除mnoteWebTreeShellEnabled
说明:
这一步解决的是“前端被多端口污染”的问题,不等于
3104已退役。
6.2 Phase 1:把正式 sidebar/query 能力移出 compat
目标:
sidebar正式查询链不再依赖mnote-web /api/compat/next/sidebar3000直接消费 Rust bridge / kernel projection 正式 contract
当前状态:
- 已完成
已完成:
/api/sidebar已优先走 Rust bridge query,而不是继续扩compat sidebar- 正式前端链路已不再调用
fetchSidebarDatasetFromMnoteWeb
已完成补充:
compat/next/sidebar已明确降级为过渡 / 调试用途- 依赖
compat sidebar的旧链路已收口为 legacy debug smoke,且必须显式传入MNOTE_WEB_SMOKE_BASE_URL
6.3 Phase 2:tree realtime transport 正式并入主链
目标:
3000或其背后的正式服务直接承载 tree realtime contract- 不再通过 Next route 反代
3104 /api/stream/events
当前状态:
- 已完成
完成定义:
3000的 tree stream 不再依赖MNOTE_WEB_BASE_URL- realtime stream contract 与
3-3文档统一 - snapshot / delta / resync 成为正式主链,而不是代理式过渡链
mnote-web /api/stream/events不再是前端主站 realtime 前置
备注:
这是
3104能否退役的第一硬前提。只要 realtime stream 还在内部回源3104,它就不能删除。
6.4 Phase 3:Hermes runtime bridge 从 mnote-web 迁出
目标:
- AI runtime tool bridge 不再强依赖
MNOTE_WEB_BASE_URL - 历史
openai-agents-python编排层不再被描述为长期 AI 服务面;新的正式边界是 Hermes client proxy + mnote Hermes plugin
推荐方向:
- 由 Hermes 持有 session / run / tool event / usage / model 编排
- Rust
bridge-runtime作为 mnote 业务语义执行层,经 Hermes skill/plugin 暴露 3000只负责页面与同源 API 边界,不再额外绕回3104
当前状态:
- 已完成
完成定义:
- 前端 AI run route 不再通过
mnote-web /api/hermes/bridge获取 tool 结果 - 后端
ai_document_agent.py不再把MNOTE_WEB_BASE_URL作为正式硬依赖 - AI tool registry / tool result contract 有独立正式归属
备注:
这是
3104能否退役的第二硬前提。只要 AI tool bridge 还依赖它,它就不是可删除端口。
6.5 Phase 4:实验壳与调试入口降级
目标:
/tree/document-debug- 旧
tree shell - 与
3104直连的实验 host
全部明确降级为:
- debug only
- spike only
- legacy fallback only
当前状态:
- [~] 部分完成
完成定义:
- 正式产品链不再依赖
/tree - 正式文档页不再依赖
/document-debug - 仍保留的实验组件不再混入默认主链
- legacy smoke 已改为显式传入
MNOTE_WEB_SMOKE_BASE_URL才会触发 debug runtime /tree与/document-debug已改成仅在显式 debug 开关下注册
已完成:
- 浏览器侧 runtime config 不再兜底暴露
mnoteWebBaseUrl leptos_tiptap_iframe_debug不再通过mnoteWebBaseUrl推导调试 runtime 地址MnoteWebTreeShell已从前端正式代码路径移除mnote-web默认已不再注册/tree、/document、/document-debug
6.6 Phase 5:正式退役 3104
当前状态:
- 已完成
前提必须同时满足:
- Sidebar / tree query 正式主链不再依赖
compat sidebar - tree realtime transport 已从
3104迁出 - Hermes runtime bridge 已从
3104迁出 /tree与/document-debug已降为非正式必需- 开发启动链不再要求单独拉起
mnote-web:3104
完成定义:
- 默认开发工作流中不再需要
3104 MNOTE_WEB_BASE_URL从正式主链配置中删除mnote-web若仍存在,则只作为显式 debug/internal app 运行,而不是长期内网网关- 运行态旧
mnote-web:3104残留进程已清理;最新二进制默认启动不再监听3104
说明:
3-4的完成定义是退役3104作为默认/公开边界,不等于mnote-web、tree realtime contract 或 AI tool registry 的所有后续演进已经结束。相关后续工作分别继续由
3-3-rust-web-tree-realtime-event-stream-v1.md与07-ai主线承接,但它们不再构成3104退役阻塞。
7. 推荐执行顺序
当前建议顺序固定为:
- 完成
Phase 2tree realtime transport 收口 - 完成
Phase 3Hermes runtime bridge 迁移 - 完成
Phase 4实验 / 调试壳降级 - 最后执行
Phase 5退役3104
原因很简单:
- realtime 是前端主链的硬依赖
- AI bridge 是在线 AI 的硬依赖
- 调试入口最后再降级,避免迁移过程失去观测手段
8. 与 8123 的关系
8123 与 3104 不是同一类问题。
8123 当前更接近:
- spike runtime
- leptos-tiptap 独立开发端口
- 开发期资产构建 / 调试端口
而 3104 当前更接近:
mnote-web内部 transport 边界- Rust Web 正式能力尚未完全并入主链前的内网服务
所以当前不应把两者混为一谈。
正确顺序是:
- 先解决
3104的正式能力迁移与边界退役 - 再继续压缩
8123这类 spike / dev runtime 端口
9. 一句话收口
当前关于 3104 的正确判断不是:
“它已经没用了,可以直接删。”
也不是:
“既然浏览器看不到,就可以长期保留。”
而是:
3104现在仍有内部存在意义,但这种意义是过渡性的。当前必须把它严格收口为 internal-only,并以 tree realtime 与 AI runtime bridge 迁移为前提,最终退役。