ralph-hero-knowledge-index 0.1.52 → 0.1.55

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 (44) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/.mcp.json +1 -1
  3. package/README.md +1 -0
  4. package/coverage/coverage-summary.json +4 -3
  5. package/coverage/lcov-report/chunker.ts.html +4 -4
  6. package/coverage/lcov-report/config.ts.html +1 -1
  7. package/coverage/lcov-report/db.ts.html +23 -23
  8. package/coverage/lcov-report/embedder.ts.html +3 -3
  9. package/coverage/lcov-report/file-scanner.ts.html +1 -1
  10. package/coverage/lcov-report/format.ts.html +1 -1
  11. package/coverage/lcov-report/generate-indexes.ts.html +6 -6
  12. package/coverage/lcov-report/graph-builder.ts.html +2 -2
  13. package/coverage/lcov-report/graph-tools.ts.html +17 -17
  14. package/coverage/lcov-report/hybrid-search.ts.html +92 -92
  15. package/coverage/lcov-report/ignore.ts.html +3 -3
  16. package/coverage/lcov-report/index.html +41 -26
  17. package/coverage/lcov-report/index.ts.html +303 -42
  18. package/coverage/lcov-report/llm-client.ts.html +132 -18
  19. package/coverage/lcov-report/parser.ts.html +9 -9
  20. package/coverage/lcov-report/reindex.ts.html +10 -10
  21. package/coverage/lcov-report/reranker.ts.html +11 -11
  22. package/coverage/lcov-report/search.ts.html +24 -24
  23. package/coverage/lcov-report/think.ts.html +529 -0
  24. package/coverage/lcov-report/traverse.ts.html +2 -2
  25. package/coverage/lcov-report/vector-search.ts.html +16 -16
  26. package/coverage/lcov.info +932 -769
  27. package/dist/index.d.ts +5 -0
  28. package/dist/index.js +70 -0
  29. package/dist/index.js.map +1 -1
  30. package/dist/llm-client.d.ts +10 -0
  31. package/dist/llm-client.js +30 -1
  32. package/dist/llm-client.js.map +1 -1
  33. package/dist/think.d.ts +39 -0
  34. package/dist/think.js +121 -0
  35. package/dist/think.js.map +1 -0
  36. package/package.json +4 -4
  37. package/skills/curate/SKILL.md +2 -0
  38. package/skills/dream-loop/SKILL.md +55 -6
  39. package/src/__tests__/llm-client.test.ts +49 -0
  40. package/src/__tests__/think-tool.test.ts +204 -0
  41. package/src/__tests__/think.test.ts +100 -0
  42. package/src/index.ts +87 -0
  43. package/src/llm-client.ts +39 -1
  44. package/src/think.ts +148 -0
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ralph-knowledge",
3
- "version": "0.1.52",
3
+ "version": "0.1.55",
4
4
  "description": "Knowledge graph for ralph-hero: semantic search, relationship traversal, and document indexing across thoughts/ documents. Optional companion to ralph-hero.",
5
5
  "author": {
6
6
  "name": "Chad Dubiel",
package/.mcp.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "mcpServers": {
3
3
  "ralph-knowledge": {
4
4
  "command": "npx",
5
- "args": ["-y", "ralph-hero-knowledge-index@0.1.51"]
5
+ "args": ["-y", "ralph-hero-knowledge-index@0.1.53"]
6
6
  }
7
7
  }
8
8
  }
package/README.md CHANGED
@@ -121,6 +121,7 @@ hybrid search. They differ on **who decides the tier policy**:
121
121
  |------|-------------|---------------|
122
122
  | `knowledge_search` | Power-user / explicit path. You know the tier and want full control over `rerank`, `lambda`, `return_diagnostics`, chunk metadata, etc. | You pass `memory_tier` explicitly (`doc`, `raw`, `reflection`, `wiki`, or `any` — default `any`). |
123
123
  | `knowledge_recall` | Default for agents and skills. You declare your role and the tool picks the right tiers. | A role-keyed policy fans out one rerank-enabled `hybrid.search()` per tier in the role's list, then merges and re-ranks. |
124
+ | `knowledge_think` | You want a *synthesized, sourced answer* to a question, not a result list. Retrieves the top-K excerpts, then asks the local model for a **cited** answer + an explicit **gaps** report ("what the bank does NOT know"). Optional `role` biases the tier mix. | Fail-open: returns the retrieved sources even when the local model is offline. Borrowed from the `gbrain think` idiom (GH-1512). |
124
125
 
125
126
  ### Role -> tier policy
126
127
 
