Skip to content

Commit ab7556e

Browse files
feat: auto dream 开启
1 parent ea06f50 commit ab7556e

7 files changed

Lines changed: 264 additions & 10 deletions

File tree

DEV-LOG.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,30 @@
11
# DEV-LOG
22

3+
## /dream 手动触发 + DreamTask 类型补全 (2026-04-04)
4+
5+
`/dream` 命令从 KAIROS feature gate 中解耦,作为 bundled skill 无条件注册;补全 DreamTask 类型存根。
6+
7+
**新增文件:**
8+
9+
| 文件 | 说明 |
10+
|------|------|
11+
| `src/skills/bundled/dream.ts` | `/dream` skill 注册,调用 `buildConsolidationPrompt()` 生成整理提示词 |
12+
13+
**修改文件:**
14+
15+
| 文件 | 变更 |
16+
|------|------|
17+
| `src/skills/bundled/index.ts` | 导入并注册 `registerDreamSkill()` |
18+
| `src/components/tasks/src/tasks/DreamTask/DreamTask.ts` | `any` 存根 → 从 `src/tasks/DreamTask/DreamTask.js` 重新导出完整类型 |
19+
20+
**新增文档:**
21+
22+
| 文件 | 说明 |
23+
|------|------|
24+
| `docs/features/auto-dream.md` | Auto Dream 原理、触发机制、使用场景完整说明 |
25+
26+
---
27+
328
## Computer Use Windows 增强:窗口绑定截图 + UI Automation + OCR (2026-04-03)
429

