Home / Function/ precacheForDirectory() — mcp Function Reference

precacheForDirectory() — mcp Function Reference

Architecture documentation for the precacheForDirectory() function in graph-cache.ts from the mcp codebase.

Entity Profile

Dependency Diagram

graph TD
  966fdd0a_509a_01b0_865e_32cfde84f964["precacheForDirectory()"]
  08ca54b2_22bc_134f_e028_7c18da8dca8a["start()"]
  08ca54b2_22bc_134f_e028_7c18da8dca8a -->|calls| 966fdd0a_509a_01b0_865e_32cfde84f964
  b0309b0d_ce6c_f9db_7d04_57a3e85e30fc["detectRepo()"]
  966fdd0a_509a_01b0_865e_32cfde84f964 -->|calls| b0309b0d_ce6c_f9db_7d04_57a3e85e30fc
  b8971bfc_ba3c_23a9_1f17_5d613ac67105["debug()"]
  966fdd0a_509a_01b0_865e_32cfde84f964 -->|calls| b8971bfc_ba3c_23a9_1f17_5d613ac67105
  22da2ab2_e145_3482_5780_396d4475bdc6["info()"]
  966fdd0a_509a_01b0_865e_32cfde84f964 -->|calls| 22da2ab2_e145_3482_5780_396d4475bdc6
  70a922d5_c50e_1a3c_392a_6e3254c9dff1["generateIdempotencyKey()"]
  966fdd0a_509a_01b0_865e_32cfde84f964 -->|calls| 70a922d5_c50e_1a3c_392a_6e3254c9dff1
  bdea66c6_0db3_43e0_a427_aa1942e42baa["detectRepoName()"]
  966fdd0a_509a_01b0_865e_32cfde84f964 -->|calls| bdea66c6_0db3_43e0_a427_aa1942e42baa
  52a097f2_598d_df67_e422_55b20a202d95["zipRepository()"]
  966fdd0a_509a_01b0_865e_32cfde84f964 -->|calls| 52a097f2_598d_df67_e422_55b20a202d95
  2f679171_fd3f_3cd5_48b2_587cc9ec01fd["buildIndexes()"]
  966fdd0a_509a_01b0_865e_32cfde84f964 -->|calls| 2f679171_fd3f_3cd5_48b2_587cc9ec01fd
  b965d3cf_dacd_81fc_77e7_dbe9bdef8bbc["set()"]
  966fdd0a_509a_01b0_865e_32cfde84f964 -->|calls| b965d3cf_dacd_81fc_77e7_dbe9bdef8bbc
  c652ed9f_2901_0635_2a5b_fc305e9cd6c1["has()"]
  966fdd0a_509a_01b0_865e_32cfde84f964 -->|calls| c652ed9f_2901_0635_2a5b_fc305e9cd6c1
  f6ef4bf8_5f3b_59ae_5ea0_00f1b9b2468e["saveCacheToDisk()"]
  966fdd0a_509a_01b0_865e_32cfde84f964 -->|calls| f6ef4bf8_5f3b_59ae_5ea0_00f1b9b2468e
  dfe11f52_4dd3_db89_9717_941d05bae091["warn()"]
  966fdd0a_509a_01b0_865e_32cfde84f964 -->|calls| dfe11f52_4dd3_db89_9717_941d05bae091
  style 966fdd0a_509a_01b0_865e_32cfde84f964 fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

src/cache/graph-cache.ts lines 644–705

export async function precacheForDirectory(
  client: ClientContext,
  directory: string,
  cacheDir: string | undefined
): Promise<void> {
  // Already cached?
  if (detectRepo(directory, _repoMap)) {
    logger.debug('Graph already cached for', directory);
    return;
  }

  logger.info('Pre-computing graph for', directory, '(first run for this repo; subsequent runs will be instant)...');

  const idempotencyKey = generateIdempotencyKey(directory);
  const repoName = detectRepoName(directory);

  const zipResult = await zipRepository(directory);
  let progressInterval: NodeJS.Timeout | null = null;
  let elapsed = 0;
  progressInterval = setInterval(() => {
    elapsed += 15;
    logger.info(`Analysis in progress... (${elapsed}s elapsed)`);
  }, 15000);

  try {
    const fileBuffer = await fs.readFile(zipResult.path);
    const fileBlob = new Blob([fileBuffer], { type: 'application/zip' });

    const response = await client.graphs.generateSupermodelGraph(
      fileBlob as any,
      { idempotencyKey }
    );

    const graph = buildIndexes(response, `precache:${repoName}`);

    // Update in-memory caches
    graphCache.set(idempotencyKey, graph);
    _repoMap.set(repoName.toLowerCase(), graph);
    const parts = repoName.toLowerCase().split(/[_\-\/]/);
    for (const part of parts) {
      if (part && part.length > 2 && !_repoMap.has(part)) {
        _repoMap.set(part, graph);
      }
    }

    // Persist to disk for cross-container reuse
    if (cacheDir) {
      try {
        const savedPath = await saveCacheToDisk(cacheDir, repoName, response);
        logger.info('Saved graph to:', savedPath);
      } catch (err: any) {
        // Non-fatal: cache dir might be read-only or full
        logger.warn('Failed to persist graph to disk:', err.message);
      }
    }

    logger.info(`Pre-compute complete: ${graph.summary.nodeCount} nodes, ${graph.summary.relationshipCount} relationships`);
  } finally {
    if (progressInterval) clearInterval(progressInterval);
    await zipResult.cleanup();
  }
}

Domain

Subdomains

Called By

Frequently Asked Questions

What does precacheForDirectory() do?
precacheForDirectory() is a function in the mcp codebase.
What does precacheForDirectory() call?
precacheForDirectory() calls 11 function(s): buildIndexes, debug, detectRepo, detectRepoName, generateIdempotencyKey, has, info, saveCacheToDisk, and 3 more.
What calls precacheForDirectory()?
precacheForDirectory() is called by 1 function(s): start.

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free