# dsh-terminal-tabs [English](README.md) | 中文 把模型运行的命令行——**后台的和前台的都算**——变成对话界面里看得见、点得关的东西:在 Web GUI 的「对话 / 轨迹」标签行右侧贡献一个**「命令行」视图标签**,标签文案实时反映当前会话存活的后台任务数量(`命令行1`、`命令行×3`);点击进入管理页,每条命令一行: - **中文功能标题**:本地启发式词典从命令推断用途(cd → 打开文件夹、git status → 查看 Git 状态、Start-Sleep → 等待、npm run dev → 启动开发服务……),子代理显示「子代理任务」;无法识别时回退「执行命令」,原始命令始终完整可见 - **前台命令也计入**:模型通过 `pwsh`/`bash` 工具前台执行的命令(瞬时完成、从不进入 jobs 注册表)同样会被宿主半捕获——包装 `ctx.shell.run()`,按发起会话归属,经 `/dsh-terminal-tabs/foreground` 路由下发。运行中的行绿灯脉动并逐秒计时;已完成的显示退出码与耗时,命令下方 chevron 可展开捕获的输出尾。与后台任务分行合并展示 - **可折叠命令正文**:默认一行省略,行尾 ▼ 图标点击展开完整命令并变为 ▲,再点收起 - **实时输出流**(展开时):每 0.3 秒泵送的进程输出副本驱动一个深色滚动框,自动吸附最新约 10 行;鼠标滚轮上翻即可回看历史,滚回底部恢复跟随。模型侧的读取游标字节级不受影响(tee 是唯一消费者,按"自上次读取以来"的契约向模型补发积压) - **时间与时长**:标题右侧显示开始时钟(HH:MM:SS)与持续时长(秒 → 分秒 → 时分),逐秒跳动 - **一键关闭**:行内「关闭」按钮经宿主路由终止对应进程,注册表所有权围栏原样生效 后台子代理(subagent)一并计入,紫色圆点区分。 ## 功能 - **真标签页**:通过官方 `conversation.view` 座位注册,与「对话」「轨迹」同源同权;切换、选中态由框架管理。 - **实时可见**:后台任务数据来自宿主推送的 `jobsBySession` 镜像;标签文案在每次投影时读当前会话镜像,零轮询 RPC。前台命令由页面打开期间轮询 `/dsh-terminal-tabs/foreground`(1.2 秒)合并展示。 - **会话隔离**:标签与列表始终只反映**当前正在查看的会话**;前台命令按发起 agent 归属会话。 - **稳定编号**:页面内按首次出现顺序编号,前面的任务结束不打乱后面行的编号;重新进入页面紧凑重排。 ## 实时输出的实现边界 浏览器展示的输出来自插件在宿主半对 `ctx.shell.start()` 做的实例级包装:每个成功 spawn 的进程被一个私有定时游标持续抽干,增量同时写入每进程环形缓冲(48 KiB 上限,最旧滚出)。模型的 `readOutput` 语义保持不变——包装层是唯一消费者,模型每次读取仍拿到"自它上次读取以来"的全部字节。因此: - 包装挂载**之后**启动的后台任务才有实时输出;更早的任务显示"(暂无输出)" - 持久 PTY 终端会话(`ctx.terminals`)不走此通道,不展示 - 若未来宿主改动 `ShellProcess.readOutput` 的返回形状(当前为 `{ delta }`),包装需同步调整——失效表现仅为看不到输出,不影响关闭等其他功能 - 前台命令走另一条独立的 `ctx.shell.run()` 包装;无发起 agent 归属的运行原样放行。已结束条目保留最近 16 KiB 合并输出 ## 配置(cordis.yml 行 config,均可省略) | 字段 | 默认 | 说明 | |---|---|---| | `routePath` | `/dsh-terminal-tabs/close` | 关闭路由的绝对路径 | | `tailPath` | `/dsh-terminal-tabs/tail` | 输出尾读路由的绝对路径 | | `foregroundPath` | `/dsh-terminal-tabs/foreground` | 前台命令台账路由的绝对路径 | | `includeKinds` | `["bash","pwsh","subagent"]` | 计入展示的任务种类(客户端过滤,宿主侧校验拼写) | ## 安装 ```sh dsh plugin --profile web add github:bbboy31/dsh-terminal-tabs ``` 纯 JavaScript 双平面插件(host 半 `index.js` + 浏览器半 `client.js`),无构建步骤。安装后刷新页面即用。 ## 卸载 ```sh dsh plugin --profile web remove dsh-terminal-tabs ``` 或在 插件市场 → 已安装 → 卸载(两步确认)。卸载会随纤维一并移除路由、标签与样式,无残留。 > 开发提示:Loader 按**包名**缓存已导入模块——改完宿主半后热重载不会生效,需更换包名(如 `-r2`)或重启进程;浏览器半改动刷新页面即生效。 ## 许可 [MIT](LICENSE)