<div id="web-ui"></div>

重启或刷新应用后，打开会话会显示最新消息。同一次运行中，离开不足一小时后返回会话，恢复阅读状态：之前在底部则继续跟随最新消息和延迟排版，之前上翻阅读历史则恢复阅读位置。离开满一小时后返回，或应用失去焦点满一小时后重新激活，则显示最新消息。正在阅读时不会因为计时而自动跳动，上翻操作会取消跟随。已加载的文件修改摘要在返回会话时直接显示，文件历史操作仍检查当前状态。

会话菜单中的 **Copy link（复制链接）** 复制所选会话的地址。桌面 App 使用系统剪贴板，浏览器使用剪贴板 API 并提供选择复制作为备用方式；复制成功后才显示成功提示。

选中聊天消息中的文字后点击**引用到聊天**，或在消息操作栏点击**引用消息**。引用追加到当前消息所属会话的草稿，不会自动发送；分屏中的两个会话分别使用自己的输入框。点击用户消息的**编辑消息**，可以修改文字和链接、移除原附件，以及选择、粘贴或拖入图片和文件，也支持 `@` 文件引用。**保存并重新发送**会创建新分支，原消息仍然保留。Cmd/Ctrl+Enter 保存，Escape 取消；保存失败时保留编辑内容和附件，可直接重试。

# 网页界面

网页小窗固定使用 1920 × 1080 CSS 像素的页面视口。调整小窗大小只改变显示比例，未使用的区域留白，网页布局和 Agent 操作坐标保持不变。打开为完整标签页后恢复正常窗口尺寸和原有页面缩放。 小窗隐藏页面最外层的滚动条轨道，仍可使用滚轮和键盘滚动；打开完整标签页后恢复原有滚动条。移动小窗位置不会重新设置网页缩放。

在会话的 ⋯ 菜单中选择 **自动命名（Auto rename）**，即可让配置的默认模型根据会话内容生成名称。**重命名（Rename）** 仍可手动输入名称。生成期间显示原名称；生成失败时保留原名称并显示提示。用户明确选择的名称不会被后台自动命名覆盖。聊天区域的会话菜单也提供同一入口。该操作不会发送聊天消息或调用工具。

每个标签独立保存后退和前进历史，默认入口页是该标签的初始页面。后退和前进通常恢复当前标签中的页面，切换标签不增加历史。非会话页面可以从不同入口页分别打开。后退后选择新目的地，只替换当前标签的前进记录。历史随标签保存；网页内部的 URL 导航由浏览器控件处理。

桌面 App 的网页悬浮预览显示同一个实时页面，可以直接点击、滚动和输入。拖动标题栏移动窗口，拖动边缘调整大小；按住鼠标期间，当前画面随窗口移动或缩放；松开后恢复页面实时显示和交互。点击打开页面将同一页面显示为完整标签，隐藏预览会将页面保留在 Resources 中。普通浏览器使用独立的 sandboxed iframe 嵌入页面，网站可能禁止嵌入，且它不共享桌面 Page 的状态；需要时使用打开页面。

**操作历史**在桌面 App 和浏览器中都通过当前页面的菜单显示。聚焦按钮后按 Enter 或空格打开；Escape 关闭菜单，并将焦点返回按钮。

打开当前窗口已经显示的会话时，直接选中已有标签，从入口页或另一会话打开时也如此。目标尚未打开时，复用当前会话标签或入口页。后退和前进的目标会话若已打开，也会选中已有标签，并保留来源标签的历史。唯一性按会话 ID 判断，同名会话不会合并。重新加载旧的重复标签时，保留当前激活的一份；没有激活项则保留第一份，并保留它的历史和分组，移除其他重复标签。草稿输入和后台更新的标题在导航和重新加载后保留，已删除会话会从全部历史中移除。