530
在三平台基础实现之上,利用 Windows 原生 API 增强 Computer Use 的 Windows 专属能力。
@@ -413,3 +438,4 @@ GrowthBook 功能开关系统原为 Anthropic 内部构建设计,硬编码 SDK
413438
```
414439

415440
非空字段才写入,保存后立即生效(`onDone()` 触发 `onChangeAPIKey()` 刷新 API 客户端)。
441+

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
- [x] Mac 上可以用这个项目 [computer-use-mcp](https://github.com/domdomegg/computer-use-mcp)
4646
- 注意这个库的命名方式与官方冲突了, 需要改为 `claude mcp add --scope user --transport stdio computer-use-mcp -- npx -y computer-use-mcp`
4747
- [x] /voice 支持 @amDosion
48+
- [x] /dream 记忆整理命令(手动 + 自动后台触发) [文档](https://ccb.agent-aura.top/docs/features/auto-dream)
4849
- [ ] V6 大规模重构石山代码, 全面模块分包
4950
- [ ] V6 将会为全新分支, 届时 main 分支将会封存为历史版本
5051

docs/features/auto-dream.md

Lines changed: 182 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,182 @@
1+
# Auto Dream — 自动记忆整理
2+
3+
## 概述
4+
5+
Auto Dream 是 Claude Code 的后台记忆整合机制。它在会话间自动审查、组织和修剪持久化记忆文件,确保未来会话能快速获得准确的上下文。
6+
7+
记忆系统存储在文件系统中(默认 `~/.claude/projects/<project-slug>/memory/`),由 `MEMORY.md` 索引文件和若干主题文件(如 `user_language.md``project_overview.md`)组成。随着会话积累,记忆会变得过时、冗余或矛盾——Dream 负责清理这些堆积。
8+
9+
## 架构
10+
11+
### 核心模块
12+
13+
| 模块 | 路径 | 职责 |
14+
|------|------|------|
15+
| 调度器 | `src/services/autoDream/autoDream.ts` | 时间/会话/锁三重门控,触发 forked agent |
16+
| 配置 | `src/services/autoDream/config.ts` | 读取 `isAutoDreamEnabled()` 开关 |
17+
| 提示词 | `src/services/autoDream/consolidationPrompt.ts` | 构建 4 阶段整理提示词 |
18+
| 锁文件 | `src/services/autoDream/consolidationLock.ts` | PID 锁 + mtime 作为 `lastConsolidatedAt` |
19+
| 任务 UI | `src/tasks/DreamTask/DreamTask.ts` | 后台任务注册,footer pill + Shift+Down 可见 |
20+
| 手动入口 | `src/skills/bundled/dream.ts` | `/dream` 命令,无条件可用 |
21+
22+
### 记忆路径解析
23+
24+
优先级(`src/memdir/paths.ts`):
25+
26+
1. `CLAUDE_COWORK_MEMORY_PATH_OVERRIDE` 环境变量(完整路径覆盖)
27+
2. `autoMemoryDirectory` 设置项(`settings.json`,支持 `~/` 展开)
28+
3. 默认:`<memoryBase>/projects/<sanitized-git-root>/memory/`
29+
30+
其中 `memoryBase` = `CLAUDE_CODE_REMOTE_MEMORY_DIR``~/.claude`
31+
32+
## 触发机制
33+
34+
### 自动触发(Auto Dream)
35+
36+
每个对话轮次结束后,`executeAutoDream()` 按顺序检查三重门控:
37+
38+
```
39+
┌─────────────────────────────────────────────────────┐
40+
│ Gate 1: 全局开关 │
41+
│ isAutoMemoryEnabled() && isAutoDreamEnabled() │
42+
│ 排除: KAIROS 模式 / Remote 模式 │
43+
├─────────────────────────────────────────────────────┤
44+
│ Gate 2: 时间门控 │
45+
│ hoursSince(lastConsolidatedAt) >= minHours │
46+
│ 默认: 24 小时 │
47+
├─────────────────────────────────────────────────────┤
48+
│ Gate 3: 会话门控 │
49+
│ sessionsTouchedSince(lastConsolidatedAt) >= minSessions │
50+
│ 默认: 5 个会话(排除当前会话) │
51+
├─────────────────────────────────────────────────────┤
52+
│ Lock: PID 锁文件 │
53+
│ .consolidate-lock (mtime = lastConsolidatedAt) │
54+
│ 死进程检测 + 1 小时过期 │
55+
└─────────────────────────────────────────────────────┘
56+
```
57+
58+
全部通过后,以 **forked agent**(受限子代理)方式运行整理任务:
59+
60+
- Bash 工具限制为只读命令(`ls``grep``cat` 等)
61+
- 只能读写记忆目录内的文件
62+
- 用户可在 Shift+Down 后台任务面板中查看进度或终止
63+
64+
### 手动触发(`/dream` 命令)
65+
66+
通过 `/dream` 命令随时触发,无门控限制:
67+
68+
- 在主循环中运行(非 forked agent),拥有完整工具权限
69+
- 用户可实时观察操作过程
70+
- 执行前自动更新锁文件 mtime
71+
72+
### 配置开关
73+
74+
| 开关 | 位置 | 作用 |
75+
|------|------|------|
76+
| `autoDreamEnabled` | `settings.json` | `true`/`false` 显式开关 |
77+
| `autoMemoryEnabled` | `settings.json` | 总开关,关闭后所有记忆功能禁用 |
78+
| `CLAUDE_CODE_DISABLE_AUTO_MEMORY` | 环境变量 | `1`/`true` 关闭所有记忆功能 |
79+
| `tengu_onyx_plover` | GrowthBook | 官方远程配置,控制 `enabled`/`minHours`/`minSessions` |
80+
81+
默认值(无 GrowthBook 连接时):
82+
83+
```typescript
84+
minHours: 24 // 距上次整理至少 24 小时
85+
minSessions: 5 // 至少有 5 个新会话
86+
```
87+
88+
## 整理流程(4 阶段)
89+
90+
Dream agent 执行的提示词包含 4 个阶段:
91+
92+
### Phase 1 — 定位(Orient)
93+
94+
- `ls` 记忆目录,查看现有文件
95+
- 读取 `MEMORY.md` 索引
96+
- 浏览现有主题文件,避免重复创建
97+
98+
### Phase 2 — 采集信号(Gather)
99+
100+
按优先级收集新信息:
101+
102+
1. **日志文件**`logs/YYYY/MM/YYYY-MM-DD.md`,KAIROS 模式下的追加式日志)
103+
2. **过时记忆** — 与当前代码库状态矛盾的事实
104+
3. **会话记录** — 窄关键词 grep JSONL 文件(不全文读取)
105+
106+
### Phase 3 — 整合(Consolidate)
107+
108+
- 合并新信号到现有主题文件,而非创建近似重复
109+
- 将相对日期("昨天"、"上周")转为绝对日期
110+
- 删除被推翻的事实
111+
112+
### Phase 4 — 修剪与索引(Prune)
113+
114+
- `MEMORY.md` 保持在 200 行以内、25KB 以内
115+
- 每条索引项一行,不超过 150 字符
116+
- 移除过时/错误/被取代的指针
117+
118+
## 记忆类型
119+
120+
记忆系统使用 4 种类型(`src/memdir/memoryTypes.ts`):
121+
122+
| 类型 | 用途 | 示例 |
123+
|------|------|------|
124+
| `user` | 用户角色、偏好、知识 | 用户是高级后端工程师,偏好中文交流 |
125+
| `feedback` | 工作方式指导 | 不要 mock 数据库测试;代码审查用 bundled PR |
126+
| `project` | 项目上下文(非代码可推导的) | 合并冻结从 3 月 5 日开始;认证重写是合规需求 |
127+
| `reference` | 外部系统指针 | Linear INGEST 项目跟踪 pipeline bugs |
128+
129+
**不保存的内容**:代码模式、架构、文件路径(可从代码推导);Git 历史(`git log` 权威);调试方案(代码中已有)。
130+
131+
## 锁文件机制
132+
133+
`.consolidate-lock` 文件位于记忆目录内:
134+
135+
- **文件内容**:持有者 PID
136+
- **mtime**:即 `lastConsolidatedAt` 时间戳
137+
- **过期**:1 小时(防 PID 复用)
138+
- **竞态处理**:双进程同时写入时,后读验证 PID,失败者退出
139+
- **回滚**:forked agent 失败或被用户终止时,mtime 回退到获取前的值
140+
141+
## 使用场景
142+
143+
### 场景 1:日常开发中的自动整理
144+
145+
开发者连续多天使用 Claude Code 处理不同任务。Auto Dream 在积累 5+ 个会话且距上次整理 24 小时后自动触发,整合分散在多次会话中的用户偏好和项目决策。
146+
147+
### 场景 2:手动整理记忆
148+
149+
用户发现 Claude 重复犯相同错误或遗忘之前的决策。输入 `/dream` 立即触发整理,无需等待自动触发周期。
150+
151+
### 场景 3:新会话快速上下文
152+
153+
新会话启动时,`MEMORY.md` 被加载到上下文中。经过 Dream 整理的记忆文件结构清晰、信息准确,让 Claude 快速了解用户和项目。
154+
155+
### 场景 4:KAIROS 模式下的日志蒸馏
156+
157+
KAIROS(长驻助手模式)中,agent 以追加方式写入日期日志文件。Dream 负责将这些日志蒸馏为主题文件和 `MEMORY.md` 索引。
158+
159+
## 与其他系统的关系
160+
161+
```
162+
┌─────────────┐ ┌──────────────┐ ┌───────────────┐
163+
│ 会话交互 │────▶│ 记忆写入 │────▶│ MEMORY.md │
164+
│ (主 agent) │ │ (即时保存) │ │ + 主题文件 │
165+
└─────────────┘ └──────────────┘ └───────┬───────┘
166+
167+
┌───────────────────────────────────────┘
168+
169+
┌──────────────┐ ┌──────────────┐
170+
│ Auto Dream │────▶│ 整理/修剪 │
171+
│ (后台触发) │ │ 去重/纠错 │
172+
└──────────────┘ └──────────────┘
173+
174+
┌──────────────┐
175+
│ /dream 命令 │
176+
│ (手动触发) │
177+
└──────────────┘
178+
```
179+
180+
- **extractMemories**`src/services/extractMemories/`):每轮次结束时从对话中提取新记忆并写入。Dream 不负责提取,只负责整理。
181+
- **CLAUDE.md**:项目级指令文件,加载到上下文中但不属于记忆系统。
182+
- **Team Memory**`TEAMMEM` feature):团队共享记忆目录,与个人记忆使用相同的 Dream 机制。

mint.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,8 @@
152152
"pages": [
153153
"docs/features/token-budget",
154154
"docs/features/context-collapse",
155-
"docs/features/workflow-scripts"
155+
"docs/features/workflow-scripts",
156+
"docs/features/auto-dream"
156157
]
157158
},
158159
"docs/features/tier3-stubs"
Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1-
// Auto-generated type stub — replace with real implementation
2-
export type DreamTask = any;
3-
export type DreamTaskState = any;
1+
// Type re-exports for DreamTask — bridges the component tree to the task registry.
2+
// The real implementation lives in src/tasks/DreamTask/DreamTask.ts.
3+
// Note: Currently unused — BackgroundTasksDialog.tsx imports directly from
4+
// src/tasks/DreamTask/DreamTask.js. Kept for decompilation completeness.
5+
6+
export type { DreamTaskState, DreamPhase, DreamTurn } from '../../../../../tasks/DreamTask/DreamTask.js'
7+
export { isDreamTask, registerDreamTask, addDreamTurn, completeDreamTask, failDreamTask, DreamTask } from '../../../../../tasks/DreamTask/DreamTask.js'

src/skills/bundled/dream.ts

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
// Manual /dream skill — runs the memory consolidation prompt interactively.
2+
// Extracted from the KAIROS feature gate so it's available unconditionally
3+
// whenever auto-memory is enabled.
4+
5+
import { getAutoMemPath, isAutoMemoryEnabled } from '../../memdir/paths.js'
6+
import { buildConsolidationPrompt } from '../../services/autoDream/consolidationPrompt.js'
7+
import { recordConsolidation } from '../../services/autoDream/consolidationLock.js'
8+
import { getOriginalCwd } from '../../bootstrap/state.js'
9+
import { getProjectDir } from '../../utils/sessionStorage.js'
10+
import { registerBundledSkill } from '../bundledSkills.js'
11+
12+
const DREAM_PROMPT_PREFIX = `# Dream: Memory Consolidation (manual run)
13+
14+
You are performing a manual dream — a reflective pass over your memory files. Unlike the automatic background dream, this run has full tool permissions and the user is watching. Synthesize what you've learned recently into durable, well-organized memories so that future sessions can orient quickly.
15+
16+
`
17+
18+
export function registerDreamSkill(): void {
19+
registerBundledSkill({
20+
name: 'dream',
21+
description:
22+
'Manually trigger memory consolidation — review, organize, and prune your auto-memory files.',
23+
whenToUse:
24+
'Use when the user says /dream or wants to manually consolidate memories, organize memory files, or clean up stale entries.',
25+
userInvocable: true,
26+
isEnabled: () => isAutoMemoryEnabled(),
27+
async getPromptForCommand(args) {
28+
const memoryRoot = getAutoMemPath()
29+
const transcriptDir = getProjectDir(getOriginalCwd())
30+
31+
// Stamp the consolidation lock optimistically (same as the KAIROS path).
32+
await recordConsolidation()
33+
34+
const basePrompt = buildConsolidationPrompt(memoryRoot, transcriptDir, '')
35+
let prompt = DREAM_PROMPT_PREFIX + basePrompt
36+
37+
if (args) {
38+
prompt += `\n\n## Additional context from user\n\n${args}`
39+
}
40+
41+
return [{ type: 'text', text: prompt }]
42+
},
43+
})
44+
}

src/skills/bundled/index.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { registerSimplifySkill } from './simplify.js'
1010
import { registerSkillifySkill } from './skillify.js'
1111
import { registerStuckSkill } from './stuck.js'
1212
import { registerLoopSkill } from './loop.js'
13+
import { registerDreamSkill } from './dream.js'
1314
import { registerUpdateConfigSkill } from './updateConfig.js'
1415
import { registerVerifySkill } from './verify.js'
1516

@@ -34,12 +35,7 @@ export function initBundledSkills(): void {
3435
registerBatchSkill()
3536
registerStuckSkill()
3637
registerLoopSkill()
37-
if (feature('KAIROS') || feature('KAIROS_DREAM')) {
38-
/* eslint-disable @typescript-eslint/no-require-imports */
39-
const { registerDreamSkill } = require('./dream.js')
40-
/* eslint-enable @typescript-eslint/no-require-imports */
41-
registerDreamSkill()
42-
}
38+
registerDreamSkill()
4339
if (feature('REVIEW_ARTIFACT')) {
4440
/* eslint-disable @typescript-eslint/no-require-imports */
4541
const { registerHunterSkill } = require('./hunter.js')

0 commit comments

Comments
 (0)