makecindy / makecindy/cindy

feat(bot): 伙伴记忆增强——bot 专属 moment 情节记忆 + 沟通风格结构化自定义

Open
#4,124 2 comments 0 reactions 0 assignees View on GitHub
Dominant language
TypeScript
Stars
2.7k
Forks
395
Avg merge
21h 48m
Merged PRs (30d)
776

Description

### 使用场景 / Use case

伙伴(Bot)是长期存在的数字同事,用户对它的核心期待之一是「记得我们之间的事」:

- 用户的一次重要想法(「我之前说过想往 XX 方向走」)
- 重大时刻(项目上线、第一次深聊、一次重要的纠正)
- 用户说过的、明确希望伙伴记住的话

这些属于**情节记忆(episodic memory)**,与现有 `user` 类型(画像 / 偏好,语义记忆)以及 `memories/USER.md`(用户手维护档案)语义不同、应相互独立。此外,伙伴的沟通风格目前只能通过改写 SOUL.md 自由文本调整,普通用户缺少低门槛的自定义入口。

### 当前问题 / Current limitation

代码基线:`main@35bac027eb63`。

- Bot Memory(Bot Home 的 `memories/`,按 `docs/product-rules/cindy-bots-runtime.md` 独立于全局 Maker Memory)复用同一套 curated 枚举 `user / feedback / project / reference`,全部是「事实 / 规则」语义,没有表达「时刻」的类型。伙伴想记住时刻只能伪装成 user / project 分片,召回语义混乱。
- 分片 frontmatter 仅有 `title / description / type / updatedAt`;时刻天然需要 `occurredAt`(事件发生时间 ≠ 写入时间)与可选的重要程度标记。
- 沟通风格:身份正本在 SOUL.md(自由文本),`system_prompt.md` 是高级 overlay;没有结构化字段(语气、称呼、回复长度、emoji 密度、禁用语等),普通用户改风格等于手写 prompt。
- 相关讨论背景:#1988 已形成两点共识——①「Stable vs Event Memory 生命周期应分离」(Event Memory 的最小落地单元正是 moment);②维护者指出结构性改造(atom / journal)应先建立度量基线、由数据驱动。本 issue 刻意避开存储重构,走轻量增量。

### 期望方案 / Proposed solution

**方案 A:bot 专属 `moment` 情节记忆(严格作用域)**

1. `MEMORY_TYPES` 增加 `moment`(存储层合法分片),新增 `BOT_ONLY_MEMORY_TYPES = [''moment'']`;`CURATED_MEMORY_TYPES` 不动——全局 Maker Memory 的索引、system-prompt 与工具枚举完全不感知该类型。
2. 写入门禁:`memory_write` 校验 `type === ''moment''` 时 scope 必须命中 `parseBotMemoryScopeKey`(`bot:` 前缀),否则返回 `INVALID_PARAMS`;读写本就按 per-scope store 隔离,无跨作用域泄漏面。
3. 索引分区:仅 bot 作用域的 `MEMORY.md` 渲染 moment 分区(最近 N 条 + 「更早用 memory_search」提示),避免时刻累积撑爆索引。
4. frontmatter 可选扩展:`occurredAt`(事件发生日期)、`significance`(high / normal)。
5. 提示词各归各家:moment 的「何时该记」指引进 `botSystemPrompt.ts` 的 `MEMORY_GUIDANCE`(仅伙伴可见),全局 `system-prompt.md` 一字不动;旧时刻用现有 `memory_consolidate` 归档为章节式 summary,不新增事件机制。
6. 轻量溯源(呼应 #1988 讨论):分片 frontmatter 可选 `sourceSession`,由 MCP 工具层从 session ctx 自动注入,LLM 零负担。

**方案 B:沟通风格结构化自定义**

1. bot profile 增加结构化 `style` 字段:语气基调(预设 + 自定义文本)、对用户的称呼、自称、回复长度偏好、emoji 密度、禁用语、语言习惯;随现有 botProfileVersioning 持久化。
2. `botSystemPrompt.ts` 新增 `STYLE_GUIDANCE` 注入 stable 层尾部(风格低频变更,利于 prompt 前缀缓存;volatile 层仍留给 memorySnapshot)。
3. 设置 UI 落在伙伴设置抽屉(预设单选 + 自定义字段,自动保存)。
4. 边界:风格块不覆盖 SOUL.md;伙伴自身不得改写风格与 SOUL(对齐 runtime 契约中「Profile 永久内容不依赖原生 Harness、不由模型自改」的红线)。

实现顺序建议:A1–A2(类型 + 门禁)→ A3(索引分区)→ B(风格)。测试补 `packages/lizi-mcps/src/__tests__/botMemoryChain.test.ts`(bot 作用域写 moment 成功 / workdir 作用域被拒)与 `packages/maker-core/src/memory/manager.scope.test.ts`(moment 仅进 bot 索引分区)。

### 已考虑的替代方案 / Alternatives considered

- **moment 进全局 `CURATED_MEMORY_TYPES`**:省一行判断,但全局 workdir 记忆也会暴露该类型,与「Bot Memory 独立」的产品红线精神相悖,且全局索引会被时刻类内容稀释——放弃。
- **为 moment 单独建存储 / journal**(即 #1988 的完整 atom 方案):能力更强但成本高,且维护者意见是「先兼容性改进与度量基线,再由数据决定结构改造」;moment 用现有分片 + FTS + consolidate 已覆盖核心场景——作为 #1988 的后续演进,不并入本 issue。
- **风格全走 SOUL.md 自由文本**:零开发成本,但普通用户门槛高、预设不可枚举;结构化字段 + SOUL.md 文本兜底(两者叠加,风格块不覆盖 SOUL)体验最好。
- **风格注入 volatile 层**:变更频率低,放 volatile 会打断 prompt 缓存前缀——放 stable 尾部。

Contributor guide

Open the contributing guide

Research direction

Start by reading docs/product-rules/cindy-bots-runtime.md, botSystemPrompt.ts, and the existing memory scope and profile-versioning code. Run packages/lizi-mcps/src/__tests__/botMemoryChain.test.ts and packages/maker-core/src/memory/manager.scope.test.ts before changing behavior. Done means bot-only moment writes are gated and indexed correctly, style settings persist and reach the stable prompt layer, and the proposed tests cover the scope boundaries.

Written by the indexing model from the issue text.

Assessment

Tech stack
typescript
Domain
ai, backend, frontend
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.