@leanlabsinnov/codegraph 0.1.3 → 0.1.4

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,7 +1,7 @@
1
1
  import {
2
2
  EDGE_KINDS,
3
3
  NODE_KINDS
4
- } from "./chunk-XGPZDCQ4.js";
4
+ } from "./chunk-POGEFB23.js";
5
5
 
6
6
  // ../graph-db/src/client.ts
7
7
  import { mkdir } from "fs/promises";
@@ -387,4 +387,4 @@ export {
387
387
  defaultDbPath,
388
388
  GraphDb
389
389
  };
390
- //# sourceMappingURL=chunk-AVP24SX5.js.map
390
+ //# sourceMappingURL=chunk-AVQNLB4I.js.map
@@ -79,12 +79,27 @@ var LLM_PRESETS = {
79
79
  },
80
80
  "local-ollama": {
81
81
  mode: "local",
82
- generation: { provider: "ollama", model: "qwen2.5-coder:14b" },
82
+ generation: { provider: "ollama", model: "qwen2.5-coder:1.5b" },
83
83
  embeddings: {
84
84
  provider: "ollama",
85
85
  model: "nomic-embed-text",
86
86
  dimension: 768
87
87
  }
88
+ },
89
+ /**
90
+ * Any OpenAI-compatible local server (llama.cpp, LM Studio, vLLM, LocalAI).
91
+ * `baseUrl` must be set separately in LlmConfig (e.g. http://localhost:8080/v1).
92
+ * Model names default to common values but should be overridden to match whatever
93
+ * the user has loaded in their server.
94
+ */
95
+ "local-openai-compatible": {
96
+ mode: "local",
97
+ generation: { provider: "openai", model: "qwen2.5-coder" },
98
+ embeddings: {
99
+ provider: "openai",
100
+ model: "nomic-embed-text",
101
+ dimension: 768
102
+ }
88
103
  }
89
104
  };
90
105
 
@@ -109,4 +124,4 @@ export {
109
124
  DEFAULT_CONFIG,
110
125
  LLM_PRESETS
111
126
  };
