<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>会话持久化 on Last Stand</title><link>https://amatsuzero.github.io/LastStand/tags/%E4%BC%9A%E8%AF%9D%E6%8C%81%E4%B9%85%E5%8C%96/</link><description>Recent content in 会话持久化 on Last Stand</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Tue, 09 Jun 2026 00:00:00 +0800</lastBuildDate><atom:link href="https://amatsuzero.github.io/LastStand/tags/%E4%BC%9A%E8%AF%9D%E6%8C%81%E4%B9%85%E5%8C%96/index.xml" rel="self" type="application/rss+xml"/><item><title>第7章：状态管理算法</title><link>https://amatsuzero.github.io/LastStand/posts/aiagentalgorithm/chapter-07/</link><pubDate>Tue, 09 Jun 2026 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/aiagentalgorithm/chapter-07/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;程序的本质就是状态与状态之间的转换。&amp;rdquo; —— Edsger W. Dijkstra&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="71-问题引入百态纷呈的-agent-系统"&gt;7.1 问题引入：百态纷呈的 Agent 系统&lt;/h2&gt;
&lt;p&gt;想象一个拥有超过 100 个状态属性的 AI Agent 系统。它需要同时管理：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;对话历史&lt;/strong&gt;：数十轮多模态消息，包含用户输入、模型回复、工具调用结果&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;工具权限&lt;/strong&gt;：每个工具的授权模式（允许、拒绝、询问），可在运行时动态变更&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用户配置&lt;/strong&gt;：来自用户设置、项目设置、企业策略、命令行参数等多层级配置源&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UI 状态&lt;/strong&gt;：展开/折叠视图、模型选择、通知队列、输入提示等&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;任务状态&lt;/strong&gt;：后台任务的生命周期、子 Agent 的运行状态、团队协作信息&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;会话元数据&lt;/strong&gt;：会话 ID、权限模式、远程连接状态、推测执行状态&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;当多个组件同时读写这些状态时，如何确保变更可预测、不产生副作用？当配置文件在磁盘上被外部修改时，如何实时感知并正确合并？当会话中断后恢复时，如何从持久化的日志中重建完整状态？&lt;/p&gt;
&lt;p&gt;这些问题的本质是一个经典的工程挑战：&lt;strong&gt;在复杂系统中实现可预测的状态管理&lt;/strong&gt;。Claude Code 源码为我们展示了一套精巧的解决方案——它融合了不可变状态机、发布-订阅、选择器订阅、层级合并、事件溯源等多种算法思想，构建了一个既高效又可靠的状态管理体系。&lt;/p&gt;
&lt;h2 id="72-算法思想"&gt;7.2 算法思想&lt;/h2&gt;
&lt;h3 id="721-不可变状态机算法"&gt;7.2.1 不可变状态机算法&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;核心原则：状态只能通过纯函数转换，旧状态永不修改。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;不可变状态机的思想源自函数式编程：给定当前状态 S 和一个转换函数 f，新状态 S&amp;rsquo; = f(S)。旧状态 S 在转换过程中不被修改，它依然可以被引用和比较。这一原则带来三大好处：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;变更检测极其廉价&lt;/strong&gt;——只需 &lt;code&gt;Object.is(prev, next)&lt;/code&gt; 即可判断是否发生变更，时间复杂度 O(1)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不存在并发修改的竞态条件&lt;/strong&gt;——因为没有人能修改已经发出的状态快照&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;天然支持时间旅行&lt;/strong&gt;——旧状态快照可以保留，用于调试或回溯&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Claude Code 在类型层面通过 &lt;code&gt;DeepImmutable&amp;lt;T&amp;gt;&lt;/code&gt; 泛型强制保证不可变性。AppState 的核心字段被 &lt;code&gt;DeepImmutable&lt;/code&gt; 包裹，编译器会阻止任何对深层属性的直接赋值。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;//&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;类型层面的不可变保证&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;type AppState &lt;span style="color:#f92672"&gt;=&lt;/span&gt; DeepImmutable&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; settings: SettingsJson
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; verbose: boolean
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mainLoopModel: ModelSetting
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; toolPermissionContext: ToolPermissionContext
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;//&lt;/span&gt; &lt;span style="color:#f92672"&gt;...&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;&lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;字段&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;//&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;少数包含函数类型的字段排除在&lt;/span&gt; DeepImmutable &lt;span style="color:#960050;background-color:#1e0010"&gt;之外&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tasks: { [taskId: string]: TaskState }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mcp: { clients: MCPServerConnection[]; tools: Tool[]; &lt;span style="color:#f92672"&gt;...&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;注意 &lt;code&gt;DeepImmutable&lt;/code&gt; 与交叉类型 &lt;code&gt;&amp;amp;&lt;/code&gt; 的组合使用：核心配置字段（settings、verbose、权限上下文等）被严格冻结；而包含回调函数或可变引用的字段（tasks、mcp）则排除在外。这是&lt;strong&gt;实用主义的不可变性&lt;/strong&gt;——在类型安全和运行时灵活性之间取得平衡。&lt;/p&gt;</description></item></channel></rss>