Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 12 additions & 10 deletions PRIVACY.md
Original file line number Diff line number Diff line change
@@ -1,19 +1,20 @@
# Task-agnostic feedback privacy contract

Plugin Lab v3 允许上传一个经过用户确认的体验大类,但不允许上传模型生成的自由文本摘要。目标是让开发者获得可聚合、可行动的方向,同时让当前任务、会话和日志在协议层面没有入口
Plugin Lab v3 允许上传一个经过用户确认的体验大类,但不允许上传模型生成的自由文本摘要。界面中的“脱敏 Summary”只是公开插件坐标和有限枚举的固定模板渲染;服务端用同一规则重建,网络协议不接受自由 Summary

## 不变量

1. **封闭影响范围**:私密内容最多影响 Agent 建议的一个大类;一旦用户确认大类,反馈序列化只由公开插件坐标、有限枚举和随机单次 ID 决定
1. **封闭影响范围**:Agent 建议只由公开插件坐标和 Host 状态枚举决定,私密任务内容不能影响建议、Summary 或上传包
2. **有限字母表**:网络包只允许协议列出的字段;未知字段直接拒绝,不做“接收后脱敏”。
3. **没有自由摘要字段**:`summary`、`note`、`reason`、`message` 等字段全部拒绝。可读摘要只由固定模板渲染。
4. **宿主真源**:探活只读取 DSH Host 的 Loader/Fiber 状态,不调用目标插件,也不进行文件、网络或数据库 I/O。
5. **Agent 窄工具**:探活工具输入为空;预览工具只接受 `experience` 和 `category` 两个枚举,且没有存储或网络副作用。
6. **主观状态不臆测**:只有用户确认才能产生 `source=user_confirmed` 的本地记录;健康状态不能自动转换为体验评价。
7. **预览后提交**:体验和大类先写入本地草稿并显示完整预览;`/omdsh-join` 是独立的逐条发送动作。
8. **无稳定身份**:没有用户、账号、设备、安装、Session 或跨报告匿名 ID。
9. **无日志派生详情**:不接受日志摘要、错误类型、错误码、堆栈、指纹或哈希;崩溃只能成为 `health=error`。
10. **聚合后通知**:GitHub 只接收达到阈值后的大类、状态、体验和报告数,不接收单条报告。
5. **Agent 安全胶囊**:探活工具输入为空,输出只有公开插件名/版本、Host 状态、建议大类和允许枚举;预览工具只接受 `experience` 和 `category`。
6. **最小 UI 锚点**:客户端只读取最终回复的 `messageId` 和时间,把按钮挂到试用后的回复;不读取内容块、Tool 参数或 Tool 结果。
7. **主观状态不臆测**:只有用户点击好用/不好用才能产生 `source=user_confirmed` 的本地记录;健康状态不能自动转换为体验评价。
8. **预览后提交**:体验和 Agent 建议的大类先写入本地草稿并显示完整预览;发送是独立的逐条确认动作。
9. **无稳定身份**:没有用户、账号、设备、安装、Session 或跨报告匿名 ID。
10. **无日志派生详情**:不接受日志摘要、错误类型、错误码、堆栈、指纹或哈希;崩溃只能成为 `health=error`。
11. **聚合后通知**:GitHub 只接收达到阈值后的大类、状态、体验和报告数,不接收单条报告。

## 允许的大类