在 Files 或文件标签页中，后退和前进会依次返回当前项目中浏览过的文件夹与文件。返回 Files 时恢复文件夹展开状态和滚动位置；后退后打开新位置会替换原有前进记录。文件位置属于当前标签保存的页面历史，与文档版本 History 分开。目录列表快照失效时，重新读取已加载范围期间保留已有文件行。

PDF 文件支持连续阅读、页码跳转、缩略图、文档目录、适合宽度或页面的缩放、正文选字、搜索高亮和下载原文件。复制选中文字时默认清除排版换行，保留段落分隔和正常连字符；关闭该选项可保留原换行。项目中的文件支持高亮和文字批注，并通过文档保存与 History 写入标准 PDF 批注。附件与历史版本保持只读。PDF 解码器随程序本地安装，兼容 App 内置运行时；打开 PDF 不会将文件上传至外部查看器。预览文件大小上限为 64 MiB。

项目菜单还支持在系统文件管理器中显示文件夹、创建持久 Git worktree、归档该项目聊天，以及移除侧边栏项目入口。Worktree 从当前提交创建新分支，使用源 Git 仓库外的新绝对路径；未提交改动保留在原目录。移除项目保留文件、聊天及项目归属，可在项目页面恢复或重新打开文件夹。默认主目录项目不可移除。已归档聊天可通过“已归档”筛选查看；隐藏项目的聊天仍保留在日期或平铺历史中。

项目目录或额外工作目录位于 Git 仓库中时，输入框里该目录的胶囊会多出一个 git 半边，显示分支，以及用绿红小块表示的未提交行数。这一行放不下时，名字先截短，再收起分支名，最后小块变成左绿右红的圆点。它的菜单可以在 Review 中打开这些修改、切换或新建分支，以及把目录换到另一个 worktree 或在仓库旁新建的 worktree。已开始会话的主目录是固定的，在那里选的 worktree 会作为额外工作目录加入。**创建 PR** 会推送分支并执行 `gh pr create --fill`，需要已登录的 GitHub CLI，且当前不在默认分支。有未提交修改时，**让 agent 提交并创建 PR** 会把一段指令填进输入框，但不发送。同一仓库里的多个目录只显示一个 git 半边。

右键项目或点击省略号，可以打开项目设置、新建聊天、置顶、编辑或移动到自定义分区。项目编辑窗口支持修改显示名称、文字图标或表情、说明和额外源文件夹。源文件夹用于尚未单独设置目录的会话；移除文件夹不会删除文件。主目录移动仍在项目设置中操作。分区菜单可重命名或移除分区；移除分区会保留其项目。

项目排序与聊天排序相互独立。在侧边栏筛选菜单中，可以将项目按最近活动、最早活动、名称或手动顺序排列。新消息会自动更新项目活动时间。点击项目的置顶按钮，可以让该项目保持在未置顶项目上方。聊天可按旧到新、新到旧排列，标题也支持 A–Z 和 Z–A。拖动项目会切换为手动排序。这些显示偏好保存在本地。

在侧边栏选择 **分组 → 项目** 后，可以拖动项目标题，将它移到另一项目的上方或下方；插入线显示目标位置。也可以聚焦项目标题后按 Alt+上方向键或 Alt+下方向键。顺序保存在当前设备，刷新后仍然保留；会话的项目归属不变。正在运行的会话只在当前选中行保留彩色扫光；其他正在运行、但未选中的会话只显示标题左侧的三个闪动点。等待你输入的会话显示黄色圆点，置顶会话也遵循这一规则。

工具审批行为及运行中切换请参见[工具权限模式](../capabilities/permissions.zh.md)。

浏览器界面，覆盖 OpenProgram 的全部日常操作：聊天、管理函数与程序、配置 provider 和 MCP、查看记忆与项目。本页按路由逐个说明每个页面的用途，并详细介绍聊天页。

启动：

```bash
openprogram web
```

