@mneme-ai/core 1.61.1 → 1.63.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 (61) hide show
  1. package/dist/index.d.ts +5 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +23 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/innerlife/ai_teacher.d.ts +83 -0
  6. package/dist/innerlife/ai_teacher.d.ts.map +1 -0
  7. package/dist/innerlife/ai_teacher.js +152 -0
  8. package/dist/innerlife/ai_teacher.js.map +1 -0
  9. package/dist/innerlife/innerlife.d.ts +104 -0
  10. package/dist/innerlife/innerlife.d.ts.map +1 -0
  11. package/dist/innerlife/innerlife.js +228 -0
  12. package/dist/innerlife/innerlife.js.map +1 -0
  13. package/dist/innerlife/innerlife.test.d.ts +5 -0
  14. package/dist/innerlife/innerlife.test.d.ts.map +1 -0
  15. package/dist/innerlife/innerlife.test.js +219 -0
  16. package/dist/innerlife/innerlife.test.js.map +1 -0
  17. package/dist/metamorphosis/metamorphosis.d.ts +116 -0
  18. package/dist/metamorphosis/metamorphosis.d.ts.map +1 -0
  19. package/dist/metamorphosis/metamorphosis.js +278 -0
  20. package/dist/metamorphosis/metamorphosis.js.map +1 -0
  21. package/dist/metamorphosis/metamorphosis.test.d.ts +5 -0
  22. package/dist/metamorphosis/metamorphosis.test.d.ts.map +1 -0
  23. package/dist/metamorphosis/metamorphosis.test.js +176 -0
  24. package/dist/metamorphosis/metamorphosis.test.js.map +1 -0
  25. package/dist/reactor/cache.d.ts +54 -0
  26. package/dist/reactor/cache.d.ts.map +1 -0
  27. package/dist/reactor/cache.js +172 -0
  28. package/dist/reactor/cache.js.map +1 -0
  29. package/dist/reactor/index.d.ts +12 -0
  30. package/dist/reactor/index.d.ts.map +1 -0
  31. package/dist/reactor/index.js +35 -0
  32. package/dist/reactor/index.js.map +1 -0
  33. package/dist/reactor/intent.d.ts +32 -0
  34. package/dist/reactor/intent.d.ts.map +1 -0
  35. package/dist/reactor/intent.js +115 -0
  36. package/dist/reactor/intent.js.map +1 -0
  37. package/dist/reactor/measure.d.ts +48 -0
  38. package/dist/reactor/measure.d.ts.map +1 -0
  39. package/dist/reactor/measure.js +85 -0
  40. package/dist/reactor/measure.js.map +1 -0
  41. package/dist/reactor/reactor.test.d.ts +8 -0
  42. package/dist/reactor/reactor.test.d.ts.map +1 -0
  43. package/dist/reactor/reactor.test.js +387 -0
  44. package/dist/reactor/reactor.test.js.map +1 -0
  45. package/dist/reactor/reactor_modules.d.ts +147 -0
  46. package/dist/reactor/reactor_modules.d.ts.map +1 -0
  47. package/dist/reactor/reactor_modules.js +356 -0
  48. package/dist/reactor/reactor_modules.js.map +1 -0
  49. package/dist/reactor/semantic_diff.d.ts +36 -0
  50. package/dist/reactor/semantic_diff.d.ts.map +1 -0
  51. package/dist/reactor/semantic_diff.js +134 -0
  52. package/dist/reactor/semantic_diff.js.map +1 -0
  53. package/dist/tribunal/tribunal.d.ts +111 -0
  54. package/dist/tribunal/tribunal.d.ts.map +1 -0
  55. package/dist/tribunal/tribunal.js +294 -0
  56. package/dist/tribunal/tribunal.js.map +1 -0
  57. package/dist/tribunal/tribunal.test.d.ts +5 -0
  58. package/dist/tribunal/tribunal.test.d.ts.map +1 -0
  59. package/dist/tribunal/tribunal.test.js +184 -0
  60. package/dist/tribunal/tribunal.test.js.map +1 -0
  61. package/package.json +1 -1
@@ -0,0 +1,356 @@
1
+ /**
2
+ * v1.62.0 -- REACTOR LAYERS 3, 4, 6, 7, 8, 9, 10, 11, 12.
3
+ *
4
+ * Smaller modules grouped into a single file for surface coherence.
5
+ * Each export ships its own deterministic measure of tokens-saved so
6
+ * the ledger rolls them all up uniformly.
7
+ */
8
+ import { createHash, createHmac, randomBytes } from "node:crypto";
9
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
10
+ import { join } from "node:path";
11
+ import { estimateTokens, metricsOf, recordSavings } from "./measure.js";
12
+ const RECIPES = [
13
+ {
14
+ id: "structured-logger",
15
+ pattern: /add\s+(?:a\s+)?(?:structured\s+)?logger\s+to\s+(.+)/i,
16
+ scaffold: `import { logger } from "@app/logger";\nconst log = logger.child({ module: "$MODULE" });\n// log.info({ ... }, "message")`,
17
+ aiGap: "Insert 2-4 log.info() / log.warn() calls at the right spots in the existing function.",
18
+ estimatedAiTokens: 180,
19
+ },
20
+ {
21
+ id: "vitest-skeleton",
22
+ pattern: /(?:write|add|create)\s+(?:a\s+)?(?:unit\s+)?tests?\s+for\s+(.+)/i,
23
+ scaffold: `import { describe, it, expect } from "vitest";\nimport { $TARGET } from "./$MODULE.js";\n\ndescribe("$TARGET", () => {\n it("$BEHAVIOR", () => {\n // ARRANGE ACT ASSERT\n });\n});`,
24
+ aiGap: "Fill in $BEHAVIOR name + the arrange/act/assert body (3-5 lines).",
25
+ estimatedAiTokens: 220,
26
+ },
27
+ {
28
+ id: "try-catch-with-logging",
29
+ pattern: /wrap\s+(.+?)\s+in\s+try.?catch/i,
30
+ scaffold: `try {\n $ORIGINAL_BODY\n} catch (err) {\n log.error({ err }, "$CONTEXT failed");\n throw err;\n}`,
31
+ aiGap: "Plug $CONTEXT label (one short string).",
32
+ estimatedAiTokens: 80,
33
+ },
34
+ {
35
+ id: "express-handler",
36
+ pattern: /(?:add|create)\s+(?:a\s+)?(?:express|http)\s+(?:handler|route|endpoint)\s+(?:for|to)\s+(.+)/i,
37
+ scaffold: `router.$VERB("$PATH", async (req, res) => {\n try {\n const result = await $SERVICE;\n res.json(result);\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n});`,
38
+ aiGap: "Pick $VERB (get/post/...) + $PATH + 2-line $SERVICE call.",
39
+ estimatedAiTokens: 200,
40
+ },
41
+ ];
42
+ export function tryRecipe(intent) {
43
+ for (const r of RECIPES) {
44
+ if (r.pattern.test(intent)) {
45
+ const baseline = 1500; // naive AI writes whole snippet from scratch
46
+ const spent = r.estimatedAiTokens + estimateTokens(r.scaffold);
47
+ return {
48
+ matched: true,
49
+ recipeId: r.id,
50
+ scaffold: r.scaffold,
51
+ aiGap: r.aiGap,
52
+ metrics: metricsOf(spent, baseline, `compiled_intent_${r.id}`),
53
+ };
54
+ }
55
+ }
56
+ return { matched: false, metrics: metricsOf(0, 0, "compiled_intent_miss") };
57
+ }
58
+ // ─── LAYER 4: SHARD CACHE (content-addressed prompt fragments) ─────────
59
+ //
60
+ // Stamp + hash large prompt fragments. Compatible with Anthropic prompt
61
+ // caching (it does its own hashing internally) but explicit hash IDs let
62
+ // the caller verify which shards are stable across turns.
63
+ const SHARDS_DIR = ".mneme/reactor/shards";
64
+ export function stampShard(repoRoot, content) {
65
+ const id = createHash("sha256").update(content).digest("hex").slice(0, 16);
66
+ const dir = join(repoRoot, SHARDS_DIR);
67
+ if (!existsSync(dir))
68
+ mkdirSync(dir, { recursive: true });
69
+ const path = join(dir, `${id}.json`);
70
+ const now = new Date().toISOString();
71
+ if (existsSync(path)) {
72
+ try {
73
+ const existing = JSON.parse(readFileSync(path, "utf8"));
74
+ existing.lastSeen = now;
75
+ existing.reuseCount += 1;
76
+ writeFileSync(path, JSON.stringify(existing, null, 2), "utf8");
77
+ return existing;
78
+ }
79
+ catch { /* */ }
80
+ }
81
+ const shard = {
82
+ id, content, sizeChars: content.length,
83
+ firstSeen: now, lastSeen: now, reuseCount: 0,
84
+ };
85
+ writeFileSync(path, JSON.stringify(shard, null, 2), "utf8");
86
+ return shard;
87
+ }
88
+ /** Replace a large content blob with a small shard reference. Records
89
+ * savings to the ledger on every call (hit OR miss) so the rollup
90
+ * reflects total compression activity. */
91
+ export function shardEnvelope(repoRoot, content) {
92
+ const shard = stampShard(repoRoot, content);
93
+ const baseline = estimateTokens(content);
94
+ // Spent if cache hit: 16-char id + 20-char wrapper.
95
+ const spent = shard.reuseCount > 0 ? 12 : baseline;
96
+ const metrics = metricsOf(spent, baseline, shard.reuseCount > 0 ? "shard_hit" : "shard_first_emit");
97
+ recordSavings(repoRoot, metrics);
98
+ return {
99
+ shardId: shard.id,
100
+ baselineTokens: baseline,
101
+ spentTokens: spent,
102
+ metrics,
103
+ };
104
+ }
105
+ const FUSION_RULES = [
106
+ { pattern: ["mneme.bot.spawn", "mneme.truth.check"], fusedName: "mneme.atomic.spawn-verify" },
107
+ { pattern: ["mneme.truth.check", "mneme.oracle.forecast"], fusedName: "mneme.atomic.verify-forecast" },
108
+ { pattern: ["mneme.bot.spawn", "mneme.truth.check", "mneme.oracle.forecast"], fusedName: "mneme.atomic.audit" },
109
+ ];
110
+ export function fuseToolCalls(calls) {
111
+ if (calls.length < 2)
112
+ return { fusable: false, toolsCombined: calls.length, metrics: metricsOf(0, 0, "fusion_miss") };
113
+ const names = calls.map((c) => c.name);
114
+ for (const rule of FUSION_RULES) {
115
+ if (rule.pattern.length !== names.length)
116
+ continue;
117
+ if (rule.pattern.every((p, i) => p === names[i])) {
118
+ // Overhead per tool def ~200 tok; envelopes ~80 tok per call.
119
+ const perCallOverhead = 200 + 80;
120
+ const baseline = calls.length * perCallOverhead;
121
+ const spent = perCallOverhead; // single fused call
122
+ return {
123
+ fusable: true,
124
+ fusedName: rule.fusedName,
125
+ fusedArgs: Object.assign({}, ...calls.map((c) => c.args)),
126
+ toolsCombined: calls.length,
127
+ metrics: metricsOf(spent, baseline, `fusion_${rule.fusedName.split(".").pop()}`),
128
+ };
129
+ }
130
+ }
131
+ return { fusable: false, toolsCombined: calls.length, metrics: metricsOf(0, 0, "fusion_no_rule") };
132
+ }
133
+ const CERTAINTY_MARKERS = [
134
+ /^(?:answer|verdict|conclusion|in short|therefore|so the answer is):/i,
135
+ /\.$\s*$/m, // trailing period at end of buffer = sentence done
136
+ /```[\s\S]+```/, // closed code block
137
+ ];
138
+ /** Heuristic: when the partial output already contains a closed answer
139
+ * block (period at end / closed code fence / explicit "answer:" lead),
140
+ * recommend stop. Also stop if partial > maxTokensSoFar bound. */
141
+ export function shouldTruncate(partialOutput, expectedTokens, opts) {
142
+ const max = opts?.maxTokens ?? expectedTokens * 1.5;
143
+ const currentTokens = estimateTokens(partialOutput);
144
+ let confidence = 0;
145
+ for (const re of CERTAINTY_MARKERS)
146
+ if (re.test(partialOutput))
147
+ confidence += 0.33;
148
+ if (currentTokens >= expectedTokens)
149
+ confidence += 0.34;
150
+ const stop = confidence >= 0.66 || currentTokens >= max;
151
+ // Savings = expected-tokens not generated.
152
+ const savedIfStop = stop ? Math.max(0, max - currentTokens) : 0;
153
+ return {
154
+ shouldStop: stop,
155
+ confidence: Math.min(1, confidence),
156
+ reason: stop ? `Certainty markers + token budget hit (current=${currentTokens}, expected=${expectedTokens})` : "still streaming",
157
+ metrics: metricsOf(currentTokens, currentTokens + savedIfStop, "stream_truncation"),
158
+ };
159
+ }
160
+ // ─── LAYER 8: CERTIFICATE TOKEN (ACGV proof reuse) ─────────────────────
161
+ //
162
+ // Issue a small signed cert that future calls reuse instead of re-verifying.
163
+ const CERT_DIR = ".mneme/reactor/certs";
164
+ function certSecret(repoRoot) {
165
+ const dir = join(repoRoot, CERT_DIR);
166
+ if (!existsSync(dir))
167
+ mkdirSync(dir, { recursive: true });
168
+ const path = join(dir, ".secret");
169
+ if (existsSync(path))
170
+ return readFileSync(path, "utf8").trim();
171
+ const s = randomBytes(32).toString("hex");
172
+ writeFileSync(path, s, "utf8");
173
+ return s;
174
+ }
175
+ export function issueCert(repoRoot, claim, verdict, confidence, opts) {
176
+ const ttl = opts?.ttlHours ?? 24;
177
+ const claimHash = createHash("sha256").update(claim).digest("hex").slice(0, 24);
178
+ const id = createHash("sha256").update(`${claimHash}|${verdict}|${Date.now()}`).digest("hex").slice(0, 16);
179
+ const issuedAt = new Date().toISOString();
180
+ const expiresAt = new Date(Date.now() + ttl * 3600 * 1000).toISOString();
181
+ const body = { id, claimHash, verdict, confidence, issuedAt, expiresAt };
182
+ const hmac = createHmac("sha256", certSecret(repoRoot)).update(JSON.stringify(body)).digest("hex").slice(0, 24);
183
+ const cert = { ...body, hmac };
184
+ const dir = join(repoRoot, CERT_DIR);
185
+ writeFileSync(join(dir, `${id}.json`), JSON.stringify(cert, null, 2), "utf8");
186
+ return cert;
187
+ }
188
+ export function verifyCert(repoRoot, cert) {
189
+ const baseline = 300;
190
+ const { hmac, ...body } = cert;
191
+ const expected = createHmac("sha256", certSecret(repoRoot)).update(JSON.stringify(body)).digest("hex").slice(0, 24);
192
+ if (expected !== hmac) {
193
+ return { valid: false, reason: "HMAC mismatch", metrics: metricsOf(0, 0, "cert_invalid") };
194
+ }
195
+ if (Date.parse(cert.expiresAt) < Date.now()) {
196
+ return { valid: false, reason: "expired", metrics: metricsOf(0, 0, "cert_expired") };
197
+ }
198
+ // Reusing the cert costs ~40 tokens (id + verdict label) vs re-verifying (~300 tok).
199
+ return { valid: true, reason: "HMAC + freshness ok", metrics: metricsOf(40, baseline, "cert_reuse") };
200
+ }
201
+ export function compressContext(chunks, opts) {
202
+ const k = opts?.keywordsPerChunk ?? 5;
203
+ const baselineText = chunks.join("\n");
204
+ const baseline = estimateTokens(baselineText);
205
+ const keywords = [];
206
+ for (const chunk of chunks.slice(0, 3)) {
207
+ const tokens = (chunk.toLowerCase().match(/[a-z][a-z0-9_-]+/g) ?? []).filter((t) => t.length >= 5);
208
+ const freq = new Map();
209
+ for (const t of tokens)
210
+ freq.set(t, (freq.get(t) ?? 0) + 1);
211
+ const top = [...freq.entries()].sort((a, b) => b[1] - a[1]).slice(0, k).map(([w]) => w);
212
+ keywords.push(top.join(" "));
213
+ }
214
+ const compressed = `[CONTEXT ANCHORS] ${keywords.join(" | ")}`;
215
+ const spent = estimateTokens(compressed);
216
+ return {
217
+ compressed,
218
+ baselineTokens: baseline,
219
+ spentTokens: spent,
220
+ metrics: metricsOf(spent, baseline, "embed_context"),
221
+ };
222
+ }
223
+ // ─── LAYER 10: TURN-DIFF PROTOCOL (server-side conversation memory) ────
224
+ //
225
+ // Conversation lives in Mneme. AI client sends only the new user message
226
+ // + conversationId. Mneme reconstructs the full history before forwarding.
227
+ const TURNS_DIR = ".mneme/reactor/turns";
228
+ function turnPath(repoRoot, id) {
229
+ const dir = join(repoRoot, TURNS_DIR);
230
+ if (!existsSync(dir))
231
+ mkdirSync(dir, { recursive: true });
232
+ return join(dir, `${id}.json`);
233
+ }
234
+ export function startConversation(repoRoot) {
235
+ const id = randomBytes(8).toString("hex");
236
+ const c = { id, turns: [], createdAt: new Date().toISOString() };
237
+ writeFileSync(turnPath(repoRoot, id), JSON.stringify(c, null, 2), "utf8");
238
+ return c;
239
+ }
240
+ export function recordTurn(repoRoot, conversationId, userMsg, aiResp) {
241
+ const path = turnPath(repoRoot, conversationId);
242
+ if (!existsSync(path))
243
+ return null;
244
+ try {
245
+ const c = JSON.parse(readFileSync(path, "utf8"));
246
+ c.turns.push({ user: userMsg, ai: aiResp, ts: new Date().toISOString() });
247
+ writeFileSync(path, JSON.stringify(c, null, 2), "utf8");
248
+ return c;
249
+ }
250
+ catch {
251
+ return null;
252
+ }
253
+ }
254
+ /** Build the slim "diff payload" the AI client sends instead of full history. */
255
+ export function turnDiff(repoRoot, conversationId, newMessage) {
256
+ const path = turnPath(repoRoot, conversationId);
257
+ if (!existsSync(path)) {
258
+ return {
259
+ conversationId, fullHistoryTokens: 0, diffTokens: estimateTokens(newMessage),
260
+ diff: newMessage,
261
+ metrics: metricsOf(estimateTokens(newMessage), estimateTokens(newMessage), "turn_diff_new"),
262
+ };
263
+ }
264
+ try {
265
+ const c = JSON.parse(readFileSync(path, "utf8"));
266
+ const fullHistory = c.turns.map((t) => `[U] ${t.user ?? ""}\n[A] ${t.ai ?? ""}`).join("\n");
267
+ const baseline = estimateTokens(fullHistory + "\n" + newMessage);
268
+ const diff = `CONV_REF:${conversationId}\n${newMessage}`;
269
+ const diffTokens = estimateTokens(diff);
270
+ return {
271
+ conversationId,
272
+ fullHistoryTokens: estimateTokens(fullHistory),
273
+ diffTokens,
274
+ diff,
275
+ metrics: metricsOf(diffTokens, baseline, "turn_diff_compact"),
276
+ };
277
+ }
278
+ catch {
279
+ return {
280
+ conversationId, fullHistoryTokens: 0, diffTokens: estimateTokens(newMessage),
281
+ diff: newMessage,
282
+ metrics: metricsOf(estimateTokens(newMessage), estimateTokens(newMessage), "turn_diff_corrupt"),
283
+ };
284
+ }
285
+ }
286
+ // ─── LAYER 11: SUMMARY DEBT LEDGER ─────────────────────────────────────
287
+ //
288
+ // Generate a 1-paragraph summary of a chunk so future references quote
289
+ // the summary instead of replaying the content.
290
+ const SUMMARY_DIR = ".mneme/reactor/summaries";
291
+ /** Heuristic summarizer: extract first sentence + 3 highest-token-frequency lines. */
292
+ export function summarize(content, opts) {
293
+ const baseline = estimateTokens(content);
294
+ const lines = content.split("\n").map((l) => l.trim()).filter(Boolean);
295
+ const firstSentence = (lines[0] ?? "").split(/[.!?]/)[0]?.trim() ?? "";
296
+ const freq = new Map();
297
+ const tokens = (content.toLowerCase().match(/[a-z][a-z0-9_-]+/g) ?? []).filter((t) => t.length >= 5);
298
+ for (const t of tokens)
299
+ freq.set(t, (freq.get(t) ?? 0) + 1);
300
+ const topTokens = [...freq.entries()].sort((a, b) => b[1] - a[1]).slice(0, 8).map(([w]) => w);
301
+ const summaryText = `${firstSentence}. Key topics: ${topTokens.join(", ")}.`;
302
+ const id = createHash("sha256").update(content).digest("hex").slice(0, 16);
303
+ const summary = {
304
+ id, source: opts?.source ?? "anon",
305
+ summary: summaryText,
306
+ bytesIn: content.length,
307
+ bytesOut: summaryText.length,
308
+ createdAt: new Date().toISOString(),
309
+ };
310
+ return { summary, metrics: metricsOf(estimateTokens(summaryText), baseline, "summary_debt") };
311
+ }
312
+ export function persistSummary(repoRoot, s) {
313
+ const dir = join(repoRoot, SUMMARY_DIR);
314
+ if (!existsSync(dir))
315
+ mkdirSync(dir, { recursive: true });
316
+ writeFileSync(join(dir, `${s.id}.json`), JSON.stringify(s, null, 2), "utf8");
317
+ }
318
+ export function recallSummary(repoRoot, id) {
319
+ const path = join(repoRoot, SUMMARY_DIR, `${id}.json`);
320
+ if (!existsSync(path))
321
+ return null;
322
+ try {
323
+ return JSON.parse(readFileSync(path, "utf8"));
324
+ }
325
+ catch {
326
+ return null;
327
+ }
328
+ }
329
+ const RETRY_PATTERNS = [
330
+ { test: /generate.+(?:javascript|typescript|jsx|tsx).+(?:component|class)/i, constraint: "Use functional components, no class syntax; no React.FC type wrapper.", weight: 0.6 },
331
+ { test: /write.+regex/i, constraint: "Provide regex flavor (JS / PCRE / POSIX); include flags explicitly.", weight: 0.5 },
332
+ { test: /(?:add|fix).+(?:lint|eslint|prettier)/i, constraint: "Show ONLY the line/file change, not full file rewrite.", weight: 0.4 },
333
+ { test: /refactor/i, constraint: "Preserve public API + existing test signatures.", weight: 0.5 },
334
+ { test: /implement.+algorithm/i, constraint: "Include complexity (Big-O) + a 3-case test scaffold.", weight: 0.5 },
335
+ ];
336
+ export function precogConstraints(prompt) {
337
+ const baseline = 800; // estimated retry cycle adds 800 tok on average
338
+ const constraints = [];
339
+ let risk = 0;
340
+ for (const r of RETRY_PATTERNS) {
341
+ if (r.test.test(prompt)) {
342
+ constraints.push(r.constraint);
343
+ risk = Math.max(risk, r.weight);
344
+ }
345
+ }
346
+ const predictedRetries = risk > 0.5 ? 1 : 0;
347
+ const spent = estimateTokens(constraints.join(" ")) + 50;
348
+ const savedIfPrevented = predictedRetries * baseline;
349
+ return {
350
+ riskScore: risk,
351
+ predictedRetries,
352
+ injectedConstraints: constraints,
353
+ metrics: metricsOf(spent, spent + savedIfPrevented, "precog_regret"),
354
+ };
355
+ }
356
+ //# sourceMappingURL=reactor_modules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reactor_modules.js","sourceRoot":"","sources":["../../src/reactor/reactor_modules.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * v1.62.0 -- REACTOR LAYER 5: SEMANTIC DIFF / TARGETED SLICE.
3
+ *
4
+ * Instead of sending the AI a whole file when it asks about a function /
5
+ * symbol / commit, return the SMALLEST relevant slice + a 1-line
6
+ * file-purpose summary. Cuts token cost 10-20x for file-read intents.
7
+ *
8
+ * Algorithm:
9
+ * 1. Tokenize the user's intent (>= 4 char words).
10
+ * 2. Find the symbol the intent is asking about (function / class /
11
+ * constant name) -- if any.
12
+ * 3. Walk the file; extract a [-window, +window] line band around the
13
+ * hit. Default window = 12 lines either side.
14
+ * 4. If no specific symbol found, return TOP 3 token-overlap regions.
15
+ */
16
+ import { type ReactorMetrics } from "./measure.js";
17
+ export interface SliceResult {
18
+ ok: boolean;
19
+ /** Full file token estimate (the baseline). */
20
+ fullFileTokens: number;
21
+ /** Slice token estimate (the spent). */
22
+ sliceTokens: number;
23
+ /** Number of slice regions returned. */
24
+ regionCount: number;
25
+ /** Concatenated slice content. */
26
+ slice: string;
27
+ /** 1-line purpose summary derived from the first comment / module description. */
28
+ filePurpose: string;
29
+ metrics: ReactorMetrics;
30
+ }
31
+ /** Slice a file given a user intent. */
32
+ export declare function sliceFile(repoRoot: string, filePath: string, intent: string, opts?: {
33
+ window?: number;
34
+ maxRegions?: number;
35
+ }): SliceResult;
36
+ //# sourceMappingURL=semantic_diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic_diff.d.ts","sourceRoot":"","sources":["../../src/reactor/semantic_diff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,EAA6B,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9E,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,OAAO,CAAC;IACZ,+CAA+C;IAC/C,cAAc,EAAE,MAAM,CAAC;IACvB,wCAAwC;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,wCAAwC;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,kFAAkF;IAClF,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,cAAc,CAAC;CACzB;AA8DD,wCAAwC;AACxC,wBAAgB,SAAS,CACvB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9C,WAAW,CA+Cb"}
@@ -0,0 +1,134 @@
1
+ /**
2
+ * v1.62.0 -- REACTOR LAYER 5: SEMANTIC DIFF / TARGETED SLICE.
3
+ *
4
+ * Instead of sending the AI a whole file when it asks about a function /
5
+ * symbol / commit, return the SMALLEST relevant slice + a 1-line
6
+ * file-purpose summary. Cuts token cost 10-20x for file-read intents.
7
+ *
8
+ * Algorithm:
9
+ * 1. Tokenize the user's intent (>= 4 char words).
10
+ * 2. Find the symbol the intent is asking about (function / class /
11
+ * constant name) -- if any.
12
+ * 3. Walk the file; extract a [-window, +window] line band around the
13
+ * hit. Default window = 12 lines either side.
14
+ * 4. If no specific symbol found, return TOP 3 token-overlap regions.
15
+ */
16
+ import { existsSync, readFileSync } from "node:fs";
17
+ import { join } from "node:path";
18
+ import { estimateTokens, metricsOf } from "./measure.js";
19
+ function tokenize(s) {
20
+ return Array.from(new Set((s.toLowerCase().match(/[a-z][a-z0-9_-]+/g) ?? []).filter((t) => t.length >= 4)));
21
+ }
22
+ function extractFilePurpose(content) {
23
+ // First non-empty `/**...*/`, `//`, or `#` comment within first 30 lines.
24
+ const lines = content.split("\n").slice(0, 30);
25
+ let inBlock = false;
26
+ for (const line of lines) {
27
+ const trimmed = line.trim();
28
+ if (trimmed.startsWith("/**")) {
29
+ inBlock = true;
30
+ continue;
31
+ }
32
+ if (inBlock && trimmed.startsWith("*")) {
33
+ const body = trimmed.replace(/^\*+\s*/, "").trim();
34
+ if (body && !body.startsWith("/"))
35
+ return body.slice(0, 120);
36
+ }
37
+ if (inBlock && trimmed.includes("*/")) {
38
+ inBlock = false;
39
+ continue;
40
+ }
41
+ if (trimmed.startsWith("//")) {
42
+ const body = trimmed.replace(/^\/\/+\s*/, "").trim();
43
+ if (body)
44
+ return body.slice(0, 120);
45
+ }
46
+ if (trimmed.startsWith("#")) {
47
+ const body = trimmed.replace(/^#+\s*/, "").trim();
48
+ if (body)
49
+ return body.slice(0, 120);
50
+ }
51
+ }
52
+ return "(no purpose comment found)";
53
+ }
54
+ function findHits(lines, queryTokens) {
55
+ const hits = [];
56
+ for (let i = 0; i < lines.length; i++) {
57
+ const lower = lines[i].toLowerCase();
58
+ let score = 0;
59
+ for (const t of queryTokens)
60
+ if (lower.includes(t))
61
+ score++;
62
+ if (score > 0)
63
+ hits.push({ lineNumber: i, score });
64
+ }
65
+ return hits;
66
+ }
67
+ /** Merge overlapping windows so consecutive hits don't duplicate context. */
68
+ function mergeWindows(hits, lineCount, window) {
69
+ if (hits.length === 0)
70
+ return [];
71
+ const ranges = hits.map((h) => [Math.max(0, h.lineNumber - window), Math.min(lineCount - 1, h.lineNumber + window)]);
72
+ ranges.sort((a, b) => a[0] - b[0]);
73
+ const merged = [ranges[0]];
74
+ for (let i = 1; i < ranges.length; i++) {
75
+ const last = merged[merged.length - 1];
76
+ if (ranges[i][0] <= last[1] + 1) {
77
+ last[1] = Math.max(last[1], ranges[i][1]);
78
+ }
79
+ else {
80
+ merged.push(ranges[i]);
81
+ }
82
+ }
83
+ return merged;
84
+ }
85
+ /** Slice a file given a user intent. */
86
+ export function sliceFile(repoRoot, filePath, intent, opts) {
87
+ const fullPath = filePath.startsWith("/") || /^[a-zA-Z]:/.test(filePath) ? filePath : join(repoRoot, filePath);
88
+ const window = opts?.window ?? 12;
89
+ const maxRegions = opts?.maxRegions ?? 3;
90
+ if (!existsSync(fullPath)) {
91
+ return {
92
+ ok: false, fullFileTokens: 0, sliceTokens: 0, regionCount: 0,
93
+ slice: `(file not found: ${filePath})`,
94
+ filePurpose: "(unreachable)",
95
+ metrics: metricsOf(0, 0, "slice_file_not_found"),
96
+ };
97
+ }
98
+ const content = readFileSync(fullPath, "utf8");
99
+ const fullTokens = estimateTokens(content);
100
+ const lines = content.split("\n");
101
+ const filePurpose = extractFilePurpose(content);
102
+ const queryTokens = tokenize(intent);
103
+ const hits = findHits(lines, queryTokens);
104
+ if (hits.length === 0) {
105
+ // No targeted hit -- return top-of-file (likely module exports + types).
106
+ const head = lines.slice(0, Math.min(40, lines.length)).join("\n");
107
+ const spent = estimateTokens(head);
108
+ return {
109
+ ok: true, fullFileTokens: fullTokens, sliceTokens: spent, regionCount: 1,
110
+ slice: `// FILE PURPOSE: ${filePurpose}\n${head}`,
111
+ filePurpose,
112
+ metrics: metricsOf(spent + 20, fullTokens, "slice_top_of_file"),
113
+ };
114
+ }
115
+ hits.sort((a, b) => b.score - a.score);
116
+ const topHits = hits.slice(0, maxRegions);
117
+ const ranges = mergeWindows(topHits, lines.length, window);
118
+ const regions = ranges.map(([start, end]) => {
119
+ const body = lines.slice(start, end + 1).join("\n");
120
+ return `// lines ${start + 1}-${end + 1}:\n${body}`;
121
+ });
122
+ const slice = `// FILE PURPOSE: ${filePurpose}\n\n${regions.join("\n\n// ...\n\n")}`;
123
+ const sliceTokens = estimateTokens(slice);
124
+ return {
125
+ ok: true,
126
+ fullFileTokens: fullTokens,
127
+ sliceTokens,
128
+ regionCount: regions.length,
129
+ slice,
130
+ filePurpose,
131
+ metrics: metricsOf(sliceTokens, fullTokens, "slice_targeted"),
132
+ };
133
+ }
134
+ //# sourceMappingURL=semantic_diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic_diff.js","sourceRoot":"","sources":["../../src/reactor/semantic_diff.ts"],"names":[],"mappings":"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"}