112
- //# sourceMappingURL=chunk-XGPZDCQ4.js.map
127
+ //# sourceMappingURL=chunk-POGEFB23.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../shared/src/kinds.ts","../../shared/src/embedding.ts","../../shared/src/config.ts","../../shared/src/ids.ts"],"sourcesContent":["export const NODE_KINDS = [\n \"File\",\n \"Function\",\n \"Class\",\n \"Interface\",\n \"Component\",\n \"Route\",\n \"Variable\",\n] as const;\n\nexport type NodeKind = (typeof NODE_KINDS)[number];\n\nexport const EDGE_KINDS = [\n \"IMPORTS\",\n \"CALLS\",\n \"RENDERS\",\n \"INHERITS\",\n \"DEFINES\",\n \"EXPORTS\",\n] as const;\n\nexport type EdgeKind = (typeof EDGE_KINDS)[number];\n\nexport const SUPPORTED_LANGUAGES = [\"typescript\", \"tsx\", \"javascript\", \"jsx\", \"python\"] as const;\nexport type Language = (typeof SUPPORTED_LANGUAGES)[number];\n","/**\n * Embedding namespace is the tuple that uniquely identifies a vector space.\n * Every stored embedding tags itself with this namespace string so switching\n * providers later triggers a re-embed instead of silent retrieval drift.\n *\n * Format: `${provider}:${model}:${dimension}`\n */\nexport interface EmbeddingNamespace {\n provider: string;\n model: string;\n dimension: number;\n}\n\nexport function namespaceToString(ns: EmbeddingNamespace): string {\n return `${ns.provider}:${ns.model}:${ns.dimension}`;\n}\n\nexport function parseNamespace(s: string): EmbeddingNamespace | null {\n const parts = s.split(\":\");\n if (parts.length !== 3) return null;\n const [provider, model, dimensionStr] = parts;\n if (!provider || !model || !dimensionStr) return null;\n const dimension = Number(dimensionStr);\n if (!Number.isFinite(dimension) || dimension <= 0) return null;\n return { provider, model, dimension };\n}\n","/**\n * Shape of `~/.codegraph/config.json` and the in-memory resolved config.\n *\n * The on-disk file is partial; defaults are applied on load. Keeping the\n * shape co-located with shared types so cli / ingestion / mcp-server all\n * speak the same vocabulary.\n */\n\nexport type LlmMode = \"managed\" | \"byo\" | \"local\";\n\nexport type LlmProvider = \"openai\" | \"anthropic\" | \"google\" | \"ollama\";\n\nexport interface LlmProviderConfig {\n provider: LlmProvider;\n model: string;\n}\n\nexport interface LlmEmbeddingConfig extends LlmProviderConfig {\n dimension: number;\n}\n\nexport interface LlmConfig {\n mode: LlmMode;\n generation: LlmProviderConfig;\n embeddings: LlmEmbeddingConfig;\n /** Optional API base URL override (e.g. for self-hosted OpenAI-compatible). */\n baseUrl?: string;\n}\n\nexport interface ServerConfig {\n /** SSE port for the local MCP server. */\n port: number;\n /** Single bearer token used by Claude Code / Cursor to authenticate. */\n bearerToken: string;\n}\n\n/**\n * Where the embedded Kuzu graph and any auxiliary on-disk state live. `dbPath` is\n * optional - when missing the storage layer falls back to `~/.codegraph/graph`.\n */\nexport interface DataConfig {\n dbPath?: string;\n}\n\nexport interface CodegraphConfig {\n llm: LlmConfig;\n server: ServerConfig;\n data: DataConfig;\n}\n\nexport const DEFAULT_CONFIG: CodegraphConfig = {\n llm: {\n mode: \"byo\",\n generation: { provider: \"openai\", model: \"gpt-4o-mini\" },\n embeddings: {\n provider: \"openai\",\n model: \"text-embedding-3-small\",\n dimension: 1536,\n },\n },\n server: {\n port: 3748,\n bearerToken: \"cg_local_dev_token\",\n },\n data: {},\n};\n\nexport const LLM_PRESETS: Record<string, Pick<LlmConfig, \"mode\" | \"generation\" | \"embeddings\">> = {\n \"managed-stub\": {\n mode: \"managed\",\n generation: { provider: \"openai\", model: \"gpt-4o-mini\" },\n embeddings: {\n provider: \"openai\",\n model: \"text-embedding-3-small\",\n dimension: 1536,\n },\n },\n \"byo-openai\": {\n mode: \"byo\",\n generation: { provider: \"openai\", model: \"gpt-4o-mini\" },\n embeddings: {\n provider: \"openai\",\n model: \"text-embedding-3-small\",\n dimension: 1536,\n },\n },\n \"byo-anthropic\": {\n mode: \"byo\",\n generation: { provider: \"anthropic\", model: \"claude-3-5-haiku-latest\" },\n // Anthropic has no embedding API; fall back to OpenAI for embeddings.\n embeddings: {\n provider: \"openai\",\n model: \"text-embedding-3-small\",\n dimension: 1536,\n },\n },\n \"byo-google\": {\n mode: \"byo\",\n generation: { provider: \"google\", model: \"gemini-1.5-flash-latest\" },\n embeddings: {\n provider: \"google\",\n model: \"text-embedding-004\",\n dimension: 768,\n },\n },\n \"local-ollama\": {\n mode: \"local\",\n generation: { provider: \"ollama\", model: \"qwen2.5-coder:1.5b\" },\n embeddings: {\n provider: \"ollama\",\n model: \"nomic-embed-text\",\n dimension: 768,\n },\n },\n /**\n * Any OpenAI-compatible local server (llama.cpp, LM Studio, vLLM, LocalAI).\n * `baseUrl` must be set separately in LlmConfig (e.g. http://localhost:8080/v1).\n * Model names default to common values but should be overridden to match whatever\n * the user has loaded in their server.\n */\n \"local-openai-compatible\": {\n mode: \"local\",\n generation: { provider: \"openai\", model: \"qwen2.5-coder\" },\n embeddings: {\n provider: \"openai\",\n model: \"nomic-embed-text\",\n dimension: 768,\n },\n },\n};\n","import { createHash } from \"node:crypto\";\nimport type { NodeKind } from \"./kinds.js\";\n\n/**\n * Compute a stable graph node ID of the form `${repoId}:${kind}:${sha1(path#name#line)}`.\n *\n * The hash is deterministic across runs as long as `path`, `name`, and `line` are stable,\n * so an `upsertNodes` pass over a repo will overwrite the same nodes rather than producing\n * duplicates.\n */\nexport function makeNodeId(input: {\n repoId: string;\n kind: NodeKind;\n path: string;\n name: string;\n line?: number;\n}): string {\n const { repoId, kind, path, name, line } = input;\n const fingerprint = `${path}#${name}#${line ?? 0}`;\n const hash = createHash(\"sha1\").update(fingerprint).digest(\"hex\");\n return `${repoId}:${kind}:${hash}`;\n}\n\n/** Compute a stable repo ID from an absolute path. */\nexport function makeRepoId(absolutePath: string): string {\n return createHash(\"sha1\").update(absolutePath).digest(\"hex\").slice(0, 12);\n}\n\n/** Convenience wrapper: stable ID for a File node. */\nexport function makeFileId(input: { repoId: string; path: string }): string {\n return makeNodeId({ repoId: input.repoId, kind: \"File\", path: input.path, name: input.path });\n}\n"],"mappings":";AAAO,IAAM,aAAa;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAIO,IAAM,aAAa;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;ACNO,SAAS,kBAAkB,IAAgC;AAChE,SAAO,GAAG,GAAG,QAAQ,IAAI,GAAG,KAAK,IAAI,GAAG,SAAS;AACnD;;;ACmCO,IAAM,iBAAkC;AAAA,EAC7C,KAAK;AAAA,IACH,MAAM;AAAA,IACN,YAAY,EAAE,UAAU,UAAU,OAAO,cAAc;AAAA,IACvD,YAAY;AAAA,MACV,UAAU;AAAA,MACV,OAAO;AAAA,MACP,WAAW;AAAA,IACb;AAAA,EACF;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM,CAAC;AACT;AAEO,IAAM,cAAqF;AAAA,EAChG,gBAAgB;AAAA,IACd,MAAM;AAAA,IACN,YAAY,EAAE,UAAU,UAAU,OAAO,cAAc;AAAA,IACvD,YAAY;AAAA,MACV,UAAU;AAAA,MACV,OAAO;AAAA,MACP,WAAW;AAAA,IACb;AAAA,EACF;AAAA,EACA,cAAc;AAAA,IACZ,MAAM;AAAA,IACN,YAAY,EAAE,UAAU,UAAU,OAAO,cAAc;AAAA,IACvD,YAAY;AAAA,MACV,UAAU;AAAA,MACV,OAAO;AAAA,MACP,WAAW;AAAA,IACb;AAAA,EACF;AAAA,EACA,iBAAiB;AAAA,IACf,MAAM;AAAA,IACN,YAAY,EAAE,UAAU,aAAa,OAAO,0BAA0B;AAAA;AAAA,IAEtE,YAAY;AAAA,MACV,UAAU;AAAA,MACV,OAAO;AAAA,MACP,WAAW;AAAA,IACb;AAAA,EACF;AAAA,EACA,cAAc;AAAA,IACZ,MAAM;AAAA,IACN,YAAY,EAAE,UAAU,UAAU,OAAO,0BAA0B;AAAA,IACnE,YAAY;AAAA,MACV,UAAU;AAAA,MACV,OAAO;AAAA,MACP,WAAW;AAAA,IACb;AAAA,EACF;AAAA,EACA,gBAAgB;AAAA,IACd,MAAM;AAAA,IACN,YAAY,EAAE,UAAU,UAAU,OAAO,qBAAqB;AAAA,IAC9D,YAAY;AAAA,MACV,UAAU;AAAA,MACV,OAAO;AAAA,MACP,WAAW;AAAA,IACb;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,2BAA2B;AAAA,IACzB,MAAM;AAAA,IACN,YAAY,EAAE,UAAU,UAAU,OAAO,gBAAgB;AAAA,IACzD,YAAY;AAAA,MACV,UAAU;AAAA,MACV,OAAO;AAAA,MACP,WAAW;AAAA,IACb;AAAA,EACF;AACF;;;ACjIA,SAAS,kBAAkB;AAUpB,SAAS,WAAW,OAMhB;AACT,QAAM,EAAE,QAAQ,MAAM,MAAM,MAAM,KAAK,IAAI;AAC3C,QAAM,cAAc,GAAG,IAAI,IAAI,IAAI,IAAI,QAAQ,CAAC;AAChD,QAAM,OAAO,WAAW,MAAM,EAAE,OAAO,WAAW,EAAE,OAAO,KAAK;AAChE,SAAO,GAAG,MAAM,IAAI,IAAI,IAAI,IAAI;AAClC;AAQO,SAAS,WAAW,OAAiD;AAC1E,SAAO,WAAW,EAAE,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,MAAM,MAAM,MAAM,MAAM,KAAK,CAAC;AAC9F;","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  namespaceToString
3
- } from "./chunk-XGPZDCQ4.js";
3
+ } from "./chunk-POGEFB23.js";
4
4
 
