# pi-edit-last

把当前 Pi 会话分支中最近一条用户消息放回输入框，方便修改后重新发送。

[English](README.md) · [开发与发布流程](CONTRIBUTING.md)

## 安装

需要 Pi 和 Node.js 22.19 或更高版本。当前已针对 `@earendil-works/pi-coding-agent` 1.1.0 测试。

```sh
pi install npm:pi-edit-last
```

在已打开的 Pi 会话中执行 `/reload`，或者重启 Pi。也可以从 GitHub 安装：

```sh
pi install git:github.com/tong233/pi-edit-last
```

如果之前安装过 `~/.pi/agent/extensions/edit-last.ts`，请先把旧文件移到 extensions 目录之外并保留备份，避免命令和快捷键重复注册。

## 使用

执行 `/last` 或按 **Ctrl+Shift+E**。恢复文本后继续编辑，准备好后按 Enter 发送；扩展不会自动发送恢复的消息。

扩展使用 Pi 公开的会话树导航 API，效果类似在 `/tree` 中选择最近的用户消息：当前分支回退到该消息的父节点，原消息及其后续历史仍保留，可通过 `/tree` 找回。

- 只查找当前分支，保留多行文本和原有空格。
- 只在交互式 TUI 模式运行。
- Agent 正在生成或存在排队消息时拒绝操作；请先按 Esc 停止生成，并处理排队消息。
- 输入框已有草稿时拒绝操作；导航期间输入的新草稿也会保留。
- 最近消息包含图片时拒绝操作，避免丢失附件；请使用 `/tree`。
- 导航取消、失败或会话切换时，不覆盖输入框。
- 没有用户消息或消息没有可恢复文本时，会显示提示。

**回退会话不会撤销文件修改、命令或其他副作用。** 如需撤销这些操作，请另外使用 Git 等工具。快捷键可能与终端设置或其他扩展冲突。

当最近的用户消息恰好是当前叶节点时，扩展会添加一个不进入模型上下文的 `edit-last-anchor` 内部标记，以避免 Pi 对当前叶节点的导航成为空操作。

## 更新和卸载

```sh
pi update npm:pi-edit-last
pi remove npm:pi-edit-last
```

## 开发和分发

```sh
npm ci
npm run check
npm test
pi -e ./extensions/edit-last.ts
```

测试包含保护逻辑，以及真实 Pi 资源加载、会话导航和快捷键分派，不调用模型。Pi 直接加载 TypeScript 源码，不需要构建或打包宿主运行时。

本项目同时是 npm 包和 Pi package：`pi.extensions` 声明扩展入口，`pi-package` 关键词用于 [Pi 包目录](https://pi.dev/packages)发现。目录索引由 Pi 管理，可能需要等待更新。

首次发布和后续自动发布流程见 [CONTRIBUTING.md](CONTRIBUTING.md)。

## 许可证

[MIT](LICENSE)
