<- 返回日报列表

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:20AIRP engine 拆包与 engine 内部重构新增 packages/engine@lana-storybook/engine,迁移 roleplay engine 代码,拆分 prompt / llm / shared 模块,补 engine 测试,并通过 pnpm testpnpm lintpnpm build
15:20-16:50Chat / engine 行为清理收紧 private prompt 数据边界,删除 Author Note、输出侧 max_tokensPlayerPersona.description,调整 Choices 替换输入框,持久化 draft / choices,移除 Chat navbar。
16:53ChatView 组件拆分ChatView.tsx 拆成 ConversationListMessagePanelComposerInspectorPanel,删除 legacy chat 兼容路径,通过类型检查和 eslint。
20:20World Editor 初版新增 /world-editor/api/world-json,支持导入、导出、格式化、保存 world.json,并让保存后的 JSON 同步到 DB 视图。
20:42world / character schema 收敛系统级删除 world avatar / accent、character handle / accent,删除 buildContextFrame 的单角色参数链路,并恢复 Inspector 绿色主题。
21:02Player Intrinsics 与 World Editor 迭代删除 Player Intrinsics required,给 World Editor 增加 Player Intrinsics 可视化编辑,并改成左 sidebar + 右编辑区的两栏布局。
21:46Chat Player Intrinsics schema 同步修复旧 chat 持久化 schema 与当前 world.json 不一致的问题:启动时用当前 world schema 归一化本地 chat 并写回 localStorage。

lana-storybook 开发日志

AIRP engine 拆包与内部重构

  • llmprompt-managerprompt-debug-logmessage-filterroleplay-typessystem-promptvariable-updateslib 移到 packages/engine/src
  • 新增 @lana-storybook/engine 包,并更新 next.config.tstsconfig.jsonpnpm-workspace.yamlpackage.json 和 lockfile,让 Next 可以转译本地包。
  • 后续将 engine 拆成 packages/engine/src/prompt/packages/engine/src/llm/packages/engine/src/shared/text.ts
  • 补充 variable-updates.test.tsmessage-filter.test.tsprompt-manager.test.tsllm/persona.test.tsllm/story-choices.test.ts
  • 验证通过:pnpm testpnpm lintpnpm 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 testpnpm lintpnpm build

ChatView 拆分和 legacy 清理

  • ChatView.tsx 拆成 ConversationList.tsxMessagePanel.tsxComposer.tsxInspectorPanel.tsx
  • ChatView.tsx 降到约 63 行,只做布局编排。
  • 删除 StoredChatnormalizeVariables 和旧 chat 字段兼容路径;readLocalChats 只按当前 Chat[] 格式读取并清洗。
  • 搜索确认旧字段如 characterNameloreContextplayerCreatePromptLegacy 等在 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,保留 character avatar
  • 更新 engine 类型、prompt context 类型、DB schema / seed sync / API 查询、Chat 本地模型、首页/详情页/Chat UI。
  • 增加 SQLite 迁移,从旧 characters 表移除 handleaccent 列。
  • 评估 buildContextFrame(chat, character, options)character 参数,确认主路径都传 null,随后删除 CharacterContext 参数链路和 character_personality fallback。
  • 修复 Inspector 主题色:删除 world.accent 后曾误改为蓝色,恢复固定绿色主题。
  • 验证通过:pnpm testpnpm lintpnpm 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 lintpnpm buildpnpm 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 testpnpm lintpnpm buildtsc --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。