dayloom 0.1.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1146 -0
- package/dist/cli/daily.js +41 -0
- package/dist/cli/index.js +33 -0
- package/dist/cli/init.js +40 -0
- package/dist/cli/next.js +60 -0
- package/dist/cli/play.js +39 -0
- package/dist/cli/revise.js +41 -0
- package/dist/cli/settle.js +45 -0
- package/dist/daily/apply-plan.js +25 -0
- package/dist/daily/constants.js +16 -0
- package/dist/daily/dialogue-loop.js +147 -0
- package/dist/daily/finalize.js +23 -0
- package/dist/daily/guard.js +54 -0
- package/dist/daily/index.js +27 -0
- package/dist/daily/intent-router.js +65 -0
- package/dist/daily/mcp-gateway.js +5 -0
- package/dist/daily/mcp-tools.js +8 -0
- package/dist/daily/parse-assistant.js +38 -0
- package/dist/daily/parse-payload.js +10 -0
- package/dist/daily/player-context.js +85 -0
- package/dist/daily/project-plan.js +15 -0
- package/dist/daily/promptpile-loop.js +41 -0
- package/dist/daily/prompts.js +11 -0
- package/dist/daily/read-user-input.js +6 -0
- package/dist/daily/session.js +119 -0
- package/dist/daily/types.js +2 -0
- package/dist/daily/validate-plan.js +46 -0
- package/dist/i18n/detect.js +23 -0
- package/dist/i18n/index.js +22 -0
- package/dist/i18n/messages.js +149 -0
- package/dist/index.js +27 -0
- package/dist/init/apply-payload.js +18 -0
- package/dist/init/archive-transcript.js +28 -0
- package/dist/init/checklist.js +74 -0
- package/dist/init/cleanup.js +12 -0
- package/dist/init/constants.js +21 -0
- package/dist/init/errors.js +11 -0
- package/dist/init/finalize.js +35 -0
- package/dist/init/guard.js +31 -0
- package/dist/init/index.js +59 -0
- package/dist/init/interview-loop.js +103 -0
- package/dist/init/parse-assistant.js +50 -0
- package/dist/init/project-payload.js +78 -0
- package/dist/init/promptpile-run.js +80 -0
- package/dist/init/prompts.js +16 -0
- package/dist/init/read-user-input.js +44 -0
- package/dist/init/scaffold.js +66 -0
- package/dist/init/session.js +98 -0
- package/dist/init/types.js +2 -0
- package/dist/next/index.js +79 -0
- package/dist/next/inspect.js +90 -0
- package/dist/play/ai.js +11 -0
- package/dist/play/event-loop.js +244 -0
- package/dist/play/guard.js +14 -0
- package/dist/play/index.js +21 -0
- package/dist/play/parse-assistant.js +39 -0
- package/dist/play/player-context.js +20 -0
- package/dist/play/prompts.js +9 -0
- package/dist/play/session.js +14 -0
- package/dist/play/state.js +117 -0
- package/dist/play/types.js +2 -0
- package/dist/play/validate.js +156 -0
- package/dist/revise/apply-payload.js +58 -0
- package/dist/revise/bin-resolve.js +38 -0
- package/dist/revise/constants.js +17 -0
- package/dist/revise/dialogue-loop.js +116 -0
- package/dist/revise/diff.js +24 -0
- package/dist/revise/file-hash.js +27 -0
- package/dist/revise/finalize.js +23 -0
- package/dist/revise/guard.js +17 -0
- package/dist/revise/index.js +24 -0
- package/dist/revise/mcp-gateway.js +74 -0
- package/dist/revise/mcp-tools.js +91 -0
- package/dist/revise/parse-assistant.js +41 -0
- package/dist/revise/parse-payload.js +22 -0
- package/dist/revise/process-run.js +77 -0
- package/dist/revise/project-payload.js +62 -0
- package/dist/revise/promptpile-loop.js +41 -0
- package/dist/revise/prompts.js +16 -0
- package/dist/revise/read-user-input.js +35 -0
- package/dist/revise/session.js +119 -0
- package/dist/revise/types.js +2 -0
- package/dist/revise/validate-payload.js +47 -0
- package/dist/settle/ai.js +23 -0
- package/dist/settle/apply.js +58 -0
- package/dist/settle/context.js +69 -0
- package/dist/settle/derive.js +56 -0
- package/dist/settle/guard.js +71 -0
- package/dist/settle/index.js +105 -0
- package/dist/settle/parse-assistant.js +14 -0
- package/dist/settle/parse-payload.js +19 -0
- package/dist/settle/project.js +58 -0
- package/dist/settle/session.js +45 -0
- package/dist/settle/types.js +2 -0
- package/dist/settle/validate.js +100 -0
- package/dist/shared/filtered-stream-output.js +41 -0
- package/dist/shared/promptpile-stream.js +59 -0
- package/dist/shared/run-promptpile-with-stream.js +34 -0
- package/dist/utils/loading.js +54 -0
- package/package.json +39 -0
- package/prompts/README.md +39 -0
- package/prompts/choice.system.md +0 -0
- package/prompts/daily-dialogue.system.md +37 -0
- package/prompts/daily-finalize-plan.system.md +34 -0
- package/prompts/daily-intent-router.system.md +34 -0
- package/prompts/day-planner.system.md +0 -0
- package/prompts/day-summarizer.system.md +0 -0
- package/prompts/dialogue.system.md +0 -0
- package/prompts/diary-writer.system.md +0 -0
- package/prompts/event-runner.system.md +0 -0
- package/prompts/init-finalize.system.md +59 -0
- package/prompts/init-interviewer.system.md +37 -0
- package/prompts/memory-updater.system.md +0 -0
- package/prompts/next-day-seeder.system.md +0 -0
- package/prompts/play-event-dialogue.system.md +20 -0
- package/prompts/play-event-generator.system.md +19 -0
- package/prompts/play-event-resolver.system.md +26 -0
- package/prompts/play-replanner.system.md +21 -0
- package/prompts/revise-dialogue.system.md +22 -0
- package/prompts/revise-finalize.system.md +40 -0
- package/prompts/settle.system.md +28 -0
- package/prompts/spec.md +320 -0
- package/prompts/state-resolver.system.md +0 -0
package/README.md
ADDED
|
@@ -0,0 +1,1146 @@
|
|
|
1
|
+
|
|
2
|
+
# dayloom 项目设计文档
|
|
3
|
+
|
|
4
|
+
## 1. 项目概述
|
|
5
|
+
|
|
6
|
+
**dayloom** 是一个以“天”为推进单位的 AI 生活模拟与日记生成项目。
|
|
7
|
+
|
|
8
|
+
用户每天输入“今天想做什么”,系统根据当前世界状态、人物关系、场景记忆、长期剧情线和随机事件规则,生成当天的事件流程。用户在事件中通过选择或自由输入行为参与推进。一天结束后,AI 根据当天发生的事件生成日记,并更新人物、场景、事件、剧情线和世界状态,然后进入下一天。
|
|
9
|
+
|
|
10
|
+
它不是传统聊天机器人,也不是普通日记软件,而是一个由 AI 驱动的 **日常生活叙事模拟器**。
|
|
11
|
+
|
|
12
|
+
一句话定位:
|
|
13
|
+
|
|
14
|
+
> dayloom 是一个以文件系统为状态存储、以每日事件为推进单位、以日记为结算结果的 AI 生活模拟引擎。
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## 2. 核心理念
|
|
19
|
+
|
|
20
|
+
dayloom 的核心不是“聊天”,而是“按天推进的叙事状态机”。
|
|
21
|
+
|
|
22
|
+
用户不是持续和 AI 对话,而是每天给出一个意图:
|
|
23
|
+
|
|
24
|
+
```text
|
|
25
|
+
今天我要做什么?
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
系统根据这个意图生成一天中的事件、对话、行为分支和结果。一天结束后,系统会沉淀出:
|
|
29
|
+
|
|
30
|
+
* 用户视角的日记
|
|
31
|
+
* 客观事件记录
|
|
32
|
+
* 人物关系变化
|
|
33
|
+
* 场景记忆变化
|
|
34
|
+
* 长期剧情推进
|
|
35
|
+
* 明日事件种子
|
|
36
|
+
|
|
37
|
+
核心循环如下:
|
|
38
|
+
|
|
39
|
+
```text
|
|
40
|
+
用户今日计划
|
|
41
|
+
↓
|
|
42
|
+
AI 生成当天事件大纲
|
|
43
|
+
↓
|
|
44
|
+
用户参与事件选择或自由行动
|
|
45
|
+
↓
|
|
46
|
+
AI 推进对话、行为和结果
|
|
47
|
+
↓
|
|
48
|
+
当天结束
|
|
49
|
+
↓
|
|
50
|
+
AI 生成日记
|
|
51
|
+
↓
|
|
52
|
+
更新人物、场景、事件、剧情线和世界状态
|
|
53
|
+
↓
|
|
54
|
+
进入下一天
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## 3. 项目目标
|
|
60
|
+
|
|
61
|
+
dayloom 的目标是构建一个长期可推进、状态可追溯、人物关系连续、事件因果稳定的 AI 叙事系统。
|
|
62
|
+
|
|
63
|
+
核心目标包括:
|
|
64
|
+
|
|
65
|
+
1. **以天为单位推进世界**
|
|
66
|
+
|
|
67
|
+
每一天都是一个完整的叙事循环,有开始、事件、选择、结果和结算。
|
|
68
|
+
|
|
69
|
+
2. **让用户低成本参与叙事**
|
|
70
|
+
|
|
71
|
+
用户不需要写长篇剧情,只需要输入当天计划,并在关键事件中做选择或输入行为。
|
|
72
|
+
|
|
73
|
+
3. **保持长期状态连续性**
|
|
74
|
+
|
|
75
|
+
人物关系、场景记忆、主线进度、未解决事件和世界状态都需要跨天延续。
|
|
76
|
+
|
|
77
|
+
4. **以文件系统作为状态存储**
|
|
78
|
+
|
|
79
|
+
所有重要状态都以 Markdown、YAML、JSONL 等可读文件保存,方便查看、编辑、回滚、同步和版本控制。
|
|
80
|
+
|
|
81
|
+
5. **让日记成为叙事结算结果**
|
|
82
|
+
|
|
83
|
+
日记不是用户手写的输入,而是 AI 根据当天事件生成的人类可读存档。
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## 4. 非目标
|
|
88
|
+
|
|
89
|
+
dayloom 第一阶段不追求成为完整游戏引擎,也不追求复杂图形界面。
|
|
90
|
+
|
|
91
|
+
暂不作为核心目标的内容:
|
|
92
|
+
|
|
93
|
+
* 大型开放世界地图
|
|
94
|
+
* 实时多人联机
|
|
95
|
+
* 高复杂数值战斗系统
|
|
96
|
+
* 复杂动画或 3D 表现
|
|
97
|
+
* 完整视觉小说编辑器
|
|
98
|
+
* 面向所有题材的通用 RPG 引擎
|
|
99
|
+
* 强制绑定某一个大模型服务
|
|
100
|
+
|
|
101
|
+
dayloom 的优先级应该是:
|
|
102
|
+
|
|
103
|
+
```text
|
|
104
|
+
状态连续性 > 事件推进质量 > 日记沉淀质量 > UI 表现
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## 5. 与同类项目的区别
|
|
110
|
+
|
|
111
|
+
### 5.1 与 SillyTavern 的区别
|
|
112
|
+
|
|
113
|
+
SillyTavern 的中心是角色聊天。
|
|
114
|
+
|
|
115
|
+
dayloom 的中心是每日推进。
|
|
116
|
+
|
|
117
|
+
SillyTavern 的基本单位是:
|
|
118
|
+
|
|
119
|
+
```text
|
|
120
|
+
一轮对话
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
dayloom 的基本单位是:
|
|
124
|
+
|
|
125
|
+
```text
|
|
126
|
+
一天
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
SillyTavern 更适合角色扮演聊天;dayloom 更适合长期生活模拟、事件推进和日记式存档。
|
|
130
|
+
|
|
131
|
+
### 5.2 与 AI Dungeon 的区别
|
|
132
|
+
|
|
133
|
+
AI Dungeon 偏向即时冒险叙事。
|
|
134
|
+
|
|
135
|
+
dayloom 更强调:
|
|
136
|
+
|
|
137
|
+
* 每日结构
|
|
138
|
+
* 日记结算
|
|
139
|
+
* 人物关系连续性
|
|
140
|
+
* 场景状态积累
|
|
141
|
+
* 文件系统存档
|
|
142
|
+
* 可回放的状态变更
|
|
143
|
+
|
|
144
|
+
dayloom 不是无限向前生成文本,而是每天完成一次可追踪的状态提交。
|
|
145
|
+
|
|
146
|
+
### 5.3 与普通 AI 日记的区别
|
|
147
|
+
|
|
148
|
+
普通 AI 日记通常是用户写日记,AI 帮助总结或分析。
|
|
149
|
+
|
|
150
|
+
dayloom 中,用户输入的是“今日计划”,AI 负责把这一天演化为事件。日记是一天结束后的生成结果。
|
|
151
|
+
|
|
152
|
+
```text
|
|
153
|
+
普通 AI 日记:用户记录生活,AI 总结生活。
|
|
154
|
+
dayloom:用户输入意图,AI 推演生活,并生成日记。
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## 6. 核心体验
|
|
160
|
+
|
|
161
|
+
dayloom 的核心体验分为四步。
|
|
162
|
+
|
|
163
|
+
### 6.1 晨间计划
|
|
164
|
+
|
|
165
|
+
用户输入今天想做什么。
|
|
166
|
+
|
|
167
|
+
示例:
|
|
168
|
+
|
|
169
|
+
```text
|
|
170
|
+
今天上午去上课,下午去图书馆复习,晚上想找林雨聊一下。
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
系统读取当前状态后,生成当天事件大纲。
|
|
174
|
+
|
|
175
|
+
### 6.2 当天事件
|
|
176
|
+
|
|
177
|
+
系统将一天拆成多个事件。
|
|
178
|
+
|
|
179
|
+
示例:
|
|
180
|
+
|
|
181
|
+
```text
|
|
182
|
+
事件 1:上午课程
|
|
183
|
+
事件 2:课后老师提醒考试范围变化
|
|
184
|
+
事件 3:下午图书馆复习
|
|
185
|
+
事件 4:林雨出现
|
|
186
|
+
事件 5:晚上回宿舍复盘
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
每个事件包含场景、人物、对话、选项和可能的状态变化。
|
|
190
|
+
|
|
191
|
+
### 6.3 用户行动
|
|
192
|
+
|
|
193
|
+
用户可以通过两种方式参与事件:
|
|
194
|
+
|
|
195
|
+
1. 选择系统给出的行为分支
|
|
196
|
+
2. 自由输入自己的行为
|
|
197
|
+
|
|
198
|
+
示例:
|
|
199
|
+
|
|
200
|
+
```text
|
|
201
|
+
我走到林雨旁边,把自己的笔记推给她,说如果不介意可以一起看。
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
系统根据用户行为推演人物反应、事件结果和状态变化。
|
|
205
|
+
|
|
206
|
+
### 6.4 日终结算
|
|
207
|
+
|
|
208
|
+
所有事件完成后,系统生成当天日记,并更新状态。
|
|
209
|
+
|
|
210
|
+
日终结算包括:
|
|
211
|
+
|
|
212
|
+
* 今日客观总结
|
|
213
|
+
* 用户视角日记
|
|
214
|
+
* 人物状态更新
|
|
215
|
+
* 场景记忆更新
|
|
216
|
+
* 剧情线进度更新
|
|
217
|
+
* 未解决线索更新
|
|
218
|
+
* 明日事件种子生成
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
## 7. 核心概念
|
|
223
|
+
|
|
224
|
+
### 7.1 World:世界
|
|
225
|
+
|
|
226
|
+
一个 World 是一个完整的叙事存档。
|
|
227
|
+
|
|
228
|
+
每个 World 拥有独立的:
|
|
229
|
+
|
|
230
|
+
* 世界设定
|
|
231
|
+
* 当前日期
|
|
232
|
+
* 人物列表
|
|
233
|
+
* 场景列表
|
|
234
|
+
* 剧情线
|
|
235
|
+
* 历史事件
|
|
236
|
+
* 日记记录
|
|
237
|
+
* 长期记忆
|
|
238
|
+
|
|
239
|
+
用户可以创建多个世界,例如:
|
|
240
|
+
|
|
241
|
+
* 校园生活世界
|
|
242
|
+
* 职场成长世界
|
|
243
|
+
* 末日生存世界
|
|
244
|
+
* 恋爱模拟世界
|
|
245
|
+
* 奇幻冒险世界
|
|
246
|
+
|
|
247
|
+
### 7.2 Day:天
|
|
248
|
+
|
|
249
|
+
Day 是 dayloom 的核心推进单位。
|
|
250
|
+
|
|
251
|
+
每一天包含:
|
|
252
|
+
|
|
253
|
+
* 用户今日计划
|
|
254
|
+
* AI 生成的事件大纲
|
|
255
|
+
* 当天事件列表
|
|
256
|
+
* 当天时间线
|
|
257
|
+
* 日终总结
|
|
258
|
+
* 日记
|
|
259
|
+
* 状态补丁
|
|
260
|
+
* 明日种子
|
|
261
|
+
|
|
262
|
+
每一天都可以看作一次“叙事提交”。
|
|
263
|
+
|
|
264
|
+
### 7.3 Event:事件
|
|
265
|
+
|
|
266
|
+
Event 是一天中的具体互动单元。
|
|
267
|
+
|
|
268
|
+
一个事件通常包含:
|
|
269
|
+
|
|
270
|
+
* 事件标题
|
|
271
|
+
* 发生时间
|
|
272
|
+
* 发生地点
|
|
273
|
+
* 参与人物
|
|
274
|
+
* 触发原因
|
|
275
|
+
* 场景描写
|
|
276
|
+
* 对话内容
|
|
277
|
+
* 用户选择
|
|
278
|
+
* 用户自由行为
|
|
279
|
+
* 事件结果
|
|
280
|
+
* 状态变化
|
|
281
|
+
|
|
282
|
+
事件是状态变化的最小来源。
|
|
283
|
+
|
|
284
|
+
### 7.4 Character:人物
|
|
285
|
+
|
|
286
|
+
人物是长期状态的核心载体。
|
|
287
|
+
|
|
288
|
+
每个人物应该拥有:
|
|
289
|
+
|
|
290
|
+
* 基础信息
|
|
291
|
+
* 性格设定
|
|
292
|
+
* 当前情绪
|
|
293
|
+
* 当前目标
|
|
294
|
+
* 与主角的关系
|
|
295
|
+
* 与其他人物的关系
|
|
296
|
+
* 长期记忆
|
|
297
|
+
* 事件时间线
|
|
298
|
+
* 隐藏动机
|
|
299
|
+
|
|
300
|
+
人物不应该每次事件都重新生成,而应该根据自己的状态持续行动。
|
|
301
|
+
|
|
302
|
+
### 7.5 Scene:场景
|
|
303
|
+
|
|
304
|
+
场景不是简单背景,而是可以积累记忆的叙事空间。
|
|
305
|
+
|
|
306
|
+
场景可以拥有:
|
|
307
|
+
|
|
308
|
+
* 基础描述
|
|
309
|
+
* 常出现人物
|
|
310
|
+
* 可触发事件
|
|
311
|
+
* 场景氛围
|
|
312
|
+
* 历史事件
|
|
313
|
+
* 进入条件
|
|
314
|
+
* 时间限制
|
|
315
|
+
|
|
316
|
+
例如“图书馆”可以积累主角与林雨多次互动的记忆,从而成为后续关系推进的重要地点。
|
|
317
|
+
|
|
318
|
+
### 7.6 Arc:剧情线
|
|
319
|
+
|
|
320
|
+
剧情线用于管理长期目标和长期冲突。
|
|
321
|
+
|
|
322
|
+
例如:
|
|
323
|
+
|
|
324
|
+
* 期末考试线
|
|
325
|
+
* 和林雨的关系线
|
|
326
|
+
* 社团比赛线
|
|
327
|
+
* 工作项目线
|
|
328
|
+
* 家庭压力线
|
|
329
|
+
|
|
330
|
+
每条剧情线都应该有当前阶段、进度、风险、下一触发点和历史记录。
|
|
331
|
+
|
|
332
|
+
### 7.7 Memory:记忆
|
|
333
|
+
|
|
334
|
+
记忆是对历史事件的压缩理解。
|
|
335
|
+
|
|
336
|
+
dayloom 中至少需要三类记忆:
|
|
337
|
+
|
|
338
|
+
1. **短期记忆**
|
|
339
|
+
|
|
340
|
+
最近几天发生的事情,用于维持近期连续性。
|
|
341
|
+
|
|
342
|
+
2. **长期记忆**
|
|
343
|
+
|
|
344
|
+
稳定的角色特征、关系模式、重要经历和反复出现的问题。
|
|
345
|
+
|
|
346
|
+
3. **结构化事实**
|
|
347
|
+
|
|
348
|
+
可以被程序和 AI 稳定引用的事实,例如人物身份、考试日期、场景关系等。
|
|
349
|
+
|
|
350
|
+
---
|
|
351
|
+
|
|
352
|
+
## 8. 文件系统存储设计
|
|
353
|
+
|
|
354
|
+
dayloom 使用文件系统作为状态存储。
|
|
355
|
+
|
|
356
|
+
面向 AI 的人物、场景和剧情线语义上下文使用 Markdown;YAML 只保留索引、状态、补丁和少量机器可读元数据。
|
|
357
|
+
|
|
358
|
+
推荐目录结构如下:
|
|
359
|
+
|
|
360
|
+
```text
|
|
361
|
+
world_0001/
|
|
362
|
+
manifest.yaml
|
|
363
|
+
current.yaml
|
|
364
|
+
config.yaml
|
|
365
|
+
|
|
366
|
+
canon/
|
|
367
|
+
premise.md
|
|
368
|
+
rules.md
|
|
369
|
+
style.md
|
|
370
|
+
user_role.md
|
|
371
|
+
|
|
372
|
+
state/
|
|
373
|
+
world.yaml
|
|
374
|
+
calendar.yaml
|
|
375
|
+
progress.yaml
|
|
376
|
+
variables.yaml
|
|
377
|
+
|
|
378
|
+
characters/
|
|
379
|
+
index.yaml
|
|
380
|
+
char_main/
|
|
381
|
+
profile.md
|
|
382
|
+
relationships.md
|
|
383
|
+
meta.yaml
|
|
384
|
+
memory.md
|
|
385
|
+
timeline.md
|
|
386
|
+
char_lin_yu/
|
|
387
|
+
profile.md
|
|
388
|
+
relationships.md
|
|
389
|
+
meta.yaml
|
|
390
|
+
memory.md
|
|
391
|
+
timeline.md
|
|
392
|
+
|
|
393
|
+
scenes/
|
|
394
|
+
index.yaml
|
|
395
|
+
school_library/
|
|
396
|
+
profile.md
|
|
397
|
+
meta.yaml
|
|
398
|
+
memory.md
|
|
399
|
+
triggers.yaml
|
|
400
|
+
timeline.md
|
|
401
|
+
|
|
402
|
+
arcs/
|
|
403
|
+
index.yaml
|
|
404
|
+
exam_arc/
|
|
405
|
+
profile.md
|
|
406
|
+
meta.yaml
|
|
407
|
+
progress.yaml
|
|
408
|
+
timeline.md
|
|
409
|
+
|
|
410
|
+
days/
|
|
411
|
+
day_0001/
|
|
412
|
+
meta.yaml
|
|
413
|
+
morning_plan.md
|
|
414
|
+
day_outline.yaml
|
|
415
|
+
timeline.md
|
|
416
|
+
events/
|
|
417
|
+
event_001/
|
|
418
|
+
event.yaml
|
|
419
|
+
scene.md
|
|
420
|
+
dialogue.md
|
|
421
|
+
choices.yaml
|
|
422
|
+
user_action.md
|
|
423
|
+
result.yaml
|
|
424
|
+
state_patch.yaml
|
|
425
|
+
ending/
|
|
426
|
+
objective_summary.md
|
|
427
|
+
diary.md
|
|
428
|
+
state_patch.yaml
|
|
429
|
+
next_day_seed.yaml
|
|
430
|
+
|
|
431
|
+
memory/
|
|
432
|
+
short_term.md
|
|
433
|
+
long_term.md
|
|
434
|
+
facts.yaml
|
|
435
|
+
unresolved_threads.yaml
|
|
436
|
+
important_events.yaml
|
|
437
|
+
|
|
438
|
+
logs/
|
|
439
|
+
state_changes.jsonl
|
|
440
|
+
generation_trace.md
|
|
441
|
+
errors.md
|
|
442
|
+
|
|
443
|
+
exports/
|
|
444
|
+
diaries/
|
|
445
|
+
summaries/
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
### 8.1 days 是历史
|
|
449
|
+
|
|
450
|
+
`days/` 保存已经发生过的事情。
|
|
451
|
+
|
|
452
|
+
这里的内容是历史事实,原则上不应该随意覆盖。
|
|
453
|
+
|
|
454
|
+
### 8.2 state 是当前
|
|
455
|
+
|
|
456
|
+
`state/` 保存当前世界的快照。
|
|
457
|
+
|
|
458
|
+
它反映“现在世界是什么样”。
|
|
459
|
+
|
|
460
|
+
### 8.3 memory 是理解
|
|
461
|
+
|
|
462
|
+
`memory/` 保存 AI 对历史的压缩理解。
|
|
463
|
+
|
|
464
|
+
它可以被重算、修正和压缩。
|
|
465
|
+
|
|
466
|
+
### 8.4 logs 是可追溯变更
|
|
467
|
+
|
|
468
|
+
`logs/` 用于记录状态变化、生成过程和错误信息。
|
|
469
|
+
|
|
470
|
+
它是调试和回放的重要依据。
|
|
471
|
+
|
|
472
|
+
---
|
|
473
|
+
|
|
474
|
+
## 9. 状态更新原则
|
|
475
|
+
|
|
476
|
+
dayloom 的状态更新应该遵循几个原则。
|
|
477
|
+
|
|
478
|
+
### 9.1 原始输入不可覆盖
|
|
479
|
+
|
|
480
|
+
用户输入的今日计划和用户在事件中的自由行为必须保留原文。
|
|
481
|
+
|
|
482
|
+
例如:
|
|
483
|
+
|
|
484
|
+
* `morning_plan.md`
|
|
485
|
+
* `user_action.md`
|
|
486
|
+
|
|
487
|
+
这些文件是用户真实输入,不能被 AI 改写。
|
|
488
|
+
|
|
489
|
+
### 9.2 AI 结果可以修正
|
|
490
|
+
|
|
491
|
+
AI 生成的摘要、标签、人物记忆、场景记忆可以重算。
|
|
492
|
+
|
|
493
|
+
例如:
|
|
494
|
+
|
|
495
|
+
* `memory/short_term.md`
|
|
496
|
+
* `characters/*/memory.md`
|
|
497
|
+
* `scenes/*/memory.md`
|
|
498
|
+
|
|
499
|
+
这些是派生结果,不应当和原始历史混为一谈。
|
|
500
|
+
|
|
501
|
+
### 9.3 状态变化先写补丁
|
|
502
|
+
|
|
503
|
+
事件结束后,不应该直接修改所有全局文件,而应该先写入事件级 `state_patch.yaml`。
|
|
504
|
+
|
|
505
|
+
一天结束后,再合并所有事件补丁,生成日级 `state_patch.yaml`。
|
|
506
|
+
|
|
507
|
+
最后由状态更新器应用这些补丁到人物、场景、剧情线和世界状态中。
|
|
508
|
+
|
|
509
|
+
这样可以实现:
|
|
510
|
+
|
|
511
|
+
* 状态变化可追溯
|
|
512
|
+
* 事件结果可回滚
|
|
513
|
+
* 生成错误可定位
|
|
514
|
+
* 历史可以重放
|
|
515
|
+
|
|
516
|
+
### 9.4 一天是一笔事务
|
|
517
|
+
|
|
518
|
+
dayloom 中的一天可以看作一次事务。
|
|
519
|
+
|
|
520
|
+
流程如下:
|
|
521
|
+
|
|
522
|
+
```text
|
|
523
|
+
开始 day_0001
|
|
524
|
+
↓
|
|
525
|
+
写入 morning_plan.md
|
|
526
|
+
↓
|
|
527
|
+
生成 day_outline.yaml
|
|
528
|
+
↓
|
|
529
|
+
执行 event_001
|
|
530
|
+
↓
|
|
531
|
+
执行 event_002
|
|
532
|
+
↓
|
|
533
|
+
执行 event_003
|
|
534
|
+
↓
|
|
535
|
+
生成 ending/diary.md
|
|
536
|
+
↓
|
|
537
|
+
生成 ending/state_patch.yaml
|
|
538
|
+
↓
|
|
539
|
+
应用状态更新
|
|
540
|
+
↓
|
|
541
|
+
current.yaml 指向 day_0002
|
|
542
|
+
结束 day_0001
|
|
543
|
+
```
|
|
544
|
+
|
|
545
|
+
如果中途失败,可以从当前事件恢复。
|
|
546
|
+
|
|
547
|
+
---
|
|
548
|
+
|
|
549
|
+
## 10. AI 模块设计
|
|
550
|
+
|
|
551
|
+
dayloom 不应该使用一个 Prompt 处理所有事情,而应该拆成多个 AI 模块。
|
|
552
|
+
|
|
553
|
+
### 10.1 Day Planner
|
|
554
|
+
|
|
555
|
+
负责根据用户今日计划和当前状态生成当天事件大纲。
|
|
556
|
+
|
|
557
|
+
输入:
|
|
558
|
+
|
|
559
|
+
* 用户今日计划
|
|
560
|
+
* 当前世界状态
|
|
561
|
+
* 短期记忆
|
|
562
|
+
* 活跃剧情线
|
|
563
|
+
* 明日事件种子
|
|
564
|
+
|
|
565
|
+
输出:
|
|
566
|
+
|
|
567
|
+
* 当天事件列表
|
|
568
|
+
* 每个事件的大致时间
|
|
569
|
+
* 事件类型
|
|
570
|
+
* 参与人物
|
|
571
|
+
* 触发原因
|
|
572
|
+
|
|
573
|
+
### 10.2 Event Runner
|
|
574
|
+
|
|
575
|
+
负责执行单个事件。
|
|
576
|
+
|
|
577
|
+
输入:
|
|
578
|
+
|
|
579
|
+
* 事件设定
|
|
580
|
+
* 当前场景状态
|
|
581
|
+
* 参与人物状态
|
|
582
|
+
* 相关历史事件
|
|
583
|
+
|
|
584
|
+
输出:
|
|
585
|
+
|
|
586
|
+
* 场景描写
|
|
587
|
+
* 对话
|
|
588
|
+
* 行为选项
|
|
589
|
+
* 等待用户选择或自由输入
|
|
590
|
+
|
|
591
|
+
### 10.3 Dialogue Engine
|
|
592
|
+
|
|
593
|
+
负责生成自然对话。
|
|
594
|
+
|
|
595
|
+
要求:
|
|
596
|
+
|
|
597
|
+
* 符合人物性格
|
|
598
|
+
* 延续人物关系
|
|
599
|
+
* 避免每次重新认识
|
|
600
|
+
* 不要强行推进关系
|
|
601
|
+
* 不要忽略近期冲突
|
|
602
|
+
|
|
603
|
+
### 10.4 Choice Engine
|
|
604
|
+
|
|
605
|
+
负责生成行为分支。
|
|
606
|
+
|
|
607
|
+
行为分支应该包含:
|
|
608
|
+
|
|
609
|
+
* 保守选项
|
|
610
|
+
* 主动选项
|
|
611
|
+
* 回避选项
|
|
612
|
+
* 自定义输入入口
|
|
613
|
+
|
|
614
|
+
不要只提供“正确答案”,要让选择有真实代价。
|
|
615
|
+
|
|
616
|
+
### 10.5 State Resolver
|
|
617
|
+
|
|
618
|
+
负责根据用户行为和事件结果生成状态变化。
|
|
619
|
+
|
|
620
|
+
输出包括:
|
|
621
|
+
|
|
622
|
+
* 人物关系变化
|
|
623
|
+
* 变量变化
|
|
624
|
+
* 场景记忆变化
|
|
625
|
+
* 剧情线进度变化
|
|
626
|
+
* 新事件种子
|
|
627
|
+
* 未解决线索
|
|
628
|
+
|
|
629
|
+
### 10.6 Diary Writer
|
|
630
|
+
|
|
631
|
+
负责在一天结束后生成用户视角日记。
|
|
632
|
+
|
|
633
|
+
要求:
|
|
634
|
+
|
|
635
|
+
* 第一人称
|
|
636
|
+
* 不要像流水账
|
|
637
|
+
* 保留当天关键情绪
|
|
638
|
+
* 体现人物关系变化
|
|
639
|
+
* 适度文学化,但不要夸张
|
|
640
|
+
|
|
641
|
+
### 10.7 Memory Updater
|
|
642
|
+
|
|
643
|
+
负责更新跨天记忆。
|
|
644
|
+
|
|
645
|
+
它应该从当天事件中提取:
|
|
646
|
+
|
|
647
|
+
* 重要事实
|
|
648
|
+
* 关系变化
|
|
649
|
+
* 重复模式
|
|
650
|
+
* 未解决线索
|
|
651
|
+
* 长期记忆候选
|
|
652
|
+
|
|
653
|
+
### 10.8 Next Day Seeder
|
|
654
|
+
|
|
655
|
+
负责生成下一天可能触发的事件种子。
|
|
656
|
+
|
|
657
|
+
例如:
|
|
658
|
+
|
|
659
|
+
* 某人物可能主动联系用户
|
|
660
|
+
* 某场景可能触发后续事件
|
|
661
|
+
* 某条剧情线接近关键节点
|
|
662
|
+
* 某个未解决问题可能继续发酵
|
|
663
|
+
|
|
664
|
+
---
|
|
665
|
+
|
|
666
|
+
## 11. 单日运行流程
|
|
667
|
+
|
|
668
|
+
完整的单日运行流程如下:
|
|
669
|
+
|
|
670
|
+
```text
|
|
671
|
+
1. 读取 current.yaml
|
|
672
|
+
2. 读取世界状态、人物状态、场景状态、剧情线状态
|
|
673
|
+
3. 用户输入 morning_plan.md
|
|
674
|
+
4. Day Planner 生成 day_outline.yaml
|
|
675
|
+
5. 创建当天 events 目录
|
|
676
|
+
6. 执行第一个事件
|
|
677
|
+
7. 用户选择或输入行为
|
|
678
|
+
8. State Resolver 生成事件结果和 state_patch.yaml
|
|
679
|
+
9. 追加当天 timeline.md
|
|
680
|
+
10. 执行下一个事件
|
|
681
|
+
11. 所有事件完成后进入 ending
|
|
682
|
+
12. Diary Writer 生成 diary.md
|
|
683
|
+
13. Memory Updater 生成当天状态补丁
|
|
684
|
+
14. 应用状态补丁到 state、characters、scenes、arcs、memory
|
|
685
|
+
15. Next Day Seeder 生成 next_day_seed.yaml
|
|
686
|
+
16. 更新 current.yaml 到下一天
|
|
687
|
+
```
|
|
688
|
+
|
|
689
|
+
---
|
|
690
|
+
|
|
691
|
+
## 12. 界面设计思路
|
|
692
|
+
|
|
693
|
+
dayloom 的界面不应该只是一个聊天框。
|
|
694
|
+
|
|
695
|
+
更适合的布局是:
|
|
696
|
+
|
|
697
|
+
```text
|
|
698
|
+
左侧:日期 / 时间线 / 世界列表
|
|
699
|
+
中间:当前事件 / 场景描写 / 对话
|
|
700
|
+
右侧:人物状态 / 场景状态 / 今日目标
|
|
701
|
+
底部:用户行为输入框 / 行为选项
|
|
702
|
+
```
|
|
703
|
+
|
|
704
|
+
### 12.1 今日页
|
|
705
|
+
|
|
706
|
+
今日页是主要操作界面。
|
|
707
|
+
|
|
708
|
+
包含:
|
|
709
|
+
|
|
710
|
+
* 当前日期
|
|
711
|
+
* 今日计划
|
|
712
|
+
* 当前事件
|
|
713
|
+
* 事件选项
|
|
714
|
+
* 自定义行为输入
|
|
715
|
+
* 今日进度
|
|
716
|
+
|
|
717
|
+
### 12.2 日记页
|
|
718
|
+
|
|
719
|
+
日记页用于查看每天结束后的日记。
|
|
720
|
+
|
|
721
|
+
包含:
|
|
722
|
+
|
|
723
|
+
* 用户视角日记
|
|
724
|
+
* 客观事件摘要
|
|
725
|
+
* 关键人物变化
|
|
726
|
+
* 关键场景变化
|
|
727
|
+
* 明日伏笔
|
|
728
|
+
|
|
729
|
+
### 12.3 人物页
|
|
730
|
+
|
|
731
|
+
人物页用于查看人物状态。
|
|
732
|
+
|
|
733
|
+
包含:
|
|
734
|
+
|
|
735
|
+
* 人物资料
|
|
736
|
+
* 当前关系
|
|
737
|
+
* 最近事件
|
|
738
|
+
* 长期记忆
|
|
739
|
+
* 与其他人物关系
|
|
740
|
+
|
|
741
|
+
### 12.4 场景页
|
|
742
|
+
|
|
743
|
+
场景页用于查看场景记忆。
|
|
744
|
+
|
|
745
|
+
包含:
|
|
746
|
+
|
|
747
|
+
* 场景描述
|
|
748
|
+
* 常出现人物
|
|
749
|
+
* 可触发事件
|
|
750
|
+
* 历史事件
|
|
751
|
+
* 当前氛围
|
|
752
|
+
|
|
753
|
+
### 12.5 世界状态页
|
|
754
|
+
|
|
755
|
+
世界状态页用于调试和管理。
|
|
756
|
+
|
|
757
|
+
包含:
|
|
758
|
+
|
|
759
|
+
* 当前日期
|
|
760
|
+
* 世界变量
|
|
761
|
+
* 活跃剧情线
|
|
762
|
+
* 未解决线索
|
|
763
|
+
* 明日事件种子
|
|
764
|
+
* 状态变更记录
|
|
765
|
+
|
|
766
|
+
---
|
|
767
|
+
|
|
768
|
+
## 13. MVP 范围
|
|
769
|
+
|
|
770
|
+
第一版应该尽量小,只需要跑通 Day Loop。
|
|
771
|
+
|
|
772
|
+
MVP 功能:
|
|
773
|
+
|
|
774
|
+
1. 创建一个世界
|
|
775
|
+
2. 创建主角和少量 NPC
|
|
776
|
+
3. 用户输入今日计划
|
|
777
|
+
4. AI 生成 3 到 5 个当天事件
|
|
778
|
+
5. 每个事件提供选项和自定义输入
|
|
779
|
+
6. 用户完成所有事件
|
|
780
|
+
7. AI 生成当天日记
|
|
781
|
+
8. AI 生成事件摘要和状态补丁
|
|
782
|
+
9. 更新人物关系和世界状态
|
|
783
|
+
10. 进入下一天
|
|
784
|
+
|
|
785
|
+
MVP 不需要:
|
|
786
|
+
|
|
787
|
+
* 插件系统
|
|
788
|
+
* 图像生成
|
|
789
|
+
* 语音系统
|
|
790
|
+
* 多模型复杂路由
|
|
791
|
+
* 可视化关系图
|
|
792
|
+
* 大规模场景地图
|
|
793
|
+
* 复杂数值系统
|
|
794
|
+
|
|
795
|
+
MVP 成功标准:
|
|
796
|
+
|
|
797
|
+
```text
|
|
798
|
+
连续推进 10 天后,人物关系、场景记忆和剧情线仍然基本一致,没有明显重置感。
|
|
799
|
+
```
|
|
800
|
+
|
|
801
|
+
---
|
|
802
|
+
|
|
803
|
+
## 14. 后续扩展方向
|
|
804
|
+
|
|
805
|
+
### 14.1 多世界支持
|
|
806
|
+
|
|
807
|
+
用户可以创建多个不同题材的世界。
|
|
808
|
+
|
|
809
|
+
例如:
|
|
810
|
+
|
|
811
|
+
* 校园日常
|
|
812
|
+
* 职场成长
|
|
813
|
+
* 恋爱模拟
|
|
814
|
+
* 奇幻冒险
|
|
815
|
+
* 末日生存
|
|
816
|
+
|
|
817
|
+
### 14.2 模型适配层
|
|
818
|
+
|
|
819
|
+
支持不同模型来源:
|
|
820
|
+
|
|
821
|
+
* OpenAI
|
|
822
|
+
* Claude
|
|
823
|
+
* Gemini
|
|
824
|
+
* DeepSeek
|
|
825
|
+
* OpenRouter
|
|
826
|
+
* Ollama
|
|
827
|
+
* LM Studio
|
|
828
|
+
* 本地 OpenAI-compatible API
|
|
829
|
+
|
|
830
|
+
### 14.3 插件系统
|
|
831
|
+
|
|
832
|
+
未来可以扩展:
|
|
833
|
+
|
|
834
|
+
* 图像生成
|
|
835
|
+
* 语音输入
|
|
836
|
+
* TTS
|
|
837
|
+
* 日历接入
|
|
838
|
+
* 待办接入
|
|
839
|
+
* Obsidian 导出
|
|
840
|
+
* Git 版本控制
|
|
841
|
+
* 向量检索
|
|
842
|
+
|
|
843
|
+
### 14.4 记忆检索
|
|
844
|
+
|
|
845
|
+
当历史变多后,不应该把所有文件都塞进上下文。
|
|
846
|
+
|
|
847
|
+
可以引入:
|
|
848
|
+
|
|
849
|
+
* 关键词搜索
|
|
850
|
+
* 语义向量搜索
|
|
851
|
+
* 最近事件窗口
|
|
852
|
+
* 重要事件索引
|
|
853
|
+
* 人物相关记忆检索
|
|
854
|
+
* 场景相关记忆检索
|
|
855
|
+
|
|
856
|
+
### 14.5 状态回滚
|
|
857
|
+
|
|
858
|
+
因为每个事件都有 `state_patch.yaml`,后续可以支持:
|
|
859
|
+
|
|
860
|
+
* 回滚某一天
|
|
861
|
+
* 回滚某个事件
|
|
862
|
+
* 重生成某天日记
|
|
863
|
+
* 修正某个人物关系变化
|
|
864
|
+
* 重放整个世界状态
|
|
865
|
+
|
|
866
|
+
---
|
|
867
|
+
|
|
868
|
+
## 15. 设计风险
|
|
869
|
+
|
|
870
|
+
### 15.1 AI 胡乱推进
|
|
871
|
+
|
|
872
|
+
风险:AI 可能忽略用户计划,强行制造剧情。
|
|
873
|
+
|
|
874
|
+
解决:
|
|
875
|
+
|
|
876
|
+
* 用户计划优先级高于随机事件
|
|
877
|
+
* 随机事件数量可配置
|
|
878
|
+
* 事件生成必须说明触发原因
|
|
879
|
+
* 重要状态变化必须写入补丁
|
|
880
|
+
|
|
881
|
+
### 15.2 人物前后不一致
|
|
882
|
+
|
|
883
|
+
风险:NPC 每天像重新认识用户。
|
|
884
|
+
|
|
885
|
+
解决:
|
|
886
|
+
|
|
887
|
+
* 人物拥有独立 profile、memory、timeline
|
|
888
|
+
* 事件生成前检索相关人物历史
|
|
889
|
+
* 对话生成必须参考人物关系状态
|
|
890
|
+
|
|
891
|
+
### 15.3 状态污染
|
|
892
|
+
|
|
893
|
+
风险:AI 总结错误导致长期状态被污染。
|
|
894
|
+
|
|
895
|
+
解决:
|
|
896
|
+
|
|
897
|
+
* 原始历史和 AI 派生记忆分离
|
|
898
|
+
* 先写 state_patch,再应用状态
|
|
899
|
+
* 允许用户审核关键状态变化
|
|
900
|
+
* 派生记忆可以重算
|
|
901
|
+
|
|
902
|
+
### 15.4 上下文过长
|
|
903
|
+
|
|
904
|
+
风险:天数增加后无法把全部历史放进上下文。
|
|
905
|
+
|
|
906
|
+
解决:
|
|
907
|
+
|
|
908
|
+
* 最近几天直接读取
|
|
909
|
+
* 远期历史通过摘要和检索读取
|
|
910
|
+
* 人物、场景、剧情线各自维护压缩记忆
|
|
911
|
+
* 重要事件进入索引
|
|
912
|
+
|
|
913
|
+
### 15.5 玩法变成流水账
|
|
914
|
+
|
|
915
|
+
风险:每天只是机械生成事件,没有情绪和因果。
|
|
916
|
+
|
|
917
|
+
解决:
|
|
918
|
+
|
|
919
|
+
* 每天必须有至少一个选择点
|
|
920
|
+
* 每个事件需要产生轻微状态变化
|
|
921
|
+
* 长期剧情线需要有阶段目标
|
|
922
|
+
* 未解决线索需要跨天回收
|
|
923
|
+
|
|
924
|
+
---
|
|
925
|
+
|
|
926
|
+
## 16. 推荐开发顺序
|
|
927
|
+
|
|
928
|
+
建议按以下顺序开发:
|
|
929
|
+
|
|
930
|
+
### 阶段一:文件存档协议
|
|
931
|
+
|
|
932
|
+
目标:定义世界目录结构和最小状态格式。
|
|
933
|
+
|
|
934
|
+
内容:
|
|
935
|
+
|
|
936
|
+
* `manifest.yaml`
|
|
937
|
+
* `current.yaml`
|
|
938
|
+
* `state/`
|
|
939
|
+
* `characters/`
|
|
940
|
+
* `days/`
|
|
941
|
+
|
|
942
|
+
### 阶段二:单日流程跑通
|
|
943
|
+
|
|
944
|
+
目标:完成从今日计划到日记生成的闭环。
|
|
945
|
+
|
|
946
|
+
内容:
|
|
947
|
+
|
|
948
|
+
* 输入今日计划
|
|
949
|
+
* 生成事件大纲
|
|
950
|
+
* 执行事件
|
|
951
|
+
* 生成日记
|
|
952
|
+
* 生成状态补丁
|
|
953
|
+
|
|
954
|
+
### 阶段三:人物与场景连续性
|
|
955
|
+
|
|
956
|
+
目标:让人物和场景跨天保持一致。
|
|
957
|
+
|
|
958
|
+
内容:
|
|
959
|
+
|
|
960
|
+
* 人物 profile
|
|
961
|
+
* 人物 memory
|
|
962
|
+
* 场景 memory
|
|
963
|
+
* 事件时间线
|
|
964
|
+
|
|
965
|
+
### 阶段四:剧情线与明日种子
|
|
966
|
+
|
|
967
|
+
目标:让故事具备长期推进感。
|
|
968
|
+
|
|
969
|
+
内容:
|
|
970
|
+
|
|
971
|
+
* arc 管理
|
|
972
|
+
* unresolved_threads
|
|
973
|
+
* next_day_seed
|
|
974
|
+
* progress 更新
|
|
975
|
+
|
|
976
|
+
### 阶段五:检索与压缩记忆
|
|
977
|
+
|
|
978
|
+
目标:解决长周期上下文问题。
|
|
979
|
+
|
|
980
|
+
内容:
|
|
981
|
+
|
|
982
|
+
* 重要事件索引
|
|
983
|
+
* 短期记忆
|
|
984
|
+
* 长期记忆
|
|
985
|
+
* 人物相关检索
|
|
986
|
+
* 场景相关检索
|
|
987
|
+
|
|
988
|
+
### 阶段六:UI 和产品体验
|
|
989
|
+
|
|
990
|
+
目标:让用户真正愿意玩下去。
|
|
991
|
+
|
|
992
|
+
内容:
|
|
993
|
+
|
|
994
|
+
* 今日页
|
|
995
|
+
* 事件页
|
|
996
|
+
* 日记页
|
|
997
|
+
* 人物页
|
|
998
|
+
* 世界状态页
|
|
999
|
+
|
|
1000
|
+
---
|
|
1001
|
+
|
|
1002
|
+
## 17. 项目一句话介绍
|
|
1003
|
+
|
|
1004
|
+
面向用户:
|
|
1005
|
+
|
|
1006
|
+
> 每天输入你想做什么,AI 会把这一天演化成事件、对话和选择,并在一天结束后生成日记,持续推进属于你的生活世界。
|
|
1007
|
+
|
|
1008
|
+
面向开发者:
|
|
1009
|
+
|
|
1010
|
+
> dayloom is a file-based AI life simulation engine that advances narrative state day by day and persists each day as a readable diary and traceable world-state commit.
|
|
1011
|
+
|
|
1012
|
+
面向开源 README:
|
|
1013
|
+
|
|
1014
|
+
> dayloom 是一个文件系统驱动的 AI 日常叙事引擎。它以“天”为单位推进世界,以事件和选择塑造状态,以日记作为每日结算结果,让人物、场景和剧情线在长期运行中持续演化。
|
|
1015
|
+
|
|
1016
|
+
---
|
|
1017
|
+
|
|
1018
|
+
## 18. 总结
|
|
1019
|
+
|
|
1020
|
+
dayloom 的核心不是聊天,不是日记,也不是单纯的游戏。
|
|
1021
|
+
|
|
1022
|
+
它真正要做的是:
|
|
1023
|
+
|
|
1024
|
+
```text
|
|
1025
|
+
把用户的每日意图,转化成可互动的事件;
|
|
1026
|
+
把事件结果,转化成可追溯的状态变化;
|
|
1027
|
+
把一天的经历,转化成可阅读的日记;
|
|
1028
|
+
把连续的日记,转化成一个持续演化的个人世界。
|
|
1029
|
+
```
|
|
1030
|
+
|
|
1031
|
+
最终形态可以概括为:
|
|
1032
|
+
|
|
1033
|
+
> dayloom 是一个以日记为存档格式的人生模拟器。
|
|
1034
|
+
|
|
1035
|
+
---
|
|
1036
|
+
|
|
1037
|
+
## revise:AI 辅助维护 World 设定
|
|
1038
|
+
|
|
1039
|
+
`revise` 默认启动多轮 AI 对话。AI 通过只读 MCP 工具检索当前 World;只有用户输入 `/apply` 并确认 diff 后,Day Loom 才会备份并写盘。
|
|
1040
|
+
|
|
1041
|
+
```bash
|
|
1042
|
+
dayloom revise -d ./path/to/world
|
|
1043
|
+
```
|
|
1044
|
+
|
|
1045
|
+
会话命令:
|
|
1046
|
+
|
|
1047
|
+
```text
|
|
1048
|
+
/pending 查看待修改意图
|
|
1049
|
+
/apply 生成最终提案并确认应用
|
|
1050
|
+
/cancel 放弃并退出
|
|
1051
|
+
/exit 保留 session 草稿并退出
|
|
1052
|
+
```
|
|
1053
|
+
|
|
1054
|
+
交互模式需要:
|
|
1055
|
+
|
|
1056
|
+
- `DEEPSEEK_API_KEY`
|
|
1057
|
+
- 可用的 `promptpile-mcp` CLI。可设置 `PROMPTPILE_MCP_BIN`,或先在仓库的 `promptpile-mcp` 中安装依赖并构建。
|
|
1058
|
+
- 默认 MCP Server 使用 `npx -y @modelcontextprotocol/server-filesystem <world_root>`。也可设置 `DAY_LOOM_FILESYSTEM_MCP_BIN` 指向已安装包的 `dist/index.js`,避免每次通过 `npx` 解析。
|
|
1059
|
+
|
|
1060
|
+
也可以连接已运行的网关:
|
|
1061
|
+
|
|
1062
|
+
```bash
|
|
1063
|
+
dayloom revise \
|
|
1064
|
+
-d ./path/to/world \
|
|
1065
|
+
--mcp-base-url http://127.0.0.1:8765
|
|
1066
|
+
```
|
|
1067
|
+
|
|
1068
|
+
自动化测试可绕过 AI:
|
|
1069
|
+
|
|
1070
|
+
```bash
|
|
1071
|
+
dayloom revise \
|
|
1072
|
+
-d ./path/to/world \
|
|
1073
|
+
--proposal ./proposal.json \
|
|
1074
|
+
--dry-run
|
|
1075
|
+
```
|
|
1076
|
+
|
|
1077
|
+
---
|
|
1078
|
+
|
|
1079
|
+
## daily:主角视角的当日计划
|
|
1080
|
+
|
|
1081
|
+
`daily` 用于制定当前 day 的初步计划。它会通过主角视角投影目录回答用户问题和收集今日意图;AI 不能读取完整 World,只能读取投影后的公开/已知信息。
|
|
1082
|
+
|
|
1083
|
+
```bash
|
|
1084
|
+
dayloom daily -d ./path/to/world
|
|
1085
|
+
```
|
|
1086
|
+
|
|
1087
|
+
会话命令:
|
|
1088
|
+
|
|
1089
|
+
```text
|
|
1090
|
+
/pending 查看当前计划草稿
|
|
1091
|
+
/start 生成初步 DailyPlan 并写入 days/day_NNNN/
|
|
1092
|
+
/cancel 放弃并退出
|
|
1093
|
+
/exit 保留 session 草稿并退出
|
|
1094
|
+
```
|
|
1095
|
+
|
|
1096
|
+
`/start` 成功后会写入:
|
|
1097
|
+
|
|
1098
|
+
```text
|
|
1099
|
+
days/day_NNNN/meta.yaml
|
|
1100
|
+
days/day_NNNN/plan.user.md
|
|
1101
|
+
days/day_NNNN/plan.initial.json
|
|
1102
|
+
days/day_NNNN/dialogue/plan-transcript.md
|
|
1103
|
+
```
|
|
1104
|
+
|
|
1105
|
+
自动化测试可使用 proposal 模式,不依赖 AI 或 MCP:
|
|
1106
|
+
|
|
1107
|
+
```bash
|
|
1108
|
+
dayloom daily \
|
|
1109
|
+
-d ./path/to/world \
|
|
1110
|
+
--proposal ./daily-plan.json \
|
|
1111
|
+
--dry-run
|
|
1112
|
+
```
|
|
1113
|
+
|
|
1114
|
+
第一版只生成方向性 `planned_beats`,不会生成具体事件、日记,也不会修改人物或场景记忆。
|
|
1115
|
+
|
|
1116
|
+
---
|
|
1117
|
+
|
|
1118
|
+
## play:逐事件执行当日计划
|
|
1119
|
+
|
|
1120
|
+
`play` 读取 `daily` 已生成的 `plan.initial.json`,一次只生成并执行一个事件。事件结算后,AI 会依据真实结果完成、取消、修改或插入后续 beat,因此后续事件不会预先写死。
|
|
1121
|
+
|
|
1122
|
+
```bash
|
|
1123
|
+
dayloom play -d ./path/to/world
|
|
1124
|
+
```
|
|
1125
|
+
|
|
1126
|
+
运行条件:
|
|
1127
|
+
|
|
1128
|
+
- 当前 World 的 `phase` 必须是 `planned` 或 `playing`
|
|
1129
|
+
- 已设置 `DEEPSEEK_API_KEY`
|
|
1130
|
+
- MCP / promptpile 依赖与 `daily` 相同
|
|
1131
|
+
|
|
1132
|
+
事件内支持多行自由输入。输入 `/status` 查看当前事件定义,输入 `/end-day` 立即结束当天并进入结算,输入 `/exit` 保存进度并退出;再次运行相同命令会从持久化步骤继续。
|
|
1133
|
+
|
|
1134
|
+
主要状态文件:
|
|
1135
|
+
|
|
1136
|
+
```text
|
|
1137
|
+
days/day_NNNN/plan.current.json
|
|
1138
|
+
days/day_NNNN/play.state.json
|
|
1139
|
+
days/day_NNNN/runtime.state.json
|
|
1140
|
+
days/day_NNNN/events/event_NNN/event.json
|
|
1141
|
+
days/day_NNNN/events/event_NNN/transcript.md
|
|
1142
|
+
days/day_NNNN/events/event_NNN/result.json
|
|
1143
|
+
days/day_NNNN/events/event_NNN/replan.json
|
|
1144
|
+
```
|
|
1145
|
+
|
|
1146
|
+
每个事件按 `生成 -> 交互 -> 结算 -> 重排` 推进。状态补丁和重排操作带有 applied 标记,进程中断后恢复时不会重复应用。所有 beat 完成或取消后,World 与当日 phase 会进入 `settling`,等待后续日终结算命令处理。
|