浏览器打开 `http://localhost:18100`。页面是由本地 FastAPI worker 直接提供的静态导出——`/api`、`/ws` 和 UI 都在同一个端口（默认 18100）。数据全部来自 worker，会话与终端 TUI、CLI 单发共用，见[界面总览](README.zh.md)。改端口用 `openprogram ports --port`。

![聊天页](../images/chat_hero.png)

### 文件操作

复制和剪切会记录来源项目，只能在来源项目内粘贴。切回来源项目后可继续粘贴。刷新文件列表会重新执行当前文件搜索。

删除文件或文件夹会将其移入 OpenProgram 的可恢复存储。运行 `openprogram trash list` 查找记录，再运行 `openprogram trash restore <entry_id>` 恢复。恢复操作不会覆盖已存在的路径。删除或重命名符号链接只操作链接本身，不操作它指向的目标。

文本文件存在未保存修改时，删除前会询问保存、导出或丢弃。导出会启动浏览器下载，并继续保留本地草稿，因为浏览器不会确认下载完成。恢复文件后重新打开，可恢复保留的草稿。


## 聊天页（/chat、/s/&lt;session-id&gt;）

`/chat` 是聊天主界面；`/s/<session-id>` 是单个会话的直达链接，切换会话不重新加载页面，WebSocket 连接保持不断。

### 消息流式

消息写入连接后，文字立即显示在对话中，本次提交的输入框文字随即清空。服务端确认接收前，消息保留待确认状态；确认后更新同一条消息。随后显示回复占位，text、thinking、工具调用等块通过 WebSocket 按到达顺序增量渲染。多个 agent 写入同一会话时，每条回复消息都带有产出它的 agent 的头像和名字。

### 运行期间发送消息

运行期间，发送时按的键决定消息去处。按**回车**或发送按钮是 steer：消息插入当前轮。按 **Cmd+回车**（Windows 和 Linux 上为 Ctrl+回车）是排队：排队消息按顺序保存，前一轮完成后再开始下一轮。Steer 和排队消息的“插入当前轮”操作会立即结束正在生成的回复（文本、思考，或仍在写参数的工具调用），保留已生成的文本和思考，并在同一轮中根据补充指令继续。仍在写参数的工具调用会被丢弃，不会执行。已开始运行的工具和结构化输出在下一个安全点接收指令，已开始的工具不会被取消。补充指令不修改模型、工具或权限设置。在设置中关闭 **Steer interrupts the current response**（`execution.instant_steer`）后，补充指令会等当前回复结束再生效。停止执行仍是输入框中的独立操作。因停止而取消的待补充消息保留为未发送草稿，明确重试或编辑后才发送，不自动启动下一轮。已生成的部分回复在停止和刷新后仍保留在会话记录中。

补充消息被接收后，显示在此前与此后的回复内容之间。查询发送结果时保持同一条等待提示，不反复切换发送状态。没有保存分界的旧历史记录将补充消息显示在所属回复前。


无法追加到当前轮时，消息保留在队列。如果无法确认投递结果，消息行继续显示，重试使用同一条命令以避免重复投递，不会自动作为新一轮再次发送。补充指令最多支持 4,096 个字符，更长的消息保留排队。普通未发送队列存放在当前窗口内存中，重新加载页面会丢失。浏览器允许 session storage 时，待处理和发送结果未确认的文字 steer 命令在当前窗口刷新后恢复，并使用原命令继续确认。因停止而保留的 steer 草稿也会恢复。版本重试始终绑定原执行；如果已经开始另一轮，补充消息保留为未发送状态，直到明确重试或编辑。带附件的消息也可以排队，等待正常轮次发送，不能通过纯文字补充接口注入。排队消息集中显示在输入框上方的一张卡片里。标题显示排队条数和其中正在插入当前轮的条数，点击可折叠卡片。每条消息占一行并带标签：插入中为“插入当前轮”，等待中为“下一轮”，失败后为“未发送”或“待确认”。悬停一行可看到时间和操作。点击正文展开完整消息和附件，再点击附件卡片即可预览。“全部清除”移除所有排队消息，正在投递或编辑的除外。编辑排队消息时可以修改文字、添加文件和移除附件；保存保留原队列位置，取消保留原内容。编辑期间暂停该条消息发送。移除只撤回选中的排队消息。正在投递或等待确认的消息不可编辑或移除。本地文档附件使用与项目文件相同的只读预览。