Expand All @@ -22,18 +23,19 @@ installation | startup | invocation | compatibility
reliability | performance | result_quality | general
```

这些大类描述插件体验阶段,不描述用户正在执行什么任务。Agent 可以基于当前交互建议一个大类,但用户必须在预览中检查、修改或取消
这些大类描述插件体验阶段,不描述用户正在执行什么任务。Agent 只能根据 Host 状态建议一个大类,用户必须在预览中检查并确认或取消

## 必须通过的攻击测试

- 向 Agent 预览工具加入 `summary/task/log/prompt` 参数必须拒绝整个调用。
- 向上传包加入 `summary/note/log/stack/signals/environment/participantId/occurredAt` 必须拒绝整个请求。
- 把邮箱、Token、绝对路径、聊天文本放入会话和异常;本地包与固定摘要不得出现 canary。
- 相同公开插件、健康状态、体验和大类下,更换私密任务内容不能改变序列化包。
- 更换 Assistant 回复正文、Tool 参数或结果,UI 锚点只能保持相同的消息 ID/时间结果,不能返回内容。
- `verbose/debug/include=logs` 不能改变探活结果。
- 未配置 Loader、状态缺失或内部异常只能得到 `unknown`,不能输出异常详情。
- 用户只点击探活、体验或大类时,抓包必须没有反馈请求。
- 用户必须能在发送前看到插件、版本、状态、体验、大类和单次报告 ID
- 用户必须能在发送前看到由插件、版本、状态、体验和大类生成的完整固定 Summary
- 请求体超过 1 KiB 必须在接受字段前拒绝。
- 服务端 4xx/5xx 响应不得包含 canary、异常、路径或请求正文。
- 未达到聚合阈值时不能创建 GitHub Issue。
Expand Down
44 changes: 24 additions & 20 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,48 +1,52 @@
# Oh My DSH Plugin Lab

Plugin Lab 0.4 是面向 DeepSeek Harness rc.6 的隐私优先插件反馈闭环。反馈入口不再常驻:只有 Host 能把当前试用插件明确判定为 `error` 或 `unavailable` 时,输入框上方才出现“让 Agent 帮我反馈”。不需要模型 API,也不需要记住命令;后端只把达到阈值的聚合信号提交到 GitHub。
Plugin Lab 0.5 是面向 DeepSeek Harness rc.6 的隐私优先“体验回执”。它不做插件格子或常驻收集面板:一次插件试用确实产生 Agent 回复后,只在这条回复的操作栏显示 `插件名 · 👍 👎`;命令、纯 UI 或崩溃插件没有回复时,输入区边缘显示同样大小的兜底反馈条。

Agent 只接收一个安全胶囊:公开插件名、版本和 Host 状态枚举。客户端为摆放按钮只读取最新回复的消息 ID 与时间,不读取回复正文;任何一层都不扫描任务、文件或日志。

## 现在的体验

1. 从插件市场开始一次试用;在当前 rc.6 开发接入中也可用 `/omdsh-start <plugin>#<version>` 关联目标。
2. 试用开始后,客户端只查询 Host 的 `ok / unavailable / error / unknown` 有限状态。`ok` 和 `unknown` 时界面保持安静;`error` 或 `unavailable` 时,输入框上方出现一条故障反馈提示
3. 用户选择“好用 / 一般 / 不好用”和一个有限大类;Agent 只负责把这些有限字段整理成固定模板
4. 面板弹出发送前预览;此时只保存到本机,没有网络请求,也没有本地消息引用可被附带
5. 用户再次点击“确认发送这条反馈”后,有限枚举包才会发送;Session 历史只新增一条独立的“插件反馈”卡片。
6. 探活、选择和预览等中间操作不进入历史;“查看进展”收在同一面板内。后端聚合到阈值后创建 GitHub Issue,并通过回执邀请复测
2. 客户端只查询 Host 的 `ok / unavailable / error / unknown` 有限状态;有 Agent 回复时,`👍 👎` 跟在该回复下面,没有回复且明确故障时才使用输入区兜底条
3. 用户只点“好用 / 不好用”;Agent 按 Host 状态的固定规则自动选一个脱敏大类。兼容命令仍支持 `一般` 和手动大类
4. 点击后在原位置就地展开完整“脱敏 Summary”,不弹模态框。Summary 只由公开插件坐标和有限枚举拼成;此时只保存到本地回执箱,没有网络请求。
5. 用户再次点击“确认发送”后,生成该 Summary 所需的有限枚举包才会发送;Session 历史只新增一条独立的“体验回执”卡片。
6. 回执箱显示本地待确认、等待发送和修复/复测进展。后端聚合到阈值后才创建 GitHub Issue。

普通 Agent/模型调用错误、网络错误或“缺少 API Key”不会触发这个入口,因为它们不能证明插件本身故障。Plugin Lab 不搜索对话或日志来猜测归因。

Agent 分析是可选能力,只能建议有限大类,不能读取或提交任务摘要。没有模型 API Key 时,上述完整主流程照常可用
Agent 的“分析”不是自由阅读:工具输入必须为空,输出只有插件公开坐标、Host 状态、建议大类和允许的枚举。没有模型 API Key 时,固定规则建议与完整回执流程仍然可用

