Conversation
Narcooo
left a comment
There was a problem hiding this comment.
Review Summary
整体方向正确:agent session memory 和 story file 读写是刚需。以下按严重程度列出问题。
Critical (2)
-
.inkos/未加入.gitignore— agent sessions 存在.inkos/agent-sessions/下,包含用户对话历史(可能含 API key、创意等敏感信息)。当前.gitignore只加了AGENTS.md,.inkos/会被 git 跟踪并推送。必须加.inkos/到.gitignore。 -
Session 无限增长 — 每次 tool call 都
persistSession()写入完整 messages 数组,但没有任何上限。20轮对话(每轮含 system prompt + tool calls + results)可轻松超过 100KB。多次会话累积后 session 文件会膨胀到 MB 级,loadAgentSession读入全量历史再注入 LLM prompt 会导致 token 浪费和性能问题。建议:加maxMessages上限(如 50 条),超出时截断旧消息或做 summary。
High (3)
-
persistSession()调用过于频繁 — 在agent.ts中每次 assistant 回复和每次 tool result 都调用persistSession(),即完整序列化 + 写磁盘。一轮 3 个 tool call 的对话就是 7 次全量写入。建议改为 turn 级别持久化(每轮循环结束写一次),或 debounce。 -
writeStoryFile没有加 book write lock —writeStoryFile()直接写文件,不经过acquireBookLock()。如果 Writer 正在写章节的同时,用户通过 agent 的update_story_file修改current_state.md,会导致竞态。CLI 的book file set命令同理。 -
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)
-
validateStoryFileContent中parseBookRules返回值被丢弃 —parseBookRules(content)只是调用了但没用返回值,也没 catch。如果parseBookRules抛异常,调用方能看到;但如果它返回 validation errors 而不抛异常,校验就是假的。确认parseBookRules的错误行为。 -
Session 持久化包含 tool results — tool results(如
read_truth_files返回的完整 truth files)会被存入 session。下次加载时这些 stale 数据会作为历史注入 LLM,既浪费 token 又可能造成 LLM 引用过时信息。建议持久化时过滤掉role: "tool"的消息,或只保留摘要。 -
book file show读取不存在的文件时错误信息不友好 —readStoryFile直接调readFile,文件不存在时抛ENOENT。对用户来说 "no such file or directory" 不如 "story_bible not found for book xxx — runinkos book createfirst" 有用。 -
book file set的--content长文本不实用 — CLI 传--content "..."对短文本 OK,但 story_bible 动辄几千字,命令行传参不现实。建议支持 stdin pipe:cat story_bible.md | inkos book file set xxx story_bible。
Low (2)
-
deleteAgentSession吞掉所有异常 —catch {}不区分 ENOENT(预期)和权限错误(意外)。建议只忽略 ENOENT。 -
listAgentSessions的catch {}同理 — 目录不存在返回空数组 OK,但读取权限错误也静默返回空数组会让用户困惑。
Summary
inkos agent会话记忆能力,支持跨对话续接、查看和清理历史story_bible、book_rules等文件Motivation (optional)
自然语言 agent 之前每次执行都是全新会话,无法延续上下文;同时已创建书籍的底层设定文件缺少产品化修改入口,只能手动进目录编辑,影响持续创作体验。
Changes
packages/core/src/state/manager.tsbook_rules基础校验packages/core/src/index.tspackages/core/src/pipeline/agent.tsread_story_file和update_story_file工具packages/core/src/__tests__/state-manager.test.tspackages/cli/src/commands/agent.ts--session、--no-memory以及history、sessions、clear子命令packages/cli/src/commands/book.tsinkos book file list/show/set命令packages/cli/src/__tests__/cli-integration.test.tsUsage (optional)
Test plan
pnpm typecheckpassespnpm testpasses (all existing + new tests)inkos agent history/sessions/clear验证会话管理;运行inkos book file list/show/set验证底层设定文件查看与修改;运行pnpm --filter @actalk/inkos exec vitest run src/__tests__/cli-integration.test.ts和pnpm --filter @actalk/inkos-core test -- src/__tests__/state-manager.test.ts验证新增测试通过Breaking changes (optional)
inkos agent默认会将会话历史保存在项目内.inkos/agent-sessions/book_rules时要求内容包含 YAML frontmatter