### 停止与重新连接

历史读取失败时会显示重试按钮，并保留已经显示的消息。连接恢复后重新读取可见会话。历史请求在 15 秒后超时；重试读取不会重新发送消息或重新运行函数。迟到的读取响应不能替换更新的请求，也不能清除实时进度。

如果历史快照与阅读位置都已失效，自动翻页会停止。“重试历史加载”不再使用失效游标，重新读取当前位置；“查看最新历史”则明确打开最新历史窗口。

重新连接后，先加载当前会话，再恢复保存的执行状态。后台恢复只读取简要的执行快照，一次处理一个请求，不会因为恢复已结束的执行而反复重载聊天内容。遗漏的实时更新通过当前执行状态补齐。查看历史不会恢复执行或重新运行任务。

点击输入框中的 **Cancel execution** 停止当前执行。刷新或重新打开会话时，会恢复正在执行的任务及其停止控制，包括审批等待后恢复的执行。没有新输出不代表执行已经结束；系统不会仅因一段时间没有输出就移除运行状态。已经结束的执行不会因为残留的线程注册继续显示为运行中。

回复生成期间，思考、已有正文和工具步骤会持续保存，刷新后可以恢复。回复失败时，已有过程与错误提示同时保留；手动停止也会保留已经收到的过程。

本地 shell 命令会先结束其进程组，再报告取消。恢复执行的会话会将原助手消息持久化为已取消，并将会话恢复为空闲，刷新后仍保持停止状态。

等待首段回复时，原有“思考中…”提示使用新版双环加载标识。执行摘要、函数步骤和回复正文不额外添加双环。颜色跟随主题，减少动态效果设置下显示静态图形。

### thinking 折叠

模型的思考过程渲染为可折叠块，默认收起，流式期间只显示最新一行，点击展开完整内容。

### 函数调用时间线

每轮回复中的函数 / 工具调用渲染成一条可展开的执行时间线：每步一行，函数调用带参数、输出、错误和耗时，嵌套调用按上下文树递归展示，子 agent 也是时间线中的一步。点击某一步会在右侧栏打开执行详情面板。从 `/programs` 页 Run 对话框手动运行的函数也用同一套时间线渲染。回复完成后保留流式时间线；缺少有序内容块的旧记录也使用相同折叠组件，不再显示独立的工具调用表格。

### 附件

可以粘贴截图、拖入文件，也可以通过输入框菜单选择文件。图片和文件按添加顺序紧凑排列，每项显示名称、格式和大小。点击附件查看预览或详情，点击 × 移除。

输入框会边输入边显示 Markdown 格式：粗体、斜体、删除线、`行内代码`、链接、标题、引用、列表和代码块直接显示为对应样式，标记符号只在光标靠近时才出现。发送的仍是原始 Markdown。粘贴超过 2,000 个字符时，输入框里插入一个 **Pasted · N lines** 标签，而不是整段文字；悬停可预览内容，按一次退格整块删除。输入完成的 `@路径` 引用同样显示为标签。模型收到的是完整的粘贴内容；发送后的消息里，粘贴部分折叠成同样的标签，点击即可展开。标签显示为 **lost** 表示粘贴内容已丢失，发送前请删除后重新粘贴。

图片直接提供给支持看图的模型，同时在聊天中保存原图副本。应用接受最多 32 MiB 的原图，发送版本过大时等比缩小到不超过 5 MiB。所选模型不支持看图时会明确报错，不会悄悄忽略图片。

