Skip to content

feat: 为自然对话增加跨会话记忆,并支持修改书籍底层设定文件#17

Open
BeiChen-CN wants to merge 1 commit intoNarcooo:masterfrom
BeiChen-CN:master
Open

feat: 为自然对话增加跨会话记忆,并支持修改书籍底层设定文件#17
BeiChen-CN wants to merge 1 commit intoNarcooo:masterfrom
BeiChen-CN:master

Conversation

@BeiChen-CN
Copy link

@BeiChen-CN BeiChen-CN commented Mar 14, 2026

Summary

  • 增加 inkos agent 会话记忆能力,支持跨对话续接、查看和清理历史
  • 增加已创建书籍底层设定文件的读写入口,支持直接查看和修改 story_biblebook_rules 等文件
  • 补充核心状态管理与 CLI 集成测试,覆盖新增能力

Motivation (optional)

自然语言 agent 之前每次执行都是全新会话,无法延续上下文;同时已创建书籍的底层设定文件缺少产品化修改入口,只能手动进目录编辑,影响持续创作体验。

Changes

File Change
packages/core/src/state/manager.ts 新增 agent 会话持久化、会话列表/删除、story file 白名单读写与 book_rules 基础校验
packages/core/src/index.ts 导出新增的会话与 story file 相关类型/常量
packages/core/src/pipeline/agent.ts 为 agent loop 增加 session 历史加载与保存;新增 read_story_fileupdate_story_file 工具
packages/core/src/__tests__/state-manager.test.ts 增加 story file 与 agent session 相关测试
packages/cli/src/commands/agent.ts 新增 --session--no-memory 以及 historysessionsclear 子命令
packages/cli/src/commands/book.ts 新增 inkos book file list/show/set 命令
packages/cli/src/__tests__/cli-integration.test.ts 增加 CLI 集成测试,覆盖会话管理和 story file 操作

Usage (optional)

inkos agent --session default "继续上一轮设定"
inkos agent history
inkos agent sessions
inkos agent clear default

inkos book file list
inkos book file show <book-id> story_bible
inkos book file set <book-id> story_bible --content-file .\new-bible.md

Test plan

  • pnpm typecheck passes
  • pnpm test passes (all existing + new tests)
  • Manual verification: 运行 inkos agent history/sessions/clear 验证会话管理;运行 inkos book file list/show/set 验证底层设定文件查看与修改;运行 pnpm --filter @actalk/inkos exec vitest run src/__tests__/cli-integration.test.tspnpm --filter @actalk/inkos-core test -- src/__tests__/state-manager.test.ts 验证新增测试通过

Breaking changes (optional)

  • inkos agent 默认会将会话历史保存在项目内 .inkos/agent-sessions/
  • 通过新命令写入 book_rules 时要求内容包含 YAML frontmatter

Copy link
Owner

@Narcooo Narcooo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review Summary

整体方向正确:agent session memory 和 story file 读写是刚需。以下按严重程度列出问题。

Critical (2)

  1. .inkos/ 未加入 .gitignore — agent sessions 存在 .inkos/agent-sessions/ 下,包含用户对话历史(可能含 API key、创意等敏感信息)。当前 .gitignore 只加了 AGENTS.md.inkos/ 会被 git 跟踪并推送。必须加 .inkos/.gitignore

  2. Session 无限增长 — 每次 tool call 都 persistSession() 写入完整 messages 数组,但没有任何上限。20轮对话(每轮含 system prompt + tool calls + results)可轻松超过 100KB。多次会话累积后 session 文件会膨胀到 MB 级,loadAgentSession 读入全量历史再注入 LLM prompt 会导致 token 浪费和性能问题。建议:加 maxMessages 上限(如 50 条),超出时截断旧消息或做 summary。

High (3)

  1. persistSession() 调用过于频繁 — 在 agent.ts 中每次 assistant 回复和每次 tool result 都调用 persistSession(),即完整序列化 + 写磁盘。一轮 3 个 tool call 的对话就是 7 次全量写入。建议改为 turn 级别持久化(每轮循环结束写一次),或 debounce。

  2. writeStoryFile 没有加 book write lockwriteStoryFile() 直接写文件,不经过 acquireBookLock()。如果 Writer 正在写章节的同时,用户通过 agent 的 update_story_file 修改 current_state.md,会导致竞态。CLI 的 book file set 命令同理。

  3. read_story_file / update_story_file 的 enum 列表与 EDITABLE_STORY_FILES 重复 — agent.ts 里硬编码了一遍 enum 列表,manager.ts 里又定义了 EDITABLE_STORY_FILES。新增文件时需要改两处,容易漏。建议 agent.ts 的 tool definition 从 EDITABLE_STORY_FILES 动态生成 enum。

Medium (4)

  1. validateStoryFileContentparseBookRules 返回值被丢弃parseBookRules(content) 只是调用了但没用返回值,也没 catch。如果 parseBookRules 抛异常,调用方能看到;但如果它返回 validation errors 而不抛异常,校验就是假的。确认 parseBookRules 的错误行为。

  2. Session 持久化包含 tool results — tool results(如 read_truth_files 返回的完整 truth files)会被存入 session。下次加载时这些 stale 数据会作为历史注入 LLM,既浪费 token 又可能造成 LLM 引用过时信息。建议持久化时过滤掉 role: "tool" 的消息,或只保留摘要。

  3. book file show 读取不存在的文件时错误信息不友好readStoryFile 直接调 readFile,文件不存在时抛 ENOENT。对用户来说 "no such file or directory" 不如 "story_bible not found for book xxx — run inkos book create first" 有用。

  4. book file set--content 长文本不实用 — CLI 传 --content "..." 对短文本 OK,但 story_bible 动辄几千字,命令行传参不现实。建议支持 stdin pipe:cat story_bible.md | inkos book file set xxx story_bible

Low (2)

  1. deleteAgentSession 吞掉所有异常catch {} 不区分 ENOENT(预期)和权限错误(意外)。建议只忽略 ENOENT。

  2. listAgentSessionscatch {} 同理 — 目录不存在返回空数组 OK,但读取权限错误也静默返回空数组会让用户困惑。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants