Skip to content

FNOS-002 DSH 应用与插件优化

项目内容
需求编号FNOS-002
提出日期2026-08-24
需求状态部分 NAS 验证(7 条业务用例、157 条自动化测试通过)
关联计划PLAN-FNOS-002 DSH 应用与插件优化

需求背景与目标

DSH 在 fnOS 中运行后,还有几处使用体验需要调整。Codex 登录状态和用量状态现在分散处理,未登录时仍可能显示状态,用量接口是否提供五小时窗口也没有反映到页面;NAS 引用可能改动输入框中的空格,输入框删除本次选择后 Tree 也不会同步取消勾选。FPK 网关仍由直接调用 node:http 的代码承担代理,三方插件使用自定义 API URL 时,还需要手工修改浏览器 bridge 的反代路径并重新打包 FPK。项目也缺少共享 Semi UI 组件的集中预览入口。

这些内容统一在 FNOS-002 中记录,当前重点是已进入开发的插件、网关和 DSH Web 恢复能力。DSH 运行时、插件、插件依赖和 FPK 发布还必须遵循同一版本约束;原 FNOS-003 的版本统一内容已迁移到本需求,避免版本要求与具体运行设置需求分散维护。

需求目标

  • 统一 Codex 登录与用量状态:只在确认登录后显示状态,用量接口提供五小时窗口时自动显示对应状态,接口未提供时自动隐藏。
  • NAS 文件和目录引用不改动用户已有文本;Tree 面板打开期间,当前操作插入的引用被删除时同步取消对应勾选。
  • 新增 DSH Semi UI 总览插件。
  • 使用 connecthttp-proxy-middleware 重写 FPK 网关,通过 tsdown 生成可直接随 FPK 分发的单文件入口;浏览器 Bridge 使用独立 JS 源文件维护,网关常驻时在 Web 左侧菜单提供“重启 Web”按钮。
  • 由 fnOS 插件管理三方插件 API URL 反代配置,网关监听配置并将匹配的绝对 URL 请求改写到统一网关下的 DSH 服务。
  • 统一 DSH 运行时、插件、插件依赖、native 产物、FPK 安装流程和发布文档的目标版本为 0.1.1-rc.2,并保留用户数据与配置。

涉及范围

模块目录或入口职责
Codex 插件plugins/dsh-codex-auth-plugin控制登录状态和用量窗口显示
fnOS 插件plugins/dsh-fnos-plugin处理 NAS 引用和三方插件 API URL 反代配置
共享 UIpackages/dsh-semi-ui、待新增总览插件展示共享组件和主题效果
网关源码包packages/fnos-gateway使用 connecthttp-proxy-middleware 和 tsdown 维护网关源码、独立浏览器 Bridge 与构建入口
FPK 网关产物apps/fn-deepseek-harness/app/gateway-proxy.mjs监听 fnOS Unix Socket,代理 DSH HTTP、WebSocket 和流式请求
项目文档docs/记录需求、调研结论和后续计划

功能列表

编号优先级功能用户行为状态
FNOS-002-01P1Codex 登录与用量状态未登录时不显示状态;登录和退出后及时更新;接口提供五小时窗口时自动显示对应状态已实现
FNOS-002-02P1NAS 引用与 Tree 状态插入引用时保留原文空格;面板打开期间删除本次引用后同步 Tree,历史引用不参与本次勾选已实现
FNOS-002-03P1Semi UI 总览插件点击插件入口后跳转到独立路由,查看共享组件及主题效果已实现
FNOS-002-04P1FPK 网关、进程恢复与 API URL 反代使用专业代理中间件;DSH Web 退出后,Web 端显示“重启 Web”按钮并从网关恢复;用户可配置三方插件 API URL 反代规则并即时生效部分验证

版本统一(跨功能约束)

