Pi 的 Extension 是什么?TypeScript 扩展点 + 30+ 生命周期事件
· 9 min read
Pi 的 extension 是 TypeScript 模块,不是 YAML / JSON 也不是 hook 脚本。它能注册工具、命令、快捷键、provider、UI 渲染器,订阅 30+ 种生命周期事件——这套 API 是 Pi「minimal core」哲学的具体兑现。
- 形式:TypeScript 模块,
default-export function (pi: ExtensionAPI) { ... } - 作用域:全局
~/.pi/agent/extensions/或项目本地.pi/extensions/ - 三类能力:订阅事件、注册功能、主动操作 session
- 杀手锏:
pi.registerProvider()动态注册 / 覆盖 provider,无需重启 - 状态管理:存在 tool result 的
details里,跟着 entry 进 JSONL 树 - 安全警告:extension 以完整系统权限运行,只装可信来源
Pi 的 extensions 是 TypeScript 模块,不是 YAML/JSON 也不是 hook 脚本。它们能注册工具、命令、快捷键、provider、UI 渲染器,订阅 30+ 种生命周期事件——这套 API 是 Pi 「minimal core」哲学的具体兑现。本篇拆解扩展点的全景。
什么是 Extension
Extension 是 default-export function (pi: ExtensionAPI) { ... } 这种形态的 TypeScript 模块。它能做的所有事可以归为三类:
- 订阅生命周期事件:监听 agent 跑过程中的各种钩子
- 注册新能力:工具、命令、provider、UI 渲染、快捷键
- 主动操作 session:发消息、切分支、提交 prompt
Extension 以完整系统权限运行
Extension 以完整系统权限 运行,可执行任意代码。只安装可信来源的扩展——这一点 Pi 在文档顶部用粗体强调。
目录约定
| 路径 | 作用域 |
|---|---|
~/.pi/agent/extensions/*.ts | 全局 |
~/.pi/agent/extensions/*/index.ts | 全局(子目录形态) |
.pi/extensions/*.ts | 项目本地 |
.pi/extensions/*/index.ts | 项目本地(子目录形态) |
可以在 settings.json 的 extensions 字段加额外路径。Auto-discovered 的扩展支持 /reload 热重载——改完文件不需要重启。
一个最小 Extension
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
export default function (pi: ExtensionAPI) {
pi.on("session_start", async (_event, ctx) => {
ctx.ui.notify("Extension loaded!", "info");
});
}
工厂函数也可以是 async——Pi 会在启动前 await,确保异步初始化在 session_start、resources_discover、pi.registerProvider() 这些早期调用之前完成。但不要在工厂函数里启动后台资源(进程、socket、文件监听等)。应该在 session_start 或具体事件里延迟启动,并在 session_shutdown 注册幂等的清理 handler。