memkin 0.4.0 → 0.4.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.
- package/README.en.md +108 -836
- package/README.md +108 -836
- package/README.zh-CN.md +80 -44
- package/dist/cli-stores.d.ts +12 -0
- package/dist/cli-stores.d.ts.map +1 -1
- package/dist/cli-stores.js +15 -1
- package/dist/cli-stores.js.map +1 -1
- package/dist/cli.js +94 -6
- package/dist/cli.js.map +1 -1
- package/dist/collectors/agent/claude-code.d.ts.map +1 -1
- package/dist/collectors/agent/claude-code.js +10 -29
- package/dist/collectors/agent/claude-code.js.map +1 -1
- package/dist/collectors/agent/codex.d.ts.map +1 -1
- package/dist/collectors/agent/codex.js +24 -10
- package/dist/collectors/agent/codex.js.map +1 -1
- package/dist/collectors/agent/collector.d.ts +38 -0
- package/dist/collectors/agent/collector.d.ts.map +1 -1
- package/dist/collectors/agent/collector.js +91 -20
- package/dist/collectors/agent/collector.js.map +1 -1
- package/dist/collectors/agent/hermes.d.ts.map +1 -1
- package/dist/collectors/agent/hermes.js +5 -1
- package/dist/collectors/agent/hermes.js.map +1 -1
- package/dist/collectors/feishu/sources/calendar.d.ts.map +1 -1
- package/dist/collectors/feishu/sources/calendar.js +18 -7
- package/dist/collectors/feishu/sources/calendar.js.map +1 -1
- package/dist/consolidator/consolidator.d.ts +9 -1
- package/dist/consolidator/consolidator.d.ts.map +1 -1
- package/dist/consolidator/consolidator.js +7 -0
- package/dist/consolidator/consolidator.js.map +1 -1
- package/dist/consolidator/entity-merge.d.ts +33 -0
- package/dist/consolidator/entity-merge.d.ts.map +1 -0
- package/dist/consolidator/entity-merge.js +148 -0
- package/dist/consolidator/entity-merge.js.map +1 -0
- package/dist/core/agent-session-scanner.d.ts +23 -0
- package/dist/core/agent-session-scanner.d.ts.map +1 -0
- package/dist/core/agent-session-scanner.js +69 -0
- package/dist/core/agent-session-scanner.js.map +1 -0
- package/dist/core/canonicalize.d.ts +8 -0
- package/dist/core/canonicalize.d.ts.map +1 -1
- package/dist/core/canonicalize.js +12 -2
- package/dist/core/canonicalize.js.map +1 -1
- package/dist/core/config.d.ts +6 -0
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js.map +1 -1
- package/dist/core/identity-resolver.d.ts +53 -3
- package/dist/core/identity-resolver.d.ts.map +1 -1
- package/dist/core/identity-resolver.js +112 -17
- package/dist/core/identity-resolver.js.map +1 -1
- package/dist/core/person-identity.d.ts +38 -3
- package/dist/core/person-identity.d.ts.map +1 -1
- package/dist/core/person-identity.js +58 -29
- package/dist/core/person-identity.js.map +1 -1
- package/dist/core/pipeline-factory.d.ts.map +1 -1
- package/dist/core/pipeline-factory.js +2 -1
- package/dist/core/pipeline-factory.js.map +1 -1
- package/dist/core/pipeline.js +3 -3
- package/dist/core/pipeline.js.map +1 -1
- package/dist/daemon/autostart/daemon-state.d.ts +32 -0
- package/dist/daemon/autostart/daemon-state.d.ts.map +1 -1
- package/dist/daemon/autostart/daemon-state.js +27 -1
- package/dist/daemon/autostart/daemon-state.js.map +1 -1
- package/dist/daemon/scheduler.d.ts +10 -0
- package/dist/daemon/scheduler.d.ts.map +1 -1
- package/dist/daemon/scheduler.js +20 -1
- package/dist/daemon/scheduler.js.map +1 -1
- package/dist/demo/seed.d.ts +32 -0
- package/dist/demo/seed.d.ts.map +1 -0
- package/dist/demo/seed.js +185 -0
- package/dist/demo/seed.js.map +1 -0
- package/dist/embedded-assets.generated.d.ts.map +1 -1
- package/dist/embedded-assets.generated.js +2 -2
- package/dist/embedded-assets.generated.js.map +1 -1
- package/dist/eval/golden.d.ts +107 -0
- package/dist/eval/golden.d.ts.map +1 -0
- package/dist/eval/golden.js +74 -0
- package/dist/eval/golden.js.map +1 -0
- package/dist/eval/judge.d.ts +82 -0
- package/dist/eval/judge.d.ts.map +1 -0
- package/dist/eval/judge.js +130 -0
- package/dist/eval/judge.js.map +1 -0
- package/dist/eval/manifest.d.ts +107 -0
- package/dist/eval/manifest.d.ts.map +1 -0
- package/dist/eval/manifest.js +84 -0
- package/dist/eval/manifest.js.map +1 -0
- package/dist/eval/metrics.d.ts +87 -0
- package/dist/eval/metrics.d.ts.map +1 -0
- package/dist/eval/metrics.js +97 -0
- package/dist/eval/metrics.js.map +1 -0
- package/dist/extractors/noise-filter.d.ts +7 -3
- package/dist/extractors/noise-filter.d.ts.map +1 -1
- package/dist/extractors/noise-filter.js +16 -3
- package/dist/extractors/noise-filter.js.map +1 -1
- package/dist/extractors/signal-extractor.d.ts.map +1 -1
- package/dist/extractors/signal-extractor.js +13 -2
- package/dist/extractors/signal-extractor.js.map +1 -1
- package/dist/lifecycle/legacy-migration.d.ts +6 -2
- package/dist/lifecycle/legacy-migration.d.ts.map +1 -1
- package/dist/lifecycle/legacy-migration.js +69 -4
- package/dist/lifecycle/legacy-migration.js.map +1 -1
- package/dist/server/api.d.ts.map +1 -1
- package/dist/server/api.js +18 -7
- package/dist/server/api.js.map +1 -1
- package/dist/server/backfill-routes.d.ts.map +1 -1
- package/dist/server/backfill-routes.js +2 -1
- package/dist/server/backfill-routes.js.map +1 -1
- package/dist/server/mcp.d.ts +4 -4
- package/dist/store/agent-sessions.d.ts +59 -0
- package/dist/store/agent-sessions.d.ts.map +1 -0
- package/dist/store/agent-sessions.js +119 -0
- package/dist/store/agent-sessions.js.map +1 -0
- package/dist/store/database.d.ts +20 -1
- package/dist/store/database.d.ts.map +1 -1
- package/dist/store/database.js +44 -6
- package/dist/store/database.js.map +1 -1
- package/dist/store/embedding.d.ts +20 -2
- package/dist/store/embedding.d.ts.map +1 -1
- package/dist/store/embedding.js +20 -5
- package/dist/store/embedding.js.map +1 -1
- package/dist/store/entity-suggestions.d.ts +62 -0
- package/dist/store/entity-suggestions.d.ts.map +1 -0
- package/dist/store/entity-suggestions.js +80 -0
- package/dist/store/entity-suggestions.js.map +1 -0
- package/dist/store/migrations/index.d.ts.map +1 -1
- package/dist/store/migrations/index.js +91 -0
- package/dist/store/migrations/index.js.map +1 -1
- package/dist/store/pages.d.ts.map +1 -1
- package/dist/store/pages.js +12 -3
- package/dist/store/pages.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,12 +1,60 @@
|
|
|
1
1
|
// src/collectors/agent/collector.ts
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
2
3
|
import * as fs from "node:fs/promises";
|
|
3
4
|
import fg from "fast-glob";
|
|
5
|
+
const defaultSnapshotFs = {
|
|
6
|
+
stat: (p) => fs.stat(p),
|
|
7
|
+
readFile: (p, enc) => fs.readFile(p, enc),
|
|
8
|
+
};
|
|
9
|
+
function errMessage(err) {
|
|
10
|
+
return err instanceof Error ? err.message : String(err);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Read a transcript file only if it is stable across the read.
|
|
14
|
+
*
|
|
15
|
+
* A transcript being actively written (an agent still in-session) can be mutated mid-read,
|
|
16
|
+
* yielding a torn snapshot. To avoid ingesting a half-written revision we stat before and
|
|
17
|
+
* after reading; if size or mtime differ, the file changed under us — return null and let
|
|
18
|
+
* the caller retry on a later tick (the scan watermark still advances independently).
|
|
19
|
+
*
|
|
20
|
+
* `deps` is injectable so tests can simulate a write-in-progress without touching the real
|
|
21
|
+
* filesystem (node:fs/promises exports are non-configurable and cannot be spied directly).
|
|
22
|
+
*/
|
|
23
|
+
export async function readStableSnapshot(filePath, deps = defaultSnapshotFs) {
|
|
24
|
+
try {
|
|
25
|
+
const before = await deps.stat(filePath);
|
|
26
|
+
const content = await deps.readFile(filePath, "utf-8");
|
|
27
|
+
const after = await deps.stat(filePath);
|
|
28
|
+
if (before.size !== after.size || before.mtimeMs !== after.mtimeMs) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
content,
|
|
33
|
+
contentHash: createHash("sha256").update(content).digest("hex"),
|
|
34
|
+
byteSize: Buffer.byteLength(content, "utf-8"),
|
|
35
|
+
lineCount: content.split("\n").length,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
4
42
|
export class AgentSessionCollector {
|
|
5
43
|
layout;
|
|
6
44
|
parser;
|
|
7
45
|
id;
|
|
8
46
|
name;
|
|
9
47
|
description;
|
|
48
|
+
/**
|
|
49
|
+
* Non-fatal issues from the most recent fetch() run. Malformed JSONL lines
|
|
50
|
+
* (invalid JSON, non-object values, records the parser chokes on) are skipped
|
|
51
|
+
* and recorded here as `<file>:<1-based line>: <reason>` instead of aborting
|
|
52
|
+
* the whole collection run.
|
|
53
|
+
*/
|
|
54
|
+
runWarnings = [];
|
|
55
|
+
get warnings() {
|
|
56
|
+
return this.runWarnings;
|
|
57
|
+
}
|
|
10
58
|
constructor(layout, parser, opts) {
|
|
11
59
|
this.layout = layout;
|
|
12
60
|
this.parser = parser;
|
|
@@ -24,6 +72,7 @@ export class AgentSessionCollector {
|
|
|
24
72
|
}
|
|
25
73
|
}
|
|
26
74
|
async *fetch(_opts) {
|
|
75
|
+
this.runWarnings = [];
|
|
27
76
|
const processedSessions = new Set();
|
|
28
77
|
const files = await this.discoverFiles();
|
|
29
78
|
if (files.length === 0)
|
|
@@ -46,39 +95,58 @@ export class AgentSessionCollector {
|
|
|
46
95
|
const channel = this.layout.channelFromPath(file.path, sessionIdFromPath);
|
|
47
96
|
let sessionMeta = null;
|
|
48
97
|
let currentSessionId = sessionIdFromPath;
|
|
49
|
-
|
|
50
|
-
const
|
|
98
|
+
// Stable snapshot read: skip files that are being written under us this tick.
|
|
99
|
+
const snapshot = await readStableSnapshot(file.path);
|
|
100
|
+
if (!snapshot)
|
|
101
|
+
continue;
|
|
102
|
+
const lines = snapshot.content.split("\n");
|
|
51
103
|
for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {
|
|
52
104
|
const line = lines[lineIndex].trim();
|
|
53
105
|
if (!line)
|
|
54
106
|
continue;
|
|
55
|
-
|
|
107
|
+
// Tolerate malformed lines: a single corrupt line (invalid JSON, a bare
|
|
108
|
+
// scalar/array/null, or a record the parser throws on) must not abort
|
|
109
|
+
// the whole run — skip it and record a warning with its 1-based line number.
|
|
110
|
+
let raw;
|
|
56
111
|
try {
|
|
57
|
-
|
|
112
|
+
raw = JSON.parse(line);
|
|
58
113
|
}
|
|
59
|
-
catch {
|
|
114
|
+
catch (err) {
|
|
115
|
+
this.warnLine(file.path, lineIndex, `invalid JSON (${errMessage(err)})`);
|
|
60
116
|
continue;
|
|
61
117
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
sessionMeta = meta;
|
|
65
|
-
currentSessionId = meta.sessionId;
|
|
118
|
+
if (typeof raw !== "object" || raw === null || Array.isArray(raw)) {
|
|
119
|
+
this.warnLine(file.path, lineIndex, "not a JSON object record");
|
|
66
120
|
continue;
|
|
67
121
|
}
|
|
68
|
-
|
|
69
|
-
|
|
122
|
+
const parsed = raw;
|
|
123
|
+
let message = null;
|
|
124
|
+
try {
|
|
125
|
+
const meta = this.parser.parseSessionMeta(parsed);
|
|
126
|
+
if (meta) {
|
|
127
|
+
sessionMeta = meta;
|
|
128
|
+
currentSessionId = meta.sessionId;
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
if (processedSessions.has(currentSessionId)) {
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
if (!this.parser.isConversationRecord(parsed)) {
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
const context = {
|
|
138
|
+
sessionId: currentSessionId,
|
|
139
|
+
filePath: file.path,
|
|
140
|
+
channel,
|
|
141
|
+
lineIndex,
|
|
142
|
+
sessionMeta,
|
|
143
|
+
};
|
|
144
|
+
message = this.parser.parseRecord(parsed, context);
|
|
70
145
|
}
|
|
71
|
-
|
|
146
|
+
catch (err) {
|
|
147
|
+
this.warnLine(file.path, lineIndex, `record parse failed (${errMessage(err)})`);
|
|
72
148
|
continue;
|
|
73
149
|
}
|
|
74
|
-
const context = {
|
|
75
|
-
sessionId: currentSessionId,
|
|
76
|
-
filePath: file.path,
|
|
77
|
-
channel,
|
|
78
|
-
lineIndex,
|
|
79
|
-
sessionMeta,
|
|
80
|
-
};
|
|
81
|
-
const message = this.parser.parseRecord(parsed, context);
|
|
82
150
|
if (message) {
|
|
83
151
|
message.metadata = {
|
|
84
152
|
...message.metadata,
|
|
@@ -91,6 +159,9 @@ export class AgentSessionCollector {
|
|
|
91
159
|
processedSessions.add(currentSessionId);
|
|
92
160
|
}
|
|
93
161
|
}
|
|
162
|
+
warnLine(filePath, lineIndex, reason) {
|
|
163
|
+
this.runWarnings.push(`${filePath}:${lineIndex + 1}: ${reason}, line skipped`);
|
|
164
|
+
}
|
|
94
165
|
async discoverFiles() {
|
|
95
166
|
try {
|
|
96
167
|
return await fg(this.layout.glob, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collector.js","sourceRoot":"","sources":["../../../src/collectors/agent/collector.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"collector.js","sourceRoot":"","sources":["../../../src/collectors/agent/collector.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hermes.d.ts","sourceRoot":"","sources":["../../../src/collectors/agent/hermes.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEjG,qBAAa,YAAa,YAAW,aAAa;IAChD,QAAQ,CAAC,UAAU,YAAY;IAE/B,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW,GAAG,IAAI;IASnE,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO;IAQ5D,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,mBAAmB,GAAG,UAAU,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"hermes.d.ts","sourceRoot":"","sources":["../../../src/collectors/agent/hermes.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEjG,qBAAa,YAAa,YAAW,aAAa;IAChD,QAAQ,CAAC,UAAU,YAAY;IAE/B,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW,GAAG,IAAI;IASnE,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO;IAQ5D,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,mBAAmB,GAAG,UAAU,GAAG,IAAI;IAoC3F,OAAO,CAAC,gBAAgB;CAUzB;AAED,wBAAgB,YAAY,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,aAAa,CAY5D;AAED,wBAAgB,qBAAqB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,qBAAqB,CAmB7E"}
|
|
@@ -24,6 +24,10 @@ export class HermesParser {
|
|
|
24
24
|
parseRecord(line, context) {
|
|
25
25
|
const message = line.message;
|
|
26
26
|
const timestamp = line.timestamp;
|
|
27
|
+
// Malformed record guard: message must be an object with a content array.
|
|
28
|
+
if (typeof message !== "object" || message === null || !Array.isArray(message.content)) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
27
31
|
const textParts = message.content
|
|
28
32
|
.filter((c) => c.type === "text" && c.text)
|
|
29
33
|
.map((c) => c.text ?? "");
|
|
@@ -40,7 +44,7 @@ export class HermesParser {
|
|
|
40
44
|
direction: message.role === "user" ? "sent" : "received",
|
|
41
45
|
metadata: {
|
|
42
46
|
session_id: context.sessionId,
|
|
43
|
-
cursor
|
|
47
|
+
// cursor retired — agent incrementality is driven by the agent_sessions ledger.
|
|
44
48
|
agent_name: agentName,
|
|
45
49
|
},
|
|
46
50
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hermes.js","sourceRoot":"","sources":["../../../src/collectors/agent/hermes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAGvD,MAAM,OAAO,YAAY;IACd,UAAU,GAAG,QAAQ,CAAC;IAE/B,gBAAgB,CAAC,IAA6B;QAC5C,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QACzC,OAAO;YACL,SAAS,EAAE,IAAI,CAAC,EAAY;YAC5B,SAAS,EAAE,IAAI,CAAC,SAAmB;YACnC,GAAG,EAAE,IAAI,CAAC,GAAyB;SACpC,CAAC;IACJ,CAAC;IAED,oBAAoB,CAAC,IAA6B;QAChD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,OAA8C,CAAC;QACpE,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC;QAC3B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAc,CAAC;QACpC,OAAO,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,WAAW,CAAC;IACjD,CAAC;IAED,WAAW,CAAC,IAA6B,EAAE,OAA4B;QACrE,MAAM,OAAO,GAAG,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"hermes.js","sourceRoot":"","sources":["../../../src/collectors/agent/hermes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAGvD,MAAM,OAAO,YAAY;IACd,UAAU,GAAG,QAAQ,CAAC;IAE/B,gBAAgB,CAAC,IAA6B;QAC5C,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QACzC,OAAO;YACL,SAAS,EAAE,IAAI,CAAC,EAAY;YAC5B,SAAS,EAAE,IAAI,CAAC,SAAmB;YACnC,GAAG,EAAE,IAAI,CAAC,GAAyB;SACpC,CAAC;IACJ,CAAC;IAED,oBAAoB,CAAC,IAA6B;QAChD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,OAA8C,CAAC;QACpE,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC;QAC3B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAc,CAAC;QACpC,OAAO,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,WAAW,CAAC;IACjD,CAAC;IAED,WAAW,CAAC,IAA6B,EAAE,OAA4B;QACrE,MAAM,OAAO,GAAG,IAAI,CAAC,OAGb,CAAC;QACT,MAAM,SAAS,GAAG,IAAI,CAAC,SAAmB,CAAC;QAE3C,0EAA0E;QAC1E,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACvF,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO;aAC9B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC;aAC1C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QAE5B,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE,OAAO,IAAI,CAAC;QAE9B,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAE1D,OAAO;YACL,QAAQ,EAAE,QAAQ;YAClB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,OAAO,EAAE,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW;YACvD,SAAS;YACT,OAAO,EAAE,IAAI;YACb,SAAS,EAAE,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU;YACxD,QAAQ,EAAE;gBACR,UAAU,EAAE,OAAO,CAAC,SAAS;gBAC7B,gFAAgF;gBAChF,UAAU,EAAE,SAAS;aACtB;SACF,CAAC;IACJ,CAAC;IAEO,gBAAgB,CAAC,QAAgB;QACvC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;QACvE,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;QAE3B,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QAClD,IAAI,WAAW,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;QAEnD,OAAO,SAAS,CAAC;IACnB,CAAC;CACF;AAED,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,MAAM,IAAI,GAAG,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;IACvE,OAAO;QACL,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,oBAAoB;QAC1B,iBAAiB,EAAE,CAAC,QAAgB,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAC1E,eAAe,EAAE,CAAC,QAAgB,EAAE,SAAiB,EAAE,EAAE;YACvD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;YAC5D,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC/C,OAAO,GAAG,SAAS,IAAI,SAAS,EAAE,CAAC;QACrC,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,MAAM,aAAa,GAAG,IAAI,qBAAqB,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,IAAI,YAAY,EAAE,EAAE;QACzF,IAAI,EAAE,uBAAuB;QAC7B,WAAW,EAAE,4DAA4D;KAC1E,CAAC,CAAC;IAEH,gDAAgD;IAChD,MAAM,aAAa,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC9D,aAAa,CAAC,KAAK,GAAG,KAAK,SAAS,CAAC,EAAE,IAAI;QACzC,IAAI,KAAK,EAAE,MAAM,OAAO,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;YAChD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE,SAA+B,CAAC;YACnE,IAAI,QAAQ,EAAE,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;gBAC5C,SAAS;YACX,CAAC;YACD,MAAM,OAAO,CAAC;QAChB,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,aAAa,CAAC;AACvB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"calendar.d.ts","sourceRoot":"","sources":["../../../../src/collectors/feishu/sources/calendar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,KAAK,EAA+C,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACjG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE9C,qBAAa,cAAe,YAAW,YAAY;IAI/C,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAJ9B,QAAQ,CAAC,IAAI,cAAc;gBAGR,MAAM,EAAE,gBAAgB,EACxB,WAAW,EAAE,MAAM,EAAE;IAGjC,KAAK,CACV,UAAU,EAAE,gBAAgB,GAAG,IAAI,EACnC,aAAa,EAAE,aAAa,GAC3B,cAAc,CAAC,UAAU,CAAC;YAUd,aAAa;
|
|
1
|
+
{"version":3,"file":"calendar.d.ts","sourceRoot":"","sources":["../../../../src/collectors/feishu/sources/calendar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,KAAK,EAA+C,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACjG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE9C,qBAAa,cAAe,YAAW,YAAY;IAI/C,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAJ9B,QAAQ,CAAC,IAAI,cAAc;gBAGR,MAAM,EAAE,gBAAgB,EACxB,WAAW,EAAE,MAAM,EAAE;IAGjC,KAAK,CACV,UAAU,EAAE,gBAAgB,GAAG,IAAI,EACnC,aAAa,EAAE,aAAa,GAC3B,cAAc,CAAC,UAAU,CAAC;YAUd,aAAa;IAsD5B,OAAO,CAAC,iBAAiB;IA8CnB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;CAGtC"}
|
|
@@ -35,13 +35,24 @@ export class CalendarSource {
|
|
|
35
35
|
params.start_time = startTime.toISOString();
|
|
36
36
|
params.end_time = endTime.toISOString();
|
|
37
37
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
38
|
+
let pageToken = "";
|
|
39
|
+
let syncToken;
|
|
40
|
+
do {
|
|
41
|
+
const pageParams = pageToken ? { ...params, page_token: pageToken } : params;
|
|
42
|
+
const res = await this.client.request("GET", path, { params: pageParams });
|
|
43
|
+
const data = res.data;
|
|
44
|
+
for (const event of data.items) {
|
|
45
|
+
yield this.eventToRawMessage(event, calendarId);
|
|
46
|
+
}
|
|
47
|
+
// sync_token arrives on the final page; keep the latest one seen.
|
|
48
|
+
if (data.sync_token)
|
|
49
|
+
syncToken = data.sync_token;
|
|
50
|
+
pageToken = data.page_token ?? "";
|
|
51
|
+
if (!data.has_more)
|
|
52
|
+
break;
|
|
53
|
+
} while (pageToken);
|
|
54
|
+
if (syncToken) {
|
|
55
|
+
cursorStaging.stage(this.name, calendarId, { sync_token: syncToken });
|
|
45
56
|
cursorStaging.commit(this.name, calendarId);
|
|
46
57
|
}
|
|
47
58
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"calendar.js","sourceRoot":"","sources":["../../../../src/collectors/feishu/sources/calendar.ts"],"names":[],"mappings":"AAMA,MAAM,OAAO,cAAc;IAIN;IACA;IAJV,IAAI,GAAG,UAAU,CAAC;IAE3B,YACmB,MAAwB,EACxB,WAAqB;QADrB,WAAM,GAAN,MAAM,CAAkB;QACxB,gBAAW,GAAX,WAAW,CAAU;IACrC,CAAC;IAEJ,KAAK,CAAC,CAAC,KAAK,CACV,UAAmC,EACnC,aAA4B;QAE5B,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAC1C,IAAI,CAAC;gBACH,KAAK,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;YACnE,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,6CAA6C,UAAU,GAAG,EAAE,KAAK,CAAC,CAAC;YACnF,CAAC;QACH,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,CAAC,aAAa,CAC1B,UAAkB,EAClB,UAAmC,EACnC,aAA4B;QAE5B,MAAM,IAAI,GAAG,oCAAoC,UAAU,SAAS,CAAC;QACrE,MAAM,MAAM,GAA2B,EAAE,CAAC;QAE1C,sEAAsE;QACtE,8DAA8D;QAC9D,yEAAyE;QACzE,oEAAoE;QACpE,wDAAwD;QACxD,MAAM,kBAAkB,GAAG,UAAU,EAAE,CAAC,UAAU,CAAwC,CAAC;QAC3F,IAAI,kBAAkB,EAAE,UAAU,EAAE,CAAC;YACnC,MAAM,CAAC,UAAU,GAAG,kBAAkB,CAAC,UAAU,CAAC;QACpD,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;YACrE,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;YACnE,MAAM,CAAC,UAAU,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;YAC5C,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QAC1C,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CACnC,KAAK,EACL,IAAI,EACJ,EAAE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"calendar.js","sourceRoot":"","sources":["../../../../src/collectors/feishu/sources/calendar.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { ProfileConfig } from "../core/config.js";
|
|
2
2
|
import type { LLMProvider } from "../extractors/providers/types.js";
|
|
3
3
|
import { type ProfileSynthStores } from "../profile/profile-synth.js";
|
|
4
|
+
import type { EntityMergeSuggestionStore } from "../store/entity-suggestions.js";
|
|
4
5
|
import type { GraphStore } from "../store/graph.js";
|
|
5
6
|
import type { PageStore } from "../store/pages.js";
|
|
6
7
|
import type { TagStore } from "../store/tags.js";
|
|
@@ -10,6 +11,12 @@ export interface ConsolidatorStores {
|
|
|
10
11
|
graph: GraphStore;
|
|
11
12
|
tags: TagStore;
|
|
12
13
|
timeline: TimelineStore;
|
|
14
|
+
/**
|
|
15
|
+
* Optional entity merge suggestion aggregation (spec §9). When present, the
|
|
16
|
+
* hot cycle sweeps entity pages for near-duplicates and records suggestions
|
|
17
|
+
* for user review — never merges automatically.
|
|
18
|
+
*/
|
|
19
|
+
entitySuggestions?: EntityMergeSuggestionStore;
|
|
13
20
|
}
|
|
14
21
|
/**
|
|
15
22
|
* Optional person-communication-profile wiring (Spec 8). When provided AND
|
|
@@ -25,6 +32,7 @@ export interface ConsolidateResult {
|
|
|
25
32
|
deadLinksChecked: number;
|
|
26
33
|
preferencesInferred: number;
|
|
27
34
|
profilesSynthesized: number;
|
|
35
|
+
entityMergeSuggestions: number;
|
|
28
36
|
}
|
|
29
37
|
export type ConsolidateMode = "hot" | "warm" | "all";
|
|
30
38
|
export declare class Consolidator {
|
|
@@ -38,6 +46,6 @@ export declare class Consolidator {
|
|
|
38
46
|
stop(): void;
|
|
39
47
|
runOnce(mode?: ConsolidateMode, dryRun?: boolean): Promise<ConsolidateResult>;
|
|
40
48
|
consolidateHot(dryRun?: boolean): Promise<number>;
|
|
41
|
-
consolidateWarm(dryRun?: boolean): Promise<Omit<ConsolidateResult, "hotToWarm">>;
|
|
49
|
+
consolidateWarm(dryRun?: boolean): Promise<Omit<ConsolidateResult, "hotToWarm" | "entityMergeSuggestions">>;
|
|
42
50
|
}
|
|
43
51
|
//# sourceMappingURL=consolidator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consolidator.d.ts","sourceRoot":"","sources":["../../src/consolidator/consolidator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,KAAK,kBAAkB,EAAsB,MAAM,6BAA6B,CAAC;AAC1F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"consolidator.d.ts","sourceRoot":"","sources":["../../src/consolidator/consolidator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,KAAK,kBAAkB,EAAsB,MAAM,6BAA6B,CAAC;AAC1F,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AACjF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAO1D,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,UAAU,CAAC;IAClB,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE,aAAa,CAAC;IACxB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,0BAA0B,CAAC;CAChD;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,aAAa,CAAC;IACvB,aAAa,EAAE,kBAAkB,CAAC;CACnC;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,sBAAsB,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC;AAErD,qBAAa,YAAY;IAKrB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,GAAG,CAAC;IACZ,OAAO,CAAC,WAAW,CAAC;IANtB,OAAO,CAAC,QAAQ,CAA+C;IAC/D,OAAO,CAAC,SAAS,CAA+C;gBAGtD,MAAM,EAAE,kBAAkB,EAC1B,GAAG,CAAC,EAAE,WAAW,YAAA,EACjB,WAAW,CAAC,EAAE,uBAAuB,YAAA;IAG/C,KAAK,IAAI,IAAI;IAKb,IAAI,IAAI,IAAI;IAON,OAAO,CAAC,IAAI,GAAE,eAAuB,EAAE,MAAM,UAAQ,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA8BlF,cAAc,CAAC,MAAM,UAAQ,GAAG,OAAO,CAAC,MAAM,CAAC;IAI/C,eAAe,CACnB,MAAM,UAAQ,GACb,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,WAAW,GAAG,wBAAwB,CAAC,CAAC;CAoB5E"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { synthesizeProfiles } from "../profile/profile-synth.js";
|
|
2
2
|
import { checkDeadLinks } from "./dead-link.js";
|
|
3
|
+
import { sweepEntityMergeSuggestions } from "./entity-merge.js";
|
|
3
4
|
import { consolidateHotToWarm } from "./hot-warm.js";
|
|
4
5
|
import { inferPreferences } from "./infer-preferences.js";
|
|
5
6
|
import { consolidateWarmToCold } from "./warm-cold.js";
|
|
@@ -33,9 +34,15 @@ export class Consolidator {
|
|
|
33
34
|
deadLinksChecked: 0,
|
|
34
35
|
preferencesInferred: 0,
|
|
35
36
|
profilesSynthesized: 0,
|
|
37
|
+
entityMergeSuggestions: 0,
|
|
36
38
|
};
|
|
37
39
|
if (mode === "hot" || mode === "all") {
|
|
38
40
|
result.hotToWarm = await this.consolidateHot(dryRun);
|
|
41
|
+
// Spec §9: aggregate near-duplicate entity pages into merge suggestions.
|
|
42
|
+
// Deterministic (no LLM), so it rides the daily hot cycle.
|
|
43
|
+
if (this.stores.entitySuggestions) {
|
|
44
|
+
result.entityMergeSuggestions = await sweepEntityMergeSuggestions(this.stores.entitySuggestions, dryRun);
|
|
45
|
+
}
|
|
39
46
|
}
|
|
40
47
|
if (mode === "warm" || mode === "all") {
|
|
41
48
|
const warmResult = await this.consolidateWarm(dryRun);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consolidator.js","sourceRoot":"","sources":["../../src/consolidator/consolidator.ts"],"names":[],"mappings":"AAEA,OAAO,EAA2B,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"consolidator.js","sourceRoot":"","sources":["../../src/consolidator/consolidator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Entity merge suggestion sweep (extraction-quality-redesign PR-3, spec §9).
|
|
3
|
+
*
|
|
4
|
+
* Scans entity pages for near-duplicates and produces merge SUGGESTIONS only —
|
|
5
|
+
* auto-merge is forbidden by the identity contract. Detectors:
|
|
6
|
+
*
|
|
7
|
+
* - same_name: multiple pages of the same type share the exact title
|
|
8
|
+
* (absorbed from the ad-hoc scripts/check-dupes.ts probe)
|
|
9
|
+
* - levenshtein: same-type titles within a small edit distance
|
|
10
|
+
* - pinyin: person titles whose pinyin canonicalization collides
|
|
11
|
+
* (王建都 vs 王健都 → person/wang-jiandu)
|
|
12
|
+
*
|
|
13
|
+
* The consolidator aggregates candidates into entity_merge_suggestions; the
|
|
14
|
+
* user confirms, then merges run through the explicit merge machinery.
|
|
15
|
+
*/
|
|
16
|
+
import type { EntityMergeSuggestionStore, EntityPageRef, MergeSuggestionCandidate } from "../store/entity-suggestions.js";
|
|
17
|
+
/**
|
|
18
|
+
* Banded Levenshtein distance with early exit: returns Infinity as soon as the
|
|
19
|
+
* distance provably exceeds `max`.
|
|
20
|
+
*/
|
|
21
|
+
export declare function boundedLevenshtein(a: string, b: string, max: number): number;
|
|
22
|
+
/**
|
|
23
|
+
* Pure detection over a snapshot of entity pages. Deterministic ordering:
|
|
24
|
+
* within a duplicate pair, `into_slug` is the lexicographically first slug.
|
|
25
|
+
*/
|
|
26
|
+
export declare function detectEntityMergeCandidates(pages: EntityPageRef[]): MergeSuggestionCandidate[];
|
|
27
|
+
/**
|
|
28
|
+
* Sweep the store's entity pages, aggregate merge candidates into
|
|
29
|
+
* entity_merge_suggestions, and return how many candidates were detected.
|
|
30
|
+
* Dry run detects without writing.
|
|
31
|
+
*/
|
|
32
|
+
export declare function sweepEntityMergeSuggestions(suggestions: EntityMergeSuggestionStore, dryRun?: boolean): Promise<number>;
|
|
33
|
+
//# sourceMappingURL=entity-merge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity-merge.d.ts","sourceRoot":"","sources":["../../src/consolidator/entity-merge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,KAAK,EACV,0BAA0B,EAC1B,aAAa,EACb,wBAAwB,EACzB,MAAM,gCAAgC,CAAC;AAWxC;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAiB5E;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,wBAAwB,EAAE,CAoF9F;AAED;;;;GAIG;AACH,wBAAsB,2BAA2B,CAC/C,WAAW,EAAE,0BAA0B,EACvC,MAAM,UAAQ,GACb,OAAO,CAAC,MAAM,CAAC,CASjB"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Entity merge suggestion sweep (extraction-quality-redesign PR-3, spec §9).
|
|
3
|
+
*
|
|
4
|
+
* Scans entity pages for near-duplicates and produces merge SUGGESTIONS only —
|
|
5
|
+
* auto-merge is forbidden by the identity contract. Detectors:
|
|
6
|
+
*
|
|
7
|
+
* - same_name: multiple pages of the same type share the exact title
|
|
8
|
+
* (absorbed from the ad-hoc scripts/check-dupes.ts probe)
|
|
9
|
+
* - levenshtein: same-type titles within a small edit distance
|
|
10
|
+
* - pinyin: person titles whose pinyin canonicalization collides
|
|
11
|
+
* (王建都 vs 王健都 → person/wang-jiandu)
|
|
12
|
+
*
|
|
13
|
+
* The consolidator aggregates candidates into entity_merge_suggestions; the
|
|
14
|
+
* user confirms, then merges run through the explicit merge machinery.
|
|
15
|
+
*/
|
|
16
|
+
import { toPersonCanonicalSlug } from "../core/person-slug.js";
|
|
17
|
+
const ENTITY_PAGE_TYPES = ["person", "project", "organization", "tool", "concept"];
|
|
18
|
+
/** Minimum title length considered for fuzzy (Levenshtein) comparison. */
|
|
19
|
+
const MIN_FUZZY_TITLE_LEN = 4;
|
|
20
|
+
function levenshteinThreshold(aLen, bLen) {
|
|
21
|
+
return Math.min(aLen, bLen) >= 8 ? 2 : 1;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Banded Levenshtein distance with early exit: returns Infinity as soon as the
|
|
25
|
+
* distance provably exceeds `max`.
|
|
26
|
+
*/
|
|
27
|
+
export function boundedLevenshtein(a, b, max) {
|
|
28
|
+
if (Math.abs(a.length - b.length) > max)
|
|
29
|
+
return Number.POSITIVE_INFINITY;
|
|
30
|
+
if (a === b)
|
|
31
|
+
return 0;
|
|
32
|
+
let prev = Array.from({ length: b.length + 1 }, (_, i) => i);
|
|
33
|
+
let curr = new Array(b.length + 1);
|
|
34
|
+
for (let i = 1; i <= a.length; i++) {
|
|
35
|
+
curr[0] = i;
|
|
36
|
+
let rowMin = curr[0];
|
|
37
|
+
for (let j = 1; j <= b.length; j++) {
|
|
38
|
+
const cost = a[i - 1] === b[j - 1] ? 0 : 1;
|
|
39
|
+
curr[j] = Math.min(prev[j] + 1, curr[j - 1] + 1, prev[j - 1] + cost);
|
|
40
|
+
if (curr[j] < rowMin)
|
|
41
|
+
rowMin = curr[j];
|
|
42
|
+
}
|
|
43
|
+
if (rowMin > max)
|
|
44
|
+
return Number.POSITIVE_INFINITY;
|
|
45
|
+
[prev, curr] = [curr, prev];
|
|
46
|
+
}
|
|
47
|
+
return prev[b.length] <= max ? prev[b.length] : Number.POSITIVE_INFINITY;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Pure detection over a snapshot of entity pages. Deterministic ordering:
|
|
51
|
+
* within a duplicate pair, `into_slug` is the lexicographically first slug.
|
|
52
|
+
*/
|
|
53
|
+
export function detectEntityMergeCandidates(pages) {
|
|
54
|
+
const candidates = [];
|
|
55
|
+
const seenPairs = new Set();
|
|
56
|
+
const suggest = (entityType, slugA, slugB, reason, detail) => {
|
|
57
|
+
const [into, from] = [slugA, slugB].sort();
|
|
58
|
+
const pairKey = `${entityType}|${into}|${from}`;
|
|
59
|
+
if (seenPairs.has(pairKey))
|
|
60
|
+
return;
|
|
61
|
+
seenPairs.add(pairKey);
|
|
62
|
+
candidates.push({ entity_type: entityType, from_slug: from, into_slug: into, reason, detail });
|
|
63
|
+
};
|
|
64
|
+
const byType = new Map();
|
|
65
|
+
for (const p of pages) {
|
|
66
|
+
if (!ENTITY_PAGE_TYPES.includes(p.type))
|
|
67
|
+
continue;
|
|
68
|
+
const group = byType.get(p.type) ?? [];
|
|
69
|
+
group.push(p);
|
|
70
|
+
byType.set(p.type, group);
|
|
71
|
+
}
|
|
72
|
+
for (const [type, group] of byType) {
|
|
73
|
+
const entityType = type;
|
|
74
|
+
// 1. same_name — exact title groups (check-dupes logic).
|
|
75
|
+
const byTitle = new Map();
|
|
76
|
+
for (const p of group) {
|
|
77
|
+
const list = byTitle.get(p.title) ?? [];
|
|
78
|
+
list.push(p);
|
|
79
|
+
byTitle.set(p.title, list);
|
|
80
|
+
}
|
|
81
|
+
for (const [title, dupes] of byTitle) {
|
|
82
|
+
if (dupes.length < 2)
|
|
83
|
+
continue;
|
|
84
|
+
const sorted = dupes.map((d) => d.slug).sort();
|
|
85
|
+
for (let i = 1; i < sorted.length; i++) {
|
|
86
|
+
suggest(entityType, sorted[0], sorted[i], "same_name", { name: title });
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// 2. levenshtein — near-identical titles within the same type.
|
|
90
|
+
for (let i = 0; i < group.length; i++) {
|
|
91
|
+
const a = group[i];
|
|
92
|
+
if (a.title.length < MIN_FUZZY_TITLE_LEN)
|
|
93
|
+
continue;
|
|
94
|
+
for (let j = i + 1; j < group.length; j++) {
|
|
95
|
+
const b = group[j];
|
|
96
|
+
if (b.title.length < MIN_FUZZY_TITLE_LEN)
|
|
97
|
+
continue;
|
|
98
|
+
if (a.title === b.title)
|
|
99
|
+
continue; // covered by same_name
|
|
100
|
+
const max = levenshteinThreshold(a.title.length, b.title.length);
|
|
101
|
+
const dist = boundedLevenshtein(a.title.toLowerCase(), b.title.toLowerCase(), max);
|
|
102
|
+
if (dist <= max) {
|
|
103
|
+
suggest(entityType, a.slug, b.slug, "levenshtein", {
|
|
104
|
+
titles: [a.title, b.title],
|
|
105
|
+
distance: dist,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// 3. pinyin — person titles that canonicalize to the same pinyin slug.
|
|
111
|
+
if (entityType === "person") {
|
|
112
|
+
const byPinyin = new Map();
|
|
113
|
+
for (const p of group) {
|
|
114
|
+
const pin = toPersonCanonicalSlug(p.title);
|
|
115
|
+
if (!pin)
|
|
116
|
+
continue;
|
|
117
|
+
const list = byPinyin.get(pin) ?? [];
|
|
118
|
+
list.push(p);
|
|
119
|
+
byPinyin.set(pin, list);
|
|
120
|
+
}
|
|
121
|
+
for (const [pin, dupes] of byPinyin) {
|
|
122
|
+
if (dupes.length < 2)
|
|
123
|
+
continue;
|
|
124
|
+
const sorted = dupes.map((d) => d.slug).sort();
|
|
125
|
+
for (let i = 1; i < sorted.length; i++) {
|
|
126
|
+
suggest(entityType, sorted[0], sorted[i], "pinyin", { pinyin_slug: pin });
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return candidates;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Sweep the store's entity pages, aggregate merge candidates into
|
|
135
|
+
* entity_merge_suggestions, and return how many candidates were detected.
|
|
136
|
+
* Dry run detects without writing.
|
|
137
|
+
*/
|
|
138
|
+
export async function sweepEntityMergeSuggestions(suggestions, dryRun = false) {
|
|
139
|
+
const pages = await suggestions.listEntityPages();
|
|
140
|
+
const candidates = detectEntityMergeCandidates(pages);
|
|
141
|
+
if (!dryRun) {
|
|
142
|
+
for (const c of candidates) {
|
|
143
|
+
await suggestions.record(c);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return candidates.length;
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=entity-merge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity-merge.js","sourceRoot":"","sources":["../../src/consolidator/entity-merge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { SessionLayout } from "../collectors/agent/types.js";
|
|
2
|
+
import type { AgentSessionStore } from "../store/agent-sessions.js";
|
|
3
|
+
import type { SqlConn } from "../store/sql-executor.js";
|
|
4
|
+
export interface ScanAgentSessionsOpts {
|
|
5
|
+
sourceInstance: string;
|
|
6
|
+
layout: SessionLayout;
|
|
7
|
+
store: AgentSessionStore;
|
|
8
|
+
executor: SqlConn;
|
|
9
|
+
}
|
|
10
|
+
export interface ScanResult {
|
|
11
|
+
/** Files seen this tick. */
|
|
12
|
+
scanned: number;
|
|
13
|
+
/** Brand-new session revisions recorded. */
|
|
14
|
+
discovered: number;
|
|
15
|
+
/** Existing sessions that gained a new revision (content changed). */
|
|
16
|
+
revised: number;
|
|
17
|
+
/** Files skipped because they were being written under us (unstable snapshot). */
|
|
18
|
+
skipped: number;
|
|
19
|
+
/** New watermark value (max file mtimeMs), or the prior value if nothing advanced. */
|
|
20
|
+
watermark: number;
|
|
21
|
+
}
|
|
22
|
+
export declare function scanAgentSessions(opts: ScanAgentSessionsOpts): Promise<ScanResult>;
|
|
23
|
+
//# sourceMappingURL=agent-session-scanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-session-scanner.d.ts","sourceRoot":"","sources":["../../src/core/agent-session-scanner.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAGxD,MAAM,WAAW,qBAAqB;IACpC,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,aAAa,CAAC;IACtB,KAAK,EAAE,iBAAiB,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,4BAA4B;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,sEAAsE;IACtE,OAAO,EAAE,MAAM,CAAC;IAChB,kFAAkF;IAClF,OAAO,EAAE,MAAM,CAAC;IAChB,sFAAsF;IACtF,SAAS,EAAE,MAAM,CAAC;CACnB;AAMD,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,UAAU,CAAC,CA4CxF"}
|