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.
Files changed (129) hide show
  1. package/README.en.md +108 -836
  2. package/README.md +108 -836
  3. package/README.zh-CN.md +80 -44
  4. package/dist/cli-stores.d.ts +12 -0
  5. package/dist/cli-stores.d.ts.map +1 -1
  6. package/dist/cli-stores.js +15 -1
  7. package/dist/cli-stores.js.map +1 -1
  8. package/dist/cli.js +94 -6
  9. package/dist/cli.js.map +1 -1
  10. package/dist/collectors/agent/claude-code.d.ts.map +1 -1
  11. package/dist/collectors/agent/claude-code.js +10 -29
  12. package/dist/collectors/agent/claude-code.js.map +1 -1
  13. package/dist/collectors/agent/codex.d.ts.map +1 -1
  14. package/dist/collectors/agent/codex.js +24 -10
  15. package/dist/collectors/agent/codex.js.map +1 -1
  16. package/dist/collectors/agent/collector.d.ts +38 -0
  17. package/dist/collectors/agent/collector.d.ts.map +1 -1
  18. package/dist/collectors/agent/collector.js +91 -20
  19. package/dist/collectors/agent/collector.js.map +1 -1
  20. package/dist/collectors/agent/hermes.d.ts.map +1 -1
  21. package/dist/collectors/agent/hermes.js +5 -1
  22. package/dist/collectors/agent/hermes.js.map +1 -1
  23. package/dist/collectors/feishu/sources/calendar.d.ts.map +1 -1
  24. package/dist/collectors/feishu/sources/calendar.js +18 -7
  25. package/dist/collectors/feishu/sources/calendar.js.map +1 -1
  26. package/dist/consolidator/consolidator.d.ts +9 -1
  27. package/dist/consolidator/consolidator.d.ts.map +1 -1
  28. package/dist/consolidator/consolidator.js +7 -0
  29. package/dist/consolidator/consolidator.js.map +1 -1
  30. package/dist/consolidator/entity-merge.d.ts +33 -0
  31. package/dist/consolidator/entity-merge.d.ts.map +1 -0
  32. package/dist/consolidator/entity-merge.js +148 -0
  33. package/dist/consolidator/entity-merge.js.map +1 -0
  34. package/dist/core/agent-session-scanner.d.ts +23 -0
  35. package/dist/core/agent-session-scanner.d.ts.map +1 -0
  36. package/dist/core/agent-session-scanner.js +69 -0
  37. package/dist/core/agent-session-scanner.js.map +1 -0
  38. package/dist/core/canonicalize.d.ts +8 -0
  39. package/dist/core/canonicalize.d.ts.map +1 -1
  40. package/dist/core/canonicalize.js +12 -2
  41. package/dist/core/canonicalize.js.map +1 -1
  42. package/dist/core/config.d.ts +6 -0
  43. package/dist/core/config.d.ts.map +1 -1
  44. package/dist/core/config.js.map +1 -1
  45. package/dist/core/identity-resolver.d.ts +53 -3
  46. package/dist/core/identity-resolver.d.ts.map +1 -1
  47. package/dist/core/identity-resolver.js +112 -17
  48. package/dist/core/identity-resolver.js.map +1 -1
  49. package/dist/core/person-identity.d.ts +38 -3
  50. package/dist/core/person-identity.d.ts.map +1 -1
  51. package/dist/core/person-identity.js +58 -29
  52. package/dist/core/person-identity.js.map +1 -1
  53. package/dist/core/pipeline-factory.d.ts.map +1 -1
  54. package/dist/core/pipeline-factory.js +2 -1
  55. package/dist/core/pipeline-factory.js.map +1 -1
  56. package/dist/core/pipeline.js +3 -3
  57. package/dist/core/pipeline.js.map +1 -1
  58. package/dist/daemon/autostart/daemon-state.d.ts +32 -0
  59. package/dist/daemon/autostart/daemon-state.d.ts.map +1 -1
  60. package/dist/daemon/autostart/daemon-state.js +27 -1
  61. package/dist/daemon/autostart/daemon-state.js.map +1 -1
  62. package/dist/daemon/scheduler.d.ts +10 -0
  63. package/dist/daemon/scheduler.d.ts.map +1 -1
  64. package/dist/daemon/scheduler.js +20 -1
  65. package/dist/daemon/scheduler.js.map +1 -1
  66. package/dist/demo/seed.d.ts +32 -0
  67. package/dist/demo/seed.d.ts.map +1 -0
  68. package/dist/demo/seed.js +185 -0
  69. package/dist/demo/seed.js.map +1 -0
  70. package/dist/embedded-assets.generated.d.ts.map +1 -1
  71. package/dist/embedded-assets.generated.js +2 -2
  72. package/dist/embedded-assets.generated.js.map +1 -1
  73. package/dist/eval/golden.d.ts +107 -0
  74. package/dist/eval/golden.d.ts.map +1 -0
  75. package/dist/eval/golden.js +74 -0
  76. package/dist/eval/golden.js.map +1 -0
  77. package/dist/eval/judge.d.ts +82 -0
  78. package/dist/eval/judge.d.ts.map +1 -0
  79. package/dist/eval/judge.js +130 -0
  80. package/dist/eval/judge.js.map +1 -0
  81. package/dist/eval/manifest.d.ts +107 -0
  82. package/dist/eval/manifest.d.ts.map +1 -0
  83. package/dist/eval/manifest.js +84 -0
  84. package/dist/eval/manifest.js.map +1 -0
  85. package/dist/eval/metrics.d.ts +87 -0
  86. package/dist/eval/metrics.d.ts.map +1 -0
  87. package/dist/eval/metrics.js +97 -0
  88. package/dist/eval/metrics.js.map +1 -0
  89. package/dist/extractors/noise-filter.d.ts +7 -3
  90. package/dist/extractors/noise-filter.d.ts.map +1 -1
  91. package/dist/extractors/noise-filter.js +16 -3
  92. package/dist/extractors/noise-filter.js.map +1 -1
  93. package/dist/extractors/signal-extractor.d.ts.map +1 -1
  94. package/dist/extractors/signal-extractor.js +13 -2
  95. package/dist/extractors/signal-extractor.js.map +1 -1
  96. package/dist/lifecycle/legacy-migration.d.ts +6 -2
  97. package/dist/lifecycle/legacy-migration.d.ts.map +1 -1
  98. package/dist/lifecycle/legacy-migration.js +69 -4
  99. package/dist/lifecycle/legacy-migration.js.map +1 -1
  100. package/dist/server/api.d.ts.map +1 -1
  101. package/dist/server/api.js +18 -7
  102. package/dist/server/api.js.map +1 -1
  103. package/dist/server/backfill-routes.d.ts.map +1 -1
  104. package/dist/server/backfill-routes.js +2 -1
  105. package/dist/server/backfill-routes.js.map +1 -1
  106. package/dist/server/mcp.d.ts +4 -4
  107. package/dist/store/agent-sessions.d.ts +59 -0
  108. package/dist/store/agent-sessions.d.ts.map +1 -0
  109. package/dist/store/agent-sessions.js +119 -0
  110. package/dist/store/agent-sessions.js.map +1 -0
  111. package/dist/store/database.d.ts +20 -1
  112. package/dist/store/database.d.ts.map +1 -1
  113. package/dist/store/database.js +44 -6
  114. package/dist/store/database.js.map +1 -1
  115. package/dist/store/embedding.d.ts +20 -2
  116. package/dist/store/embedding.d.ts.map +1 -1
  117. package/dist/store/embedding.js +20 -5
  118. package/dist/store/embedding.js.map +1 -1
  119. package/dist/store/entity-suggestions.d.ts +62 -0
  120. package/dist/store/entity-suggestions.d.ts.map +1 -0
  121. package/dist/store/entity-suggestions.js +80 -0
  122. package/dist/store/entity-suggestions.js.map +1 -0
  123. package/dist/store/migrations/index.d.ts.map +1 -1
  124. package/dist/store/migrations/index.js +91 -0
  125. package/dist/store/migrations/index.js.map +1 -1
  126. package/dist/store/pages.d.ts.map +1 -1
  127. package/dist/store/pages.js +12 -3
  128. package/dist/store/pages.js.map +1 -1
  129. 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
