From 2538b8bb3c57839e67cbd2c219ccc51d70a962d8 Mon Sep 17 00:00:00 2001 From: Michael Aichler Date: Mon, 19 Jan 2026 07:44:25 +0100 Subject: [PATCH 1/2] perf(embed): lazy-load node-llama-cpp module --- src/llm/embed.ts | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/llm/embed.ts b/src/llm/embed.ts index 4458452..58ee67a 100644 --- a/src/llm/embed.ts +++ b/src/llm/embed.ts @@ -1,4 +1,4 @@ -import { getLlama, resolveModelFile, LlamaLogLevel, type Llama, type LlamaModel, type LlamaEmbeddingContext } from "node-llama-cpp"; +import type { Llama, LlamaModel, LlamaEmbeddingContext } from "node-llama-cpp"; import { homedir } from "node:os"; import { join } from "node:path"; import { existsSync, mkdirSync } from "node:fs"; @@ -6,6 +6,15 @@ import { existsSync, mkdirSync } from "node:fs"; const DEFAULT_EMBED_MODEL = "hf:ggml-org/embeddinggemma-300M-GGUF/embeddinggemma-300M-Q8_0.gguf"; const MODEL_CACHE_DIR = join(homedir(), ".cache", "librarian", "models"); +let nodeLlamaCpp: typeof import("node-llama-cpp") | null = null; + +async function getNodeLlamaCpp() { + if (!nodeLlamaCpp) { + nodeLlamaCpp = await import("node-llama-cpp"); + } + return nodeLlamaCpp; +} + let llamaInstance: Llama | null = null; let embedModel: LlamaModel | null = null; let embedContext: LlamaEmbeddingContext | null = null; @@ -34,6 +43,7 @@ export async function ensureEmbeddingModel(uri?: string): Promise { export async function resolveEmbeddingModel(uri: string, download: "auto" | false = "auto"): Promise { ensureModelCacheDir(); + const { resolveModelFile } = await getNodeLlamaCpp(); return resolveModelFile(uri, { directory: MODEL_CACHE_DIR, download, headers: getModelHeaders() }); } @@ -90,6 +100,7 @@ async function ensureEmbedContext(uri: string): Promise { async function ensureEmbedModel(uri: string): Promise { if (embedModel) return embedModel; const llama = await ensureLlama(); + const { resolveModelFile } = await getNodeLlamaCpp(); const modelPath = await resolveModelFile(uri, MODEL_CACHE_DIR); embedModel = await llama.loadModel({ modelPath }); return embedModel; @@ -97,9 +108,10 @@ async function ensureEmbedModel(uri: string): Promise { async function ensureLlama(): Promise { if (!llamaInstance) { + const { getLlama, LlamaLogLevel } = await getNodeLlamaCpp(); llamaInstance = await getLlama({ logLevel: LlamaLogLevel.error }); } - return llamaInstance; + return llamaInstance!; } function ensureModelCacheDir(): void { From cc9d6875f3614ff020151c08035af1edb4e7dd93 Mon Sep 17 00:00:00 2001 From: Michael Aichler Date: Mon, 19 Jan 2026 07:44:39 +0100 Subject: [PATCH 2/2] perf(cli): lazy-load command handlers for faster startup --- src/cli.ts | 85 ++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 54 insertions(+), 31 deletions(-) diff --git a/src/cli.ts b/src/cli.ts index 35f6822..dc9c82f 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -1,19 +1,5 @@ #!/usr/bin/env bun -import { createStore } from "./store/db"; import { printHelp } from "./cli/help"; -import { cmdInit, cmdSetup, cmdOnboard } from "./cli/setup"; -import { cmdStatus, cmdCleanup } from "./cli/status"; -import { cmdGet } from "./cli/get"; -import { cmdSearch, cmdVSearch, cmdQuery } from "./cli/search"; -import { cmdEmbed } from "./cli/embed"; -import { cmdDetect } from "./cli/detect"; -import { cmdSource, cmdAdd } from "./cli/source"; -import { cmdIngest } from "./cli/ingest"; -import { cmdLibrary } from "./cli/library"; -import { cmdDb } from "./cli/db"; -import { cmdReset } from "./cli/reset"; -import { cmdSeed } from "./cli/seed"; -import { runMcpServer } from "./mcp"; import { cmdUpdate, cmdVersion, maybeCheckForUpdate } from "./cli/self-update"; const argv = process.argv.slice(2); @@ -32,8 +18,10 @@ if (command === "--version" || command === "-v") { } if (command === "mcp") { + const { runMcpServer } = await import("./mcp"); await runMcpServer(); } else if (command === "reset") { + const { cmdReset } = await import("./cli/reset"); await cmdReset(argv.slice(1)); } else if (command === "version") { cmdVersion(); @@ -41,60 +29,95 @@ if (command === "mcp") { await cmdUpdate(); } else { await maybeCheckForUpdate(command, argv.slice(1)); + const { createStore } = await import("./store/db"); const store = await createStore(); try { switch (command) { - case "init": + case "init": { + const { cmdInit } = await import("./cli/setup"); cmdInit(); break; - case "setup": + } + case "setup": { + const { cmdSetup } = await import("./cli/setup"); await cmdSetup(argv.slice(1), store); break; - case "onboard": + } + case "onboard": { + const { cmdOnboard } = await import("./cli/setup"); await cmdOnboard(argv.slice(1), store); break; - case "source": + } + case "source": { + const { cmdSource } = await import("./cli/source"); await cmdSource(store, argv.slice(1)); break; - case "add": + } + case "add": { + const { cmdAdd } = await import("./cli/source"); await cmdAdd(store, argv.slice(1)); break; - case "ingest": + } + case "ingest": { + const { cmdIngest } = await import("./cli/ingest"); await cmdIngest(store, argv.slice(1)); break; - case "detect": + } + case "detect": { + const { cmdDetect } = await import("./cli/detect"); await cmdDetect(argv.slice(1)); break; - case "embed": + } + case "embed": { + const { cmdEmbed } = await import("./cli/embed"); await cmdEmbed(store, argv.slice(1)); break; - case "search": + } + case "search": { + const { cmdSearch } = await import("./cli/search"); await cmdSearch(store, argv.slice(1)); break; - case "library": + } + case "library": { + const { cmdLibrary } = await import("./cli/library"); await cmdLibrary(store, argv.slice(1)); break; - case "vsearch": + } + case "vsearch": { + const { cmdVSearch } = await import("./cli/search"); await cmdVSearch(store, argv.slice(1)); break; - case "query": + } + case "query": { + const { cmdQuery } = await import("./cli/search"); await cmdQuery(store, argv.slice(1)); break; - case "get": + } + case "get": { + const { cmdGet } = await import("./cli/get"); await cmdGet(store, argv.slice(1)); break; - case "db": + } + case "db": { + const { cmdDb } = await import("./cli/db"); await cmdDb(store, argv.slice(1)); break; - case "status": + } + case "status": { + const { cmdStatus } = await import("./cli/status"); await cmdStatus(store); break; - case "cleanup": + } + case "cleanup": { + const { cmdCleanup } = await import("./cli/status"); await cmdCleanup(store); break; - case "seed": + } + case "seed": { + const { cmdSeed } = await import("./cli/seed"); await cmdSeed(store, argv.slice(1)); break; + } default: printHelp(false); process.exit(1);