@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.
- package/CHANGELOG.md +25 -236
- package/README.md +53 -998
- package/README_ZH.md +52 -973
- package/dist/backends/file.d.ts +6 -6
- package/dist/backends/file.d.ts.map +1 -1
- package/dist/backends/file.js +12 -12
- package/dist/backends/file.js.map +1 -1
- package/dist/backends/terminal.d.ts +6 -6
- package/dist/backends/terminal.d.ts.map +1 -1
- package/dist/backends/terminal.js +9 -9
- package/dist/backends/terminal.js.map +1 -1
- package/dist/backends/web.d.ts +6 -6
- package/dist/backends/web.d.ts.map +1 -1
- package/dist/backends/web.js +8 -8
- package/dist/backends/web.js.map +1 -1
- package/dist/common/path.d.ts +14 -14
- package/dist/common/path.d.ts.map +1 -1
- package/dist/common/path.js +3 -3
- package/dist/common/process.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/mcp/sse-adapter.d.ts +38 -38
- package/dist/mcp/sse-adapter.d.ts.map +1 -1
- package/dist/mcp/sse-adapter.js +34 -34
- package/dist/mcp/sse-adapter.js.map +1 -1
- package/dist/mcp/stdio-adapter.d.ts +38 -38
- package/dist/mcp/stdio-adapter.d.ts.map +1 -1
- package/dist/mcp/stdio-adapter.js +34 -34
- package/dist/mcp/stdio-adapter.js.map +1 -1
- package/dist/memory/fs-memory-system.d.ts +199 -58
- package/dist/memory/fs-memory-system.d.ts.map +1 -1
- package/dist/memory/fs-memory-system.js +290 -74
- package/dist/memory/fs-memory-system.js.map +1 -1
- package/dist/memory/index.d.ts +3 -0
- package/dist/memory/index.d.ts.map +1 -1
- package/dist/memory/index.js +3 -0
- package/dist/memory/index.js.map +1 -1
- package/dist/memory/projection-outbox.d.ts +69 -0
- package/dist/memory/projection-outbox.d.ts.map +1 -0
- package/dist/memory/projection-outbox.js +187 -0
- package/dist/memory/projection-outbox.js.map +1 -0
- package/dist/memory/projection-projector.d.ts +16 -0
- package/dist/memory/projection-projector.d.ts.map +1 -0
- package/dist/memory/projection-projector.js +56 -0
- package/dist/memory/projection-projector.js.map +1 -0
- package/dist/memory/projection-worker.d.ts +28 -0
- package/dist/memory/projection-worker.d.ts.map +1 -0
- package/dist/memory/projection-worker.js +84 -0
- package/dist/memory/projection-worker.js.map +1 -0
- package/dist/observability/jsonl-emitter.d.ts +25 -25
- package/dist/observability/jsonl-emitter.d.ts.map +1 -1
- package/dist/observability/jsonl-emitter.js +25 -25
- package/dist/observability/jsonl-emitter.js.map +1 -1
- package/dist/observability/otel-emitter.d.ts +23 -23
- package/dist/observability/otel-emitter.d.ts.map +1 -1
- package/dist/observability/otel-emitter.js +37 -28
- package/dist/observability/otel-emitter.js.map +1 -1
- package/dist/providers/anthropic.d.ts +39 -39
- package/dist/providers/anthropic.d.ts.map +1 -1
- package/dist/providers/anthropic.js +35 -35
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/mock.d.ts +33 -33
- package/dist/providers/mock.d.ts.map +1 -1
- package/dist/providers/mock.js +24 -24
- package/dist/providers/mock.js.map +1 -1
- package/dist/providers/openai.d.ts +51 -50
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +81 -46
- package/dist/providers/openai.js.map +1 -1
- package/dist/providers/qwen.d.ts +39 -38
- package/dist/providers/qwen.d.ts.map +1 -1
- package/dist/providers/qwen.js +27 -24
- package/dist/providers/qwen.js.map +1 -1
- package/dist/safety/default-gate.d.ts +35 -35
- package/dist/safety/default-gate.d.ts.map +1 -1
- package/dist/safety/default-gate.js +3 -3
- package/dist/safety/default-gate.js.map +1 -1
- package/dist/tools/_shared/web-client.d.ts +1 -1
- package/dist/tools/_shared/web-client.js +1 -1
- package/dist/tools/apply-patch/executor.js.map +1 -1
- package/dist/tools/fetch-url/executor.d.ts +2 -2
- package/dist/tools/fetch-url/executor.js +7 -7
- package/dist/tools/git-blame/executor.js.map +1 -1
- package/dist/tools/git-branch/executor.js +2 -2
- package/dist/tools/git-branch/executor.js.map +1 -1
- package/dist/tools/git-diff/executor.js.map +1 -1
- package/dist/tools/git-show/executor.js.map +1 -1
- package/dist/tools/git-status/executor.js.map +1 -1
- package/dist/tools/glob/executor.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +3 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/list-dir/executor.js +1 -1
- package/dist/tools/list-dir/executor.js.map +1 -1
- package/dist/tools/read-file/executor.js +1 -1
- package/dist/tools/read-file/executor.js.map +1 -1
- package/dist/tools/run-shell/executor.js.map +1 -1
- package/dist/tools/run-tests/executor.js.map +1 -1
- package/dist/tools/run-typecheck/executor.js.map +1 -1
- package/dist/tools/search-code/executor.js +1 -1
- package/dist/tools/search-code/executor.js.map +1 -1
- package/dist/tools/shared.d.ts +9 -9
- package/dist/tools/web-fetch/errors.d.ts +2 -2
- package/dist/tools/web-fetch/errors.js +3 -3
- package/dist/tools/web-fetch/errors.js.map +1 -1
- package/dist/tools/web-fetch/executor.d.ts +2 -2
- package/dist/tools/web-fetch/executor.js +2 -2
- package/dist/tools/web-fetch/types.d.ts +7 -7
- package/dist/tools/web-fetch/types.d.ts.map +1 -1
- package/dist/tools/web-fetch/types.js +1 -1
- package/dist/tools/web-search/errors.d.ts +3 -3
- package/dist/tools/web-search/errors.js +3 -3
- package/dist/tools/web-search/executor.d.ts +2 -2
- package/dist/tools/web-search/executor.js +2 -2
- package/dist/tools/web-search/types.d.ts +4 -4
- package/dist/tools/web-search/types.d.ts.map +1 -1
- package/dist/tools/web-search/types.js +1 -1
- package/dist/transformers/document-to-text.d.ts +11 -11
- package/dist/transformers/document-to-text.d.ts.map +1 -1
- package/dist/transformers/document-to-text.js +11 -11
- package/dist/transformers/document-to-text.js.map +1 -1
- package/dist/transformers/image-to-text.d.ts +15 -15
- package/dist/transformers/image-to-text.d.ts.map +1 -1
- package/dist/transformers/image-to-text.js +15 -15
- package/dist/transformers/image-to-text.js.map +1 -1
- package/dist/vector/index.d.ts +4 -2
- package/dist/vector/index.d.ts.map +1 -1
- package/dist/vector/index.js +2 -2
- package/dist/vector/index.js.map +1 -1
- package/dist/vector/local-fs-index.d.ts +59 -0
- package/dist/vector/local-fs-index.d.ts.map +1 -0
- package/dist/vector/local-fs-index.js +216 -0
- package/dist/vector/local-fs-index.js.map +1 -0
- package/dist/vector/qdrant.d.ts +11 -73
- package/dist/vector/qdrant.d.ts.map +1 -1
- package/dist/vector/qdrant.js +29 -164
- package/dist/vector/qdrant.js.map +1 -1
- package/package.json +19 -4
- package/dist/vector/local-fs.d.ts +0 -81
- package/dist/vector/local-fs.d.ts.map +0 -1
- package/dist/vector/local-fs.js +0 -161
- package/dist/vector/local-fs.js.map +0 -1
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { mkdir, readFile, readdir, rename, writeFile } from "node:fs/promises";
|
|
3
|
+
import { basename, dirname, extname, join } from "node:path";
|
|
4
|
+
const DEFAULT_MAX_ATTEMPTS = 5;
|
|
5
|
+
const DEFAULT_STALE_MS = 5 * 60_000;
|
|
6
|
+
function parseRecord(raw) {
|
|
7
|
+
try {
|
|
8
|
+
const obj = JSON.parse(raw);
|
|
9
|
+
if (typeof obj.ref !== "string" || typeof obj.state !== "string")
|
|
10
|
+
return null;
|
|
11
|
+
return obj;
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export class ProjectionOutbox {
|
|
18
|
+
dir;
|
|
19
|
+
maxAttempts;
|
|
20
|
+
staleAfterMs;
|
|
21
|
+
cache = new Map();
|
|
22
|
+
constructor(options) {
|
|
23
|
+
this.dir = options.dir;
|
|
24
|
+
this.maxAttempts = options.maxAttempts ?? DEFAULT_MAX_ATTEMPTS;
|
|
25
|
+
this.staleAfterMs = options.staleAfterMs ?? DEFAULT_STALE_MS;
|
|
26
|
+
}
|
|
27
|
+
pathFor(sessionId) {
|
|
28
|
+
return join(this.dir, `${sessionId}.jsonl`);
|
|
29
|
+
}
|
|
30
|
+
deadDir() {
|
|
31
|
+
return join(this.dir, "dead");
|
|
32
|
+
}
|
|
33
|
+
/** 读取/构造 session 的内存索引(按 ref 唯一)。 */
|
|
34
|
+
async loadIndex(sessionId) {
|
|
35
|
+
const cached = this.cache.get(sessionId);
|
|
36
|
+
if (cached)
|
|
37
|
+
return cached;
|
|
38
|
+
const map = new Map();
|
|
39
|
+
const path = this.pathFor(sessionId);
|
|
40
|
+
if (existsSync(path)) {
|
|
41
|
+
const text = await readFile(path, "utf8");
|
|
42
|
+
for (const line of text.split("\n")) {
|
|
43
|
+
if (!line.trim())
|
|
44
|
+
continue;
|
|
45
|
+
const rec = parseRecord(line);
|
|
46
|
+
if (rec)
|
|
47
|
+
map.set(rec.ref, rec); // last-write-wins
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
this.cache.set(sessionId, map);
|
|
51
|
+
return map;
|
|
52
|
+
}
|
|
53
|
+
/** 原子重写 jsonl。 */
|
|
54
|
+
async flush(sessionId) {
|
|
55
|
+
const map = this.cache.get(sessionId);
|
|
56
|
+
if (!map)
|
|
57
|
+
return;
|
|
58
|
+
await mkdir(this.dir, { recursive: true });
|
|
59
|
+
const tmp = `${this.pathFor(sessionId)}.tmp`;
|
|
60
|
+
const lines = [...map.values()].map((rec) => JSON.stringify(rec)).join("\n");
|
|
61
|
+
await writeFile(tmp, lines.length > 0 ? `${lines}\n` : "", "utf8");
|
|
62
|
+
await rename(tmp, this.pathFor(sessionId));
|
|
63
|
+
}
|
|
64
|
+
/** 启动恢复:将陈旧 retrying 重置为 pending。 */
|
|
65
|
+
async recover(sessionId, now = Date.now()) {
|
|
66
|
+
const map = await this.loadIndex(sessionId);
|
|
67
|
+
let reset = 0;
|
|
68
|
+
for (const rec of map.values()) {
|
|
69
|
+
if (rec.state === "retrying" && now - rec.updatedAt > this.staleAfterMs) {
|
|
70
|
+
rec.state = "pending";
|
|
71
|
+
rec.updatedAt = now;
|
|
72
|
+
reset += 1;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (reset > 0)
|
|
76
|
+
await this.flush(sessionId);
|
|
77
|
+
return reset;
|
|
78
|
+
}
|
|
79
|
+
async enqueue(sessionId, ref, now = Date.now()) {
|
|
80
|
+
const map = await this.loadIndex(sessionId);
|
|
81
|
+
const existing = map.get(ref);
|
|
82
|
+
if (existing && existing.state === "indexed")
|
|
83
|
+
return; // idempotent
|
|
84
|
+
map.set(ref, {
|
|
85
|
+
ref,
|
|
86
|
+
state: "pending",
|
|
87
|
+
attempts: existing?.attempts ?? 0,
|
|
88
|
+
createdAt: existing?.createdAt ?? now,
|
|
89
|
+
updatedAt: now,
|
|
90
|
+
});
|
|
91
|
+
await this.flush(sessionId);
|
|
92
|
+
}
|
|
93
|
+
async markRetrying(sessionId, ref, now = Date.now()) {
|
|
94
|
+
const map = await this.loadIndex(sessionId);
|
|
95
|
+
const rec = map.get(ref);
|
|
96
|
+
if (!rec)
|
|
97
|
+
return;
|
|
98
|
+
rec.state = "retrying";
|
|
99
|
+
rec.updatedAt = now;
|
|
100
|
+
await this.flush(sessionId);
|
|
101
|
+
}
|
|
102
|
+
async markIndexed(sessionId, ref, vectorId, now = Date.now()) {
|
|
103
|
+
const map = await this.loadIndex(sessionId);
|
|
104
|
+
const rec = map.get(ref) ?? {
|
|
105
|
+
ref,
|
|
106
|
+
state: "pending",
|
|
107
|
+
attempts: 0,
|
|
108
|
+
createdAt: now,
|
|
109
|
+
updatedAt: now,
|
|
110
|
+
};
|
|
111
|
+
rec.state = "indexed";
|
|
112
|
+
rec.vectorId = vectorId;
|
|
113
|
+
rec.updatedAt = now;
|
|
114
|
+
map.set(ref, rec);
|
|
115
|
+
await this.flush(sessionId);
|
|
116
|
+
}
|
|
117
|
+
async markFailed(sessionId, ref, error, now = Date.now()) {
|
|
118
|
+
const map = await this.loadIndex(sessionId);
|
|
119
|
+
const rec = map.get(ref) ?? {
|
|
120
|
+
ref,
|
|
121
|
+
state: "pending",
|
|
122
|
+
attempts: 0,
|
|
123
|
+
createdAt: now,
|
|
124
|
+
updatedAt: now,
|
|
125
|
+
};
|
|
126
|
+
rec.attempts += 1;
|
|
127
|
+
rec.lastError = error;
|
|
128
|
+
rec.updatedAt = now;
|
|
129
|
+
if (rec.attempts >= this.maxAttempts) {
|
|
130
|
+
rec.state = "dead";
|
|
131
|
+
map.set(ref, rec);
|
|
132
|
+
await this.flush(sessionId);
|
|
133
|
+
// DLQ
|
|
134
|
+
await mkdir(this.deadDir(), { recursive: true });
|
|
135
|
+
const dlqPath = join(this.deadDir(), `${sessionId}.${now}.${rec.ref}.json`);
|
|
136
|
+
await writeFile(dlqPath, JSON.stringify({ sessionId, record: rec }, null, 2), "utf8");
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
rec.state = "failed";
|
|
140
|
+
map.set(ref, rec);
|
|
141
|
+
await this.flush(sessionId);
|
|
142
|
+
}
|
|
143
|
+
return rec.state;
|
|
144
|
+
}
|
|
145
|
+
async list(sessionId) {
|
|
146
|
+
const map = await this.loadIndex(sessionId);
|
|
147
|
+
return [...map.values()];
|
|
148
|
+
}
|
|
149
|
+
async listSessions() {
|
|
150
|
+
if (!existsSync(this.dir))
|
|
151
|
+
return [];
|
|
152
|
+
const entries = await readdir(this.dir, { withFileTypes: true });
|
|
153
|
+
return entries
|
|
154
|
+
.filter((entry) => entry.isFile() && extname(entry.name) === ".jsonl")
|
|
155
|
+
.map((entry) => basename(entry.name, ".jsonl"))
|
|
156
|
+
.sort();
|
|
157
|
+
}
|
|
158
|
+
async listPending(sessionId) {
|
|
159
|
+
const map = await this.loadIndex(sessionId);
|
|
160
|
+
return [...map.values()].filter((rec) => rec.state === "pending" || rec.state === "failed");
|
|
161
|
+
}
|
|
162
|
+
async pendingCount(sessionId) {
|
|
163
|
+
const map = await this.loadIndex(sessionId);
|
|
164
|
+
let n = 0;
|
|
165
|
+
for (const rec of map.values()) {
|
|
166
|
+
if (rec.state === "pending" || rec.state === "failed" || rec.state === "retrying")
|
|
167
|
+
n += 1;
|
|
168
|
+
}
|
|
169
|
+
return n;
|
|
170
|
+
}
|
|
171
|
+
/** 清空缓存(用于测试模拟进程重启)。 */
|
|
172
|
+
resetCache() {
|
|
173
|
+
this.cache.clear();
|
|
174
|
+
}
|
|
175
|
+
get directory() {
|
|
176
|
+
return this.dir;
|
|
177
|
+
}
|
|
178
|
+
/** 仅用于内部诊断:用户可拿到 dead 目录路径检查 DLQ。 */
|
|
179
|
+
get deadLetterDir() {
|
|
180
|
+
return this.deadDir();
|
|
181
|
+
}
|
|
182
|
+
// 兼容 lint/test:保留 dirname 引用以避免 unused import 报错。
|
|
183
|
+
static dirnameOf(path) {
|
|
184
|
+
return dirname(path);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=projection-outbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projection-outbox.js","sourceRoot":"","sources":["../../src/memory/projection-outbox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC/E,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAiD7D,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAC/B,MAAM,gBAAgB,GAAG,CAAC,GAAG,MAAM,CAAC;AAEpC,SAAS,WAAW,CAAC,GAAW;IAC9B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAqB,CAAC;QAChD,IAAI,OAAO,GAAG,CAAC,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC9E,OAAO,GAAG,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,OAAO,gBAAgB;IACV,GAAG,CAAS;IACZ,WAAW,CAAS;IACpB,YAAY,CAAS;IACrB,KAAK,GAAG,IAAI,GAAG,EAAyC,CAAC;IAE1E,YAAY,OAAgC;QAC1C,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;QACvB,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,oBAAoB,CAAC;QAC/D,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,gBAAgB,CAAC;IAC/D,CAAC;IAEO,OAAO,CAAC,SAAiB;QAC/B,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAEO,OAAO;QACb,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAChC,CAAC;IAEF,qCAAqC;IAC5B,KAAK,CAAC,SAAS,CAAC,SAAiB;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACzC,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;QAC1B,MAAM,GAAG,GAAG,IAAI,GAAG,EAA4B,CAAC;QAChD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACrC,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC1C,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBACpC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;oBAAE,SAAS;gBAC3B,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;gBAC9B,IAAI,GAAG;oBAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,kBAAkB;YACpD,CAAC;QACH,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QAC/B,OAAO,GAAG,CAAC;IACb,CAAC;IAEF,kBAAkB;IACT,KAAK,CAAC,KAAK,CAAC,SAAiB;QACnC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACtC,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC;QAC7C,MAAM,KAAK,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7E,MAAM,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QACnE,MAAM,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IAC7C,CAAC;IAEF,qCAAqC;IACpC,KAAK,CAAC,OAAO,CAAC,SAAiB,EAAE,MAAc,IAAI,CAAC,GAAG,EAAE;QACvD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC5C,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;YAC/B,IAAI,GAAG,CAAC,KAAK,KAAK,UAAU,IAAI,GAAG,GAAG,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;gBACxE,GAAG,CAAC,KAAK,GAAG,SAAS,CAAC;gBACtB,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC;gBACpB,KAAK,IAAI,CAAC,CAAC;YACb,CAAC;QACH,CAAC;QACD,IAAI,KAAK,GAAG,CAAC;YAAE,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC3C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,SAAiB,EAAE,GAAW,EAAE,MAAc,IAAI,CAAC,GAAG,EAAE;QACpE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,QAAQ,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS;YAAE,OAAO,CAAC,aAAa;QACnE,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE;YACX,GAAG;YACH,KAAK,EAAE,SAAS;YAChB,QAAQ,EAAE,QAAQ,EAAE,QAAQ,IAAI,CAAC;YACjC,SAAS,EAAE,QAAQ,EAAE,SAAS,IAAI,GAAG;YACrC,SAAS,EAAE,GAAG;SACf,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,SAAiB,EAAE,GAAW,EAAE,MAAc,IAAI,CAAC,GAAG,EAAE;QACzE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC5C,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,GAAG,CAAC,KAAK,GAAG,UAAU,CAAC;QACvB,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC;QACpB,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,WAAW,CACf,SAAiB,EACjB,GAAW,EACX,QAAgB,EAChB,MAAc,IAAI,CAAC,GAAG,EAAE;QAExB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC5C,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI;YAC1B,GAAG;YACH,KAAK,EAAE,SAA4B;YACnC,QAAQ,EAAE,CAAC;YACX,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,GAAG;SACf,CAAC;QACF,GAAG,CAAC,KAAK,GAAG,SAAS,CAAC;QACtB,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACxB,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC;QACpB,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAClB,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,UAAU,CACd,SAAiB,EACjB,GAAW,EACX,KAAa,EACb,MAAc,IAAI,CAAC,GAAG,EAAE;QAExB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC5C,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI;YAC1B,GAAG;YACH,KAAK,EAAE,SAA4B;YACnC,QAAQ,EAAE,CAAC;YACX,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,GAAG;SACf,CAAC;QACF,GAAG,CAAC,QAAQ,IAAI,CAAC,CAAC;QAClB,GAAG,CAAC,SAAS,GAAG,KAAK,CAAC;QACtB,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC;QACpB,IAAI,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrC,GAAG,CAAC,KAAK,GAAG,MAAM,CAAC;YACnB,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAClB,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACjC,MAAM;YACD,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACjD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,SAAS,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;YAC5E,MAAM,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QACxF,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,KAAK,GAAG,QAAQ,CAAC;YACrB,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAClB,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC9B,CAAC;QACD,OAAO,GAAG,CAAC,KAAK,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAAiB;QAC1B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,OAAO,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACjE,OAAO,OAAO;aACX,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC;aACrE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;aAC9C,IAAI,EAAE,CAAC;IACZ,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,SAAiB;QACjC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,KAAK,SAAS,IAAI,GAAG,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC;IAC9F,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,SAAiB;QAClC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC5C,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;YAC/B,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS,IAAI,GAAG,CAAC,KAAK,KAAK,QAAQ,IAAI,GAAG,CAAC,KAAK,KAAK,UAAU;gBAAE,CAAC,IAAI,CAAC,CAAC;QAC5F,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IAEF,wBAAwB;IACvB,UAAU;QACR,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,GAAG,CAAC;IAClB,CAAC;IAEF,qCAAqC;IACpC,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC;IAEF,kDAAkD;IACjD,MAAM,CAAC,SAAS,CAAC,IAAY;QAC3B,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC;CACF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { AdapterCallContext, EmbeddingRuntime, MemoryEntry, VectorIndexAdapter } from "@tachu/core";
|
|
2
|
+
import type { ProjectionWorkerProjectResult } from "./projection-worker";
|
|
3
|
+
export interface ProjectionProjectorDeps {
|
|
4
|
+
embedding: EmbeddingRuntime;
|
|
5
|
+
vectorIndex: VectorIndexAdapter;
|
|
6
|
+
loadEntry: (sessionId: string, ref: string) => Promise<{
|
|
7
|
+
entry: MemoryEntry;
|
|
8
|
+
content: string;
|
|
9
|
+
} | null>;
|
|
10
|
+
namespace?: string | undefined;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* embed source text via EmbeddingRuntime, upsert precomputed vectors, mark outbox indexed.
|
|
14
|
+
*/
|
|
15
|
+
export declare function projectMemoryRefs(deps: ProjectionProjectorDeps, sessionId: string, refs: readonly string[], ctx: AdapterCallContext, signal: AbortSignal): Promise<ProjectionWorkerProjectResult[]>;
|
|
16
|
+
//# sourceMappingURL=projection-projector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projection-projector.d.ts","sourceRoot":"","sources":["../../src/memory/projection-projector.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,kBAAkB,EAClB,gBAAgB,EAChB,WAAW,EACX,kBAAkB,EACnB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,qBAAqB,CAAC;AAEzE,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,gBAAgB,CAAC;IAC5B,WAAW,EAAE,kBAAkB,CAAC;IAChC,SAAS,EAAE,CACT,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,KACR,OAAO,CAAC;QAAE,KAAK,EAAE,WAAW,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IAC7D,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC;AAMD;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,uBAAuB,EAC7B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,GAAG,EAAE,kBAAkB,EACvB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,6BAA6B,EAAE,CAAC,CAyD1C"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
function contentHash(content) {
|
|
3
|
+
return createHash("sha256").update(content).digest("hex");
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* embed source text via EmbeddingRuntime, upsert precomputed vectors, mark outbox indexed.
|
|
7
|
+
*/
|
|
8
|
+
export async function projectMemoryRefs(deps, sessionId, refs, ctx, signal) {
|
|
9
|
+
const results = [];
|
|
10
|
+
const profile = deps.embedding.describe();
|
|
11
|
+
const namespace = deps.namespace ?? sessionId;
|
|
12
|
+
for (const ref of refs) {
|
|
13
|
+
signal.throwIfAborted();
|
|
14
|
+
const loaded = await deps.loadEntry(sessionId, ref);
|
|
15
|
+
if (!loaded) {
|
|
16
|
+
throw new Error(`projection source not found for ref ${ref}`);
|
|
17
|
+
}
|
|
18
|
+
const { entry, content } = loaded;
|
|
19
|
+
const hash = contentHash(content);
|
|
20
|
+
const response = await deps.embedding.embed({
|
|
21
|
+
model: profile.model,
|
|
22
|
+
inputs: [content],
|
|
23
|
+
taskType: "RETRIEVAL_DOCUMENT",
|
|
24
|
+
...(profile.dimensions !== undefined
|
|
25
|
+
? { outputDimensionality: profile.dimensions }
|
|
26
|
+
: {}),
|
|
27
|
+
}, ctx, signal);
|
|
28
|
+
const vector = response.embeddings[0];
|
|
29
|
+
if (!vector || vector.length === 0) {
|
|
30
|
+
throw new Error(`embedding runtime returned empty vector for ref ${ref}`);
|
|
31
|
+
}
|
|
32
|
+
const vectorId = `${sessionId}-${entry.timestamp}`;
|
|
33
|
+
await deps.vectorIndex.upsert([
|
|
34
|
+
{
|
|
35
|
+
id: vectorId,
|
|
36
|
+
vector,
|
|
37
|
+
payload: {
|
|
38
|
+
ref: entry.id,
|
|
39
|
+
sourceKind: "memory-entry",
|
|
40
|
+
contentHash: hash,
|
|
41
|
+
sessionId,
|
|
42
|
+
namespace,
|
|
43
|
+
role: entry.role,
|
|
44
|
+
timestamp: entry.timestamp,
|
|
45
|
+
projectionVersion: 1,
|
|
46
|
+
embeddingProvider: profile.providerId,
|
|
47
|
+
embeddingModel: profile.model,
|
|
48
|
+
...(profile.dimensions !== undefined ? { embeddingDimensions: profile.dimensions } : {}),
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
], ctx, signal);
|
|
52
|
+
results.push({ ref, vectorId });
|
|
53
|
+
}
|
|
54
|
+
return results;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=projection-projector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projection-projector.js","sourceRoot":"","sources":["../../src/memory/projection-projector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAmBzC,SAAS,WAAW,CAAC,OAAe;IAClC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5D,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,IAA6B,EAC7B,SAAiB,EACjB,IAAuB,EACvB,GAAuB,EACvB,MAAmB;IAEnB,MAAM,OAAO,GAAoC,EAAE,CAAC;IACrD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;IACzC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC;IAE9C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,CAAC,cAAc,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,uCAAuC,GAAG,EAAE,CAAC,CAAC;QAChE,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;QAClC,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QAClC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CACzC;YACE,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,CAAC,OAAO,CAAC;YACjB,QAAQ,EAAE,oBAAoB;YAC9B,GAAG,CAAC,OAAO,CAAC,UAAU,KAAK,SAAS;gBAClC,CAAC,CAAC,EAAE,oBAAoB,EAAE,OAAO,CAAC,UAAU,EAAE;gBAC9C,CAAC,CAAC,EAAE,CAAC;SACR,EACD,GAAG,EACH,MAAM,CACP,CAAC;QACF,MAAM,MAAM,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,mDAAmD,GAAG,EAAE,CAAC,CAAC;QAC5E,CAAC;QACD,MAAM,QAAQ,GAAG,GAAG,SAAS,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACnD,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAC3B;YACE;gBACE,EAAE,EAAE,QAAQ;gBACZ,MAAM;gBACN,OAAO,EAAE;oBACP,GAAG,EAAE,KAAK,CAAC,EAAE;oBACb,UAAU,EAAE,cAAc;oBAC1B,WAAW,EAAE,IAAI;oBACjB,SAAS;oBACT,SAAS;oBACT,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,SAAS,EAAE,KAAK,CAAC,SAAS;oBAC1B,iBAAiB,EAAE,CAAC;oBACpB,iBAAiB,EAAE,OAAO,CAAC,UAAU;oBACrC,cAAc,EAAE,OAAO,CAAC,KAAK;oBAC7B,GAAG,CAAC,OAAO,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACzF;aACF;SACF,EACD,GAAG,EACH,MAAM,CACP,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;IAClC,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { ProjectionOutbox } from "./projection-outbox";
|
|
2
|
+
export interface ProjectionWorkerProjectResult {
|
|
3
|
+
ref: string;
|
|
4
|
+
vectorId: string;
|
|
5
|
+
}
|
|
6
|
+
export interface ProjectionWorkerOptions {
|
|
7
|
+
outbox: ProjectionOutbox;
|
|
8
|
+
project: (sessionId: string, refs: readonly string[], signal: AbortSignal) => Promise<ProjectionWorkerProjectResult[] | void>;
|
|
9
|
+
intervalMs?: number | undefined;
|
|
10
|
+
}
|
|
11
|
+
export interface ProjectionWorkerFlushResult {
|
|
12
|
+
sessions: number;
|
|
13
|
+
projected: number;
|
|
14
|
+
failed: number;
|
|
15
|
+
}
|
|
16
|
+
export declare class ProjectionWorker {
|
|
17
|
+
private readonly outbox;
|
|
18
|
+
private readonly project;
|
|
19
|
+
private readonly intervalMs;
|
|
20
|
+
private timer;
|
|
21
|
+
private abortController;
|
|
22
|
+
private running;
|
|
23
|
+
constructor(options: ProjectionWorkerOptions);
|
|
24
|
+
start(): void;
|
|
25
|
+
stop(): Promise<void>;
|
|
26
|
+
flush(sessionId?: string): Promise<ProjectionWorkerFlushResult>;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=projection-worker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projection-worker.d.ts","sourceRoot":"","sources":["../../src/memory/projection-worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,WAAW,6BAA6B;IAC5C,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,gBAAgB,CAAC;IACzB,OAAO,EAAE,CACP,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,MAAM,EAAE,WAAW,KAChB,OAAO,CAAC,6BAA6B,EAAE,GAAG,IAAI,CAAC,CAAC;IACrD,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqC;IAC7D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,KAAK,CAA6C;IAC1D,OAAO,CAAC,eAAe,CAA8B;IACrD,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,EAAE,uBAAuB;IAM5C,KAAK,IAAI,IAAI;IAUP,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IASrB,KAAK,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,2BAA2B,CAAC;CAqDtE"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
export class ProjectionWorker {
|
|
2
|
+
outbox;
|
|
3
|
+
project;
|
|
4
|
+
intervalMs;
|
|
5
|
+
timer;
|
|
6
|
+
abortController;
|
|
7
|
+
running = false;
|
|
8
|
+
constructor(options) {
|
|
9
|
+
this.outbox = options.outbox;
|
|
10
|
+
this.project = options.project;
|
|
11
|
+
this.intervalMs = options.intervalMs ?? 1_000;
|
|
12
|
+
}
|
|
13
|
+
start() {
|
|
14
|
+
if (this.timer !== undefined)
|
|
15
|
+
return;
|
|
16
|
+
this.abortController = new AbortController();
|
|
17
|
+
this.timer = setInterval(() => {
|
|
18
|
+
void this.flush().catch(() => {
|
|
19
|
+
// Individual projection failures are recorded in the outbox.
|
|
20
|
+
});
|
|
21
|
+
}, this.intervalMs);
|
|
22
|
+
}
|
|
23
|
+
async stop() {
|
|
24
|
+
if (this.timer !== undefined) {
|
|
25
|
+
clearInterval(this.timer);
|
|
26
|
+
this.timer = undefined;
|
|
27
|
+
}
|
|
28
|
+
this.abortController?.abort();
|
|
29
|
+
this.abortController = undefined;
|
|
30
|
+
}
|
|
31
|
+
async flush(sessionId) {
|
|
32
|
+
if (this.running) {
|
|
33
|
+
return { sessions: 0, projected: 0, failed: 0 };
|
|
34
|
+
}
|
|
35
|
+
this.running = true;
|
|
36
|
+
try {
|
|
37
|
+
const signal = this.abortController?.signal ?? new AbortController().signal;
|
|
38
|
+
const sessions = sessionId !== undefined ? [sessionId] : await this.outbox.listSessions();
|
|
39
|
+
let touchedSessions = 0;
|
|
40
|
+
let projected = 0;
|
|
41
|
+
let failed = 0;
|
|
42
|
+
for (const sid of sessions) {
|
|
43
|
+
await this.outbox.recover(sid);
|
|
44
|
+
const pending = await this.outbox.listPending(sid);
|
|
45
|
+
if (pending.length === 0)
|
|
46
|
+
continue;
|
|
47
|
+
touchedSessions += 1;
|
|
48
|
+
const refs = pending.map((record) => record.ref);
|
|
49
|
+
for (const ref of refs) {
|
|
50
|
+
await this.outbox.markRetrying(sid, ref);
|
|
51
|
+
}
|
|
52
|
+
try {
|
|
53
|
+
const result = await this.project(sid, refs, signal);
|
|
54
|
+
const vectorIds = new Map((result ?? refs.map((ref) => ({ ref, vectorId: `${sid}-${ref}` }))).map((item) => [
|
|
55
|
+
item.ref,
|
|
56
|
+
item.vectorId,
|
|
57
|
+
]));
|
|
58
|
+
for (const ref of refs) {
|
|
59
|
+
const vectorId = vectorIds.get(ref);
|
|
60
|
+
if (vectorId === undefined) {
|
|
61
|
+
failed += 1;
|
|
62
|
+
await this.outbox.markFailed(sid, ref, "projection worker did not return vectorId");
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
await this.outbox.markIndexed(sid, ref, vectorId);
|
|
66
|
+
projected += 1;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
71
|
+
failed += refs.length;
|
|
72
|
+
for (const ref of refs) {
|
|
73
|
+
await this.outbox.markFailed(sid, ref, message);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return { sessions: touchedSessions, projected, failed };
|
|
78
|
+
}
|
|
79
|
+
finally {
|
|
80
|
+
this.running = false;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=projection-worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projection-worker.js","sourceRoot":"","sources":["../../src/memory/projection-worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,41 +14,41 @@ export declare class JsonlEmitter implements ObservabilityEmitter {
|
|
|
14
14
|
private masker;
|
|
15
15
|
private writeQueue;
|
|
16
16
|
/**
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
17
|
+
* 创建 JSONL 发射器。
|
|
18
|
+
*
|
|
19
|
+
* @param options 文件配置
|
|
20
|
+
*/
|
|
21
21
|
constructor(options: JsonlEmitterOptions);
|
|
22
22
|
/**
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
23
|
+
* 订阅事件。
|
|
24
|
+
*
|
|
25
|
+
* @param type 事件类型
|
|
26
|
+
* @param handler 处理器
|
|
27
|
+
* @returns 取消订阅函数
|
|
28
|
+
*/
|
|
29
29
|
on(type: EngineEvent["type"] | "*", handler: EventHandler): () => void;
|
|
30
30
|
/**
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
31
|
+
* 取消订阅。
|
|
32
|
+
*
|
|
33
|
+
* @param type 事件类型
|
|
34
|
+
* @param handler 处理器
|
|
35
|
+
*/
|
|
36
36
|
off(type: EngineEvent["type"] | "*", handler: EventHandler): void;
|
|
37
37
|
/**
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
38
|
+
* 发射并持久化事件。
|
|
39
|
+
*
|
|
40
|
+
* @param event 引擎事件
|
|
41
|
+
*/
|
|
42
42
|
emit(event: EngineEvent): void;
|
|
43
43
|
/**
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
44
|
+
* 设置脱敏函数。
|
|
45
|
+
*
|
|
46
|
+
* @param masker 脱敏函数
|
|
47
|
+
*/
|
|
48
48
|
setMasker(masker: (payload: unknown) => unknown): void;
|
|
49
49
|
/**
|
|
50
|
-
|
|
51
|
-
|
|
50
|
+
* 等待队列写入完成。
|
|
51
|
+
*/
|
|
52
52
|
dispose(): Promise<void>;
|
|
53
53
|
private emitToSubscribers;
|
|
54
54
|
private append;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonl-emitter.d.ts","sourceRoot":"","sources":["../../src/observability/jsonl-emitter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAErE,KAAK,YAAY,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;AAEjD,UAAU,mBAAmB;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,qBAAa,YAAa,YAAW,oBAAoB;IACvD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2D;IACpF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,MAAM,CAAuD;IACrE,OAAO,CAAC,UAAU,CAAqB;
|
|
1
|
+
{"version":3,"file":"jsonl-emitter.d.ts","sourceRoot":"","sources":["../../src/observability/jsonl-emitter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAErE,KAAK,YAAY,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;AAEjD,UAAU,mBAAmB;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,qBAAa,YAAa,YAAW,oBAAoB;IACvD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2D;IACpF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,MAAM,CAAuD;IACrE,OAAO,CAAC,UAAU,CAAqB;IAExC;;;;MAIE;gBACW,OAAO,EAAE,mBAAmB;IAKzC;;;;;;MAME;IACD,EAAE,CAAC,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,GAAG,EAAE,OAAO,EAAE,YAAY,GAAG,MAAM,IAAI;IAOvE;;;;;MAKE;IACD,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,GAAG,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI;IAQlE;;;;MAIE;IACD,IAAI,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI;IAS/B;;;;MAIE;IACD,SAAS,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,GAAG,IAAI;IAIvD;;MAEE;IACK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAI9B,OAAO,CAAC,iBAAiB;YASX,MAAM;YAMN,cAAc;CAQ7B"}
|
|
@@ -10,21 +10,21 @@ export class JsonlEmitter {
|
|
|
10
10
|
masker = (payload) => payload;
|
|
11
11
|
writeQueue = Promise.resolve();
|
|
12
12
|
/**
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
13
|
+
* 创建 JSONL 发射器。
|
|
14
|
+
*
|
|
15
|
+
* @param options 文件配置
|
|
16
|
+
*/
|
|
17
17
|
constructor(options) {
|
|
18
18
|
this.filePath = options.filePath;
|
|
19
19
|
this.rotateSize = options.rotateSize ?? 10 * 1024 * 1024;
|
|
20
20
|
}
|
|
21
21
|
/**
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
22
|
+
* 订阅事件。
|
|
23
|
+
*
|
|
24
|
+
* @param type 事件类型
|
|
25
|
+
* @param handler 处理器
|
|
26
|
+
* @returns 取消订阅函数
|
|
27
|
+
*/
|
|
28
28
|
on(type, handler) {
|
|
29
29
|
const bucket = this.handlers.get(type) ?? new Set();
|
|
30
30
|
bucket.add(handler);
|
|
@@ -32,11 +32,11 @@ export class JsonlEmitter {
|
|
|
32
32
|
return () => this.off(type, handler);
|
|
33
33
|
}
|
|
34
34
|
/**
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
35
|
+
* 取消订阅。
|
|
36
|
+
*
|
|
37
|
+
* @param type 事件类型
|
|
38
|
+
* @param handler 处理器
|
|
39
|
+
*/
|
|
40
40
|
off(type, handler) {
|
|
41
41
|
const bucket = this.handlers.get(type);
|
|
42
42
|
bucket?.delete(handler);
|
|
@@ -45,10 +45,10 @@ export class JsonlEmitter {
|
|
|
45
45
|
}
|
|
46
46
|
}
|
|
47
47
|
/**
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
48
|
+
* 发射并持久化事件。
|
|
49
|
+
*
|
|
50
|
+
* @param event 引擎事件
|
|
51
|
+
*/
|
|
52
52
|
emit(event) {
|
|
53
53
|
const maskedEvent = {
|
|
54
54
|
...event,
|
|
@@ -58,16 +58,16 @@ export class JsonlEmitter {
|
|
|
58
58
|
this.writeQueue = this.writeQueue.then(() => this.append(maskedEvent)).catch(() => undefined);
|
|
59
59
|
}
|
|
60
60
|
/**
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
61
|
+
* 设置脱敏函数。
|
|
62
|
+
*
|
|
63
|
+
* @param masker 脱敏函数
|
|
64
|
+
*/
|
|
65
65
|
setMasker(masker) {
|
|
66
66
|
this.masker = masker;
|
|
67
67
|
}
|
|
68
68
|
/**
|
|
69
|
-
|
|
70
|
-
|
|
69
|
+
* 等待队列写入完成。
|
|
70
|
+
*/
|
|
71
71
|
async dispose() {
|
|
72
72
|
await this.writeQueue;
|
|
73
73
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonl-emitter.js","sourceRoot":"","sources":["../../src/observability/jsonl-emitter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC;;GAEG;AACH,MAAM,OAAO,YAAY;IACN,QAAQ,GAAG,IAAI,GAAG,EAAgD,CAAC;IACnE,QAAQ,CAAS;IACjB,UAAU,CAAS;IAC5B,MAAM,GAAkC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC;IAC7D,UAAU,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"jsonl-emitter.js","sourceRoot":"","sources":["../../src/observability/jsonl-emitter.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,39 +10,39 @@ export declare class OtelEmitter implements ObservabilityEmitter {
|
|
|
10
10
|
private readonly phaseSpans;
|
|
11
11
|
private masker;
|
|
12
12
|
/**
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
13
|
+
* 创建 OTel 发射器。
|
|
14
|
+
*
|
|
15
|
+
* @param options 构造参数
|
|
16
|
+
*/
|
|
17
17
|
constructor(options: {
|
|
18
18
|
tracer: Tracer;
|
|
19
19
|
});
|
|
20
20
|
/**
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
21
|
+
* 订阅事件。
|
|
22
|
+
*
|
|
23
|
+
* @param type 事件类型
|
|
24
|
+
* @param handler 处理器
|
|
25
|
+
* @returns 取消订阅函数
|
|
26
|
+
*/
|
|
27
27
|
on(type: EngineEvent["type"] | "*", handler: EventHandler): () => void;
|
|
28
28
|
/**
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
29
|
+
* 取消订阅。
|
|
30
|
+
*
|
|
31
|
+
* @param type 事件类型
|
|
32
|
+
* @param handler 处理器
|
|
33
|
+
*/
|
|
34
34
|
off(type: EngineEvent["type"] | "*", handler: EventHandler): void;
|
|
35
35
|
/**
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
36
|
+
* 发射事件并映射到 OTel Span。
|
|
37
|
+
*
|
|
38
|
+
* @param event 引擎事件
|
|
39
|
+
*/
|
|
40
40
|
emit(event: EngineEvent): void;
|
|
41
41
|
/**
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
42
|
+
* 配置 payload 脱敏函数。
|
|
43
|
+
*
|
|
44
|
+
* @param masker 脱敏函数
|
|
45
|
+
*/
|
|
46
46
|
setMasker(masker: (payload: unknown) => unknown): void;
|
|
47
47
|
private emitToSubscribers;
|
|
48
48
|
private emitToOtel;
|