桌面 App 中的文本、代码、数据、PDF 和 Office 文件引用原路径，由助手根据任务调用工具读取，不自动把文件正文加入提示词。拖入文件夹时只提供第一层目录，最多 200 项或 8 KiB，不扫描子文件夹。浏览器选入且没有原路径的文件由后端保存，再引用保存位置。

读取完成的草稿附件随所属聊天保留，刷新后可以恢复。发送后只在后端确认接收时清除本次提交的项目。读取失败或发送被拒绝时，文字和附件继续保留。如果连接在确认前断开，应用不会自动重新发送。

### 无头或远程 Linux 上的项目目录

Project 文件夹和额外工作目录都指向运行 worker 的机器上的路径。通常
OpenProgram 会打开这台机器的原生文件夹选择器；如果 Linux 没有 X11 或
Wayland display（例如通过 SSH 使用服务器），Web UI 会改为显示服务器路径
输入框。填写 `/srv/projects/example` 这样的绝对路径后，worker 会先确认目录
存在再使用。原生选择器可用时，用户点取消仍然只是取消，不会误弹手工输入框。

### 会话分支与 DAG 视图

会话历史按 DAG 存储，不是扁平列表：

- 顶栏的分支菜单列出当前会话的所有分支，可切换（checkout）、重命名、删除。
- 右侧栏的 History 视图是会话的实时 mini-DAG：每条消息或函数调用一个节点，按分支着色，merge 和 attach 操作也以节点形式出现。单击节点折叠 / 展开其子树（或把聊天滚动到该步），双击节点或边即切换（checkout）到那条分支。
- mini-DAG 上方的 Branches 面板列出各分支，运行中的分支带运行标记；支持多选合并——平等合并出新分支尖端，或就地合并进选定的基准分支——也支持把另一个会话的分支挂接进来（跨会话 attach）。
- 同一条消息的多个版本用 `< N/M >` 切换器切换，只移动显示位置，不删除历史。

### 回滚

每条消息的操作菜单里有 "Rewind to here"：把会话真正回退到该消息处，被撤销的用户输入会预填回输入框，可修改后重发。输入框斜杠命令 `/rewind` 是同一功能。

网页小窗铺满紧凑标题栏下方的区域，外轮廓采用 10px 圆角，不保留外框或左右、底部留白。拖动标题栏可移动小窗，拖动边缘或扩大的角部区域可调整大小。只有鼠标悬停的角显示弧形提示；移动或缩放时，其他角仍不显示提示。



## 其他页面

| 路由 | 用途 |
|---|---|
| `/agents` | Agents：创建、配置 Agent（模型、能力、记忆、上下文），并用它开始对话 |
| `/applications` | 应用：从本地文件夹安装软件，然后打开、启用、在新标签页隐藏、更新或卸载 |
| `/scheduler` | 定时任务：一次性、周期和监控任务，按类型筛选；可暂停、恢复或删除每个任务 |
| `/chats` | History 枢纽：会话列表（`/history` 同页）；Projects 和 Memory 是同一页上的 tab |
| `/programs` | Abilities 枢纽：Programs 目录（调用树 / 图）。Plugins、Skills、MCP 是旁边的 tab |
| `/skills` | Abilities → Skills：浏览已装 SKILL.md、发现和新建；每个 skill 有详情页 |
| `/plugins` | Abilities → Plugins：已安装 / 发现（市场）/ 问题 |
| `/mcp` | Abilities → MCP：从目录添加、编辑配置、查看状态 |
| `/memory` | History → Memory：wiki、journal 和核心记忆 |
| `/projects` | History → Projects：权限规则、默认设置、关联会话 |
| `/settings` | 设置：providers（模型与凭据）、search、general（含主题、运行版本，以及存在 Electron bridge 时的 Desktop 更新状态）、system、usage、auth、channels |

