ralph-hero-knowledge-index 0.1.43 → 0.1.45

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ralph-knowledge",
3
- "version": "0.1.43",
3
+ "version": "0.1.45",
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.43"]
5
+ "args": ["-y", "ralph-hero-knowledge-index@0.1.45"]
6
6
  }
7
7
  }
8
8
  }
@@ -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-05-17T00:34:55.475Z
943
+ at 2026-05-19T02:12:26.778Z
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-05-17T00:34:55.475Z
388
+ at 2026-05-19T02:12:26.778Z
389
389
  </div>
390
390
  <script src="prettify.js"></script>
391
391
  <script>
@@ -1711,7 +1711,7 @@ export class KnowledgeDB {
1711
1711
  <div class='footer quiet pad2 space-top1 center small'>
1712
1712
  Code coverage generated by
1713
1713
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1714
- at 2026-05-17T00:34:55.475Z
1714
+ at 2026-05-19T02:12:26.778Z
1715
1715
  </div>
1716
1716
  <script src="prettify.js"></script>
1717
1717
  <script>
@@ -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-05-17T00:34:55.475Z
766
+ at 2026-05-19T02:12:26.778Z
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-05-17T00:34:55.475Z
202
+ at 2026-05-19T02:12:26.778Z
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-05-17T00:34:55.475Z
298
+ at 2026-05-19T02:12:26.778Z
299
299
  </div>
300
300
  <script src="prettify.js"></script>
301
301
  <script>
@@ -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" >"").l</span>ocaleCompare(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" >"").l</span>ocaleCompare(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-05-17T00:34:55.475Z
949
+ at 2026-05-19T02:12:26.778Z
950
950
  </div>
951
951
  <script src="prettify.js"></script>
952
952
  <script>
@@ -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-05-17T00:34:55.475Z
295
+ at 2026-05-19T02:12:26.778Z
296
296
  </div>
297
297
  <script src="prettify.js"></script>
298
298
  <script>
@@ -2386,12 +2386,12 @@ 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 }<span class="fstat-no" title="function not covered" ><span class="branch-1 cbranch-no" title="branch not covered" >)</span></span>
2390
2390
  : // No edges — each node is its own community, numbered by iteration order
2391
2391
  (() =&gt; {
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
- <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>
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>
2395
2395
  <span class="cstat-no" title="statement not covered" > return p;</span>
2396
2396
  })();
2397
2397
  &nbsp;
@@ -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-05-17T00:34:55.475Z
2824
+ at 2026-05-19T02:12:26.778Z
2825
2825
  </div>
2826
2826
  <script src="prettify.js"></script>
2827
2827
  <script>
