@linnlabs/linnkit 0.8.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 (123) hide show
  1. package/CHANGELOG.md +84 -0
  2. package/LICENSE +21 -0
  3. package/README.md +178 -0
  4. package/README.zh-CN.md +182 -0
  5. package/dist/agent-invocation-BHcNfrBV.d.cts +30 -0
  6. package/dist/agent-invocation-BznDaXDs.d.ts +30 -0
  7. package/dist/agentEvents-DEB7Fy_J.d.cts +81 -0
  8. package/dist/agentEvents-DEB7Fy_J.d.ts +81 -0
  9. package/dist/agentSpec-EkmviZjy.d.cts +2621 -0
  10. package/dist/agentSpec-EkmviZjy.d.ts +2621 -0
  11. package/dist/ai-engine.types-BpeU_XQG.d.cts +158 -0
  12. package/dist/ai-engine.types-vZRnQcJa.d.ts +158 -0
  13. package/dist/audit-BaRUGaqv.d.cts +307 -0
  14. package/dist/audit-BaRUGaqv.d.ts +307 -0
  15. package/dist/audit-CtcfART1.d.ts +33 -0
  16. package/dist/audit-LeOrm2hX.d.cts +33 -0
  17. package/dist/checkpointMarker-DAI3wUQu.d.cts +8 -0
  18. package/dist/checkpointMarker-DAI3wUQu.d.ts +8 -0
  19. package/dist/cli.cjs +8028 -0
  20. package/dist/cli.cjs.map +1 -0
  21. package/dist/cli.d.cts +4 -0
  22. package/dist/cli.d.ts +4 -0
  23. package/dist/cli.js +8025 -0
  24. package/dist/cli.js.map +1 -0
  25. package/dist/context-manager.cjs +8704 -0
  26. package/dist/context-manager.cjs.map +1 -0
  27. package/dist/context-manager.d.cts +2190 -0
  28. package/dist/context-manager.d.ts +2190 -0
  29. package/dist/context-manager.js +8650 -0
  30. package/dist/context-manager.js.map +1 -0
  31. package/dist/context-trace-DRi5M4lX.d.ts +239 -0
  32. package/dist/context-trace-HE2qY5Q-.d.cts +239 -0
  33. package/dist/contracts.cjs +1333 -0
  34. package/dist/contracts.cjs.map +1 -0
  35. package/dist/contracts.d.cts +8 -0
  36. package/dist/contracts.d.ts +8 -0
  37. package/dist/contracts.js +1214 -0
  38. package/dist/contracts.js.map +1 -0
  39. package/dist/defaultGraphExecutor-BBswR8wn.d.ts +624 -0
  40. package/dist/defaultGraphExecutor-BIjJj7WF.d.cts +624 -0
  41. package/dist/execution-CAIypb41.d.cts +129 -0
  42. package/dist/execution-CAIypb41.d.ts +129 -0
  43. package/dist/index-CHqwkvGp.d.ts +149 -0
  44. package/dist/index-CJeWHopy.d.ts +584 -0
  45. package/dist/index-Cm-JbzTH.d.cts +1450 -0
  46. package/dist/index-Cvr23YCl.d.cts +23 -0
  47. package/dist/index-DDzuSb0n.d.ts +23 -0
  48. package/dist/index-DO4dQgf2.d.cts +584 -0
  49. package/dist/index-DRBWi1fy.d.ts +1450 -0
  50. package/dist/index-Dl5PLgAv.d.cts +149 -0
  51. package/dist/index.cjs +9577 -0
  52. package/dist/index.cjs.map +1 -0
  53. package/dist/index.d.cts +89 -0
  54. package/dist/index.d.ts +89 -0
  55. package/dist/index.js +9563 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/messages-XthmnHZ3.d.cts +8007 -0
  58. package/dist/messages-XthmnHZ3.d.ts +8007 -0
  59. package/dist/ports-DaatKJXp.d.cts +90 -0
  60. package/dist/ports-DnLuKfpE.d.ts +90 -0
  61. package/dist/ports.cjs +4 -0
  62. package/dist/ports.cjs.map +1 -0
  63. package/dist/ports.d.cts +7 -0
  64. package/dist/ports.d.ts +7 -0
  65. package/dist/ports.js +3 -0
  66. package/dist/ports.js.map +1 -0
  67. package/dist/quickstart.cjs +7697 -0
  68. package/dist/quickstart.cjs.map +1 -0
  69. package/dist/quickstart.d.cts +24 -0
  70. package/dist/quickstart.d.ts +24 -0
  71. package/dist/quickstart.js +7691 -0
  72. package/dist/quickstart.js.map +1 -0
  73. package/dist/runAgent-CPj_9e58.d.ts +88 -0
  74. package/dist/runAgent-HYKlXbVr.d.cts +88 -0
  75. package/dist/runHandle-CyXvzgzk.d.ts +239 -0
  76. package/dist/runHandle-D3gPsD7B.d.cts +239 -0
  77. package/dist/runtime-kernel/events.cjs +1485 -0
  78. package/dist/runtime-kernel/events.cjs.map +1 -0
  79. package/dist/runtime-kernel/events.d.cts +8 -0
  80. package/dist/runtime-kernel/events.d.ts +8 -0
  81. package/dist/runtime-kernel/events.js +1475 -0
  82. package/dist/runtime-kernel/events.js.map +1 -0
  83. package/dist/runtime-kernel.cjs +8656 -0
  84. package/dist/runtime-kernel.cjs.map +1 -0
  85. package/dist/runtime-kernel.d.cts +19 -0
  86. package/dist/runtime-kernel.d.ts +19 -0
  87. package/dist/runtime-kernel.js +8568 -0
  88. package/dist/runtime-kernel.js.map +1 -0
  89. package/dist/sse-vPyrOPa0.d.cts +1687 -0
  90. package/dist/sse-vPyrOPa0.d.ts +1687 -0
  91. package/dist/testkit.cjs +10613 -0
  92. package/dist/testkit.cjs.map +1 -0
  93. package/dist/testkit.d.cts +284 -0
  94. package/dist/testkit.d.ts +284 -0
  95. package/dist/testkit.js +10593 -0
  96. package/dist/testkit.js.map +1 -0
  97. package/dist/todo-B1PmDlp3.d.cts +2253 -0
  98. package/dist/todo-B1PmDlp3.d.ts +2253 -0
  99. package/dist/tokenizer-DFL4I7-I.d.ts +28 -0
  100. package/dist/tokenizer-DH_JXv-H.d.cts +28 -0
  101. package/dist/toolContracts-Blll0241.d.ts +463 -0
  102. package/dist/toolContracts-CLkQmhTG.d.cts +463 -0
  103. package/docs/README.md +76 -0
  104. package/docs/integration/01-installation.md +94 -0
  105. package/docs/integration/02-quickstart.md +104 -0
  106. package/docs/integration/README.md +223 -0
  107. package/docs/integration/agent-registration-guide.md +330 -0
  108. package/docs/integration/audit.md +64 -0
  109. package/docs/integration/child-runs.md +87 -0
  110. package/docs/integration/constraints-and-pitfalls.md +87 -0
  111. package/docs/integration/context-engineering.md +650 -0
  112. package/docs/integration/context-fences.md +289 -0
  113. package/docs/integration/glossary.md +69 -0
  114. package/docs/integration/llm-provider.md +76 -0
  115. package/docs/integration/persistence.md +44 -0
  116. package/docs/integration/realtime.md +76 -0
  117. package/docs/integration/run-supervisor.md +69 -0
  118. package/docs/integration/telemetry.md +48 -0
  119. package/docs/integration/testing.md +95 -0
  120. package/docs/integration/tool-development-guide.md +362 -0
  121. package/docs/integration/tool-history.md +202 -0
  122. package/docs/integration/tools.md +188 -0
  123. package/package.json +115 -0
