Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
3c92b09
feat(shared): add long-term memory types for Proactive Memory
Aug 2, 2026
568e6fa
feat(memory): add proactive memory core modules (store/recall/service…
Aug 2, 2026
cd6f41b
feat(memory): wire proactive memory into Proma runtime
Aug 2, 2026
25c7aea
feat(skills): add memory-daily skill for scheduled memory consolidation
Aug 2, 2026
6df929b
feat(memory): add memory board UI and IPC for Proactive Memory
Aug 2, 2026
2200510
docs(memory): add Proactive Memory design doc, integration tests, and…
Aug 2, 2026
e7f216d
docs: add PR description draft for Proactive Memory feature
Aug 2, 2026
d8ec7e5
feat(memory): adopt Nowledge Mem patterns - PreCompact capture & work…
Aug 2, 2026
1052174
feat(memory): hybrid retrieval - keyword + embedding + rule weighting
Aug 2, 2026
26f1807
test(memory): add simulate-dev pressure test and experience scripts
Aug 3, 2026
d2b9322
feat(memory): hybrid recall - keyword-first ordering, embedding as su…
Aug 3, 2026
ede1fcc
feat(memory): LLM query rewriting + rule synonyms for near-synonym re…
Aug 3, 2026
1102f09
fix(memory): hybrid recall fusion - address independent audit findings
Aug 3, 2026
91c0eb6
fix(memory): absolute-score thresholds, cluster dedup, unrelated-quer…
Aug 3, 2026
4fc3ecb
fix(memory): rule relevance filter, time-word stopwords, stable clust…
Aug 3, 2026
fe10ded
docs: update PR description with recall audit iteration history
Aug 3, 2026
e849fee
test(memory): add demo-recall script for multi-project recall showcase
Aug 3, 2026
3284275
feat(suggest): proactive suggestion engine with feedback learning
Aug 3, 2026
49fb3e1
fix(suggest): address independent audit findings (P1+P2)
Aug 3, 2026
c0cf811
fix(suggest): P0 SDK message format mismatch - engine never triggered
Aug 3, 2026
3a9bc1b
fix(channels): auto-fill empty DeepSeek preset key from .env
Aug 3, 2026
8f0e7ff
fix(memory): find .env upward from cwd for dev-mode LLM config
Aug 3, 2026
45a83e3
feat(planning): Proactive Today center (Phase B)
Aug 3, 2026
1e5f21d
fix(suggest): P0 semantic inversion, two-step confirm, banner realtime
Aug 3, 2026
6f9952c
feat(suggest): work-pattern analyst (Phase B direction 2)
Aug 3, 2026
d81c240
fix(suggest): analyst tolerate non-string LLM fields
Aug 3, 2026
9be3771
docs: complete PR description for Proactive Agent suite
Aug 3, 2026
4386867
docs: add one-click PR submission script
Aug 3, 2026
63581f8
fix(security): proactive agent P0 hardening - LLM key same-source, pe…
conrad Aug 3, 2026
9e40358
feat(privacy): P1 user control - extraction modes, delete/clear, pers…
conrad Aug 3, 2026
5a71615
fix(security): P2 hardening - schema validation, correction undo, DEC…
conrad Aug 3, 2026
8699916
feat(memory): persona traceability, memory browse, time decay, sugges…
conrad Aug 4, 2026
f5d0c5a
fix(memory): delete confirmation + persona regeneration for traceability
conrad Aug 4, 2026
107f29a
feat(memory): proactive agent upgrade - feedback loop, L2 scenes, pre…
conrad Aug 4, 2026
1d208c9
docs: add Proactive Agent service layer index to CLAUDE.md
conrad Aug 4, 2026
4fe103e
feat(proactive): complete memory and suggestion action loop
conrad Aug 4, 2026
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
14 changes: 14 additions & 0 deletions .env.memory.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# Proma Proactive Memory LLM 配置
# 请填入你自己的 LLM key(仅存本机,.env 已被 .gitignore 排除,不会提交)
# 支持 OpenAI 兼容端点:OpenAI / DeepSeek / 腾讯云 LKE / 其他

MEMORY_LLM_API_KEY=在此填入你的key
MEMORY_LLM_BASE_URL=https://api.deepseek.com/v1
MEMORY_LLM_MODEL=deepseek-chat

# 可选:语义召回(hybrid 检索,解决"我是谁"类语义问句)
# local = 本地 node-llama-cpp + embeddinggemma-300m(离线,模型需先下载到 ~/.node-llama-cpp/models/)
# api = OpenAI 兼容 embedding API(同时设置 MEMORY_EMBEDDING_MODEL)
# 默认不设置 = 仅关键词召回(零额外依赖,fail-open)
# PROMA_MEMORY_EMBEDDING=local
# MEMORY_EMBEDDING_MODEL=text-embedding-3-small
18 changes: 18 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,24 @@ bun run generate:icons # 生成应用图标
|------|------|
| `feishu-bridge.ts` | 飞书集成(68KB):消息同步、任务通知、OAuth 认证 |

#### Proactive Agent 服务层(主动记忆 + 主动建议)

| 服务 | 职责 |
|------|------|
| `memory/store.ts` | L1 atoms 持久化(JSONL 按天)+ L3 persona + corrections + 场景(`scenes/`)+ 统计 |
| `memory/recall.ts` | 召回引擎:keyword BM25 + 时间衰减(correction/sop 稳定、event 14 天、其余 30 天)+ 误报控制(单字弱命中降权 + 停用词) |
| `memory/extractor.ts` | LLM 提取(OpenAI 兼容端点,reasoning 模型兼容);类型 fact/preference/correction/sop/todo_context/event |
| `memory/persona.ts` | L3 用户画像:LLM 生成/增量更新 + 规则版兜底 + `(src: atom_xxx)` 溯源 |
| `memory/scene.ts` | L2 场景聚合:主题聚类 + 热度(atom 数 × 时间衰减 × 高频忽略抑制) |
| `memory/service.ts` | 编排:capture/recall/persona/corrections/场景对外 API |
| `suggest/engine.ts` | 建议决策:5 类规则 + 置信度阈值 + 预算(单次≤1、同会话≤2) |
| `suggest/feedback.ts` | 频率学习 + 免打扰时段(DND,跨午夜) + 高频忽略抑制列表 |
| `suggest/analyst.ts` | 工作模式分析器:LLM 低频分析记忆 + 场景,schema 严格校验(只产出候选) |
| `suggest/service.ts` | 编排:会话钩子 + IPC + 候选池分组(pred@k) |
| `memory/memory-agent-tools.ts` | Claude runtime 内置 MCP 工具(memory_search/capture/...) |

> 入口索引:设计见 `docs/proactive-memory-design.md` / `docs/proactive-suggestion-design.md`;评测脚本 `scripts/bench-recall.ts`(口径见 `docs/proactive-memory-bench.md`);关键踩坑见工作区 auto memory(归一化放大、停用词取舍)。

#### 工具与文件

| 服务 | 职责 |
Expand Down
97 changes: 97 additions & 0 deletions PR_DESCRIPTION.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
## Proactive Agent: 主动记忆 + 主动建议 + 主动中心

为 Proma 增加完整的 **Proactive Agent** 能力集——让 Agent 从"被动等用户发起"进化到"记得住、会建议、越用越好用"。

完整公式:**主动记忆(记得住)+ 主动建议(对的时候提对的建议)+ 反馈闭环(越用越好用)**

### 解决什么问题

Proma 现有的 Auto Memory 依赖 Agent 在 prompt 引导下自觉维护,且 Agent 只能"被动回答",缺少三个关键能力:

1. **主动记忆**:会话结束自动提取结构化长期记忆,跨会话自动召回
2. **主动建议**:Agent 使用过程中识别值得建议的时机,主动提出轻量、可解释、可反馈的建议
3. **工作模式发现**:低频 LLM 分析,发现用户从未明说但反复出现的隐含工作模式

参考 ProactiveAgent(ICLR 2025)的核心发现:所有模型 Recall 98%+ 但误报率 51-65%,**"该沉默时沉默"也是能力**——主动性 = 用户接受率,不是建议次数。本实现全程贯彻误报控制。

---

### 能力一:主动记忆(Proactive Memory)

| 能力 | 说明 |
|---|---|
| **L1 原子记忆** | 会话结束钩子自动 LLM 提取(fact / preference / correction / sop / todo_context),fingerprint 去重 |
| **混合召回** | keyword 精确 + LLM 查询改写 + embedding 语义 + 规则加权,多源融合 + 绝对分阈值 |
| **误报控制** | 归一化评分阈值 + 停用词过滤 + 同义词扩展 + 回忆意图降级 |
| **L3 Persona** | LLM 生成/增量更新用户画像,Markdown 白盒可审计 |
| **反馈回流** | 确认/拒绝纠正后自动更新 Persona 交互协议 |
| **内置 MCP 工具** | `memory_search/capture/stats/corrections/confirm/reject`(Claude + Pi 双 runtime) |
| **UI 看板** | 记忆统计、纠正审批、记忆搜索、persona 预览(Agent 能力中心 → 记忆 Tab) |
| **memory-daily Skill** | 指导每日记忆整理 + 建议创建 daily automation |

### 能力二:主动建议(Proactive Suggestion)

| 能力 | 说明 |
|---|---|
| **5 类确定性规则** | correction(记住纠正)/ followup(跟进提醒)/ automation(定时任务)/ skill(SOP 沉淀)/ todo(待办记录) |
| **信号提取** | 纠正词 / 时间词 / 周期词 / 未完成词 / 重复意图 + 延后语义/弱意图过滤 |
| **误报控制** | 明确拒绝门 + 频率门槛(raw×weight≥0.6)+ 预算(单次≤1、同会话≤2)+ duplicateKey 去重 |
| **频率学习** | accepted×1.2 / ignored×0.8 / never 屏蔽 + 连续忽略 3 次自动静默("越用越好用") |
| **会话内横幅** | `SuggestionBanner`:Agent 输入框上方三态卡片(接受/忽略/不再建议这类) |
| **实时推送** | 新建议生成后 IPC 事件广播,当前会话立即显示 |

### 能力三:主动中心 + 工作模式分析(Phase B)

| 能力 | 说明 |
|---|---|
| **Proactive Today** | PlanningView「主动」tab:建议卡 / 主动任务 / 待确认审批 / 用户画像 / 统计 |
| **工作模式分析器** | 低频 LLM 分析近期记忆,发现隐含模式(周期任务 / SOP / 待固化偏好) |
| **schema 严格校验** | LLM 只能产出候选(类型白名单/字段完整/动作匹配),不能直接创建任务 |
| **suggestion_analyze 工具** | Pi/Claude 双 runtime 内置工具,定时任务可调 |
| **suggestion-daily Skill** | 指导建立每日工作模式分析 automation |

---

### 质量保障(子代理驱动验证)

召回与建议系统经 **5 轮 collaboration 子代理独立审查/体验**迭代打磨:

| 轮次 | 发现 | 结果 |
|---|---|---|
| 记忆召回 3 轮审查 | kw 硬截断丢正确答案 / 归一化放大弱命中 / 无关注入 | 多源融合 + 绝对分阈值 + 无关 gate,12 问矩阵 12/12 |
| 建议引擎审查 | 8 个边界误报 + todo 死锁 + 测试污染 | 全部修复,42+9 单测 |
| **UI 实测** | **P0**:SDKMessage 格式不匹配,引擎从不执行 | sdk-messages.ts 修复 |
| 401 实测 | dev 模式 .env 路径缺口 | findDotEnvUpwards 修复 |
| **体验评测** | **P0**:规则语义反转 / 两步确认 / 横幅不实时 | 3 项全修 |

子代理独立实测发现了自测盲区("功能看似正常但真实链路从不执行"),这是代码审查和单测发现不了的。

### 验证

- 全量 typecheck 6 包全绿
- 全量测试 640+ pass / 4 fail(4 fail 为既有 Electron/planning 环境问题,与本次无关;新增 120+ 测试)
- 真实 LLM 端到端:提取/召回/persona/建议/分析全部真实验证
- 真实 UI 实测(CDP 连接真实窗口):横幅渲染、三态交互、主动中心、分析按钮全部通过
- 真实记忆工作模式分析:92 条记忆 → 发现「ShopGo 促销前压测提醒」(automation)
- 401 修复:DeepSeek 渠道预设自动填充 .env 凭证,开箱即用

### 文件概览(74 个文件,+9208 行)

- `packages/shared/src/types/memory.ts` + `suggestion.ts`:类型
- `apps/electron/src/main/lib/memory/`:store / recall / extractor / persona / service + 测试
- `apps/electron/src/main/lib/suggest/`:signals / rules / engine / feedback / service / analyst / sdk-messages + 测试
- `apps/electron/src/main/lib/agent-orchestrator.ts`:会话结束记忆捕获 + 建议评估钩子
- `apps/electron/src/main/lib/channel-manager.ts`:DeepSeek 预设渠道自动填充 .env 凭证
- `agent-prompt-builder.ts`:`<memory_context>` + `<persona_profile>` + `<working_memory>` 注入
- `builtin-mcp`:memory / suggestion 内置 MCP 注册(Claude + Pi)
- `ProactiveMemoryPanel.tsx` + `ProactiveTodayView.tsx` + `SuggestionBanner.tsx`:UI
- `default-skills/memory-daily/` + `suggestion-daily/`:内置 Skill
- `docs/proactive-memory-design.md` + `proactive-suggestion-design.md`:设计文档
- `scripts/`:smoke / verify / demo / stress 脚本

### 设计文档

- `docs/proactive-memory-design.md`:记忆系统(架构/分层/模块/接线/验证)
- `docs/proactive-suggestion-design.md`:建议系统 + 主动中心 + 分析器

Made with [Proma](https://proma.cool) · [GitHub](https://github.com/proma-ai/Proma)
75 changes: 75 additions & 0 deletions apps/electron/default-skills/memory-daily/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
---
name: memory-daily
description: Proma 主动记忆的每日整理 Skill。当用户要求"每天整理我的记忆/会话""定期沉淀长期记忆""开启每日记忆整理""memory-daily"、"把今天的对话变成记忆"、或希望 Proactive Memory 自动持续运行时触发。也适合"以后记得帮我整理"“每天晚上总结今天聊了什么”等定期沉淀意图。本 Skill 指导 Agent 用内置 memory 工具整理当天记忆,并建议用户开启 Proma 定时任务(Automation)让整理无人值守地每天运行。纯一次性整理、不需要定期执行时不建议创建定时任务,直接整理即可。
group: proma
version: "1.0.0"
---

# Memory Daily

帮助用户把当天的对话/工作沉淀为长期记忆,并可开启每日自动整理。

## 背景

Proma 内置了 Proactive Memory(主动记忆)能力:
- **自动捕获**:Agent 会话结束后自动从对话提取 L1 原子记忆(fact / preference / correction / sop / todo_context)
- **主动回忆**:新会话时自动召回相关记忆注入 `<memory_context>`;persona(用户画像)稳定注入系统提示
- **记忆工具**:`mcp__memory__memory_search` / `memory_capture` / `memory_stats` / `memory_corrections` 等

memory-daily 是"定期深度整理":把当天多个会话产生的记忆做一次汇总、去重、生成 persona 更新,确保长期记忆质量。

## 工作流

### 1. 判断用户意图

- 用户说"每天/定期整理记忆" → 整理 + 建议创建每日定时任务
- 用户只说"现在整理一下记忆" → 只整理一次,不创建定时任务
- 用户说"以后记得帮我整理" → 整理 + 建议创建定时任务

### 2. 整理当天记忆

用内置 memory 工具完成:

1. `mcp__memory__memory_stats` → 查看当前记忆统计
2. `mcp__memory__memory_corrections` → 列出待确认纠正(如有 pending,提示用户确认/拒绝)
3. 检查记忆质量:
- 是否有明显重复条目(可向用户确认后由用户决定是否清理)
- 是否有过时/冲突信息(报告给用户)
- 待确认纠正是否积压(引导用户处理)
4. 输出整理报告:
```
今日记忆整理报告
- 记忆总量: N 条 (fact X / preference Y / correction Z / sop W)
- 待确认纠正: M 条
- 用户画像: 已更新/待更新
- 建议: ...
```

### 3. 开启每日自动整理(可选)

如果用户希望每天自动整理,使用 `automation` 工具创建定时任务:

```
mcp__automation__create_automation
name: 每日记忆整理
prompt: 运行 memory-daily,整理今天的对话与记忆,报告新增记忆与待确认纠正。
scheduleType: daily
timeOfDay: "23:30"
active: true
```

创建前先 `mcp__automation__list_automations` 检查是否已有同类任务(避免重复)。

### 4. 质量与安全

- 只整理记忆库中已有内容,不要凭记忆编造当天对话
- 不要删除用户记忆(清理需用户确认)
- 待确认纠正必须由用户确认后才生效(`memory_confirm_correction`)
- 定时任务会无人值守运行,写入行为默认受限;涉及删除/大改需用户主会话确认

## 完成定义

- [ ] 已查看记忆统计与待确认纠正
- [ ] 输出今日整理报告
- [ ] (如用户要求)已创建/确认每日定时任务
- [ ] 报告了任何质量问题和用户待办事项
59 changes: 59 additions & 0 deletions apps/electron/default-skills/suggestion-daily/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
---
name: suggestion-daily
description: Proma 主动建议的工作模式分析 Skill。当用户要求"分析我的工作模式""发现可以自动化的习惯""帮我看看有什么值得沉淀的流程""定期生成建议""suggestion-daily"、或希望 Proma 主动发现周期任务/SOP/可自动化工作时触发。本 Skill 指导 Agent 用 suggestion_analyze 工具分析近期记忆,发现规则引擎发现不了的隐含工作模式,并建议用户开启每日定时分析。纯手动分析一次、不需要定期执行时不建议创建定时任务。
group: proma
version: "1.0.0"
---

# Suggestion Daily

帮助用户发现"隐含的工作模式"——那些用户没有明确说"每天/定期",但记忆里反复出现的周期性工作、可沉淀流程、待固化偏好。

## 背景

Proma 的主动建议有两层:
1. **规则引擎**(实时):用户明确说"以后不要 X / 明天继续 / 每天自动" → 立即建议
2. **工作模式分析器**(低频):用 LLM 分析近期记忆,发现**隐含模式**(用户从没明说,但记忆显示反复出现)→ 生成建议候选

本 Skill 对应第 2 层,让"主动建议"从"等你开口"进化到"替你发现"。

## 工作流

### 1. 判断用户意图

- 用户说"每天/定期分析我的工作模式" → 分析 + 建议创建每日定时任务
- 用户只说"现在分析一下" → 分析一次,不创建定时任务
- 用户说"以后记得帮我分析" → 分析 + 建议创建定时任务

### 2. 运行工作模式分析

调用内置工具:

1. `mcp__memory__suggestion_analyze`(Pi runtime)/ `suggestion_analyze`(Claude runtime)→ 运行 LLM 分析,生成建议候选
2. 工具返回 `added` 数量(新增建议条数)
3. 如果 `added = 0`:说明近期记忆没有足够的重复模式,告知用户"暂未发现新的可沉淀模式"(这是正常现象,不建议频繁分析)

### 3. 引导用户处理建议

分析结果会出现在:
- **主动中心**(⌘⇧T → 主动 tab)的"Proma 建议"模块
- 用户可对每条建议执行:接受(写入/生效)/ 忽略(降频)/ 不再建议这类(屏蔽)

### 4. 建议创建每日定时任务

如果用户希望持续发现工作模式,建议创建 Automation:

```text
任务名:工作模式分析
调度:每天 23:30(或用户偏好的时间)
提示词:运行 suggestion-daily Skill:分析我的工作模式,生成主动建议候选。
```

创建后 Proma 会每天自动分析记忆、发现新的可自动化/可沉淀模式,进入主动中心供用户决定。

## 注意事项

- **低频优先**:工作模式分析是"低频高价值"能力,不建议比每天更频繁(LLM 调用有成本)
- **只读记忆**:分析器只读取记忆摘要,不修改任何记忆;用户接受建议后才写入
- **保守产出**:分析器 schema 严格校验,只保留有证据的模式;产出为空是正常的
- 分析结果不会自动创建定时任务/Skill——所有动作都需用户在主动中心确认
Loading