Codex 日报:2026-07-01
围绕 lana-storybook 的 AIRP engine 拆包、Chat 页面重构、World Editor 与 world.json 数据模型收敛展开的一天。
CodexpnpmNext.jsVitestESLintlana-storybook
今日概览
今天的工作集中在 /Users/lingc/Projects/nextjs/lana-storybook。主线是把 roleplay/AIRP engine 从应用层拆出来,整理 Chat 页面和 engine 的数据边界,并把 world.json 的编辑能力做成可视化工具。
整体上,项目从“功能堆在 app/lib 里”进一步变成了更清晰的 workspace 结构:engine 有独立包,Chat UI 被拆成更小的组件,World Editor 能直接编辑世界数据,schema 也去掉了一批重复字段和旧兼容路径。
时间线
| 时间 | 会话 / 主题 | 结果 |
|---|---|---|
| 15:16 | 开始 AIRP 拆包目标 | 创建持续目标:把 lib 里的 AIRP 相关代码移到独立 engine 包。该短会话很快结束,后续工作在 15:20 的会话中继续。 |
| 15:20 | AIRP engine 拆包与 engine 内部重构 | 新增 packages/engine 和 @lana-storybook/engine,迁移 roleplay engine 代码,拆分 prompt / llm / shared 模块,补 engine 测试,并通过 pnpm test、pnpm lint、pnpm build。 |
| 15:20-16:50 | Chat / engine 行为清理 | 收紧 private prompt 数据边界,删除 Author Note、输出侧 max_tokens、PlayerPersona.description,调整 Choices 替换输入框,持久化 draft / choices,移除 Chat navbar。 |
| 16:53 | ChatView 组件拆分 | 将 ChatView.tsx 拆成 ConversationList、MessagePanel、Composer、InspectorPanel,删除 legacy chat 兼容路径,通过类型检查和 eslint。 |
| 20:20 | World Editor 初版 | 新增 /world-editor 和 /api/world-json,支持导入、导出、格式化、保存 world.json,并让保存后的 JSON 同步到 DB 视图。 |
| 20:42 | world / character schema 收敛 | 系统级删除 world avatar / accent、character handle / accent,删除 buildContextFrame 的单角色参数链路,并恢复 Inspector 绿色主题。 |
| 21:02 | Player Intrinsics 与 World Editor 迭代 | 删除 Player Intrinsics required,给 World Editor 增加 Player Intrinsics 可视化编辑,并改成左 sidebar + 右编辑区的两栏布局。 |
| 21:46 | Chat Player Intrinsics schema 同步 | 修复旧 chat 持久化 schema 与当前 world.json 不一致的问题:启动时用当前 world schema 归一化本地 chat 并写回 localStorage。 |
lana-storybook 开发日志
AIRP engine 拆包与内部重构
- 把
llm、prompt-manager、prompt-debug-log、message-filter、roleplay-types、system-prompt、variable-updates从lib移到packages/engine/src。 - 新增
@lana-storybook/engine包,并更新next.config.ts、tsconfig.json、pnpm-workspace.yaml、package.json和 lockfile,让 Next 可以转译本地包。 - 后续将 engine 拆成
packages/engine/src/prompt/、packages/engine/src/llm/和packages/engine/src/shared/text.ts。 - 补充
variable-updates.test.ts、message-filter.test.ts、prompt-manager.test.ts、llm/persona.test.ts、llm/story-choices.test.ts。 - 验证通过:
pnpm test、pnpm lint、pnpm build。
Chat / engine 行为和字段清理
- 收紧前后端边界:前端只拿 public world metadata,私密 prompt 内容由服务端通过
lib/engine-context.ts解析。 - 删除重复的独立
Author Note,保留底层roleplaySettings.directives能力,避免同一内容被重复塞进 prompt。 - 删除输出侧
max_tokens限制,保留输入侧maxInputTokens: 6000;为 story choices 日志增加reasoningContentLength。 - Choices 生成完成后,底部 composer 直接切换为选项按钮;保留重新生成和手动输入入口。
- 移除 Chat 页面顶部 navbar,让聊天布局占满
h-screen。 - 将未发送草稿
pendingDraft和 AI 生成选项storyChoices并入每个 chat 的 localStorage 存储。 - 删除
PlayerPersona.description字段、右侧 Freeform Persona textarea,以及 prompt 注入中的自由描述逻辑。 - 验证多次通过:
pnpm test、pnpm lint、pnpm build。
ChatView 拆分和 legacy 清理
- 将
ChatView.tsx拆成ConversationList.tsx、MessagePanel.tsx、Composer.tsx、InspectorPanel.tsx。 ChatView.tsx降到约 63 行,只做布局编排。- 删除
StoredChat、normalizeVariables和旧 chat 字段兼容路径;readLocalChats只按当前Chat[]格式读取并清洗。 - 搜索确认旧字段如
characterName、loreContext、playerCreatePrompt、Legacy等在app/chat内无残留。 - 验证通过:
tsc --noEmit、针对app/chat的 eslint。
World Editor 初版
- 新增
/world-editor页面,可编辑data/world.json。 - 新增
/api/world-json,支持读取和保存 JSON。 data/world-data.ts从静态 JSON import 改成运行时读取文件,让保存后接口能读到最新内容。lib/db.ts支持保存后同步 characters / lore:移除的角色标记 inactive,lore groups 按 JSON 重建。- 首页增加
Editor入口。 - 验证:
tsc --noEmit和本轮文件 eslint 通过。最终next build一度被 Google Fonts 网络请求阻断,dev server 也因沙盒端口权限无法启动;记录中说明这些是环境限制。
world / character 模型收敛
- 系统级删除 world 的
avatar/accent,删除 character 的handle/accent,保留 characteravatar。 - 更新 engine 类型、prompt context 类型、DB schema / seed sync / API 查询、Chat 本地模型、首页/详情页/Chat UI。
- 增加 SQLite 迁移,从旧
characters表移除handle和accent列。 - 评估
buildContextFrame(chat, character, options)的character参数,确认主路径都传null,随后删除CharacterContext参数链路和character_personalityfallback。 - 修复 Inspector 主题色:删除
world.accent后曾误改为蓝色,恢复固定绿色主题。 - 验证通过:
pnpm test、pnpm lint、pnpm build。
Player Intrinsics 与 World Editor 迭代
- 区分 Player Persona 和 Player Variables:Player Persona 是用户初始输入的多个变量集合;Player Variables 会随剧情变化。
- 删除 Player Intrinsics 模板字段里的
required属性,初始化页和 Inspector 不再显示必填星号。 - World Editor 增加 Player Intrinsics 可视化编辑:标题、描述、字段 key / label / placeholder、添加字段、删除字段。
- 新建 world 时默认带上
playerPersonaTemplate。 - 将 World Editor 改成两栏布局:左侧 sidebar 放统计、Worlds 列表、Saved File、Raw JSON;右侧约三分之二为编辑区。
- 验证通过:
pnpm lint、pnpm build、pnpm test;本地/world-editor可访问并渲染新布局。
Chat 中 Player Intrinsics schema 同步
- 排查 Chat 右侧 Player Intrinsics 显示不正常:初始化页来自当前
activeWorld,Chat 面板来自本地持久化的activeChat.playerPersonaTemplate,旧 chat 会保留过期 schema。 - 在
app/chat/chat-model.ts增加同步/归一化逻辑,在use-chat-session.ts启动读取 world 列表后,把本地 chat 的 player schema 与当前 world 对齐,再写回 localStorage。 - 构建通过;随后尝试用 dev server / browser 验证页面显示,但会话被中断,记录中没有完整最终结论。
验证与遗留
- 多数任务均通过
pnpm test、pnpm lint、pnpm build或tsc --noEmit验证。 - 反复出现的非阻断项:Node SQLite experimental warning、既有
<img>lint warning。 - 20:20 的 World Editor 初版最终构建曾被 Google Fonts 网络请求阻断,提升权限和 dev server 启动也被拒绝;后续 21:02 的 World Editor 两栏版本记录显示
pnpm build通过并可访问/world-editor。 - 21:46 的 Chat Player Intrinsics schema 同步已完成代码和构建验证,但实际浏览器 UI 验证被中断,建议后续手动打开 Chat 页确认右侧字段显示当前
world.json的 schema。