@@ -0,0 +1,104 @@
1
+ # Quickstart · 5 分钟跑通 hello agent
2
+
3
+ > **What** · 用 `defineAgent` + `runAgent` 写 hello agent 最小骨架,5 分钟跑通一轮对话。
4
+ > **When to read** · 装包成功后立刻读;想试用 quickstart helper;写第一个 demo。
5
+ > **Prerequisites** · [`01-installation.md`](./01-installation.md)(装包鉴权已通过)。
6
+ > **Key exports** · `defineAgent` / `runAgent` / `defineConfig` from `@linnlabs/linnkit/quickstart`。
7
+ > **Related** · [`tool-development-guide.md`](./tool-development-guide.md) ⭐ · [`agent-registration-guide.md`](./agent-registration-guide.md) ⭐ · [`llm-provider.md`](./llm-provider.md)
8
+
9
+ 本页是 **试用入口**:目标是让你装包后立刻跑通一轮 agent 对话,确认包、配置、LLM adapter 和 graph runtime 能正常工作。
10
+
11
+ 它不是生产接入方案。生产 host 仍然应该按后续主题手册逐项替换 LLM provider、工具系统、持久化、实时通道、审计和上下文工程策略:
12
+
13
+ - [llm-provider.md](./llm-provider.md)
14
+ - [tools.md](./tools.md)
15
+ - [context-fences.md](./context-fences.md)
16
+ - [persistence.md](./persistence.md)
17
+ - [run-supervisor.md](./run-supervisor.md)
18
+ - [audit.md](./audit.md)
19
+ - [testing.md](./testing.md)
20
+
21
+ ## 1. 创建 demo host
22
+
23
+ ```bash
24
+ npm install -g @linnlabs/linnkit
25
+ linnkit init hello-linnkit
26
+ cd hello-linnkit
27
+ cp .env.example .env
28
+ npm install
29
+ ```
30
+
31
+ `linnkit init <name>` 会在**当前执行命令的目录**下创建一个同名子目录。例如你在 `/Users/you/projects` 执行 `linnkit init hello-linnkit`,最终路径就是 `/Users/you/projects/hello-linnkit`。如果目标目录已存在且非空,CLI 会直接报错,不会覆盖你的文件。
32
+
33
+ 如果你不想全局安装,也可以在任意已安装 `@linnlabs/linnkit` 的项目里用:
34
+
35
+ ```bash
36
+ npx linnkit init hello-linnkit
37
+ ```
38
+
39
+ ## 2. 配置 LLM
40
+
41
+ 编辑 `.env`:
42
+
43
+ ```bash
44
+ OPENAI_API_KEY=sk-...
45
+ OPENAI_BASE_URL=https://api.openai.com/v1
46
+ OPENAI_MODEL=gpt-4.1-mini
47
+ ```
48
+
49
+ quickstart 模板不依赖 OpenAI SDK,只用 Node 20 原生 `fetch` 调 OpenAI-compatible Chat Completions streaming API。你也可以把 `OPENAI_BASE_URL` 指向任何兼容服务。
50
+
51
+ ## 3. 检查环境
52
+
53
+ ```bash
54
+ npx linnkit doctor
55
+ ```
56
+
57
+ `doctor` 会检查:
58
+
59
+ - Node.js >= 20
60
+ - npm registry 配置(如果检测到旧 GitHub Packages registry override,会提示删除)
61
+ - `OPENAI_API_KEY`
62
+ - `linnkit.config.mjs` 能加载
63
+ - agent id 唯一
64
+ - LLM adapter 是否符合 `AgentAiEngine` 形状
65
+
66
+ ## 4. 跑 hello agent
67
+
68
+ ```bash
69
+ npx linnkit run hello --input "你好,介绍一下你自己"
70
+ ```
71
+
72
+ 你会看到实时 final answer chunk,结束后会打印:
73
+
74
+ ```text
75
+ [linnkit] runId=...
76
+ [linnkit] tokens input=... output=...
77
+ ```
78
+
79
+ ## 6. 生成项目里有什么
80
+
81
+ ```text
82
+ hello-linnkit/
83
+ ├── agents/hello.mjs
84
+ ├── adapters/openai-compatible.mjs
85
+ ├── linnkit.config.mjs
86
+ ├── .env.example
87
+ └── package.json
88
+ ```
89
+
90
+ 关键点:
91
+
92
+ - `agents/hello.mjs` 用 `defineAgent()` 声明一个无工具 agent。
93
+ - `linnkit.config.mjs` 用 `defineConfig()` 声明 agent 列表、默认模型和 LLM adapter。
94
+ - `adapters/openai-compatible.mjs` 是 demo adapter,只证明 `AgentAiEngine` 怎么接;生产接入建议维护自己的 provider adapter。
95
+ - `linnkit run` 内部用 `runAgent()` 自动装配内存版 EventStore / Checkpointer / RunSupervisor,只适合 quickstart 和小型 smoke test。
96
+
97
+ ## 7. 下一步
98
+
99
+ - 接你自己的 provider:看 [llm-provider.md](./llm-provider.md)
100
+ - 注册工具:看 [tools.md](./tools.md)
101
+ - 精细控制上下文 token:看 [context-fences.md](./context-fences.md)、[tool-history.md](./tool-history.md)
102
+ - 接持久化和恢复:看 [persistence.md](./persistence.md)
103
+ - 接 run 管理:看 [run-supervisor.md](./run-supervisor.md)
104
+ - 写集成测试:看 [testing.md](./testing.md)
@@ -0,0 +1,223 @@
1
+ # `@linnlabs/linnkit` Integration Guide
2
+
3
+ 这是 `@linnlabs/linnkit` 的**接入文档集**——回答一件事:
4
+
5
+ > 你在自己的仓库装了 `@linnlabs/linnkit`,要把一个 Agent 跑起来,至少要写什么、应该从哪里开始抄。
6
+
7
+ **读者画像**:在外部独立仓库(如 daemon、桌面应用、Web 服务、知识库 agent 或任意自研 agent host)通过 `npm install @linnlabs/linnkit` 装包,准备从零接入的开发者。
8
+
9
+ ---
10
+
11
+ ## 1. 它是什么
12
+
13
+ `@linnlabs/linnkit` 是 **vendor-neutral 的 Agent 框架**:它只提供 runtime kernel + context manager + ports + testkit,**不内置任何具体业务实现**。
14
+
15
+ 一句大白话:
16
+
17
+ > 你装的这个包负责"agent 怎么跑、上下文怎么治理",不负责"用哪个 LLM 提供商、工具集长什么样、消息怎么落库、SSE 怎么推、产品里有哪些 agent"。这些通通是你(host)要自己写的。
18
+
19
+ ## 2. 你必须自己写的(接入面)
20
+
21
+ 按重要度排序:
22
+
23
+
24
+ | 你必须自己写的 | linnkit 给的接入合同(type/symbol) | 从哪里 import |
25
+ | --------------------------------------- | ------------------------------------------------------------------------------------------------------- | ----------------------------------- |
26
+ | 1. LLM provider 适配器 | `AgentAiEngine` | `@linnlabs/linnkit/ports` |
27
+ | 2. 工具集 | `BaseTool` / `ToolRuntimePort` | `@linnlabs/linnkit/runtime-kernel` |
28
+ | 3. 上下文围栏(fence)注册 + 注入适配 | `FenceRegistry` / `FenceDescriptor` / `FenceInjection` / `MustKeepPolicy` / `FenceLifetimePreprocessor` | `@linnlabs/linnkit/context-manager` |
29
+ | 4. 持久化适配器 | `Checkpointer` / `EventStore` / `RunRegistryStore` | `@linnlabs/linnkit/runtime-kernel` |
30
+ | 5. 实时通道(SSE/WebSocket/MQTT) | linnkit 不规定接口;从 `RuntimeEvent` 自己映射 | `@linnlabs/linnkit/contracts` |
31
+ | 6. graph executor 装配 + 默认 LLM/Tool node | `runtimeKernel.graph.GraphExecutor` 等 | `@linnlabs/linnkit/runtime-kernel` |
32
+ | 7. agent / chat / task 注册表 | `promptKey` 是 opaque string,linnkit 不认识你的产品菜单 | (host 自定义) |
33
+ | 8.(可选)telemetry | `TelemetryPort` | `@linnlabs/linnkit/runtime-kernel` |
34
+
35
+
36
+ ## 3. 推荐目录形态(host 仓库内)
37
+
38
+ ```text
39
+ app-hosts/<your-app>/
40
+ ├── adapters/
41
+ │ ├── runtime-assembly/ # 把 GraphExecutor / LlmNode / ToolRuntime 拼起来
42
+ │ ├── context-injection/ # context builder + 注入 host 请求字段为 fences
43
+ │ ├── flow/ # history 读取 / pre-run policy / host session
44
+ │ ├── realtime/ # SSE / WebSocket / MQTT
45
+ │ ├── persistence/ # Checkpointer / EventStore / RunRegistryStore 实现
46
+ │ └── tools/ # 默认 ToolManager 装配
47
+ ├── agent-registry/ # 你的 agent / chat / system 定义
48
+ ├── context/
49
+ │ ├── agent/ # host invoke request shape + fence 注册 + injection adapter
50
+ │ └── chat/ # (只在你还要兼容 chat 时需要)
51
+ ├── context-policies/ # MustKeepPolicy / provider registry / 截断比例
52
+ └── testkit/ # host-bound harness(依赖你的默认 adapter)
53
+ ```
54
+
55
+ 这是建议而不是强制。下面的术语全部按这个分层取名。
56
+
57
+ ## 4. 公开 API surface(8 个稳定子入口)
58
+
59
+ `package.json#exports` 写死的子入口当前是 8 个。任何不在这张表里的"deep import"(比如 `@linnlabs/linnkit/context-manager/shared/preprocessors/...` 或 `@linnlabs/linnkit/shared/...`)都不算公开 API,下个 minor 升级随时可能挪。
60
+
61
+
62
+ | 子入口 | 适用环境 | 你能从这里 import 到什么 |
63
+ | ----------------------------------------- | ---------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
64
+ | `@linnlabs/linnkit` | **Node-only** | `runtimeKernel` / `ports` / `contracts` 三个 namespace;`generateMessageId` / `generateRunId` / `withLLMTelemetryContext` / `setLlmAuditRecorder` |
65
+ | `@linnlabs/linnkit/ports` | **Node-only** | `AgentInvocationRequest` / `AgentAiEngine` / `AgentAiEngineStreamContent` / `LlmCallOptions` / `LlmRequestMessage` / `ToolCall` / `TokenizerPort` 等 host 必须实现的合同 |
66
+ | `@linnlabs/linnkit/contracts` | **Node-only** | 长期稳定的合同:`AiMessage` / `SystemMessage` / `UserMessage` / `AssistantMessage` / `ToolMessage` / `RuntimeEvent` / `EventEnvelope` / `SSEEvent` / 默认执行常量 |
67
+ | `@linnlabs/linnkit/runtime-kernel` | **Node-only**(含 `node:async_hooks` / `crypto`) | 全套 runtime:`graph` / `tools` / `execution` / `events` / `runContext` / `llm` / `childRuns` / `childRunTrace` / `runSupervisor` / `telemetry` 等 namespace + 扁平 `BaseTool` / `ToolExecutionContext` / `ENGINE_ERROR_CODES` 等符号 + `createGraphLoopHarness` / `createDefaultGraphExecutor`(仅测试用) |
68
+ | `@linnlabs/linnkit/runtime-kernel/events` | **浏览器安全** | events governance 纯函数:`shouldPersistRuntimeEvent` / `shouldEnterAgentContext` / `shouldEmitRuntimeEventToSse` / `shouldReplayRuntimeEventToUi` / `getRuntimeEventUiProjectionKind` / `eventMapper`,外加 `AnyAgentEvent` / `RuntimeEventLifecycleDecision` 类型 |
69
+ | `@linnlabs/linnkit/context-manager` | **Node-only** | context core:`createMessageFormatter` / `formatAgentLlmMessages` / `messageFormatter` / `createFenceRegistry` / `FenceDescriptor` / `FenceInjection` / `FenceRegistry` / `FenceLifetimePreprocessor` / `MustKeepPolicy` / `DEFAULT_MUST_KEEP_POLICY` / `BaseContextProvider` / `AGENT_CONSTANTS` / agent profile namespace。chat 兼容层只剩下少量扁平导出(`ChatMessageOrchestrator` / `BaseConversationalTask` / `chatMessageToAiMessage` 等),新接入方应只用 agent profile + fence 机制 |
70
+ | `@linnlabs/linnkit/testkit` | **测试专用** | scripted AI engine harness、graph loop harness、tool context fixture、replay harness、断言、`createRunSupervisorHarness` / `createCollectingAuditPort` / `createMockTelemetryPort` / `createMockTokenizerPort` / 15 条 run 不变量 + 12 条 context policy 不变量校验。`AGENT-GUARD-10-no-testkit-in-production` 强制守门——生产代码不能 import |
71
+ | `@linnlabs/linnkit/quickstart` | **试用 / demo** | `defineAgent` / `runAgent` / `defineConfig`,用于 5 分钟跑通 hello agent;生产 host 接入仍按本目录主题手册逐项装配 |
72
+
73
+
74
+ ## 5. 浏览器使用规则(硬约束)
75
+
76
+ **前端代码(renderer / browser bundle)禁止 import `@linnlabs/linnkit/runtime-kernel`**——这条入口是 namespace 全展开,会把 `node:async_hooks` / `crypto` 等 Node-only 子树拖进 frontend bundle。
77
+
78
+ 前端如果只是要做事件展示决策("这条 RuntimeEvent 该不该回放给 UI?"),从 `**@linnlabs/linnkit/runtime-kernel/events**` 这个 slim seam 取纯函数:
79
+
80
+ ```ts
81
+ // renderer/src/agentEventPolicy.ts
82
+ import {
83
+ shouldReplayRuntimeEventToUi,
84
+ getRuntimeEventUiProjectionKind,
85
+ } from '@linnlabs/linnkit/runtime-kernel/events';
86
+ import type { RuntimeEvent } from '@linnlabs/linnkit/contracts';
87
+ ```
88
+
89
+ `@linnlabs/linnkit/contracts` 是纯 zod schema + 类型,技术上前端也可 import;但 zod 体积非零,前端按需。
90
+
91
+ ## 6. import 选择决策
92
+
93
+ ```text
94
+ 要决定一条 import 应该走哪个子入口?
95
+ ├── 我在前端 bundle 里?
96
+ │ └── 是 ──▶ 只能是 /runtime-kernel/events 或 /contracts
97
+ ├── 我在测试代码里?
98
+ │ └── 是 ──▶ 可以 /testkit;其它子入口照常用
99
+ ├── 我要类型/合同?
100
+ │ └── 是 ──▶ /ports(host 实现合同)或 /contracts(消息/事件合同)
101
+ ├── 我要 context 和 fence 机制?
102
+ │ └── 是 ──▶ /context-manager
103
+ └── 其它(runtime 装配、graph、tool runtime、LLM caller 骨架)─▶ /runtime-kernel
104
+ ```
105
+
106
+ 不要 `import { something } from '@linnlabs/linnkit/runtime-kernel/<deep>'`。`exports` 字段没声明的路径在 Node 16+ ESM 解析下会直接报错,且任何 deep path 都不在稳定 API 范围。
107
+
108
+ ---
109
+
110
+ ## 7. 文档索引
111
+
112
+ ### 7.1 起步必读(按顺序)
113
+
114
+
115
+ | # | 文档 | 内容 |
116
+ | --- | ------------------------------------------ | ------------------------------------ |
117
+ | 1 | 本文 §1-§6 | 它是什么 / 你要写什么 / 8 个公开 API 子入口 / 浏览器规则 |
118
+ | 2 | [01-installation.md](./01-installation.md) | 装包 / `.npmrc` 鉴权 / 验证 |
119
+ | 3 | [02-quickstart.md](./02-quickstart.md) | 5 分钟最小 host 骨架 |
120
+
121
+
122
+ ### 7.2 单点接入(按你需要的功能查)
123
+
124
+
125
+ | 主题 | 文档 |
126
+ | ------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- |
127
+ | 接 LLM provider(OpenAI / Anthropic / DeepSeek / OpenRouter) | [llm-provider.md](./llm-provider.md) |
128
+ | 工具集接入面(`ToolRuntimePort` / `ObservationPreviewPort`) | [tools.md](./tools.md) |
129
+ | **工具开发规范**(`BaseTool` 设计哲学 / `data`-`observation` 分层 / 错误处理 / `getExecutionSummary`)⭐ | [tool-development-guide.md](./tool-development-guide.md) |
130
+ | **Agent 注册与装配**(`AgentSpec` 静态蓝图 / `defineAgent` quickstart helper / 多 agent 协作)⭐ | [agent-registration-guide.md](./agent-registration-guide.md) |
131
+ | **上下文工程总览**(所有作用在 messages 上的机制 + `contextPolicy` / `ContextTrace` 可观测闭环)⭐ | [context-engineering.md](./context-engineering.md) |
132
+ | **接 context engineering(fence 注册 + 注入)⭐ 一等接入面** | [context-fences.md](./context-fences.md) |
133
+ | 自定义 token 估算(`TokenizerPort` 替换默认 tokenizer · 0.8.0+) | [context-engineering.md §9.4](./context-engineering.md) / [agent-registration-guide.md](./agent-registration-guide.md) §4.1 |
134
+ | 配置工具历史压缩策略(per-pair / per-run / none) | [tool-history.md](./tool-history.md) |
135
+ | 接持久化(Checkpointer / EventStore / RunRegistryStore) | [persistence.md](./persistence.md) |
136
+ | 接 RunSupervisor + RunHandle | [run-supervisor.md](./run-supervisor.md) |
137
+ | 同步嵌入 vs 异步后台子 agent | [child-runs.md](./child-runs.md) |
138
+ | 接 AuditPort(决策账本) | [audit.md](./audit.md) |
139
+ | 接 telemetry | [telemetry.md](./telemetry.md) |
140
+ | 实时通道(SSE / WebSocket / IPC) | [realtime.md](./realtime.md) |
141
+
142
+
143
+ ### 7.3 测试 / 边界 / 速查
144
+
145
+
146
+ | 主题 | 文档 |
147
+ | -------------------------------------- | ------------------------------------------------------------ |
148
+ | 测试与 testkit(两层架构) | [testing.md](./testing.md) |
149
+ | 硬约束 + 不建议做的事 + FAQ | [constraints-and-pitfalls.md](./constraints-and-pitfalls.md) |
150
+ | 术语对照(Checkpoint / Event / Fence 的不同含义) | [glossary.md](./glossary.md) |
151
+
152
+
153
+ ### 7.4 推荐阅读顺序
154
+
155
+ **第一次接入(最少 30 分钟)**:
156
+
157
+ 1. 本文 §1-§6 → 先把"我装了啥、它给我啥"看清
158
+ 2. [01-installation.md](./01-installation.md) → 装包鉴权跑通 smoke
159
+ 3. [02-quickstart.md](./02-quickstart.md) → 写一个能跑的最小骨架
160
+ 4. [tool-development-guide.md](./tool-development-guide.md) ⭐ → **写工具**:`BaseTool` 设计哲学、`data` / `observation` 分层、错误处理协议
161
+ 5. [agent-registration-guide.md](./agent-registration-guide.md) ⭐ → **注册 Agent**:`AgentSpec` 静态蓝图 / `defineAgent` quickstart helper / 多 agent 协作
162
+ 6. [context-engineering.md](./context-engineering.md) ⭐ → **鸟瞰**:所有作用在 messages 上的机制是什么、如何声明 `contextPolicy`、如何用 `ContextTrace` 解释最终 token 决策
163
+ 7. [context-fences.md](./context-fences.md) ⭐ → **实操**:fence 注册与注入是 linnkit 一等接入面
164
+ 8. 按需读单点接入文档
165
+
166
+ **续作(按需)**:
167
+
168
+ - 写测试 → [testing.md](./testing.md)
169
+ - 上线前 → [constraints-and-pitfalls.md](./constraints-and-pitfalls.md) + [glossary.md](./glossary.md)
170
+
171
+ ### 7.5 按问题查文档(FAQ-style · AI agent 友好)
172
+
173
+ > 当 AI 助手 / 新接入者用自然语言提问时,这里把"我想……"映射到具体文档段落。每个条目精确到文件 + 段号,避免泛指。
174
+
175
+
176
+ | 我想…… | 看这个 |
177
+ | ----------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
178
+ | ……装包跑通最小骨架 | [01-installation.md](./01-installation.md) → [02-quickstart.md](./02-quickstart.md) |
179
+ | ……换一个 LLM 模型 / 接 OpenAI / Anthropic / DeepSeek | [llm-provider.md](./llm-provider.md) |
180
+ | ……写一个自定义工具(怎么定义 `data` / `observation` / 错误处理) | [tool-development-guide.md](./tool-development-guide.md) ⭐ |
181
+ | ……把工具注册到 agent 上 | [tools.md](./tools.md) + [agent-registration-guide.md §2](./agent-registration-guide.md) ⭐ |
182
+ | ……让工具产生的超长 observation 不占满上下文 | [tools.md §5](./tools.md)(`ObservationPreviewPort`)+ [context-engineering.md §6](./context-engineering.md) |
183
+ | ……定义一个新 agent / 写 `AgentSpec` | [agent-registration-guide.md](./agent-registration-guide.md) ⭐ |
184
+ | ……配 token 预算 / 控制每个 token | [agent-registration-guide.md](./agent-registration-guide.md) §4.1(`contextPolicy.budget` / 默认 tokenizer)+ [context-engineering.md](./context-engineering.md) ⭐ |
185
+ | ……用真实的 Claude / Gemini tokenizer 替代默认 | [context-engineering.md §9.4](./context-engineering.md)(`TokenizerPort`)+ [agent-registration-guide.md](./agent-registration-guide.md) §4.1 |
186
+ | ……被动摘要:先注册摘要 agent、再填 `summarization.agentId` | [agent-registration-guide.md](./agent-registration-guide.md) §4.2 + [context-engineering.md](./context-engineering.md) §5.4 |
187
+ | ……把 host 的"当前文件 / 项目状态 / 引用段落"喂给 agent | [context-fences.md](./context-fences.md) ⭐ |
188
+ | ……让关键信息(如 user prefs)永远不被裁掉 | [context-fences.md](./context-fences.md) ⭐(`mustKeep` policy) |
189
+ | ……工具调用反复占满上下文要压缩 | [tool-history.md](./tool-history.md)(`per-pair` / `per-run` / `none`) |
190
+ | ……配 fence 生命周期(current-turn / persisted / boot-only) | [context-fences.md §3](./context-fences.md) ⭐ |
191
+ | ……让 run 跨进程崩溃后恢复 | [persistence.md](./persistence.md) + [run-supervisor.md](./run-supervisor.md)(`recoverOnBoot`) |
192
+ | ……让用户能取消正在跑的 agent | [run-supervisor.md](./run-supervisor.md)(`RunHandle.cancel`) |
193
+ | ……agent 里调另一个 agent / 多 agent 协作 | [child-runs.md](./child-runs.md) + [agent-registration-guide.md](./agent-registration-guide.md) §8 ⭐ |
194
+ | ……做后台异步长任务 / spawn detached run | [child-runs.md §2](./child-runs.md)(`spawnDetached`) |
195
+ | ……把 agent 进度推到前端 / SSE / WebSocket / Electron IPC | [realtime.md](./realtime.md) |
196
+ | ……前端 import linnkit 报错(`node:async_hooks` / `crypto`) | [README §5](./README.md)(browser rules)+ [realtime.md](./realtime.md) |
197
+ | ……监控 token usage / 时延 / 接 Datadog / Otel | [telemetry.md](./telemetry.md) |
198
+ | ……做合规审计 / 追溯"agent 为什么这么做" | [audit.md](./audit.md) |
199
+ | ……写第一个 agent 单测 / mock LLM | [testing.md](./testing.md) |
200
+ | ……mock 自定义 tokenizer 验证 budget | [testing.md](./testing.md) + [context-engineering.md §9.4.6](./context-engineering.md)(`createMockTokenizerPort`) |
201
+ | ……review 别人的接入是否符合 linnkit 边界 | [constraints-and-pitfalls.md](./constraints-and-pitfalls.md) + [glossary.md](./glossary.md) |
202
+ | ……同事说"Checkpoint" / "Fence" / "Run" 我搞混了 | [glossary.md](./glossary.md) |
203
+
204
+
205
+ > **找不到匹配的问题?** 优先查 [context-engineering.md](./context-engineering.md) ⭐(上下文工程总览) / [agent-registration-guide.md](./agent-registration-guide.md) ⭐(agent 配置入口);仍找不到,是真正的"linnkit 不直接做"——见 [constraints-and-pitfalls.md](./constraints-and-pitfalls.md) §2。
206
+
207
+ ---
208
+
209
+ ## 8. 当前版本与稳定性
210
+
211
+ - 当前版本:以 `package.json#version` 为准
212
+ - 0.x = pre-release 期:**任何加 export / 改既有签名都 bump minor**,patch 兼容
213
+ - 8 个稳定子入口已在 `package.json#exports` 锁定;任何 deep import 都不在稳定面
214
+ - 公开版本变化见仓根 `CHANGELOG.md`
215
+
216
+ ---
217
+
218
+ ## 9. 与其他文档的关系
219
+
220
+ - **包根 [README.md](../../README.md)**:包级总览
221
+ - **[docs/README.md](../README.md)**:框架总览(运行时分层、数据流、术语速查)
222
+ - **[CHANGELOG.md](../../CHANGELOG.md)**:公开版本更新记录
223
+ - **本目录**:接入手册(你正在读的)