sverklo 0.19.0 → 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +62 -10
- package/dist/src/server/tools/memories.d.ts +5 -0
- package/dist/src/server/tools/memories.js +49 -4
- package/dist/src/server/tools/memories.js.map +1 -1
- package/dist/src/storage/memory-store.d.ts +33 -0
- package/dist/src/storage/memory-store.js +87 -0
- package/dist/src/storage/memory-store.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -82,6 +82,14 @@ If something is missing here that you'd ask about, [open an issue](https://githu
|
|
|
82
82
|
|
|
83
83
|
---
|
|
84
84
|
|
|
85
|
+
## What's new in 0.20
|
|
86
|
+
|
|
87
|
+
- **Contradiction detection on the bi-temporal memory layer.** `sverklo_memories mode:"conflicts"` surfaces pairs of active memories that share a pin (file path or symbol name) and may contradict — e.g., "JWT in middleware" vs "JWT in route handler" both pinned to `src/auth.ts`. Restricted to decision/preference/pattern categories (procedural/context are additive, not contradicting). Same-SHA pairs are skipped. Sorted by shared-pin count and age. Conservative by design: surfaces *candidates* for the agent or human to review, not auto-resolution. The bi-temporal model already preserved both sides of the contradiction; this just makes them findable.
|
|
88
|
+
|
|
89
|
+
## What's new in 0.19
|
|
90
|
+
|
|
91
|
+
- **C# (.cs) language support** — community contribution by [@NerdChieftain](https://github.com/NerdChieftain) in [#22](https://github.com/sverklo/sverklo/pull/22). Tree-sitter (when grammar installed) plus a regex fallback parser. Indexes namespaces (block-scoped + C# 10+ file-scoped), classes, structs, records (plain / `record class` / `record struct`), interfaces, enums, methods, constructors, and `using` directives. Adds `tree-sitter-c-sharp@0.23.5` WASM grammar to the install set. **Sverklo now supports 12 languages.**
|
|
92
|
+
|
|
85
93
|
## What's new in 0.18
|
|
86
94
|
|
|
87
95
|
- **Vue.js (.vue) support.** Single-file components are now first-class: the `<script>` block parses through the existing TS/JS pipeline (with line remapping back to the SFC), Composition API helpers (`ref`, `computed`, `reactive`, `defineProps`, …) are indexed as symbols, and PascalCase template tags emit relative imports so PageRank sees component graphs. Also fixes a preexisting TS bug where `import type { X } from 'y'` was missed.
|
|
@@ -334,7 +342,7 @@ Real measurements on real codebases. Reproducible via `npm run bench` ([methodol
|
|
|
334
342
|
|
|
335
343
|
- **Search p95 stays under 26 ms** even on a 4k-file monorepo
|
|
336
344
|
- **Impact analysis is sub-millisecond** — indexed SQL join, not a string scan
|
|
337
|
-
- **
|
|
345
|
+
- **12 languages:** TS, JS, Vue, Python, Go, Rust, Java, C, C++, Ruby, PHP, C#
|
|
338
346
|
|
|
339
347
|
### Retrieval benchmark — bench:primitives
|
|
340
348
|
|
|
@@ -352,18 +360,38 @@ A tuned grep beats sverklo on F1. Sverklo wins decisively on token economy (62×
|
|
|
352
360
|
|
|
353
361
|
## Quick Start
|
|
354
362
|
|
|
355
|
-
|
|
363
|
+
Three ways to install. Pick whichever matches your setup.
|
|
364
|
+
|
|
365
|
+
<details open>
|
|
366
|
+
<summary><b>⚡️ One-click install (Cursor / VS Code) — fastest</b></summary>
|
|
367
|
+
<br/>
|
|
368
|
+
|
|
369
|
+
[](cursor://anysphere.cursor-deeplink/mcp/install?name=sverklo&config=eyJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsInN2ZXJrbG8iXX0=) [](https://insiders.vscode.dev/redirect/mcp/install?name=sverklo&config=%7B%22command%22%3A%22npx%22%2C%22args%22%3A%5B%22-y%22%2C%22sverklo%22%5D%7D)
|
|
370
|
+
|
|
371
|
+
Click the badge for your editor. Cursor / VS Code prompt to confirm, then sverklo's MCP config is written automatically. Restart the editor and the 37 tools appear in the tool list. **No npm install required** — `npx` resolves it on first use.
|
|
372
|
+
|
|
373
|
+
</details>
|
|
374
|
+
|
|
375
|
+
<details>
|
|
376
|
+
<summary><b>📦 Global install (Claude Code, Windsurf, Zed, Antigravity, any MCP client)</b></summary>
|
|
377
|
+
<br/>
|
|
356
378
|
|
|
357
379
|
```bash
|
|
358
380
|
npm install -g sverklo
|
|
359
381
|
cd your-project && sverklo init
|
|
360
382
|
```
|
|
361
383
|
|
|
362
|
-
|
|
384
|
+
`sverklo init` auto-detects which AI coding agents you have (Claude Code, Cursor, Windsurf, Zed, Antigravity) and writes the right MCP config files. Idempotent — safe to re-run. If sverklo doesn't appear in your agent after restart, run `sverklo doctor`.
|
|
363
385
|
|
|
364
|
-
|
|
386
|
+
**Per-agent config locations** (`sverklo init` writes these for you):
|
|
387
|
+
- Claude Code: `.mcp.json` at project root + appends to `CLAUDE.md` (or `AGENTS.md` if present)
|
|
388
|
+
- Cursor: `.cursor/mcp.json`
|
|
389
|
+
- Windsurf: `~/.windsurf/mcp.json`
|
|
390
|
+
- VS Code: `.vscode/mcp.json`
|
|
391
|
+
- JetBrains: Settings → Tools → MCP Servers
|
|
392
|
+
- Antigravity: `~/.gemini/antigravity/mcp_config.json` (global; re-run `sverklo init` per project)
|
|
365
393
|
|
|
366
|
-
|
|
394
|
+
For agents we don't auto-detect, drop this in their MCP config:
|
|
367
395
|
|
|
368
396
|
```json
|
|
369
397
|
{
|
|
@@ -376,19 +404,43 @@ Use the full binary path (`which sverklo`) to avoid PATH issues in spawned subpr
|
|
|
376
404
|
}
|
|
377
405
|
```
|
|
378
406
|
|
|
379
|
-
|
|
407
|
+
Use the full binary path (`which sverklo`) — some clients spawn subprocesses without inheriting `$PATH`.
|
|
408
|
+
|
|
409
|
+
</details>
|
|
410
|
+
|
|
411
|
+
<details>
|
|
412
|
+
<summary><b>🔧 From source (contributors / custom builds)</b></summary>
|
|
413
|
+
<br/>
|
|
414
|
+
|
|
415
|
+
```bash
|
|
416
|
+
git clone https://github.com/sverklo/sverklo.git
|
|
417
|
+
cd sverklo
|
|
418
|
+
npm install
|
|
419
|
+
npm run build
|
|
420
|
+
npm link
|
|
421
|
+
sverklo init # in your project directory
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
Use this if you're contributing, debugging the indexer, or want to run a not-yet-published build. The `npm link` step makes `sverklo` resolvable globally from the local checkout.
|
|
425
|
+
|
|
426
|
+
To run the bench:
|
|
427
|
+
```bash
|
|
428
|
+
npm run bench:primitives
|
|
429
|
+
```
|
|
380
430
|
|
|
381
|
-
|
|
431
|
+
Output lands in `benchmark/results/<timestamp>/`.
|
|
382
432
|
|
|
383
|
-
|
|
433
|
+
</details>
|
|
384
434
|
|
|
385
|
-
### Any MCP client
|
|
435
|
+
### Any MCP client (one-shot via `npx`)
|
|
386
436
|
|
|
387
437
|
```bash
|
|
388
438
|
npx sverklo /path/to/your/project
|
|
389
439
|
```
|
|
390
440
|
|
|
391
|
-
|
|
441
|
+
No global install needed. `npx` resolves and runs sverklo on first call. Use this in CI, ephemeral sandboxes, or any host where you don't want a global install.
|
|
442
|
+
|
|
443
|
+
> **First run note:** The ONNX embedding model (~90 MB) downloads automatically on first launch. Takes ~30 seconds, then every subsequent run is offline-capable.
|
|
392
444
|
|
|
393
445
|
---
|
|
394
446
|
|
|
@@ -1,26 +1,40 @@
|
|
|
1
1
|
export const memoriesTool = {
|
|
2
2
|
name: "sverklo_memories",
|
|
3
|
-
description: "List all memories for the current project
|
|
3
|
+
description: "List all memories for the current project, or surface conflict candidates. " +
|
|
4
|
+
"Default mode shows memory health (staleness, confidence, access frequency). " +
|
|
5
|
+
"Pass `mode: \"conflicts\"` to surface pairs of active memories that share a pin and may " +
|
|
6
|
+
"contradict — the bi-temporal model preserves both, so this is a review prompt for the " +
|
|
7
|
+
"agent or human, not an auto-resolution.",
|
|
4
8
|
inputSchema: {
|
|
5
9
|
type: "object",
|
|
6
10
|
properties: {
|
|
11
|
+
mode: {
|
|
12
|
+
type: "string",
|
|
13
|
+
enum: ["list", "conflicts"],
|
|
14
|
+
description: "list (default): show active memories. conflicts: pairs of active memories sharing " +
|
|
15
|
+
"a pin that may contradict (decision/preference/pattern categories only).",
|
|
16
|
+
},
|
|
7
17
|
category: {
|
|
8
18
|
type: "string",
|
|
9
19
|
enum: ["decision", "preference", "pattern", "context", "todo", "procedural", "any"],
|
|
10
|
-
description: "Filter by category (default: 'any')",
|
|
20
|
+
description: "Filter by category in list mode (default: 'any')",
|
|
11
21
|
},
|
|
12
22
|
limit: {
|
|
13
23
|
type: "number",
|
|
14
|
-
description: "Max memories to return (default: 50)",
|
|
24
|
+
description: "Max memories (list mode) or conflict pairs (conflicts mode) to return (default: 50 / 25)",
|
|
15
25
|
},
|
|
16
26
|
stale_only: {
|
|
17
27
|
type: "boolean",
|
|
18
|
-
description: "
|
|
28
|
+
description: "List mode: only show stale memories (default: false)",
|
|
19
29
|
},
|
|
20
30
|
},
|
|
21
31
|
},
|
|
22
32
|
};
|
|
23
33
|
export function handleMemories(indexer, args) {
|
|
34
|
+
const mode = args.mode || "list";
|
|
35
|
+
if (mode === "conflicts") {
|
|
36
|
+
return formatConflicts(indexer, args.limit || 25);
|
|
37
|
+
}
|
|
24
38
|
const category = args.category || "any";
|
|
25
39
|
const limit = args.limit || 50;
|
|
26
40
|
const staleOnly = args.stale_only || false;
|
|
@@ -47,6 +61,37 @@ export function handleMemories(indexer, args) {
|
|
|
47
61
|
});
|
|
48
62
|
return header + rows.join("\n\n");
|
|
49
63
|
}
|
|
64
|
+
function formatConflicts(indexer, limit) {
|
|
65
|
+
const pairs = indexer.memoryStore.findConflicts(limit);
|
|
66
|
+
if (pairs.length === 0) {
|
|
67
|
+
return ("No conflict candidates detected. Either there are no active memories sharing a pin, " +
|
|
68
|
+
"or the memories that do share pins are non-contradictory (procedural/context categories " +
|
|
69
|
+
"are excluded by design — they're additive, not contradicting).");
|
|
70
|
+
}
|
|
71
|
+
const out = [
|
|
72
|
+
`## Memory conflict candidates (${pairs.length})`,
|
|
73
|
+
"",
|
|
74
|
+
"_These are pairs of active memories that share at least one pin and live in a category " +
|
|
75
|
+
"where contradiction is meaningful (decision / preference / pattern). The bi-temporal model " +
|
|
76
|
+
"preserves both — the agent or human picks which to invalidate via `sverklo_forget` or " +
|
|
77
|
+
"supersede via a fresh `sverklo_remember` call._",
|
|
78
|
+
"",
|
|
79
|
+
];
|
|
80
|
+
for (let i = 0; i < pairs.length; i++) {
|
|
81
|
+
const { a, b, sharedPins } = pairs[i];
|
|
82
|
+
const ageA = formatAge(a.created_at);
|
|
83
|
+
const ageB = formatAge(b.created_at);
|
|
84
|
+
out.push(`### ${i + 1}. Shared pins: ${sharedPins.map((p) => `\`${p}\``).join(", ")}`);
|
|
85
|
+
out.push("");
|
|
86
|
+
out.push(`**#${a.id}** [${a.category}] · ${ageA} ago · ${a.valid_from_sha?.slice(0, 7) || "no SHA"}`);
|
|
87
|
+
out.push(`> ${a.content.slice(0, 200)}${a.content.length > 200 ? "…" : ""}`);
|
|
88
|
+
out.push("");
|
|
89
|
+
out.push(`**#${b.id}** [${b.category}] · ${ageB} ago · ${b.valid_from_sha?.slice(0, 7) || "no SHA"}`);
|
|
90
|
+
out.push(`> ${b.content.slice(0, 200)}${b.content.length > 200 ? "…" : ""}`);
|
|
91
|
+
out.push("");
|
|
92
|
+
}
|
|
93
|
+
return out.join("\n");
|
|
94
|
+
}
|
|
50
95
|
function formatAge(timestamp) {
|
|
51
96
|
const ms = Date.now() - timestamp;
|
|
52
97
|
const mins = Math.floor(ms / 60000);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memories.js","sourceRoot":"","sources":["../../../../src/server/tools/memories.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,IAAI,EAAE,kBAAkB;IACxB,WAAW,EACT,
|
|
1
|
+
{"version":3,"file":"memories.js","sourceRoot":"","sources":["../../../../src/server/tools/memories.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,IAAI,EAAE,kBAAkB;IACxB,WAAW,EACT,6EAA6E;QAC7E,8EAA8E;QAC9E,0FAA0F;QAC1F,wFAAwF;QACxF,yCAAyC;IAC3C,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC;gBAC3B,WAAW,EACT,oFAAoF;oBACpF,0EAA0E;aAC7E;YACD,QAAQ,EAAE;gBACR,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,CAAC,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,CAAC;gBACnF,WAAW,EAAE,kDAAkD;aAChE;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,0FAA0F;aACxG;YACD,UAAU,EAAE;gBACV,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,sDAAsD;aACpE;SACF;KACF;CACF,CAAC;AAEF,MAAM,UAAU,cAAc,CAC5B,OAAgB,EAChB,IAA6B;IAE7B,MAAM,IAAI,GAAI,IAAI,CAAC,IAAyC,IAAI,MAAM,CAAC;IAEvE,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;QACzB,OAAO,eAAe,CAAC,OAAO,EAAG,IAAI,CAAC,KAAgB,IAAI,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,QAAQ,GAAI,IAAI,CAAC,QAAmC,IAAI,KAAK,CAAC;IACpE,MAAM,KAAK,GAAI,IAAI,CAAC,KAAgB,IAAI,EAAE,CAAC;IAC3C,MAAM,SAAS,GAAI,IAAI,CAAC,UAAsB,IAAI,KAAK,CAAC;IAExD,IAAI,QAAkB,CAAC;IAEvB,IAAI,SAAS,EAAE,CAAC;QACd,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;IAC5C,CAAC;SAAM,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;QAC9B,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,aAAa,CAAC,QAA0B,EAAE,KAAK,CAAC,CAAC;IAClF,CAAC;SAAM,CAAC;QACN,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,+FAA+F,CAAC;IACzG,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IAC1C,MAAM,MAAM,GAAG,gBAAgB,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;IAEpG,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC9B,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACzD,MAAM,KAAK,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QAEpC,OAAO,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,QAAQ,IAAI,KAAK,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,GAAG,gBAAgB,CAAC,CAAC,UAAU,YAAY,CAAC,CAAC,YAAY,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;IACjN,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,eAAe,CAAC,OAAgB,EAAE,KAAa;IACtD,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACvD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CACL,sFAAsF;YACtF,0FAA0F;YAC1F,gEAAgE,CACjE,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAa;QACpB,kCAAkC,KAAK,CAAC,MAAM,GAAG;QACjD,EAAE;QACF,yFAAyF;YACvF,6FAA6F;YAC7F,wFAAwF;YACxF,iDAAiD;QACnD,EAAE;KACH,CAAC;IAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QACrC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACvF,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACb,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,QAAQ,OAAO,IAAI,UAAU,CAAC,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC;QACtG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7E,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACb,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,QAAQ,OAAO,IAAI,UAAU,CAAC,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC;QACtG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7E,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,CAAC;IAED,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC;AAED,SAAS,SAAS,CAAC,SAAiB;IAClC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IAClC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC;IACpC,IAAI,IAAI,GAAG,EAAE;QAAE,OAAO,GAAG,IAAI,GAAG,CAAC;IACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IACpC,IAAI,KAAK,GAAG,EAAE;QAAE,OAAO,GAAG,KAAK,GAAG,CAAC;IACnC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;IACpC,OAAO,GAAG,IAAI,GAAG,CAAC;AACpB,CAAC"}
|
|
@@ -37,6 +37,39 @@ export declare class MemoryStore {
|
|
|
37
37
|
getById(id: number): Memory | undefined;
|
|
38
38
|
getAll(limit?: number): Memory[];
|
|
39
39
|
getByCategory(category: MemoryCategory, limit?: number): Memory[];
|
|
40
|
+
/**
|
|
41
|
+
* Find pairs of active memories that may contradict each other.
|
|
42
|
+
*
|
|
43
|
+
* v0.20 introduces conflict detection on the bi-temporal memory layer.
|
|
44
|
+
* Two memories are flagged as a conflict-candidate when they:
|
|
45
|
+
* 1. are both active (`valid_until_sha IS NULL`)
|
|
46
|
+
* 2. share at least one pin (file path or symbol name)
|
|
47
|
+
* 3. have category "decision", "preference", or "pattern" — the
|
|
48
|
+
* categories where contradiction is meaningful (procedural and
|
|
49
|
+
* context memories are usually additive, not contradicting)
|
|
50
|
+
* 4. were authored at different times (different `valid_from_sha`)
|
|
51
|
+
*
|
|
52
|
+
* The detection is intentionally conservative: it surfaces *candidates*,
|
|
53
|
+
* not confirmed contradictions. The agent or human reviewer decides
|
|
54
|
+
* whether the pair actually contradicts (e.g., "JWT in middleware" vs
|
|
55
|
+
* "JWT in route handler" pinned to the same file IS a contradiction;
|
|
56
|
+
* "validate input" vs "log all errors" pinned to the same file IS NOT).
|
|
57
|
+
*
|
|
58
|
+
* Returns pairs sorted by:
|
|
59
|
+
* 1. number of shared pins (more shared = stronger signal)
|
|
60
|
+
* 2. recency of the older memory (older = more likely to be stale)
|
|
61
|
+
*
|
|
62
|
+
* The semantic-similarity component (cosine over content embeddings)
|
|
63
|
+
* is intentionally NOT in this first version — it requires loading
|
|
64
|
+
* embeddings during the query, and the pin-overlap signal is already
|
|
65
|
+
* load-bearing enough on real corpora. Adding embedding-similarity
|
|
66
|
+
* is a v0.21 extension if pin-overlap proves too noisy in practice.
|
|
67
|
+
*/
|
|
68
|
+
findConflicts(limit?: number): Array<{
|
|
69
|
+
a: Memory;
|
|
70
|
+
b: Memory;
|
|
71
|
+
sharedPins: string[];
|
|
72
|
+
}>;
|
|
40
73
|
delete(id: number): boolean;
|
|
41
74
|
/**
|
|
42
75
|
* Bi-temporal invalidation — marks a memory as superseded rather than deleting it.
|
|
@@ -1,3 +1,18 @@
|
|
|
1
|
+
// Parse the pins JSON column into a Set for O(1) overlap checks.
|
|
2
|
+
// Returns an empty Set on null/undefined/malformed input.
|
|
3
|
+
function parsePinsSet(pins) {
|
|
4
|
+
if (!pins)
|
|
5
|
+
return new Set();
|
|
6
|
+
try {
|
|
7
|
+
const parsed = JSON.parse(pins);
|
|
8
|
+
if (!Array.isArray(parsed))
|
|
9
|
+
return new Set();
|
|
10
|
+
return new Set(parsed.filter((p) => typeof p === "string"));
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return new Set();
|
|
14
|
+
}
|
|
15
|
+
}
|
|
1
16
|
// Default mapping from category → kind. Sprint 9: episodic/semantic/procedural
|
|
2
17
|
// is orthogonal to category — we just need a sensible default for old call
|
|
3
18
|
// sites that don't pass `kind` explicitly.
|
|
@@ -119,6 +134,78 @@ export class MemoryStore {
|
|
|
119
134
|
getByCategory(category, limit = 50) {
|
|
120
135
|
return this.getByCategoryStmt.all(category, limit);
|
|
121
136
|
}
|
|
137
|
+
/**
|
|
138
|
+
* Find pairs of active memories that may contradict each other.
|
|
139
|
+
*
|
|
140
|
+
* v0.20 introduces conflict detection on the bi-temporal memory layer.
|
|
141
|
+
* Two memories are flagged as a conflict-candidate when they:
|
|
142
|
+
* 1. are both active (`valid_until_sha IS NULL`)
|
|
143
|
+
* 2. share at least one pin (file path or symbol name)
|
|
144
|
+
* 3. have category "decision", "preference", or "pattern" — the
|
|
145
|
+
* categories where contradiction is meaningful (procedural and
|
|
146
|
+
* context memories are usually additive, not contradicting)
|
|
147
|
+
* 4. were authored at different times (different `valid_from_sha`)
|
|
148
|
+
*
|
|
149
|
+
* The detection is intentionally conservative: it surfaces *candidates*,
|
|
150
|
+
* not confirmed contradictions. The agent or human reviewer decides
|
|
151
|
+
* whether the pair actually contradicts (e.g., "JWT in middleware" vs
|
|
152
|
+
* "JWT in route handler" pinned to the same file IS a contradiction;
|
|
153
|
+
* "validate input" vs "log all errors" pinned to the same file IS NOT).
|
|
154
|
+
*
|
|
155
|
+
* Returns pairs sorted by:
|
|
156
|
+
* 1. number of shared pins (more shared = stronger signal)
|
|
157
|
+
* 2. recency of the older memory (older = more likely to be stale)
|
|
158
|
+
*
|
|
159
|
+
* The semantic-similarity component (cosine over content embeddings)
|
|
160
|
+
* is intentionally NOT in this first version — it requires loading
|
|
161
|
+
* embeddings during the query, and the pin-overlap signal is already
|
|
162
|
+
* load-bearing enough on real corpora. Adding embedding-similarity
|
|
163
|
+
* is a v0.21 extension if pin-overlap proves too noisy in practice.
|
|
164
|
+
*/
|
|
165
|
+
findConflicts(limit = 25) {
|
|
166
|
+
const candidates = this.db
|
|
167
|
+
.prepare(`
|
|
168
|
+
SELECT * FROM memories
|
|
169
|
+
WHERE valid_until_sha IS NULL
|
|
170
|
+
AND pins IS NOT NULL
|
|
171
|
+
AND pins != '[]'
|
|
172
|
+
AND category IN ('decision', 'preference', 'pattern')
|
|
173
|
+
ORDER BY created_at DESC
|
|
174
|
+
`)
|
|
175
|
+
.all();
|
|
176
|
+
const pairs = [];
|
|
177
|
+
for (let i = 0; i < candidates.length; i++) {
|
|
178
|
+
const a = candidates[i];
|
|
179
|
+
const aPins = parsePinsSet(a.pins);
|
|
180
|
+
if (aPins.size === 0)
|
|
181
|
+
continue;
|
|
182
|
+
for (let j = i + 1; j < candidates.length; j++) {
|
|
183
|
+
const b = candidates[j];
|
|
184
|
+
// Skip pairs from the same SHA — those are co-recorded by the same
|
|
185
|
+
// remember call, not divergent beliefs.
|
|
186
|
+
if (a.valid_from_sha && a.valid_from_sha === b.valid_from_sha)
|
|
187
|
+
continue;
|
|
188
|
+
const bPins = parsePinsSet(b.pins);
|
|
189
|
+
const shared = [];
|
|
190
|
+
for (const pin of aPins) {
|
|
191
|
+
if (bPins.has(pin))
|
|
192
|
+
shared.push(pin);
|
|
193
|
+
}
|
|
194
|
+
if (shared.length === 0)
|
|
195
|
+
continue;
|
|
196
|
+
pairs.push({ a, b, sharedPins: shared });
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
pairs.sort((x, y) => {
|
|
200
|
+
const dShared = y.sharedPins.length - x.sharedPins.length;
|
|
201
|
+
if (dShared !== 0)
|
|
202
|
+
return dShared;
|
|
203
|
+
const olderX = Math.min(x.a.created_at, x.b.created_at);
|
|
204
|
+
const olderY = Math.min(y.a.created_at, y.b.created_at);
|
|
205
|
+
return olderX - olderY;
|
|
206
|
+
});
|
|
207
|
+
return pairs.slice(0, limit);
|
|
208
|
+
}
|
|
122
209
|
delete(id) {
|
|
123
210
|
const result = this.deleteStmt.run(id);
|
|
124
211
|
return result.changes > 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-store.js","sourceRoot":"","sources":["../../../src/storage/memory-store.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"memory-store.js","sourceRoot":"","sources":["../../../src/storage/memory-store.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sverklo",
|
|
3
3
|
"mcpName": "io.github.sverklo/sverklo",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.20.0",
|
|
5
5
|
"description": "Sverklo — local-first code intelligence MCP server. Diff-aware MR review, risk scoring, hybrid semantic search, PageRank ranking, persistent memory. Zero config.",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"bin": {
|