# Changelog ## [Unreleased] ### 变更 - **客户端 UI**: - 移除 `sidebar.footer.action`(左下角「日志」指示灯按钮)挂载——与设置页分区重复,只保留 `settings.section` 单一入口。 - 设置左侧导航标题与面板标题由「日志转发状态」改为「日志转发器」。 - 重排设置分区面板布局:标题状态行 + 全局指标卡片(事件/转发/丢弃/时长)+ 通道状态卡片(按状态着色、含通道专属信息)+ 操作条,离线与空通道有独立空态。 - **通道卡片补充 `target` 输出目标**:WebSocket 显示 `ws://127.0.0.1:`,文件显示路径模板,Loki 显示推送端点;`/channels` 与 `log_forwarder_status` / `log_forwarder_channel_status` 返回值同步带出(output schema 已声明,注册表校验可通过)。 - **新增实时事件预览**:默认折叠为一行「展开实时事件」按钮,点击展开后才订阅 WebSocket 事件流(收起即断开);滚动显示最近 300 条标准事件(类型徽标 + 时间 + 摘要),默认自动滚动跟随,向上滚动自动暂停,点「继续」或「N 条新事件」横幅恢复。 ## [1.0.4] — 2026-09-09 ### 变更 - 端到端验证 tag 触发的自动发布流水线(方案 A:GitHub Actions typecheck/test/build → npm publish → GitHub Release)。 - README(中/英)版本徽章与打包示例文件名同步至 1.0.4。 ### 验证 - 推送 `v1.0.4` tag 后 Actions 全流程通过,npm `dsh-plugin-log-forwarder@1.0.4` 与 GitHub Release `v1.0.4` 自动生成。 ## [1.0.3] — 2026-09-09 ### 变更 - `package.json` 补充 `repository` / `homepage` / `bugs` 元数据(npm 页面回链 GitHub 仓库)。 - README(中/英)版本徽章与打包示例文件名同步至 1.0.3。 ### 验证 - 首个公开版本发布:GitHub Repo(zhaoxuejie/dsh-plugin-log-forwarder)+ Release `v1.0.3` + npm `dsh-plugin-log-forwarder@1.0.3`(dist-tag `latest`)。 ## [1.0.2] — 2026-09-09 ### 修复 - **模型工具输出与声明的 schema 不一致,导致 `log_forwarder_status` / `log_forwarder_channel_status` 在 DSH 运行时报 `invalid output`**: - `log_forwarder_status` 的 output schema 顶层漏声明 `startTime`,且 `channels` 的 item 写成了无任何属性的封闭对象(`additionalProperties: false`)——实际每个通道快照含 `name/enabled/status/stats`(websocket 另含 `clientCount/port`),被运行时校验器逐键拒绝。已在 `src/index.ts` 中补全并收窄为完整可校验声明。 - `log_forwarder_channel_status` 的 schema 缺 websocket 专属字段 `clientCount`/`port`,查询 websocket 通道时同样被拒。已补上。 - 两者现与 `ChannelState` / `WebSocketChannelState` / `PluginState` 真实结构一致,可直接在 DSH 会话中调用。 ### 变更 - `tests/run-tests.mjs`:新增回归用例,用 `@deepseek-ai/dsh-tools` 的 `validateJsonSchemaValue` 对 4 个工具的实际返回值逐一校验(对应运行时注册表输出校验路径)。 - 测试不再写死 `18765` 端口,改为启动时探测空闲端口——避免在宿主已加载本插件(占用 18765)时全部 WS 用例串扰失败。 ### 验证 - `npm run typecheck`、`npm run build` 通过;`npm test` 19/19 通过(新增回归用例含在列)。 ## [1.0.1] — 2026-09-09 对照 DeepSeek Harness 源码(packages/core/session、packages/api/session-controller、packages/client/modules、packages/client/ui-sidebar)做了一轮插件规范审查,修复客户端侧接入的阻断性问题。 ### 修复 - **客户端面板此前完全不可用**(三项阻断性问题): - `src/client/index.tsx` 曾 `import type` 四个本插件并未依赖的包(`@deepseek-ai/dsh-client-ui-renderer|locale|ui-sidebar|ui-slots`),客户端编译必然失败。改为结构子集类型(`src/client/types.ts`),与同生态插件 dsh-plugin-todo-scanner 的类型纪律一致——不 import 任何 `@deepseek-ai` 客户端包。 - 注册的插槽名 `log-forwarder-panel` 在 Harness 中不存在,面板永远不会渲染。改为真实插槽:`sidebar.footer.action`(侧边栏脚部)+ `settings.section`(设置页分区),均经 `slots.inject` 注册。 - `exports["./client"]` 原指向 TSX 源码,浏览器无法执行。改为 tsdown 打包产物 `lib/client.js`(`window.__ModuleLoader__.load({ id: "dsh-plugin-log-forwarder", factory })`,react 为外部平台模块)。 - **补上客户端构建链路**:新增 `tsdown.config.ts`、`tsconfig.client.json`,以及 `build:client` / `typecheck:client` 脚本。 - **包元数据对齐 profile/bundle 机制**:新增 `cordis.patch.yml`(原 `cordis.yml` 内容已完整迁入并删除,避免双份维护);`dsh` 字段改为 `bundle.patch` + `client.platform`;`exports` 补 `./cordis.patch.yml` 与 `./package.json`。 - **补齐隐式依赖**:`@deepseek-ai/dsh-agent` 此前只是 dsh-tools 的 devDependency,干净安装后 `agent/error` 事件类型丢失、`npm run build` 直接失败。已在 `dependencies` 中显式声明。 ### 变更 - 面板改为两种形态共用内容:`footer`(指示灯 + 浮层,侧边栏折叠为 rail 时只显示指示灯)与 `section`(设置页完整面板)。 - 面板词典新增 `panel.noChannels`(未启用任何输出通道)。 ### 验证 - `npm run typecheck`、`npm run typecheck:client`、`npm run build`、`npm run build:client` 全部通过;`npm test` 18/18 通过。 - 已从 desktop profile 环境实加载验证:`import('dsh-plugin-log-forwarder')` 正常导出 `name` / `inject` / `Config` / `apply`;`dsh-plugin-log-forwarder/client` 正确解析到 `lib/client.js`。 ## [1.0.0] — 2026-09-06 首个正式版本。依据 PRD V1.0 完整实现 DeepSeek Harness 实时日志转发插件。 ### 新增 - **事件采集与标准化**:订阅 Harness 真实事件源(`session/created`、`session/event`、`session/disposed`、`session/flush`、`agent/error`),输出统一标准事件 JSON(id/timestamp/sessionId/turnIndex/type/payload)。 - 事件映射(详见 README「标准事件类型」):`session_start` / `user_input` / `turn_start` / `reasoning` / `model_output` / `tool_call` / `tool_result` / `tool_error` / `turn_end` / `session_end` / `error`;未知类型原样透传。 - 采用最小事件形状自解析,不硬依赖 Harness 内部类型(避免版本漂移)。 - **WebSocket 输出通道**:`ws://127.0.0.1:` 多客户端广播;自带状态页(`/`)、`/status`、`/channels`、`POST /pause|/resume|/clear-stats`(全开 CORS);端口占用自动顺延;30s 心跳。 - **本地文件通道**:JSONL 追加;`{sessionId}` 模板多会话分文件 / 单文件聚合;100ms×50 行批量落盘 + `session/flush` 强制冲刷;`maxFileSizeBytes` 上限;系统关键目录路径守卫。 - **Loki 输出通道**:`/loki/api/v1/push` 批量推送(100 条 / 200ms);标签 `session_id`/`event_type`/`turn_index`/`source`;租户与 Token 认证;指数退避重试;内存缓冲(默认 1000,溢出丢最旧);连续失败断连 + 手动恢复;卸载限时冲刷。 - **流水线**:采集 → 标准化 → 脱敏(递归、大小写不敏感、子树整体替换、循环引用哨兵)→ 过滤(include 白名单优先)→ 多通道分发。 - **暂停 / 恢复 / 清空统计**:全局控制,WS Server 保持运行;恢复时联动恢复断连通道。 - **模型工具 ×4**:`log_forwarder_status` / `log_forwarder_pause` / `log_forwarder_resume` / `log_forwarder_channel_status`。 - **状态通知**:宿主侧每秒 emit `log-forwarder/status`(PluginState 快照)。 - **客户端侧边面板**:`src/client/` TSX 模块(侧边栏脚部操作 + 状态面板:通道卡片/统计/暂停恢复清空),默认轮询插件 HTTP 端点零接入可用,支持 remotes 事件推送增强。 - **独立验证脚本**:`tests/run-tests.mjs`,18 项用例全部通过(PRD §7 全用例 + 单元用例)。 ### 修复 - 无(首个版本)。 ### 变更 - 无(首个版本)。 ### 已知限制 - `maxFileSizeBytes` 超限后停止写入,V1.0 不做自动切割轮转。 - Loki 通道连续失败进入 `disconnected` 后需手动恢复(工具/面板按钮)。 - 事件类型映射基于 PRD 逻辑事件名的语义等价实现:PRD 中的 `turn:before/turn:after/user:message/tool:before/tool:after/plugin:unload` 在 Harness 中不存在同名事件,已映射到真实事件源;`plugin:unload` 由 cordis disposer 承担。详见 README。