```mermaid
flowchart LR
A["插件试用"] --> B["Host 无日志探活"]
B -->|"error / unavailable"| C["故障时出现反馈提示"]
B -->|"ok / unknown"| J["保持安静"]
C --> K["Agent 建议有限大类"]
K --> D["用户选择体验和大类"]
D --> E["本地固定模板预览"]
E -->|"用户再次确认"| F["发送有限枚举"]
B --> C{"产生 Agent 回复?"}
C -->|"是"| D["回复操作栏 · 👍 👎"]
C -->|"否且明确故障"| E["输入区边缘 · 👍 👎"]
C -->|"否且状态未知"| J["保持安静"]
D --> K["Agent 按安全胶囊自动选大类"]
E --> K
K --> L["本地脱敏 Summary 就地预览"]
L -->|"用户再次确认"| F["发送有限枚举"]
F --> G["后端聚合"]
G -->|"达到阈值"| H["GitHub 聚合 Issue"]
H --> I["修复与复测回执"]
```

Agent 可能已经拥有当前任务的正常会话上下文,但 Plugin Lab 的工具参数和上传协议都没有承载这些内容的字段。Agent 只能从封闭枚举中提出建议;最终分类和主观体验由用户确认
Agent 可能已经拥有当前任务的正常会话上下文,但 Plugin Lab 工具不接受这些内容作为参数,也不读 Session 事件。客户端只用消息 ID 和时间把按钮挂到正确回复,不读取内容块。建议只由 Host 状态确定;主观体验由用户点击,并在 Summary 预览中再次确认

## 安装开发版本

```sh
pnpm install
pnpm pack:release
dsh plugin --profile web add ./oh-my-dsh-plugin-lab-0.4.5.tgz
dsh plugin --profile web add ./oh-my-dsh-plugin-lab-0.5.0.tgz
dsh --profile web
```

Plugin Lab 是标准 DSH Bundle:`package.json` 通过 `dsh.bundle.patch` 声明 Host 插件,通过 `dsh.client` 在结构化插件故障时提供 Web“让 Agent 帮我反馈”入口。探活、体验选择、脱敏预览、确认提交和进展都在这个入口中完成
Plugin Lab 是标准 DSH Bundle:`package.json` 通过 `dsh.bundle.patch` 声明 Host 插件,通过 `dsh.client` 注册回复操作栏和无回复故障兜底条。探活、体验选择、脱敏预览和确认提交都保持在当前上下文里完成

版本 `0.4.5` 的 Peer 契约从 DSH `0.1.0-rc.6` 起。完整测试会执行真实的 rc.6 打包、安装、Host/Web 启动、Client Loader 注册和卸载。
版本 `0.5.0` 的 Peer 契约从 DSH `0.1.0-rc.6` 起。完整测试会执行真实的 rc.6 打包、安装、Host/Web 启动、Client Loader 注册和卸载。

## 兼容命令与 Agent 工具

Expand All @@ -54,11 +58,11 @@ Plugin Lab 是标准 DSH Bundle:`package.json` 通过 `dsh.bundle.patch` 声
| `/omdsh-probe` | 本地读取当前目标的 Host 生命周期状态 |
| `/omdsh-result <verdict> <category>` | 用户确认体验和大类,生成本地预览 |
| `/omdsh-join <latest\|event-id>` | 用户确认发送已经展示的有限字段 |
| `/omdsh-inbox [--peek]` | 查看聚合问题、修复版本与复测邀请 |
| `/omdsh-inbox [--peek]` | 查看本地待确认回执、聚合进展与复测邀请 |
| `/omdsh-retest <receipt-id> <module>[#version]` | 从单条回执开始复测 |
| `/omdsh-status` | 查看本地试用、待发送和未读状态 |
| `/omdsh-privacy` | 显示完整隐私边界 |
| `omdsh_analyze_plugin_experience({})` | Agent 查询状态和允许的大类;输入必须为空 |
| `omdsh_analyze_plugin_experience({})` | Agent 读取安全胶囊和建议大类;输入必须为空 |
| `omdsh_preview_plugin_feedback({experience, category})` | 生成无副作用固定模板预览;不保存、不上传 |

`verdict` 只能是 `good / mixed / bad`。`category` 只能是:
Expand Down Expand Up @@ -92,7 +96,7 @@ reliability | performance | result_quality | general

不会创建、读取或发送:

- 当前任务、任务标签、Prompt、Assistant 回复或 Agent memory;
- 当前任务、任务标签、Prompt、Assistant 回复正文或 Agent memory;
- stdout、stderr、访问日志、应用日志或 Tool 参数/结果;
- exception、错误码、stack、frame、崩溃指纹;
- 文件、代码、路径、URL、环境变量、配置;
Expand Down
17 changes: 15 additions & 2 deletions dist/agent-tool.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading