@mneme-ai/core 0.11.1 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/dist/insights/chronicle.d.ts +41 -0
  2. package/dist/insights/chronicle.d.ts.map +1 -0
  3. package/dist/insights/chronicle.js +169 -0
  4. package/dist/insights/chronicle.js.map +1 -0
  5. package/dist/insights/chronicle.test.d.ts +2 -0
  6. package/dist/insights/chronicle.test.d.ts.map +1 -0
  7. package/dist/insights/chronicle.test.js +92 -0
  8. package/dist/insights/chronicle.test.js.map +1 -0
  9. package/dist/insights/cluster.d.ts +52 -0
  10. package/dist/insights/cluster.d.ts.map +1 -0
  11. package/dist/insights/cluster.js +154 -0
  12. package/dist/insights/cluster.js.map +1 -0
  13. package/dist/insights/cluster.test.d.ts +2 -0
  14. package/dist/insights/cluster.test.d.ts.map +1 -0
  15. package/dist/insights/cluster.test.js +106 -0
  16. package/dist/insights/cluster.test.js.map +1 -0
  17. package/dist/insights/constellation.d.ts +63 -0
  18. package/dist/insights/constellation.d.ts.map +1 -0
  19. package/dist/insights/constellation.js +147 -0
  20. package/dist/insights/constellation.js.map +1 -0
  21. package/dist/insights/constellation.test.d.ts +2 -0
  22. package/dist/insights/constellation.test.d.ts.map +1 -0
  23. package/dist/insights/constellation.test.js +105 -0
  24. package/dist/insights/constellation.test.js.map +1 -0
  25. package/dist/insights/dna.d.ts +100 -0
  26. package/dist/insights/dna.d.ts.map +1 -0
  27. package/dist/insights/dna.js +264 -0
  28. package/dist/insights/dna.js.map +1 -0
  29. package/dist/insights/dna.test.d.ts +2 -0
  30. package/dist/insights/dna.test.d.ts.map +1 -0
  31. package/dist/insights/dna.test.js +142 -0
  32. package/dist/insights/dna.test.js.map +1 -0
  33. package/dist/insights/drift.d.ts +43 -0
  34. package/dist/insights/drift.d.ts.map +1 -0
  35. package/dist/insights/drift.js +170 -0
  36. package/dist/insights/drift.js.map +1 -0
  37. package/dist/insights/drift.test.d.ts +2 -0
  38. package/dist/insights/drift.test.d.ts.map +1 -0
  39. package/dist/insights/drift.test.js +126 -0
  40. package/dist/insights/drift.test.js.map +1 -0
  41. package/dist/insights/export-bundle.d.ts +53 -0
  42. package/dist/insights/export-bundle.d.ts.map +1 -0
  43. package/dist/insights/export-bundle.js +156 -0
  44. package/dist/insights/export-bundle.js.map +1 -0
  45. package/dist/insights/export-bundle.test.d.ts +2 -0
  46. package/dist/insights/export-bundle.test.d.ts.map +1 -0
  47. package/dist/insights/export-bundle.test.js +92 -0
  48. package/dist/insights/export-bundle.test.js.map +1 -0
  49. package/dist/insights/index.d.ts +9 -0
  50. package/dist/insights/index.d.ts.map +1 -1
  51. package/dist/insights/index.js +9 -0
  52. package/dist/insights/index.js.map +1 -1
  53. package/dist/insights/manage.d.ts +60 -0
  54. package/dist/insights/manage.d.ts.map +1 -0
  55. package/dist/insights/manage.js +110 -0
  56. package/dist/insights/manage.js.map +1 -0
  57. package/dist/insights/manage.test.d.ts +2 -0
  58. package/dist/insights/manage.test.d.ts.map +1 -0
  59. package/dist/insights/manage.test.js +94 -0
  60. package/dist/insights/manage.test.js.map +1 -0
  61. package/dist/insights/network.d.ts +59 -0
  62. package/dist/insights/network.d.ts.map +1 -0
  63. package/dist/insights/network.js +231 -0
  64. package/dist/insights/network.js.map +1 -0
  65. package/dist/insights/network.test.d.ts +2 -0
  66. package/dist/insights/network.test.d.ts.map +1 -0
  67. package/dist/insights/network.test.js +100 -0
  68. package/dist/insights/network.test.js.map +1 -0
  69. package/dist/insights/oracle.d.ts +59 -0
  70. package/dist/insights/oracle.d.ts.map +1 -0
  71. package/dist/insights/oracle.js +0 -0
  72. package/dist/insights/oracle.js.map +1 -0
  73. package/dist/insights/oracle.test.d.ts +2 -0
  74. package/dist/insights/oracle.test.d.ts.map +1 -0
  75. package/dist/insights/oracle.test.js +133 -0
  76. package/dist/insights/oracle.test.js.map +1 -0
  77. package/package.json +1 -1
@@ -0,0 +1,231 @@
1
+ const STOPWORDS = new Set([
2
+ "the", "a", "an", "of", "to", "in", "on", "for", "and", "or", "with", "add", "added", "fix",
3
+ "remove", "update", "change", "make", "made", "new", "old", "this", "that", "is", "are", "be",
4
+ "feat", "chore", "docs", "test", "refactor", "style", "build", "ci", "perf", "revert",
5
+ "merge", "branch", "pr", "issue", "close", "closes", "fixes", "from", "by", "at", "into",
6
+ ]);
7
+ export function buildNetwork(commits, opts = {}) {
8
+ const coTimeWindow = (opts.coTimeWindowDays ?? 7) * 86_400_000;
9
+ const minEdge = opts.minEdgeWeight ?? 0.05;
10
+ const minAuthor = opts.minAuthorCommits ?? 2;
11
+ const sorted = [...commits].sort((a, b) => a.authorDate.localeCompare(b.authorDate));
12
+ if (sorted.length === 0) {
13
+ return { windowCommits: 0, nodes: [], edges: [], silos: [], bridges: [] };
14
+ }
15
+ // Author commit counts + tokens + files
16
+ const authorCommits = new Map();
17
+ const authorTokens = new Map();
18
+ const authorFiles = new Map();
19
+ const tokenizedPerCommit = new Map();
20
+ for (const c of sorted) {
21
+ const a = c.authorName || c.authorEmail;
22
+ let arr = authorCommits.get(a);
23
+ if (!arr) {
24
+ arr = [];
25
+ authorCommits.set(a, arr);
26
+ }
27
+ arr.push(c);
28
+ const tokens = tokenizeSet(`${c.subject}\n${c.body || ""}`);
29
+ tokenizedPerCommit.set(c.hash, tokens);
30
+ let at = authorTokens.get(a);
31
+ if (!at) {
32
+ at = new Set();
33
+ authorTokens.set(a, at);
34
+ }
35
+ for (const t of tokens)
36
+ at.add(t);
37
+ let af = authorFiles.get(a);
38
+ if (!af) {
39
+ af = new Set();
40
+ authorFiles.set(a, af);
41
+ }
42
+ for (const f of c.files)
43
+ af.add(f);
44
+ }
45
+ // Filter to authors meeting min
46
+ const eligible = [...authorCommits.entries()]
47
+ .filter(([, cs]) => cs.length >= minAuthor)
48
+ .map(([a]) => a);
49
+ // Build pairwise edges
50
+ const edges = [];
51
+ for (let i = 0; i < eligible.length; i++) {
52
+ for (let j = i + 1; j < eligible.length; j++) {
53
+ const a = eligible[i];
54
+ const b = eligible[j];
55
+ const aFiles = authorFiles.get(a);
56
+ const bFiles = authorFiles.get(b);
57
+ const aTokens = authorTokens.get(a);
58
+ const bTokens = authorTokens.get(b);
59
+ const aCommits = authorCommits.get(a);
60
+ const bCommits = authorCommits.get(b);
61
+ const coEdit = jaccard(aFiles, bFiles);
62
+ const coTopic = jaccard(aTokens, bTokens);
63
+ const coTime = computeCoTime(aCommits, bCommits, coTimeWindow);
64
+ const weight = Number((0.4 * coEdit + 0.2 * coTime + 0.4 * coTopic).toFixed(3));
65
+ if (weight < minEdge)
66
+ continue;
67
+ const sharedTerms = [...aTokens]
68
+ .filter((t) => bTokens.has(t))
69
+ .slice(0, 5);
70
+ edges.push({
71
+ authorA: a,
72
+ authorB: b,
73
+ weight,
74
+ axes: {
75
+ coEdit: Number(coEdit.toFixed(3)),
76
+ coTime: Number(coTime.toFixed(3)),
77
+ coTopic: Number(coTopic.toFixed(3)),
78
+ },
79
+ sharedTerms,
80
+ });
81
+ }
82
+ }
83
+ edges.sort((a, b) => b.weight - a.weight);
84
+ // Build nodes with centrality (simple degree-normalized)
85
+ const degree = new Map();
86
+ for (const e of edges) {
87
+ degree.set(e.authorA, (degree.get(e.authorA) ?? 0) + e.weight);
88
+ degree.set(e.authorB, (degree.get(e.authorB) ?? 0) + e.weight);
89
+ }
90
+ const maxDeg = Math.max(0, ...degree.values());
91
+ const nodes = eligible.map((author) => ({
92
+ author,
93
+ commits: authorCommits.get(author).length,
94
+ collaborators: edges.filter((e) => e.authorA === author || e.authorB === author).length,
95
+ centrality: maxDeg === 0 ? 0 : Number(((degree.get(author) ?? 0) / maxDeg).toFixed(3)),
96
+ }));
97
+ nodes.sort((a, b) => b.centrality - a.centrality);
98
+ // Detect silos via connected components on the (filtered) graph
99
+ const silos = detectSilos(eligible, edges);
100
+ // Bridges: authors with edges to ≥ 2 silos
101
+ const bridges = detectBridges(eligible, edges, silos);
102
+ return {
103
+ windowCommits: sorted.length,
104
+ nodes,
105
+ edges,
106
+ silos,
107
+ bridges,
108
+ };
109
+ }
110
+ function tokenizeSet(text) {
111
+ const out = new Set();
112
+ for (const t of text
113
+ .toLowerCase()
114
+ .replace(/[^a-z0-9_/.-]+/g, " ")
115
+ .split(/\s+/)) {
116
+ if (!t || t.length < 3)
117
+ continue;
118
+ if (STOPWORDS.has(t))
119
+ continue;
120
+ out.add(t);
121
+ }
122
+ return out;
123
+ }
124
+ function jaccard(a, b) {
125
+ if (a.size === 0 && b.size === 0)
126
+ return 1;
127
+ let inter = 0;
128
+ for (const x of a)
129
+ if (b.has(x))
130
+ inter++;
131
+ const union = a.size + b.size - inter;
132
+ return union === 0 ? 0 : inter / union;
133
+ }
134
+ function computeCoTime(a, b, windowMs) {
135
+ if (a.length === 0 || b.length === 0)
136
+ return 0;
137
+ // For each commit in a, count if any commit in b is within window
138
+ const bTimes = b.map((c) => new Date(c.authorDate).getTime()).sort((x, y) => x - y);
139
+ let hits = 0;
140
+ for (const ca of a) {
141
+ const t = new Date(ca.authorDate).getTime();
142
+ // binary search for any time within [t - window, t + window]
143
+ const target = t;
144
+ let lo = 0, hi = bTimes.length - 1;
145
+ while (lo <= hi) {
146
+ const mid = (lo + hi) >> 1;
147
+ const v = bTimes[mid];
148
+ if (Math.abs(v - target) <= windowMs) {
149
+ hits++;
150
+ break;
151
+ }
152
+ if (v < target)
153
+ lo = mid + 1;
154
+ else
155
+ hi = mid - 1;
156
+ }
157
+ }
158
+ return hits / a.length;
159
+ }
160
+ function detectSilos(authors, edges) {
161
+ // Union-find over authors
162
+ const parent = new Map();
163
+ const find = (x) => {
164
+ let p = parent.get(x) ?? x;
165
+ while (p !== x) {
166
+ const grand = parent.get(p) ?? p;
167
+ parent.set(x, grand);
168
+ x = grand;
169
+ p = parent.get(x) ?? x;
170
+ }
171
+ return x;
172
+ };
173
+ const union = (a, b) => {
174
+ const ra = find(a), rb = find(b);
175
+ if (ra !== rb)
176
+ parent.set(ra, rb);
177
+ };
178
+ for (const a of authors)
179
+ parent.set(a, a);
180
+ // Only edges with weight ≥ 0.15 join
181
+ const joinFloor = 0.15;
182
+ for (const e of edges) {
183
+ if (e.weight >= joinFloor)
184
+ union(e.authorA, e.authorB);
185
+ }
186
+ const groups = new Map();
187
+ for (const a of authors) {
188
+ const r = find(a);
189
+ if (!groups.has(r))
190
+ groups.set(r, []);
191
+ groups.get(r).push(a);
192
+ }
193
+ return [...groups.values()].filter((g) => g.length >= 2);
194
+ }
195
+ function detectBridges(authors, edges, silos) {
196
+ if (silos.length < 2)
197
+ return [];
198
+ // For each author, count how many silos they have weak (<0.15) cross-edges to
199
+ const siloOf = new Map();
200
+ for (let i = 0; i < silos.length; i++) {
201
+ for (const a of silos[i])
202
+ siloOf.set(a, i);
203
+ }
204
+ const otherSilosByAuthor = new Map();
205
+ for (const e of edges) {
206
+ if (e.weight >= 0.15)
207
+ continue; // only weak/cross-cluster edges
208
+ const sa = siloOf.get(e.authorA);
209
+ const sb = siloOf.get(e.authorB);
210
+ if (sa === undefined || sb === undefined)
211
+ continue;
212
+ if (sa === sb)
213
+ continue;
214
+ let setA = otherSilosByAuthor.get(e.authorA);
215
+ if (!setA) {
216
+ setA = new Set();
217
+ otherSilosByAuthor.set(e.authorA, setA);
218
+ }
219
+ setA.add(sb);
220
+ let setB = otherSilosByAuthor.get(e.authorB);
221
+ if (!setB) {
222
+ setB = new Set();
223
+ otherSilosByAuthor.set(e.authorB, setB);
224
+ }
225
+ setB.add(sa);
226
+ }
227
+ return [...otherSilosByAuthor.entries()]
228
+ .filter(([, silosSet]) => silosSet.size >= 2)
229
+ .map(([a]) => a);
230
+ }
231
+ //# sourceMappingURL=network.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network.js","sourceRoot":"","sources":["../../src/insights/network.ts"],"names":[],"mappings":"AAyDA,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC;IACxB,KAAK,EAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,KAAK,EAAC,OAAO,EAAC,KAAK;IAC9E,QAAQ,EAAC,QAAQ,EAAC,QAAQ,EAAC,MAAM,EAAC,MAAM,EAAC,KAAK,EAAC,KAAK,EAAC,MAAM,EAAC,MAAM,EAAC,IAAI,EAAC,KAAK,EAAC,IAAI;IAClF,MAAM,EAAC,OAAO,EAAC,MAAM,EAAC,MAAM,EAAC,UAAU,EAAC,OAAO,EAAC,OAAO,EAAC,IAAI,EAAC,MAAM,EAAC,QAAQ;IAC5E,OAAO,EAAC,QAAQ,EAAC,IAAI,EAAC,OAAO,EAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,MAAM,EAAC,IAAI,EAAC,IAAI,EAAC,MAAM;CAC/E,CAAC,CAAC;AAEH,MAAM,UAAU,YAAY,CAC1B,OAAiB,EACjB,OAII,EAAE;IAEN,MAAM,YAAY,GAAG,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,CAAC,GAAG,UAAU,CAAC;IAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC;IAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,IAAI,CAAC,CAAC;IAE7C,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;IACrF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,aAAa,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAC5E,CAAC;IAED,wCAAwC;IACxC,MAAM,aAAa,GAAG,IAAI,GAAG,EAAoB,CAAC;IAClD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAuB,CAAC;IACpD,MAAM,WAAW,GAAG,IAAI,GAAG,EAAuB,CAAC;IACnD,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAuB,CAAC;IAE1D,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,MAAM,CAAC,GAAG,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,WAAW,CAAC;QACxC,IAAI,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,GAAG,GAAG,EAAE,CAAC;YACT,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC5B,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACZ,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;QAC5D,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACvC,IAAI,EAAE,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,EAAE,GAAG,IAAI,GAAG,EAAE,CAAC;YACf,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1B,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,MAAM;YAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAClC,IAAI,EAAE,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,EAAE,GAAG,IAAI,GAAG,EAAE,CAAC;YACf,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACzB,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK;YAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IAED,gCAAgC;IAChC,MAAM,QAAQ,GAAG,CAAC,GAAG,aAAa,CAAC,OAAO,EAAE,CAAC;SAC1C,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,IAAI,SAAS,CAAC;SAC1C,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAEnB,uBAAuB;IACvB,MAAM,KAAK,GAAiB,EAAE,CAAC;IAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7C,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC;YACvB,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC;YACvB,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC;YACnC,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC;YACnC,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC;YACrC,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC;YACrC,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC;YACvC,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC;YAEvC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACvC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC1C,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;YAC/D,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,GAAG,GAAG,MAAM,GAAG,GAAG,GAAG,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;YAChF,IAAI,MAAM,GAAG,OAAO;gBAAE,SAAS;YAE/B,MAAM,WAAW,GAAG,CAAC,GAAG,OAAO,CAAC;iBAC7B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;iBAC7B,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAEf,KAAK,CAAC,IAAI,CAAC;gBACT,OAAO,EAAE,CAAC;gBACV,OAAO,EAAE,CAAC;gBACV,MAAM;gBACN,IAAI,EAAE;oBACJ,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;oBACjC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;oBACjC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;iBACpC;gBACD,WAAW;aACZ,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;IAE1C,yDAAyD;IACzD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;QAC/D,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;IACjE,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAiB,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACpD,MAAM;QACN,OAAO,EAAE,aAAa,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC,MAAM;QAC1C,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,MAAM,IAAI,CAAC,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC,MAAM;QACvF,UAAU,EAAE,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;KACvF,CAAC,CAAC,CAAC;IACJ,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;IAElD,gEAAgE;IAChE,MAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAE3C,2CAA2C;IAC3C,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAEtD,OAAO;QACL,aAAa,EAAE,MAAM,CAAC,MAAM;QAC5B,KAAK;QACL,KAAK;QACL,KAAK;QACL,OAAO;KACR,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAC/B,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,KAAK,MAAM,CAAC,IAAI,IAAI;SACjB,WAAW,EAAE;SACb,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC;SAC/B,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QAChB,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;YAAE,SAAS;QACjC,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,SAAS;QAC/B,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACb,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,OAAO,CAAI,CAAS,EAAE,CAAS;IACtC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAC3C,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,CAAC,IAAI,CAAC;QAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,KAAK,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC;IACtC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC;AACzC,CAAC;AAED,SAAS,aAAa,CAAC,CAAW,EAAE,CAAW,EAAE,QAAgB;IAC/D,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAC/C,kEAAkE;IAClE,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACpF,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC;QACnB,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC;QAC5C,6DAA6D;QAC7D,MAAM,MAAM,GAAG,CAAC,CAAC;QACjB,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QACnC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;YAChB,MAAM,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;YAC3B,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAE,CAAC;YACvB,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACrC,IAAI,EAAE,CAAC;gBACP,MAAM;YACR,CAAC;YACD,IAAI,CAAC,GAAG,MAAM;gBAAE,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC;;gBACxB,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC;AACzB,CAAC;AAED,SAAS,WAAW,CAAC,OAAiB,EAAE,KAAmB;IACzD,0BAA0B;IAC1B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,MAAM,IAAI,GAAG,CAAC,CAAS,EAAU,EAAE;QACjC,IAAI,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACf,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACjC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YACrB,CAAC,GAAG,KAAK,CAAC;YACV,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC,CAAC;IACF,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE;QACrC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACjC,IAAI,EAAE,KAAK,EAAE;YAAE,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACpC,CAAC,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,OAAO;QAAE,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1C,qCAAqC;IACrC,MAAM,SAAS,GAAG,IAAI,CAAC;IACvB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,CAAC,MAAM,IAAI,SAAS;YAAE,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;IACzD,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC3C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACtC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,aAAa,CACpB,OAAiB,EACjB,KAAmB,EACnB,KAAiB;IAEjB,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAChC,8EAA8E;IAC9E,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,CAAC,CAAE;YAAE,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9C,CAAC;IACD,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC1D,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,CAAC,MAAM,IAAI,IAAI;YAAE,SAAS,CAAC,gCAAgC;QAChE,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACjC,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACjC,IAAI,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,SAAS;YAAE,SAAS;QACnD,IAAI,EAAE,KAAK,EAAE;YAAE,SAAS;QACxB,IAAI,IAAI,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;YACjB,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC1C,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACb,IAAI,IAAI,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;YACjB,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC1C,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACf,CAAC;IACD,OAAO,CAAC,GAAG,kBAAkB,CAAC,OAAO,EAAE,CAAC;SACrC,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,CAAC;SAC5C,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AACrB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=network.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network.test.d.ts","sourceRoot":"","sources":["../../src/insights/network.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,100 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { buildNetwork } from "./network.js";
3
+ function mk(p) {
4
+ return {
5
+ hash: p.hash,
6
+ shortHash: p.hash.slice(0, 7),
7
+ authorName: p.author,
8
+ authorEmail: p.author.toLowerCase() + "@x.com",
9
+ authorDate: p.date,
10
+ committerDate: p.date,
11
+ subject: p.subject,
12
+ body: "",
13
+ files: p.files ?? [],
14
+ parents: [],
15
+ };
16
+ }
17
+ describe("buildNetwork", () => {
18
+ it("returns empty for empty input", () => {
19
+ const n = buildNetwork([]);
20
+ expect(n.nodes).toHaveLength(0);
21
+ expect(n.edges).toHaveLength(0);
22
+ expect(n.silos).toHaveLength(0);
23
+ });
24
+ it("filters out authors below minAuthorCommits", () => {
25
+ const commits = [
26
+ mk({ hash: "a1", date: "2024-01-01", subject: "x", author: "Alice", files: ["a.ts"] }),
27
+ mk({ hash: "b1", date: "2024-01-02", subject: "x", author: "Bob", files: ["b.ts"] }),
28
+ ];
29
+ const n = buildNetwork(commits, { minAuthorCommits: 3 });
30
+ expect(n.nodes).toHaveLength(0);
31
+ });
32
+ it("creates an edge between authors who touched the same files", () => {
33
+ const commits = [
34
+ mk({ hash: "a1", date: "2024-01-01", subject: "auth work", author: "Alice", files: ["src/auth.ts"] }),
35
+ mk({ hash: "a2", date: "2024-01-02", subject: "auth work", author: "Alice", files: ["src/auth.ts"] }),
36
+ mk({ hash: "b1", date: "2024-01-03", subject: "auth fix", author: "Bob", files: ["src/auth.ts"] }),
37
+ mk({ hash: "b2", date: "2024-01-04", subject: "auth tweak", author: "Bob", files: ["src/auth.ts"] }),
38
+ ];
39
+ const n = buildNetwork(commits, { minAuthorCommits: 2 });
40
+ const edge = n.edges.find((e) => (e.authorA === "Alice" && e.authorB === "Bob") || (e.authorA === "Bob" && e.authorB === "Alice"));
41
+ expect(edge).toBeDefined();
42
+ expect(edge.axes.coEdit).toBeGreaterThan(0);
43
+ });
44
+ it("co-topic axis fires when authors share commit vocabulary", () => {
45
+ const commits = [
46
+ mk({ hash: "a1", date: "2024-01-01", subject: "rewrite payment processor", author: "Alice", files: ["a.ts"] }),
47
+ mk({ hash: "a2", date: "2024-01-02", subject: "rewrite payment validation", author: "Alice", files: ["b.ts"] }),
48
+ mk({ hash: "b1", date: "2024-01-03", subject: "rewrite payment retry", author: "Bob", files: ["c.ts"] }),
49
+ mk({ hash: "b2", date: "2024-01-04", subject: "rewrite payment receipts", author: "Bob", files: ["d.ts"] }),
50
+ ];
51
+ const n = buildNetwork(commits, { minAuthorCommits: 2, minEdgeWeight: 0 });
52
+ const edge = n.edges[0];
53
+ expect(edge).toBeDefined();
54
+ expect(edge.axes.coTopic).toBeGreaterThan(0);
55
+ expect(edge.sharedTerms).toContain("payment");
56
+ });
57
+ it("centrality is highest for the most-connected author", () => {
58
+ const commits = [
59
+ // Alice connected to both Bob and Carol via shared files
60
+ mk({ hash: "a1", date: "2024-01-01", subject: "x", author: "Alice", files: ["src/x.ts", "src/y.ts"] }),
61
+ mk({ hash: "a2", date: "2024-01-02", subject: "x", author: "Alice", files: ["src/x.ts", "src/y.ts"] }),
62
+ mk({ hash: "b1", date: "2024-01-03", subject: "x", author: "Bob", files: ["src/x.ts"] }),
63
+ mk({ hash: "b2", date: "2024-01-04", subject: "x", author: "Bob", files: ["src/x.ts"] }),
64
+ mk({ hash: "c1", date: "2024-01-05", subject: "x", author: "Carol", files: ["src/y.ts"] }),
65
+ mk({ hash: "c2", date: "2024-01-06", subject: "x", author: "Carol", files: ["src/y.ts"] }),
66
+ ];
67
+ const n = buildNetwork(commits, { minAuthorCommits: 2, minEdgeWeight: 0 });
68
+ expect(n.nodes[0].author).toBe("Alice");
69
+ expect(n.nodes[0].centrality).toBeGreaterThanOrEqual(n.nodes[1].centrality);
70
+ });
71
+ it("detects silos when groups have no inter-group edges above threshold", () => {
72
+ const commits = [
73
+ mk({ hash: "a1", date: "2024-01-01", subject: "auth", author: "Alice", files: ["src/auth/x.ts"] }),
74
+ mk({ hash: "a2", date: "2024-01-02", subject: "auth", author: "Alice", files: ["src/auth/x.ts"] }),
75
+ mk({ hash: "b1", date: "2024-01-01", subject: "auth", author: "Bob", files: ["src/auth/x.ts"] }),
76
+ mk({ hash: "b2", date: "2024-01-02", subject: "auth", author: "Bob", files: ["src/auth/x.ts"] }),
77
+ mk({ hash: "c1", date: "2024-01-01", subject: "payments", author: "Carol", files: ["src/pay/y.ts"] }),
78
+ mk({ hash: "c2", date: "2024-01-02", subject: "payments", author: "Carol", files: ["src/pay/y.ts"] }),
79
+ mk({ hash: "d1", date: "2024-01-01", subject: "payments", author: "Dave", files: ["src/pay/y.ts"] }),
80
+ mk({ hash: "d2", date: "2024-01-02", subject: "payments", author: "Dave", files: ["src/pay/y.ts"] }),
81
+ ];
82
+ const n = buildNetwork(commits, { minAuthorCommits: 2 });
83
+ expect(n.silos.length).toBeGreaterThanOrEqual(1);
84
+ });
85
+ it("edges sorted by weight descending", () => {
86
+ const commits = [
87
+ mk({ hash: "a1", date: "2024-01-01", subject: "auth", author: "Alice", files: ["x.ts"] }),
88
+ mk({ hash: "a2", date: "2024-01-02", subject: "auth", author: "Alice", files: ["x.ts"] }),
89
+ mk({ hash: "b1", date: "2024-01-03", subject: "auth", author: "Bob", files: ["x.ts"] }),
90
+ mk({ hash: "b2", date: "2024-01-04", subject: "auth", author: "Bob", files: ["x.ts"] }),
91
+ mk({ hash: "c1", date: "2024-01-05", subject: "different", author: "Carol", files: ["y.ts"] }),
92
+ mk({ hash: "c2", date: "2024-01-06", subject: "different", author: "Carol", files: ["y.ts"] }),
93
+ ];
94
+ const n = buildNetwork(commits, { minAuthorCommits: 2, minEdgeWeight: 0 });
95
+ for (let i = 1; i < n.edges.length; i++) {
96
+ expect(n.edges[i - 1].weight).toBeGreaterThanOrEqual(n.edges[i].weight);
97
+ }
98
+ });
99
+ });
100
+ //# sourceMappingURL=network.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network.test.js","sourceRoot":"","sources":["../../src/insights/network.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * `mneme oracle` — predict near-future co-edits and surface likely
3
+ * collisions where two authors will both touch the same file.
4
+ *
5
+ * Builds an author-file affinity matrix from recent history (default:
6
+ * last 90 days), then projects the per-author probability of touching
7
+ * each file in the upcoming window. When two authors both have high
8
+ * probability for the same file, that's a *predicted collision* —
9
+ * worth flagging for a quick sync.
10
+ *
11
+ * Pure data extraction. No external services. Mneme owns the WHO and
12
+ * the WHAT; this combines them.
13
+ */
14
+ import type { Commit } from "../types.js";
15
+ export interface AuthorFileAffinity {
16
+ author: string;
17
+ filePath: string;
18
+ /** How many times the author touched the file in the window. */
19
+ touches: number;
20
+ /** Recency-weighted score 0..1 (more recent = higher). */
21
+ score: number;
22
+ }
23
+ export interface FilePrediction {
24
+ filePath: string;
25
+ /** Top likely editors with probabilities (sorted). */
26
+ candidates: Array<{
27
+ author: string;
28
+ probability: number;
29
+ }>;
30
+ }
31
+ export interface Collision {
32
+ filePath: string;
33
+ authorA: string;
34
+ authorB: string;
35
+ /** Joint probability — geometric mean of the two individual probabilities. */
36
+ jointProbability: number;
37
+ /** How recently they both touched it together (days ago, or -1 if never). */
38
+ daysSinceLastJointTouch: number;
39
+ }
40
+ export interface OracleReport {
41
+ /** Total commits considered. */
42
+ windowCommits: number;
43
+ /** Top per-file predictions. */
44
+ predictions: FilePrediction[];
45
+ /** Predicted collisions sorted by jointProbability desc. */
46
+ collisions: Collision[];
47
+ }
48
+ /**
49
+ * Build an Oracle report. Caller passes the full commit history; we
50
+ * keep only the recent window.
51
+ */
52
+ export declare function buildOracle(commits: Commit[], opts?: {
53
+ nowMs?: number;
54
+ windowDays?: number;
55
+ topPredictionsPerFile?: number;
56
+ minTouchesForFile?: number;
57
+ collisionFloor?: number;
58
+ }): OracleReport;
59
+ //# sourceMappingURL=oracle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oracle.d.ts","sourceRoot":"","sources":["../../src/insights/oracle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,OAAO,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,UAAU,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC5D;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,gBAAgB,EAAE,MAAM,CAAC;IACzB,6EAA6E;IAC7E,uBAAuB,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,YAAY;IAC3B,gCAAgC;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,gCAAgC;IAChC,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,4DAA4D;IAC5D,UAAU,EAAE,SAAS,EAAE,CAAC;CACzB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,EAAE,EACjB,IAAI,GAAE;IACJ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;CACpB,GACL,YAAY,CA2Fd"}
Binary file
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oracle.js","sourceRoot":"","sources":["../../src/insights/oracle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=oracle.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oracle.test.d.ts","sourceRoot":"","sources":["../../src/insights/oracle.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,133 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { buildOracle } from "./oracle.js";
3
+ const NOW = new Date("2026-05-05").getTime();
4
+ function mk(p) {
5
+ return {
6
+ hash: p.hash,
7
+ shortHash: p.hash.slice(0, 7),
8
+ authorName: p.author,
9
+ authorEmail: p.author.toLowerCase() + "@example.com",
10
+ authorDate: p.date,
11
+ committerDate: p.date,
12
+ subject: p.subject,
13
+ body: "",
14
+ files: p.files ?? ["src/x.ts"],
15
+ parents: [],
16
+ };
17
+ }
18
+ describe("buildOracle", () => {
19
+ it("returns empty report for empty commits", () => {
20
+ const r = buildOracle([], { nowMs: NOW });
21
+ expect(r.windowCommits).toBe(0);
22
+ expect(r.predictions).toHaveLength(0);
23
+ expect(r.collisions).toHaveLength(0);
24
+ });
25
+ it("filters commits to within window", () => {
26
+ const commits = [
27
+ mk({ hash: "old", date: "2024-01-01", subject: "x", author: "Alice" }),
28
+ mk({ hash: "new", date: "2026-04-01", subject: "x", author: "Alice" }),
29
+ ];
30
+ const r = buildOracle(commits, { nowMs: NOW, windowDays: 90 });
31
+ expect(r.windowCommits).toBe(1);
32
+ });
33
+ it("predicts top candidates per file ordered by recency-weighted score", () => {
34
+ const commits = [];
35
+ for (let i = 0; i < 10; i++) {
36
+ commits.push(mk({
37
+ hash: `a${i}`,
38
+ date: `2026-04-${(i + 1).toString().padStart(2, "0")}`,
39
+ subject: "x",
40
+ author: "Alice",
41
+ files: ["src/auth.ts"],
42
+ }));
43
+ }
44
+ for (let i = 0; i < 3; i++) {
45
+ commits.push(mk({
46
+ hash: `b${i}`,
47
+ date: `2026-03-${(i + 1).toString().padStart(2, "0")}`,
48
+ subject: "x",
49
+ author: "Bob",
50
+ files: ["src/auth.ts"],
51
+ }));
52
+ }
53
+ const r = buildOracle(commits, { nowMs: NOW });
54
+ const auth = r.predictions.find((p) => p.filePath === "src/auth.ts");
55
+ expect(auth).toBeDefined();
56
+ expect(auth.candidates[0].author).toBe("Alice");
57
+ expect(auth.candidates[0].probability).toBeGreaterThan(auth.candidates[1].probability);
58
+ });
59
+ it("detects collision when 2 authors both have high probability for same file", () => {
60
+ const commits = [];
61
+ for (let i = 0; i < 6; i++) {
62
+ commits.push(mk({
63
+ hash: `a${i}`,
64
+ date: `2026-04-${(i + 1).toString().padStart(2, "0")}`,
65
+ subject: "x",
66
+ author: "Alice",
67
+ files: ["src/payment.ts"],
68
+ }));
69
+ commits.push(mk({
70
+ hash: `b${i}`,
71
+ date: `2026-04-${(i + 1).toString().padStart(2, "0")}`,
72
+ subject: "x",
73
+ author: "Bob",
74
+ files: ["src/payment.ts"],
75
+ }));
76
+ }
77
+ const r = buildOracle(commits, { nowMs: NOW });
78
+ const collision = r.collisions.find((c) => c.filePath === "src/payment.ts");
79
+ expect(collision).toBeDefined();
80
+ expect(new Set([collision.authorA, collision.authorB])).toEqual(new Set(["Alice", "Bob"]));
81
+ });
82
+ it("does NOT predict collision when one author dominates", () => {
83
+ const commits = [];
84
+ for (let i = 0; i < 20; i++) {
85
+ commits.push(mk({
86
+ hash: `a${i}`,
87
+ date: `2026-04-${(i + 1).toString().padStart(2, "0")}`,
88
+ subject: "x",
89
+ author: "Alice",
90
+ files: ["src/solo.ts"],
91
+ }));
92
+ }
93
+ commits.push(mk({ hash: "b1", date: "2026-04-01", subject: "x", author: "Bob", files: ["src/solo.ts"] }));
94
+ const r = buildOracle(commits, { nowMs: NOW, collisionFloor: 0.3 });
95
+ expect(r.collisions.find((c) => c.filePath === "src/solo.ts")).toBeUndefined();
96
+ });
97
+ it("excludes files below minTouches threshold", () => {
98
+ const commits = [
99
+ mk({ hash: "a1", date: "2026-04-01", subject: "x", author: "Alice", files: ["src/rare.ts"] }),
100
+ ];
101
+ const r = buildOracle(commits, { nowMs: NOW, minTouchesForFile: 2 });
102
+ expect(r.predictions.find((p) => p.filePath === "src/rare.ts")).toBeUndefined();
103
+ });
104
+ it("orders collisions by jointProbability desc", () => {
105
+ const commits = [];
106
+ for (let i = 0; i < 6; i++) {
107
+ commits.push(mk({ hash: `a${i}`, date: `2026-04-${(i + 1).toString().padStart(2, "0")}`, subject: "x", author: "Alice", files: ["src/hot.ts"] }));
108
+ commits.push(mk({ hash: `b${i}`, date: `2026-04-${(i + 1).toString().padStart(2, "0")}`, subject: "x", author: "Bob", files: ["src/hot.ts"] }));
109
+ }
110
+ for (let i = 0; i < 3; i++) {
111
+ commits.push(mk({ hash: `c${i}`, date: `2026-04-${(i + 10).toString().padStart(2, "0")}`, subject: "x", author: "Carol", files: ["src/cool.ts"] }));
112
+ commits.push(mk({ hash: `d${i}`, date: `2026-04-${(i + 10).toString().padStart(2, "0")}`, subject: "x", author: "Dave", files: ["src/cool.ts"] }));
113
+ }
114
+ const r = buildOracle(commits, { nowMs: NOW });
115
+ for (let i = 1; i < r.collisions.length; i++) {
116
+ expect(r.collisions[i - 1].jointProbability).toBeGreaterThanOrEqual(r.collisions[i].jointProbability);
117
+ }
118
+ });
119
+ it("daysSinceLastJointTouch is reasonable when both authors touched recently", () => {
120
+ const commits = [];
121
+ for (let i = 0; i < 4; i++) {
122
+ commits.push(mk({ hash: `a${i}`, date: `2026-04-${(20 + i).toString().padStart(2, "0")}`, subject: "x", author: "Alice", files: ["src/joint.ts"] }));
123
+ commits.push(mk({ hash: `b${i}`, date: `2026-04-${(20 + i).toString().padStart(2, "0")}`, subject: "x", author: "Bob", files: ["src/joint.ts"] }));
124
+ }
125
+ const r = buildOracle(commits, { nowMs: NOW });
126
+ const c = r.collisions[0];
127
+ if (c) {
128
+ expect(c.daysSinceLastJointTouch).toBeGreaterThan(-1);
129
+ expect(c.daysSinceLastJointTouch).toBeLessThan(60);
130
+ }
131
+ });
132
+ });
133
+ //# sourceMappingURL=oracle.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oracle.test.js","sourceRoot":"","sources":["../../src/insights/oracle.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mneme-ai/core",
3
- "version": "0.11.1",
3
+ "version": "0.13.0",
4
4
  "description": "Core indexing, retrieval, and graph engine for Mneme",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",