pi-loop-graph-sdk 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/LICENSE +21 -0
  2. package/README-zh.md +416 -0
  3. package/README.md +414 -0
  4. package/ROADMAP.md +60 -0
  5. package/dist/adapter/complete-tool.d.ts +3 -0
  6. package/dist/adapter/complete-tool.js +53 -0
  7. package/dist/adapter/debug-log.d.ts +38 -0
  8. package/dist/adapter/debug-log.js +151 -0
  9. package/dist/adapter/extension.d.ts +2 -0
  10. package/dist/adapter/extension.js +11 -0
  11. package/dist/adapter/graph-execution-host.d.ts +73 -0
  12. package/dist/adapter/graph-execution-host.js +181 -0
  13. package/dist/adapter/isolated-graph-session.d.ts +75 -0
  14. package/dist/adapter/isolated-graph-session.js +313 -0
  15. package/dist/adapter/loop-graph-extension.d.ts +96 -0
  16. package/dist/adapter/loop-graph-extension.js +487 -0
  17. package/dist/adapter/mechanism-runtime.d.ts +97 -0
  18. package/dist/adapter/mechanism-runtime.js +670 -0
  19. package/dist/adapter/model-messages.d.ts +17 -0
  20. package/dist/adapter/model-messages.js +11 -0
  21. package/dist/adapter/observability.d.ts +88 -0
  22. package/dist/adapter/observability.js +31 -0
  23. package/dist/adapter/output-contract.d.ts +12 -0
  24. package/dist/adapter/output-contract.js +87 -0
  25. package/dist/adapter/pi-node-context.d.ts +132 -0
  26. package/dist/adapter/pi-node-context.js +619 -0
  27. package/dist/adapter/projection.d.ts +121 -0
  28. package/dist/adapter/projection.js +169 -0
  29. package/dist/adapter/skill-content.d.ts +16 -0
  30. package/dist/adapter/skill-content.js +16 -0
  31. package/dist/advanced.d.ts +32 -0
  32. package/dist/advanced.js +17 -0
  33. package/dist/builders/graph.d.ts +27 -0
  34. package/dist/builders/graph.js +39 -0
  35. package/dist/builders/node.d.ts +8 -0
  36. package/dist/builders/node.js +9 -0
  37. package/dist/builders/refs.d.ts +5 -0
  38. package/dist/builders/refs.js +10 -0
  39. package/dist/builders/route.d.ts +11 -0
  40. package/dist/builders/route.js +18 -0
  41. package/dist/core/context.d.ts +73 -0
  42. package/dist/core/context.js +229 -0
  43. package/dist/core/graph.d.ts +172 -0
  44. package/dist/core/graph.js +57 -0
  45. package/dist/core/json.d.ts +8 -0
  46. package/dist/core/json.js +46 -0
  47. package/dist/core/limits.d.ts +7 -0
  48. package/dist/core/limits.js +14 -0
  49. package/dist/core/mechanism.d.ts +88 -0
  50. package/dist/core/mechanism.js +5 -0
  51. package/dist/core/result.d.ts +41 -0
  52. package/dist/core/result.js +1 -0
  53. package/dist/core/schema.d.ts +8 -0
  54. package/dist/core/schema.js +23 -0
  55. package/dist/core/skill.d.ts +12 -0
  56. package/dist/core/skill.js +1 -0
  57. package/dist/host/baseline.d.ts +11 -0
  58. package/dist/host/baseline.js +4 -0
  59. package/dist/host/graph-catalog.d.ts +8 -0
  60. package/dist/host/graph-catalog.js +24 -0
  61. package/dist/host/graph-host.d.ts +53 -0
  62. package/dist/host/graph-host.js +181 -0
  63. package/dist/host/preflight.d.ts +17 -0
  64. package/dist/host/preflight.js +81 -0
  65. package/dist/host/skill-catalog.d.ts +24 -0
  66. package/dist/host/skill-catalog.js +92 -0
  67. package/dist/host/tool-catalog.d.ts +27 -0
  68. package/dist/host/tool-catalog.js +33 -0
  69. package/dist/index.d.ts +21 -0
  70. package/dist/index.js +10 -0
  71. package/dist/replay/checkpoint.d.ts +40 -0
  72. package/dist/replay/checkpoint.js +57 -0
  73. package/dist/replay/events.d.ts +40 -0
  74. package/dist/replay/events.js +1 -0
  75. package/dist/replay/finalizer.d.ts +26 -0
  76. package/dist/replay/finalizer.js +117 -0
  77. package/dist/replay/html.d.ts +3 -0
  78. package/dist/replay/html.js +270 -0
  79. package/dist/replay/index.d.ts +13 -0
  80. package/dist/replay/index.js +7 -0
  81. package/dist/replay/model.d.ts +81 -0
  82. package/dist/replay/model.js +1 -0
  83. package/dist/replay/parser.d.ts +3 -0
  84. package/dist/replay/parser.js +332 -0
  85. package/dist/replay/recorder.d.ts +30 -0
  86. package/dist/replay/recorder.js +195 -0
  87. package/dist/replay/store.d.ts +41 -0
  88. package/dist/replay/store.js +94 -0
  89. package/dist/router.d.ts +4 -0
  90. package/dist/router.js +61 -0
  91. package/dist/runtime/event-bus.d.ts +101 -0
  92. package/dist/runtime/event-bus.js +18 -0
  93. package/dist/runtime/graph-runtime.d.ts +173 -0
  94. package/dist/runtime/graph-runtime.js +1293 -0
  95. package/dist/runtime/invocation-budget.d.ts +22 -0
  96. package/dist/runtime/invocation-budget.js +52 -0
  97. package/dist/runtime/mechanism-runtime.d.ts +92 -0
  98. package/dist/runtime/mechanism-runtime.js +387 -0
  99. package/dist/runtime.d.ts +91 -0
  100. package/dist/runtime.js +258 -0
  101. package/dist/tools-resolve.d.ts +20 -0
  102. package/dist/tools-resolve.js +52 -0
  103. package/dist/type.d.ts +593 -0
  104. package/dist/type.js +30 -0
  105. package/dist/validate.d.ts +25 -0
  106. package/dist/validate.js +203 -0
  107. package/package.json +69 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 0liveraaawa
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README-zh.md ADDED
@@ -0,0 +1,416 @@
1
+ # Loop Graph SDK
2
+
3
+ > ⚠️ **实验项目声明**:Loop Graph SDK 目前处于早期实验阶段(0.2.0),存在诸多不稳定性和使用摩擦。API 可能变更,部分功能尚未完成。欢迎试用和反馈.
4
+
5
+ 把一次复杂的 Agent 任务,变成一张看得见、走得通、查得清的工作图。
6
+
7
+ Loop Graph SDK 面向需要长期运行、多阶段推进和可复核结果的 Pi 应用。它让你用一张图表达“先做什么、检查什么、失败后回到哪里、最后交付什么”,同时保留 Agent 适合探索和推理的自由度。
8
+
9
+ 它特别适合:
10
+
11
+ - 代码整理、生成、审查、修改、再次审查这样的多阶段工作;
12
+ - 代码处理和 Agent 推理交替进行的流程;
13
+ - 需要工具白名单、自动验收和失败边界的 Agent 应用;
14
+ - 需要复用子流程,又不能让上下文和状态互相污染的任务;
15
+ - 需要在运行后回答"模型看到了什么、走了哪一步、为什么接受或拒绝"的系统。
16
+
17
+ ## 为什么不用 Skill,用回路图?
18
+
19
+ Skill 是给 Agent 一段自然语言指令,告诉它"怎么做"。但 Skill 有几个天然局限:
20
+
21
+ - **没有类型约束**:输入输出全靠自然语言描述,Agent 可以自由发挥,结果不可靠;
22
+ - **没有路由控制**:Skill 执行完就结束了,无法表达"完成后检查一下,失败了回到上一步再改";
23
+ - **没有监控和审计**:看不到模型在 Skill 内部做了什么决策,只能看到最终输出;
24
+ - **没有机制约束**:无法在关键节点注入自动校验、拒绝策略、上下文压缩。
25
+
26
+ 回路图把工作流从"一段提示词"升级为"一张类型化、可路由、可监控、可审计的图":
27
+
28
+ - 每个阶段有明确的**输入/输出 schema**(TypeBox),不符合契约的结果会被自动拒绝;
29
+ - 阶段之间通过**显式路由**连接——成功走哪条路、失败回到哪里、什么条件触发什么动作,全在图里;
30
+ - 内置 **Mechanism 系统**,可以在完成提交时注入自动校验、重试策略、失败处理;
31
+ - 完整的 **Recording/Replay**,每次运行都可以回溯"模型看到了什么、做了哪个决定、为什么被接受或拒绝"。
32
+
33
+ 简单来说:**Skill 只有"指令",回路图有"指令 + 边界 + 监控 + 审计"。**
34
+
35
+ ## 让 AI 帮你写回路图
36
+
37
+ Loop Graph SDK 提供了完整的 TypeScript API 和类型定义,**Pi 可以直接帮你编写图的定义代码**。你只需要描述你的工作流——"先审查代码,发现问题就修改,修改完再审查一遍,通过后提交"——Pi 就能生成对应的 `defineGraph` 代码。
38
+
39
+ SDK 的文档体系也是为 AI 友好设计的:详细的 JSDoc、清晰的类型层次、丰富的工作示例、以及覆盖概念/指南/参考的完整文档树。把 `readme` 喂给 Pi,它就能理解整个系统并帮你高效编写回路图。
40
+
41
+ ## 如何使用
42
+
43
+ ### 1. 安装为项目依赖
44
+
45
+ Loop Graph SDK 首先是一个可被其他项目导入的 library。业务项目通常只需要安装包,然后从根入口创建自己的图和 Extension;SDK 自带的 `/extension` 入口只用于调试和演示,不是业务项目必须安装的运行方式。
46
+
47
+ 当前仓库支持以下依赖方式:
48
+
49
+ ```bash
50
+ # 本地开发:从相邻工作区安装
51
+ npm install ../pi-loop-graph-extension-public
52
+
53
+ # 发布前验证:先生成 tarball,再在业务项目安装
54
+ npm pack
55
+ npm install ./pi-loop-graph-sdk-0.2.0.tgz
56
+
57
+ # Git 依赖:使用实际仓库地址和固定 tag/commit
58
+ npm install git+https://github.com/<owner>/<repo>.git#<tag-or-commit>
59
+ ```
60
+
61
+ 安装后,业务项目可以使用稳定根入口:
62
+
63
+ ```ts
64
+ import {
65
+ agentNode,
66
+ codeNode,
67
+ createGraphHost,
68
+ createLoopGraphExtension,
69
+ defineGraph,
70
+ graphNode,
71
+ } from "pi-loop-graph-sdk";
72
+ ```
73
+
74
+ 回放和高级能力使用独立入口:
75
+
76
+ ```ts
77
+ import { parseReplay, exportReplayHtml } from "pi-loop-graph-sdk/replay";
78
+ import { GraphRuntime, validateGraph } from "pi-loop-graph-sdk/advanced";
79
+ ```
80
+
81
+ 可以通过 npm registry 或 Git 直接安装:
82
+
83
+ ```bash
84
+ pi install npm:pi-loop-graph-sdk@0.2.0
85
+ # 或
86
+ pi install git:github.com/0liveiraaa/pi-loop-graph-sdk@v0.2.0
87
+ ```
88
+
89
+ 本地开发也可以使用目录、tarball 和 Git 依赖。
90
+
91
+ ### 2. 运行最小示例
92
+
93
+ 下面是一张只有一个代码阶段的图。它不需要模型认证,适合先确认图、阶段、路线和结果处理方式。
94
+
95
+ ```ts
96
+ import {
97
+ Type,
98
+ codeNode,
99
+ createGraphHost,
100
+ defineGraph,
101
+ entry,
102
+ finish,
103
+ firstMatch,
104
+ } from "pi-loop-graph-sdk";
105
+
106
+ const Input = Type.Object({ name: Type.String() });
107
+ const Output = Type.Object({ message: Type.String() });
108
+
109
+ const helloGraph = defineGraph({
110
+ id: "hello",
111
+ version: "1",
112
+ goal: "生成问候语",
113
+ input: Input,
114
+ output: Output,
115
+ context: {
116
+ background: { select: "all" },
117
+ },
118
+ entries: [entry("main", { to: "greet" })],
119
+ stages: {
120
+ greet: {
121
+ node: codeNode({
122
+ subGoal: "生成问候语",
123
+ input: Input,
124
+ output: Output,
125
+ execute: ({ input, complete }) =>
126
+ complete({ message: `Hello, ${input.name}` }),
127
+ }),
128
+ route: firstMatch({
129
+ done: finish({
130
+ output: ({ completion }) => completion.result,
131
+ }),
132
+ }),
133
+ },
134
+ },
135
+ });
136
+
137
+ const host = createGraphHost({ recording: "off" });
138
+
139
+ try {
140
+ const result = await host.execute(helloGraph, { name: "World" });
141
+
142
+ if (result.status === "completed") {
143
+ console.log(result.output.message);
144
+ } else {
145
+ console.error(result.failure.code, result.failure.message);
146
+ }
147
+ } finally {
148
+ await host.dispose();
149
+ }
150
+ ```
151
+
152
+ 这里的对应关系是:
153
+
154
+ - `defineGraph` 描述整张任务图;
155
+ - `entry` 描述从哪里开始;
156
+ - `codeNode` 描述一个代码阶段;
157
+ - `firstMatch` 和 `finish` 描述路线和结束;
158
+ - `createGraphHost` 提供一次可管理生命周期的执行通道。
159
+
160
+ ### 3. 从代码阶段换成 Agent 阶段
161
+
162
+ 当阶段需要模型推理时,把 `codeNode` 换成 `agentNode`。输入、输出、工具和 Skill 仍然是图定义的一部分:
163
+
164
+ ```ts
165
+ import {
166
+ Type,
167
+ agentNode,
168
+ skillRef,
169
+ toolSet,
170
+ } from "pi-loop-graph-sdk";
171
+
172
+ const DraftInput = Type.Object({ topic: Type.String() });
173
+ const DraftOutput = Type.Object({ answer: Type.String() });
174
+
175
+ const writeDraft = agentNode({
176
+ subGoal: "根据主题撰写简洁答案",
177
+ input: DraftInput,
178
+ output: DraftOutput,
179
+ prompt: "完成当前阶段,并提交符合输出契约的结构化结果。",
180
+ tools: toolSet("read"),
181
+ skills: [skillRef("answer-writing", "1")],
182
+ context: {
183
+ focus: { select: "all" },
184
+ },
185
+ });
186
+ ```
187
+
188
+ Agent 完成当前阶段时,必须通过受保护的完成工具提交:
189
+
190
+ ```text
191
+ __graph_complete__({ result })
192
+ ```
193
+
194
+ 提交对象只允许 `{ result }`。`status`、`reportedStatus` 和其他额外字段不属于模型协议,会被拒绝。接受、拒绝和失败由 SDK 根据输出契约、验证器、Mechanism 和路线规则决定,而不是由模型自报状态决定。
195
+
196
+ ### 4. 作为 Pi Extension 使用
197
+
198
+ 业务 Extension 负责创建自己的实例、注册图,再决定怎样对外暴露:
199
+
200
+ ```ts
201
+ import {
202
+ createLoopGraphExtension,
203
+ graphRef,
204
+ } from "pi-loop-graph-sdk";
205
+ import { helloGraph } from "./hello-graph.js";
206
+
207
+ export default function setup(pi) {
208
+ const loop = createLoopGraphExtension(pi);
209
+
210
+ loop.registerGraph(helloGraph);
211
+ loop.exposeGraph(graphRef("hello", "1"), {
212
+ kind: "command",
213
+ name: "hello",
214
+ description: "生成问候语",
215
+ parseInput: (args) => ({ name: args.trim() || "World" }),
216
+ });
217
+ }
218
+ ```
219
+
220
+ 注册和暴露是两个动作:同一张图可以注册一次,再按需要暴露成命令或工具。暴露入口默认在独立 Pi Session 中执行;只有明确接受当前会话状态相互影响时,才设置 `execution: "current-session"`。SDK 自带的 `/extension` 入口只负责自动加载基础运行时,不注册演示图;业务代码应创建自己的 Extension 实例。
221
+
222
+ ### 5. 处理结果、取消与生命周期
223
+
224
+ 每次执行都会得到一个 `GraphRunResult`:
225
+
226
+ - `completed`:提供经过输出 schema 检查的 `output`;
227
+ - `failed`:提供结构化 `failure`,包括错误代码、阶段、消息和是否可重试;
228
+ - `cancelled`:提供取消原因。
229
+
230
+ 同一个 Host 只允许一个 Root Run。并发 Root Run 应创建独立 Host。外部 `AbortSignal` 会传播到活动执行;`dispose()` 会等待活动运行清理完成后再释放资源。
231
+
232
+ ### 6. 使用 Recording、Replay 与 Resume
233
+
234
+ Host 默认使用 `replay` 记录,并将运行数据写入 `.loop-graph/runs/{rootRunId}`。也可以按运行选择 `off`、`events`、`replay` 或 `forensic`:
235
+
236
+ ```ts
237
+ const result = await host.execute(graph, input, {
238
+ recording: "replay",
239
+ recordingRequired: true,
240
+ });
241
+
242
+ console.log(result.replay.status, result.replay.location);
243
+ ```
244
+
245
+ Replay 的离线读取和 HTML 导出来自独立入口:
246
+
247
+ ```ts
248
+ import {
249
+ exportReplayHtml,
250
+ parseReplay,
251
+ } from "pi-loop-graph-sdk/replay";
252
+
253
+ const model = parseReplay(replayJsonText);
254
+ const html = exportReplayHtml(model);
255
+ ```
256
+
257
+ 当前 checkpoint/resume 支持单层 Root 在阶段边界可靠恢复。嵌套 `call`、`compose`、`delegate` 的 continuation 恢复尚未完成;遇到这类 checkpoint 时会返回 `resume-incompatible`,不会把子图状态错误套用到父图。
258
+
259
+ ### 7. 选择公开入口
260
+
261
+ 日常业务代码优先使用根入口:
262
+
263
+ ```ts
264
+ import {
265
+ agentNode,
266
+ codeNode,
267
+ createGraphHost,
268
+ createLoopGraphExtension,
269
+ defineGraph,
270
+ graphNode,
271
+ } from "pi-loop-graph-sdk";
272
+ ```
273
+
274
+ 需要底层图运行时、验证器、路由器或高级隔离 Host 时,再使用:
275
+
276
+ ```ts
277
+ import {
278
+ GraphRuntime,
279
+ selectEdge,
280
+ validateGraph,
281
+ } from "pi-loop-graph-sdk/advanced";
282
+ ```
283
+
284
+ 需要记录、回放和 checkpoint 类型时使用:
285
+
286
+ ```ts
287
+ import {
288
+ FileRunStore,
289
+ decodeCheckpoint,
290
+ parseReplay,
291
+ } from "pi-loop-graph-sdk/replay";
292
+ ```
293
+
294
+ 旧的全局 `registerGraph`、`initRegistry`、`findEntry` 和 `createAgentExecute` 不属于 0.2 公共 API。
295
+
296
+ ## 四个核心概念
297
+
298
+ 完成第一次运行后,可以用四个概念理解 SDK 解决了什么问题。把它想成“带有函数调用边界和完整工作记录的 Agent 工作流引擎”即可,不需要理解内部运行代码。
299
+
300
+ ### 1. 回路图:把任务过程画出来
301
+
302
+ 一张图由入口、阶段和路线组成。每个阶段完成后,路线决定下一步去哪里:继续、回到之前的阶段,或者结束并交付结果。
303
+
304
+ 模型在一个阶段内部可以进行多轮思考和工具调用;这些细节属于阶段内部的工作过程。图只表达跨阶段的业务流程,因此读图时可以直接看到任务如何推进,而不会被一长串对话淹没。
305
+
306
+ ### 2. 上下文帧栈:像函数调用栈一样记住工作
307
+
308
+ 跨阶段的信息不是散落在全局变量里,而是进入一个有顺序的上下文帧栈:
309
+
310
+ ```text
311
+ 任务背景
312
+ └─ 阶段 A 完成后留下的工作记忆
313
+ └─ 阶段 B 完成后留下的工作记忆
314
+ └─ 当前阶段的工作区
315
+ ```
316
+
317
+ 阶段结束时,流程只把后续真正需要的内容折叠成一帧:
318
+
319
+ - 后续 Agent 看到有用的工作记忆,而不是前面所有原始对话;
320
+ - 每条路线决定“这次完成应该留下什么”,状态迁移不会藏在节点副作用里;
321
+ - `call` 的工作记忆在子图结束时隔离销毁;`compose` 则让子图写入的 Frames 对父图后续节点继续可见。
322
+
323
+ 帧栈和完整日志是两件事:帧栈服务于下一步工作,日志服务于之后审计和复盘。
324
+
325
+ ### 3. 三种调用边界:像三种函数调用方式
326
+
327
+ 子图可以像函数一样被另一个阶段调用,但你可以明确选择它与调用方共享多少工作上下文:
328
+
329
+ | 边界 | 可以把它理解成 | 适合场景 |
330
+ | ------------ | ------------------------------------------ | ---------------------------------------- |
331
+ | `call` | 调用一个有独立工作区的函数,完成后返回结果 | 复用审查、提取、分类等完整子流程 |
332
+ | `compose` | 把复杂函数展开成当前函数内部的一段步骤 | 子流程需要读取并写入父流程工作记忆 |
333
+ | `delegate` | 交给一个独立 worker,会话和资源都隔离 | 长任务、风险任务或需要独立生命周期的工作 |
334
+
335
+ 三种边界都表达顺序调用,不代表自动并行。
336
+
337
+ ### 4. 完整日志系统:运行之后仍然能还原过程
338
+
339
+ SDK 的记录不是简单的一行“成功/失败”日志。它可以记录:
340
+
341
+ - 图、阶段、调用边界和节点进入/退出;
342
+ - Agent 执行、模型回合、工具调用和工具结果;
343
+ - 完成结果的提交、验证、接受或拒绝;
344
+ - 上下文快照、压缩、扩展机制和恢复点;
345
+ - 大结果的独立文件引用以及脱敏后的安全摘要。
346
+
347
+ 记录可以选择关闭、事件记录、Replay 或 forensic 模式。Replay 可以解析成结构化模型,也可以导出 HTML 报告,用来回答“模型看到了什么”和“系统为什么做出这个决定”。完整审计不会挤占下一阶段的工作上下文。
348
+
349
+ ## 当前边界
350
+
351
+ - 一次图运行沿一条明确路径推进,不提供自动 fork/join 并行调度;
352
+ - 多 Agent 通讯是独立研究方向,不是当前公共能力;
353
+ - `delegate` 是隔离执行边界,不等于并行;
354
+ - 真实 LLM 测试需要可用认证、网络和模型响应;默认测试会跳过这类测试;
355
+
356
+ 默认不会写调试日志文件。`debug: true` 只属于旧兼容/characterization 路径,不是当前 0.2 根入口的公共配置;正式审计应使用 recording/replay。
357
+
358
+ ## 验证项目
359
+
360
+ 在仓库中运行:
361
+
362
+ ```powershell
363
+ npm run typecheck
364
+ npm test
365
+ npm run test:package-consumer
366
+ npm pack --dry-run --json
367
+ git diff --check
368
+ ```
369
+
370
+ ## 文档索引
371
+
372
+ ### 第一次使用
373
+
374
+ - [十分钟快速开始](docs/getting-started.md)
375
+ - [0.1 → 0.2 迁移指南](docs/migration-0.1-to-0.2.md)
376
+
377
+ ### 理解系统
378
+
379
+ - [核心概念索引](docs/concepts/README.md)
380
+ - [图模型](docs/concepts/graph-model.md)
381
+ - [上下文与状态](docs/concepts/context-and-state.md)
382
+ - [子图调用边界](docs/concepts/subgraph-boundaries.md)
383
+ - [Mechanism](docs/concepts/mechanisms.md)
384
+
385
+ ### 完成具体任务
386
+
387
+ - [任务指南索引](docs/guides/README.md)
388
+ - [构建循环和条件路由](docs/guides/build-a-loop.md)
389
+ - [混合代码与 Agent](docs/guides/mix-code-and-agent.md)
390
+ - [调用子图](docs/guides/call-subgraphs.md)
391
+ - [控制工具](docs/guides/control-tools.md)
392
+ - [上下文定制](docs/guides/customize-context.md)
393
+ - [可观测性](docs/guides/observability.md)
394
+
395
+ ### 查询精确行为
396
+
397
+ - [API 参考索引](docs/reference/README.md)
398
+ - [配置项](docs/reference/configuration.md)
399
+ - [生命周期](docs/reference/lifecycle.md)
400
+ - [错误与运行限制](docs/reference/errors-and-limits.md)
401
+
402
+ ### 维护 SDK
403
+
404
+ - [核心设计](docs/design/core-design.md)
405
+ - [内部实现索引](docs/internals/README.md)
406
+ - [ADR](docs/adr/)
407
+
408
+ ### 研究
409
+
410
+ - [研究文档](docs/research/README.md)
411
+
412
+ ### 路线图
413
+
414
+ - [Roadmap](ROADMAP.md)
415
+
416
+ English docs: [README.md](README.md)。