`/settings` 直接打开会跳到 `/settings/general`。模型凭据仍在 `/settings/providers`，见[配置模型](../models/README.zh.md)。

窗口较窄（宽度不超过 900px）时，左侧栏默认收起为图标栏，直到你展开它；展开后导航到其他页面会再次收起。宽度低于 760px 时，设置导航同样默认显示为图标栏，窗口缩小到该宽度时也会自动收起。你手动展开或收起侧栏的选择会被保留。

### 标签拖动外观

设置 → General 的“标签拖动外观”同时控制标签栏内外的标签拖动外观，以及分屏标题的悬浮预览。透明度可调为 0–100%，背景模糊可调为 0–40px，阴影强度可调为 0–100%。修改即时生效，设置预览与实际拖动标签共用这些数值。默认透明度 20%、模糊 16px、阴影强度 25%。“恢复默认”只重置这三个选项，不改变主题或其他偏好。

偏好保存在本浏览器，并同步到同源窗口。重新加载或切换明暗主题后保留数值。透明度 0% 为不透明；模糊 0px 和阴影 0% 分别关闭对应效果。这些选项不改变普通按钮或 Resources 拖放目标的描边。

### 会话运行记录

“运行记录”合并原来的 Running 和 Debugger。只有当前标签、可见页面路径和聊天状态指向同一会话时，才显示该会话的记录；新标签页、尚未发送的草稿及非会话页面显示空提示，不残留上一个会话的数据。从 Abilities 打开 Program 会进入草稿标签，仅打开参数表单不会产生执行历史。Activity 按会话分支计数，不按消息或执行次数计数。同一分支连续发送消息始终保留一个条目；真正分叉后才分别显示。选择分支可查看各轮执行、调用的子 Agent 及托管后台程序。程序列在启动它的执行下。子 Agent 可以使用独立执行会话；列表只纳入明确关联的执行及其后代，不会混入目标会话的其他任务。

“需要处理”显示暂停任务和待确认结果。“正在进行”显示运行任务，以及仍有程序运行的已结束 Agent。“历史记录”默认折叠，按已结束的会话分支计数。点击分支可查看各轮执行，再查看所属子 Agent、程序和执行详情。分支行显示分支名或编号及请求摘要，执行时间保留在详情中；较长的请求摘要可在详情中展开。程序名称显示可识别的脚本文件、Python 模块或包脚本，并保留所属执行内的编号。内联代码标记为代码片段；无法可靠识别的命令保留可执行文件名。程序详情始终保留完整原始命令。Agent 结束不会删除所属程序。刷新页面或重启本地 worker 后，托管程序的记录和输出仍保留。历史上从未记录的程序无法追溯恢复或推测归属。 已结束且仅缺失模型响应回执的执行归入历史，标注“已结束 · 响应记录不完整”，不要求用户确认；执行者已结束但取消命令仍未完成时也适用。若没有活动子执行，这类历史记录不再显示取消按钮。真实问题、审批、结果未知的工具操作和活动子任务仍然保留。

选择 Agent 后查看进展并使用已有执行控制。暂停、继续、单步和重试仅在执行确实支持时提供。“补充指令”和“创建分支”使用统一编辑弹窗。已发布指令保持只读；“编辑为新草稿”创建需要独立校验的修订，不改写已发布版本。需要回答的问题和授权请求优先于进展记录显示。内部 ID、修订信息、资源快照、操作计数、保存点和原始事件放在“技术详情”中。结果待确认表示执行受阻，不是持续生成。没有活动 attempt 时，输入框允许发送新消息，刷新后不会恢复取消按钮；活动面板继续保留待确认结果及其操作限制。快照读取成功也不代表 Agent 正在运行。

History 的数量表示已结束的会话分支数。分支状态随最新执行更新，真实等待和仍在运行的程序仍会显示；旧轮次只保留在分支详情中，不增加 History 数量。暂时无法确认所属分支的记录单独显示，不计入分支数量。

