# pilot-harness

> Displays the count of currently active reminders and the most recent trigger time on the Workspace Session floating card, without modifying the Schedule itself.

## Metadata

- Author: [@op7418](https://github.com/op7418)
- Repo: <https://github.com/op7418/pilot-harness.git>
- GitHub: [op7418/pilot-harness](https://github.com/op7418/pilot-harness)
- Stars: 240
- Language: TypeScript
- License: [MIT](https://spdx.org/licenses/MIT.html)
- Topics: `ai-agent`, `codepilot`, `deepseek`, `deepseek-harness`, `desktop-app`, `dsh`, `dsh-plugin`, `electron`, `linux`, `macos`, `typescript`, `windows`
- Forks: 13
- Open Issues: 16
- Last push: 2026-08-20T12:42:53.000Z
- Added: 2026-08-20T00:00:00.000Z

## Install

```bash
dsh plugin --profile web add github:op7418/pilot-harness/packages/schedule/ui-schedule-summary
```

## Wiki

## 一句话定位
在 Workspace 的 Session 悬浮卡片上多显示一行活动提醒摘要，让用户在不打开 Session 的情况下就能看到当前还有几条未触发的提醒以及最近一次什么时候触发。插件本身只读不写，不会改动 Schedule 的提醒数据。

## 核心能力
- 在 Workspace Session 悬浮卡片里追加一行"提醒：N 个 · 时间"
- 通过只读通道读取 Session 持久日志中的活动提醒数量和最近一次触发时间
- 自动避开 Fork 继承：只统计当前 Session 自己的提醒，不展示父 Session 留下的
- 不会唤醒冷 Session，读取操作不会让后台 Session 重新进入运行状态
- 15 秒结果缓存 + 同一 Session 的并发请求合并，避免重复扫描完整日志
- 超过 256 个 Session 时按最近使用顺序淘汰，自动清理过期条目

## 技术实现
- **语言**: TypeScript + React（Host 与 Client 双面）
- **关键依赖**: `@deepseek-ai/dsh-schedule`（折叠 schedule/change 事件流）、`@deepseek-ai/dsh-session-persistence`（inspect 持久日志）、`@deepseek-ai/dsh-client-connection`（loopback RPC 通道）、`@deepseek-ai/dsh-client-ui-workspace`（侧边栏插槽）
- **架构模式**: 双面 Cordis 插件 — Host 端注册只允许 loopback 调用的 `/pilot-schedule-summary` RPC 端点；Client 端在 Workspace 侧边栏插槽 `sidebar.workspaces.session.detail` 注册一个有序条目
- **入口文件**: `packages/schedule/ui-schedule-summary/src/index.ts`（Host）、`packages/schedule/ui-schedule-summary/src/client/index.ts`（Client）

## 适用场景
如果你日常在 Pilot Harness Web 或 Workspace 里通过悬浮卡片浏览大量 Session，需要快速判断某个 Session 是不是还在进行定时提醒、什么时候会触发下一个，又不希望打开 Session 详情去看，这个插件就能在悬浮卡片里直接告诉你。它不会替你管理提醒，也不会影响其他插件对 Schedule 的控制，只是一种"看见状态"的辅助。

## 前置依赖与兼容性
| 依赖 | 最低版本 | 说明 |
|---|---|---|
| DSH | 0.1.0-rc.7 | 工作区 workspace 依赖；宿主需能公开 `sidebar.workspaces.session.detail` 插槽契约（Pilot Harness v0.1.0+ 提供） |
| Node | >=22.19.0 | 与仓库根 `package.json` 的 `engines.node` 字段保持一致 |
| 平台 | 跨平台 | macOS / Windows / Linux 都可运行；浏览器端为 Web 平台 |
| 原生模块 | 无 | 不依赖 `node-pty`、`node:sqlite` 等原生扩展 |

## 安装方式
```bash
dsh plugin --profile web add github:op7418/pilot-harness/packages/schedule/ui-schedule-summary
```

## 配置项
本插件无需额外配置。安装后重启 Web profile 即可生效；用 `dsh --profile web --dump-config` 可以验证 `pilot-schedule-summary` 是否已加载。

## 常见问题
**Q: 装上后能在哪里看到效果？**

A: 在 Pilot Harness Web 桌面或 Workspace 侧边栏里，把鼠标悬停在某个 Session 卡片上（延迟弹出），如果有未触发的提醒，悬浮卡片会多出一行"提醒：N 个 · 时间"，零提醒或读取失败则不显示。

**Q: 关闭这个插件会丢失提醒吗？**

A: 不会。提醒的持久化和生命周期由 `@deepseek-ai/dsh-schedule` 持有，本插件只是只读呈现，卸载后只是侧边栏不再显示该行提醒。

**Q: 为什么安装命令在 README 里和插件 ID 不同？**

A: README 给的是打包好的 tgz 预构建 bundle 地址；插件 ID 走源码安装，必须两次来源保持一致，使用时选其一即可。

**Q: 远程 Web 客户端能用吗？**

A: 当前不能。RPC 通道只允许 loopback 访问，把 LAN origin 加进 Harness 的 `trustedHosts` 也不会启用；远程场景需要本插件未提供的独立认证传输。

**Q: 安装后没看到提醒行怎么办？**

A: 先确认 Web profile 已重启并用 `dsh --profile web --dump-config` 可以看到 `pilot-schedule-summary`；若宿主没有公开 `sidebar.workspaces.session.detail` 这个插槽契约（如老版本上游 Harness），插件能加载但无法渲染该行。

**Q: 缓存多久会刷新？**

A: Host 端对每个 Session 的摘要缓存 15 秒；对应的 `schedule/change` 事件触发后立即失效；超过 256 个 Session 时按最近使用顺序淘汰。

**Q: 卸载怎么操作？**

A: 执行 `dsh plugin --profile web remove @deepseek-ai/dsh-ui-schedule-summary`，然后重启 Web profile。

## 上手难度
入门 — 单一功能插件，安装即用，没有配置项，不需要理解 Schedule / Fold / Seed 等内部概念。

## 已知问题与限制
- 悬浮摘要只展示活动数量与最近触发时间，不展示提醒内容、提示词或管理操作入口
- 持久日志损坏或不可用时，悬浮卡片不会出现该行，也不会显示 Schedule 诊断
- RPC 通道仅允许 loopback 调用，刻意不做 trusted-host 例外；远程 Web 客户端需要另接独立认证传输
- 宿主若没有公开 `sidebar.workspaces.session.detail` 插槽契约，插件可加载但浏览器端无法显示该行
- 安装旧版上游 Harness 时，部分依赖（如 `@deepseek-ai/dsh-client-ui-workspace` 的插槽位）可能未提供，会导致 Client 端无法注入

---

This document is auto-generated by [deepseek-plugin.org](https://deepseek-plugin.org). HTML page: [pilot-harness](https://deepseek-plugin.org/plugins/op7418/pilot-harness/packages/schedule/ui-schedule-summary)
Wiki generated by AI (model: `MiniMax-M3`)
