@tachu/extensions 1.0.0-alpha.6 → 1.0.0-rc.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 (144) hide show
  1. package/CHANGELOG.md +25 -236
  2. package/README.md +53 -998
  3. package/README_ZH.md +52 -973
  4. package/dist/backends/file.d.ts +6 -6
  5. package/dist/backends/file.d.ts.map +1 -1
  6. package/dist/backends/file.js +12 -12
  7. package/dist/backends/file.js.map +1 -1
  8. package/dist/backends/terminal.d.ts +6 -6
  9. package/dist/backends/terminal.d.ts.map +1 -1
  10. package/dist/backends/terminal.js +9 -9
  11. package/dist/backends/terminal.js.map +1 -1
  12. package/dist/backends/web.d.ts +6 -6
  13. package/dist/backends/web.d.ts.map +1 -1
  14. package/dist/backends/web.js +8 -8
  15. package/dist/backends/web.js.map +1 -1
  16. package/dist/common/path.d.ts +14 -14
  17. package/dist/common/path.d.ts.map +1 -1
  18. package/dist/common/path.js +3 -3
  19. package/dist/common/process.js.map +1 -1
  20. package/dist/index.d.ts +2 -2
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +2 -2
  23. package/dist/index.js.map +1 -1
  24. package/dist/mcp/sse-adapter.d.ts +38 -38
  25. package/dist/mcp/sse-adapter.d.ts.map +1 -1
  26. package/dist/mcp/sse-adapter.js +34 -34
  27. package/dist/mcp/sse-adapter.js.map +1 -1
  28. package/dist/mcp/stdio-adapter.d.ts +38 -38
  29. package/dist/mcp/stdio-adapter.d.ts.map +1 -1
  30. package/dist/mcp/stdio-adapter.js +34 -34
  31. package/dist/mcp/stdio-adapter.js.map +1 -1
  32. package/dist/memory/fs-memory-system.d.ts +199 -58
  33. package/dist/memory/fs-memory-system.d.ts.map +1 -1
  34. package/dist/memory/fs-memory-system.js +290 -74
  35. package/dist/memory/fs-memory-system.js.map +1 -1
  36. package/dist/memory/index.d.ts +3 -0
  37. package/dist/memory/index.d.ts.map +1 -1
  38. package/dist/memory/index.js +3 -0
  39. package/dist/memory/index.js.map +1 -1
  40. package/dist/memory/projection-outbox.d.ts +69 -0
  41. package/dist/memory/projection-outbox.d.ts.map +1 -0
  42. package/dist/memory/projection-outbox.js +187 -0
  43. package/dist/memory/projection-outbox.js.map +1 -0
  44. package/dist/memory/projection-projector.d.ts +16 -0
  45. package/dist/memory/projection-projector.d.ts.map +1 -0
  46. package/dist/memory/projection-projector.js +56 -0
  47. package/dist/memory/projection-projector.js.map +1 -0
  48. package/dist/memory/projection-worker.d.ts +28 -0
  49. package/dist/memory/projection-worker.d.ts.map +1 -0
  50. package/dist/memory/projection-worker.js +84 -0
  51. package/dist/memory/projection-worker.js.map +1 -0
  52. package/dist/observability/jsonl-emitter.d.ts +25 -25
  53. package/dist/observability/jsonl-emitter.d.ts.map +1 -1
  54. package/dist/observability/jsonl-emitter.js +25 -25
  55. package/dist/observability/jsonl-emitter.js.map +1 -1
  56. package/dist/observability/otel-emitter.d.ts +23 -23
  57. package/dist/observability/otel-emitter.d.ts.map +1 -1
  58. package/dist/observability/otel-emitter.js +37 -28
  59. package/dist/observability/otel-emitter.js.map +1 -1
  60. package/dist/providers/anthropic.d.ts +39 -39
  61. package/dist/providers/anthropic.d.ts.map +1 -1
  62. package/dist/providers/anthropic.js +35 -35
  63. package/dist/providers/anthropic.js.map +1 -1
  64. package/dist/providers/mock.d.ts +33 -33
  65. package/dist/providers/mock.d.ts.map +1 -1
  66. package/dist/providers/mock.js +24 -24
  67. package/dist/providers/mock.js.map +1 -1
  68. package/dist/providers/openai.d.ts +51 -50
  69. package/dist/providers/openai.d.ts.map +1 -1
  70. package/dist/providers/openai.js +81 -46
  71. package/dist/providers/openai.js.map +1 -1
  72. package/dist/providers/qwen.d.ts +39 -38
  73. package/dist/providers/qwen.d.ts.map +1 -1
  74. package/dist/providers/qwen.js +27 -24
  75. package/dist/providers/qwen.js.map +1 -1
  76. package/dist/safety/default-gate.d.ts +35 -35
  77. package/dist/safety/default-gate.d.ts.map +1 -1
  78. package/dist/safety/default-gate.js +3 -3
  79. package/dist/safety/default-gate.js.map +1 -1
  80. package/dist/tools/_shared/web-client.d.ts +1 -1
  81. package/dist/tools/_shared/web-client.js +1 -1
  82. package/dist/tools/apply-patch/executor.js.map +1 -1
  83. package/dist/tools/fetch-url/executor.d.ts +2 -2
  84. package/dist/tools/fetch-url/executor.js +7 -7
  85. package/dist/tools/git-blame/executor.js.map +1 -1
  86. package/dist/tools/git-branch/executor.js +2 -2
  87. package/dist/tools/git-branch/executor.js.map +1 -1
  88. package/dist/tools/git-diff/executor.js.map +1 -1
  89. package/dist/tools/git-show/executor.js.map +1 -1
  90. package/dist/tools/git-status/executor.js.map +1 -1
  91. package/dist/tools/glob/executor.js.map +1 -1
  92. package/dist/tools/index.d.ts.map +1 -1
  93. package/dist/tools/index.js +3 -0
  94. package/dist/tools/index.js.map +1 -1
  95. package/dist/tools/list-dir/executor.js +1 -1
  96. package/dist/tools/list-dir/executor.js.map +1 -1
  97. package/dist/tools/read-file/executor.js +1 -1
  98. package/dist/tools/read-file/executor.js.map +1 -1
  99. package/dist/tools/run-shell/executor.js.map +1 -1
  100. package/dist/tools/run-tests/executor.js.map +1 -1
  101. package/dist/tools/run-typecheck/executor.js.map +1 -1
  102. package/dist/tools/search-code/executor.js +1 -1
  103. package/dist/tools/search-code/executor.js.map +1 -1
  104. package/dist/tools/shared.d.ts +9 -9
  105. package/dist/tools/web-fetch/errors.d.ts +2 -2
  106. package/dist/tools/web-fetch/errors.js +3 -3
  107. package/dist/tools/web-fetch/errors.js.map +1 -1
  108. package/dist/tools/web-fetch/executor.d.ts +2 -2
  109. package/dist/tools/web-fetch/executor.js +2 -2
  110. package/dist/tools/web-fetch/types.d.ts +7 -7
  111. package/dist/tools/web-fetch/types.d.ts.map +1 -1
  112. package/dist/tools/web-fetch/types.js +1 -1
  113. package/dist/tools/web-search/errors.d.ts +3 -3
  114. package/dist/tools/web-search/errors.js +3 -3
  115. package/dist/tools/web-search/executor.d.ts +2 -2
  116. package/dist/tools/web-search/executor.js +2 -2
  117. package/dist/tools/web-search/types.d.ts +4 -4
  118. package/dist/tools/web-search/types.d.ts.map +1 -1
  119. package/dist/tools/web-search/types.js +1 -1
  120. package/dist/transformers/document-to-text.d.ts +11 -11
  121. package/dist/transformers/document-to-text.d.ts.map +1 -1
  122. package/dist/transformers/document-to-text.js +11 -11
  123. package/dist/transformers/document-to-text.js.map +1 -1
  124. package/dist/transformers/image-to-text.d.ts +15 -15
  125. package/dist/transformers/image-to-text.d.ts.map +1 -1
  126. package/dist/transformers/image-to-text.js +15 -15
  127. package/dist/transformers/image-to-text.js.map +1 -1
  128. package/dist/vector/index.d.ts +4 -2
  129. package/dist/vector/index.d.ts.map +1 -1
  130. package/dist/vector/index.js +2 -2
  131. package/dist/vector/index.js.map +1 -1
  132. package/dist/vector/local-fs-index.d.ts +59 -0
  133. package/dist/vector/local-fs-index.d.ts.map +1 -0
  134. package/dist/vector/local-fs-index.js +216 -0
  135. package/dist/vector/local-fs-index.js.map +1 -0
  136. package/dist/vector/qdrant.d.ts +11 -73
  137. package/dist/vector/qdrant.d.ts.map +1 -1
  138. package/dist/vector/qdrant.js +29 -164
  139. package/dist/vector/qdrant.js.map +1 -1
  140. package/package.json +19 -4
  141. package/dist/vector/local-fs.d.ts +0 -81
  142. package/dist/vector/local-fs.d.ts.map +0 -1
  143. package/dist/vector/local-fs.js +0 -161
  144. package/dist/vector/local-fs.js.map +0 -1