5
5
  // ../llm-router/src/router.ts
6
6
  import { embedMany, generateText } from "ai";
@@ -15,7 +15,7 @@ async function createLlmRouter(opts) {
15
15
  }
16
16
  };
17
17
  const generationModel = await buildGenerationModel(opts.config, env);
18
- const embeddingModel = await buildEmbeddingModel(opts.config.embeddings, env);
18
+ const embeddingModel = await buildEmbeddingModel(opts.config.embeddings, env, opts.config.baseUrl);
19
19
  async function doEmbed(texts) {
20
20
  if (texts.length === 0) return [];
21
21
  const { embeddings } = await embedMany({ model: embeddingModel, values: texts });
@@ -71,8 +71,8 @@ async function buildGenerationModel(config, env) {
71
71
  if (provider === "ollama") return ollamaText(config.generation, env, config.baseUrl);
72
72
  throw new Error(`Unsupported generation provider: ${provider}`);
73
73
  }
74
- async function buildEmbeddingModel(config, env) {
75
- if (config.provider === "openai") return openaiEmbedding(config, env);
74
+ async function buildEmbeddingModel(config, env, baseUrl) {
75
+ if (config.provider === "openai") return openaiEmbedding(config, env, baseUrl);
76
76
  if (config.provider === "google") return googleEmbedding(config, env);
77
77
  if (config.provider === "ollama") return ollamaEmbedding(config, env);
78
78
  if (config.provider === "anthropic") {
@@ -91,9 +91,12 @@ async function openaiText(config, env, baseUrl) {
91
91
  });
92
92
  return openai(config.model);
93
93
  }
94
- async function openaiEmbedding(config, env) {
94
+ async function openaiEmbedding(config, env, baseUrl) {
95
95
  const { createOpenAI } = await import("@ai-sdk/openai");
96
- const openai = createOpenAI(env.OPENAI_API_KEY ? { apiKey: env.OPENAI_API_KEY } : {});
96
+ const openai = createOpenAI({
97
+ ...env.OPENAI_API_KEY ? { apiKey: env.OPENAI_API_KEY } : {},
98
+ ...baseUrl ? { baseURL: baseUrl } : {}
99
+ });
97
100
  return openai.embedding(config.model);
98
101
  }
99
102
  async function anthropicText(config, env, baseUrl) {
@@ -136,4 +139,4 @@ export {
136
139
  createLlmRouter,
137
140
  namespaceLabel
138
141
  };
139
- //# sourceMappingURL=chunk-B2TIVKUB.js.map
142
+ //# sourceMappingURL=chunk-WXBYICTK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../llm-router/src/router.ts"],"sourcesContent":["import type { EmbeddingModel, LanguageModel } from \"ai\";\nimport { embedMany, generateText } from \"ai\";\nimport type { LlmConfig, LlmEmbeddingConfig, LlmProviderConfig } from \"@codegraph/shared\";\nimport { namespaceToString } from \"@codegraph/shared\";\nimport type { GenerateOptions, LlmRouter, ResolvedLlmConfig } from \"./types.js\";\n\nexport interface CreateRouterOptions {\n config: LlmConfig;\n env?: NodeJS.ProcessEnv;\n}\n\nexport async function createLlmRouter(opts: CreateRouterOptions): Promise<LlmRouter> {\n const env = opts.env ?? process.env;\n const resolved: ResolvedLlmConfig = {\n ...opts.config,\n embeddingNamespace: {\n provider: opts.config.embeddings.provider,\n model: opts.config.embeddings.model,\n dimension: opts.config.embeddings.dimension,\n },\n };\n\n const generationModel = await buildGenerationModel(opts.config, env);\n const embeddingModel = await buildEmbeddingModel(opts.config.embeddings, env, opts.config.baseUrl);\n\n async function doEmbed(texts: string[]): Promise<number[][]> {\n if (texts.length === 0) return [];\n const { embeddings } = await embedMany({ model: embeddingModel, values: texts });\n return embeddings;\n }\n\n async function doGenerate(options: GenerateOptions): Promise<string> {\n const { text } = await generateText({\n model: generationModel,\n ...(options.system !== undefined ? { system: options.system } : {}),\n messages: options.messages,\n ...(options.temperature !== undefined ? { temperature: options.temperature } : {}),\n ...(options.maxTokens !== undefined ? { maxTokens: options.maxTokens } : {}),\n });\n return text;\n }\n\n const router: LlmRouter = {\n config: resolved,\n embed: doEmbed,\n generate: doGenerate,\n async selfTest() {\n const embedStart = Date.now();\n const embeds = await doEmbed([\"codegraph self-test\"]);\n const embedLatencyMs = Date.now() - embedStart;\n const genStart = Date.now();\n const out = await doGenerate({\n messages: [{ role: \"user\", content: \"Reply with the single word ok.\" }],\n maxTokens: 5,\n temperature: 0,\n });\n const generateLatencyMs = Date.now() - genStart;\n return {\n embedDims: embeds[0]?.length ?? 0,\n generationOk: typeof out === \"string\" && out.length > 0,\n embedLatencyMs,\n generateLatencyMs,\n };\n },\n };\n return router;\n}\n\n/**\n * Used by the CLI's `config llm` printer; surfaces the resolved namespace\n * tag without forcing a provider import upstream.\n */\nexport function namespaceLabel(config: LlmConfig): string {\n return namespaceToString({\n provider: config.embeddings.provider,\n model: config.embeddings.model,\n dimension: config.embeddings.dimension,\n });\n}\n\nasync function buildGenerationModel(\n config: LlmConfig,\n env: NodeJS.ProcessEnv,\n): Promise<LanguageModel> {\n const provider = config.generation.provider;\n if (provider === \"openai\") return openaiText(config.generation, env, config.baseUrl);\n if (provider === \"anthropic\") return anthropicText(config.generation, env, config.baseUrl);\n if (provider === \"google\") return googleText(config.generation, env, config.baseUrl);\n if (provider === \"ollama\") return ollamaText(config.generation, env, config.baseUrl);\n throw new Error(`Unsupported generation provider: ${provider}`);\n}\n\nasync function buildEmbeddingModel(\n config: LlmEmbeddingConfig,\n env: NodeJS.ProcessEnv,\n baseUrl?: string,\n): Promise<EmbeddingModel<string>> {\n if (config.provider === \"openai\") return openaiEmbedding(config, env, baseUrl);\n if (config.provider === \"google\") return googleEmbedding(config, env);\n if (config.provider === \"ollama\") return ollamaEmbedding(config, env);\n if (config.provider === \"anthropic\") {\n // Anthropic has no embedding endpoint; fall back to OpenAI so the\n // pipeline keeps working when generation is anthropic.\n return openaiEmbedding(\n { provider: \"openai\", model: \"text-embedding-3-small\", dimension: 1536 },\n env,\n );\n }\n throw new Error(`Unsupported embedding provider: ${config.provider}`);\n}\n\nasync function openaiText(\n config: LlmProviderConfig,\n env: NodeJS.ProcessEnv,\n baseUrl?: string,\n): Promise<LanguageModel> {\n const { createOpenAI } = await import(\"@ai-sdk/openai\");\n const openai = createOpenAI({\n ...(env.OPENAI_API_KEY ? { apiKey: env.OPENAI_API_KEY } : {}),\n ...(baseUrl ? { baseURL: baseUrl } : {}),\n });\n return openai(config.model);\n}\n\nasync function openaiEmbedding(\n config: LlmEmbeddingConfig,\n env: NodeJS.ProcessEnv,\n baseUrl?: string,\n): Promise<EmbeddingModel<string>> {\n const { createOpenAI } = await import(\"@ai-sdk/openai\");\n const openai = createOpenAI({\n ...(env.OPENAI_API_KEY ? { apiKey: env.OPENAI_API_KEY } : {}),\n ...(baseUrl ? { baseURL: baseUrl } : {}),\n });\n return openai.embedding(config.model);\n}\n\nasync function anthropicText(\n config: LlmProviderConfig,\n env: NodeJS.ProcessEnv,\n baseUrl?: string,\n): Promise<LanguageModel> {\n const { createAnthropic } = await import(\"@ai-sdk/anthropic\");\n const anthropic = createAnthropic({\n ...(env.ANTHROPIC_API_KEY ? { apiKey: env.ANTHROPIC_API_KEY } : {}),\n ...(baseUrl ? { baseURL: baseUrl } : {}),\n });\n return anthropic(config.model);\n}\n\nasync function googleText(\n config: LlmProviderConfig,\n env: NodeJS.ProcessEnv,\n baseUrl?: string,\n): Promise<LanguageModel> {\n const { createGoogleGenerativeAI } = await import(\"@ai-sdk/google\");\n const google = createGoogleGenerativeAI({\n ...(env.GOOGLE_GENERATIVE_AI_API_KEY\n ? { apiKey: env.GOOGLE_GENERATIVE_AI_API_KEY }\n : {}),\n ...(baseUrl ? { baseURL: baseUrl } : {}),\n });\n return google(config.model);\n}\n\nasync function googleEmbedding(\n config: LlmEmbeddingConfig,\n env: NodeJS.ProcessEnv,\n): Promise<EmbeddingModel<string>> {\n const { createGoogleGenerativeAI } = await import(\"@ai-sdk/google\");\n const google = createGoogleGenerativeAI(\n env.GOOGLE_GENERATIVE_AI_API_KEY\n ? { apiKey: env.GOOGLE_GENERATIVE_AI_API_KEY }\n : {},\n );\n return google.textEmbeddingModel(config.model);\n}\n\nasync function ollamaText(\n config: LlmProviderConfig,\n env: NodeJS.ProcessEnv,\n baseUrl?: string,\n): Promise<LanguageModel> {\n const { createOllama } = await import(\"ollama-ai-provider\");\n const base = baseUrl ?? env.OLLAMA_BASE_URL;\n const ollama = createOllama(base ? { baseURL: `${base.replace(/\\/$/, \"\")}/api` } : {});\n return ollama(config.model);\n}\n\nasync function ollamaEmbedding(\n config: LlmEmbeddingConfig,\n env: NodeJS.ProcessEnv,\n): Promise<EmbeddingModel<string>> {\n const { createOllama } = await import(\"ollama-ai-provider\");\n const base = env.OLLAMA_BASE_URL;\n const ollama = createOllama(base ? { baseURL: `${base.replace(/\\/$/, \"\")}/api` } : {});\n return ollama.embedding(config.model);\n}\n"],"mappings":"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","names":[]}
package/dist/index.js CHANGED
@@ -3,10 +3,10 @@ import {
3
3
  configPath,
4
4
  loadConfig,
5
5
  saveConfig
6
- } from "./chunk-5WYXRWEY.js";
7
- import "./chunk-B2TIVKUB.js";
8
- import "./chunk-AVP24SX5.js";
9
- import "./chunk-XGPZDCQ4.js";
6
+ } from "./chunk-64OLVRK3.js";
7
+ import "./chunk-WXBYICTK.js";
8
+ import "./chunk-AVQNLB4I.js";
9
+ import "./chunk-POGEFB23.js";
10
10
  export {
11
11
  buildProgram,
12
12
  configPath,
@@ -8,8 +8,8 @@ import {
8
8
  buildSchemaStatements,
9
9
  defaultDbPath,
10
10
  defaultFor
11
- } from "./chunk-AVP24SX5.js";
12
- import "./chunk-XGPZDCQ4.js";
11
+ } from "./chunk-AVQNLB4I.js";
12
+ import "./chunk-POGEFB23.js";
13
13
  export {
14
14
  DEFAULT_EMBEDDING_DIMENSION,
15
15
  EDGE_COLUMNS,
@@ -21,4 +21,4 @@ export {
21
21
  defaultDbPath,
22
22
  defaultFor
23
23
  };
24
- //# sourceMappingURL=src-M7HSEMBT.js.map
24
+ //# sourceMappingURL=src-BTVJBGZ5.js.map
@@ -0,0 +1,10 @@
1
+ import {
2
+ createLlmRouter,
3
+ namespaceLabel
4
+ } from "./chunk-WXBYICTK.js";
5
+ import "./chunk-POGEFB23.js";
6
+ export {
7
+ createLlmRouter,
8
+ namespaceLabel
9
+ };
10
+ //# sourceMappingURL=src-DBJQ22XR.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@leanlabsinnov/codegraph",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "description": "Live, queryable knowledge graph for your codebase. Indexes JS/TS into an embedded graph DB with embeddings and exposes an MCP server Claude Code and Cursor can call.",
5
5
  "keywords": [
6
6
  "mcp",
@@ -33,6 +33,7 @@
33
33
  },
34
34
  "files": [
35
35
  "dist",
36
+ "viewer",
36
37
  "README.md",
37
38
  "LICENSE"
38
39
  ],