diff --git a/AGENTS.md b/AGENTS.md index 286b2a0e..6a5e38e7 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -31,7 +31,7 @@ risk or an explicit user requirement. ## Design Simplicity Follow KISS and YAGNI. Use the smallest conventional design that completes the -real user workflow. +real user workflow. NO over-engineering or over-design. - A demonstrated failure authorizes only the smallest proportional fix, not a general recovery, compatibility, or security framework. diff --git a/FEATURES.md b/FEATURES.md index 16243004..ae78ce11 100644 --- a/FEATURES.md +++ b/FEATURES.md @@ -111,10 +111,33 @@ records are listed separately and do not introduce another feature status. - [ ] **Project Agent Space** (planned): Unifies roles, knowledge, Skills/MCP, models, approval policy, budgets, and timeouts in a Project, with reusable templates. -- [ ] **Application navigation and system-tool shortcuts** (design only): - Plans fixed system entries, configurable built-in application visibility, - and footer shortcuts into the existing workbar. These are not implemented - interface changes. See the [design](./docs/features/application-tool-navigation/README.md). +- [ ] **Application center and navigation** (integration pending): + Clicking the bottom App Center opens a lightweight upward anchored popup with enabled apps, + regardless of pinning or opening history, and no modal backdrop. Clicking an app row closes + the popup; Local Inference opens a separate modal preserving the workspace, while other apps + open their main content pages. Manage Apps opens searchable cards with settings details; + layout and interaction rules are defined in the [UI design](./docs/features/application-tool-navigation/ui-design.md). + Knowledge and Heartbeat are always enabled in stable sidebar + positions before optional apps. Their management rows offer only Open, with no enable, + pin, reorder, or generic empty settings controls. Existing workspace settings and Heartbeat + per-plan enabled states remain unchanged. Only Notes and Local Inference have optional + enablement, pinning, ordering, and shared settings. Unshipped `knowledgeEnabled` and + `heartbeatEnabled` fields were removed without migrations. + Durable settings saves, including configuration-tool writes, synchronize through change events; + reopening the center locks edits until refresh completes, and newer snapshots supersede stale reads. + The `local-inference` modal shows a single service list without task history or external + connections. Embedding shows its independent process CPU and working-set memory; + ASR/OCR explain shared-process attribution limits. ASR readiness is unknown rather + than inferred from active requests. Supported service controls retain impact confirmation; + failed operations refresh the list and require a new confirmation. TTS remains unavailable. + Cancelling inference remains active in service-stop impact until worker + acknowledgement or exit. Previous validation: typecheck and `npx eslint src` passed; full `npm test` finished with + 4,448 passed, 67 skipped, and two unchanged Heartbeat migration failures (`duplicate column + name: pinned`). Full lint still reports 22 unrelated story-graph demo `document` errors. + Eight Electron fixture theme/size scenarios cover keyboard, focus, geometry, native-view + occlusion, and actual settings-store persistence, not full production App acceptance. + Latest validation, prior real local-engine evidence, and remaining limits are preserved in + [validation progress](./docs/features/application-tool-navigation/progress.md). - [ ] **Additional assistant workbar and execution-space capabilities** (planned): Builds on the current workbar and multiple terminals with supervision, unified Runtime monitoring, managed processes, safe static HTML diff --git a/FEATURES.zh-CN.md b/FEATURES.zh-CN.md index 362ea29b..8037b5b4 100644 --- a/FEATURES.zh-CN.md +++ b/FEATURES.zh-CN.md @@ -30,7 +30,7 @@ - [x] **AI 回复与完整会话复制**:已完成的 AI 回复可从消息底部复制不含推理、工具日志和引用元数据的 Markdown 原文;完整会话复制复用同一条经过 Preload/Main 校验的剪贴板路径。 - [x] **助手工作栏、多终端与可调布局**:工作栏开关位于明暗主题按钮旁;右侧工作栏使用持久“+”能力目录和应用 Tab,任务中心与工作区为不可关闭的单实例,浏览器可打开多个独立实例。任务中心可切换当前项目和所有项目,范围随布局保存;无项目任务在所有项目中标注“未绑定项目”。用户可为当前本机或托管 SSH 项目打开多个独立终端,获得有界输出、调整尺寸、结束与显式重连。关闭终端 Tab 会结束 Shell,应用重启只恢复已结束的 Tab 描述,不自动重启 Shell。主侧栏和魔法笔记列表支持鼠标与键盘调宽,魔法笔记列表可隐藏并记住布局,窄宽度下自动堆叠。 - [ ] **项目 Agent Space**(规划中):在 Project 中统一角色、知识、Skills/MCP、模型、审批策略、预算和超时,并支持模板复用。 -- [ ] **应用导航与系统工具快捷入口**(仅设计):规划固定系统入口、内置应用显隐和打开现有工作栏的底部工具按钮;尚未实现新界面。详见[设计文档](./docs/features/application-tool-navigation/README.md)。 +- [ ] **应用中心与导航**(整体验收待完成):底部应用中心向上展开轻量锚定菜单,无模态遮罩,只列已启用应用,不按打开历史或常驻筛选。点击应用行关闭菜单,本机推理打开保留底层工作区的独立 Modal,其余应用打开主内容区;底部“管理应用”打开可搜索卡片及设置详情,布局与交互见 [UI 设计](./docs/features/application-tool-navigation/ui-design.md)。知识库和智能心跳始终启用,在可选应用之前保持固定侧栏位置,管理行仅有“打开”,不提供启用、常驻、排序或通用空设置;原工作区配置和心跳单条计划 enabled 不变。可选启用、常驻、排序和共同设置仅适用于魔法笔记、本机推理;未发布的 `knowledgeEnabled`、`heartbeatEnabled` 已移除,不增加迁移。设置持久化后的事件同步各入口,包括工具配置写入;重开中心刷新期间锁定修改,新快照覆盖迟到的旧读取。`local-inference` Modal 直接显示服务列表,不展示任务历史或外部连接;向量服务显示独立进程 CPU 与工作集内存,ASR/OCR 说明共享进程无法独立统计的原因。ASR 就绪状态未知,不从活动请求推断运行中。受支持的服务操作保留影响确认,失败后刷新列表并要求重新确认;TTS 显示不可用。取消中的推理在 Worker 确认或退出前仍计入活动任务及服务停止影响。此前类型检查和 `npx eslint src` 通过;完整 `npm test` 为 4,448 项通过、67 项跳过、2 项失败,仍为未改动的心跳迁移 `duplicate column name: pinned`;全仓 lint 仍有无关 story-graph Demo 的 22 个 `document` 错误。8 个 Electron fixture 主题/尺寸场景覆盖键盘、焦点、几何、原生视图遮挡及真实设置 Store 持久化,不代表完整生产 App 验收。最新验证及剩余边界见[验证进度](./docs/features/application-tool-navigation/progress.md)。 - [ ] **通用助手工作栏与执行空间后续能力**(规划中):在现有工作栏和多终端基础上继续加入监督、统一 Runtime、受管进程、静态安全 HTML 预览、可固定目标的工作区/浏览器/成果实例、底部停靠与独立窗口。Task Center 保持 Task 的单例索引,附件与知识库继续由会话输入区管理,未来的记忆与历史执行上下文归入关联 Task。详见 [Feature PRD](./docs/features/assistant-workbar/prd.md)。 - [ ] **ShareServer Office 协同编辑**(设计中):通过可选 ShareServer 集成 ONLYOFFICE Docs,在助手工作栏中以文件名打开多个文档 Tab,支持 DOCX、XLSX、PPTX 的人工编辑、保存、撤销、源文件冲突保护和后续 AI 选区修改。Office 正文会由所选 ShareServer 和编辑引擎处理;Desktop 不内置或启动 Document Server,未配置服务时不宣称离线编辑。详见[设计文档](./docs/features/office-document-editing/README.md)。 diff --git a/UI-DESIGN.md b/UI-DESIGN.md index c0723252..78dc1891 100644 --- a/UI-DESIGN.md +++ b/UI-DESIGN.md @@ -315,10 +315,11 @@ 接受用户本机选择的 PNG、JPEG 或 WebP 内联数据,宽高不超过 `4096 × 4096`、总像素不 超过 1600 万且大小不超过 `512 KB`;不得读取远程 Logo URL。名称或副标题溢出品牌区时 单行截断,不能撑宽或挤压侧栏。 -- 侧栏底部提供应用中心入口,设置按钮独立靠右。中心与共同应用设置使用和全局设置相同的整窗 Modal;魔法笔记、智能心跳、本机推理可启用、常驻与排序, - 取消常驻不关闭功能。知识库固定显示在首个可选应用槽位之后,再过滤隐藏的可选项;不参与启用、常驻或排序,中心只提供“打开”,原工作区实际配置保留,没有实际设置时不添加通用设置按钮。 +- 侧栏底部提供应用中心入口,设置按钮独立靠右。点击应用中心向上展开轻量锚定菜单,无模态遮罩,只列已启用应用,不按打开历史或常驻状态筛选;点击行关闭菜单,知识库、智能心跳和魔法笔记在主内容区打开页面。本机推理从菜单、常驻入口或管理 Modal 打开时均使用独立 Modal,保留底层工作区。菜单底部“管理应用”打开既有整窗管理 Modal,共同应用设置沿用设置 Modal。 + 知识库、智能心跳始终启用,依次固定在可选应用之前;不参与启用、常驻或排序,管理 Modal 仅提供“打开”,不增设通用空设置。原工作区配置及心跳单条计划 enabled 保持不变。只有魔法笔记、本机推理可启用、常驻与排序,取消常驻不关闭功能。 设置持久化后的事件同步各入口及工具配置写入;重开中心刷新期间锁定修改,新快照不被旧读取覆盖。文件、终端、浏览器和资源监控只通过右侧工作栏访问,不在左侧复制入口。 - 具体规则见[应用中心 UI 设计](./docs/features/application-tool-navigation/ui-design.md)。已有稳定设置入口时,不在顶栏重复提供同一入口。 + 管理 Modal 使用桌面双列、窄窗口单列卡片;可选卡片提供“打开”和“设置”,关闭时禁用“打开”。启用、常驻和上下移动位于紧凑设置详情,卡片保留拖动排序。尺寸、返回与滚动重置规则见[应用中心 UI 设计](./docs/features/application-tool-navigation/ui-design.md)。已有稳定设置入口时,不在顶栏重复提供同一入口。 +- 本机推理 Modal 复用整窗 Portal、背景隔离和焦点循环;停止、重启及释放使用其上方的紧凑影响确认。Escape 只关闭最上层,操作提交期间禁止关闭及重复提交;焦点恢复与尺寸见[本机推理 UI 规则](./docs/features/application-tool-navigation/ui-design.md#91-本机推理管理)。 ### 6.9 助手工作栏 @@ -685,14 +686,19 @@ GoodBuddy 是可调整窗口大小的桌面应用。响应式设计优先保证 - 保留现有助手工作栏入口,首期在窄栏内适度完善,不先扩张成新的独立一级页面。 - 只展示 Task;普通 Conversation、Job、Run、工具步骤、Subagent 和心跳事项不独立占行。 -- 每项显示名称、关联 Conversation、Global 或 Project 范围、Ask/Execute、状态、最近进展、 - 最近真实活动时间及需要关注信息。 +- 范围固定为当前项目,不提供全局或所有项目入口;切换会话不筛掉本项目其他会话的任务。 +- 顶部紧凑显示当前会话消息总数和 Agent 累计回复时间,按每轮请求区间累加,包含轮内工具和 + 审批等待,不计轮间空闲。历史缺失显示不完整提示,远程缺少可靠证据时不虚构用时。 +- 每项显示名称、关联 Conversation、所属项目、Ask/Execute、状态、最近进展、 + 最近真实活动时间、累计执行时间及需要关注信息。任务用时汇总历次执行请求,不按父任务生命周期计算。 - 点击列表项打开关联 Conversation 并定位该 Task,不显示第二份内容载体。 -- 进行中、暂停和已结束使用共享 `SegmentedControl`;窄栏不足时单行滚动。状态归类遵循[任务中心 PRD](docs/features/task-and-job/task-center-prd.md#5-交互)。 +- 项目任务标题右侧依次为“+”新建和筛选图标;图标按钮提供可访问名称,筛选按钮提供展开状态。 + 状态筛选默认收起且为全部;展开后用共享 `SegmentedControl` 提供全部、进行中、暂停、已结束, + 窄栏不足时单行滚动。收起保留条件,非全部时图标高亮并显示条件。状态归类遵循[任务中心 PRD](docs/features/task-and-job/task-center-prd.md#5-交互)。 - 完整消息留在 Conversation;长错误、工具、审批和成果按 Task 关联到 Runtime、活动记录和 成果查看器,不撑高列表,也不显示 Job/Run 树。 -- “新建定制任务”使用共享 Modal,明确选择当前或新 Conversation。聊天入口默认当前 - Conversation,Task Center 入口默认新 Conversation;选择必须持续可见。 +- “新建定制任务”使用共享 Modal,默认立即执行和当前 Conversation,可选择本项目其他可用 + Conversation 或新建会话,选择必须持续可见。内容必填,名称可选并从内容生成;定时提供单次、每日和每周。 - 定时消息创建 Modal 使用关联 Conversation 的 Runtime 与 Ask/Execute 模式,不再提供独立 模式开关。未运行计划的详情显示会话当前模式,已运行任务显示该次执行记录的模式; 不得用旧计划字段表示下一次执行权限。不支持工具时不得静默降级。 @@ -745,14 +751,14 @@ GoodBuddy 是可调整窗口大小的桌面应用。响应式设计优先保证 - “平台功能 / 通用设置”同时提供默认开启的“在会话中渲染 HTML”持久 Switch。说明必须 明确该能力只生成禁用脚本、联网、表单提交和窗口操作的静态预览;保存成功后当前会话立即 更新,保存失败时保留最后确认状态。 -- “平台功能”使用共享 `PageTabs` 区分“通用设置”“远程项目(技术预览)”和“魔法笔记”,默认进入通用设置。“远程项目”页将持久 Switch 与用户数据目录中的 Linux x64、Linux arm64、macOS arm64 Agent 包清单分成独立卡片;每张卡片与下载进度按平台和架构区分,不能把两个 arm64 目标合并。清单延迟到首次打开该页签时由 Main 完整校验,并读取所选更新源的小型签名目录,显示本地版本、在线最新兼容版本以及“有更新”“已是最新”“未下载”“校验失败”。打开页签或刷新不得自动下载 `.gbagent`;只有用户点击带目标版本的下载/更新按钮后才传输包。签名目录不可用时继续显示并允许导出已验证本地包,提供就地重试错误;清单不混入 Host 已安装状态、缓存路径或敏感签名细节。下载和导入期间保留上下文进度,成功进入全局通知视口。“魔法笔记”页提供默认开启的“显示未完成待办数量”持久 Switch,关闭后只隐藏左侧数量徽标,不改变待办数据或魔法笔记入口。全局模型下载源使用 `fieldset`、持久 `legend` 与整行可点击的原生 Radio 卡片;选中状态同时依靠 Radio、边框和背景表达,读取失败时不得用默认值伪装为已保存选择。 +- “平台功能”使用共享 `PageTabs` 区分“通用设置”和“远程项目(技术预览)”,默认进入通用设置。“远程项目”页将持久 Switch 与用户数据目录中的 Linux x64、Linux arm64、macOS arm64 Agent 包清单分成独立卡片;每张卡片与下载进度按平台和架构区分,不能把两个 arm64 目标合并。清单延迟到首次打开该页签时由 Main 完整校验,并读取所选更新源的小型签名目录,显示本地版本、在线最新兼容版本以及“有更新”“已是最新”“未下载”“校验失败”。打开页签或刷新不得自动下载 `.gbagent`;只有用户点击带目标版本的下载/更新按钮后才传输包。签名目录不可用时继续显示并允许导出已验证本地包,提供就地重试错误;清单不混入 Host 已安装状态、缓存路径或敏感签名细节。下载和导入期间保留上下文进度,成功进入全局通知视口。全局模型下载源使用 `fieldset`、持久 `legend` 与整行可点击的原生 Radio 卡片;选中状态同时依靠 Radio、边框和背景表达,读取失败时不得用默认值伪装为已保存选择。 - “关于与更新”的更新源位于“启动时检查新版本”开关下方,常规宽度下将标签、原生单选下拉框和用途说明放在同一行,并复用设置表单的统一控件样式;关闭启动检查后仍可选择更新源,手动检查继续使用当前选择。选项显示“GitHub(默认)”和中性的“镜像节点”。该选择同时控制手动检查、启动时检查、下载页和 Agent 包在线下载,不显示底层服务商名称。 - “关于与更新”在版本信息之后提供应用内反馈卡片。反馈对话框使用原生字段、明确隐私说明和一张可选截图;另提供默认关闭的原生 Checkbox,让用户主动附加最近桌面诊断摘要。Checkbox 附近必须持续说明摘要只含时间、组件、阶段、稳定错误码、错误类型和固定短消息,不含对话、Prompt、凭据、文件内容、路径、Provider 原始响应或远端 Agent 日志。勾选时为诊断摘要预留描述字符预算,超长草稿必须保留并显示字段错误,不得静默截断。失败时保留草稿、勾选状态和请求编号并提供就地重试,成功时在对话框内保留可复制编号而不重复发送全局通知;对话框遵循统一 Modal 的背景隔离、初始焦点、Tab 循环、Escape、焦点恢复和窄窗口布局。 - Agent Runtime 分类页头的“保存设置”同时保存 Runtime 基础配置与 Runtime 原生定制,不在原生定制卡片内提供第二个保存入口。原生定制存在未保存更改时持续显示状态和撤销入口;切换设置分类或 Runtime 不丢弃草稿,关闭设置中心前必须先保存或撤销。 - Agent Runtime 页面在低层程序与配置覆盖之外提供“能力与默认配置”区域。能力清单使用共享 `PageTabs`,按 Agents、Tools、Commands、Skills、MCP、Rules、Prompts、Resources、LSP、Formatters 和上下文 11 类单行滚动展示,一次只呈现当前分类的 `tabpanel`;清单只显示 Runtime 自有能力,不混入 GoodBuddy 分配的 Skills、临时 MCP 或 Continue 预设。Tools 必须独立于 Commands、LSP 和 Formatters,显示工具类型、来源及 Ask/Execute 可用性;清单状态必须区分完整、部分、不可用、仅连接和不支持,不能用进程连通性冒充清单可读。 - “能力与默认配置”只显示一个模块标题,刷新入口位于该标题右侧,能力状态压缩为一行并排在默认 Agent 或 Continue 预设编辑器之前;不得再复制“Runtime 原生能力”等同义标题、说明或状态结论。刷新只更新能力快照,不覆盖未保存的原生定制草稿。 - OpenCode 的默认 Agent 使用原生下拉选择;Continue 预设编辑器允许管理名称、说明、启用的 Rules 以及 Prompt 名称、说明和正文,并可展开查看原生 Rules 与启用预设 Rules 的最终合并顺序。持久启停仍使用共享 Switch,添加与删除使用明确按钮和可访问名称。 -- 应用中心交付时,上述“平台功能 → 魔法笔记”的设置迁入应用共同设置界面;原页签如保留则只提供定位入口,不维护第二份表单。笔记页与应用中心共用配置;旧入口开关绑定业务启用值,迁为“启用应用”并保留原值,常驻使用独立配置。默认开启仅适用于未配置布尔值,只有独立显隐偏好才映射到常驻。此迁移规则见[应用导航 PRD](./docs/features/application-tool-navigation/prd.md#fr-11-应用导航设置)。 +- 魔法笔记设置由应用中心与笔记页共享;全局设置不再提供魔法笔记页签或跳转入口。“显示未完成待办数量”持久 Switch 只控制左侧数量徽标,不改变待办数据。旧入口开关绑定业务启用值,迁为“启用应用”并保留原值,常驻使用独立配置。默认开启仅适用于未配置布尔值,只有独立显隐偏好才映射到常驻。此迁移规则见[应用导航 PRD](./docs/features/application-tool-navigation/prd.md#fr-11-应用导航设置)。 - MCP 设置按“内置 MCP / 直连模型 / 自定义 MCP / 电脑控制”四个同级 `PageTabs` 组织。联网搜索保留在直连模型;内置浏览器归入内置 MCP,提供持久启停和 Runtime 分配,并明确说明其操作 GoodBuddy 隔离浏览器、不控制客户端已安装的浏览器,开启后可由已分配 Runtime 的 Execute 直接使用,不逐次询问。该开关只控制 Agent 工具访问,关闭时不得禁用浏览器工作栏中的用户手动导航、返回、刷新、停止加载、交互或关闭操作。尚未生效的命名浏览器配置不得显示在界面中,“电脑控制”只显示实际操作客户端电脑的能力。内置 MCP 卡片与 Skills 一样提供持久启停和 Runtime 分配;直连模型、GoodBuddy 管理的 OpenCode 与 Continue 默认选中且可调整,DeepSeek Harness 必须以置灰、未选择和“暂不支持”文案持续显示,不能呈现为可保存的分配。魔法笔记 MCP 的自身启停与平台功能依赖分别显示,依赖未开启时保留用户配置并说明当前不会加载。 - MCP Server 测试结果在同一展开卡片中分组显示 Tools、Prompts 和 Resources 的支持状态、数量与有界元数据;Prompt 参数标明必填项,Resource 只显示 URI、名称、类型和说明,不读取或渲染 Resource 内容。 - 内置 MCP 中的“图片生成与编辑”是自动管理例外:该行始终可见,标记“内置 · 自动管理”,不提供独立启停、分配保存、移除或凭据编辑。直连 Model、OpenCode、Continue、DeepSeek Harness 的分配只由已保存图片模型的“允许 AI 在会话中调用”设置推导;至少一个开启则全部勾选,没有开启模型则全部取消。使用禁用的原生 Checkbox、Runtime 标签及关联说明,保留可聚焦的“前往图片模型设置”导航;远程适用范围通过 GoodBuddy Agent 说明持续可见。Ask、离线、无工具能力或调用错误不改变勾选。图片模型默认关闭会话调用;默认生图模型独立于普通默认连接,关闭或删除后保留失效选择并提示改选,不自动回退。 diff --git a/docs/architecture/local-inference-task-control.md b/docs/architecture/local-inference-task-control.md new file mode 100644 index 00000000..c9ec3c88 --- /dev/null +++ b/docs/architecture/local-inference-task-control.md @@ -0,0 +1,101 @@ +# 本机专用推理架构与任务控制评估 + +## 记录范围与状态 + +评估日期:2026-09-18。本文记录 ASR、OCR、内置 embedding 的执行边界、任务控制缺口和后续优化依据,供语音输入、文档解析、知识检索与索引共同使用。 + +现状依据本次工作区源码核对,包含尚未提交的变更,不等同于已发布版本或实机验收结论。本次仅整理文档,未运行引擎性能测试、复现故障或实施迁移。下文“建议”是评估方向,“待办”均未在本次实施,也没有约定交付日期。 + +产品 Task、Job、Run 的定义沿用 [Task 与 Job 领域模型](../features/task-and-job/task-and-job-model.md)。本文的“推理任务”指一次引擎请求及其执行记录,不自动等同于产品 Task,不据此新增产品对象、持久化日志或全局调度器。本机推理管理的现有界面和接入清单见[应用导航技术设计](../features/application-tool-navigation/technical-design.md#111-本机推理任务与执行服务);本文负责跨功能架构评估及优化待办。 + +## 当前执行边界 + +| 能力 | 源码现状 | 所有权与释放 | 评估建议 | +| --- | --- | --- | --- | +| ASR | 录音结果就绪后提交完整 PCM;Main 创建 `node:worker_threads` Worker,以 sherpa-onnx WASM 执行离线识别;服务一次只接受一个请求 | 每请求创建识别器;超时或 abort 调用并等待 `worker.terminate()`;正常结果路径的清理确认存在缺口,见 TC-4 | 保留请求级 Worker,适合间歇语音输入;常驻化需流式需求或测量支持 | +| OCR | Main 排队后发往主窗口 Renderer;Renderer 复用 Web Worker,运行 `ppu-paddle-ocr/web` 与 `onnxruntime-web` WASM;文档串行处理,PDF 逐页处理 | Renderer 模块持有 Worker;活动请求取消或单页超时会终止 Worker;无活动和排队请求时空闲 60 秒释放 | 当前保留 Web Worker;独立于 UI 的持续任务可评估专用后台 Renderer 加 Worker | +| 内置 embedding | Main 按模型目录共享引用计数 Broker;transport 使用 `utilityProcess.fork`,Granite tokenizer 和 ONNX session 首次请求懒加载并复用 | 多使用方共享进程;最后一个 provider 释放时 shutdown;也支持显式启停,停止等待 child exit | 保留共享 utilityProcess;优先核对取消后的容量回收与加载失败重试 | + +### ASR 的证据与边界 + +[App.tsx](../../src/renderer/src/App.tsx) 在 `recording.result` 完成后调用 `speech.transcribe`;[录音模块](../../src/renderer/src/speech-recognition.ts)负责采样与重采样。[SpeechTranscriptionService](../../src/main/speech/speech-transcription-service.ts) 的 `active.size` 拒绝并发识别,`runSherpaTranscription` 为每次请求创建 Worker,转移音频缓冲区,使用 `createOfflineRecognizer` 同步 decode。Worker 创建后的识别超时为 120 秒,不包含此前模型解析的等待时间。 + +[package.json](../../package.json) 固定 `sherpa-onnx` 为 1.13.4;本次同时核对已安装包的 `index.js`,其入口加载 `sherpa-onnx-wasm-nodejs.js`。因此这里记录的是 Node Worker 内的 WASM 路径。Node Worker 与 Main 共享 OS 进程,线程隔离不能视为独立进程故障边界。 + +Worker 先 `postMessage`,再在 `finally` 中调用 `stream.free()` 和 `recognizer.free()`。Main 收到结果后以 `finish(..., false)` 结算、移除监听和超时,不等待 Worker exit;随后 `active` 删除请求,推理记录转为终态。这证明结果完成与资源清理确认之间存在记账间隙,但尚未证明实际泄漏或清理耗时。 + +### OCR 的浏览器依赖 + +[OCR Worker](../../src/renderer/src/document-ocr-worker.ts) 显式选择 WASM provider、`canvas-native` 图像处理,当前 `ort.env.wasm.numThreads = 1`。PDF 路径使用 `pdfjs-dist`、`OffscreenCanvas` 和 `convertToBlob`。本次核对的依赖链为 `ppu-paddle-ocr/web/platform.web.js` 到 `ppu-ocv/canvas-web`;后者的 `platform/web.js` 使用 `createImageBitmap` 解码图片。包依赖以 [package-lock.json](../../package-lock.json) 为准,依赖升级后需重新核对此结论。 + +这些能力与浏览器执行环境有关。直接迁到 Node utilityProcess,需要另行验证图像解码、Canvas、PDF 渲染及打包资源路径,不能只替换进程创建 API 就宣称等价。 + +[DocumentOcrBroker](../../src/main/document-ocr-broker.ts) 最多保留 4 个 pending 请求,一次派发一个;总超时从派发时开始,不覆盖 Main 排队等待。其预算为 `min(10 分钟, max(单页预算, 60 秒 + 单页预算 × 页数))`。[Renderer bridge](../../src/renderer/src/document-ocr-bridge.ts) 另有串行 Promise 队列,Worker 就绪超时为 120 秒,就绪后按单页预算计时,并在进度消息到达时重置单页计时器。Main 的 60 秒启动预算与 Renderer 的 120 秒就绪等待未对齐,短文档冷启动时 Main 有机会先判超时。 + +[Main 初始化](../../src/main/index.ts) 将 Broker 绑定到 `mainWindow`;[Renderer 入口](../../src/renderer/src/main.tsx) 安装 bridge。Broker 派发前仅检查窗口销毁等条件,没有等待 bridge 就绪的握手,也没有在该派发链路中处理 bridge 就绪丢失。Renderer 内的 Worker `ready` 只确认模型初始化,不能证明 Main 发请求时 Renderer 已安装 IPC 监听。窗口重载、Renderer 崩溃及启动时监听尚未安装的影响应按 TC-3 复现。 + +来源请求可以取消 OCR;已派发请求取消时 Main 发送取消消息并立即结算,然后派发下一项,未等待 Renderer 清理确认。Renderer 对当前活动请求的取消会终止共享 Worker。管理页因此没有将该操作作为安全的单任务取消能力;手动释放也会拒绝活动或排队请求。 + +### Embedding 的共享执行与取消 + +[Main provider 工厂](../../src/main/index.ts) 按模型目录维护 `sharedEmbeddingBrokers` 及使用计数;[transport](../../src/main/knowledge/embedding-utility-transport.ts) 以 spawn 确认进程启动。[Granite 引擎](../../src/main/knowledge/granite-embedding-engine.ts) 缓存 `loadTask`,在首次请求时创建 tokenizer 和 WASM ONNX session。进程已启动不等于模型已加载;当前没有为模型加载完成提供独立服务状态。 + +[Broker](../../src/main/knowledge/embedding-inference-broker.ts) 默认请求超时为 120 秒,计时在 transport 就绪后建立 pending 时开始。调用方取消或超时会先返回错误,同时发送 cancel,保留 pending 和推理执行记录,等待结果、`CANCELLED` 或进程退出。保留容量避免把仍在计算的任务当作已释放。 + +[执行端](../../src/main/knowledge/embedding-inference-worker.ts) 收到 cancel 后设置 AbortSignal;Granite 在加载、输入构造和 `session.run` 前后检查取消,但没有将可抢占的取消句柄传入 `session.run`。若该调用一直不返回,取消检查和确认就无法完成。Broker 的 `cancelPending` 会清除原计时器,当前没有针对该 pending 的后续有界清理升级,因此持续挂起可一直占用在途容量。此为源码可达的条件风险,真实引擎挂起尚未复现。 + +`loadTask ??= this.loadFiles(...)` 也会缓存被拒绝的加载 Promise;同一引擎实例后续请求复用同一个失败,不能通过再次请求重新加载。重建进程会建立新引擎;是否增加实例内重试及其清理方式,按 TC-2 验证后确定。 + +## 架构建议与触发条件 + +ASR 继续按录音请求创建 Worker。对低频、间歇输入,每次释放模型能避免长期占用;本次没有冷启动与常驻成本数据,不能量化收益。只有连续流式识别成为真实需求,或高频请求测出重复加载已影响目标延迟,才评估常驻 utilityProcess。届时需比较加载成本、暖请求延迟、空闲工作集和取消时延,并重新设计音频流与识别器复用;单纯常驻不会把当前离线 API 变成流式识别。 + +OCR 保留 Web Worker。如果文档任务需要在主 UI 重载或不可用时继续执行,优先评估由 Main 持有的专用后台 Renderer 加 Worker,以保留浏览器图像/PDF 能力。该方案仍是候选,需要完成以下设计与实机验证后才可决定迁移: + +- 保持现有 sandbox、context isolation、禁用 Node integration 的边界;通过专用 preload 暴露必要方法,并沿用可信 sender 与输入校验。当前 IPC 若限定主窗口 sender,需要明确新增宿主的受信身份及响应归属。 +- 分别确认后台 Renderer 的 IPC 监听就绪与 Worker 模型就绪;定义重载、崩溃、启动失败及应用退出时 pending、队列和模型的处置,防止静默丢请求或自动重放。 +- Main 持有后台宿主生命周期;管理 UI 关闭不销毁执行宿主,服务释放和应用退出才按约定清理。验证隐藏 Renderer 的调度、计时器和 Worker 执行,不根据窗口不可见推断运行不受影响。 +- 用实际 OS PID、Electron 进程指标和崩溃影响验证隔离程度。单独的 BrowserWindow/WebContents 不能直接作为独立 OS 进程或独立服务资源统计的证据;若与其他 Renderer 共享 PID,必须继续报告共享范围。 + +Embedding 保留共享 utilityProcess。查询与索引共享模型和进程的现有方式具备复用基础,优化先处理取消回收和失败重试。单请求取消继续尽量只影响该请求;进程终止属于服务级操作,必须说明其他使用方的结果。不得把每次请求超时直接等同于可以无条件杀死共享进程。 + +## 任务控制覆盖与缺口 + +[共享契约](../../src/shared/local-inference-contracts.ts)将服务状态与任务状态分开;[LocalInferenceService](../../src/main/local-inference-service.ts) 在 Main 内存登记请求,保存活动项及最近 100 条终态记录。任务的 `running` 当前包含排队、模型加载与执行,未提供统一细分阶段。该登记器是观测和控制入口,各引擎仍负责实际队列与清理。 + +| 控制维度 | 当前覆盖 | 后续评估和验收要求 | +| --- | --- | --- | +| 状态 | 任务有 `running/cancelling/completed/cancelled/failed`;服务另有启动、运行、停止、未知和错误状态;ASR 模型可用时服务仍为 unknown | 区分调用方已返回、执行仍活动、资源清理已确认;进程 spawn、模型 ready、请求完成不能互相替代。先增加必要证据,不预建完整阶段状态机 | +| 所有权 | ASR 请求持有 Worker;OCR Renderer 持有共享 Worker;embedding 按目录共享 Broker 并引用计数 | 控制记录注明真实来源与宿主;缺失项目、会话关联时不猜测归属。产品 Task 的取消不能凭名称去停止整个推理服务 | +| 取消 | ASR terminate;OCR 来源取消会终止当前 Worker;embedding 协作取消并保留执行记录 | 验证取消与自然完成竞态、重复取消及清理结果。单请求取消与共享服务停止分别定义影响,不用 UI 隐藏代替取消 | +| 超时与容量 | ASR Worker 120 秒;OCR 两端预算与排队语义不同;embedding 默认请求 120 秒且保留取消后容量 | 分别说明排队、启动、推理、清理的计时起点和上限;调用方超时后仍在执行的工作需要有界处置,不得提前释放容量制造超额并发 | +| 停止与清理 | 服务操作按 serviceId 串行,期间拒绝新增请求;停止校验当前活动 taskId 确认清单;向量停止等待 exit,重启不重放请求 | 清理失败保持可观察的活动/错误信息;窗口或宿主丢失需使受影响请求得到明确结果;ASR 和 OCR 的结果/清理间隙分别核对 | +| 可观测性 | 有来源、状态、时间、可选模型和错误;向量有 PID 资源数据;管理 Modal 不显示任务历史 | 测量排队、加载、执行、取消请求到执行结束、清理确认的耗时与在途数;日志不记录音频、图片或向量原文,未知指标不补零 | + +本文的覆盖要求用于后续问题复现和最小修复,不构成引入统一常驻服务框架、持久化执行副本或自动恢复协议的决定。范围为桌面本机引擎;远程 Agent、外部向量端点和未接入的 TTS 不因此获得同样控制能力。 + +## 资源观测口径 + +[LocalInferencePage](../../src/renderer/src/LocalInferencePage.tsx) 在启用、文档可见且 Modal 内容未被 hidden/inert 隔离时每 5 秒读取快照,跳过重叠请求,关闭时清理轮询。该刷新间隔不能用于证明短请求的峰值或清理完成时刻。 + +[向量资源采样器](../../src/main/inference-process-resources.ts) 按 transport 当前 PID 匹配 `app.getAppMetrics()` 的 Utility 条目,用累计 CPU 秒差除以单调时间间隔。100% 表示一个逻辑核心,可超过 100%;首次采样、PID/创建时间变化、间隔超过 15 秒或读数异常时重建基线。工作集从 KiB 转为字节,UI 显示 MiB。 + +向量工作集包含运行时、模型、临时缓冲区及并发使用方,不能当作模型权重大小或单任务内存。ASR Node Worker 和 OCR Web Worker 没有当前可独立归属的 OS 进程工作集;宿主进程总量不能直接填入某个服务行。未来 OCR 后台宿主也必须先核实 PID 与共享情况,再决定指标范围。显存当前未采集。 + +## 优化待办与验收 + +优先级表示建议处理顺序:P1 为执行正确性和回收问题,P2 为测量及有条件的架构选型。全部待办待开展;源码核对已完成,故障复现、修复和实机验收分别记录,不以文档完成替代实现完成。 + +| ID | 优先级与事项 | 依赖及验收条件 | +| --- | --- | --- | +| TC-1 | P1:embedding 取消/超时后的有界回收 | 先覆盖 `session.run` 延迟返回及不返回,观察 caller、pending、执行记录与容量。定义取消后的清理等待上限及升级条件,数值依据测量确定。普通取消不终止其他共享任务;确需服务级终止时明确受影响使用方及失败结果,等实际退出再释放容量,且不重放请求。模拟用于稳定触发条件,最终以真实引擎取消和停止路径补验 | +| TC-2 | P1:embedding 加载失败重试 | 覆盖首次读模型或建 session 失败、随后恢复依赖的场景;选择清除失败缓存或显式重建引擎的最小方案。验收后续请求能够重新加载,并发请求不重复加载,失败中已创建的资源被清理,销毁后不再复活;不能把一次成功创建进程当作重试通过 | +| TC-3 | P1:OCR 宿主就绪、丢失与超时预算 | 保留当前 Web Worker 即可先验证,无须等待迁移。覆盖监听安装前派发、主 Renderer 重载/崩溃、冷启动超过 Main 启动预算及排队取消。明确 bridge 就绪与 Worker ready 的区别;受影响请求有明确结果,队列能继续使用,没有静默丢失或重放;两端预算、起算点和取消后下一项派发与清理顺序一致 | +| TC-4 | P1:ASR 结果与清理记账 | 覆盖结果先到、延迟退出、清理异常以及取消/超时与结果竞争。选择延后请求结算或单独保留清理记录的最小方案;验收资源仍活动时不会被报告为已释放,也不提前放开实际单请求容量。正常完成及异常路径均验证 Worker 最终退出 | +| TC-5 | P2:统一测量记录与资源归属核验 | 可与 P1 复现并行,为 TC-6/TC-7 提供依据。记录冷/暖加载时间、端到端延迟、排队时长、取消至执行结束/资源回收时长、空闲与峰值工作集、CPU 时间和样本数;按 PID 对照 OS 工具,分别报告引擎、宿主与应用总量。重启后不沿用旧 PID 基线,不以 5 秒 UI 轮询代替专门测量 | +| TC-6 | P2、条件待定:OCR 后台 Renderer 加 Worker | 依赖明确的 UI 独立执行需求、TC-3 生命周期结论及 TC-5 数据。候选验证需包含图片、多页 PDF、UI 重载时执行、后台宿主崩溃、空闲释放、应用退出、preload/IPC sender 边界和各支持平台打包资源。证实任务连续性及实际 PID 隔离后,再记录采用或保留现状的结论 | +| TC-7 | P2、条件待定:ASR 常驻 utilityProcess | 依赖流式/高频场景成立,或 TC-5 证明重复加载达到需优化程度,并完成 TC-4。对比请求级 Worker 与候选的冷启动、暖请求、空闲内存和取消成本;若为流式,验证连续音频、结果提交和停止语义。没有测量或实际需求时继续保留请求级 Worker | + +测量记录应包含 OS/架构、Electron 与依赖版本、模型版本、硬件、输入时长/页数/token 与批量大小、冷暖条件、请求频率和并发使用方。使用固定可重复输入,报告样本数、分布及异常,不填入未经测量的性能收益。后续验收覆盖受影响的 Windows、macOS、Linux 构建;尚未测的平台明确保留为待验。 + +本次证据为源码和已安装依赖入口检查。后续执行待办时,在所属功能进度文档记录命令、环境、真实路径结果及遗留项,并引用 TC 编号;若迁移条件未成立,记录保留现状的原因即可。 diff --git a/docs/architecture/model-download-source-design.md b/docs/architecture/model-download-source-design.md index 0bf94887..b16526ef 100644 --- a/docs/architecture/model-download-source-design.md +++ b/docs/architecture/model-download-source-design.md @@ -24,7 +24,7 @@ 1. “平台功能”保留现有一级设置分类,在分类内部增加共享 `PageTabs`: - **通用设置** - - **魔法笔记** + - **远程项目(技术预览)** 2. “通用设置”首个功能为“模型下载源”。 3. 首期提供两个互斥选项: - `modelscope`,用户文案为 **ModelScope**,默认值。 @@ -49,7 +49,7 @@ 下载使用新来源。 9. 当前来源失败时,不自动重试另一个来源。错误可以提供“前往通用设置更换下载源”,由 用户明确选择。 -10. 现有魔法笔记设置只移动到“魔法笔记”页签,不改变保存、启用或评论行为。 +10. 魔法笔记设置由应用中心与笔记页共享,不在全局设置中重复提供入口。 --- @@ -60,7 +60,7 @@ “平台功能”现已使用两个二级页签: - “通用设置”承载全局模型下载源。 -- “魔法笔记”承载显示入口、AI 评论方式和 AI 评论形式。 +- “远程项目(技术预览)”承载远程项目开关与 Agent 包管理。 页签复用共享 `PageTabs`,默认打开“通用设置”,不会把当前页签写入应用设置。 @@ -99,7 +99,7 @@ - 切换来源时不影响已安装、已选择或正在使用的模型。 - 下载失败时知道实际使用了哪个来源。 - 所选来源没有模型时得到明确说明,并可以主动前往设置切换。 -- 在“平台功能”中快速区分通用设置与魔法笔记。 +- 在“平台功能”的“通用设置”中选择模型下载源。 ### 3.2 产品目标 @@ -166,10 +166,9 @@ └─ 平台功能 ├─ 通用设置 │ └─ 模型下载源 - └─ 魔法笔记 - ├─ 显示魔法笔记入口 - ├─ AI 评论方式 - └─ AI 评论形式 + └─ 远程项目(技术预览) + ├─ 远程项目开关 + └─ Agent 包管理 ``` 分类页只有一个一级标题“平台功能”。页签标题不重复渲染为第二个页面标题;每个面板内部 @@ -186,7 +185,7 @@ onChange={setActiveSection} tabs={[ { id: 'general', label: '通用设置' }, - { id: 'magic-notes', label: '魔法笔记' } + { id: 'remote-projects', label: '远程项目(技术预览)' } ]} value={activeSection} variant="segmented" @@ -214,7 +213,7 @@ 未来新增页签时: -- 必须与“通用设置”和“魔法笔记”处于同级。 +- 必须与“通用设置”和“远程项目(技术预览)”处于同级。 - 页签表示完整、独立的功能设置域。 - 通用设置只放跨功能的全局行为,不成为任意设置的杂物区。 - 页签超过可读数量时重新组织信息架构,不允许多行堆叠。 @@ -230,7 +229,7 @@ 平台功能 管理通用平台行为与可选工作区能力 -[ 通用设置 ] [ 魔法笔记 ] +[ 通用设置 ] [ 远程项目(技术预览) ] ┌ 模型下载源 ────────────────────────────────────────────┐ │ 选择 GoodBuddy 托管本地模型后续下载使用的平台。 │ @@ -304,28 +303,11 @@ --- -## 8. 魔法笔记页签 +## 8. 魔法笔记设置边界 -现有魔法笔记卡完整移动到“魔法笔记”面板: - -- 显示魔法笔记入口。 -- AI 评论方式。 -- AI 评论形式。 - -保持以下行为不变: - -- 开关继续使用共享 Switch 和 `role="switch"`。 -- 评论方式和形式继续使用 `SegmentedControl`。 -- 每项继续即时保存。 -- 保存失败保留最后确认设置。 -- `onMagicNotesEnabledChange` 继续更新应用导航入口。 - -页签重构不能: - -- 重置现有设置。 -- 在切换页签时保存或改变值。 -- 因魔法笔记入口关闭而隐藏“魔法笔记”设置页签。 -- 把页签选择误当成启用开关。 +全局设置不再提供魔法笔记页签或跳转入口。应用中心与笔记页继续共享同一表单和配置, +保留已有启用、待办数量显示、评论方式、评论形式及业务数据。共同设置的交互与同步规则见 +[应用导航 UI 设计](../features/application-tool-navigation/ui-design.md)。 --- @@ -899,7 +881,7 @@ Ollama 的模型下载由用户和 Ollama 管理。GoodBuddy 的模型下载源 - 默认选中“通用设置”Tab。 - Tab 使用 `tablist`、`tab`、`tabpanel` 和 `aria-selected`。 - 方向键、Home、End 和焦点恢复正确。 -- 切换到魔法笔记不改变任何设置。 +- 切换平台功能页签不改变任何设置,全局设置不显示魔法笔记入口。 - Radio Group 具有持久 Label。 - 选择来源时保存一次,保存期间防止重复提交。 - 保存失败恢复原值并保留可重试错误。 @@ -954,7 +936,7 @@ Ollama 的模型下载由用户和 Ollama 管理。GoodBuddy 的模型下载源 - 将应用设置版本升级并迁移旧版本。 - 在“平台功能”中增加 `PageTabs`。 - 增加“通用设置”与模型下载源 Radio Group。 -- 把现有魔法笔记卡移动到“魔法笔记”面板。 +- 魔法笔记卡已迁入应用共同设置,全局页签已移除,见第 8 节。 ### 阶段 2:共享目录和来源解析(已完成) @@ -983,14 +965,14 @@ Ollama 的模型下载由用户和 Ollama 管理。GoodBuddy 的模型下载源 ### 19.1 产品 -- “平台功能”显示“通用设置”和“魔法笔记”两个可访问页签。 +- “平台功能”显示“通用设置”和“远程项目(技术预览)”两个可访问页签。 - 默认打开“通用设置”。 - “通用设置”提供 ModelScope 和 Hugging Face,默认 ModelScope。 - 来源选择说明影响范围,并明确已安装模型、ZIP、Ollama 和应用更新不受影响。 - 切换来源不会下载、删除、切换或重新验证任何已安装模型。 - 当前来源没有模型时,在点击下载前即可看到不可用原因。 - 下载失败不会自动请求另一来源。 -- 魔法笔记的现有设置和入口行为保持不变。 +- 魔法笔记设置由应用中心与笔记页共享,全局设置不再提供笔记入口;已有配置值和业务数据保持不变。 ### 19.2 数据与下载 diff --git a/docs/features/application-tool-navigation/README.md b/docs/features/application-tool-navigation/README.md index 5f2c8e17..e3a90619 100644 --- a/docs/features/application-tool-navigation/README.md +++ b/docs/features/application-tool-navigation/README.md @@ -1,17 +1,19 @@ # 应用导航与系统工具入口 -本功能整理 GoodBuddy 主侧栏的入口层级:系统入口保持固定,内置应用通过最底部应用中心 -访问,并可常驻主导航;系统工具由右侧工作栏 Tab 承载。应用商店是后续功能,首期不提供 +本功能整理 GoodBuddy 主侧栏的入口层级:系统入口保持固定,知识库和智能心跳作为固定内置应用始终启用并显示; +魔法笔记和本机推理可通过应用管理控制启用、常驻及排序。底部应用中心向上展开轻量锚定菜单,列出已启用应用;底部“管理应用”打开既有管理 Modal。系统工具由右侧工作栏 Tab 承载。应用商店是后续功能,首期不提供 商店入口、推荐位或安装流程。 当前分期见 [PRD 第 8 节](./prd.md#8-分期),实施步骤见[技术设计第 11 节](./technical-design.md#11-实施顺序)。 -本轮更新实施计划与范围,旧版功能要求、验收和配套设计仍需按新计划同步,此项列为实现前的第一步。 +本轮 A–D 已接入生产源码:应用菜单、应用管理 Modal、共享应用设置、持久化偏好及本机推理。菜单不按打开历史或常驻状态筛选,无模态遮罩;点击应用行关闭菜单,知识库、智能心跳和魔法笔记打开主内容区页面。本机推理从菜单、常驻入口或管理 Modal 打开时均使用独立 Modal,保留底层工作区。侧栏依次显示知识库、智能心跳,再显示按偏好过滤的可选应用。两个固定应用在管理 Modal 中仅提供“打开”,不参与启用、常驻或排序,不增设通用空设置;原工作区配置及心跳单条计划 enabled 保持原义。验证范围及集成缺口见[实施进度](./progress.md)。 新增计划包括 [私有化市场与 YAML 交换](./prd.md#fr-15-私有化市场与-yaml-交换后续): 通过市场 URL 获取应用,支持 `.yml` 导入导出,未来由 ShareServer 提供私有目录与分发。 -[本机模型管理入口](./prd.md#fr-16-本机模型管理入口新增计划项)可独立于商店交付,拟作为 -可常驻左侧的内置管理应用,区分受管进程、外部服务和进程内模型。两项均为需求记录, -未实现,相关后续验收见 [User Stories](./user-stories.md#7-后续需求场景)。 +[本机模型管理入口](./prd.md#fr-16-本机模型管理入口新增计划项)已独立于商店接入,作为 +可常驻左侧的“本机推理”内置应用,直接查看语音、OCR、向量等本机服务状态与可用资源指标,不显示任务历史。向量服务显示独立进程的 CPU 和工作集内存;ASR、OCR 与宿主共享进程,逐行说明无法独立统计的原因。 +本轮已接入 `local-inference` 管理 Modal、类型化 IPC、真实请求登记及引擎管理;实际支持清单见 +[技术设计](./technical-design.md#111-本机推理任务与执行服务),市场仍为后续需求。 +相关验收见 [User Stories](./user-stories.md#7-后续需求场景)。 项目活动汇总独立于上述应用中心计划,范围见 [FR-14](./prd.md#fr-14-项目活动汇总)。 计数规则由[活动逻辑](./logic-design.md#9-项目活动汇总)定义,入口与级联菜单见 @@ -21,6 +23,8 @@ ## 文档导航 +2026-09-16 后续应用组织决策:计划将现有“智能心跳”入口整合、升级为“监督者”,内部包含工作回顾和故事线图谱。未来市场复用同一应用身份,不增加平级重复入口。该更名与整合尚未实施;当前智能心跳为固定应用,不提供应用级启用、常驻或排序。目标定义见[监督者产品设计](../conversation-supervision/supervisor-prd.md)。 + | 文档 | 权威职责 | | --- | --- | | [PRD](./prd.md) | 用户问题、产品边界、功能要求与产品验收 | @@ -28,7 +32,7 @@ | [功能逻辑设计](./logic-design.md) | 分类规则、入口状态、优先级与失败结果 | | [UI 设计](./ui-design.md) | 侧栏信息架构、控件、文案、键盘和响应式行为 | | [技术设计](./technical-design.md) | 现有模块映射、状态契约、持久化和实施顺序 | -| [实施进度](./progress.md) | 项目活动级联的生产实现与验证记录 | +| [实施进度](./progress.md) | 应用中心、设置及项目活动级联的实现与验证记录 | | [应用中心交互 Demo](./navigation-demo.html) | 对比六个候选方案;配套 CSS 和 JS 仅服务原型 | Demo 可直接在支持原生 dialog、popover 的现代浏览器中打开,无需依赖或构建。 @@ -36,7 +40,7 @@ Demo 可直接在支持原生 dialog、popover 的现代浏览器中打开,无 A–E 仅展示内置应用,没有商店入口、推荐或安装操作;F 单独演示未来私有市场。 模型服务、资源指标和工具内容均为演示数据,不执行真实安装、模型加载或进程操作。 窄屏上下排列侧栏与主内容,应用页面隐藏输入区,对话页面显示输入区。 -模型管理与 F 方案均为计划预览,不代表正式功能已交付,也不纳入首期验收。 +Demo 的模型管理和 F 方案均使用模拟数据;正式本机推理 Modal 的交付范围以技术清单和实施进度为准,旧页面原型不作为 Modal 验收依据。 底部输入区共用一个简化候选布局:附件、语音、Runtime、模式和发送位于主操作行,专家、 知识范围及 Runtime 专属选项通过“选项”展开,非默认选择显示为可移除标签。可体验文件名 附件、模拟语音、模板填入、原生命令选择、8 秒模拟回复、发送排队、立即插入、删除、停止, @@ -48,11 +52,13 @@ A–E 仅展示内置应用,没有商店入口、推荐或安装操作;F 单 进入会话层,并提供返回按钮。页面上方可切换“有待处理、仅运行中、仅当前项目运行、全部 空闲”四种场景。项目与会话均为演示数据;该级联交互已接入正式产品活动入口,范围与 验证记录见[实施进度](./progress.md)。 -按最新讨论,Demo 已移除左侧系统工具快捷区:文件、终端、浏览器和资源监控只在右侧 -工作栏 Tab 中演示,不列入应用中心。上方正式文档仍保留原设计,待方案确定后同步。 +Demo 已移除左侧系统工具快捷区:文件、终端、浏览器和资源监控只在右侧 +工作栏 Tab 中演示,不列入应用中心。旧原型仍直接打开整窗 Modal,其中使用可搜索应用列表。 + +Demo 待同步更正:本节仅描述旧原型,不是生产行为或验收依据。原型直接打开 Modal,以及知识库和智能心跳的启停、常驻、排序、通用设置,均已过时;生产采用上述轻量菜单及两个固定应用规则。本轮不修改 Demo 文件。 六个方案共用“我的应用”区:通过 + 或“全部应用”选择常驻应用,编辑时可拖动或使用 -上下箭头排序、移除入口。魔法笔记、知识库、智能心跳及计划预览“本机模型”默认全部启用且常驻。 +上下箭头排序、移除入口。魔法笔记、知识库、智能心跳及计划预览“本机推理管理”默认全部启用且常驻。 取消常驻仅移除导航捷径,仍可从应用中心打开;关闭应用隐藏业务入口,应用中心保留设置与 重新开启入口,并记住常驻偏好。当前应用页关闭后显示不可用状态及设置恢复按钮。 知识库关闭时同步隐藏侧栏入口、会话选项中的知识范围和检索方式、已选知识标签;重新开启 @@ -62,12 +68,13 @@ A–E 仅展示内置应用,没有商店入口、推荐或安装操作;F 单 所有内置应用提供应用中心、应用页面和全局设置入口,均打开同一应用设置面板,分别控制 启用与常驻。魔法笔记面板另含显示未完成待办数量、AI 评论方式 (即时/保存后自动/保存后手动)、AI 评论形式(长评 + 要点/长评/要点)。现有“显示 -魔法笔记入口”在原型中与“常驻左侧菜单”统一。启用、常驻、待办数量显示默认开启; +魔法笔记入口”不在原型中重复提供。正式迁移保留其业务启用值,常驻使用独立配置。启用、常驻、待办数量显示默认开启; 评论方式默认即时,评论形式默认长评 + 要点。侧栏待办数为固定的 3 项演示数据。 修改即时生效于原型,不调用 AI 或写入真实应用设置。 -本机模型主内容区展示紧凑服务列表,包含模型、用途、引擎、管理方式、状态、占用和使用方。 -受管进程模拟启动、停止、重启;外部服务仅提供连接配置预览;进程内模型模拟加载与释放。 +此 Demo 中的任务、进度、使用方与服务内存为旧方案模拟内容;正式 Modal 已收窄为服务状态列表,见 [FR-16](./prd.md#fr-16-本机模型管理入口新增计划项)。 +引擎和管理方式收进详情;受管进程模拟启动、停止、重启,进程内模型模拟加载与释放。 +服务停止或重启后任务标为中断,重新启动不自动恢复任务;任务级取消仍待实际引擎接入。 影响使用方的操作先显示就地确认,取消保留原状态;隐藏或关闭管理应用不改变服务状态。 F 提供私有市场 URL、模拟获取目录、模拟不可达与重试,不发起网络请求或切换公共来源。 @@ -97,7 +104,7 @@ Notion 收藏和 VS Code Profiles,当前版本已移除场景工具包与快 | 术语 | 定义 | | --- | --- | | 系统入口 | GoodBuddy 工作流程或审计所必需的固定入口,用户不能卸载、隐藏或改变类型 | -| 应用 | 在主内容区打开完整一级页面的功能,可显示在“当前对话”所在的主导航区 | +| 应用 | 可显示在主导航区的功能;知识库、智能心跳和魔法笔记打开一级页面,本机推理打开保留底层工作区的 Modal | | 系统工具 | GoodBuddy 自带且不可卸载的辅助能力,包括文件、终端、浏览器和资源监控,由右侧助手工作栏 Tab 承载 | | 插件应用 | 未来由插件提供的一级页面入口 | | 插件工具 | 未来由插件提供的辅助面板或命令入口 | diff --git a/docs/features/application-tool-navigation/logic-design.md b/docs/features/application-tool-navigation/logic-design.md index 7b9cd7f2..39c35c84 100644 --- a/docs/features/application-tool-navigation/logic-design.md +++ b/docs/features/application-tool-navigation/logic-design.md @@ -4,9 +4,9 @@ | 项目 | 内容 | | --- | --- | -| 状态 | 设计中 | -| 版本 | 0.2 | -| 日期 | 2026-09-08 | +| 状态 | 应用中心与本机推理已接入源码,整体验收待完成 | +| 版本 | 0.4 | +| 日期 | 2026-09-17 | | 关联 PRD | [应用导航与系统工具入口 PRD](./prd.md) | | 关联 User Stories | [User Stories](./user-stories.md) | @@ -15,9 +15,11 @@ 1. “当前对话”“运行记录”和“设置”始终是系统入口。 2. 运行记录不进入工具注册表、应用显隐设置或插件市场。 3. 文件浏览器、终端、浏览器和资源监控始终是系统工具,不能卸载或被插件替换。 -4. 左下角只提供快捷入口,工具内容仍由助手工作栏承载。 -5. 隐藏应用不等于停用功能,也不删除、迁移或清理业务数据。 -6. 快捷入口不能扩大执行空间、文件、PTY、网络或浏览器权限。 +4. 左下角提供应用中心和独立固定设置入口;文件、终端、浏览器、资源监控只通过右侧工作栏 Tab 和“+”访问,不进入应用中心。 +5. 魔法笔记、本机推理的启用、常驻及顺序是独立状态。知识库和智能心跳始终启用并固定显示,不参与这些状态;取消可选应用常驻不关闭功能,关闭不删除数据或导航偏好。 +6. 入口不能扩大执行空间、文件、PTY、网络或浏览器权限。 +7. 应用中心始终可达,点击向上展开无模态遮罩的锚定菜单,只列已启用应用,不使用打开历史或常驻过滤。菜单底部“管理应用”打开既有 Modal,关闭的可选应用在其中仍可搜索、配置和重新开启。 +8. 所有入口和新请求的功能判断读取同一份保存成功的权威设置;保存中的目标值不提前生效。 ## 2. 入口模型 @@ -25,14 +27,21 @@ type NavigationContribution = | { type: 'system-entry' - id: 'chat' | 'activity' | 'settings' + id: 'chat' | 'activity' | 'application-center' | 'settings' placement: 'primary-start' | 'primary-end' | 'footer' } | { type: 'application' - id: 'magic-notes' | 'knowledge' | 'heartbeat' + id: 'knowledge' | 'heartbeat' source: 'builtin' - visible: boolean + fixed: true + } + | { + type: 'application' + id: 'magic-notes' | 'local-inference' + source: 'builtin' + enabled: boolean + pinned: boolean } | { type: 'system-tool' @@ -41,7 +50,8 @@ type NavigationContribution = } ``` -该模型只覆盖首期入口。插件贡献模型随插件 Host、权限和生命周期另行设计。 +该模型是首期的逻辑投影,启用值来自各应用的唯一业务配置,常驻及顺序来自导航偏好。 +应用清单为魔法笔记、知识库、智能心跳、本机推理,打开无需安装。市场不加入本轮清单。 ## 3. 主导航组合规则 @@ -49,35 +59,62 @@ type NavigationContribution = ```text 当前对话 -可见的内置应用 +知识库(固定显示) +智能心跳(固定显示) +可选应用(按保存顺序,仅显示启用且常驻项) 运行记录 ``` -当前对话和运行记录不参与排序。首期内置应用默认顺序为魔法笔记、知识库、智能心跳;显隐 -设置只从中移除对应项,不改变固定入口的位置。 +当前对话、知识库、智能心跳和运行记录不参与排序。可选应用默认顺序为魔法笔记、本机推理,默认均常驻。两个固定应用始终位于可选应用之前,过滤可选项不留下空白。 +常驻、取消常驻和排序按设备保存,重启后恢复。排序只发生在应用区,不移动固定系统入口。 +保存完整可选应用顺序,关闭或取消常驻只过滤主导航,不删除顺序记录;重新开启或常驻时按 +该顺序恢复。管理列表编辑完整可选应用顺序;上下移动和拖动共用同一顺序写入,两个固定应用不作为拖动项或目标。 ### 3.1 应用可见性与业务状态 -| 导航可见 | 功能启用 | 结果 | -| --- | --- | --- | -| 是 | 是 | 显示入口并允许进入 | -| 否 | 是 | 隐藏入口,后台和数据保持原状 | -| 是 | 否 | 不显示不可用入口;设置页保留启用路径 | -| 否 | 否 | 不显示入口,保留符合该功能自身规则的数据 | +下表仅适用于可选应用。知识库和智能心跳始终可用,管理 Modal 中仅有“打开”,保留原工作区实际配置,不增加通用空设置页。心跳单条计划 enabled 仍按原业务规则控制计划。 -“功能启用”由各应用现有产品设置负责。例如魔法笔记启停仍使用原设置;导航偏好不能覆盖它。 +| 常驻偏好 | 功能启用 | 结果 | +| --- | --- | --- | +| 是 | 是 | 主导航显示,可从主导航或应用中心打开 | +| 否 | 是 | 主导航隐藏,仍可从应用中心打开,后台和数据保持原状 | +| 是 | 否 | 主导航、应用菜单和业务入口隐藏,管理 Modal 保留设置,记住常驻及顺序 | +| 否 | 否 | 主导航、应用菜单和业务入口隐藏,管理 Modal 保留设置,记住未常驻状态 | + +管理 Modal 浏览和搜索包含关闭的可选应用,搜索不修改启用或常驻。轻量菜单仅显示已启用项,点击行先关闭菜单;本机推理打开独立 Modal,其余应用请求主内容区导航。管理 Modal 的“打开”和常驻入口遵守同一规则。打开已启用应用不自动常驻; +取消当前应用的常驻不关闭当前页面或本机推理 Modal。关闭应用后不能从旧入口继续执行新的业务操作。 +停用时仍允许管理常驻偏好,界面说明重新开启后才会显示入口。 + +### 3.2 关闭应用与恢复 + +关闭与恢复仅适用于可选应用,知识库页面、会话控件及关联,以及智能心跳入口、页面和计划 enabled 不受可选应用偏好影响。 + +| 对象 | 关闭后的结果 | 重新开启后的结果 | +| --- | --- | --- | +| 当前已打开应用页或本机推理 Modal | 原位置显示“应用已关闭”的不可用状态,提供应用设置恢复入口;保留内容状态及草稿,不强制跳转 | 恢复可用性;仍打开时恢复内容,已关闭或离开则不自动打开 | +| 已在执行的请求及后台操作 | 沿用功能自身的取消、完成和清理生命周期;本次应用开关不新增取消策略 | 不自动恢复、中断后重跑或补发任务 | +| 数据、常驻及顺序 | 保留原值,业务入口按启用状态过滤 | 按保存的常驻及顺序恢复入口,不把未常驻应用自动常驻 | + +知识请求及单个知识库实例停用、配置修改或删除继续遵守知识库自身规则,没有应用级禁用判断。 + +### 3.3 魔法笔记设置迁移 + +魔法笔记设置迁入应用中心的共同设置页;笔记页面定位到同一页,全局设置移除该入口, +编辑同一配置。启用、常驻、显示未完成待办数量分别控制功能、导航和徽标,不保留重复的 +“显示魔法笔记入口”开关。 + +未配置的应用启用、常驻及魔法笔记相关布尔项默认开启;已有明确保存的 `false` 必须保留。 +AI 评论方式和评论形式继续为单选,沿用现有默认值“即时”和“长评 + 要点”,不能解释为 +全部模式同时启用。迁移保留既有单选值及业务数据。关闭数量显示只隐藏徽标,不修改待办。 ## 4. 系统工具打开规则 ### 4.1 通用流程 ```text -用户激活工具按钮 - -> 校验按钮仍可用 - -> 向助手工作栏发送打开意图 - -> 工作栏按应用实例策略查找或创建实例 - -> 展开工作栏 - -> 激活目标实例 +用户展开右侧工作栏 + -> 选择已有 Tab,或从“+”目录选择工具 + -> 已有 Tab 按实例 ID 激活;目录按单实例或多实例策略创建或激活 -> 把焦点移入面板标题或首个主要控件 ``` @@ -85,31 +122,27 @@ type NavigationContribution = ### 4.2 决策表 -| 工具 | 匹配实例存在 | 匹配实例不存在 | 上下文不可用 | +| 工具 | 选择已有 Tab | 从“+”目录选择 | 上下文不可用 | | --- | --- | --- | --- | -| 文件 | 激活不可关闭的单实例并保留其跟随或固定状态 | 仅在迁移或布局修复时补回 `workspace` | 打开面板并显示目录修复入口 | -| 终端 | 激活当前执行空间最近的 `starting` 或 `running` 实例 | 创建一个绑定当前执行空间的实例 | 没有项目时使用本机 Home | -| 浏览器 | 激活绑定当前 Conversation 的最近使用实例 | 创建绑定当前 Conversation 的新实例 | 激活最近使用实例;不存在时创建待绑定实例 | -| 资源监控 | 激活 `resources` 单实例 | 创建本机 `resources` 单实例 | 部分指标不可用时显示原因并保留其余指标 | +| 文件 | 激活不可关闭单实例并保留跟随或固定状态 | 聚焦 `workspace`;仅迁移或布局修复时补回 | 跟随模式无有效项目目录或默认工作区时显示修复入口 | +| 终端 | 激活选中的确切实例,保留执行空间和历史状态 | 每次创建绑定当前执行空间的额外实例 | 新建时无项目使用本机 Home;SSH 失败保留远端目标与诊断 | +| 浏览器 | 激活选中的确切实例,保留绑定目标和页面 | 每次创建绑定当前 Conversation 的额外实例 | 新建时无 Conversation 创建待绑定空实例 | +| 资源监控 | 激活本机 `resources` 单实例 | 已存在则聚焦,否则创建 | 部分指标不可用时显示原因并保留其余指标 | -文件保持单一实例原有绑定。浏览器快捷入口按当前 Conversation 匹配最近使用实例,而工作栏 -“+”始终新建浏览器实例。固定目标失效时显示该目标的修复状态,不回退到当前项目、默认 -工作区或当前会话。 - -`closing`、`exited`、`interrupted` 和 `failed` 终端不属于可复用实例。当前执行空间只有这些 -终端时,快捷按钮创建新实例并保留原 Tab 的历史状态。用户需要额外的并行终端时使用工作栏 -“+”或终端面板中的既有创建命令。 +选择已有 Tab 不按当前项目或 Conversation 查找替代实例,也不重绑目标。文件的跟随模式 +仍按工作栏自身规则更新上下文;固定目标失效时显示该目标的修复状态,不静默回退。 +终端 `closing`、`exited`、`interrupted`、`failed` Tab 保留原状态,选择它们不自动重建。 +终端和浏览器通过“+”新建时不按目标去重,不恢复旧快捷按钮的最近匹配实例复用行为。 ### 4.3 选中与状态 -工具按钮满足以下条件时显示选中:助手工作栏已展开,且当前活动实例的 `appId` 与工具映射 -一致。只有实例存在但未激活时不显示选中。 +工作栏按确切实例 ID 表达 Tab 选中状态,同类型其他实例不能同时显示为选中。“+”是普通 +按钮,不是 Tab。主侧栏和应用中心不显示工具选中状态或工具徽标。 -徽标优先级为:等待用户处理 > 错误 > 运行中 > 无徽标。同一按钮只显示一个视觉徽标, +徽标优先级为:等待用户处理 > 错误 > 运行中 > 无徽标。同一 Tab 只显示一个视觉徽标, 可访问名称包含完整状态。 -资源监控首期不在后台采样,因此不显示负载告警徽标。只有资源面板是工作栏当前活动实例且 -工作栏已展开时,资源按钮才显示选中状态。 +资源监控首期不在后台采样,因此不显示负载告警徽标。后台事件不自动展开工作栏或切换 Tab。 ### 4.4 资源采样状态 @@ -134,39 +167,68 @@ warming/loading/live/partial/error -> inactive ## 5. 设置保存规则 -应用导航偏好与应用业务启停分开保存。Switch 每次切换立即提交完整目标集合;请求完成前禁用 -三个应用显隐 Switch,下一次操作基于最新确认结果提交,防止并发更新互相覆盖。 +应用导航偏好与业务启停使用独立字段,通过同一应用设置保存链路提交。常驻、排序、启用和 +魔法笔记设置更新串行执行;前一请求确认前,所有入口中会修改这组设置的控件暂不可操作。 +每次只提交本次变更,Main 在最新已保存设置上合并并原子写入;顺序提交完整目标顺序。 +持久化成功后由 Store 发布完整权威快照,应用中心、主导航、当前应用页、会话和所有设置入口同步采用,工具配置写入也走同一通知链路。每次重开中心先刷新并锁定修改;较新的设置事件使在途旧读取及旧保存响应失效,不能覆盖新快照。 保存失败时: -- 主导航和 Switch 恢复最后一次成功保存的偏好。 -- 设置行显示可重试错误。 -- 不回滚或修改各应用的业务状态。 +- 所有界面保留最后一次确认的配置,包括启用、常驻、顺序、徽标和会话入口;不提前运行关闭或恢复副作用。 +- 发起操作的设置行或排序区域显示就地可重试错误,保留焦点及编辑上下文,不重复显示同一错误通知。 +- 若响应中断导致保存结果未知,先重读权威设置再开放修改;不能把本地旧值当成回滚成功,也不自动重发变更。 ## 6. 与需求的对应关系 | 逻辑 | PRD | User Stories | | --- | --- | --- | | 固定入口不变量 | FR-1、FR-2 | US-A1、US-A2 | -| 应用显隐和失败恢复 | FR-3、FR-4、FR-11、FR-12 | US-B1、US-B2、US-B4、US-B5 | -| 工具打开决策表 | FR-5 至 FR-10 | US-C1 至 US-C7 | +| 应用常驻和失败恢复 | FR-3、FR-4、FR-11、FR-12 | US-B1、US-B2、US-B4、US-B5 | +| 应用中心、常驻顺序 | FR-3、FR-4、FR-5、FR-11、FR-12;PRD 第 8 节 | US-B6、US-B7 | +| 可选应用启用恢复、知识库和智能心跳固定可用 | FR-3、FR-4、FR-12;PRD 第 8 节补充要求 | US-B8 | +| 魔法笔记迁移及共同配置 | FR-11、FR-12;PRD 第 8 节补充要求 | US-B9 | +| 工具打开决策表 | FR-6 至 FR-10 | US-C1 至 US-C7 | | 资源采样状态 | FR-9 | US-C6 | | 无障碍与窄窗口 | FR-13 | US-D1、US-D2 | | 活动聚合、完成通知与查看清除 | FR-14 | US-E1、US-E2、US-E3 | +| 后续私有市场与 YAML | FR-15 | US-F1、US-F2 | +| 服务状态、资源可用性、服务生命周期 | FR-16 | US-F3、US-F5;US-F4 入口已移除 | + +稳定 ID 保留原编号。US-B6 为应用中心,US-B7 为顺序,US-B8 为启用联动,US-B9 为笔记迁移; +US-F3 为服务概览,US-F4 为已移除的任务取消入口,US-F5 为服务生命周期。PRD 旧 FR-5 至 FR-10 和 +User Stories 已同步上述入口规则,工具实例行为沿用右侧工作栏契约。 ## 7. 逻辑完整性评估 -首期规则已覆盖固定入口、应用显隐、保存失败、系统工具匹配与显式多实例差异、本机 Home、 -托管 SSH、无活动会话、目录失效、资源部分可用、采样停止、权限边界、键盘和窄窗口。其他 -工具面板内部的取消、超时、 -连接恢复和固定目标失效继续由助手工作栏负责,本功能不复制这些状态机。 +首期覆盖应用中心访问、启用与常驻组合、顺序恢复、默认值与旧值迁移、共同设置、保存失败、 +知识库和智能心跳固定入口、可选应用已打开页面恢复,以及右侧实例选择、本机 Home、托管 SSH、无会话、 +目录失效、资源部分可用与采样停止。工具内部取消、超时、连接恢复及业务后台生命周期由 +相应功能负责,本功能不复制状态机。底部入口打开轻量菜单,“管理应用”才进入与设置相同的整窗 Modal。实现与验证的剩余范围见[实施进度](./progress.md)。 ## 8. 后续产品决策 -- 插件工具上线后,快捷栏允许固定的最大数量及溢出规则。 -- 插件应用是否允许用户排序,以及固定系统入口之间允许的排序范围。 +后续市场 URL、YAML 交换、ShareServer 目录与分发、插件注册及安装不进入首期。其协议、 +扩展身份与安装生命周期由市场功能另行确定;内置应用常驻及排序不依赖这些决策。 -这些决策不影响首期四个系统工具的固定入口和内置应用显隐实现。 +### 8.1 本机推理管理 + +FR-16 独立于市场排期,作为可常驻的管理 Modal。所有打开入口只改变 Modal 打开状态,不改变底层工作区、项目、会话或草稿;关闭时卸载 Modal,服务生命周期独立。US-F3 只有服务列表,展示名称、状态、引擎、模型及错误。共享服务只展示一次;资源按独立服务进程归属,CPU 预热与指标不可用分别给出原因,不填 `0`,不将宿主进程占用分摊给共享线程。采样与单位见[技术设计](./technical-design.md)。ASR 没有 Worker 就绪观测,显示按需运行且状态未知;活动请求不覆盖服务状态。OCR 状态来自 Renderer Worker,向量状态来自 Broker。 + +US-F4 的 Modal 单任务取消入口已移除。后端取消行为保留:Worker 确认或退出前仍计入活动任务和停止影响,即使调用方已收到取消或超时错误;任务先完成则保留真实完成结果,不通过终止共享服务模拟单任务取消。 + +| 服务管理方式 | 可提供操作 | 结果要求(US-F5) | +| --- | --- | --- | +| GoodBuddy 受管子进程 | 引擎已支持的启动、停止、重启 | 共用同一服务实例;操作成功由真实进程和服务就绪状态确认 | +| 外部服务 | 在模型与连接设置中管理 | 不列入本机服务,不推断本机归属 | +| 进程内模型 | 引擎实际支持的加载、释放 | 不显示虚构 PID 或进程启动、停止状态 | + +停止、重启或释放均先打开紧凑的嵌套影响确认,列出任务和影响;无已登记活动任务时说明执行前再次核对。取消确认不改变运行状态。 +确认存在时禁止关闭底层管理 Modal;提交期间两层均不能关闭,重复操作被拒绝。未提交时 Escape 只关闭确认,确认关闭后才可用 Escape 关闭管理 Modal。焦点规则由 [UI 设计](./ui-design.md#91-本机推理管理)定义。 +实际操作失败关闭旧确认、显示错误并刷新快照;刷新期间或失败时禁用服务操作。再次操作重新取得当前任务清单并要求确认,避免重复提交旧清单。 +再次启动不重放已中断任务;关闭管理 Modal、关闭管理应用或取消常驻不停止服务,卸载模型文件为独立操作。 +当前向量服务允许确认影响后停止,并拒绝确认清单未包含的新任务;OCR 仅空闲时允许释放。 +ASR 按请求加载与释放,支持独立取消;TTS 尚无执行服务。具体适配边界以 +[技术清单](./technical-design.md#111-本机推理任务与执行服务)为准。活动请求仅在影响确认中展示,主列表不展示历史。应用退出清理沿用各引擎原有路径。 ## 9. 项目活动汇总 diff --git a/docs/features/application-tool-navigation/navigation-demo.css b/docs/features/application-tool-navigation/navigation-demo.css index 1da67870..05fd1cd9 100644 --- a/docs/features/application-tool-navigation/navigation-demo.css +++ b/docs/features/application-tool-navigation/navigation-demo.css @@ -122,6 +122,27 @@ dialog[data-variant="grid"] #catalog-items { display: grid; grid-template-column .sidebar > * { flex-shrink: 0; }.sidebar .history { flex: 1 1 80px; min-height: 0; }.sidebar .shortcuts { flex-shrink: 1; min-height: 80px; } .sidebar .resident-apps { margin-top: 12px; min-height: 96px; flex-shrink: 1; display: flex; flex-direction: column; max-height: 240px; }.resident-apps .section-label { margin-bottom: 4px; flex-shrink: 0; }#resident-list { overflow: auto; min-height: 0; }.resident-row { display: flex; align-items: center; }.resident-row > button { display: flex; align-items: center; gap: 10px; padding: 8px 10px; flex: 1; min-width: 0; text-align: left; }.resident-row > button span { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }.resident-row [aria-current="page"] { background: var(--accent-subtle); color: var(--accent); }.resident-row[draggable="true"] { cursor: grab; }.resident-row .edit-actions { flex-shrink: 0; }.all-apps { display: flex; justify-content: space-between; padding: 6px 10px; font-size: 11px; color: var(--text-secondary); flex-shrink: 0; }.empty-apps { padding: 8px 10px; font-size: 11px; color: var(--text-secondary); }.app-placement { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 8px; }.app-placement button { font-size: 11px; padding: 6px 8px; }.app-placement button[aria-pressed="true"] { border: 1px solid var(--accent-selected); }.app-catalog-row { align-items: flex-start; }.app-catalog-row > svg { margin-top: 4px; } .sr-only { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); } +.workspace { min-height: 0; } +.workspace-header { flex: 0 0 auto; flex-wrap: wrap; gap: 8px; align-items: center; } +#page-label { overflow-wrap: anywhere; } +.conversation { min-height: 0; overflow: auto; } +.conversation.app-page { justify-content: flex-start; padding: 24px; max-width: 960px; gap: 12px; } +.app-page h1 { font-size: 24px; } +.model-list { width: 100%; } +.model-service { padding: 16px 0; border-bottom: 1px solid var(--border-default); } +.model-service p, .model-service details { color: var(--text-secondary); font-size: 12px; } +.model-actions { display: flex; flex-wrap: wrap; gap: 8px; margin: 8px 0; } +.model-actions button, .inline-confirm button { border: 1px solid var(--border-default); } +.inline-confirm { padding: 12px; margin: 8px 0; background: var(--accent-subtle); border: 1px solid var(--accent-selected); border-radius: var(--radius-control); } +#market-preview { padding: 12px 0; border-bottom: 1px solid var(--border-default); } +#market-preview label { display: block; margin: 8px 0; } +#market-preview textarea, #market-preview select { width: 100%; padding: 8px; font: inherit; background: var(--surface-subtle); color: var(--text-primary); border: 1px solid var(--border-default); border-radius: var(--radius-control); } +#market-preview textarea { resize: vertical; } +#market-preview p, #import-preview { font-size: 12px; overflow-wrap: anywhere; } +#market-preview summary, .model-service summary { cursor: pointer; } +.note-segments, .center-switch, .tool-tabs { flex: 0 0 auto; } +.center-app-info { min-width: 0; overflow-wrap: anywhere; } +dialog, dialog::backdrop { -webkit-app-region: no-drag; } .launcher-trigger { display: flex; align-items: center; gap: 8px; width: 100%; padding: 12px 8px; border: 1px solid var(--border-default); background: var(--surface-raised); margin-bottom: 12px; font-size: 12px; }.launcher-trigger kbd { margin-left: auto; font: 10px var(--font-family-ui); color: var(--text-secondary); white-space: nowrap; } [data-variant="launcher"] .shortcut-list { grid-template-columns: repeat(4, minmax(0, 1fr)); }[data-variant="launcher"] .shortcut-button { flex-direction: column; padding: 8px 0; }[data-variant="launcher"] .icon-tile { height: 24px; }[data-variant="launcher"] .store-link { border-top: 1px solid var(--border-default); border-radius: 0; } [data-variant="favorites"] .section-label { padding-left: 0; }[data-variant="favorites"] .shortcut-list { gap: 0; }[data-variant="favorites"] .shortcut-button { justify-content: flex-start; padding: 8px 12px; }[data-variant="favorites"] .item-name { font-size: 12px; }[data-variant="favorites"] .shortcut-item { display: flex; align-items: center; }[data-variant="favorites"] .edit-actions { margin-left: auto; }[data-variant="favorites"] .store-link { margin-top: 12px; border: 1px dashed var(--border-default); }.count { padding: 0 6px; color: var(--text-secondary); } @@ -130,4 +151,4 @@ dialog[data-variant="grid"] #catalog-items { display: grid; grid-template-column .catalog-pack { padding: 20px 0; border-bottom: 1px solid var(--border-default); }.catalog-pack h3 { margin: 8px 0; font-size: 18px; font-weight: 550; }.pack-art { display: grid; place-items: center; float: right; width: 56px; height: 56px; border: 1px solid var(--accent-selected); background: var(--accent-subtle); color: var(--accent); border-radius: var(--radius-card); }.pack-art svg { width: 28px; height: 28px; }.pack-includes { display: flex; flex-wrap: wrap; gap: 8px; margin: 16px 0; }.pack-includes span { padding: 4px 8px; font-size: 11px; background: var(--surface-subtle); border-radius: var(--radius-control); }.pack-includes svg { width: 14px; height: 14px; }.catalog-pack > button { border: 1px solid var(--accent-selected); color: var(--accent); background: var(--accent-subtle); } dialog[data-mode="launch"] { width: min(640px, calc(100% - 32px)); }dialog[data-mode="launch"] .catalog-row:focus-within { background: var(--accent-subtle); }.catalog-row { padding-left: 8px; padding-right: 8px; } @media (max-width: 1080px) { body { padding: 16px; }.app { position: relative; }.workbar { position: absolute; right: 0; top: 52px; bottom: 0; width: min(320px, 100%); box-shadow: -8px 0 24px var(--border-default); }.lab-header { flex-wrap: wrap; gap: 12px; }.design-note > span:last-child { display: none; }.conversation { padding: 32px 24px; } } -@media (max-width: 640px) { body { padding: 12px; }.lab-header > div:first-child { flex: 1; }.variants { order: 3; width: 100%; }.variants button { flex: 1; padding: 8px 4px; font-size: 12px; }.design-note { align-items: flex-start; gap: 12px; }.app { height: auto; min-height: 0; }.app .sidebar { width: 100%; flex: 0 0 auto; border: 0; padding-top: 12px; }.brand { padding-bottom: 12px; }.app .history { display: none; }.app .workspace { display: flex; min-height: 320px; border-top: 1px solid var(--border-default); }.app .workspace .composer { display: block; }.composer-area { margin: 12px 12px 4px; margin-top: auto; }.composer-toolbar { gap: 2px; }.composer-select select { max-width: 108px; font-size: 11px; }.composer-toolbar button { font-size: 11px; padding: 6px; }.composer-toolbar .composer-icon { width: 28px; }.composer-meta { flex-wrap: wrap; gap: 0; }.shortcut-list { max-height: 300px; overflow: auto; }.lab-footer { align-items: flex-start; }.lab-footer button { white-space: nowrap; }.workbar { top: 0; width: 100%; }.design-note p { font-size: 11px; } } +@media (max-width: 640px) { body { padding: 12px; }.lab-header > div:first-child { flex: 1; }.variants { order: 3; width: 100%; }.variants button { flex: 1; padding: 8px 4px; font-size: 12px; }.design-note { align-items: flex-start; gap: 12px; }.app { height: auto; min-height: 0; }.app .sidebar { width: 100%; flex: 0 0 auto; border: 0; padding-top: 12px; }.brand { padding-bottom: 12px; }.app .history { display: none; }.app .workspace { display: flex; min-height: 320px; border-top: 1px solid var(--border-default); }.app .workspace .conversation { display: flex; overflow: visible; padding: 16px; }.app .workspace .composer { display: block; }.composer-area { margin: 12px 12px 4px; margin-top: auto; }.composer-toolbar { gap: 2px; }.composer-select select { max-width: 108px; font-size: 11px; }.composer-toolbar button { font-size: 11px; padding: 6px; }.composer-toolbar .composer-icon { width: 28px; }.composer-meta { flex-wrap: wrap; gap: 0; }.shortcut-list { max-height: 300px; overflow: auto; }.lab-footer { align-items: flex-start; }.lab-footer button { white-space: nowrap; }.workbar { top: 0; width: 100%; }.design-note p { font-size: 11px; } } diff --git a/docs/features/application-tool-navigation/navigation-demo.html b/docs/features/application-tool-navigation/navigation-demo.html index fa4acee1..12bb067b 100644 --- a/docs/features/application-tool-navigation/navigation-demo.html +++ b/docs/features/application-tool-navigation/navigation-demo.html @@ -16,11 +16,11 @@ - + -