版本统一不是新增功能编号,而是 FNOS-002 各功能的发布约束:

  • DSH 运行时、DSH 插件及 @deepseek-ai/dsh-* 依赖统一使用 0.1.1-rc.2
  • FPK 安装/升级回调、node-pty native 配置、已发布插件清单和相关文档必须与该版本一致。
  • 版本检查和升级不得清理 DSH_HOME、profile、凭据、工作区或现有插件配置。
  • 共享 UI 包继续由 workspace 管理,不作为 DSH 运行时插件重复安装。

交互和行为约束

  • Codex 未登录、加载中或鉴权失败时隐藏成功状态,登录入口保留。
  • 五小时用量以接口返回的 limit_window_seconds 为准;只有明确等于 18,000 秒的窗口才展示,不根据 primary_windowsecondary_window 的位置猜测。
  • 五小时窗口没有用户配置项,不写入插件设置;接口刷新后,设置卡片和对话输入区状态同步更新。
  • Codex 配置面板可同时展示五小时和每周窗口;对话输入区状态栏只展示一个紧凑窗口,优先五小时、否则每周,没有可识别窗口时隐藏。
  • NAS 引用只处理插入位置。前面已有空白时不补空格,没有空白时补一个空格。
  • fnOS Tree 面板每次打开时记录已有引用作为操作基线;面板打开后新插入的引用属于本次操作,之前已存在的引用不自动映射为当前 Tree 选中状态。
  • 面板保持打开时,用户从输入框删除本次操作插入的 structured reference,Tree 必须同步取消对应节点;删除历史引用不得改变当前 Tree 状态。
  • 当前操作关联使用 DSH occurrence 身份区分,不只按路径判断。同一路径存在历史引用和本次引用时,只同步本次 occurrence。
  • Semi UI 总览插件使用 @tnnevol/dsh-semi-ui 的公开组件,并覆盖浅色和深色主题。
  • 设置中的插件卡片只保留总览入口;点击后进入 #/plugins/semi-ui。总览页面使用 DSH shell.overlay 插槽呈现,不覆盖 conversationsidebar 等 single slot。
  • 总览路由支持浏览器前进、后退和刷新;关闭总览时返回进入前的 DSH 页面。未安装插件时该 Hash 不得影响 DSH 正常启动。
  • 网关源码放在 packages/fnos-gateway,使用 tsdown 将依赖打包到 apps/fn-deepseek-harness/app/gateway-proxy.mjs;NAS 安装阶段不再安装网关的 npm 依赖。
  • 浏览器注入代码必须放在独立 .js 文件中维护,不在 TypeScript 中保留 BRIDGE_SCRIPT_BODY 一类大段模板字符串。默认由构建插件使用 fs 读取源文件并作为虚拟模块内联到单文件 ESM,NAS 运行时不读取仓库源码路径。
  • HTML 默认直接注入构建后的 Bridge 内容;若以后改用 <script src>,必须由网关提供稳定的内部静态路由,并将对应资源纳入 FPK,不允许引用 packages/ 源码目录。
  • 网关监听 app/ui/config 声明的 app.sock,统一网关公开路径保持 /app/fn-deepseek-harness,上游固定为 DSH 回环地址 127.0.0.1:3080
  • FPK 运行状态以常驻网关进程为准,DSH Web PID 只表示可单独恢复的上游子进程;Web 退出不能清除网关状态或重复启动网关。
  • Web 正常时,浏览器 Bridge 在 DSH Web 左侧菜单提供“重启 Web”按钮;DSH Web 不可用时,网关提供带同名按钮的独立恢复页面。恢复接口只接受管理员的同源 POST 请求。
  • 启动中的 PID 先写临时状态,只有 DSH Web 健康检查通过后才原子替换正式 PID;失败时网关继续运行并展示错误。
  • 反代规则只决定三方插件绝对 API URL 是否补统一网关前缀,不作为接口访问权限控制;fnOS 网关登录校验与插件自身权限仍按原规则执行。
  • 自定义路径由 fnOS 插件设置卡片统一编辑,点击“保存”后写入 ${TRIM_PKGVAR}/gateway/path-allowlist.json;“放弃”恢复服务端已保存内容。
  • 网关通过 fs.watch 读取最新配置,并把完整快照推送给已打开的页面;配置变更不要求刷新 DSH Web。