选择程序后查看命令、工作目录、运行环境、开始与结束时间、退出码和输出。“停止程序”只控制该程序的受管进程组，包括普通后台子进程，不影响其他程序。输出有容量限制；发生截断时明确提示，程序记录仍然保留。Activity 根据执行和 Job 事件自动更新，打开面板、恢复连接或页面恢复可见时也会自动读取，没有手动刷新按钮。执行快照每 30 秒补充检查一次；托管程序尚无专用事件流，因此页面可见时每 3 秒检查程序状态和输出。首次读取失败显示加载错误，不声称已有旧记录。未关联 Agent 的程序仍然显示，且不会同时提示没有运行记录。读取失败时保留上次记录、所选程序详情和输出，并提示状态可能过时。切换所选程序时清空旧详情；成功刷新的列表已不包含该程序时也会清空。

长时间运行的程序通过 `process` 工具的 `start` 操作启动，归属来自可信执行与会话上下文。独立监督进程在 worker 重启后继续保留输出和控制；普通 shell 后台子进程仍属该进程组。刻意脱离进程组的程序，或未通过框架进程管理启动的程序，不宣称已被监控。

从保存点创建 Agent 分支时，在“按新指令创建分支”输入指令，然后准备、检查、确认并发布修订。创建分支后选中独立的暂停子执行，点击继续后使用已发布指令。原执行的消息和保存点不变。修改未发布指令会生成新草稿版本，旧校验和审批失效。仅补充指令的修订保留程序与运行契约；修改程序、工具、模型或输出契约仍要求独立审批。

重试在保存点创建独立、暂停的 Agent 执行并保留原修订，点击继续后恢复。

## 管理项目文件

Files 顶部依次为路径行、操作行、按需展开的搜索行和列标题。列顺序为名称、大小、修改时间和类型。窄侧边栏默认显示名称和大小，横向滚动可查看其他列；宽视图完整显示四列。纵向滚动时列标题保持可见。点击列标题排序，再次点击切换升降序；搜索结果保持相关度排序。点击路径分段可以在项目树中定位对应目录。操作行提供搜索、新建文件、新建文件夹、刷新、排序与显示、查看详细信息。每个目录可以按名称、修改时间、大小或类型排列，选择升降序、文件夹优先，以及是否显示隐藏项和 Git 忽略项。设置按项目保存在本地，侧边栏和中央 Files 共用。搜索仍按相关度排列。

工具栏和文件右键菜单均可打开详细信息，查看路径、文件字节数、时间和只读权限。没有缓存结果的可见文件夹通过有限队列统计大小。已结束的统计保存在本地 profile，重新打开 Files 或重启 App 后直接复用，包含有跳过条目的不完整结果。重新打开视图或详细信息不会重新扫描已有缓存。使用刷新或重新计算更新目录总大小；通过 Files 修改文件也会使共用统计失效。目录行显示完整统计或缓存估值，`≥` 表示部分结果；详情提供统计时间、跳过条目数以及继续、取消、重新计算。统计累计文件逻辑字节数，包含隐藏文件，跳过符号链接、受限目录和不可读条目。结果是在一段时间内取得的样本，不是原子快照或磁盘分配量，缓存可能过期。近期完整统计参与大小排序；计算完成后刷新可以重新排列，未知大小和部分统计排在同组末尾。

路径使用较大字号，最右侧按钮复制完整绝对路径。刷新保留选中路径、展开目录和已加载分页范围。普通文件行显示可读大小（包括空文件）；长文件名在剩余空间内缩略，大小保持完整宽度，悬停大小可查看准确字节数。

侧边栏只显示有未归档对话的项目。空项目仍可在项目选择器和项目管理界面找到。