- const content = await fs.readFile(file.path, "utf-8");
50
- const lines = content.split("\n");
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
- let parsed;
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
- parsed = JSON.parse(line);
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
- const meta = this.parser.parseSessionMeta(parsed);
63
- if (meta) {
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
- if (processedSessions.has(currentSessionId)) {
69
- continue;
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
- if (!this.parser.isConversationRecord(parsed)) {
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":"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"}
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;IA+B3F,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"}
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: context.sessionId,
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":"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"}
1
+ {"version":3,"file":"hermes.js","sourceRoot":"","sources":["../../../src/collectors/agent/hermes.ts"],"names":[],"mappings":"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"}
@@ -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;IA0C5B,OAAO,CAAC,iBAAiB;IA8CnB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;CAGtC"}
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
- const res = await this.client.request("GET", path, { params });
39
- const data = res.data;
40
- for (const event of data.items) {
41
- yield this.eventToRawMessage(event, calendarId);
42
- }
43
- if (data.sync_token) {
44
- cursorStaging.stage(this.name, calendarId, { sync_token: data.sync_token });
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":"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"}
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;AAM1D,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,UAAU,CAAC;IAClB,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE,aAAa,CAAC;CACzB;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;CAC7B;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;IAqBlF,cAAc,CAAC,MAAM,UAAQ,GAAG,OAAO,CAAC,MAAM,CAAC;IAI/C,eAAe,CAAC,MAAM,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAAC;CAoBrF"}
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":"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"}
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":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAO/D,MAAM,iBAAiB,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,EAAE,SAAS,CAAU,CAAC;AAE5F,0EAA0E;AAC1E,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAE9B,SAAS,oBAAoB,CAAC,IAAY,EAAE,IAAY;IACtD,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,CAAS,EAAE,CAAS,EAAE,GAAW;IAClE,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,GAAG;QAAE,OAAO,MAAM,CAAC,iBAAiB,CAAC;IACzE,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACtB,IAAI,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7D,IAAI,IAAI,GAAG,IAAI,KAAK,CAAS,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACZ,IAAI,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACnC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3C,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;YACrE,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM;gBAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACzC,CAAC;QACD,IAAI,MAAM,GAAG,GAAG;YAAE,OAAO,MAAM,CAAC,iBAAiB,CAAC;QAClD,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC;AAC3E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,2BAA2B,CAAC,KAAsB;IAChE,MAAM,UAAU,GAA+B,EAAE,CAAC;IAClD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IAEpC,MAAM,OAAO,GAAG,CACd,UAA4B,EAC5B,KAAa,EACb,KAAa,EACb,MAA0C,EAC1C,MAAgC,EAChC,EAAE;QACF,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,GAAG,UAAU,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;QAChD,IAAI,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC;YAAE,OAAO;QACnC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACvB,UAAU,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACjG,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,IAAI,GAAG,EAA2B,CAAC;IAClD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAE,iBAAuC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,SAAS;QACzE,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACd,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC5B,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;QACnC,MAAM,UAAU,GAAG,IAAwB,CAAC;QAE5C,yDAAyD;QACzD,MAAM,OAAO,GAAG,IAAI,GAAG,EAA2B,CAAC;QACnD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YACxC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC7B,CAAC;QACD,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;YACrC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,SAAS;YAC/B,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;YAC/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACvC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;QAED,+DAA+D;QAC/D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACnB,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,mBAAmB;gBAAE,SAAS;YACnD,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC1C,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACnB,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,mBAAmB;oBAAE,SAAS;gBACnD,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK;oBAAE,SAAS,CAAC,uBAAuB;gBAC1D,MAAM,GAAG,GAAG,oBAAoB,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBACjE,MAAM,IAAI,GAAG,kBAAkB,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,CAAC;gBACnF,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC;oBAChB,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,aAAa,EAAE;wBACjD,MAAM,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC;wBAC1B,QAAQ,EAAE,IAAI;qBACf,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,uEAAuE;QACvE,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA2B,CAAC;YACpD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;gBACtB,MAAM,GAAG,GAAG,qBAAqB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;gBAC3C,IAAI,CAAC,GAAG;oBAAE,SAAS;gBACnB,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;gBACrC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACb,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAC1B,CAAC;YACD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACpC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;oBAAE,SAAS;gBAC/B,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACvC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC;gBAC5E,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,WAAuC,EACvC,MAAM,GAAG,KAAK;IAEd,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,eAAe,EAAE,CAAC;IAClD,MAAM,UAAU,GAAG,2BAA2B,CAAC,KAAK,CAAC,CAAC;IACtD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YAC3B,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IACD,OAAO,UAAU,CAAC,MAAM,CAAC;AAC3B,CAAC"}
@@ -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"}