Skip to content

Commit 1068a67

Browse files
魔仙堡魔仙堡
authored andcommitted
feat: 0.9.0 守护进程 + 跨工具感知网 + UMP 互操作 + 通知疲劳控制
- 0.5 守护进程与主动出口:daemon/notifier 三端通知/ActionCard 闭环/doctor 健康检查 - 0.6 跨工具事件协议:event-store 统一事件 + event-capture 通用入口 + daemon 真定时评估 - 0.7 UMP L0 互操作:ump-export/ump-import + adapter 接入指南与模板 - 0.8 通知疲劳控制:每日上限/冷却窗口/画像驱动打扰系数 Made-with: Proma
1 parent 4e4eb37 commit 1068a67

27 files changed

Lines changed: 2735 additions & 15 deletions

CHANGELOG.md

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,91 @@
11
# Changelog
22

3+
## 0.9.0 (2026-08-12)「守护进程 + 感知网 + UMP + 疲劳控制」
4+
5+
### 通知疲劳控制
6+
7+
「插件化主动 Agent」第四站:让守护进程更克制、更懂你。
8+
9+
### 新增
10+
11+
- **每日通知上限**:默认 6 条/天(`PROACTIVE_DAEMON_DAILY_LIMIT` 覆盖),跨天自动重置;达上限当日不再打扰,建议**保留不吞**(次日继续)。
12+
- **通知冷却窗口**:默认 15 分钟(`PROACTIVE_DAEMON_COOLDOWN_MIN` 覆盖),避免短时间内连弹。
13+
- **画像驱动打扰系数**:画像含「减少打扰/勿扰/免打扰/quiet mode」等**全局**表达时系数 0.5(上限减半 + 冷却翻倍);技术词(--quiet/静默安装/silent mode)与单事项提醒(别提醒我收快递)**不误伤**;词表边界有回归测试。
14+
- **doctor 疲劳状态**:展示「今日 已通知/上限」,达上限 warn,画像命中时标注 ×0.5。
15+
16+
### 修复(子代理对抗审查后)
17+
18+
- **P1 画像词表误报/漏报**:去掉裸技术词(quiet/静默/silent mode),改组合形态;补全局语境词(勿扰/免打扰/dnd/不想被打扰);单事项提醒不触发全局降档。
19+
- **P2 防御**:dailyNotified 字符串类型防御、时钟回拨不触发永久冷却、cooldown 显式乘法语义、doctor 标注 limit 来源、测试 env 卫生。
20+
21+
### 测试
22+
23+
- 368/368(新增 0.8 用例 10:词表边界 10 场景、limit=1、COOLDOWN=0、时钟回拨、老版本状态兼容);core + mcp typecheck 干净。
24+
25+
### 生态与分发
26+
27+
「插件化主动 Agent」第三站:UMP 互操作 + adapter 开放。
28+
29+
### 新增
30+
31+
- **UMP 互操作(L0)**`proactive-mcp ump-export` 导出记忆为 Universal Memory Protocol 文件(`.ump/memory.ump.json``{ump:'0.1',records:[...]}`,kind/scope/time/lifecycle/provenance 映射);`ump-import` 从 UMP 文件导入(默认 pending 防投毒,`--confirm` 即时生效,text 截断 4000 / 单文件上限 10000);`--confirmed` 仅导出已确认项。
32+
- **UMP 兼容评估文档**:.context/pa-ump-compat-eval.md(协议解读 + PA↔UMP 对照矩阵 + L0/L2 策略,L2 MCP store 桥接待生态成熟)。
33+
- **adapter 开放**:docs/developers/adapter-guide.md(第三方工具接入指南:事件协议 + 三种接入方式 + 隐私说明)+ hooks/adapter-template.ts(脚手架)。
34+
- **core 公共类型导出**`export * from './shared-types'`(MemoryAtom 等类型进入公共 API 表面)。
35+
36+
### 修复(子代理对抗审查后,均实证复现)
37+
38+
- **P0-1 导出分页截断**:pageSize=200 被 core clamp 到 100 导致 >100 条只导出第一页——终止条件改用 totalPages + 截断警告;120 条回归测试。
39+
- **P0-2 CLI argv 错位**:ump-export/ump-import 从 CLI 完全不可用——sub 改用 argv[0],CLI 冒烟测试。
40+
- **P0-3 畸形记录崩溃**:records 含 null/非对象导致整批导入崩溃——跳过计数 + 单条容错。
41+
- **P1-1 导入无上限**:text 截断 4000 + 单文件 10000 上限。
42+
- **P1-2 adapter 模板忽略 cwd**:resolvePk 与 event-capture 一致。
43+
- **P1-3 记忆关闭时误导**:跳过计数 + CLI 提示。
44+
45+
### 测试
46+
47+
- 356/356(新增 ump 10:分页/畸形/超长/CLI 冒烟);core + mcp typecheck 干净。
48+
- 已知限制(0.7.1):UMP L2 桥接(spec v0.1 未稳定)、Smithery 描述更新需后台手动、mcp.so 手动提交、UMP 官方客户端互操作实测。
49+
50+
### 跨工具感知网
51+
52+
「插件化主动 Agent」第二站:统一事件协议 + daemon 真定时评估(完成 0.5 P0-1 遗留)。
53+
54+
### 新增
55+
56+
- **跨工具统一事件协议**:各工具 hooks 把会话/消息/commit 事件归一化写入 `PROACTIVE_DATA_DIR/events/{date}.jsonl`(短字段 schema、按天落盘、1MB 单文件裁剪、7 天保留、仅当前用户可读写 0700/0600);并发安全(锁 + 原子替换,多 hook 同机不丢事件不损坏)。
57+
- **daemon 真定时评估**:巡检时读最近事件构造 messages → `evaluateNow({trigger:'timer'})`(sessionId 取最近 msg 事件);无事件降级纯巡检开口通道。
58+
- **event-capture 通用入口**`dist/hooks/event-capture.js` 任意工具 hook 传入 JSON 即接入(Cursor camelCase / Claude snake_case 字段自适应、工具白名单、stdin cwd 解析项目身份)。
59+
- **hooks 内联写事件**:Claude Code(SessionStart/UserPromptSubmit/Stop)与 Kimi Code hooks 自动写事件,工具自适应(Kimi is_steer / Cursor camelCase / Claude)。
60+
- **Cursor 接入**:官方支持加载 Claude Code hooks 自动映射,无需额外配置(init 打印跨工具接入指引;不再生成 .cursor/hooks.json 避免双写)。
61+
62+
### 修复(子代理对抗审查后)
63+
64+
- **P0-1 并发写竞态**:锁内完成「裁剪 + 追加」,临时文件 + rename 原子替换(原实现多进程并发丢事件 + 文件损坏,已实证复现并回归)。
65+
- **P1-1 工具标签失真**:hooks 从 stdin 自适应工具(Cursor/Kimi/Claude),不再全部标记 claude。
66+
- **P1-3 sessionId 不可靠**:daemon 从最近 msg 事件取 sid;session-end 传真实 session_id。
67+
- **P1-5 cwd 项目身份**:event-capture 用 stdin cwd 解析 pk。
68+
- **P1-6 事件明文权限**:目录 0700 / 文件 0600。
69+
70+
### 测试
71+
72+
- 66/66(新增 event-store 7 + event-capture 7 + daemon 事件用例;含 4 进程并发写回归)。
73+
- 已知限制(0.6.1 候选):事件按项目隔离评估(pk 分组 + core projectHint 路由)、Codex/Cline hooks 真机验证、Continue 事件映射核验。
74+
75+
### 守护进程
76+
77+
「插件化主动 Agent」第一站:daemon + 桌面通知主动出口。
78+
79+
### 新增
80+
81+
- **守护进程(daemon)主动出口**`proactive-mcp daemon` 常驻后台,**巡检待处理建议**并通过桌面通知主动开口(macOS 通知中心 / Windows 托盘气泡 / Linux notify-send,点击打开主动中心面板);`--install` 一键登录自启(macOS launchd / Linux systemd user)、`--status` / `--stop` 管理(stop 前校验命令行防 pid 复用误杀);单实例锁(pid + 进程存活探测 + 写入后重读校验,释放仅限本进程)、通知去重(同条不重复打扰)、通知失败下轮重试、DND 门控(免打扰时段不通知且**保留建议不吞**);巡检间隔 `PROACTIVE_DAEMON_INTERVAL_MIN`(默认 60 分钟)。建议生成来源:hooks(UserPromptSubmit/Stop)与宿主 push(`/api/evaluate`);真·定时评估随 0.6 感知网接入(0.5 巡检语义,避免无消息空转)。
82+
- **通知内 ActionCard 闭环**:/today 面板建议卡片新增「接受 / 忽略」按钮(`POST /api/suggestions/:id/accept|ignore`,带 `x-pa-token` 面板 token 鉴权防本机恶意 POST),接受 automation/todo 建议经 Action Executor 真实落地为本地任务队列(tasks.json);服务端幂等预检(已处理建议拒绝重放);仅当宿主未注入执行器时才注册本地默认执行器。
83+
- **doctor 增加 daemon 健康检查**:进程存活 / 上次巡检 / 上次通知 / 已通知条数。
84+
85+
### 测试
86+
87+
- notifier 10 + daemon 16 + today ActionCard 2(mock 平台命令与引擎,不弹真实通知);core + mcp typecheck 干净。
88+
389
## 0.8.1 (2026-08-10)
490