@@ -1,6 +1,7 @@
1
1
  import { existsSync } from "node:fs";
2
2
  import { appendFile, mkdir, readFile, rename, rm, writeFile, } from "node:fs/promises";
3
3
  import { join } from "node:path";
4
+ import { ProjectionWorker } from "./projection-worker";
4
5
  const JSONL_SEP = "\n";
5
6
  function isObject(x) {
6
7
  return typeof x === "object" && x !== null && !Array.isArray(x);
@@ -8,13 +9,14 @@ function isObject(x) {
8
9
  function parseMemoryEntry(raw) {
9
10
  if (!isObject(raw))
10
11
  return null;
11
- const { role, content, timestamp, anchored } = raw;
12
+ const { id, role, content, timestamp, anchored } = raw;
12
13
  if ((role !== "user" && role !== "assistant" && role !== "system" && role !== "tool") ||
13
14
  typeof timestamp !== "number" ||
14
15
  !Number.isFinite(timestamp)) {
15
16
  return null;
16
17
  }
17
18
  return {
19
+ id: typeof id === "string" && id.length > 0 ? id : `fs-${timestamp}`,
18
20
  role,
19
21
  content: content,
20
22
  timestamp,
@@ -36,53 +38,31 @@ export function sanitizeSessionId(raw) {
36
38
  const bounded = stripped.length > 120 ? stripped.slice(0, 120) : stripped;
37
39
  return bounded.length === 0 ? "default" : bounded;
38
40
  }
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
41
  export class FsMemorySystem {
68
42
  persistDir;
69
43
  inner;
70
44
  compressionThreshold;
71
45
  hydrated = new Set();
72
46
  pending = new Map();
47
+ checkpoints = new Map();
48
+ outbox;
49
+ projectionProject;
50
+ recovered = new Set();
73
51
  /**
74
- * 构造文件持久化 MemorySystem。
75
- *
76
- * @param options 参见 {@link FsMemorySystemOptions}
77
- */
52
+ * 构造文件持久化 MemorySystem。
53
+ *
54
+ * @param options 参见 {@link FsMemorySystemOptions}
55
+ */
78
56
  constructor(options) {
79
57
  this.persistDir = options.persistDir;
80
58
  this.inner = options.inner;
81
59
  this.compressionThreshold = options.compressionThreshold;
60
+ this.outbox = options.projectionOutbox;
61
+ this.projectionProject = options.projectionProject;
82
62
  }
83
63
  /**
84
- * @inheritdoc
85
- */
64
+ * @inheritdoc
65
+ */
86
66
  async load(sessionId, ctx) {
87
67
  return this.serialize(sessionId, async () => {
88
68
  await this.hydrateIfNeeded(sessionId);
@@ -90,17 +70,17 @@ export class FsMemorySystem {
90
70
  });
91
71
  }
92
72
  /**
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
- */
73
+ * @inheritdoc
74
+ *
75
+ * 流程:
76
+ * 1. 确保 session 已 hydrate(使 window 与磁盘一致)
77
+ * 2. append-only 将 entry 序列化为单行 JSON 落盘(崩溃安全;即便本次进程 crash,
78
+ * 磁盘文件仍是合法 jsonl 的前缀)
79
+ * 3. 将 entry 通过 `inner.hydrate()` 注入内存 window(旁路 per-entry compress)
80
+ * 4. 手动检查 tokenCount 是否越过阈值;若越线:
81
+ * - `inner.compress(sid)` 触发 LLM 摘要
82
+ * - atomic rewrite jsonl,保持盘与内存一致
83
+ */
104
84
  async append(sessionId, entry, ctx) {
105
85
  await this.serialize(sessionId, async () => {
106
86
  await this.hydrateIfNeeded(sessionId);
@@ -113,9 +93,18 @@ export class FsMemorySystem {
113
93
  }
114
94
  });
115
95
  }
96
+ async appendEntries(sessionId, entries, ctx) {
97
+ for (const entry of entries) {
98
+ await this.append(sessionId, entry, ctx);
99
+ }
100
+ return {
101
+ appended: entries.length,
102
+ projectionStatus: entries.map((entry) => this.pendingProjection(entry.id)),
103
+ };
104
+ }
116
105
  /**
117
- * @inheritdoc
118
- */
106
+ * @inheritdoc
107
+ */
119
108
  async compress(sessionId) {
120
109
  await this.serialize(sessionId, async () => {
121
110
  await this.hydrateIfNeeded(sessionId);
@@ -124,8 +113,8 @@ export class FsMemorySystem {
124
113
  });
125
114
  }
126
115
  /**
127
- * @inheritdoc
128
- */
116
+ * @inheritdoc
117
+ */
129
118
  async recall(sessionId, query, topK) {
130
119
  await this.hydrateIfNeeded(sessionId);
131
120
  return topK === undefined
@@ -133,22 +122,149 @@ export class FsMemorySystem {
133
122
  : this.inner.recall(sessionId, query, topK);
134
123
  }
135
124
  /**
136
- * @inheritdoc
137
- */
138
- async archive(sessionId) {
125
+ * @inheritdoc
126
+ */
127
+ async loadFull(sessionId) {
139
128
  await this.hydrateIfNeeded(sessionId);
140
- await this.inner.archive(sessionId);
129
+ return this.inner.loadFull(sessionId);
130
+ }
131
+ async loadSession(sessionId, ctx) {
132
+ const window = await this.load(sessionId, ctx);
133
+ const entries = [...window.entries].sort((left, right) => left.timestamp - right.timestamp);
134
+ const updatedAt = entries.length > 0 ? Math.max(...entries.map((entry) => entry.timestamp)) : Date.now();
135
+ const archiveRefs = await this.readArchiveRefs(sessionId);
136
+ const outboxByRef = await this.snapshotOutboxByRef(sessionId);
137
+ return {
138
+ meta: {
139
+ id: sessionId,
140
+ updatedAt,
141
+ entryCount: entries.length,
142
+ },
143
+ hotLog: entries,
144
+ summaries: this.extractSummaries(sessionId, entries),
145
+ archiveRefs,
146
+ projectionStatus: entries.map((entry) => this.projectionStatusFor(entry.id, outboxByRef)),
147
+ budget: {
148
+ tokenLimit: window.limit,
149
+ tokenUsed: window.tokenCount,
150
+ },
151
+ ...(this.checkpoints.has(sessionId)
152
+ ? { checkpoint: this.checkpoints.get(sessionId) }
153
+ : {}),
154
+ };
155
+ }
156
+ async loadView(sessionId, view, ctx) {
157
+ const snapshot = await this.loadSession(sessionId, ctx);
158
+ const since = view.since ?? Number.NEGATIVE_INFINITY;
159
+ const entries = snapshot.hotLog
160
+ .filter((entry) => entry.timestamp >= since)
161
+ .slice(view.limit !== undefined ? -view.limit : 0);
162
+ if (view.kind === "summary") {
163
+ return {
164
+ kind: view.kind,
165
+ entries: [],
166
+ summaries: snapshot.summaries,
167
+ projectionStatus: snapshot.projectionStatus,
168
+ };
169
+ }
170
+ return {
171
+ kind: view.kind,
172
+ entries,
173
+ summaries: snapshot.summaries,
174
+ projectionStatus: snapshot.projectionStatus,
175
+ };
176
+ }
177
+ async compact(sessionId, _policy, _ctx) {
178
+ await this.compress(sessionId);
179
+ const entries = await this.loadFull(sessionId);
180
+ // archiveRefs 持久化。compact 生成一条 ref 描述本次压缩涉及的 entry 集合,
181
+ // 落盘到 `<persistDir>/<sid>.archive.json`,确保跨进程 `loadSession` 能正确回放。
182
+ const existing = await this.readArchiveRefs(sessionId);
183
+ const next = [
184
+ ...existing,
185
+ {
186
+ id: `compact-${Date.now()}`,
187
+ entryIds: entries.map((entry) => entry.id),
188
+ createdAt: Date.now(),
189
+ },
190
+ ];
191
+ await this.writeArchiveRefs(sessionId, next);
192
+ return {
193
+ summaries: this.extractSummaries(sessionId, entries),
194
+ archiveRefs: next,
195
+ };
196
+ }
197
+ async checkpoint(sessionId, checkpoint, _ctx) {
198
+ this.checkpoints.set(sessionId, checkpoint);
199
+ }
200
+ /**
201
+ * @inheritdoc
202
+ *
203
+ * 当 host 注入 `projectionOutbox` 时,每条 entry 走 outbox 状态机
204
+ * (pending → retrying → indexed/failed/dead),并在首次 archive 该 session 时
205
+ * 自动 `recover()` 残留的陈旧 retrying 项。
206
+ *
207
+ * `awaitProjection=false` 时只写冷归档并入队 projection,由 `ProjectionWorker`
208
+ * 后台 flush;默认保持旧同步语义,等待本轮 projection 完成后返回。
209
+ */
210
+ async archive(sessionId, options = {}) {
211
+ await this.hydrateIfNeeded(sessionId);
212
+ if (!this.outbox) {
213
+ await this.inner.archive(sessionId);
214
+ return;
215
+ }
216
+ if (!this.recovered.has(sessionId)) {
217
+ await this.outbox.recover(sessionId);
218
+ this.recovered.add(sessionId);
219
+ }
220
+ const entries = await this.inner.loadFull(sessionId);
221
+ if (entries.length === 0)
222
+ return;
223
+ for (const entry of entries) {
224
+ await this.outbox.enqueue(sessionId, entry.id);
225
+ }
226
+ await this.inner.archiveSource(sessionId);
227
+ if (options.awaitProjection !== false) {
228
+ await this.createProjectionWorker().flush(sessionId);
229
+ }
141
230
  }
142
231
  /**
143
- * @inheritdoc
144
- */
232
+ * Construct a {@link ProjectionWorker} that drains the outbox via the
233
+ * host-injected `projectionProject` callback.
234
+ *
235
+ * **Fail-closed contract:** when `projectionOutbox` is
236
+ * enabled, `projectionProject` MUST be provided. The legacy fallback to
237
+ * `InMemoryMemorySystem.project()` (which forwarded raw `string` content
238
+ * straight to `VectorStore.upsert(id, text, { content })` and bypassed the
239
+ * `EmbeddingRuntime` / `VectorIndexAdapter` stack) has been removed — any
240
+ * production host that forgets to wire the projector now crashes loudly
241
+ * instead of silently re-introducing the deprecated text-embed path.
242
+ */
243
+ createProjectionWorker(options) {
244
+ if (!this.outbox) {
245
+ throw new Error("ProjectionWorker requires FsMemorySystem.projectionOutbox");
246
+ }
247
+ if (!this.projectionProject) {
248
+ throw new Error("ProjectionWorker requires FsMemorySystem.projectionProject when projectionOutbox is enabled. " +
249
+ "Inject an embedding-runtime + vector-index backed projector via host-defaults' " +
250
+ "resolveProjectionStack(); the legacy inner.project() fallback has been retired.");
251
+ }
252
+ return new ProjectionWorker({
253
+ outbox: this.outbox,
254
+ ...(options?.intervalMs !== undefined ? { intervalMs: options.intervalMs } : {}),
255
+ project: this.projectionProject,
256
+ });
257
+ }
258
+ /**
259
+ * @inheritdoc
260
+ */
145
261
  async getSize(sessionId) {
146
262
  await this.hydrateIfNeeded(sessionId);
147
263
  return this.inner.getSize(sessionId);
148
264
  }
149
265
  /**
150
- * @inheritdoc
151
- */
266
+ * @inheritdoc
267
+ */
152
268
  async trim(sessionId, options) {
153
269
  await this.serialize(sessionId, async () => {
154
270
  await this.hydrateIfNeeded(sessionId);
@@ -157,13 +273,14 @@ export class FsMemorySystem {
157
273
  });
158
274
  }
159
275
  /**
160
- * @inheritdoc
161
- *
162
- * 先清内存 window,再幂等删除磁盘 jsonl。未找到文件视为 no-op。
163
- */
276
+ * @inheritdoc
277
+ *
278
+ * 先清内存 window,再幂等删除磁盘 jsonl。未找到文件视为 no-op。
279
+ */
164
280
  async clear(sessionId) {
165
281
  await this.serialize(sessionId, async () => {
166
282
  this.hydrated.delete(sessionId);
283
+ this.checkpoints.delete(sessionId);
167
284
  await this.inner.clear(sessionId);
168
285
  const path = this.pathFor(sessionId);
169
286
  try {
@@ -174,18 +291,117 @@ export class FsMemorySystem {
174
291
  }
175
292
  });
176
293
  }
294
+ pendingProjection(ref) {
295
+ return {
296
+ kind: "pending",
297
+ ref,
298
+ reason: "awaiting semantic projection",
299
+ createdAt: Date.now(),
300
+ };
301
+ }
302
+ async snapshotOutboxByRef(sessionId) {
303
+ if (!this.outbox)
304
+ return undefined;
305
+ const records = await this.outbox.list(sessionId);
306
+ const map = new Map();
307
+ for (const rec of records) {
308
+ switch (rec.state) {
309
+ case "indexed":
310
+ map.set(rec.ref, {
311
+ kind: "indexed",
312
+ ref: rec.ref,
313
+ indexedAt: rec.updatedAt,
314
+ adapter: "vector-store",
315
+ });
316
+ break;
317
+ case "failed":
318
+ case "retrying":
319
+ case "dead":
320
+ map.set(rec.ref, {
321
+ kind: "failed",
322
+ ref: rec.ref,
323
+ error: rec.lastError ?? "unknown",
324
+ retryable: rec.state !== "dead",
325
+ attempts: rec.attempts,
326
+ });
327
+ break;
328
+ case "pending":
329
+ default:
330
+ map.set(rec.ref, {
331
+ kind: "pending",
332
+ ref: rec.ref,
333
+ reason: "awaiting semantic projection",
334
+ createdAt: rec.createdAt,
335
+ });
336
+ }
337
+ }
338
+ return map;
339
+ }
340
+ projectionStatusFor(ref, outboxByRef) {
341
+ if (outboxByRef) {
342
+ const status = outboxByRef.get(ref);
343
+ if (status)
344
+ return status;
345
+ }
346
+ return this.pendingProjection(ref);
347
+ }
348
+ /** archiveRefs 持久化路径。 */
349
+ archiveRefsPathFor(sessionId) {
350
+ return join(this.persistDir, `${sanitizeSessionId(sessionId)}.archive.json`);
351
+ }
352
+ async readArchiveRefs(sessionId) {
353
+ const path = this.archiveRefsPathFor(sessionId);
354
+ if (!existsSync(path))
355
+ return [];
356
+ try {
357
+ const text = await readFile(path, "utf8");
358
+ const parsed = JSON.parse(text);
359
+ if (!Array.isArray(parsed))
360
+ return [];
361
+ return parsed.filter((item) => item &&
362
+ typeof item === "object" &&
363
+ typeof item.id === "string" &&
364
+ Array.isArray(item.entryIds) &&
365
+ typeof item.createdAt === "number");
366
+ }
367
+ catch {
368
+ return [];
369
+ }
370
+ }
371
+ async writeArchiveRefs(sessionId, refs) {
372
+ const path = this.archiveRefsPathFor(sessionId);
373
+ await mkdir(this.persistDir, { recursive: true });
374
+ const tmp = `${path}.tmp`;
375
+ await writeFile(tmp, JSON.stringify(refs, null, 2), "utf8");
376
+ await rename(tmp, path);
377
+ }
378
+ extractSummaries(sessionId, entries) {
379
+ return entries
380
+ .filter((entry) => entry.role === "system" &&
381
+ typeof entry.content === "string" &&
382
+ entry.content.includes("摘要"))
383
+ .map((entry) => ({
384
+ id: entry.id,
385
+ sessionId,
386
+ sourceEntryIds: [],
387
+ sourceRange: { fromTs: entry.timestamp, toTs: entry.timestamp },
388
+ content: entry.content,
389
+ method: "head-middle-tail",
390
+ createdAt: entry.timestamp,
391
+ }));
392
+ }
177
393
  /**
178
- * 获取某 session 的持久化文件绝对 / 相对路径(便于外层 CLI 做迁移、/history 展示)。
179
- */
394
+ * 获取某 session 的持久化文件绝对 / 相对路径(便于外层 CLI 做迁移、/history 展示)。
395
+ */
180
396
  pathFor(sessionId) {
181
397
  return join(this.persistDir, `${sanitizeSessionId(sessionId)}.jsonl`);
182
398
  }
183
399
  /**
184
- * 从磁盘读取 session 的原始 entries 快照(不经 inner hydrate)。
185
- *
186
- * 外层 CLI 可借此在 `/history` / `/export` 命令中直接列出原始条目顺序,
187
- * 不必先 `load` 触发 hydrate 副作用。
188
- */
400
+ * 从磁盘读取 session 的原始 entries 快照(不经 inner hydrate)。
401
+ *
402
+ * 外层 CLI 可借此在 `/history` / `/export` 命令中直接列出原始条目顺序,
403
+ * 不必先 `load` 触发 hydrate 副作用。
404
+ */
189
405
  async readRaw(sessionId) {
190
406
  const path = this.pathFor(sessionId);
191
407
  if (!existsSync(path)) {
@@ -244,11 +460,11 @@ export class FsMemorySystem {
244
460
  await rename(tmp, path);
245
461
  }
246
462
  /**
247
- * 串行化某 session 的关键操作 —— 通过 promise chain 保证同一 sessionId 上的
248
- * load / append / compress / trim 不交错。
249
- *
250
- * 失败不阻塞队列:下一个 task 无论前一个 resolve 还是 reject 都会启动。
251
- */
463
+ * 串行化某 session 的关键操作 —— 通过 promise chain 保证同一 sessionId 上的
464
+ * load / append / compress / trim 不交错。
465
+ *
466
+ * 失败不阻塞队列:下一个 task 无论前一个 resolve 还是 reject 都会启动。
467
+ */
252
468
  async serialize(sessionId, fn) {
253
469
  const prev = this.pending.get(sessionId) ?? Promise.resolve();
254
470
  const next = prev.then(fn, fn);
@@ -1 +1 @@
1
- {"version":3,"file":"fs-memory-system.js","sourceRoot":"","sources":["../../src/memory/fs-memory-system.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fs-memory-system.js","sourceRoot":"","sources":["../../src/memory/fs-memory-system.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,5 @@
1
1
  export { FsMemorySystem, sanitizeSessionId, type FsMemorySystemOptions, } from "./fs-memory-system";
2
+ export { ProjectionOutbox, type ProjectionOutboxOptions, type ProjectionRecord, type ProjectionState, } from "./projection-outbox";
3
+ export { ProjectionWorker, type ProjectionWorkerFlushResult, type ProjectionWorkerOptions, type ProjectionWorkerProjectResult, } from "./projection-worker";
4
+ export { projectMemoryRefs, type ProjectionProjectorDeps } from "./projection-projector";
2
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +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"}
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;AAC5B,OAAO,EACL,gBAAgB,EAChB,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,EACrB,KAAK,eAAe,GACrB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,gBAAgB,EAChB,KAAK,2BAA2B,EAChC,KAAK,uBAAuB,EAC5B,KAAK,6BAA6B,GACnC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,KAAK,uBAAuB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -1,2 +1,5 @@
1
1
  export { FsMemorySystem, sanitizeSessionId, } from "./fs-memory-system";
2
+ export { ProjectionOutbox, } from "./projection-outbox";
3
+ export { ProjectionWorker, } from "./projection-worker";
4
+ export { projectMemoryRefs } from "./projection-projector";
2
5
  //# sourceMappingURL=index.js.map
@@ -1 +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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/memory/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,iBAAiB,GAElB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,gBAAgB,GAIjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,gBAAgB,GAIjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAgC,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Projection 投递 outbox 状态机。
3
+ *
4
+ * 状态转移:
5
+ * ```
6
+ * pending ──enqueue──▶ retrying ──ok──▶ indexed
7
+ * │
8
+ * ├─error & attempts<max──▶ failed ──retry──▶ retrying
9
+ * │
10
+ * └─error & attempts≥max──▶ dead (DLQ)
11
+ * ```
12
+ *
13
+ * - 每条投递持久化到 `<dir>/<sessionId>.jsonl`(append-only + 原子重写)。
14
+ * - `dead` 项移到 `<dir>/dead/<sessionId>.<ts>.json` 形成 DLQ,主文件中标记为 `dead`。
15
+ * - 启动时 `recover()` 把超过 `staleAfterMs` 仍处于 `retrying` 的项重置为 `pending`,
16
+ * 防止上次进程在 upsert 期间被 kill 留下"幽灵 retrying"。
17
+ *
18
+ * 交付:真状态机 + 真持久化 + 真 DLQ + 真 crash 恢复。
19
+ * 交付:`ProjectionWorker` 可独立 flush pending 队列,
20
+ * 让 host 将 archive 主路径与 vector projection 解耦。
21
+ */
22
+ export type ProjectionState = "pending" | "retrying" | "indexed" | "failed" | "dead";
23
+ export interface ProjectionRecord {
24
+ ref: string;
25
+ state: ProjectionState;
26
+ attempts: number;
27
+ createdAt: number;
28
+ updatedAt: number;
29
+ lastError?: string;
30
+ vectorId?: string;
31
+ }
32
+ export interface ProjectionOutboxOptions {
33
+ /** 持久化根目录,默认 `<cwd>/.tachu/projections`。 */
34
+ dir: string;
35
+ /** 最大重试次数;达到后入 DLQ(默认 5)。 */
36
+ maxAttempts?: number;
37
+ /** retrying 状态超过该毫秒数视为陈旧(默认 5 分钟)。 */
38
+ staleAfterMs?: number;
39
+ }
40
+ export declare class ProjectionOutbox {
41
+ private readonly dir;
42
+ private readonly maxAttempts;
43
+ private readonly staleAfterMs;
44
+ private readonly cache;
45
+ constructor(options: ProjectionOutboxOptions);
46
+ private pathFor;
47
+ private deadDir;
48
+ /** 读取/构造 session 的内存索引(按 ref 唯一)。 */
49
+ private loadIndex;
50
+ /** 原子重写 jsonl。 */
51
+ private flush;
52
+ /** 启动恢复:将陈旧 retrying 重置为 pending。 */
53
+ recover(sessionId: string, now?: number): Promise<number>;
54
+ enqueue(sessionId: string, ref: string, now?: number): Promise<void>;
55
+ markRetrying(sessionId: string, ref: string, now?: number): Promise<void>;
56
+ markIndexed(sessionId: string, ref: string, vectorId: string, now?: number): Promise<void>;
57
+ markFailed(sessionId: string, ref: string, error: string, now?: number): Promise<ProjectionState>;
58
+ list(sessionId: string): Promise<ProjectionRecord[]>;
59
+ listSessions(): Promise<string[]>;
60
+ listPending(sessionId: string): Promise<ProjectionRecord[]>;
61
+ pendingCount(sessionId: string): Promise<number>;
62
+ /** 清空缓存(用于测试模拟进程重启)。 */
63
+ resetCache(): void;
64
+ get directory(): string;
65
+ /** 仅用于内部诊断:用户可拿到 dead 目录路径检查 DLQ。 */
66
+ get deadLetterDir(): string;
67
+ static dirnameOf(path: string): string;
68
+ }
69
+ //# sourceMappingURL=projection-outbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projection-outbox.d.ts","sourceRoot":"","sources":["../../src/memory/projection-outbox.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,MAAM,eAAe,GACvB,SAAS,GACT,UAAU,GACV,SAAS,GACT,QAAQ,GACR,MAAM,CAAC;AAEX,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,eAAe,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,uBAAuB;IACvC,4CAA4C;IAC3C,GAAG,EAAE,MAAM,CAAC;IACb,6BAA6B;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACtB,sCAAsC;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAeD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoD;gBAE9D,OAAO,EAAE,uBAAuB;IAM5C,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,OAAO;IAIhB,qCAAqC;YACtB,SAAS;IAiBxB,kBAAkB;YACH,KAAK;IAUpB,qCAAqC;IAC9B,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,OAAO,CAAC,MAAM,CAAC;IAcrE,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAchF,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IASrF,WAAW,CACf,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,GAAG,GAAE,MAAmB,GACvB,OAAO,CAAC,IAAI,CAAC;IAgBV,UAAU,CACd,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,GAAG,GAAE,MAAmB,GACvB,OAAO,CAAC,eAAe,CAAC;IA4BrB,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAKpD,YAAY,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IASjC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAK3D,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IASvD,wBAAwB;IACvB,UAAU,IAAI,IAAI;IAIlB,IAAI,SAAS,IAAI,MAAM,CAEtB;IAEF,qCAAqC;IACpC,IAAI,aAAa,IAAI,MAAM,CAE1B;IAGD,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;CAGvC"}