@@ -1,4 +1,4 @@
1
- {"total": {"lines":{"total":1532,"covered":1382,"skipped":0,"pct":90.2},"statements":{"total":1666,"covered":1489,"skipped":0,"pct":89.37},"functions":{"total":224,"covered":206,"skipped":0,"pct":91.96},"branches":{"total":957,"covered":782,"skipped":0,"pct":81.71},"branchesTrue":{"total":0,"covered":0,"skipped":0,"pct":"Unknown"}}
1
+ {"total": {"lines":{"total":1602,"covered":1448,"skipped":0,"pct":90.38},"statements":{"total":1745,"covered":1561,"skipped":0,"pct":89.45},"functions":{"total":234,"covered":214,"skipped":0,"pct":91.45},"branches":{"total":1021,"covered":827,"skipped":0,"pct":80.99},"branchesTrue":{"total":0,"covered":0,"skipped":0,"pct":"Unknown"}}
2
2
  ,"/home/runner/work/ralph-hero/ralph-hero/plugin/ralph-knowledge/src/chunker.ts": {"lines":{"total":91,"covered":85,"skipped":0,"pct":93.4},"functions":{"total":6,"covered":6,"skipped":0,"pct":100},"statements":{"total":94,"covered":88,"skipped":0,"pct":93.61},"branches":{"total":45,"covered":39,"skipped":0,"pct":86.66}}
3
3
  ,"/home/runner/work/ralph-hero/ralph-hero/plugin/ralph-knowledge/src/config.ts": {"lines":{"total":34,"covered":32,"skipped":0,"pct":94.11},"functions":{"total":5,"covered":5,"skipped":0,"pct":100},"statements":{"total":36,"covered":34,"skipped":0,"pct":94.44},"branches":{"total":31,"covered":31,"skipped":0,"pct":100}}
4
4
  ,"/home/runner/work/ralph-hero/ralph-hero/plugin/ralph-knowledge/src/db.ts": {"lines":{"total":134,"covered":130,"skipped":0,"pct":97.01},"functions":{"total":33,"covered":33,"skipped":0,"pct":100},"statements":{"total":140,"covered":135,"skipped":0,"pct":96.42},"branches":{"total":85,"covered":75,"skipped":0,"pct":88.23}}
@@ -10,12 +10,13 @@
10
10
  ,"/home/runner/work/ralph-hero/ralph-hero/plugin/ralph-knowledge/src/graph-tools.ts": {"lines":{"total":242,"covered":230,"skipped":0,"pct":95.04},"functions":{"total":34,"covered":32,"skipped":0,"pct":94.11},"statements":{"total":257,"covered":243,"skipped":0,"pct":94.55},"branches":{"total":151,"covered":120,"skipped":0,"pct":79.47}}
11
11
  ,"/home/runner/work/ralph-hero/ralph-hero/plugin/ralph-knowledge/src/hybrid-search.ts": {"lines":{"total":174,"covered":173,"skipped":0,"pct":99.42},"functions":{"total":19,"covered":19,"skipped":0,"pct":100},"statements":{"total":203,"covered":195,"skipped":0,"pct":96.05},"branches":{"total":129,"covered":110,"skipped":0,"pct":85.27}}
12
12
  ,"/home/runner/work/ralph-hero/ralph-hero/plugin/ralph-knowledge/src/ignore.ts": {"lines":{"total":17,"covered":16,"skipped":0,"pct":94.11},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":19,"covered":18,"skipped":0,"pct":94.73},"branches":{"total":12,"covered":11,"skipped":0,"pct":91.66}}
13
- ,"/home/runner/work/ralph-hero/ralph-hero/plugin/ralph-knowledge/src/index.ts": {"lines":{"total":200,"covered":178,"skipped":0,"pct":89},"functions":{"total":29,"covered":25,"skipped":0,"pct":86.2},"statements":{"total":219,"covered":193,"skipped":0,"pct":88.12},"branches":{"total":136,"covered":98,"skipped":0,"pct":72.05}}
14
- ,"/home/runner/work/ralph-hero/ralph-hero/plugin/ralph-knowledge/src/llm-client.ts": {"lines":{"total":31,"covered":31,"skipped":0,"pct":100},"functions":{"total":6,"covered":5,"skipped":0,"pct":83.33},"statements":{"total":33,"covered":32,"skipped":0,"pct":96.96},"branches":{"total":13,"covered":13,"skipped":0,"pct":100}}
13
+ ,"/home/runner/work/ralph-hero/ralph-hero/plugin/ralph-knowledge/src/index.ts": {"lines":{"total":224,"covered":199,"skipped":0,"pct":88.83},"functions":{"total":33,"covered":28,"skipped":0,"pct":84.84},"statements":{"total":244,"covered":215,"skipped":0,"pct":88.11},"branches":{"total":158,"covered":110,"skipped":0,"pct":69.62}}
14
+ ,"/home/runner/work/ralph-hero/ralph-hero/plugin/ralph-knowledge/src/llm-client.ts": {"lines":{"total":42,"covered":42,"skipped":0,"pct":100},"functions":{"total":8,"covered":6,"skipped":0,"pct":75},"statements":{"total":47,"covered":45,"skipped":0,"pct":95.74},"branches":{"total":20,"covered":20,"skipped":0,"pct":100}}
15
15
  ,"/home/runner/work/ralph-hero/ralph-hero/plugin/ralph-knowledge/src/parser.ts": {"lines":{"total":54,"covered":54,"skipped":0,"pct":100},"functions":{"total":6,"covered":6,"skipped":0,"pct":100},"statements":{"total":58,"covered":58,"skipped":0,"pct":100},"branches":{"total":46,"covered":41,"skipped":0,"pct":89.13}}
16
16
  ,"/home/runner/work/ralph-hero/ralph-hero/plugin/ralph-knowledge/src/reindex.ts": {"lines":{"total":247,"covered":159,"skipped":0,"pct":64.37},"functions":{"total":18,"covered":9,"skipped":0,"pct":50},"statements":{"total":264,"covered":166,"skipped":0,"pct":62.87},"branches":{"total":114,"covered":74,"skipped":0,"pct":64.91}}
17
17
  ,"/home/runner/work/ralph-hero/ralph-hero/plugin/ralph-knowledge/src/reranker.ts": {"lines":{"total":42,"covered":37,"skipped":0,"pct":88.09},"functions":{"total":7,"covered":6,"skipped":0,"pct":85.71},"statements":{"total":44,"covered":39,"skipped":0,"pct":88.63},"branches":{"total":22,"covered":18,"skipped":0,"pct":81.81}}
18
18
  ,"/home/runner/work/ralph-hero/ralph-hero/plugin/ralph-knowledge/src/search.ts": {"lines":{"total":40,"covered":40,"skipped":0,"pct":100},"functions":{"total":12,"covered":12,"skipped":0,"pct":100},"statements":{"total":47,"covered":46,"skipped":0,"pct":97.87},"branches":{"total":24,"covered":23,"skipped":0,"pct":95.83}}
19
+ ,"/home/runner/work/ralph-hero/ralph-hero/plugin/ralph-knowledge/src/think.ts": {"lines":{"total":35,"covered":34,"skipped":0,"pct":97.14},"functions":{"total":4,"covered":4,"skipped":0,"pct":100},"statements":{"total":40,"covered":37,"skipped":0,"pct":92.5},"branches":{"total":35,"covered":26,"skipped":0,"pct":74.28}}
19
20
  ,"/home/runner/work/ralph-hero/ralph-hero/plugin/ralph-knowledge/src/traverse.ts": {"lines":{"total":15,"covered":15,"skipped":0,"pct":100},"functions":{"total":5,"covered":5,"skipped":0,"pct":100},"statements":{"total":19,"covered":18,"skipped":0,"pct":94.73},"branches":{"total":16,"covered":12,"skipped":0,"pct":75}}
20
21
  ,"/home/runner/work/ralph-hero/ralph-hero/plugin/ralph-knowledge/src/vector-search.ts": {"lines":{"total":25,"covered":24,"skipped":0,"pct":96},"functions":{"total":10,"covered":9,"skipped":0,"pct":90},"statements":{"total":26,"covered":25,"skipped":0,"pct":96.15},"branches":{"total":5,"covered":5,"skipped":0,"pct":100}}
21
22
  }
@@ -379,9 +379,9 @@
379
379
  <span class="cline-any cline-neutral">&nbsp;</span>
380
380
  <span class="cline-any cline-neutral">&nbsp;</span>
381
381
  <span class="cline-any cline-neutral">&nbsp;</span>
382
- <span class="cline-any cline-yes">8x</span>
383
- <span class="cline-any cline-yes">8x</span>
384
- <span class="cline-any cline-yes">8x</span>
382
+ <span class="cline-any cline-yes">9x</span>
383
+ <span class="cline-any cline-yes">9x</span>
384
+ <span class="cline-any cline-yes">9x</span>
385
385
  <span class="cline-any cline-neutral">&nbsp;</span>
386
386
  <span class="cline-any cline-neutral">&nbsp;</span>
387
387
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -940,7 +940,7 @@ export function chunkText(text: string, opts: ChunkerOptions = {}): Chunk[] {
940
940
  <div class='footer quiet pad2 space-top1 center small'>
941
941
  Code coverage generated by
942
942
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
943
- at 2026-06-12T02:31:22.247Z
943
+ at 2026-07-26T13:32:06.309Z
944
944
  </div>
945
945
  <script src="prettify.js"></script>
946
946
  <script>
@@ -385,7 +385,7 @@ export function loadConfig(): KnowledgeConfig {
385
385
  <div class='footer quiet pad2 space-top1 center small'>
386
386
  Code coverage generated by
387
387
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
388
- at 2026-06-12T02:31:22.247Z
388
+ at 2026-07-26T13:32:06.309Z
389
389
  </div>
390
390
  <script src="prettify.js"></script>
391
391
  <script>
@@ -768,14 +768,14 @@
768
768
  <span class="cline-any cline-neutral">&nbsp;</span>
769
769
  <span class="cline-any cline-neutral">&nbsp;</span>
770
770
  <span class="cline-any cline-neutral">&nbsp;</span>
771
- <span class="cline-any cline-yes">399x</span>
772
- <span class="cline-any cline-yes">399x</span>
773
- <span class="cline-any cline-yes">399x</span>
774
- <span class="cline-any cline-yes">399x</span>
771
+ <span class="cline-any cline-yes">405x</span>
772
+ <span class="cline-any cline-yes">405x</span>
773
+ <span class="cline-any cline-yes">405x</span>
774
+ <span class="cline-any cline-yes">405x</span>
775
775
  <span class="cline-any cline-neutral">&nbsp;</span>
776
776
  <span class="cline-any cline-neutral">&nbsp;</span>
777
777
  <span class="cline-any cline-neutral">&nbsp;</span>
778
- <span class="cline-any cline-yes">399x</span>
778
+ <span class="cline-any cline-yes">405x</span>
779
779
  <span class="cline-any cline-neutral">&nbsp;</span>
780
780
  <span class="cline-any cline-neutral">&nbsp;</span>
781
781
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -852,8 +852,8 @@
852
852
  <span class="cline-any cline-neutral">&nbsp;</span>
853
853
  <span class="cline-any cline-neutral">&nbsp;</span>
854
854
  <span class="cline-any cline-neutral">&nbsp;</span>
855
- <span class="cline-any cline-yes">399x</span>
856
- <span class="cline-any cline-yes">399x</span>
855
+ <span class="cline-any cline-yes">405x</span>
856
+ <span class="cline-any cline-yes">405x</span>
857
857
  <span class="cline-any cline-neutral">&nbsp;</span>
858
858
  <span class="cline-any cline-neutral">&nbsp;</span>
859
859
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -862,14 +862,14 @@
862
862
  <span class="cline-any cline-neutral">&nbsp;</span>
863
863
  <span class="cline-any cline-neutral">&nbsp;</span>
864
864
  <span class="cline-any cline-neutral">&nbsp;</span>
865
- <span class="cline-any cline-yes">399x</span>
866
- <span class="cline-any cline-yes">399x</span>
865
+ <span class="cline-any cline-yes">405x</span>
866
+ <span class="cline-any cline-yes">405x</span>
867
867
  <span class="cline-any cline-neutral">&nbsp;</span>
868
868
  <span class="cline-any cline-neutral">&nbsp;</span>
869
869
  <span class="cline-any cline-neutral">&nbsp;</span>
870
870
  <span class="cline-any cline-neutral">&nbsp;</span>
871
871
  <span class="cline-any cline-neutral">&nbsp;</span>
872
- <span class="cline-any cline-yes">399x</span>
872
+ <span class="cline-any cline-yes">405x</span>
873
873
  <span class="cline-any cline-neutral">&nbsp;</span>
874
874
  <span class="cline-any cline-neutral">&nbsp;</span>
875
875
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -878,11 +878,11 @@
878
878
  <span class="cline-any cline-neutral">&nbsp;</span>
879
879
  <span class="cline-any cline-neutral">&nbsp;</span>
880
880
  <span class="cline-any cline-neutral">&nbsp;</span>
881
- <span class="cline-any cline-yes">399x</span>
882
- <span class="cline-any cline-yes">399x</span>
881
+ <span class="cline-any cline-yes">405x</span>
882
+ <span class="cline-any cline-yes">405x</span>
883
883
  <span class="cline-any cline-neutral">&nbsp;</span>
884
884
  <span class="cline-any cline-neutral">&nbsp;</span>
885
- <span class="cline-any cline-yes">399x</span>
885
+ <span class="cline-any cline-yes">405x</span>
886
886
  <span class="cline-any cline-yes">1x</span>
887
887
  <span class="cline-any cline-neutral">&nbsp;</span>
888
888
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -910,8 +910,8 @@
910
910
  <span class="cline-any cline-neutral">&nbsp;</span>
911
911
  <span class="cline-any cline-neutral">&nbsp;</span>
912
912
  <span class="cline-any cline-neutral">&nbsp;</span>
913
- <span class="cline-any cline-yes">399x</span>
914
- <span class="cline-any cline-yes">399x</span>
913
+ <span class="cline-any cline-yes">405x</span>
914
+ <span class="cline-any cline-yes">405x</span>
915
915
  <span class="cline-any cline-neutral">&nbsp;</span>
916
916
  <span class="cline-any cline-yes">2x</span>
917
917
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -938,11 +938,11 @@
938
938
  <span class="cline-any cline-neutral">&nbsp;</span>
939
939
  <span class="cline-any cline-neutral">&nbsp;</span>
940
940
  <span class="cline-any cline-neutral">&nbsp;</span>
941
- <span class="cline-any cline-yes">975x</span>
941
+ <span class="cline-any cline-yes">983x</span>
942
942
  <span class="cline-any cline-neutral">&nbsp;</span>
943
943
  <span class="cline-any cline-neutral">&nbsp;</span>
944
944
  <span class="cline-any cline-neutral">&nbsp;</span>
945
- <span class="cline-any cline-yes">975x</span>
945
+ <span class="cline-any cline-yes">983x</span>
946
946
  <span class="cline-any cline-neutral">&nbsp;</span>
947
947
  <span class="cline-any cline-neutral">&nbsp;</span>
948
948
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -964,7 +964,7 @@
964
964
  <span class="cline-any cline-neutral">&nbsp;</span>
965
965
  <span class="cline-any cline-neutral">&nbsp;</span>
966
966
  <span class="cline-any cline-neutral">&nbsp;</span>
967
- <span class="cline-any cline-yes">216x</span>
967
+ <span class="cline-any cline-yes">224x</span>
968
968
  <span class="cline-any cline-neutral">&nbsp;</span>
969
969
  <span class="cline-any cline-neutral">&nbsp;</span>
970
970
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1258,14 +1258,14 @@
1258
1258
  <span class="cline-any cline-neutral">&nbsp;</span>
1259
1259
  <span class="cline-any cline-neutral">&nbsp;</span>
1260
1260
  <span class="cline-any cline-neutral">&nbsp;</span>
1261
- <span class="cline-any cline-yes">84x</span>
1261
+ <span class="cline-any cline-yes">100x</span>
1262
1262
  <span class="cline-any cline-neutral">&nbsp;</span>
1263
1263
  <span class="cline-any cline-neutral">&nbsp;</span>
1264
- <span class="cline-any cline-yes">840x</span>
1265
- <span class="cline-any cline-yes">84x</span>
1264
+ <span class="cline-any cline-yes">1000x</span>
1265
+ <span class="cline-any cline-yes">100x</span>
1266
1266
  <span class="cline-any cline-neutral">&nbsp;</span>
1267
1267
  <span class="cline-any cline-neutral">&nbsp;</span>
1268
- <span class="cline-any cline-yes">84x</span>
1268
+ <span class="cline-any cline-yes">100x</span>
1269
1269
  <span class="cline-any cline-neutral">&nbsp;</span>
1270
1270
  <span class="cline-any cline-neutral">&nbsp;</span>
1271
1271
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1897,7 +1897,7 @@ export class KnowledgeDB {
1897
1897
  <div class='footer quiet pad2 space-top1 center small'>
1898
1898
  Code coverage generated by
1899
1899
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1900
- at 2026-06-12T02:31:22.247Z
1900
+ at 2026-07-26T13:32:06.309Z
1901
1901
  </div>
1902
1902
  <script src="prettify.js"></script>
1903
1903
  <script>
@@ -301,9 +301,9 @@
301
301
  <span class="cline-any cline-neutral">&nbsp;</span>
302
302
  <span class="cline-any cline-neutral">&nbsp;</span>
303
303
  <span class="cline-any cline-neutral">&nbsp;</span>
304
- <span class="cline-any cline-yes">6x</span>
304
+ <span class="cline-any cline-yes">7x</span>
305
305
  <span class="cline-any cline-neutral">&nbsp;</span>
306
- <span class="cline-any cline-yes">6x</span>
306
+ <span class="cline-any cline-yes">7x</span>
307
307
  <span class="cline-any cline-neutral">&nbsp;</span>
308
308
  <span class="cline-any cline-neutral">&nbsp;</span>
309
309
  <span class="cline-any cline-yes">75x</span>
@@ -763,7 +763,7 @@ export function prepareTextForEmbedding(
763
763
  <div class='footer quiet pad2 space-top1 center small'>
764
764
  Code coverage generated by
765
765
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
766
- at 2026-06-12T02:31:22.247Z
766
+ at 2026-07-26T13:32:06.309Z
767
767
  </div>
768
768
  <script src="prettify.js"></script>
769
769
  <script>
@@ -199,7 +199,7 @@ export function findMarkdownFiles(dir: string, matcher?: IgnoreMatcher): string[
199
199
  <div class='footer quiet pad2 space-top1 center small'>
200
200
  Code coverage generated by
201
201
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
202
- at 2026-06-12T02:31:22.247Z
202
+ at 2026-07-26T13:32:06.309Z
203
203
  </div>
204
204
  <script src="prettify.js"></script>
205
205
  <script>
@@ -295,7 +295,7 @@ export function formatTraverseResults(
295
295
  <div class='footer quiet pad2 space-top1 center small'>
296
296
  Code coverage generated by
297
297
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
298
- at 2026-06-12T02:31:22.247Z
298
+ at 2026-07-26T13:32:06.309Z
299
299
  </div>
300
300
  <script src="prettify.js"></script>
301
301
  <script>
@@ -409,7 +409,7 @@
409
409
  <span class="cline-any cline-yes">34x</span>
410
410
  <span class="cline-any cline-neutral">&nbsp;</span>
411
411
  <span class="cline-any cline-neutral">&nbsp;</span>
412
- <span class="cline-any cline-yes">6x</span>
412
+ <span class="cline-any cline-yes">7x</span>
413
413
  <span class="cline-any cline-neutral">&nbsp;</span>
414
414
  <span class="cline-any cline-neutral">&nbsp;</span>
415
415
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -496,7 +496,7 @@
496
496
  <span class="cline-any cline-neutral">&nbsp;</span>
497
497
  <span class="cline-any cline-neutral">&nbsp;</span>
498
498
  <span class="cline-any cline-neutral">&nbsp;</span>
499
- <span class="cline-any cline-yes">6x</span>
499
+ <span class="cline-any cline-yes">7x</span>
500
500
  <span class="cline-any cline-neutral">&nbsp;</span>
501
501
  <span class="cline-any cline-neutral">&nbsp;</span>
502
502
  <span class="cline-any cline-yes">34x</span>
@@ -622,7 +622,7 @@
622
622
  <span class="cline-any cline-yes">6x</span>
623
623
  <span class="cline-any cline-neutral">&nbsp;</span>
624
624
  <span class="cline-any cline-neutral">&nbsp;</span>
625
- <span class="cline-any cline-yes">6x</span>
625
+ <span class="cline-any cline-yes">7x</span>
626
626
  <span class="cline-any cline-neutral">&nbsp;</span>
627
627
  <span class="cline-any cline-neutral">&nbsp;</span>
628
628
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -670,7 +670,7 @@ export function writeTypeIndex(
670
670
  const superseded = docs.filter((d) =&gt; d.status === "superseded");
671
671
  &nbsp;
672
672
  const sortByDate = (a: ParsedDocument, b: ParsedDocument) =&gt;
673
- (b.date ?? <span class="branch-1 cbranch-no" title="branch not covered" >"").l</span>ocaleCompare(a.date ?? <span class="branch-1 cbranch-no" title="branch not covered" >"")</span>;
673
+ (b.date ?? <span class="branch-1 cbranch-no" title="branch not covered" >"")</span>.localeCompare(a.date ?? <span class="branch-1 cbranch-no" title="branch not covered" >"")</span>;
674
674
  active.sort(sortByDate);
675
675
  superseded.sort(sortByDate);
676
676
  &nbsp;
@@ -791,7 +791,7 @@ export function writeIssueHubs(outDir: string, allDocs: ParsedDocument[]): void
791
791
  const RECENT_LIMIT = 20;
792
792
  &nbsp;
793
793
  export function writeMasterIndex(outDir: string, allDocs: ParsedDocument[], hasUncategorized = false): void {
794
- const sorted = [...allDocs].sort((a, b) =&gt; (b.date ?? <span class="branch-1 cbranch-no" title="branch not covered" >"").l</span>ocaleCompare(a.date ?? <span class="branch-1 cbranch-no" title="branch not covered" >"")</span>);
794
+ const sorted = [...allDocs].sort((a, b) =&gt; (b.date ?? <span class="branch-1 cbranch-no" title="branch not covered" >"")</span>.localeCompare(a.date ?? <span class="branch-1 cbranch-no" title="branch not covered" >"")</span>);
795
795
  const recent = sorted.slice(0, RECENT_LIMIT);
796
796
  &nbsp;
797
797
  const lines: string[] = [
@@ -946,7 +946,7 @@ export function generateIndexes(outDir: string, allDocs: ParsedDocument[]): void
946
946
  <div class='footer quiet pad2 space-top1 center small'>
947
947
  Code coverage generated by
948
948
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
949
- at 2026-06-12T02:31:22.247Z
949
+ at 2026-07-26T13:32:06.309Z
950
950
  </div>
951
951
  <script src="prettify.js"></script>
952
952
  <script>
@@ -141,7 +141,7 @@
141
141
  <span class="cline-any cline-neutral">&nbsp;</span>
142
142
  <span class="cline-any cline-neutral">&nbsp;</span>
143
143
  <span class="cline-any cline-neutral">&nbsp;</span>
144
- <span class="cline-any cline-yes">7x</span>
144
+ <span class="cline-any cline-yes">8x</span>
145
145
  <span class="cline-any cline-neutral">&nbsp;</span>
146
146
  <span class="cline-any cline-neutral">&nbsp;</span>
147
147
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -292,7 +292,7 @@ export class GraphBuilder {
292
292
  <div class='footer quiet pad2 space-top1 center small'>
293
293
  Code coverage generated by
294
294
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
295
- at 2026-06-12T02:31:22.247Z
295
+ at 2026-07-26T13:32:06.309Z
296
296
  </div>
297
297
  <script src="prettify.js"></script>
298
298
  <script>
@@ -991,11 +991,11 @@
991
991
  <span class="cline-any cline-neutral">&nbsp;</span>
992
992
  <span class="cline-any cline-neutral">&nbsp;</span>
993
993
  <span class="cline-any cline-neutral">&nbsp;</span>
994
- <span class="cline-any cline-yes">6x</span>
994
+ <span class="cline-any cline-yes">7x</span>
995
995
  <span class="cline-any cline-neutral">&nbsp;</span>
996
- <span class="cline-any cline-yes">6x</span>
996
+ <span class="cline-any cline-yes">7x</span>
997
997
  <span class="cline-any cline-neutral">&nbsp;</span>
998
- <span class="cline-any cline-yes">6x</span>
998
+ <span class="cline-any cline-yes">7x</span>
999
999
  <span class="cline-any cline-neutral">&nbsp;</span>
1000
1000
  <span class="cline-any cline-neutral">&nbsp;</span>
1001
1001
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1015,7 +1015,7 @@
1015
1015
  <span class="cline-any cline-neutral">&nbsp;</span>
1016
1016
  <span class="cline-any cline-neutral">&nbsp;</span>
1017
1017
  <span class="cline-any cline-neutral">&nbsp;</span>
1018
- <span class="cline-any cline-yes">6x</span>
1018
+ <span class="cline-any cline-yes">7x</span>
1019
1019
  <span class="cline-any cline-neutral">&nbsp;</span>
1020
1020
  <span class="cline-any cline-neutral">&nbsp;</span>
1021
1021
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1031,7 +1031,7 @@
1031
1031
  <span class="cline-any cline-neutral">&nbsp;</span>
1032
1032
  <span class="cline-any cline-neutral">&nbsp;</span>
1033
1033
  <span class="cline-any cline-neutral">&nbsp;</span>
1034
- <span class="cline-any cline-yes">6x</span>
1034
+ <span class="cline-any cline-yes">7x</span>
1035
1035
  <span class="cline-any cline-neutral">&nbsp;</span>
1036
1036
  <span class="cline-any cline-neutral">&nbsp;</span>
1037
1037
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1046,7 +1046,7 @@
1046
1046
  <span class="cline-any cline-neutral">&nbsp;</span>
1047
1047
  <span class="cline-any cline-neutral">&nbsp;</span>
1048
1048
  <span class="cline-any cline-neutral">&nbsp;</span>
1049
- <span class="cline-any cline-yes">6x</span>
1049
+ <span class="cline-any cline-yes">7x</span>
1050
1050
  <span class="cline-any cline-neutral">&nbsp;</span>
1051
1051
  <span class="cline-any cline-neutral">&nbsp;</span>
1052
1052
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1054,7 +1054,7 @@
1054
1054
  <span class="cline-any cline-neutral">&nbsp;</span>
1055
1055
  <span class="cline-any cline-neutral">&nbsp;</span>
1056
1056
  <span class="cline-any cline-neutral">&nbsp;</span>
1057
- <span class="cline-any cline-yes">6x</span>
1057
+ <span class="cline-any cline-yes">7x</span>
1058
1058
  <span class="cline-any cline-neutral">&nbsp;</span>
1059
1059
  <span class="cline-any cline-neutral">&nbsp;</span>
1060
1060
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1155,7 +1155,7 @@
1155
1155
  <span class="cline-any cline-neutral">&nbsp;</span>
1156
1156
  <span class="cline-any cline-neutral">&nbsp;</span>
1157
1157
  <span class="cline-any cline-neutral">&nbsp;</span>
1158
- <span class="cline-any cline-yes">123x</span>
1158
+ <span class="cline-any cline-yes">129x</span>
1159
1159
  <span class="cline-any cline-neutral">&nbsp;</span>
1160
1160
  <span class="cline-any cline-neutral">&nbsp;</span>
1161
1161
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1305,7 +1305,7 @@
1305
1305
  <span class="cline-any cline-neutral">&nbsp;</span>
1306
1306
  <span class="cline-any cline-neutral">&nbsp;</span>
1307
1307
  <span class="cline-any cline-neutral">&nbsp;</span>
1308
- <span class="cline-any cline-yes">123x</span>
1308
+ <span class="cline-any cline-yes">129x</span>
1309
1309
  <span class="cline-any cline-neutral">&nbsp;</span>
1310
1310
  <span class="cline-any cline-neutral">&nbsp;</span>
1311
1311
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1431,7 +1431,7 @@
1431
1431
  <span class="cline-any cline-neutral">&nbsp;</span>
1432
1432
  <span class="cline-any cline-neutral">&nbsp;</span>
1433
1433
  <span class="cline-any cline-neutral">&nbsp;</span>
1434
- <span class="cline-any cline-yes">123x</span>
1434
+ <span class="cline-any cline-yes">129x</span>
1435
1435
  <span class="cline-any cline-neutral">&nbsp;</span>
1436
1436
  <span class="cline-any cline-neutral">&nbsp;</span>
1437
1437
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1547,7 +1547,7 @@
1547
1547
  <span class="cline-any cline-neutral">&nbsp;</span>
1548
1548
  <span class="cline-any cline-neutral">&nbsp;</span>
1549
1549
  <span class="cline-any cline-neutral">&nbsp;</span>
1550
- <span class="cline-any cline-yes">123x</span>
1550
+ <span class="cline-any cline-yes">129x</span>
1551
1551
  <span class="cline-any cline-neutral">&nbsp;</span>
1552
1552
  <span class="cline-any cline-neutral">&nbsp;</span>
1553
1553
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1616,7 +1616,7 @@
1616
1616
  <span class="cline-any cline-neutral">&nbsp;</span>
1617
1617
  <span class="cline-any cline-neutral">&nbsp;</span>
1618
1618
  <span class="cline-any cline-neutral">&nbsp;</span>
1619
- <span class="cline-any cline-yes">123x</span>
1619
+ <span class="cline-any cline-yes">129x</span>
1620
1620
  <span class="cline-any cline-neutral">&nbsp;</span>
1621
1621
  <span class="cline-any cline-neutral">&nbsp;</span>
1622
1622
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1701,7 +1701,7 @@
1701
1701
  <span class="cline-any cline-neutral">&nbsp;</span>
1702
1702
  <span class="cline-any cline-neutral">&nbsp;</span>
1703
1703
  <span class="cline-any cline-neutral">&nbsp;</span>
1704
- <span class="cline-any cline-yes">123x</span>
1704
+ <span class="cline-any cline-yes">129x</span>
1705
1705
  <span class="cline-any cline-neutral">&nbsp;</span>
1706
1706
  <span class="cline-any cline-neutral">&nbsp;</span>
1707
1707
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1777,7 +1777,7 @@
1777
1777
  <span class="cline-any cline-neutral">&nbsp;</span>
1778
1778
  <span class="cline-any cline-neutral">&nbsp;</span>
1779
1779
  <span class="cline-any cline-neutral">&nbsp;</span>
1780
- <span class="cline-any cline-yes">123x</span>
1780
+ <span class="cline-any cline-yes">129x</span>
1781
1781
  <span class="cline-any cline-neutral">&nbsp;</span>
1782
1782
  <span class="cline-any cline-neutral">&nbsp;</span>
1783
1783
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -2386,9 +2386,9 @@ export function registerGraphTools(server: McpServer, db: KnowledgeDB): void {
2386
2386
  // Run Louvain to partition, then extract the community subgraph
2387
2387
  const partition: Record&lt;string, number&gt; =
2388
2388
  graph.size &gt; 0
2389
- ? louvain(graph, { rng: () =&gt; 0.5 }<span class="fstat-no" title="function not covered" ><span class="branch-1 cbranch-no" title="branch not covered" >)</span></span>
2389
+ ? louvain(graph, { rng: () =&gt; 0.5 })
2390
2390
  : // No edges — each node is its own community, numbered by iteration order
2391
- (() =&gt; {
2391
+ (() =&gt; <span class="fstat-no" title="function not covered" ><span class="branch-1 cbranch-no" title="branch not covered" >{</span></span>
2392
2392
  const p: Record&lt;string, number&gt; = <span class="cstat-no" title="statement not covered" >{};</span>
2393
2393
  let idx = <span class="cstat-no" title="statement not covered" >0;</span>
2394
2394
  <span class="cstat-no" title="statement not covered" > graph.<span class="fstat-no" title="function not covered" >forEachNode((n</span>) =&gt; { <span class="cstat-no" title="statement not covered" >p[n] = idx++; }</span>);</span>
@@ -2821,7 +2821,7 @@ export function registerGraphTools(server: McpServer, db: KnowledgeDB): void {
2821
2821
  <div class='footer quiet pad2 space-top1 center small'>
2822
2822
  Code coverage generated by
2823
2823
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
2824
- at 2026-06-12T02:31:22.247Z
2824
+ at 2026-07-26T13:32:06.309Z
2825
2825
  </div>
2826
2826
  <script src="prettify.js"></script>
2827
2827
  <script>