Skip to content

FNOS-002 DSH 应用与插件优化

项目内容
需求编号FNOS-002
提出日期2026-08-24
需求状态已完成
关联计划PLAN-FNOS-002 DSH 应用与插件优化

需求背景与目标

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

这些内容统一在 FNOS-002 中记录,当前重点是已经落地并完成验收的插件、网关和 DSH Web 能力。FPK/NAS 集成验收和跨场景回归已由 FNOS-003 承接并完成;原 FNOS-003 的版本统一内容不再作为本需求的未完成任务重复展开。CodeBuddy 相关需求与计划也已整体迁入 FNOS-003。

需求目标

  • 统一 Codex 登录与用量状态:只在确认登录后显示状态,用量接口提供五小时窗口时自动显示对应状态,接口未提供时自动隐藏;登录取得一次性授权码后由用户点击复制。
  • NAS 文件和目录引用不改动用户已有文本;Tree 面板支持多个文件或目录独立选择,面板打开期间,当前操作插入的引用被删除时同步取消对应勾选。
  • 新增 DSH Semi UI 总览插件。
  • 使用 connecthttp-proxy-middleware 重写 FPK 网关,通过 tsdown 生成可直接随 FPK 分发的单文件入口;浏览器 Bridge 使用独立 JS 源文件维护,网关常驻时在 Web 左侧菜单提供“重启 Web”按钮。
  • 由 fnOS 插件管理三方插件 API URL 反代配置,网关监听配置并将匹配的绝对 URL 请求改写到统一网关下的 DSH 服务。
  • DSH 运行时、插件兼容性和 @deepseek-ai/dsh-* 依赖基线为 0.1.2-rc.1;当前项目版本为 5.3.1,插件自身发布版本为 0.1.2-rc.1.3,并保留用户数据与配置。
  • 将版本发布逻辑放入独立 tooling/fn-os-apps-cli pnpm workspace,通过 fn-apps-cli CLI 使用 bumpp 维护项目/FPK 版本;插件版本不得被项目或 FPK 版本命令隐式修改。插件版本更新直接修改选中插件的 package.json,交互式版本选择支持 bumpp 风格的 custom ... 自定义版本输入;若插件存在于 published-dsh-plugins.json 则同步清单版本,多选时仅生成一条合并提交,不创建插件 Git Tag。
  • 通过 fn-apps-cli publish 交互选择一个或多个 DSH 插件,并在所有选择完成后统一使用 next dist-tag 发布 npm 包。
  • 修复 fnOS 聊天输入框授权路径选择器的多选行为,连续选择多个文件或目录时全部生成引用。
  • 引入 Turbo 统一包任务编排;根 package.json 提供统一任务入口,tooling/fn-os-apps-cli 通过 fn-apps-cli CLI 暴露任务,全部使用 TypeScript 与 tsdown。
  • 通过 @clack/prompts 在版本、构建和启动时询问目标区域;构建支持多选 FPK 和文档,并自动处理 DSH 网关和插件的 dsh-semi-ui 依赖。共享包不作为顶层构建选项,只由依赖它的主包通过 Turbo 自动编译。
  • 通过 changelogithub 在项目 Tag 发布时生成 Release 日志,移除 workflow 内手写日志生成逻辑。
  • 优化 @tnnevol/fn-os-apps-cli 目录结构:由独立的 program.ts 暴露 Commander program 实例,各 commands/*.ts 模块注册命令并实现 actionsrc/index.ts 统一加载并解析命令。
  • 根目录通过唯一的 start 入口统一启动插件开发 watch 和 VitePress 文档开发服务,插件启动自动包含共享 UI 依赖。
  • 开发指南菜单覆盖 FPK 应用配置、生命周期、权限、用户向导、环境脚本、任务编排和 GitHub Workflow;以流程图和依赖关系图说明根 package.json、入口 CLI、Turbo、workspace package 与 CI Workflow 之间的调用关系。

涉及范围

模块目录或入口职责
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 与构建入口;构建插件位于 packages/fnos-gateway/plugins/
FPK 网关产物apps/fn-deepseek-harness/app/gateway-proxy.mjs监听 fnOS Unix Socket,代理 DSH HTTP、WebSocket 和流式请求
FPK 安装辅助产物apps/fn-deepseek-harness/app/scripts/install-callback-helper.mjs由网关包 tsdown 入口生成,供安装回调执行 DSH、node-pty 和 attachment 初始化逻辑
项目文档与任务工具docs/、根 package.jsonturbo.jsontooling/fn-os-apps-cli/记录需求、任务编排、版本/构建询问和发布日志

功能列表

编号优先级功能用户行为状态
FNOS-002-01P1Codex 登录与用量状态未登录时不显示状态;登录和退出后及时更新;接口提供五小时窗口时自动显示对应状态已完成
FNOS-002-02P1NAS 引用与 Tree 状态插入引用时保留原文空格;面板打开期间删除本次引用后同步 Tree,历史引用不参与本次勾选已完成
FNOS-002-03P1Semi UI 总览插件点击插件入口后跳转到独立路由,查看共享组件及主题效果已完成
FNOS-002-04P1FPK 网关、进程恢复与 API URL 反代使用专业代理中间件;DSH Web 退出后,Web 端显示“重启 Web”按钮并从网关恢复;用户可配置三方插件 API URL 反代规则并即时生效;DSH 内置的浏览器同级 HTTP 路由(如“打开应用”)无需用户配置也能被反代已完成
FNOS-002-05P1Codex 动态模型目录从 ChatGPT Codex 后端读取当前账号真实可用的模型与思考级别,将最新列表同步到 DSH 的 OpenAI Codex 模型配置,使全局模型选择器、会话内模型选择和模型目录显示一致的最新模型已完成

需求迁移说明

原 FNOS-002-06「CodeBuddy 多账号与管理面板」及其交互约束、验收条件和 Token 统计图表要求,已整体迁移到 FNOS-003FNOS-003-08FNOS-003-09;对应实现计划迁移到 PLAN-FNOS-003PLAN-FNOS-003-C01C04。本需求不再重复描述该插件的实现范围。

版本统一(跨功能约束)

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

  • DSH 运行时、插件兼容性和 @deepseek-ai/dsh-* 依赖基线统一使用 0.1.2-rc.1;插件自身发布版本独立为 0.1.2-rc.1.3@earendil-works/pi-ai 与 DSH 0.1.2-rc.1 的锁定一致,使用 0.84.2
  • FPK 安装/升级回调、node-pty native 配置、已发布插件清单和相关文档必须与该版本一致。
  • 当前已发布插件清单包含 @tnnevol/dsh-codex-auth@0.1.2-rc.1.3@tnnevol/dsh-fnos@0.1.2-rc.1.3;插件的 compatibility.json 仍以 DSH 0.1.2-rc.1 为兼容基线,后续插件发布必须同步更新该清单及 FPK 内置包。
  • fnOS 插件客户端声明 remoteremote.session inject;任何访问 ctx.remote.* 命名空间的构建产物都必须携带对应 inject 声明,否则该插件视为损坏并需要重装。
  • 版本管理通过独立 tooling/fn-os-apps-cli workspace 中的 bumpp 执行;项目/FPK 版本命令只更新根项目、共享包和应用 Manifest 并创建项目 Tag,插件版本命令按指定插件独立更新并提交,不创建 Git Tag。
  • 版本检查和升级不得清理 DSH_HOME、profile、凭据、工作区或现有插件配置。
  • 构建任务由 Turbo 编排;插件构建先完成其 workspace 依赖(包括 @tnnevol/dsh-semi-ui),DSH FPK 构建先完成 fnOS Gateway,其他 FPK 不触发网关构建。
  • 共享 UI 包继续由 workspace 管理,不作为 DSH 运行时插件重复安装。

交互和行为约束

  • Codex 未登录、加载中或鉴权失败时隐藏成功状态,登录入口保留。
  • Codex 登录接口返回一次性授权码后,复制由用户点击授权码旁的复制图标触发,成功后就地显示勾选标记;不在打开授权页时自动复制——浏览器会把焦点交给新窗口,此时写入剪贴板必定失败。
  • Codex 等待授权期间,「登录」按钮变为「取消」。用户点「取消」才放弃本次登录:中止 device-code 轮询、清除本次一次性授权码、界面退回未登录态。该路径不得删除已保存的凭据(退出登录才清除),两者是不同操作。
  • Codex 把授权窗口被关闭视为正常现象而不是放弃信号:授权成功后授权页面会自行关闭,若据此取消,插件会中止正在进行的 device-code 轮询并丢掉刚取得的凭据。因此不轮询窗口 closed 来判定放弃。
  • 点「取消」时若授权窗口仍然存在,插件把它一并关闭;重复点「打开授权页面」开出的多个窗口全部关闭。因此授权窗口不得切断 openernoopeneropener = null 都会让跨域后的窗口失去 script-closable 资格,close() 静默失效)。
  • 五小时用量以接口返回的 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.mjsapps/fn-deepseek-harness/app/scripts/install-callback-helper.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 网关登录校验与插件自身权限仍按原规则执行。
  • Bridge 的内置反代前缀与用户规则分开维护:/api/plugins、图片资源和 DSH 内置的浏览器同级 HTTP 路由(当前为 /open-in-app)始终反代,用户规则只在此基础上追加,不能覆盖或移除内置前缀;DSH 新增此类内置路由时同步加入内置列表,用户无需在设置页手工登记。
  • 内置路由的反代使用与用户规则相同的补前缀机制,因此脚本、图标和跳转都走同一个网关入口,不额外新增 host 白名单或直连上游。
  • 自定义路径由 fnOS 插件设置卡片统一编辑,点击“保存”后写入 ${TRIM_PKGVAR}/gateway/path-allowlist.json;“放弃”恢复服务端已保存内容。
  • 网关通过 fs.watch 读取最新配置,并把完整快照推送给已打开的页面;配置变更不要求刷新 DSH Web。
  • Codex 模型目录的来源是 ChatGPT 账号接口返回的当前可用模型,而不是 pi-ai 内置的静态模型表;刷新成功后,全局模型选择器和 DSH 模型目录都以账号实际可见的模型为准。
  • 刷新 Codex 模型目录需要已登录;未登录时保留现有(pi-ai 静态目录)可用,刷新入口提示先登录。
  • 思考级别列表随模型一起来自账号接口(如 low/medium/high/xhigh/max,接口提供 ultra 时在 DSH 支持范围内处理);模型可用的思考级别只显示接口声明的级别。
  • 模型目录刷新写入 DSH 的 OpenAI Codex 路由配置,供会话内模型选择器和消息框模型选择器使用;刷新不影响已保存的全局默认模型选择,选择器在刷新后保留对已选模型的展示并允许重新选择。
  • Codex Auth 不再注册插件列表卡片,也不改写「设置 → 模型」里的 OpenAI Codex 编辑器;账号能力(登录、全局模型、模型目录刷新、图片能力)以独立设置页展示,入口位于设置侧栏,Codex 模型经 DSH 官方消息框模型选择器选择。
  • 设置页不展示账号用量区块;用量状态只在对话输入区右侧的紧凑状态展示(五小时/每周窗口规则不变)。

不在本次范围内

  • 不修改 DSH 官方源码和 Codex OAuth 流程。
  • 不调整 Codex 模型调用参数与用量接口行为;模型目录刷新只更新 OpenAI Codex 路由的模型列表与思考级别配置。
  • 不自动请求模型目录;刷新由用户在 Codex Auth 设置页显式触发,并保留失败回退(登录态缺失、接口不可用、写入被拒绝时保持上一次有效列表)。
  • 不改动 NAS 授权、路径转换和权限校验规则。
  • 不把动态路径列表扩展成接口访问控制、防火墙或插件权限系统。
  • 不自动扫描三方插件源码推断 API URL;反代规则由用户在 fnOS 插件设置中明确维护。
  • 不对 DSH Web 进行无限自动重启;本阶段提供明确的人工恢复入口和并发启动保护。
  • 本需求不再维护 CodeBuddy 插件的需求与计划,相关内容统一由 FNOS-003 承接。

验收条件与完成状态

P1 验收条件

  • Codex 登录状态在登录、退出和异常场景下显示正确;授权码由用户点击复制,失败时保留手动选择。
  • Codex 等待授权时点「取消」,界面及时退回未登录态且已保存凭据不受影响;点「取消」会关闭仍存在的授权窗口;取消不会把中止当作错误提示。授权窗口自行关闭不影响正在进行的登录,凭据正常落盘。
  • 登录状态下执行 Codex 模型目录刷新,返回的模型列表与账号接口一致;每个模型的思考级别来自该模型接口声明的级别集合。
  • 刷新后的 OpenAI Codex 路由模型在 DSH 模型目录与模型选择器中可见;刷新失败、未登录或接口不可用时保留上一次有效模型列表并显示可理解的错误提示。
  • 模型目录刷新不修改已保存的全局默认模型;若已选模型不在新列表中,设置页保留该模型展示并允许用户改选。
  • 用量接口返回 18,000 秒窗口时显示五小时剩余额度和重置时间;未返回、字段不完整或请求失败时不显示该窗口。
  • 五小时窗口显隐不依赖用户设置,刷新用量后能根据最新接口响应自动变化。
  • NAS TreeSelect 可连续选择多个文件或目录,父子路径作为独立引用全部插入;面板打开期间删除本次引用会立即取消对应 Tree 勾选,历史引用不会进入当前选择状态。
  • 项目/FPK 版本命令通过 bumpp 运行,插件版本命令直接修改选中插件的 package.json;插件交互提示提供 patchminormajorprereleasecustom ... 版本选项,且自定义版本必须是有效的 SemVer;若插件存在于 published-dsh-plugins.json 则同步对应清单版本,不发生跨类别版本联动;多选插件时一次性更新所有选中插件及相关清单,仅生成一条提交,不创建插件 Git Tag。
  • 根任务入口、workflow 调用和包任务名称保持一致;Release 日志由 changelogithub 根据 Conventional Commits 自动生成。
  • pnpm run publish 可交互选择一个或多个 DSH 插件,完成全部询问后统一使用 next dist-tag 发布 npm 包。
  • 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 内置的浏览器同级 HTTP 路由属于网关默认反代范围,不依赖用户维护的 API URL 反代规则:会话头部的“打开应用”等控件在 iframe 内正常可用,其 fetch<img> 图标和跳转请求都补 /app/fn-deepseek-harness 前缀并返回上游结果,而不是被 fnOS 宿主以 404 或 HTML 页面响应。
  • 默认反代范围与用户配置合并生效:用户添加或删除自定义规则不会改变内置路由的可达性;内置路由不出现在设置页的规则列表中,也不能被用户规则覆盖或移除。
  • 无效或损坏配置不会替换最后一次有效快照,也不会导致网关或 DSH 退出。
  • DSH 运行时和插件兼容性基线为 0.1.2-rc.1,当前插件发布版本为 0.1.2-rc.1.3;FPK/NAS 安装、升级、回滚和完整代理场景的验收已由 FNOS-003 完成。

当前 NAS 验证结果

  • 本地已完成相关包检查:本需求范围内插件(Codex Auth、fnOS、Semi UI 总览)的类型检查、单元测试和 tsdown 构建通过;该结果不替代真实 NAS 业务验收。2026-09-01 的 39 个测试文件、157 条测试是历史快照。
  • 已通过 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、升级回滚、异常注入、权限差异、并发控制、FPK 内置插件包版本和 Codex 新功能的 NAS 验收,已由 FNOS-003 完成;CodeBuddy 面板验收同样已由 FNOS-003 在 DSH 客户端完成。

状态看板

阶段状态当前范围下一步
P1 应用与插件优化已完成Codex 状态、动态模型目录、NAS Tree、Semi UI、网关恢复、FPK/NAS 集成和代理场景均已完成验收

变更记录

日期变更说明
2026-08-24新增 FNOS-002记录 Codex 登录状态需求
2026-08-25合并 NAS 引用需求将原 FNOS-003 合并到本需求
2026-08-27扩展需求范围增加 UI 总览、网关代理和应用跳转调研
2026-08-27精简需求文档合并重复功能和验收说明,技术细节留到详细计划
2026-08-28增加 Codex 用量显隐需求五小时窗口由接口能力自动决定,不提供用户开关
2026-09-04增加 Codex 授权码自动复制登录接口返回一次性授权码后自动尝试复制,失败时保留手动复制
2026-09-14授权码改为点击复制打开授权页时浏览器把焦点交给新窗口,自动复制必然失败(用户侧表现为每次都提示「复制失败」);改为 Typography copyable 由用户点击触发
2026-09-14增加授权取消等待授权时提供「取消」;取消只回收本次授权,不删除已保存凭据;登录按钮文案由「去登录」改为「登录」
2026-09-14去掉关窗即取消授权成功后 OpenAI 会主动关闭授权窗口,原「关窗即放弃」会把刚成功的登录取消掉(宿主 cancel() 中止 device-code 轮询,凭据随之丢失);改为只有用户点「取消」才放弃
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 验收的业务用例状态
2026-09-05增加 Codex 动态模型目录需求FNOS-002-05:从 ChatGPT Codex 账号接口读取当前可用模型与思考级别,刷新写入 DSH OpenAI Codex 路由配置,使模型目录与账号真实可用列表一致
2026-09-06调整插件版本发布规则fn-apps-cli version 插件版本不再调用 bumpp,直接更新选中插件并提交;若插件存在于 published-dsh-plugins.json 则同步版本;多选插件统一生成一条合并提交,不创建 Git Tag;版本不一致时提前拒绝合并发布
2026-09-09迁出 CodeBuddy 需求将 FNOS-002-06 的 CodeBuddy 多账号、自动切换、签到、额度/有效期和 Token 统计图表需求整体迁移到 FNOS-003-08、FNOS-003-09,计划迁移到 PLAN-FNOS-003-C01~C04
2026-09-12完成全部需求验收FNOS-002-01~05 及其 FPK/NAS、网关和 Codex 遗留验收已由 FNOS-003 完成,需求与功能状态统一更新为“已完成”
2026-09-13补充内置路由反代需求明确 DSH 内置浏览器同级 HTTP 路由(如“打开应用”使用的 /open-in-app)属于网关默认反代范围,不占用用户反代规则,修复其在 iframe 内请求 404 导致入口消失的问题
2026-09-15恢复文档服务的终端快捷键docs 包的 dev 标记 interactive: true,TUI 可用 i 把键盘交给该任务、Ctrl+z 返回,VitePress 的 h/r 快捷键恢复可用;因 Turbo 拒绝在无终端界面时运行 interactive 任务,start 无 TTY 时改为直接启动 vitepress dev,避免整条命令报 Cannot run interactive task 失败
2026-09-15修正 Turbo 任务配置缺陷按 Turborepo 规范审计 turbo.json 并修复四处缺陷:checktypecheck/test:unit 与包内 check 脚本重复调度(同一 vitest 跑两遍)、testtest:unit 串联重复执行、lint 是匹配空集的死配置(ESLint 只有根配置,改为根任务 //#lint)、build 未声明 NODE_ENV 导致不同环境共用缓存;docs 包新增包级 turbo.json,把 outputs 修正为 .vitepress/dist/** 并用 $TURBO_EXTENDS$ 追加 D2_BIN(原 dist/** 让 Turbo 报 no output files found,文档产物既不入缓存也无法恢复)
2026-09-15支持插件自定义版本pnpm run version 选择插件后,版本提示增加 bumpp 风格的 custom ... 选项,输入有效 SemVer 后更新选中插件并同步已发布插件清单
2026-09-18npm 发布 dist-tag 改为 next插件包虽以预览版本号发布,但 npm dist-tag 从 rc 改为 next,与社区惯例一致;4 个插件的 publish:rc 脚本改名为 publish:next--tag next),CLI 调用与命令描述同步更新。线上已存在的 rc 标签保持不动

基于 VitePress 构建