对话历史存放在 OpenProgram 状态目录中，按稳定的项目 ID 分组。登记项目时，会在 `<project>/.openprogram/project.json` 写入小型标识文件。移动文件夹（包括跨磁盘移动）时应保留这个隐藏目录。启动或访问项目时，OpenProgram 在已知项目的父目录内查找标识，最多检查三级目录、4,000 个条目，不扫描整个磁盘，也不依赖操作系统书签。

如果新位置不在查找范围内，重新打开一次新目录即可关联原项目及对话。原目录仍可用时，打开副本会创建独立项目。发现多个副本时需要“定位文件夹”。旧项目的身份无法核实时，也需要定位一次。登记和定位时应允许写入标识文件；文件损坏或无法读取会明确报错，不会静默改变身份。

工作目录不可用时仍可阅读历史，该项目的新任务等到位置恢复有效后才会启动。另一个占用相同路径的目录不会继承原来的对话。原目录删除后仅剩一个副本时，按移动处理。

按下顶部标签只高亮，未拖动时松开才切换页面；拖动期间保留当前页面。拖出标签栏后松开可使用现有新窗口分离功能，拖出标签栏时，标签在页面上方跟随鼠标显示，原位置隐藏；拖回标签栏或结束拖动后恢复。要把已打开的网页加入会话，先保持该会话显示，再把网页标签拖到 **Resources** 入口或其展开内容区，松开即绑定原页面。顶部标签和原有关联保留，绑定失败不会改变页面。

长会话先加载一小页最近记录，向上滚动时继续读取历史。Activity 初始只读取任务列表，选中任务后才读取执行事件和调试详情。短暂的状态刷新失败会自动重试；重试较久时显示普通状态提示，持续无法读取且没有已保存记录时才显示错误。

Activity 同时显示尚未返回的函数调用，包括等待结束的前台 shell 命令。展开函数可查看命令和开始时间。活动的后台进程直接显示在“运行中的程序”中，启动工具返回后仍可查看输出和停止进程。

悬浮预览限制在所属会话窗格内，启动恢复布局和调整分屏尺寸后会重新定位，标题栏与缩放控件不会进入相邻原生网页区域。

多个会话同时分屏显示时，点击或聚焦某个会话，右侧 Files、Activity 和 Resources 会切换到该会话。项目请求和延迟返回的结果按会话区分，不依赖主路由是否已切换到该窗格。

拖动分屏顶部的三个点时，鼠标旁显示包含图标和标题的完整标签按钮；三个点本身不跟随移动。

### 输出文件预览

完成的回复会为本地文件链接和返回的附件显示“打开预览”卡片。当前会话的新回复会将第一个支持预览的输出文件显示在聊天旁边。重新打开历史记录或收到后台会话回复时不会自动打开文件。已有分屏布局和预览中的未保存编辑会保留；点击卡片可主动打开文件。会话项目内的文件使用项目编辑器，其他获准访问的附件以只读方式打开。

可见的预览会检查磁盘变化，在源文件被修改或重新生成后显示“文件已修改”。点击“刷新”加载最新内容。读取失败时保留之前的预览，未保存编辑也会保留，直到保存或主动放弃。已完成的 Goal 会在回复下方显示紧凑状态及实际记录的活动时长；点击状态可查看原始 Goal 详情。

同一项目文件的标签共享编辑器和草稿。关闭一个标签后，其他标签仍可使用。如果同一文件在两栏中同时可见，可点击“在此显示”将编辑器移到这一栏。

关闭已关联会话的网页标签，只隐藏显示入口；同一个页面及其导航状态继续保留在 **Resources**，包括手动打开后关联到会话的页面。通过“在标签中打开”可重新打开同一个页面；在 Resources 点击“关闭网页”才会真正关闭。没有关联任何会话的独立网页，关闭标签时仍会真正关闭。


回复失败时，已生成的正文和函数记录会保留，失败提示显示在该回复末尾。展开**错误详情**可查看原始报错；刷新对话后仍可查看提示和详情。