不在本次范围内

  • 不修改 DSH 官方源码和 Codex OAuth 流程。
  • 不调整 Codex 模型调用、OAuth 和图片能力;用量接口只用于状态展示,不修改额度或刷新规则。
  • 不改动 NAS 授权、路径转换和权限校验规则。
  • 不把动态路径列表扩展成接口访问控制、防火墙或插件权限系统。
  • 不自动扫描三方插件源码推断 API URL;反代规则由用户在 fnOS 插件设置中明确维护。
  • 不对 DSH Web 进行无限自动重启;本阶段提供明确的人工恢复入口和并发启动保护。

验收条件与完成状态

P1 验收条件

  • Codex 登录状态在登录、退出和异常场景下显示正确。
  • 用量接口返回 18,000 秒窗口时显示五小时剩余额度和重置时间;未返回、字段不完整或请求失败时不显示该窗口。
  • 五小时窗口显隐不依赖用户设置,刷新用量后能根据最新接口响应自动变化。
  • NAS 文件和目录引用保留原文空格,不产生重复空格;面板打开期间删除本次引用会立即取消对应 Tree 勾选,历史引用不会进入当前选择状态。
  • Semi UI 总览插件可正常安装和卸载;点击入口可进入独立总览路由,浏览器前进、后退和刷新有效,组件在浅色、深色主题下显示正常。
  • 新网关兼容 HTTP、WebSocket、SSE、插件 API 和静态资源,产物位于 FPK 的 app 目录,并在真实 fnOS 统一网关入口完成验证。
  • Bridge 可作为独立 JS 文件完成语法检查和单元测试;生成的单文件网关不包含未替换占位符,也不依赖 NAS 上不存在的 Bridge 源文件。
  • Web 左侧菜单可重启 DSH Web;DSH Web 被单独终止后,fnOS 应用仍保持运行状态,访问入口显示恢复页面,管理员可点击“重启 Web”,成功后自动恢复 DSH 页面且不会产生第二个网关进程。
  • 恢复过程使用启动锁、临时 PID 和健康检查;重复点击、启动失败及陈旧 PID 不会产生多个 DSH Web 或误杀无关进程。
  • fnOS 插件可查看、添加、删除三方插件 API URL 反代规则;未保存的修改不影响当前配置,“放弃”后恢复已保存值。
  • 保存后 JSON 使用约定结构写入 ${TRIM_PKGVAR}/gateway/path-allowlist.json,网关无需重启即可加载。
  • 已打开页面能收到最新路径快照;新增路径随后发起的 fetch、XHR、EventSource、WebSocket 和动态脚本请求会补 /app/fn-deepseek-harness 前缀并代理到 127.0.0.1:3080
  • 无效或损坏配置不会替换最后一次有效快照,也不会导致网关或 DSH 退出。
  • DSH 版本、插件依赖、FPK 安装回调、native 产物、发布清单和文档均指向 0.1.1-rc.2;目标 NAS 验证前状态保持“待完成”。

当前 NAS 验证结果

  • 本地自动化测试已通过:39 个测试文件、157 条测试全部通过;该结果不替代真实 NAS 业务验收。
  • 已通过 7 条真实 NAS 浏览器用例,记录见FNOS-002 NAS 浏览器验收记录
  • 已验证 Codex 登录状态、五小时/每周用量、用量 Popover、设置刷新接口和会话输入区状态同步。
  • 已验证 NAS TreeSelect 授权目录、复选框选中/取消、设置快捷键、跟随系统切换浅色和未启用菜单隐藏。
  • 已验证 DSH Web 左侧刷新和重启;刷新只作用于 DSH Web iframe,不会刷新 iframe 外部的 fnOS 宿主页面,重启后页面约 15 秒恢复。
  • 已验证静态资源通过完整路径 /app/fn-deepseek-harness/dsh-pet-7340/pic/cursor-grab.png 返回 200 image/png
  • API URL 反代即时生效、SSE/WebSocket、升级回滚、异常注入、权限差异和并发控制等场景仍按原验收条件继续验证。

