@tachu/extensions 1.0.0-alpha.1

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 (210) hide show
  1. package/CHANGELOG.md +119 -0
  2. package/LICENSE +201 -0
  3. package/README.md +1104 -0
  4. package/README_ZH.md +1082 -0
  5. package/dist/backends/file.d.ts +18 -0
  6. package/dist/backends/file.d.ts.map +1 -0
  7. package/dist/backends/file.js +85 -0
  8. package/dist/backends/file.js.map +1 -0
  9. package/dist/backends/index.d.ts +4 -0
  10. package/dist/backends/index.d.ts.map +1 -0
  11. package/dist/backends/index.js +4 -0
  12. package/dist/backends/index.js.map +1 -0
  13. package/dist/backends/terminal.d.ts +18 -0
  14. package/dist/backends/terminal.d.ts.map +1 -0
  15. package/dist/backends/terminal.js +81 -0
  16. package/dist/backends/terminal.js.map +1 -0
  17. package/dist/backends/web.d.ts +18 -0
  18. package/dist/backends/web.d.ts.map +1 -0
  19. package/dist/backends/web.js +55 -0
  20. package/dist/backends/web.js.map +1 -0
  21. package/dist/common/net.d.ts +39 -0
  22. package/dist/common/net.d.ts.map +1 -0
  23. package/dist/common/net.js +177 -0
  24. package/dist/common/net.js.map +1 -0
  25. package/dist/common/path.d.ts +51 -0
  26. package/dist/common/path.d.ts.map +1 -0
  27. package/dist/common/path.js +76 -0
  28. package/dist/common/path.js.map +1 -0
  29. package/dist/common/process.d.ts +19 -0
  30. package/dist/common/process.d.ts.map +1 -0
  31. package/dist/common/process.js +67 -0
  32. package/dist/common/process.js.map +1 -0
  33. package/dist/index.d.ts +13 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +13 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/mcp/index.d.ts +3 -0
  38. package/dist/mcp/index.d.ts.map +1 -0
  39. package/dist/mcp/index.js +3 -0
  40. package/dist/mcp/index.js.map +1 -0
  41. package/dist/mcp/sse-adapter.d.ts +82 -0
  42. package/dist/mcp/sse-adapter.d.ts.map +1 -0
  43. package/dist/mcp/sse-adapter.js +201 -0
  44. package/dist/mcp/sse-adapter.js.map +1 -0
  45. package/dist/mcp/stdio-adapter.d.ts +85 -0
  46. package/dist/mcp/stdio-adapter.d.ts.map +1 -0
  47. package/dist/mcp/stdio-adapter.js +203 -0
  48. package/dist/mcp/stdio-adapter.js.map +1 -0
  49. package/dist/memory/fs-memory-system.d.ts +147 -0
  50. package/dist/memory/fs-memory-system.d.ts.map +1 -0
  51. package/dist/memory/fs-memory-system.js +266 -0
  52. package/dist/memory/fs-memory-system.js.map +1 -0
  53. package/dist/memory/index.d.ts +2 -0
  54. package/dist/memory/index.d.ts.map +1 -0
  55. package/dist/memory/index.js +2 -0
  56. package/dist/memory/index.js.map +1 -0
  57. package/dist/observability/index.d.ts +3 -0
  58. package/dist/observability/index.d.ts.map +1 -0
  59. package/dist/observability/index.js +3 -0
  60. package/dist/observability/index.js.map +1 -0
  61. package/dist/observability/jsonl-emitter.d.ts +58 -0
  62. package/dist/observability/jsonl-emitter.d.ts.map +1 -0
  63. package/dist/observability/jsonl-emitter.js +96 -0
  64. package/dist/observability/jsonl-emitter.js.map +1 -0
  65. package/dist/observability/otel-emitter.d.ts +52 -0
  66. package/dist/observability/otel-emitter.d.ts.map +1 -0
  67. package/dist/observability/otel-emitter.js +143 -0
  68. package/dist/observability/otel-emitter.js.map +1 -0
  69. package/dist/providers/anthropic.d.ts +73 -0
  70. package/dist/providers/anthropic.d.ts.map +1 -0
  71. package/dist/providers/anthropic.js +521 -0
  72. package/dist/providers/anthropic.js.map +1 -0
  73. package/dist/providers/index.d.ts +5 -0
  74. package/dist/providers/index.d.ts.map +1 -0
  75. package/dist/providers/index.js +5 -0
  76. package/dist/providers/index.js.map +1 -0
  77. package/dist/providers/mock.d.ts +81 -0
  78. package/dist/providers/mock.d.ts.map +1 -0
  79. package/dist/providers/mock.js +160 -0
  80. package/dist/providers/mock.js.map +1 -0
  81. package/dist/providers/openai.d.ts +95 -0
  82. package/dist/providers/openai.d.ts.map +1 -0
  83. package/dist/providers/openai.js +529 -0
  84. package/dist/providers/openai.js.map +1 -0
  85. package/dist/providers/qwen.d.ts +145 -0
  86. package/dist/providers/qwen.d.ts.map +1 -0
  87. package/dist/providers/qwen.js +669 -0
  88. package/dist/providers/qwen.js.map +1 -0
  89. package/dist/rules/index.d.ts +9 -0
  90. package/dist/rules/index.d.ts.map +1 -0
  91. package/dist/rules/index.js +15 -0
  92. package/dist/rules/index.js.map +1 -0
  93. package/dist/rules/no-hallucination.md +11 -0
  94. package/dist/rules/no-sensitive-output.md +11 -0
  95. package/dist/rules/prefer-concise-response.md +11 -0
  96. package/dist/rules/require-tool-verification.md +11 -0
  97. package/dist/safety/default-gate.d.ts +112 -0
  98. package/dist/safety/default-gate.d.ts.map +1 -0
  99. package/dist/safety/default-gate.js +188 -0
  100. package/dist/safety/default-gate.js.map +1 -0
  101. package/dist/safety/index.d.ts +2 -0
  102. package/dist/safety/index.d.ts.map +1 -0
  103. package/dist/safety/index.js +2 -0
  104. package/dist/safety/index.js.map +1 -0
  105. package/dist/tools/_shared/web-client.d.ts +18 -0
  106. package/dist/tools/_shared/web-client.d.ts.map +1 -0
  107. package/dist/tools/_shared/web-client.js +46 -0
  108. package/dist/tools/_shared/web-client.js.map +1 -0
  109. package/dist/tools/apply-patch/descriptor.md +27 -0
  110. package/dist/tools/apply-patch/executor.d.ts +19 -0
  111. package/dist/tools/apply-patch/executor.d.ts.map +1 -0
  112. package/dist/tools/apply-patch/executor.js +193 -0
  113. package/dist/tools/apply-patch/executor.js.map +1 -0
  114. package/dist/tools/fetch-url/descriptor.md +44 -0
  115. package/dist/tools/fetch-url/executor.d.ts +28 -0
  116. package/dist/tools/fetch-url/executor.d.ts.map +1 -0
  117. package/dist/tools/fetch-url/executor.js +115 -0
  118. package/dist/tools/fetch-url/executor.js.map +1 -0
  119. package/dist/tools/index.d.ts +12 -0
  120. package/dist/tools/index.d.ts.map +1 -0
  121. package/dist/tools/index.js +286 -0
  122. package/dist/tools/index.js.map +1 -0
  123. package/dist/tools/list-dir/descriptor.md +29 -0
  124. package/dist/tools/list-dir/executor.d.ts +22 -0
  125. package/dist/tools/list-dir/executor.d.ts.map +1 -0
  126. package/dist/tools/list-dir/executor.js +48 -0
  127. package/dist/tools/list-dir/executor.js.map +1 -0
  128. package/dist/tools/read-file/descriptor.md +28 -0
  129. package/dist/tools/read-file/executor.d.ts +15 -0
  130. package/dist/tools/read-file/executor.d.ts.map +1 -0
  131. package/dist/tools/read-file/executor.js +22 -0
  132. package/dist/tools/read-file/executor.js.map +1 -0
  133. package/dist/tools/run-shell/descriptor.md +39 -0
  134. package/dist/tools/run-shell/executor.d.ts +20 -0
  135. package/dist/tools/run-shell/executor.d.ts.map +1 -0
  136. package/dist/tools/run-shell/executor.js +76 -0
  137. package/dist/tools/run-shell/executor.js.map +1 -0
  138. package/dist/tools/search-code/descriptor.md +31 -0
  139. package/dist/tools/search-code/executor.d.ts +23 -0
  140. package/dist/tools/search-code/executor.d.ts.map +1 -0
  141. package/dist/tools/search-code/executor.js +122 -0
  142. package/dist/tools/search-code/executor.js.map +1 -0
  143. package/dist/tools/shared.d.ts +47 -0
  144. package/dist/tools/shared.d.ts.map +1 -0
  145. package/dist/tools/shared.js +27 -0
  146. package/dist/tools/shared.js.map +1 -0
  147. package/dist/tools/web-fetch/descriptor.md +198 -0
  148. package/dist/tools/web-fetch/errors.d.ts +32 -0
  149. package/dist/tools/web-fetch/errors.d.ts.map +1 -0
  150. package/dist/tools/web-fetch/errors.js +91 -0
  151. package/dist/tools/web-fetch/errors.js.map +1 -0
  152. package/dist/tools/web-fetch/executor.d.ts +10 -0
  153. package/dist/tools/web-fetch/executor.d.ts.map +1 -0
  154. package/dist/tools/web-fetch/executor.js +191 -0
  155. package/dist/tools/web-fetch/executor.js.map +1 -0
  156. package/dist/tools/web-fetch/index.d.ts +4 -0
  157. package/dist/tools/web-fetch/index.d.ts.map +1 -0
  158. package/dist/tools/web-fetch/index.js +3 -0
  159. package/dist/tools/web-fetch/index.js.map +1 -0
  160. package/dist/tools/web-fetch/types.d.ts +157 -0
  161. package/dist/tools/web-fetch/types.d.ts.map +1 -0
  162. package/dist/tools/web-fetch/types.js +7 -0
  163. package/dist/tools/web-fetch/types.js.map +1 -0
  164. package/dist/tools/web-search/descriptor.md +89 -0
  165. package/dist/tools/web-search/errors.d.ts +33 -0
  166. package/dist/tools/web-search/errors.d.ts.map +1 -0
  167. package/dist/tools/web-search/errors.js +45 -0
  168. package/dist/tools/web-search/errors.js.map +1 -0
  169. package/dist/tools/web-search/executor.d.ts +10 -0
  170. package/dist/tools/web-search/executor.d.ts.map +1 -0
  171. package/dist/tools/web-search/executor.js +185 -0
  172. package/dist/tools/web-search/executor.js.map +1 -0
  173. package/dist/tools/web-search/index.d.ts +4 -0
  174. package/dist/tools/web-search/index.d.ts.map +1 -0
  175. package/dist/tools/web-search/index.js +3 -0
  176. package/dist/tools/web-search/index.js.map +1 -0
  177. package/dist/tools/web-search/types.d.ts +86 -0
  178. package/dist/tools/web-search/types.d.ts.map +1 -0
  179. package/dist/tools/web-search/types.js +7 -0
  180. package/dist/tools/web-search/types.js.map +1 -0
  181. package/dist/tools/write-file/descriptor.md +30 -0
  182. package/dist/tools/write-file/executor.d.ts +16 -0
  183. package/dist/tools/write-file/executor.d.ts.map +1 -0
  184. package/dist/tools/write-file/executor.js +18 -0
  185. package/dist/tools/write-file/executor.js.map +1 -0
  186. package/dist/transformers/document-to-text.d.ts +23 -0
  187. package/dist/transformers/document-to-text.d.ts.map +1 -0
  188. package/dist/transformers/document-to-text.js +69 -0
  189. package/dist/transformers/document-to-text.js.map +1 -0
  190. package/dist/transformers/image-to-text.d.ts +38 -0
  191. package/dist/transformers/image-to-text.d.ts.map +1 -0
  192. package/dist/transformers/image-to-text.js +82 -0
  193. package/dist/transformers/image-to-text.js.map +1 -0
  194. package/dist/transformers/index.d.ts +3 -0
  195. package/dist/transformers/index.d.ts.map +1 -0
  196. package/dist/transformers/index.js +3 -0
  197. package/dist/transformers/index.js.map +1 -0
  198. package/dist/vector/index.d.ts +3 -0
  199. package/dist/vector/index.d.ts.map +1 -0
  200. package/dist/vector/index.js +3 -0
  201. package/dist/vector/index.js.map +1 -0
  202. package/dist/vector/local-fs.d.ts +76 -0
  203. package/dist/vector/local-fs.d.ts.map +1 -0
  204. package/dist/vector/local-fs.js +153 -0
  205. package/dist/vector/local-fs.js.map +1 -0
  206. package/dist/vector/qdrant.d.ts +85 -0
  207. package/dist/vector/qdrant.d.ts.map +1 -0
  208. package/dist/vector/qdrant.js +208 -0
  209. package/dist/vector/qdrant.js.map +1 -0
  210. package/package.json +74 -0