@@ -1519,7 +1519,7 @@ export class HybridSearch {
1519
1519
  for (const c of candidates) {
1520
1520
  // When all scores are equal (range = 0) treat as full relevance for all
1521
1521
  // so the choice falls through to the diversity term.
1522
- scoreNorm.set(c.id, range &gt; 0 ? (c.score - minScore) / range : <span class="branch-1 cbranch-no" title="branch not covered" >1.0);</span>
1522
+ scoreNorm.set(c.id, range &gt; 0 ? (c.score - minScore) / range : <span class="branch-1 cbranch-no" title="branch not covered" >1.0)</span>;
1523
1523
  }
1524
1524
  &nbsp;
1525
1525
  // Pre-fetch embeddings for the candidate's best chunk. Doc-level vec ids
@@ -1606,7 +1606,7 @@ export class HybridSearch {
1606
1606
  <div class='footer quiet pad2 space-top1 center small'>
1607
1607
  Code coverage generated by
1608
1608
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1609
- at 2026-05-17T00:34:55.475Z
1609
+ at 2026-05-19T02:12:26.778Z
1610
1610
  </div>
1611
1611
  <script src="prettify.js"></script>
1612
1612
  <script>
@@ -316,7 +316,7 @@ export function loadIgnoreForRoot(
316
316
  <div class='footer quiet pad2 space-top1 center small'>
317
317
  Code coverage generated by
318
318
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
319
- at 2026-05-17T00:34:55.475Z
319
+ at 2026-05-19T02:12:26.778Z
320
320
  </div>
321
321
  <script src="prettify.js"></script>
322
322
  <script>
@@ -371,7 +371,7 @@
371
371
  <div class='footer quiet pad2 space-top1 center small'>
372
372
  Code coverage generated by
373
373
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
374
- at 2026-05-17T00:34:55.475Z
374
+ at 2026-05-19T02:12:26.778Z
375
375
  </div>
376
376
  <script src="prettify.js"></script>
377
377
  <script>
@@ -1547,7 +1547,7 @@ const DEFAULT_DB_PATH = join(homedir(), ".ralph-hero", "knowledge.db");
1547
1547
  function resolveEnv(name: string): string | undefined {
1548
1548
  const val = process.env[name];
1549
1549
  // Claude Code passes unexpanded ${VAR} literals for unset env vars in .mcp.json
1550
- <span class="missing-if-branch" title="else path not taken" >E</span>if (!val || <span class="branch-1 cbranch-no" title="branch not covered" >val.startsWith("${"))</span> return undefined;
1550
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (!val || <span class="branch-1 cbranch-no" title="branch not covered" >val.startsWith("${")) r</span>eturn undefined;
1551
1551
  <span class="cstat-no" title="statement not covered" > return val;</span>
1552
1552
  }
1553
1553
  &nbsp;
@@ -1705,7 +1705,7 @@ export function createServer(dbPath: string, opts: CreateServerOptions = {}) {
1705
1705
  <span class="fstat-no" title="function not covered" > write: (p</span>ath: string, <span class="cstat-no" title="statement not covered" >body: string) =&gt; writeFileSync(path, body, "utf-8"),</span>
1706
1706
  };
1707
1707
  const rememberReindexImpl = opts.rememberReindex ?? reindexPath;
1708
- const rememberNow = opts.<span class="fstat-no" title="function not covered" ><span class="branch-1 cbranch-no" title="branch not covered" >rememberNow ?? (() =&gt; <span class="cstat-no" title="statement not covered" >n</span>ew Date())</span></span>;
1708
+ const rememberNow = opts.<span class="fstat-no" title="function not covered" ><span class="branch-1 cbranch-no" title="branch not covered" >rememberNow ?? (() =&gt; <span class="cstat-no" title="statement not covered" >n</span>ew Date());</span></span>
1709
1709
  const rememberBaseDir = opts.rememberBaseDir
1710
1710
  ?? resolveEnv("RALPH_DREAM_MEMORIES_DIR")
1711
1711
  ?? join(homedir(), "projects", "thoughts", "dream-memories");
@@ -2045,7 +2045,7 @@ export function createServer(dbPath: string, opts: CreateServerOptions = {}) {
2045
2045
  return (tier ?? <span class="branch-1 cbranch-no" title="branch not covered" >"doc") === w</span>antedTier;
2046
2046
  });
2047
2047
  }
2048
- const formatted = formatTraverseResults(<span class="fstat-no" title="function not covered" >results, (i</span>d) =&gt; <span class="cstat-no" title="statement not covered" >db.getTags(id),</span> args.brief ?? false);
2048
+ const formatted = formatTraverseResults(<span class="fstat-no" title="function not covered" >results, (i</span>d) =&gt; <span class="cstat-no" title="statement not covered" >db.getTags(id), a</span>rgs.brief ?? false);
2049
2049
  return { content: [{ type: "text" as const, text: JSON.stringify(formatted, null, 2) }] };
2050
2050
  } catch (e) {
2051
2051
  <span class="cstat-no" title="statement not covered" > return { content: [{ type: "text" as const, text: `Error: ${(e as Error).message}` }], isError: true };</span>
@@ -2260,7 +2260,7 @@ server.connect(transport).catch(console.error);
2260
2260
  <div class='footer quiet pad2 space-top1 center small'>
2261
2261
  Code coverage generated by
2262
2262
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
2263
- at 2026-05-17T00:34:55.475Z
2263
+ at 2026-05-19T02:12:26.778Z
2264
2264
  </div>
2265
2265
  <script src="prettify.js"></script>
2266
2266
  <script>
@@ -436,7 +436,7 @@ export function createLlmClient(opts: LlmClientOptions = {}): LlmClient {
436
436
  &nbsp;
437
437
  async function contextualize(fullDocument: string, chunkContent: string): Promise&lt;string&gt; {
438
438
  const controller = new AbortController();
439
- const timer = <span class="fstat-no" title="function not covered" >setTimeout(() =&gt; <span class="cstat-no" title="statement not covered" >c</span>ontroller.abort(),</span> timeoutMs);
439
+ const timer = <span class="fstat-no" title="function not covered" >setTimeout(() =&gt; <span class="cstat-no" title="statement not covered" >c</span>ontroller.abort(), t</span>imeoutMs);
440
440
  try {
441
441
  const prompt = buildContextualizePrompt(fullDocument, chunkContent);
442
442
  const response = await fetch(`${baseUrl}/v1/chat/completions`, {
@@ -478,7 +478,7 @@ export function createLlmClient(opts: LlmClientOptions = {}): LlmClient {
478
478
  <div class='footer quiet pad2 space-top1 center small'>
479
479
  Code coverage generated by
480
480
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
481
- at 2026-05-17T00:34:55.475Z
481
+ at 2026-05-19T02:12:26.778Z
482
482
  </div>
483
483
  <script src="prettify.js"></script>
484
484
  <script>
@@ -490,7 +490,7 @@ export function extractUntypedWikilinks(
490
490
  &nbsp;
491
491
  export function parseDocument(id: string, path: string, raw: string): ParsedDocument {
492
492
  const fmMatch = raw.match(FRONTMATTER_RE);
493
- const frontmatter = fmMatch ? parseYaml(fmMatch[1]) ?? <span class="branch-1 cbranch-no" title="branch not covered" >{} </span>: <span class="branch-1 cbranch-no" title="branch not covered" >{};</span>
493
+ const frontmatter = fmMatch ? parseYaml(fmMatch[1]) ?? <span class="branch-1 cbranch-no" title="branch not covered" >{} : <span class="branch-1 cbranch-no" title="branch not covered" >{</span>};</span>
494
494
  const body = fmMatch ? raw.slice(fmMatch[0].length).trim() : <span class="branch-1 cbranch-no" title="branch not covered" >raw.trim();</span>
495
495
  const titleMatch = body.match(TITLE_RE);
496
496
  const title = titleMatch ? titleMatch[1].trim() : <span class="branch-1 cbranch-no" title="branch not covered" >id;</span>
@@ -565,7 +565,7 @@ export function parseDocument(id: string, path: string, raw: string): ParsedDocu
565
565
  <div class='footer quiet pad2 space-top1 center small'>
566
566
  Code coverage generated by
567
567
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
568
- at 2026-05-17T00:34:55.475Z
568
+ at 2026-05-19T02:12:26.778Z
569
569
  </div>
570
570
  <script src="prettify.js"></script>
571
571
  <script>
@@ -1693,7 +1693,7 @@ export async function reindex(
1693
1693
  .all(parsed.id) as Array&lt;{ chunk_index: number; context_prefix: string }&gt;;
1694
1694
  <span class="missing-if-branch" title="else path not taken" >E</span>if (priorChunks.length &gt; 0) {
1695
1695
  cachedPrefixes = new Map(
1696
- priorChunks.map(r =&gt; [r.chunk_index, r.context_prefix ?? <span class="branch-1 cbranch-no" title="branch not covered" >""] </span>as [number, string])
1696
+ priorChunks.map(r =&gt; [r.chunk_index, r.context_prefix ?? <span class="branch-1 cbranch-no" title="branch not covered" >""]</span> as [number, string])
1697
1697
  );
1698
1698
  }
1699
1699
  }
@@ -1718,7 +1718,7 @@ export async function reindex(
1718
1718
  // BEFORE buffering so the context prefix becomes part of `embedText`
1719
1719
  // and the existing `cachedPrefixes` fast-path is preserved.
1720
1720
  try {
1721
- const tagLine = parsed.tags.length &gt; 0 ? <span class="branch-0 cbranch-no" title="branch not covered" >parsed.tags.join(", ") </span>: "";
1721
+ const tagLine = parsed.tags.length &gt; 0 ? <span class="branch-0 cbranch-no" title="branch not covered" >parsed.tags.join(", ") : "</span>";
1722
1722
  const chunks: Chunk[] = parsed.content.length === 0
1723
1723
  ? <span class="branch-0 cbranch-no" title="branch not covered" >[{ index: 0, content: "", charStart: 0, charEnd: 0 }]</span>
1724
1724
  : chunkText(parsed.content);
@@ -1980,7 +1980,7 @@ export async function <span class="fstat-no" title="function not covered" >reind
1980
1980
  &nbsp;
1981
1981
  const texts = <span class="cstat-no" title="statement not covered" >chunks.<span class="fstat-no" title="function not covered" >map((c</span>) =&gt; {</span>
1982
1982
  const parts = <span class="cstat-no" title="statement not covered" >[parsed.title, tagLine, c.content];</span>
1983
- <span class="cstat-no" title="statement not covered" > return parts.<span class="fstat-no" title="function not covered" >filter((p</span>) =&gt; <span class="cstat-no" title="statement not covered" >p.length &gt; 0).</span>join("\n");</span>
1983
+ <span class="cstat-no" title="statement not covered" > return parts.<span class="fstat-no" title="function not covered" >filter((p</span>) =&gt; <span class="cstat-no" title="statement not covered" >p.length &gt; 0)</span>.join("\n");</span>
1984
1984
  });
1985
1985
  const embeddings = <span class="cstat-no" title="statement not covered" >await embedChunks(texts);</span>
1986
1986
  const insertChunk = <span class="cstat-no" title="statement not covered" >db.db.prepare(</span>
@@ -2032,7 +2032,7 @@ const isMain = process.argv[1]?.endsWith("reindex.js");
2032
2032
  <div class='footer quiet pad2 space-top1 center small'>
2033
2033
  Code coverage generated by
2034
2034
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
2035
- at 2026-05-17T00:34:55.475Z
2035
+ at 2026-05-19T02:12:26.778Z
2036
2036
  </div>
2037
2037
  <script src="prettify.js"></script>
2038
2038
  <script>
@@ -790,7 +790,7 @@ export class Reranker {
790
790
  <div class='footer quiet pad2 space-top1 center small'>
791
791
  Code coverage generated by
792
792
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
793
- at 2026-05-17T00:34:55.475Z
793
+ at 2026-05-19T02:12:26.778Z
794
794
  </div>
795
795
  <script src="prettify.js"></script>
796
796
  <script>
@@ -814,7 +814,7 @@ export class FtsSearch {
814
814
  <div class='footer quiet pad2 space-top1 center small'>
815
815
  Code coverage generated by
816
816
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
817
- at 2026-05-17T00:34:55.475Z
817
+ at 2026-05-19T02:12:26.778Z
818
818
  </div>
819
819
  <script src="prettify.js"></script>
820
820
  <script>
@@ -487,7 +487,7 @@ export class Traverser {
487
487
  <div class='footer quiet pad2 space-top1 center small'>
488
488
  Code coverage generated by
489
489
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
490
- at 2026-05-17T00:34:55.475Z
490
+ at 2026-05-19T02:12:26.778Z
491
491
  </div>
492
492
  <script src="prettify.js"></script>
493
493
  <script>
@@ -439,7 +439,7 @@ export class VectorSearch {
439
439
  <div class='footer quiet pad2 space-top1 center small'>
440
440
  Code coverage generated by
441
441
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
442
- at 2026-05-17T00:34:55.475Z
442
+ at 2026-05-19T02:12:26.778Z
443
443
  </div>
444
444
  <script src="prettify.js"></script>
445
445
  <script>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ralph-hero-knowledge-index",
3
- "version": "0.1.43",
3
+ "version": "0.1.45",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -23,9 +23,9 @@
23
23
  },
24
24
  "dependencies": {
25
25
  "@huggingface/transformers": "^3.0.0",
26
- "@modelcontextprotocol/sdk": "^1.26.0",
27
- "better-sqlite3": "^12.6.0",
28
- "graphology": "^0.25.4",
26
+ "@modelcontextprotocol/sdk": "^1.29.0",
27
+ "better-sqlite3": "^12.10.0",
28
+ "graphology": "^0.26.0",
29
29
  "graphology-communities-louvain": "^2.0.2",
30
30
  "graphology-components": "^1.5.4",
31
31
  "graphology-metrics": "^2.4.0",
@@ -35,15 +35,15 @@
35
35
  "graphology-traversal": "^0.3.1",
36
36
  "graphology-types": "^0.24.8",
37
37
  "ignore": "^7.0.5",
38
- "sqlite-vec": "^0.1.7-alpha.10",
39
- "yaml": "^2.8.4",
38
+ "sqlite-vec": "^0.1.9",
39
+ "yaml": "^2.9.0",
40
40
  "zod": "^3.25.0"
41
41
  },
42
42
  "devDependencies": {
43
43
  "@types/better-sqlite3": "^7.6.13",
44
- "@types/node": "^22.0.0",
45
- "@vitest/coverage-v8": "^4.1.5",
46
- "tsx": "^4.21.0",
44
+ "@types/node": "^25.9.0",
45
+ "@vitest/coverage-v8": "^4.1.6",
46
+ "tsx": "^4.22.2",
47
47
  "typescript": "^6.0.3",
48
48
  "vitest": "^4.0.0"
49
49
  }