状态看板

阶段状态当前范围下一步
P1 应用与插件优化部分 NAS 验证(7 条业务用例、157 条自动化测试通过)自动化测试 157/157 通过;Codex 状态、NAS Tree、快捷键、主题、刷新/重启和静态资源已完成部分 NAS 验证完成 API 反代即时生效、实时连接、权限、版本升级和回滚验收

变更记录

日期变更说明
2026-08-24新增 FNOS-002记录 Codex 登录状态需求
2026-08-25合并 NAS 引用需求将原 FNOS-003 合并到本需求
2026-08-27扩展需求范围增加 UI 总览、网关代理和应用跳转调研
2026-08-27精简需求文档合并重复功能和验收说明,技术细节留到详细计划
2026-08-28增加 Codex 用量显隐需求五小时窗口由接口能力自动决定,不提供用户开关
2026-08-28合并 API URL 反代需求将原 FNOS-003 合并到 FNOS-002-04,确认代理技术、持久配置和即时生效规则
2026-08-28合并 Codex 状态功能将原 FNOS-002-06 合并到 FNOS-002-01,登录状态和用量状态统一规划
2026-08-28更新应用跳转调研SDK 存在未公开的跨应用方法,但无法确认可稳定直达应用中心 DSH 详情页
2026-08-29增加 DSH Web 恢复需求FPK 状态改由常驻网关承载,Web 退出后通过网关恢复页面单独启动
2026-08-30明确 DSH Web 恢复交互Web 左侧菜单和故障恢复页面均提供“重启 Web”按钮,点击后重新启动 DSH Web 并自动恢复页面
2026-08-29明确 Semi UI 总览路由插件入口跳转独立 Hash 路由,通过 shell.overlay 展示总览页面
2026-08-29增加 Tree 反向同步需求输入框删除本次面板插入的引用时同步取消勾选,并隔离历史引用状态
2026-08-29调整 Bridge 源码组织注入脚本改为独立 JS 文件维护,构建期读取并内联到单文件网关产物
2026-08-29完成 P1 开发完成 Codex 状态、NAS 引用同步、Semi UI 总览和新网关代码,进入真实 NAS 验证
2026-08-30完成 NAS 引用同步修正按 DSH structured reference 的占位符和 draftRev 计算多选偏移,补齐懒加载节点插入、部分插入和分隔空格回归测试
2026-08-30合并需求编号并完成 Web 恢复验证移除已替换的 FNOS-002-05,统一使用 FNOS-002-04;真实 NAS 已验证 Web 正常重启且 FPK 应用保持启用
2026-08-31迁移版本统一需求将原 FNOS-003 的 DSH、插件、依赖、FPK 和 native 版本约束并入本需求;FNOS-003 改用于 FPK 应用运行设置
2026-08-31同步刷新与重启验证状态真实 fnOS 环境已验证侧边菜单刷新、重启均正常,刷新不会影响 iframe 外部页面
2026-09-01增加真实 NAS 浏览器验收结果7 条 FNOS-002 用例通过;补充用量、TreeSelect、快捷键、主题、刷新/重启和静态图片 Network 证据,其余场景保持待验证
2026-09-01更新自动化测试状态根目录 pnpm run test:unit 通过,39 个测试文件、157 条自动化测试全部通过;未改变尚未完成真实 NAS 验收的业务用例状态

基于 VitePress 构建