@@ -0,0 +1,203 @@
1
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
2
+ import { StdioClientTransport, } from "@modelcontextprotocol/sdk/client/stdio.js";
3
+ /** D1-LOW-08:默认 30s 的工具调用超时窗口。 */
4
+ const DEFAULT_CALL_TIMEOUT_MS = 30_000;
5
+ const createRequestId = () => `mcp-stdio-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;
6
+ /**
7
+ * MCP stdio 传输适配器。
8
+ */
9
+ export class McpStdioAdapter {
10
+ transport = "stdio";
11
+ options;
12
+ maxReconnectAttempts = 3;
13
+ defaultTimeoutMs;
14
+ client = null;
15
+ transportImpl = null;
16
+ reconnecting = false;
17
+ closedManually = false;
18
+ connected = false;
19
+ serverUri = "";
20
+ pendingRequests = new Map();
21
+ /**
22
+ * 创建 stdio MCP 适配器。
23
+ *
24
+ * @param options stdio 启动参数
25
+ */
26
+ constructor(options) {
27
+ this.options = options;
28
+ this.defaultTimeoutMs =
29
+ options.defaultTimeoutMs === undefined
30
+ ? DEFAULT_CALL_TIMEOUT_MS
31
+ : Math.max(0, options.defaultTimeoutMs);
32
+ }
33
+ /**
34
+ * 建立 MCP 连接。
35
+ *
36
+ * @param serverUri 服务端 URI(可留空)
37
+ */
38
+ async connect(serverUri) {
39
+ this.serverUri = serverUri;
40
+ this.closedManually = false;
41
+ await this.connectInternal();
42
+ }
43
+ /**
44
+ * 断开连接。
45
+ */
46
+ async disconnect() {
47
+ this.closedManually = true;
48
+ this.connected = false;
49
+ for (const controller of this.pendingRequests.values()) {
50
+ controller.abort(new Error("MCP stdio adapter disconnected"));
51
+ }
52
+ this.pendingRequests.clear();
53
+ await this.transportImpl?.close().catch(() => undefined);
54
+ this.transportImpl = null;
55
+ this.client = null;
56
+ }
57
+ /**
58
+ * 列出远端工具并映射为引擎 ToolDescriptor。
59
+ *
60
+ * @returns 工具描述符数组
61
+ */
62
+ async listTools() {
63
+ if (!this.client) {
64
+ throw new Error("MCP stdio adapter not connected");
65
+ }
66
+ const response = await this.client.listTools();
67
+ return response.tools.map((tool) => ({
68
+ kind: "tool",
69
+ name: tool.name,
70
+ description: tool.description ?? `mcp tool: ${tool.name}`,
71
+ sideEffect: tool.annotations?.readOnlyHint
72
+ ? "readonly"
73
+ : tool.annotations?.destructiveHint
74
+ ? "irreversible"
75
+ : "write",
76
+ idempotent: tool.annotations?.idempotentHint ?? false,
77
+ requiresApproval: tool.annotations?.destructiveHint ?? false,
78
+ timeout: 30_000,
79
+ inputSchema: tool.inputSchema,
80
+ outputSchema: tool.outputSchema,
81
+ execute: `mcp:${this.options.serverId ?? "stdio"}:${tool.name}`,
82
+ }));
83
+ }
84
+ /**
85
+ * 调用远端工具(core 协议方法)。
86
+ *
87
+ * @param name 工具名
88
+ * @param input 入参
89
+ * @returns 工具执行结果
90
+ */
91
+ async executeTool(name, input, options) {
92
+ return this.callTool(name, input, options?.signal, options?.requestId);
93
+ }
94
+ /**
95
+ * 调用远端工具(支持 AbortSignal)。
96
+ *
97
+ * @param name 工具名
98
+ * @param input 入参
99
+ * @param signal 取消信号
100
+ * @param requestId 请求 ID(可选;用于后续 cancel 显式取消)
101
+ * @returns 工具执行结果
102
+ */
103
+ async callTool(name, input, signal, requestId) {
104
+ if (!this.client) {
105
+ throw new Error("MCP stdio adapter not connected");
106
+ }
107
+ const mappedRequestId = requestId?.trim() ? requestId : createRequestId();
108
+ if (this.pendingRequests.has(mappedRequestId)) {
109
+ throw new Error(`MCP stdio request already in progress: ${mappedRequestId}`);
110
+ }
111
+ const controller = new AbortController();
112
+ const onAbort = () => {
113
+ controller.abort(signal?.reason ?? new Error(`MCP stdio request aborted: ${mappedRequestId}`));
114
+ };
115
+ if (signal?.aborted) {
116
+ onAbort();
117
+ }
118
+ else {
119
+ signal?.addEventListener("abort", onAbort, { once: true });
120
+ }
121
+ // D1-LOW-08:为 callTool 套上 adapter 层默认超时,避免远端挂起拖垮引擎。
122
+ let timeoutHandle = null;
123
+ let timedOut = false;
124
+ if (this.defaultTimeoutMs > 0) {
125
+ timeoutHandle = setTimeout(() => {
126
+ timedOut = true;
127
+ controller.abort(new Error(`MCP stdio request timed out after ${this.defaultTimeoutMs}ms: ${mappedRequestId}`));
128
+ }, this.defaultTimeoutMs);
129
+ }
130
+ this.pendingRequests.set(mappedRequestId, controller);
131
+ try {
132
+ const result = await this.client.callTool({ name, arguments: (input ?? {}) }, undefined, { signal: controller.signal });
133
+ return result;
134
+ }
135
+ catch (error) {
136
+ if (timedOut) {
137
+ throw new Error(`MCP stdio request timed out after ${this.defaultTimeoutMs}ms: ${mappedRequestId}`);
138
+ }
139
+ throw error;
140
+ }
141
+ finally {
142
+ if (timeoutHandle !== null) {
143
+ clearTimeout(timeoutHandle);
144
+ }
145
+ signal?.removeEventListener("abort", onAbort);
146
+ this.pendingRequests.delete(mappedRequestId);
147
+ }
148
+ }
149
+ /**
150
+ * 按 requestId 取消请求(通过信号机制由调用方透传)。
151
+ *
152
+ * @param _requestId 请求 ID
153
+ */
154
+ async cancel(requestId) {
155
+ const controller = this.pendingRequests.get(requestId);
156
+ if (!controller) {
157
+ return;
158
+ }
159
+ controller.abort(new Error(`MCP stdio request cancelled: ${requestId}`));
160
+ }
161
+ async connectInternal() {
162
+ const serverParams = {
163
+ command: this.options.command,
164
+ ...(this.options.args ? { args: this.options.args } : {}),
165
+ ...(this.options.env ? { env: this.options.env } : {}),
166
+ ...(this.options.cwd ? { cwd: this.options.cwd } : {}),
167
+ stderr: "pipe",
168
+ };
169
+ this.client = new Client({ name: "tachu-mcp-stdio", version: "1.0.0" });
170
+ this.transportImpl = new StdioClientTransport(serverParams);
171
+ this.transportImpl.onclose = () => {
172
+ this.connected = false;
173
+ if (!this.closedManually) {
174
+ void this.reconnectWithBackoff();
175
+ }
176
+ };
177
+ await this.client.connect(this.transportImpl);
178
+ this.connected = true;
179
+ }
180
+ async reconnectWithBackoff() {
181
+ if (this.reconnecting || this.closedManually) {
182
+ return;
183
+ }
184
+ this.reconnecting = true;
185
+ try {
186
+ for (let attempt = 0; attempt < this.maxReconnectAttempts; attempt += 1) {
187
+ const delay = 200 * 2 ** attempt;
188
+ await new Promise((resolve) => setTimeout(resolve, delay));
189
+ try {
190
+ await this.connectInternal();
191
+ return;
192
+ }
193
+ catch {
194
+ // retry
195
+ }
196
+ }
197
+ }
198
+ finally {
199
+ this.reconnecting = false;
200
+ }
201
+ }
202
+ }
203
+ //# sourceMappingURL=stdio-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdio-adapter.js","sourceRoot":"","sources":["../../src/mcp/stdio-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,147 @@
1
+ import { InMemoryMemorySystem, type ContextWindow, type MemoryEntry, type MemorySystem } from "@tachu/core";
2
+ /**
3
+ * `FsMemorySystem` 构造依赖(来自 `@tachu/core` 的 `MemorySystemFactoryDeps`)。
4
+ *
5
+ * 解耦设计:extensions 不强依赖 core 的 `MemorySystemFactoryDeps` 类型签名变动,
6
+ * 内部自描述只取真正需要的字段。
7
+ */
8
+ export interface FsMemorySystemOptions {
9
+ /**
10
+ * 持久化根目录,每个 session 对应 `<persistDir>/<sanitizedId>.jsonl`。
11
+ */
12
+ persistDir: string;
13
+ /**
14
+ * 内部组合的 `InMemoryMemorySystem` 实例。由调用方(通常为 engine-factory
15
+ * 通过 core 的 factory 回调)构造好后传入,以复用 core 的 tokenizer /
16
+ * modelRouter / providers / vectorStore 等运行时依赖。
17
+ */
18
+ inner: InMemoryMemorySystem;
19
+ /**
20
+ * 压缩触发阈值(0-1)。默认读 `config.memory.compressionThreshold`。
21
+ * 超过 `contextTokenLimit * threshold` 时在 `append` 中触发 `compress`。
22
+ */
23
+ compressionThreshold: number;
24
+ }
25
+ /**
26
+ * 将任意 session ID 标准化为文件名安全形式。
27
+ *
28
+ * 规则:
29
+ * - 仅保留 `[A-Za-z0-9._-]`,其余一律替换为 `_`
30
+ * - 首位不允许为 `.`(防止写隐藏文件 / 触发 shell 点号展开)
31
+ * - 空串兜底为 `default`
32
+ * - 超长截断到 120 字符(绝大多数 UUID / nanoid 场景足够)
33
+ */
34
+ export declare function sanitizeSessionId(raw: string): string;
35
+ /**
36
+ * 基于文件系统的 `MemorySystem` 实现 —— `@tachu/core` `MemorySystem` 抽象的
37
+ * **跨进程持久化** 参考实现(patch-02-session-persistence)。
38
+ *
39
+ * ## 职责
40
+ *
41
+ * - 每次 `append` 先把单条 entry 以 append-only JSON line 写入
42
+ * `<persistDir>/<sid>.jsonl`(crash-safe),再同步进内部
43
+ * `InMemoryMemorySystem` 的运行时 window
44
+ * - 首次 `load(sid)` 命中时从磁盘 hydrate 上次进程遗留的历史,注入内部
45
+ * `InMemoryMemorySystem`(走 public `hydrate()`,旁路 per-entry compress 触发)
46
+ * - `compress()` 完成后 atomic rewrite 持久化文件,保证"盘 = 内存"一致
47
+ * - `recall` / `archive` / `getSize` / `trim` 全部代理内部 `InMemoryMemorySystem`
48
+ * (只要 load 阶段已 hydrate,这些读路径天然拿到跨进程数据)
49
+ *
50
+ * ## 并发
51
+ *
52
+ * 单 session 上的 `load` / `append` / `compress` / `trim` 通过 per-session promise
53
+ * chain 串行化,避免两个 runStream 并发交错写出错乱 jsonl。跨 session 完全独立。
54
+ *
55
+ * ## 与 `archivePath` 的职责分离
56
+ *
57
+ * - `config.memory.persistDir`(本类)= 热路径:每次 append 即落盘,用于跨进程 `--resume`
58
+ * - `config.memory.archivePath`(内部 `InMemoryMemorySystem` 拥有)= 冷路径:
59
+ * 仅在 `compress()` 时一次性追加到单个大 jsonl,供长期记忆向量召回
60
+ *
61
+ * 两者**不重叠**,保留现有 archivePath 语义不动。
62
+ */
63
+ export declare class FsMemorySystem implements MemorySystem {
64
+ private readonly persistDir;
65
+ private readonly inner;
66
+ private readonly compressionThreshold;
67
+ private readonly hydrated;
68
+ private readonly pending;
69
+ /**
70
+ * 构造文件持久化 MemorySystem。
71
+ *
72
+ * @param options 参见 {@link FsMemorySystemOptions}
73
+ */
74
+ constructor(options: FsMemorySystemOptions);
75
+ /**
76
+ * @inheritdoc
77
+ */
78
+ load(sessionId: string): Promise<ContextWindow>;
79
+ /**
80
+ * @inheritdoc
81
+ *
82
+ * 流程:
83
+ * 1. 确保 session 已 hydrate(使 window 与磁盘一致)
84
+ * 2. append-only 将 entry 序列化为单行 JSON 落盘(崩溃安全;即便本次进程 crash,
85
+ * 磁盘文件仍是合法 jsonl 的前缀)
86
+ * 3. 将 entry 通过 `inner.hydrate()` 注入内存 window(旁路 per-entry compress)
87
+ * 4. 手动检查 tokenCount 是否越过阈值;若越线:
88
+ * - `inner.compress(sid)` 触发 LLM 摘要
89
+ * - atomic rewrite jsonl,保持盘与内存一致
90
+ */
91
+ append(sessionId: string, entry: MemoryEntry): Promise<void>;
92
+ /**
93
+ * @inheritdoc
94
+ */
95
+ compress(sessionId: string): Promise<void>;
96
+ /**
97
+ * @inheritdoc
98
+ */
99
+ recall(sessionId: string, query: string, topK?: number): Promise<MemoryEntry[]>;
100
+ /**
101
+ * @inheritdoc
102
+ */
103
+ archive(sessionId: string): Promise<void>;
104
+ /**
105
+ * @inheritdoc
106
+ */
107
+ getSize(sessionId: string): Promise<{
108
+ entries: number;
109
+ tokens: number;
110
+ }>;
111
+ /**
112
+ * @inheritdoc
113
+ */
114
+ trim(sessionId: string, options?: {
115
+ keepHead?: number;
116
+ keepTail?: number;
117
+ }): Promise<void>;
118
+ /**
119
+ * @inheritdoc
120
+ *
121
+ * 先清内存 window,再幂等删除磁盘 jsonl。未找到文件视为 no-op。
122
+ */
123
+ clear(sessionId: string): Promise<void>;
124
+ /**
125
+ * 获取某 session 的持久化文件绝对 / 相对路径(便于外层 CLI 做迁移、/history 展示)。
126
+ */
127
+ pathFor(sessionId: string): string;
128
+ /**
129
+ * 从磁盘读取 session 的原始 entries 快照(不经 inner hydrate)。
130
+ *
131
+ * 外层 CLI 可借此在 `/history` / `/export` 命令中直接列出原始条目顺序,
132
+ * 不必先 `load` 触发 hydrate 副作用。
133
+ */
134
+ readRaw(sessionId: string): Promise<MemoryEntry[]>;
135
+ private parseJsonl;
136
+ private hydrateIfNeeded;
137
+ private writeJsonlLine;
138
+ private rewriteJsonl;
139
+ /**
140
+ * 串行化某 session 的关键操作 —— 通过 promise chain 保证同一 sessionId 上的
141
+ * load / append / compress / trim 不交错。
142
+ *
143
+ * 失败不阻塞队列:下一个 task 无论前一个 resolve 还是 reject 都会启动。
144
+ */
145
+ private serialize;
146
+ }
147
+ //# sourceMappingURL=fs-memory-system.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-memory-system.d.ts","sourceRoot":"","sources":["../../src/memory/fs-memory-system.ts"],"names":[],"mappings":"AAWA,OAAO,EACL,oBAAoB,EACpB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,YAAY,EAClB,MAAM,aAAa,CAAC;AAErB;;;;;GAKG;AACH,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,KAAK,EAAE,oBAAoB,CAAC;IAC5B;;;OAGG;IACH,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AA0BD;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAKrD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,qBAAa,cAAe,YAAW,YAAY;IACjD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAuB;IAC7C,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAS;IAC9C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuC;IAE/D;;;;OAIG;gBACS,OAAO,EAAE,qBAAqB;IAM1C;;OAEG;IACG,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAOrD;;;;;;;;;;;OAWG;IACG,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAalE;;OAEG;IACG,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQhD;;OAEG;IACG,MAAM,CACV,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,WAAW,EAAE,CAAC;IAOzB;;OAEG;IACG,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK/C;;OAEG;IACG,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAK9E;;OAEG;IACG,IAAI,CACR,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GACjD,OAAO,CAAC,IAAI,CAAC;IAQhB;;;;OAIG;IACG,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa7C;;OAEG;IACH,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAIlC;;;;;OAKG;IACG,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAcxD,OAAO,CAAC,UAAU;YAgBJ,eAAe;YASf,cAAc;YAMd,YAAY;IAY1B;;;;;OAKG;YACW,SAAS;CAYxB"}
@@ -0,0 +1,266 @@
1
+ import { existsSync } from "node:fs";
2
+ import { appendFile, mkdir, readFile, rename, rm, writeFile, } from "node:fs/promises";
3
+ import { join } from "node:path";
4
+ const JSONL_SEP = "\n";
5
+ function isObject(x) {
6
+ return typeof x === "object" && x !== null && !Array.isArray(x);
7
+ }
8
+ function parseMemoryEntry(raw) {
9
+ if (!isObject(raw))
10
+ return null;
11
+ const { role, content, timestamp, anchored } = raw;
12
+ if ((role !== "user" && role !== "assistant" && role !== "system" && role !== "tool") ||
13
+ typeof timestamp !== "number" ||
14
+ !Number.isFinite(timestamp)) {
15
+ return null;
16
+ }
17
+ return {
18
+ role,
19
+ content: content,
20
+ timestamp,
21
+ anchored: Boolean(anchored),
22
+ };
23
+ }
24
+ /**
25
+ * 将任意 session ID 标准化为文件名安全形式。
26
+ *
27
+ * 规则:
28
+ * - 仅保留 `[A-Za-z0-9._-]`,其余一律替换为 `_`
29
+ * - 首位不允许为 `.`(防止写隐藏文件 / 触发 shell 点号展开)
30
+ * - 空串兜底为 `default`
31
+ * - 超长截断到 120 字符(绝大多数 UUID / nanoid 场景足够)
32
+ */
33
+ export function sanitizeSessionId(raw) {
34
+ const replaced = raw.replace(/[^A-Za-z0-9._-]/g, "_");
35
+ const stripped = replaced.replace(/^\.+/, "_");
36
+ const bounded = stripped.length > 120 ? stripped.slice(0, 120) : stripped;
37
+ return bounded.length === 0 ? "default" : bounded;
38
+ }
39
+ /**
40
+ * 基于文件系统的 `MemorySystem` 实现 —— `@tachu/core` `MemorySystem` 抽象的
41
+ * **跨进程持久化** 参考实现(patch-02-session-persistence)。
42
+ *
43
+ * ## 职责
44
+ *
45
+ * - 每次 `append` 先把单条 entry 以 append-only JSON line 写入
46
+ * `<persistDir>/<sid>.jsonl`(crash-safe),再同步进内部
47
+ * `InMemoryMemorySystem` 的运行时 window
48
+ * - 首次 `load(sid)` 命中时从磁盘 hydrate 上次进程遗留的历史,注入内部
49
+ * `InMemoryMemorySystem`(走 public `hydrate()`,旁路 per-entry compress 触发)
50
+ * - `compress()` 完成后 atomic rewrite 持久化文件,保证"盘 = 内存"一致
51
+ * - `recall` / `archive` / `getSize` / `trim` 全部代理内部 `InMemoryMemorySystem`
52
+ * (只要 load 阶段已 hydrate,这些读路径天然拿到跨进程数据)
53
+ *
54
+ * ## 并发
55
+ *
56
+ * 单 session 上的 `load` / `append` / `compress` / `trim` 通过 per-session promise
57
+ * chain 串行化,避免两个 runStream 并发交错写出错乱 jsonl。跨 session 完全独立。
58
+ *
59
+ * ## 与 `archivePath` 的职责分离
60
+ *
61
+ * - `config.memory.persistDir`(本类)= 热路径:每次 append 即落盘,用于跨进程 `--resume`
62
+ * - `config.memory.archivePath`(内部 `InMemoryMemorySystem` 拥有)= 冷路径:
63
+ * 仅在 `compress()` 时一次性追加到单个大 jsonl,供长期记忆向量召回
64
+ *
65
+ * 两者**不重叠**,保留现有 archivePath 语义不动。
66
+ */
67
+ export class FsMemorySystem {
68
+ persistDir;
69
+ inner;
70
+ compressionThreshold;
71
+ hydrated = new Set();
72
+ pending = new Map();
73
+ /**
74
+ * 构造文件持久化 MemorySystem。
75
+ *
76
+ * @param options 参见 {@link FsMemorySystemOptions}
77
+ */
78
+ constructor(options) {
79
+ this.persistDir = options.persistDir;
80
+ this.inner = options.inner;
81
+ this.compressionThreshold = options.compressionThreshold;
82
+ }
83
+ /**
84
+ * @inheritdoc
85
+ */
86
+ async load(sessionId) {
87
+ return this.serialize(sessionId, async () => {
88
+ await this.hydrateIfNeeded(sessionId);
89
+ return this.inner.load(sessionId);
90
+ });
91
+ }
92
+ /**
93
+ * @inheritdoc
94
+ *
95
+ * 流程:
96
+ * 1. 确保 session 已 hydrate(使 window 与磁盘一致)
97
+ * 2. append-only 将 entry 序列化为单行 JSON 落盘(崩溃安全;即便本次进程 crash,
98
+ * 磁盘文件仍是合法 jsonl 的前缀)
99
+ * 3. 将 entry 通过 `inner.hydrate()` 注入内存 window(旁路 per-entry compress)
100
+ * 4. 手动检查 tokenCount 是否越过阈值;若越线:
101
+ * - `inner.compress(sid)` 触发 LLM 摘要
102
+ * - atomic rewrite jsonl,保持盘与内存一致
103
+ */
104
+ async append(sessionId, entry) {
105
+ await this.serialize(sessionId, async () => {
106
+ await this.hydrateIfNeeded(sessionId);
107
+ await this.writeJsonlLine(sessionId, entry);
108
+ await this.inner.hydrate(sessionId, [entry]);
109
+ const window = await this.inner.load(sessionId);
110
+ if (window.tokenCount > window.limit * this.compressionThreshold) {
111
+ await this.inner.compress(sessionId);
112
+ await this.rewriteJsonl(sessionId);
113
+ }
114
+ });
115
+ }
116
+ /**
117
+ * @inheritdoc
118
+ */
119
+ async compress(sessionId) {
120
+ await this.serialize(sessionId, async () => {
121
+ await this.hydrateIfNeeded(sessionId);
122
+ await this.inner.compress(sessionId);
123
+ await this.rewriteJsonl(sessionId);
124
+ });
125
+ }
126
+ /**
127
+ * @inheritdoc
128
+ */
129
+ async recall(sessionId, query, topK) {
130
+ await this.hydrateIfNeeded(sessionId);
131
+ return topK === undefined
132
+ ? this.inner.recall(sessionId, query)
133
+ : this.inner.recall(sessionId, query, topK);
134
+ }
135
+ /**
136
+ * @inheritdoc
137
+ */
138
+ async archive(sessionId) {
139
+ await this.hydrateIfNeeded(sessionId);
140
+ await this.inner.archive(sessionId);
141
+ }
142
+ /**
143
+ * @inheritdoc
144
+ */
145
+ async getSize(sessionId) {
146
+ await this.hydrateIfNeeded(sessionId);
147
+ return this.inner.getSize(sessionId);
148
+ }
149
+ /**
150
+ * @inheritdoc
151
+ */
152
+ async trim(sessionId, options) {
153
+ await this.serialize(sessionId, async () => {
154
+ await this.hydrateIfNeeded(sessionId);
155
+ await this.inner.trim(sessionId, options);
156
+ await this.rewriteJsonl(sessionId);
157
+ });
158
+ }
159
+ /**
160
+ * @inheritdoc
161
+ *
162
+ * 先清内存 window,再幂等删除磁盘 jsonl。未找到文件视为 no-op。
163
+ */
164
+ async clear(sessionId) {
165
+ await this.serialize(sessionId, async () => {
166
+ this.hydrated.delete(sessionId);
167
+ await this.inner.clear(sessionId);
168
+ const path = this.pathFor(sessionId);
169
+ try {
170
+ await rm(path, { force: true });
171
+ }
172
+ catch {
173
+ // ignore
174
+ }
175
+ });
176
+ }
177
+ /**
178
+ * 获取某 session 的持久化文件绝对 / 相对路径(便于外层 CLI 做迁移、/history 展示)。
179
+ */
180
+ pathFor(sessionId) {
181
+ return join(this.persistDir, `${sanitizeSessionId(sessionId)}.jsonl`);
182
+ }
183
+ /**
184
+ * 从磁盘读取 session 的原始 entries 快照(不经 inner hydrate)。
185
+ *
186
+ * 外层 CLI 可借此在 `/history` / `/export` 命令中直接列出原始条目顺序,
187
+ * 不必先 `load` 触发 hydrate 副作用。
188
+ */
189
+ async readRaw(sessionId) {
190
+ const path = this.pathFor(sessionId);
191
+ if (!existsSync(path)) {
192
+ return [];
193
+ }
194
+ let raw;
195
+ try {
196
+ raw = await readFile(path, "utf8");
197
+ }
198
+ catch {
199
+ return [];
200
+ }
201
+ return this.parseJsonl(raw);
202
+ }
203
+ parseJsonl(raw) {
204
+ const entries = [];
205
+ for (const line of raw.split(JSONL_SEP)) {
206
+ const trimmed = line.trim();
207
+ if (!trimmed)
208
+ continue;
209
+ try {
210
+ const parsed = JSON.parse(trimmed);
211
+ const entry = parseMemoryEntry(parsed);
212
+ if (entry)
213
+ entries.push(entry);
214
+ }
215
+ catch {
216
+ continue;
217
+ }
218
+ }
219
+ return entries;
220
+ }
221
+ async hydrateIfNeeded(sessionId) {
222
+ if (this.hydrated.has(sessionId))
223
+ return;
224
+ this.hydrated.add(sessionId);
225
+ const entries = await this.readRaw(sessionId);
226
+ if (entries.length === 0)
227
+ return;
228
+ await this.inner.hydrate(sessionId, entries);
229
+ }
230
+ async writeJsonlLine(sessionId, entry) {
231
+ await mkdir(this.persistDir, { recursive: true });
232
+ const line = `${JSON.stringify(entry)}${JSONL_SEP}`;
233
+ await appendFile(this.pathFor(sessionId), line, "utf8");
234
+ }
235
+ async rewriteJsonl(sessionId) {
236
+ const window = await this.inner.load(sessionId);
237
+ const path = this.pathFor(sessionId);
238
+ const tmp = `${path}.tmp`;
239
+ await mkdir(this.persistDir, { recursive: true });
240
+ const body = window.entries.length === 0
241
+ ? ""
242
+ : window.entries.map((entry) => JSON.stringify(entry)).join(JSONL_SEP) + JSONL_SEP;
243
+ await writeFile(tmp, body, "utf8");
244
+ await rename(tmp, path);
245
+ }
246
+ /**
247
+ * 串行化某 session 的关键操作 —— 通过 promise chain 保证同一 sessionId 上的
248
+ * load / append / compress / trim 不交错。
249
+ *
250
+ * 失败不阻塞队列:下一个 task 无论前一个 resolve 还是 reject 都会启动。
251
+ */
252
+ async serialize(sessionId, fn) {
253
+ const prev = this.pending.get(sessionId) ?? Promise.resolve();
254
+ const next = prev.then(fn, fn);
255
+ this.pending.set(sessionId, next);
256
+ try {
257
+ return await next;
258
+ }
259
+ finally {
260
+ if (this.pending.get(sessionId) === next) {
261
+ this.pending.delete(sessionId);
262
+ }
263
+ }
264
+ }
265
+ }
266
+ //# sourceMappingURL=fs-memory-system.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-memory-system.js","sourceRoot":"","sources":["../../src/memory/fs-memory-system.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { FsMemorySystem, sanitizeSessionId, type FsMemorySystemOptions, } from "./fs-memory-system";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/memory/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,KAAK,qBAAqB,GAC3B,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { FsMemorySystem, sanitizeSessionId, } from "./fs-memory-system";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/memory/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,iBAAiB,GAElB,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { OtelEmitter } from "./otel-emitter";
2
+ export { JsonlEmitter } from "./jsonl-emitter";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/observability/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { OtelEmitter } from "./otel-emitter";
2
+ export { JsonlEmitter } from "./jsonl-emitter";
3
+ //# sourceMappingURL=index.js.map