591
「0.8.0 独立验证修复」批次:依据协作子代理真实运行验证报告(浏览器实测 + 双层 persona 边界)修复 5 个 P2。

README.md

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,11 @@ agent: 我偏好用 TypeScript 和 Bun
131131
### 附加能力
132132

133133
- **记忆维护(0.8.0,对齐 Proma v0.17.0 记忆治理)**`memory_stats` 展示「今日 X 条动态 · 距上次更新 N 天」;记忆超过 3 天未更新时返回复查邀请(清理过时记忆、确认待确认项、必要时重整画像);`persona_get` 在画像超载(>45 行 / >6 章节)时提示精简重整;`onboarding_guide` 提供「先建画像 → 再补证据」两阶段引导。
134-
- **/today Web 面板**:本地主动中心(15s 自动刷新),任何宿主都能开浏览器看;`POST /api/evaluate` 支持宿主把最近消息推过来触发会话中评估
134+
- **/today Web 面板**:本地主动中心(15s 自动刷新),任何宿主都能开浏览器看;`POST /api/evaluate` 支持宿主把最近消息推过来触发会话中评估;建议卡片支持「接受 / 忽略」一键反馈(ActionCard 闭环,接受即落地本地任务)
135+
- **守护进程(0.5.0 主动出口)**`proactive-mcp daemon` 常驻后台,**巡检待处理建议**并通过**桌面通知**主动开口(macOS 通知中心 / Windows 托盘气泡 / Linux notify-send);点击通知打开主动中心面板;`--install` 一键配置登录自启(launchd / systemd);`--status` / `--stop` 管理;`doctor` 包含 daemon 健康检查与**今日疲劳状态**(已通知/上限)。巡检间隔 `PROACTIVE_DAEMON_INTERVAL_MIN`(默认 60 分钟),每次最多通知 1 条、同条不重复打扰、DND 时段不打扰且不吞建议(克制信条)。
136+
- **通知疲劳控制(0.8.0)****每日通知上限**(默认 6 条/天,`PROACTIVE_DAEMON_DAILY_LIMIT` 覆盖,跨天自动重置)+ **冷却窗口**(默认 15 分钟,`PROACTIVE_DAEMON_COOLDOWN_MIN` 覆盖)+ **画像驱动打扰系数**——画像含「不要打扰/静默」等规则时上限减半、冷却翻倍(尊重用户「不想被打扰」的表达);达上限/冷却时建议**保留不吞**,次日继续
137+
- **跨工具感知网(0.6.0)**:统一事件协议——各工具 hooks 把会话/消息/commit 事件归一化写入 `~/.proma-proactive/events/`(仅当前用户可读写),daemon 巡检时读取最近事件构造 messages 做**真定时评估**(完成 0.5 P0-1 遗留);Claude Code / Kimi Code hooks 已内联写事件,Cursor 官方支持加载 Claude Code hooks 自动接入,Codex/Cline 可用 `dist/hooks/event-capture.js` 通用入口接入;`init` 打印跨工具接入指引;第三方接入指南见 `docs/developers/adapter-guide.md`
138+
- **UMP 互操作(0.7.0 L0)**`proactive-mcp ump-export` 导出记忆为 Universal Memory Protocol 文件(`.ump/memory.ump.json`),`ump-import` 从 UMP 文件导入(默认待确认防投毒)——任何 UMP 客户端可读写 ProactiveAgent 记忆;兼容评估见 .context 文档,L2 MCP store 桥接待生态成熟
135139
- **Claude Code hooks(三层)**
136140
- `SessionStart`(today-push):会话开始推送待处理建议 + 热点场景
137141
- `UserPromptSubmit`(user-prompt):**会话中实时评估**——你说"以后都用 pnpm",立即收到纠正建议;弱信号自动沉默
@@ -181,6 +185,15 @@ agent: 我偏好用 TypeScript 和 Bun
181185
→ 建议预填真实 cron,接受后直接建好定时任务
182186
```
183187

188+
### 场景 5:无人值守的主动守护进程(0.5.0)
189+
```
190+
proactive-mcp daemon --install # 安装登录自启(macOS/Linux)
191+
→ 每隔 60 分钟巡检待处理建议
192+
→ 有值得开口的建议时,桌面通知弹出来(点击打开主动中心)
193+
→ 在面板点「接受」→ automation/todo 建议直接落地为本地任务
194+
→ 该沉默时沉默:无新建议 / DND 时段(建议保留不吞) / 同条建议不重复打扰
195+
```
196+
184197
---
185198

186199
## 架构
@@ -246,6 +259,14 @@ A:0.5.4 起 `memory_recall` 使用<b>倒排索引</b>(term → atoms,缓
246259

247260
## Roadmap
248261

262+
- [x] 守护进程 + 桌面通知主动出口(0.5.0:常驻评估 + 三端通知 + 通知点击打开面板 + launchd/systemd 自启 + ActionCard 闭环按钮)
263+
- [x] 跨工具感知网(0.6.0:统一事件协议 + 事件落盘 + Claude/Kimi 内联写事件 + Cursor 官方兼容 + event-capture 通用入口 + daemon 真定时评估)
264+
- [x] UMP 互操作 L0(0.7.0:ump-export/ump-import + 兼容评估文档 + adapter 接入指南与模板)
265+
- [x] 通知疲劳控制(0.8.0:每日上限 + 冷却窗口 + 画像驱动打扰系数 + doctor 疲劳状态)
266+
- [ ] 生态分发收尾(0.7.1:Smithery 描述更新 + mcp.so 手动提交 + UMP L2 桥接评估)
267+
- [ ] 通知内反馈回流增强(0.8.1:通知点击统计 → ROI 回流)
268+
- [ ] 通知疲劳控制与个性化(0.8.x:频控 + 画像驱动打扰 + 通知内反馈回流)
269+
- [ ] 事件按项目隔离评估(0.6.1:daemon 按 pk 分组 + core projectHint 路由生效)
249270
- [x] 核心引擎(记忆 + 建议 + 场景 + 画像)
250271
- [x] MCP Server + 面板 + hooks
251272
- [x] Proma / Claude Code / Kimi Code 真实验证

docs/developers/adapter-guide.md

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
# 接入指南:让任何工具成为 ProactiveAgent 的感知源(0.6+)
2+
3+
> ProactiveAgent 的「跨工具感知网」:任意工具只要把会话/消息/commit 事件写入统一事件流
4+
> `PROACTIVE_DATA_DIR/events/{date}.jsonl`),daemon 就能在巡检时读到这些事件做真定时评估,
5+
> 并通过桌面通知主动开口。**接入 = 在工具的生命周期事件点执行一个脚本**
6+
7+
## 事件协议(v1,短字段)
8+
9+
每行一条 JSON(append-only,按天落盘):
10+
11+
```json
12+
{"v":1,"t":"start","tool":"cursor","at":1786507152759,"sid":"cur-1","pk":"github.com-acme-app"}
13+
{"v":1,"t":"msg","tool":"cursor","at":1786507153000,"sid":"cur-1","role":"u","text":"以后都用 pnpm 安装"}
14+
{"v":1,"t":"msg","tool":"cursor","at":1786507153100,"sid":"cur-1","role":"a","text":"好的,已切换到 pnpm"}
15+
{"v":1,"t":"commit","tool":"cursor","at":1786507153200,"sid":"cur-1","msg":"chore: use pnpm"}
16+
{"v":1,"t":"end","tool":"cursor","at":1786507153500,"sid":"cur-1"}
17+
```
18+
19+
| 字段 | 说明 |
20+
|---|---|
21+
| `t` | `start` 会话开始 / `msg` 消息(`role`: `u`=user / `a`=assistant) / `commit` 提交 / `end` 会话结束 |
22+
| `tool` | `claude` / `cursor` / `codex` / `kimi` / `cline` / `continue` |
23+
| `sid` | 会话 ID(跨会话预算去重依赖它,尽量传) |
24+
| `pk` | 项目身份 key(可选;daemon 后续按它隔离评估) |
25+
26+
容量:单文件 1MB 自动裁剪(保留最新 70%)、目录保留 7 天、权限 0600/0700(仅当前用户可读写)。
27+
无需自己实现这些——直接用官方入口即可。
28+
29+
## 三种接入方式
30+
31+
### 方式 A:Claude Code 兼容(Cursor / Continue 等,零代码)
32+
33+
Cursor 官方支持加载 `.claude/settings.json` 的 Claude Code hooks 并自动映射
34+
(SessionStart→sessionStart、UserPromptSubmit→beforeSubmitPrompt、Stop→stop)。
35+
运行 `proactive-mcp init` 生成配置后,**开启工具自身的第三方钩子兼容即可自动接入**
36+
37+
### 方式 B:通用入口 event-capture(Codex / Cline / 任意支持命令回调的工具)
38+
39+
任意工具在事件点执行 `node <安装路径>/dist/hooks/event-capture.js`,stdin 传 JSON:
40+
41+
```json
42+
{"event":"message","tool":"codex","role":"user","text":"用户消息","session_id":"s1","cwd":"/path/to/project"}
43+
```
44+
45+
字段兼容 camelCase / snake_case:`sessionStart`/`sessionEnd`/`beforeSubmitPrompt`/`user_prompt`/`commit`
46+
未知事件/未知工具静默(不污染宿主协议)。工具名白名单见 `src/event-store.ts``AgentTool`
47+
48+
### 方式 C:内联 SDK(有 Node 运行时的高级接入)
49+
50+
在工具插件里直接调 `@proactive-agent/core` 旁路或 `event-store` 的便捷函数:
51+
52+
```ts
53+
import { recordMessage, recordLifecycle, currentProjectKey } from '@proactive-agent/mcp' // 或打包后的 event-store
54+
recordLifecycle('cline', 'start', { sid, pk: currentProjectKey() })
55+
recordMessage('cline', 'u', prompt, { sid, pk: currentProjectKey() })
56+
recordLifecycle('cline', 'end', { sid, pk: currentProjectKey() })
57+
```
58+
59+
## 接入清单(给第三方贡献者)
60+
61+
1. **定事件点**:工具支持的 hook/事件回调里挑 4 个——会话开始、用户消息、会话结束、commit
62+
2. **传 JSON**`{event, tool, role, text, session_id, cwd}`(cwd 用于解析项目身份)
63+
3. **验证**:跑一次后检查 `~/.proma-proactive/events/` 出现当天的 `.jsonl`,行结构符合协议
64+
4. **回归**`proactive-mcp doctor` 看 daemon 状态;开 daemon 后观察「上次评估」时间在事件后更新
65+
5. **提交 adapter**:把接入配置/脚本 PR 到仓库 `packages/proactive-mcp/hooks/`(参考 `adapter-template.ts`
66+
67+
## 隐私说明
68+
69+
事件文件包含用户消息明文(**仅当前用户可读写**)。建议在工具侧提示用户,
70+
并避免把密钥类对话内容接入;后续版本将提供 `PROACTIVE_EVENTS_DISABLED` 采集开关。
71+
72+
## 参考实现
73+
74+
- 官方入口:`packages/proactive-mcp/hooks/event-capture.ts`(方式 B)
75+
- 内联写事件:`hooks/common.ts` / `today-push.ts` / `session-end.ts`(方式 A)
76+
- 模板:`packages/proactive-mcp/hooks/adapter-template.ts`(方式 B 脚手架)

packages/proactive-core/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export * from './paths'
2020
export * from './provider'
2121
export * from './memory/repo-extract'
2222
export * from './memory/ttl'
23+
export * from './shared-types'
2324
export type { ProactiveCoreOptions } from './types'
2425

2526
export { memoryService, suggestService }

0 commit comments

Comments
 (0)