# Prompt for Me（Prompt 嘴替）

[English](README.md)

[![npm version](https://img.shields.io/npm/v/dsh-prompt-for-me)](https://www.npmjs.com/package/dsh-prompt-for-me) [![npm downloads](https://img.shields.io/npm/dm/dsh-prompt-for-me)](https://www.npmjs.com/package/dsh-prompt-for-me) [![GitHub stars](https://img.shields.io/github/stars/ChuanTianML/prompt-for-me)](https://github.com/ChuanTianML/prompt-for-me)

Prompt for Me（Prompt 嘴替）会根据对话，在 DeepSeek Harness 的输入框里准备下一句。你可以直接采用、修改后再发，或点击按钮换个建议。插件帮你起草，是否发送由你决定。

## 看看实际效果

**1. 回复结束，自动备好下一句**

输入框空闲时，浅灰色建议会自动出现。此时它还没有写入草稿，也不会自动发送。

![Agent 回答后，输入框中出现浅灰色的下一句建议，旁边提供采用按钮](assets/product/automatic-suggestion.zh.jpg)

**2. 一键采用，按自己的意思修改**

按 **Tab** 或点击 **✓**，建议就会变成可编辑的文字。图中又补上了“每条不超过20字”，是否发送仍由你决定。

![采用建议后，文字进入草稿，并追加了每条不超过20字的要求，发送按钮已可用](assets/product/accept-and-edit.zh.jpg)

**3. 想换个方向，点击星光按钮**

点击发送按钮左侧的 **✦**，或按默认快捷键 **⌘⇧Space / Ctrl+Shift+Space**，即可主动生成下一句并填入草稿。例如，换成按 T-7 天、T-1 天和上线当天来追问。

![手动生成后，输入框中出现按上线时间点组织检查的新追问，消息尚未发送](assets/product/manual-generation.zh.jpg)

*以上为真实产品截图，演示项目与对话内容均为虚构；已裁去私人会话列表、工作区信息和运行统计。*

## 功能

- 只有在出现新的已完成轮次、Session 空闲、plan mode 未生效，并且输入框文字严格为空、没有图片和排队意图时，才会自动生成。
- Host 策略尚未载入或输入框暂时不符合条件时，会保留这条已完成轮次；条件恢复后再生成一次。
- 自动生成期间输入框不再符合条件时，会取消请求并忽略迟到结果。原生输入框明确拒绝建议时，不会改用预览卡片展示。
- 更新的轮次完成时会淘汰上一段上下文留下的建议；即使提交过快、没有渲染中间输入状态，也不会让旧建议阻塞新建议。
- 新版 Harness 使用输入框内联 ghost text；较旧客户端使用一张不修改草稿的轻量预览卡片。
- 按 Tab、右方向键或相邻勾选控件采用 ghost；Enter 永远不会采用 ghost。
- 开始输入会隐藏 ghost，清空文字后可以再次显示，Escape 会关闭它。
- 保留 Sparkles Trigger 和 `Mod+Shift+Space` 快捷键。显式 Trigger 总会请求一条新建议并直接写入草稿，即使后台自动生成尚未结束。
- 下一次显式请求会携带本轮已经跳过的建议，要求模型不得重复或改写复述；该列表最多保留 10 条。
- 不绕过 Harness 权限审批、不调用工具、不自动发送消息。

## 交互对照

| 场景 | 结果 |
| --- | --- |
| 一轮完成且输入框符合条件 | 自动建议显示在草稿之外。 |
| Tab、右方向键或勾选控件 | 可见建议成为一次可撤销的草稿编辑。 |
| 只有 ghost 时按 Enter | 不采用，也不发送。 |
| 开始输入 | ghost 隐藏，以用户文字为准。 |
| 清空刚输入的文字 | 无须再次调用模型，隐藏建议可以重新显示。 |
| Escape | 关闭可见建议。 |
| Sparkles 按钮或 `Mod+Shift+Space` | 重新生成，并直接填充或替换草稿。 |
| 编辑后按 Enter | 只发送最终文本；此时才把采用结果计入正向反馈。 |

## 安装

推荐安装 Release 中已经构建好的 tarball，不需要执行构建脚本：

```sh
dsh plugin --profile web add https://github.com/ChuanTianML/prompt-for-me/releases/download/v0.6.2/dsh-prompt-for-me-0.6.2.tgz
```

安装后重启 `dsh web`。

也可以安装固定 Git 标签：

```sh
dsh plugin --profile web add github:ChuanTianML/prompt-for-me#v0.6.2
```

0.6.2 修复了与 dshmarket 等插件并发加载 Schemastery 时导致 DSH 启动失败的问题。已安装 0.6.0/0.6.1 的用户可运行 `dsh plugin --profile web add dsh-prompt-for-me@0.6.2`，然后重启 DSH。

使用 pnpm 10 从 Git 安装时，可能需要在 Web profile 的 `pnpm-workspace.yaml` 中为 `allowBuilds` 添加 `dsh-prompt-for-me: true`，然后重新运行命令。`prepare` 脚本只复制 checkout 中的 Host 文件并包装 Client factory，不会下载任何内容。

更新或卸载：

```sh
dsh plugin --profile web update dsh-prompt-for-me
dsh plugin --profile web remove dsh-prompt-for-me
```

当前 DeepSeek Harness 开发版本提供原生内联建议 API。如果该 API 不存在、但客户端仍提供已完成轮次投影，插件会退化为带“采用”和关闭控件的明确预览卡片。无论使用哪种展示形式，手动 Sparkles 流程都保持直接写入。

## Web UI 设置

打开 **设置 → 插件 → 可配置**，展开 **Prompt for Me / Prompt 嘴替**。设置卡片沿用 Harness 的设置层级、颜色、间距和保存交互，并把选择持久化到统一的 Host 用户设置中；保存后立即生效，无须重启。

保存期间可以继续修改设置；这些新修改会保留为未保存状态，需要再次点击“保存”。

- **Agent 回复后自动建议**：默认开启。关闭后会撤下尚未采用的自动 Ghost Text，并停止后续自动生成；Sparkles 手动 Trigger 仍然可用。
- **手动生成快捷键**：默认是 `Mod+Shift+Space`。点击当前组合键后直接按下新的 Command/Ctrl 或 Alt 组合键，也可以单独关闭快捷键。Ghost Text 的采用键仍由 Harness 管理，默认是 Tab。
- **高级设置 → 建议模型**：默认跟随当前 Session 已选择的模型；也可以固定到当前 Harness 模型目录中的某个 provider/model。

界面不提供“参考范围”“快速/个性化模式”“重置个性化记录”或内部 token/超时参数。这些行为由插件统一选择，以免把上下文质量和个性化策略的复杂性转嫁给用户。

## 模型和 API Key

插件在 Harness Host 上调用 `ctx.llm`。默认优先复用当前会话的 provider/model，没有时使用 Harness 默认模型，因此使用的就是 DeepSeek Harness 已配置的 API Key。浏览器拿不到也不会读取这个 Key，插件没有单独的 Key。

普通用户可在 Web UI 的高级设置中固定辅助模型。部署维护者也可在 `cordis.patch.yml` 或更高优先级的 profile patch 中同时配置一个基础值；用户保存的 Web UI 设置优先于这个基础值：

```yaml
- id: prompt-for-me
  name: dsh-prompt-for-me
  config:
    provider: deepseek-official
    model: deepseek-chat
```

## 数据与隐私

每次自动或显式生成建议时，Host 可能把下列有界文本发送给当前选择的模型提供方：

- 当前草稿；
- 当前会话最近 3 轮真人用户/助手文本；
- 当前会话中已发送的建议编辑、原样接受和拒绝记录；
- 来自最多 20 个历史会话的手写提示词和建议交互原始样本；
- 本轮最多 10 条已经跳过的建议，用于让模型避免重复或改写复述。

当前草稿和最近 3 轮决定当前任务、意图和消息内容；当前会话反馈只调整眼前的表达；跨会话记忆只能影响长期的风格、详略和工作流偏好。手写提示词和编辑后发送的建议权重高于原样接受，拒绝记录只作为较弱的负向信号。编辑建议后再次 Trigger 会拒绝原建议，但不会把尚未发送的编辑结果当成正向偏好。

Harness 会把工作区指令、运行时上下文和 Skill 列表记录为用户角色事件；插件会从会话轮次和偏好记忆中排除这些非真人来源。如果草稿与真人会话均为空，插件会在调用模型前停止生成。

常见 API Key、token、password 和 Bearer token 会在模型调用前替换为 `[REDACTED_SECRET]`。插件不会收集附件、工具参数、文件、凭证或二进制内容；没有分析上报服务，只会调用 Harness 已选择的模型路由。

交互记录只保存在当前浏览器 `localStorage` 的 `dsh.prompt-for-me.outcomes.v2`，每条包含会话 ID、最终动作、来源以及相关的原文/最终文本。仅仅看到或采用 ghost 不算正向反馈，实际发送后才会形成证据。V1 记录会自动迁移，原记录不会删除。插件不提供要求用户管理这些记录的重置入口。

DeepSeek Harness `0.1.0-rc.6` 尚未提供下游插件注册自定义持久化 session event 的公开接口。因此独立版不会把辅助模型请求和建议结果追加到 Harness session log；强行写入会导致原版运行时无法重新读取会话。这是独立版与实验性仓库内实现的主要差异，待官方开放事件注册接口后再补齐。

生成 RPC 使用 NDJSON。每条候选只有在完整并通过校验后才会进入临时建议界面或草稿；模型的半截 token 和不完整 JSON 不会进入输入框。后台失败保持安静，显式触发失败会显示在 Sparkles 控件上。

辅助请求始终使用 `off` reasoning。模型收到一段系统指令，以及一条包含 `current`、`currentSessionFeedback`、`userPreferenceMemory` 和 `currentCycleSkipped` 的 JSON 用户消息；不会收到工具定义或附件。

Host 在内存中保留最近 50 条隐私安全的性能记录，并把每条记录以 `prompt-for-me metrics` 写入日志。记录包含模型路由、各类文本的字节数/条数、历史读取和输入组装耗时、首个模型增量/reasoning/text 的时间、建议到达时间、模型与请求总耗时，以及提供方返回的 token usage；不包含提示词、候选或交互结果正文。可查询当前进程：

```sh
curl -sS -X POST -H 'content-type: application/json' \
  -d '{"method":"metrics"}' \
  http://127.0.0.1:3080/dsh-prompt-for-me/rpc
```

## 配置

Web UI 只公开上述三个对日常交互有明确价值的选项。下表是面向部署维护者的 `cordis.patch.yml` 组合参数；生成限制保留稳定默认值，不要求普通用户调整：

| 字段 | 默认值 | 含义 |
| --- | ---: | --- |
| `automatic` | `true` | 在符合条件的已完成轮次后展示一条不进入草稿的建议。 |
| `maxCandidateBytes` | `4096` | 单条建议 UTF-8 上限。 |
| `maxDraftBytes` | `32768` | 草稿或编辑结果 UTF-8 上限。 |
| `maxCurrentCycleSkipped` | `10` | 作为下一次 Trigger 强负向上下文保留的已跳过建议数。 |
| `maxCurrentCycleSkippedBytes` | `16384` | 当前周期已跳过建议共享的 JSON 预算。 |
| `maxCurrentTurns` | `3` | 保留的当前会话最近轮数。 |
| `maxCurrentContextBytes` | `16384` | 最近会话轮次的 JSON 预算。 |
| `maxCurrentFeedbackBytes` | `4096` | 当前会话建议反馈的 JSON 预算。 |
| `maxPreferenceMemoryBytes` | `8192` | 跨会话偏好记忆的 JSON 预算。 |
| `maxHistorySessions` | `20` | 检查的历史会话数。 |
| `maxManualPrompts` | `8` | 保留的历史手写提示词数。 |
| `maxEditedSuggestions` | `6` | 每个反馈层保留的建议编辑对数。 |
| `maxAcceptedExact` | `6` | 每个反馈层保留的原样接受数。 |
| `maxRejectedSuggestions` | `4` | 每个反馈层保留的弱拒绝信号数。 |
| `maxLocalOutcomes` | `50` | 浏览器本地交互记录上限。 |
| `maxLocalOutcomesBytes` | `131072` | 浏览器本地记录及其 RPC 副本共享的 JSON 预算。 |
| `maxOutputTokens` | `2048` | 辅助模型输出预算。 |
| `timeoutMs` | `30000` | 建议请求超时，覆盖历史会话读取和辅助模型调用。 |
| `shortcut` | `Mod+Shift+Space` | 跨平台 Trigger，也可设为 `disabled`。 |

## 开发

需要 Node.js 22.19 或更高版本。

```sh
npm run check
```

该命令会重新构建 Host/Client 静态产物、运行 Node 和 React 界面测试，并检查 npm 包内容。

设置界面的真实 React 回归测试会分别验证源码和构建产物，运行方式见 [UI 测试说明](https://github.com/ChuanTianML/prompt-for-me/blob/main/test-ui/README.md)。

## License

MIT
