@promptev/context-engine 0.0.2 → 0.0.3

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 +1 @@
1
- {"version":3,"sources":["../../src/errors.ts","../../src/extras.ts","../../src/hooks.ts","../../src/providers/google.ts","../../src/providers/llm.ts","../../src/graph/communities.ts","../../src/graph/entities.ts","../../src/graph/schema.ts","../../src/graph/neo4j-client.ts","../../src/graph/retrieval.ts","../../src/usage.ts","../../src/graph/stage.ts","../../src/graph/index.ts"],"names":["callLlm","jsonrepair","randomUUID","GraphStore","runGraphStage","buildGraphRanked"],"mappings":"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","file":"index.js","sourcesContent":["/** Action-surface errors — user-facing / data-dependent failures (not found, ACL, bad input).\n * Config/programming errors stay as TypeError / RangeError / Error.\n */\nexport class EngineActionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"EngineActionError\";\n }\n}\n\n/** Missing vs forbidden document: identical message so callers cannot distinguish. */\nexport class DocumentNotFoundError extends Error {\n constructor(documentId: string) {\n super(`document not found: ${documentId}`);\n this.name = \"DocumentNotFoundError\";\n }\n}\n\nexport class GraphLegUnavailable extends Error {\n constructor(message = \"graph ranked list was not supplied\") {\n super(message);\n this.name = \"GraphLegUnavailable\";\n }\n}\n\nexport class ApprovalNotPending extends Error {\n constructor(message = \"approval is not pending\") {\n super(message);\n this.name = \"ApprovalNotPending\";\n }\n}\n\nexport class ApprovalExpired extends Error {\n constructor(message = \"approval has expired\") {\n super(message);\n this.name = \"ApprovalExpired\";\n }\n}\n\nexport class CodeExecutionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"CodeExecutionError\";\n }\n}\n\nexport class CodeExecutionTimeout extends Error {\n constructor(message = \"code execution timed out\") {\n super(message);\n this.name = \"CodeExecutionTimeout\";\n }\n}\n\nexport class ExtraMissingError extends Error {\n constructor(extra: string, pkg: string, what: string) {\n super(`${what} requires the '${pkg}' package (optional extra: ${extra}): npm install ${pkg}`);\n this.name = \"ExtraMissingError\";\n }\n}\n","import { ExtraMissingError } from \"./errors.js\";\n\nexport async function tryImport<T = unknown>(specifier: string): Promise<T | null> {\n try {\n return (await import(specifier)) as T;\n } catch {\n return null;\n }\n}\n\nexport async function requireExtra<T = unknown>(specifier: string, extra: string, what: string): Promise<T> {\n try {\n return (await import(specifier)) as T;\n } catch (_err) {\n throw new ExtraMissingError(extra, specifier, what);\n }\n}\n","import type { UsageEvent } from \"./usage.js\";\n\nconst log = {\n warn: (...args: unknown[]) => console.warn(\"[context-engine]\", ...args),\n error: (...args: unknown[]) => console.error(\"[context-engine]\", ...args),\n};\n\n/**\n * One ingest stage boundary. `documentId` is null until the row is claimed\n * (extraction runs before that, so dedup can decide from the extracted\n * text); `sourceId` + `externalId` are the caller's own identity and exist\n * on every event. `detail` is per stage and always JSON-serialisable.\n */\nexport interface ProgressEvent {\n sourceId: string | null;\n externalId: string | null;\n documentId: string | null;\n name: string;\n stage: \"extract\" | \"redact\" | \"chunk\" | \"embed\" | \"structured\" | \"graph\";\n state: \"started\" | \"done\";\n detail: Record<string, unknown>;\n}\n\nexport interface Hooks {\n onUsage?: ((event: UsageEvent) => void) | null;\n onError?: ((exc: unknown, ctx: Record<string, unknown>) => void) | null;\n onToolCall?: ((event: Record<string, unknown>) => void) | null;\n /** Ingest stage boundaries, for live progress UIs. Never raises outward. */\n onProgress?: ((event: ProgressEvent) => void) | null;\n}\n\nexport function emitUsage(hooks: Hooks | null | undefined, event: UsageEvent): void {\n if (!hooks?.onUsage) return;\n try {\n hooks.onUsage(event);\n } catch {\n log.warn(\"onUsage callback raised; swallowing\");\n }\n}\n\nexport function emitError(hooks: Hooks | null | undefined, exc: unknown, ctx: Record<string, unknown>): void {\n log.error(\"context_engine error:\", exc, \"| ctx=\", ctx);\n if (!hooks?.onError) return;\n try {\n hooks.onError(exc, ctx);\n } catch {\n log.warn(\"onError callback raised; swallowing\");\n }\n}\n\n/** Report an ingest stage boundary to `hooks.onProgress`, if set. Never raises. */\nexport function emitProgress(hooks: Hooks | null | undefined, event: ProgressEvent): void {\n if (!hooks?.onProgress) return;\n try {\n hooks.onProgress(event);\n } catch {\n log.warn(\"onProgress callback raised; swallowing\");\n }\n}\n\nexport function emitToolCall(hooks: Hooks | null | undefined, event: Record<string, unknown>): void {\n if (!hooks?.onToolCall) return;\n try {\n hooks.onToolCall(event);\n } catch {\n log.warn(\"onToolCall callback raised; swallowing\");\n }\n}\n","/**\n * How a `@google/genai` client gets built — the one place that decides.\n *\n * Gemini reaches this package two ways, and they differ only in the client\n * constructor:\n *\n * - **gemini** — the Gemini Developer API, authenticated with an API key.\n * - **vertex_ai** — the same models on Vertex AI, authenticated with\n * Application Default Credentials against a GCP project.\n * `GOOGLE_APPLICATION_CREDENTIALS`, workload identity and\n * `gcloud auth application-default login` all work unchanged; there is\n * deliberately no credentials field of our own.\n *\n * Both the LLM provider and the embeddings provider need this decision, so it\n * lives here rather than in four copies (two per port) that would drift.\n *\n * Two SDK behaviours this module is built around, both read out of the real\n * package rather than assumed:\n *\n * - `project`/`location` and `apiKey` are **mutually exclusive** — the SDK\n * raises if handed both. A `vertex_ai` config that still carries a leftover\n * `apiKey` alongside a project must therefore not forward it, or every call\n * fails on a config that looks entirely reasonable.\n * - Omitting project/location is not automatically a broken config: the SDK\n * reads `GOOGLE_CLOUD_PROJECT` / `GOOGLE_CLOUD_LOCATION`, which is how a GCP\n * deployment is usually already wired. So unset fields are left ABSENT\n * rather than passed as null, and the \"is there enough auth\" question is\n * left to the SDK, the only party that can answer it.\n *\n * **This is where the two ports genuinely differ**, measured rather than\n * assumed: the Python SDK falls back to discovering the project from ADC\n * when neither config nor env supplies one, and this JS SDK does not — it\n * throws at construction. A deployment relying on ADC alone must therefore\n * name the project in config or in the environment for the TS client.\n */\nimport { ExtraMissingError } from \"../errors.js\";\n\n/** The fields `EmbeddingConfig` and `LLMConfig` share here. */\nexport interface GoogleProviderConfig {\n provider: string;\n apiKey?: string | null;\n project?: string | null;\n location?: string | null;\n}\n\ntype GenaiCtorOpts = {\n apiKey?: string | null;\n vertexai?: boolean;\n project?: string;\n location?: string;\n httpOptions?: { timeout?: number };\n};\n\n/**\n * Build a `@google/genai` client for `cfg`, in Gemini or Vertex mode.\n *\n * `timeoutMs` is required: the SDK has NO default timeout of its own, so a\n * missing one means a stuck backend hangs the call forever — on the ingest\n * path a wedged worker rather than a failed document.\n *\n * `purpose` only shapes the `ExtraMissingError` message (\"gemini llm\" vs\n * \"gemini embeddings\").\n */\nexport async function buildGenaiClient<T>(\n cfg: GoogleProviderConfig,\n timeoutMs: number,\n purpose: string,\n): Promise<T> {\n const specifier = \"@google/genai\";\n let mod: {\n GoogleGenAI?: new (opts: GenaiCtorOpts) => T;\n Client?: new (opts: GenaiCtorOpts) => T;\n };\n try {\n mod = (await import(specifier)) as typeof mod;\n } catch {\n throw new ExtraMissingError(\"gemini\", specifier, purpose);\n }\n const Ctor = mod.GoogleGenAI ?? mod.Client;\n if (!Ctor) {\n throw new ExtraMissingError(\"gemini\", specifier, purpose);\n }\n\n const opts: GenaiCtorOpts = { httpOptions: { timeout: timeoutMs } };\n\n if (cfg.provider === \"vertex_ai\") {\n opts.vertexai = true;\n if (cfg.project || cfg.location) {\n // Explicit project/location wins, and the API key is dropped: the SDK\n // refuses the combination outright.\n if (cfg.project) opts.project = cfg.project;\n if (cfg.location) opts.location = cfg.location;\n } else if (cfg.apiKey) {\n // Vertex express mode — an API key and no project. The one combination\n // where `apiKey` means anything on this provider.\n opts.apiKey = cfg.apiKey;\n }\n // Otherwise set neither, so the SDK's own env-var lookup runs untouched.\n } else {\n opts.apiKey = cfg.apiKey ?? null;\n }\n\n try {\n return new Ctor(opts);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n if (!message.includes(\"Authentication is not set up\")) throw err;\n // The SDK is right, but it cannot know what this config is called. Note\n // the port difference this message has to cover: the Python SDK falls\n // back to discovering the project from ADC, this one does not — it reads\n // the env vars and stops — so an ADC-only deployment must name the\n // project somewhere.\n throw new Error(\n `${message} Set \\`project\\` on the provider config, or export ` +\n \"GOOGLE_CLOUD_PROJECT and GOOGLE_CLOUD_LOCATION. Credentials \" +\n \"themselves come from Application Default Credentials.\",\n );\n }\n}\n","/**\n * Pluggable LLM provider.\n *\n * `callLlm(cfg, { system, user, jsonMode, images, client })` is the single entry\n * point. Returns `[text, { input, output }]`.\n *\n * Images are always PNG. 240s call timeout (every provider), no retries.\n * Injectable `client` / `fetch`.\n * `callLlm` owns and closes the client it builds unless one is passed in.\n */\n\nimport OpenAI from \"openai\";\nimport type { LLMConfig } from \"../config.js\";\nimport { ExtraMissingError } from \"../errors.js\";\nimport type { FetchImpl } from \"./embeddings.js\";\nimport { buildGenaiClient } from \"./google.js\";\n\n/** Hard cap per LLM call, EVERY provider. A non-streaming multi-page vision\n * transcription routinely generates for well over 30s (real batches run\n * minutes), so the old 30s default made every vision attempt on\n * anthropic/openai/bedrock time out and the pages land as `failed` — only\n * gemini had been given this cap. It also bounds the hang: `@google/genai`\n * has NO default timeout at all, and with the bounded render queue a hung\n * batch holds a worker slot for good. */\nexport const CALL_TIMEOUT_MS = 240_000;\n\n/** Back-compat aliases — the cap stopped being gemini-specific. */\nexport const TIMEOUT_MS = CALL_TIMEOUT_MS;\nexport const GEMINI_CALL_TIMEOUT_MS = CALL_TIMEOUT_MS;\nconst ANTHROPIC_VERSION = \"2023-06-01\";\nconst ANTHROPIC_MAX_TOKENS = 4096;\n\nconst OPENAI_FAMILY = new Set([\"openai\", \"azure_openai\", \"custom\"]);\n\n/**\n * Both reach the same models through the same SDK; only the client\n * constructor differs (API key vs ADC against a GCP project), which is why\n * they share every line below `buildGenaiClient`.\n */\nconst GOOGLE_FAMILY = new Set([\"gemini\", \"vertex_ai\"]);\n\nexport type TokenUsage = { input: number; output: number };\n\nexport type ImageBytes = Uint8Array;\n\nexport type ChatClient = {\n chat: {\n completions: {\n create(body: { model: string; messages: unknown[]; response_format?: { type: string } }): Promise<{\n choices: Array<{ message?: { content?: string | null } }>;\n usage?: { prompt_tokens?: number; completion_tokens?: number } | null;\n }>;\n };\n };\n close?: () => void | Promise<void>;\n timeout?: number;\n baseURL?: string;\n};\n\nexport type LlmCallOpts = {\n system: string;\n user: string;\n jsonMode?: boolean;\n images?: ImageBytes[] | null;\n maxTokens?: number | null;\n /** Reasoning tokens are drawn from `maxTokens`, so a caller that wants\n * transcription rather than deliberation must be able to spend the whole\n * budget on output. Omitted = the provider's default. Applied per provider\n * capability: gemini and anthropic take it directly (anthropic thinking is\n * opt-in, so 0 sends nothing and a positive budget drops `temperature` —\n * the API rejects the combination); bedrock forwards a positive budget as\n * the anthropic-style passthrough; the openai family has no portable\n * thinking control. */\n thinkingBudget?: number | null;\n temperature?: number | null;\n};\n\nexport type LLMClientOpts = {\n client?: ChatClient | null;\n fetch?: FetchImpl | null;\n fetchImpl?: FetchImpl | null;\n};\n\ntype GeminiChatClient = {\n models: {\n generateContent(args: { model: string; contents: unknown; config?: Record<string, unknown> }): Promise<{\n text?: string;\n usageMetadata?: {\n promptTokenCount?: number;\n candidatesTokenCount?: number;\n prompt_token_count?: number;\n candidates_token_count?: number;\n };\n }>;\n };\n};\n\ntype BedrockConverseResult = {\n output?: { message?: { content?: Array<{ text?: string }> } };\n usage?: { inputTokens?: number; outputTokens?: number };\n};\n\nfunction toBase64(bytes: Uint8Array): string {\n return Buffer.from(bytes).toString(\"base64\");\n}\n\nasync function postJson(\n fetchImpl: FetchImpl,\n url: string,\n body: unknown,\n headers: Record<string, string>,\n): Promise<any> {\n const resp = await fetchImpl(url, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", ...headers },\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(TIMEOUT_MS),\n });\n if (!resp.ok) {\n const text = await resp.text().catch(() => \"\");\n throw new Error(`HTTP ${resp.status} ${resp.statusText}${text ? `: ${text}` : \"\"}`);\n }\n return resp.json();\n}\n\nexport function buildOpenAIChatClient(cfg: LLMConfig): OpenAI {\n return new OpenAI({\n apiKey: cfg.apiKey ?? undefined,\n baseURL: cfg.baseUrl ?? undefined,\n timeout: TIMEOUT_MS,\n maxRetries: 0,\n });\n}\n\nexport class LLMClient {\n cfg: LLMConfig;\n provider: LLMConfig[\"provider\"];\n model: string;\n client: ChatClient | null;\n fetchImpl: FetchImpl | null;\n private genaiClient: GeminiChatClient | null = null;\n\n constructor(cfg: LLMConfig, opts: LLMClientOpts = {}) {\n this.cfg = cfg;\n this.provider = cfg.provider;\n this.model = cfg.model;\n this.client = opts.client ?? null;\n this.fetchImpl = opts.fetch ?? opts.fetchImpl ?? null;\n }\n\n async aclose(): Promise<void> {\n const closer = this.client?.close;\n if (typeof closer === \"function\") {\n await closer.call(this.client);\n }\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.aclose();\n }\n\n async call(opts: LlmCallOpts): Promise<[string, TokenUsage]> {\n const {\n system,\n user,\n jsonMode = false,\n images = null,\n maxTokens = null,\n thinkingBudget = null,\n temperature = null,\n } = opts;\n if (this.provider === \"anthropic\") {\n return this.callAnthropic(system, user, jsonMode, images, maxTokens, thinkingBudget, temperature);\n }\n if (OPENAI_FAMILY.has(this.provider)) {\n return this.callOpenAI(system, user, jsonMode, images, maxTokens, temperature);\n }\n if (GOOGLE_FAMILY.has(this.provider)) {\n return this.callGemini(system, user, jsonMode, images, maxTokens, thinkingBudget, temperature);\n }\n if (this.provider === \"bedrock\") {\n return this.callBedrock(system, user, jsonMode, images, maxTokens, thinkingBudget, temperature);\n }\n throw new Error(`unknown llm provider: ${JSON.stringify(this.provider)}`);\n }\n\n private async callAnthropic(\n system: string,\n user: string,\n jsonMode: boolean,\n images: ImageBytes[] | null,\n maxTokens: number | null,\n thinkingBudget: number | null = null,\n temperature: number | null = null,\n ): Promise<[string, TokenUsage]> {\n if (!this.fetchImpl) {\n throw new Error(\"anthropic llm client has no fetch implementation\");\n }\n if (jsonMode) {\n system = `${system}\\n\\nRespond with valid JSON only.`;\n }\n const content: Array<Record<string, unknown>> = [];\n for (const image of images ?? []) {\n content.push({\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: \"image/png\",\n data: toBase64(image),\n },\n });\n }\n content.push({ type: \"text\", text: user });\n\n const body: Record<string, unknown> = {\n model: this.model,\n max_tokens: maxTokens ?? ANTHROPIC_MAX_TOKENS,\n system,\n messages: [{ role: \"user\", content }],\n };\n if (thinkingBudget) {\n // Anthropic thinking is OPT-IN, so `thinkingBudget: 0` (the vision\n // transcription contract) correctly maps to sending nothing. The API\n // rejects a temperature alongside enabled thinking, so the budget wins\n // when a caller passes both.\n body.thinking = { type: \"enabled\", budget_tokens: thinkingBudget };\n } else if (temperature !== null) {\n // Determinism contract — the same scan must transcribe to the same\n // text twice. This was silently dropped here, so the guarantee only\n // held on gemini.\n body.temperature = temperature;\n }\n\n const data = await postJson(this.fetchImpl, \"https://api.anthropic.com/v1/messages\", body, {\n \"x-api-key\": this.cfg.apiKey ?? \"\",\n \"anthropic-version\": ANTHROPIC_VERSION,\n \"content-type\": \"application/json\",\n });\n const text = data.content[0].text as string;\n const usage = data.usage ?? {};\n return [text, { input: usage.input_tokens ?? 0, output: usage.output_tokens ?? 0 }];\n }\n\n private async callOpenAI(\n system: string,\n user: string,\n jsonMode: boolean,\n images: ImageBytes[] | null,\n maxTokens: number | null,\n temperature: number | null = null,\n ): Promise<[string, TokenUsage]> {\n if (!this.client) {\n throw new Error(\"openai-family llm client has no client\");\n }\n const content: Array<Record<string, unknown>> = [{ type: \"text\", text: user }];\n for (const image of images ?? []) {\n content.push({\n type: \"image_url\",\n image_url: { url: `data:image/png;base64,${toBase64(image)}` },\n });\n }\n const body: {\n model: string;\n messages: unknown[];\n response_format?: { type: string };\n max_completion_tokens?: number;\n temperature?: number;\n } = {\n model: this.model,\n messages: [\n { role: \"system\", content: system },\n { role: \"user\", content },\n ],\n };\n if (jsonMode) {\n body.response_format = { type: \"json_object\" };\n }\n if (maxTokens) {\n // `max_completion_tokens`, not the deprecated `max_tokens`: the\n // reasoning models reject the old name outright.\n body.max_completion_tokens = maxTokens;\n }\n if (temperature !== null) {\n // NOTE: the o-series reasoning models reject a temperature — but a\n // clear API error beats the silent nondeterminism of dropping it.\n // (`thinkingBudget` has no portable mapping here — see LlmCallOpts.)\n body.temperature = temperature;\n }\n const resp = await this.client.chat.completions.create(body);\n const text = resp.choices[0]?.message?.content ?? \"\";\n const usage = resp.usage;\n return [text, { input: usage?.prompt_tokens ?? 0, output: usage?.completion_tokens ?? 0 }];\n }\n\n private async callGemini(\n system: string,\n user: string,\n jsonMode: boolean,\n images: ImageBytes[] | null,\n maxTokens: number | null,\n thinkingBudget: number | null = null,\n temperature: number | null = null,\n ): Promise<[string, TokenUsage]> {\n if (!this.genaiClient) {\n // `buildGenaiClient` picks API-key or Vertex/ADC mode and carries the\n // timeout: the SDK has NO default one, so a dropped connection hangs\n // the call forever — and with the bounded render queue that means one\n // hung batch holds a worker slot for good, so the document simply\n // stops with nothing to show for it.\n this.genaiClient = await buildGenaiClient<GeminiChatClient>(\n this.cfg,\n GEMINI_CALL_TIMEOUT_MS,\n \"gemini llm\",\n );\n }\n const parts: unknown[] = [];\n for (const img of images ?? []) {\n parts.push({ inlineData: { mimeType: \"image/png\", data: toBase64(img) } });\n }\n parts.push({ text: user });\n\n const config: Record<string, unknown> = {\n systemInstruction: system,\n // ALWAYS off, and not as a preference. Automatic function calling means\n // the SDK itself EXECUTES a callable it was handed as a tool and loops\n // on the result — up to ten round trips — before returning anything.\n // This package passes declarations only, so today nothing is executable;\n // but that depends on every future caller continuing to do the same, and\n // an application that gates tool execution behind human approval would\n // have that gate bypassed silently, by a library, with the loop already\n // run before it could object.\n automaticFunctionCalling: { disable: true },\n };\n if (jsonMode) {\n config.responseMimeType = \"application/json\";\n }\n if (maxTokens) {\n config.maxOutputTokens = maxTokens;\n }\n if (temperature !== null) {\n config.temperature = temperature;\n }\n if (thinkingBudget !== null) {\n // Only when the CALLER asks. Reasoning tokens come out of\n // `maxOutputTokens`, so a long transcription can otherwise spend its\n // allowance deliberating and truncate part-way through. Entity\n // extraction and structured output may legitimately want the reasoning,\n // so there is no silent default.\n config.thinkingConfig = { thinkingBudget };\n }\n\n const resp = await this.genaiClient.models.generateContent({\n model: this.model,\n contents: parts,\n config,\n });\n const text = resp.text ?? \"\";\n const usageMeta = resp.usageMetadata;\n const inputTokens = usageMeta?.promptTokenCount ?? usageMeta?.prompt_token_count ?? 0;\n const outputTokens = usageMeta?.candidatesTokenCount ?? usageMeta?.candidates_token_count ?? 0;\n return [text, { input: inputTokens || 0, output: outputTokens || 0 }];\n }\n\n private async callBedrock(\n system: string,\n user: string,\n jsonMode: boolean,\n images: ImageBytes[] | null,\n maxTokens: number | null,\n thinkingBudget: number | null = null,\n temperature: number | null = null,\n ): Promise<[string, TokenUsage]> {\n const { BedrockRuntimeClient, ConverseCommand } = await loadBedrockSdk();\n if (jsonMode) {\n system = `${system}\\n\\nRespond with valid JSON only.`;\n }\n const content: Array<Record<string, unknown>> = [];\n for (const image of images ?? []) {\n content.push({ image: { format: \"png\", source: { bytes: image } } });\n }\n content.push({ text: user });\n\n const runtime = new BedrockRuntimeClient({\n maxAttempts: 1,\n requestHandler: {\n requestTimeout: TIMEOUT_MS,\n connectionTimeout: TIMEOUT_MS,\n },\n });\n try {\n const result = (await runtime.send(\n new ConverseCommand({\n modelId: this.model,\n system: [{ text: system }],\n messages: [{ role: \"user\", content }],\n ...(maxTokens || temperature !== null\n ? {\n inferenceConfig: {\n ...(maxTokens ? { maxTokens } : {}),\n ...(temperature !== null ? { temperature } : {}),\n },\n }\n : {}),\n // Anthropic-style passthrough — Converse forwards it to the model.\n // Zero (the vision transcription contract) sends nothing: thinking\n // is opt-in for the anthropic models bedrock hosts.\n ...(thinkingBudget\n ? {\n additionalModelRequestFields: {\n thinking: { type: \"enabled\", budget_tokens: thinkingBudget },\n },\n }\n : {}),\n }),\n )) as BedrockConverseResult;\n const text = result.output?.message?.content?.[0]?.text ?? \"\";\n const usage = result.usage ?? {};\n return [text, { input: usage.inputTokens ?? 0, output: usage.outputTokens ?? 0 }];\n } finally {\n runtime.destroy?.();\n }\n }\n}\n\nasync function loadBedrockSdk(): Promise<{\n BedrockRuntimeClient: new (\n cfg: Record<string, unknown>,\n ) => {\n send(cmd: unknown): Promise<unknown>;\n destroy?: () => void;\n };\n ConverseCommand: new (input: Record<string, unknown>) => unknown;\n}> {\n const specifier = \"@aws-sdk/client-bedrock-runtime\";\n try {\n return (await import(specifier)) as Awaited<ReturnType<typeof loadBedrockSdk>>;\n } catch {\n throw new ExtraMissingError(\"bedrock\", specifier, \"bedrock llm\");\n }\n}\n\nexport function buildLlmClient(cfg: LLMConfig, opts?: LLMClientOpts): LLMClient {\n if (opts?.client || opts?.fetch || opts?.fetchImpl) {\n return new LLMClient(cfg, opts);\n }\n if (cfg.provider === \"anthropic\") {\n return new LLMClient(cfg, { fetch: globalThis.fetch });\n }\n if (OPENAI_FAMILY.has(cfg.provider)) {\n return new LLMClient(cfg, { client: buildOpenAIChatClient(cfg) });\n }\n if (GOOGLE_FAMILY.has(cfg.provider) || cfg.provider === \"bedrock\") {\n return new LLMClient(cfg);\n }\n throw new Error(`unknown llm provider: ${JSON.stringify(cfg.provider)}`);\n}\n\n/**\n * Call the LLM configured by `cfg`. Returns `[text, tokenUsage]`.\n *\n * With no `client`, one is built for this call and CLOSED afterwards,\n * success or failure. Pass `client` to reuse a connection across many calls;\n * the caller then owns `aclose()`.\n */\nexport async function callLlm(\n cfg: LLMConfig,\n opts: LlmCallOpts & { client?: LLMClient | null },\n): Promise<[string, TokenUsage]> {\n const { client, ...callOpts } = opts;\n if (client) {\n return client.call(callOpts);\n }\n const owned = buildLlmClient(cfg);\n try {\n return await owned.call(callOpts);\n } finally {\n await owned.aclose();\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport { jsonrepair } from \"jsonrepair\";\nimport type { Pool } from \"pg\";\nimport type { ContextEngineConfig } from \"../config.js\";\nimport { requireExtra } from \"../extras.js\";\nimport { emitError, type Hooks } from \"../hooks.js\";\nimport type { Embedder } from \"../providers/embeddings.js\";\n\nexport const MAX_HIERARCHY_LEVELS = 3;\nexport const MIN_COMMUNITY_SIZE = 3;\nexport const MAX_SUMMARY_ENTITIES = 30;\nexport const LOUVAIN_SEED = 42;\nconst SUMMARY_SYSTEM = \"You are a knowledge graph analyst. Be factual.\";\n\nfunction mulberry32(seed: number): () => number {\n let a = seed >>> 0;\n return () => {\n a |= 0;\n a = (a + 0x6d2b79f5) | 0;\n let t = Math.imul(a ^ (a >>> 15), 1 | a);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n\ntype GraphLike = {\n addNode: (n: string) => void;\n addEdge: (a: string, b: string, attrs?: Record<string, unknown>) => void;\n hasEdge: (a: string, b: string) => boolean;\n getEdgeAttribute: (a: string, b: string, k: string) => unknown;\n setEdgeAttribute: (a: string, b: string, k: string, v: unknown) => void;\n};\n\nexport function partitionGraph(\n G: GraphLike,\n louvain: (g: unknown, o: { resolution?: number; rng?: () => number }) => Record<string, number>,\n opts: { maxLevels?: number; minSize?: number; seed?: number } = {},\n): Array<{ level: number; members: string[] }> {\n const maxLevels = opts.maxLevels ?? MAX_HIERARCHY_LEVELS;\n const minSize = opts.minSize ?? MIN_COMMUNITY_SIZE;\n const seed = opts.seed ?? LOUVAIN_SEED;\n const communities: Array<{ level: number; members: string[] }> = [];\n const seen = new Set<string>();\n for (let level = 0; level < maxLevels; level++) {\n const resolution = 1.0 / (level + 1);\n const assignment = louvain(G, { resolution, rng: mulberry32(seed + level) });\n const buckets = new Map<number, string[]>();\n for (const [node, cid] of Object.entries(assignment)) {\n const list = buckets.get(cid) ?? [];\n list.push(node);\n buckets.set(cid, list);\n }\n const kept = [...buckets.values()].filter((m) => m.length >= minSize).map((m) => [...m].sort());\n const key = JSON.stringify([...kept].map((m) => [...m].sort()).sort());\n if (seen.has(key)) continue;\n seen.add(key);\n for (const members of kept) communities.push({ level, members });\n }\n return communities;\n}\n\nasync function loadLouvain(): Promise<(g: unknown, o: unknown) => Record<string, number>> {\n const mod = await requireExtra<{ default?: unknown }>(\n \"graphology-communities-louvain\",\n \"graph\",\n \"community detection\",\n );\n const fn = mod.default ?? mod;\n return fn as (g: unknown, o: unknown) => Record<string, number>;\n}\n\nasync function detectWithPython(pool: Pool): Promise<Array<{ level: number; entity_ids: string[] }>> {\n const entities = (await pool.query(`SELECT id FROM context_engine_entities`)).rows;\n if (entities.length < MIN_COMMUNITY_SIZE) return [];\n const entityMap = new Map<string, number>();\n const entityIds: string[] = [];\n entities.forEach((e, i) => {\n entityMap.set(String(e.id), i);\n entityIds.push(String(e.id));\n });\n const relationships = (\n await pool.query(`SELECT source_entity_id, target_entity_id FROM context_engine_entity_relationships`)\n ).rows;\n\n const graphology = await requireExtra<{ default?: new (o: { type: string }) => GraphLike }>(\n \"graphology\",\n \"graph\",\n \"community detection\",\n );\n const Graph = graphology.default;\n if (!Graph) throw new Error(\"graphology export shape is unexpected\");\n const louvain = await loadLouvain();\n\n const G = new Graph({ type: \"undirected\" });\n for (let i = 0; i < entities.length; i++) G.addNode(String(i));\n let hasEdge = false;\n for (const rel of relationships) {\n const src = entityMap.get(String(rel.source_entity_id));\n const tgt = entityMap.get(String(rel.target_entity_id));\n if (src != null && tgt != null && src !== tgt) {\n hasEdge = true;\n const a = String(src);\n const b = String(tgt);\n if (G.hasEdge(a, b)) {\n const w = Number(G.getEdgeAttribute(a, b, \"weight\") ?? 1);\n G.setEdgeAttribute(a, b, \"weight\", w + 1);\n } else {\n G.addEdge(a, b, { weight: 1 });\n }\n }\n }\n if (!hasEdge) return [];\n const partitions = partitionGraph(G as never, louvain);\n return partitions.map((p) => ({\n level: p.level,\n entity_ids: p.members.map((idx) => entityIds[Number(idx)]!),\n }));\n}\n\nasync function summarizeCommunities(\n pending: Array<Record<string, unknown>>,\n config: ContextEngineConfig,\n): Promise<Array<string | null>> {\n if (!pending.length || !config.graph.extractionLlm) return pending.map(() => null);\n const blocks = pending.map((pc, idx) => {\n const entityList = ((pc.entities as Array<Record<string, unknown>>) ?? []).slice(0, MAX_SUMMARY_ENTITIES);\n const entityLines = entityList.map((e) => ` - ${e.name} (${e.type}, mentioned ${e.frequency}x)`);\n const idToName = Object.fromEntries(entityList.map((e) => [String(e.id), e.name]));\n const relLines = ((pc.relationships as Array<Record<string, unknown>>) ?? []).map(\n (r) =>\n ` - ${idToName[String(r.source_entity_id)] ?? \"?\"} -> ${r.label} -> ${idToName[String(r.target_entity_id)] ?? \"?\"}`,\n );\n return (\n `COMMUNITY ${idx}:\\nEntities (${entityList.length}):\\n` +\n entityLines.join(\"\\n\") +\n `\\nRelationships (${relLines.length}):\\n` +\n (relLines.length ? relLines.join(\"\\n\") : \" None\")\n );\n });\n const prompt =\n \"Summarize each community below in 2-4 sentences.\\n\\n\" +\n blocks.join(\"\\n\\n\") +\n '\\n\\nReturn a JSON array with one summary string per community, in order: [\"summary 0\", \"summary 1\", ...]. Return ONLY the JSON array.';\n try {\n const { callLlm } = await import(\"../providers/llm.js\");\n const out = await callLlm(config.graph.extractionLlm, {\n system: SUMMARY_SYSTEM,\n user: prompt,\n jsonMode: true,\n });\n const raw = Array.isArray(out) ? out[0] : ((out as { text?: string }).text ?? String(out));\n let summaries: unknown[] = [];\n try {\n summaries = JSON.parse(jsonrepair(String(raw)));\n } catch {\n summaries = [];\n }\n if (!Array.isArray(summaries)) summaries = [];\n while (summaries.length < pending.length) summaries.push(null);\n return summaries.slice(0, pending.length).map((s) => (typeof s === \"string\" && s.trim() ? s : null));\n } catch (exc) {\n console.warn(\"community summarization failed:\", exc);\n return pending.map(() => null);\n }\n}\n\nexport async function detectCommunities(opts: {\n config: ContextEngineConfig;\n pool: Pool;\n embedder: Embedder;\n hooks?: Hooks | null;\n}): Promise<Record<string, unknown>> {\n const stats = { communities_detected: 0, communities_summarized: 0, primary_communities: 0 };\n const communities = await detectWithPython(opts.pool);\n stats.communities_detected = communities.length;\n const pending: Array<Record<string, unknown>> = [];\n for (const comm of communities) {\n const entityIds = comm.entity_ids;\n if (entityIds.length < MIN_COMMUNITY_SIZE) continue;\n const entities = (\n await opts.pool.query(`SELECT * FROM context_engine_entities WHERE id = ANY($1::uuid[])`, [entityIds])\n ).rows;\n if (entities.length < MIN_COMMUNITY_SIZE) continue;\n const rels = (\n await opts.pool.query(\n `SELECT * FROM context_engine_entity_relationships\n WHERE source_entity_id = ANY($1::uuid[]) AND target_entity_id = ANY($1::uuid[])\n LIMIT 50`,\n [entityIds],\n )\n ).rows;\n pending.push({\n entities,\n entity_ids: entityIds,\n entity_count: entityIds.length,\n rel_count: rels.length,\n relationships: rels,\n level: comm.level ?? 0,\n });\n }\n if (!pending.length) return stats;\n const summaries = await summarizeCommunities(pending, opts.config);\n const embeddings: Array<number[] | null> = summaries.map(() => null);\n const toEmbed = summaries\n .map((s, i) => [i, s] as const)\n .filter((x): x is readonly [number, string] => Boolean(x[1]));\n if (toEmbed.length) {\n try {\n const result = await opts.embedder.embed(\n toEmbed.map(([, s]) => s),\n { kind: \"document\" },\n );\n const vectors = Array.isArray(result)\n ? (result[0] as number[][])\n : ((result as { vectors?: number[][] }).vectors ?? []);\n toEmbed.forEach(([i], idx) => {\n embeddings[i] = vectors[idx] ? [...vectors[idx]!] : null;\n });\n } catch (exc) {\n if (opts.hooks) emitError(opts.hooks, exc, { stage: \"community_embedding\" });\n else console.warn(\"community embedding failed:\", exc);\n }\n }\n\n await opts.pool.query(`DELETE FROM context_engine_communities`);\n let primary = 0;\n for (let i = 0; i < pending.length; i++) {\n const pc = pending[i]!;\n const embedding = embeddings[i];\n await opts.pool.query(\n `INSERT INTO context_engine_communities\n (id, level, entity_ids, entity_count, relationship_count, summary, embedding)\n VALUES ($1, $2, $3::jsonb, $4, $5, $6, $7::vector)`,\n [\n randomUUID(),\n pc.level,\n JSON.stringify((pc.entity_ids as string[]).map(String)),\n pc.entity_count,\n pc.rel_count,\n summaries[i],\n embedding ? `[${embedding.join(\",\")}]` : null,\n ],\n );\n if (pc.level === 0) primary += 1;\n }\n stats.communities_summarized = pending.length;\n stats.primary_communities = primary;\n return stats;\n}\n","import { randomUUID } from \"node:crypto\";\nimport { jsonrepair } from \"jsonrepair\";\nimport type { Pool } from \"pg\";\nimport type { ContextEngineConfig } from \"../config.js\";\nimport type { GraphStore } from \"./neo4j-client.js\";\n\nexport const ENTITY_TYPES = [\n \"PERSON\",\n \"ORG\",\n \"PRODUCT\",\n \"LOCATION\",\n \"REFERENCE\",\n \"TEMPORAL\",\n \"CONCEPT\",\n] as const;\nexport type EntityType = (typeof ENTITY_TYPES)[number];\n\nexport const RELATIONSHIP_CATEGORIES = new Set([\n \"HIERARCHICAL\",\n \"MEMBERSHIP\",\n \"CREATION\",\n \"TEMPORAL\",\n \"SPATIAL\",\n \"REFERENCE\",\n \"FUNCTIONAL\",\n \"QUANTITATIVE\",\n]);\n\nexport const CHUNKS_PER_BATCH = 11;\n\nconst EXTRACTION_SYSTEM = \"You are a STRICT JSON entity and relationship extraction engine.\";\n\nexport function normalizeEntityName(name: string): string {\n return (name || \"\").toLowerCase().trim().replace(/ {2}/g, \" \");\n}\n\nfunction sharedSignificantTokens(a: string, b: string, minLen = 4): boolean {\n const tokensA = new Set(a.split(/\\s+/).filter((t) => t.length >= minLen));\n const tokensB = b.split(/\\s+/).filter((t) => t.length >= minLen);\n return tokensB.some((t) => tokensA.has(t));\n}\n\nfunction buildPrompt(fullText: string): string {\n return `Extract ALL entities and relationships from the following document text.\n\nDOCUMENT TEXT:\n${fullText}\n\nENTITY TYPES: PERSON, ORG, PRODUCT, LOCATION, REFERENCE, TEMPORAL, CONCEPT\n\nRELATIONSHIP CATEGORIES: HIERARCHICAL, MEMBERSHIP, CREATION, TEMPORAL, SPATIAL, REFERENCE, FUNCTIONAL, QUANTITATIVE\n\nOUTPUT FORMAT (STRICT JSON):\n{\n \"entities\": [\n {\"name\": \"exact text\", \"type\": \"PERSON|ORG|PRODUCT|LOCATION|REFERENCE|TEMPORAL|CONCEPT\"}\n ],\n \"relationships\": [\n {\"source\": \"entity name\", \"target\": \"entity name\", \"category\": \"CATEGORY\", \"label\": \"verb\", \"evidence\": \"brief quote\"}\n ]\n}\n\nRULES:\n- Extract EVERY meaningful entity (people, organizations, products, locations, codes, dates, concepts)\n- Choose the MOST SPECIFIC type; only use CONCEPT when no other type fits\n- Be exhaustive but do NOT invent entities not present in the text\n- Deduplicate: each entity appears once\n- Relationships: source/target MUST be entities you extracted; category MUST be one of the 8\n- Return ONLY the JSON object\n`;\n}\n\nfunction safeJsonParse(text: string, expected: \"object\" | \"array\"): unknown {\n const stripped = text.trim();\n try {\n const result = JSON.parse(stripped);\n if (expected === \"object\" && result && typeof result === \"object\" && !Array.isArray(result))\n return result;\n if (expected === \"array\" && Array.isArray(result)) return result;\n } catch {\n /* repair */\n }\n const repaired = JSON.parse(jsonrepair(stripped));\n return repaired;\n}\n\ntype Querier = { query: Pool[\"query\"] };\n\nexport async function resolveEntity(\n db: Querier,\n _name: string,\n normalizedName: string,\n entityType: string,\n): Promise<Record<string, unknown> | null> {\n const exact = await db.query(`SELECT * FROM context_engine_entities WHERE normalized_name = $1 LIMIT 1`, [\n normalizedName,\n ]);\n if (exact.rows[0]) return exact.rows[0];\n\n const trigram = await db.query(\n `SELECT id FROM context_engine_entities\n WHERE similarity(normalized_name, $1) > 0.75\n ORDER BY similarity(normalized_name, $1) DESC LIMIT 1`,\n [normalizedName],\n );\n if (trigram.rows[0]) {\n const row = await db.query(`SELECT * FROM context_engine_entities WHERE id = $1`, [trigram.rows[0].id]);\n return row.rows[0] ?? null;\n }\n\n const typed = await db.query(\n `SELECT id, normalized_name FROM context_engine_entities\n WHERE type = $2 AND similarity(normalized_name, $1) > 0.45\n ORDER BY similarity(normalized_name, $1) DESC LIMIT 5`,\n [normalizedName, entityType],\n );\n for (const row of typed.rows) {\n if (sharedSignificantTokens(normalizedName, String(row.normalized_name))) {\n const full = await db.query(`SELECT * FROM context_engine_entities WHERE id = $1`, [row.id]);\n return full.rows[0] ?? null;\n }\n }\n return null;\n}\n\nasync function extractFromText(\n fullText: string,\n config: ContextEngineConfig,\n): Promise<{\n entities: Array<Record<string, unknown>>;\n relationships: Array<Record<string, unknown>>;\n tokens: Record<string, number>;\n}> {\n try {\n const llm = config.graph.extractionLlm;\n if (!llm) return { entities: [], relationships: [], tokens: {} };\n const { callLlm } = await import(\"../providers/llm.js\");\n const out = await callLlm(llm, {\n system: EXTRACTION_SYSTEM,\n user: buildPrompt(fullText),\n jsonMode: true,\n });\n const raw = Array.isArray(out) ? out[0] : ((out as { text?: string }).text ?? String(out));\n const tokens = (Array.isArray(out) ? out[1] : (out as { tokens?: Record<string, number> }).tokens) ?? {};\n let result: Record<string, unknown> = {};\n try {\n result = (safeJsonParse(String(raw), \"object\") as Record<string, unknown>) ?? {};\n } catch {\n result = {};\n }\n const entities = ((result.entities as unknown[]) ?? []).filter((e): e is Record<string, unknown> =>\n Boolean(e && typeof e === \"object\" && (e as { name?: unknown }).name && (e as { type?: unknown }).type),\n );\n const relationships = ((result.relationships as unknown[]) ?? []).filter(\n (r): r is Record<string, unknown> =>\n Boolean(\n r &&\n typeof r === \"object\" &&\n (r as { source?: unknown }).source &&\n (r as { target?: unknown }).target,\n ),\n );\n return { entities, relationships, tokens: tokens as Record<string, number> };\n } catch (exc) {\n console.error(\"entity extraction LLM call failed:\", exc);\n return { entities: [], relationships: [], tokens: {} };\n }\n}\n\nasync function loadDocumentChunks(pool: Pool, documentId: string): Promise<Array<Record<string, unknown>>> {\n const result = await pool.query(\n `SELECT id, text, idx, source_id, meta_data FROM context_engine_chunks WHERE document_id = $1 ORDER BY idx`,\n [documentId],\n );\n return result.rows.map((c) => ({\n id: c.id,\n text: c.text || \"\",\n text_lower: String(c.text || \"\").toLowerCase(),\n idx: c.idx || 0,\n source_id: c.source_id,\n token_count:\n (c.meta_data as { token_count?: number } | null)?.token_count ??\n Math.floor(String(c.text || \"\").length / 4),\n }));\n}\n\nasync function persistExtraction(\n pool: Pool,\n chunkSnaps: Array<Record<string, unknown>>,\n extracted: { entities: Array<Record<string, unknown>>; relationships: Array<Record<string, unknown>> },\n): Promise<{ entities_created: number; entities_found: number; relationships_created: number }> {\n const stats = { entities_created: 0, entities_found: 0, relationships_created: 0 };\n const byNorm = new Map<string, Record<string, unknown>>();\n const client = await pool.connect();\n try {\n await client.query(\"BEGIN\");\n for (const entityData of extracted.entities) {\n const normalized = normalizeEntityName(String(entityData.name));\n if (!normalized) continue;\n const entityType = String(entityData.type);\n let entity = await resolveEntity(client, String(entityData.name), normalized, entityType);\n if (entity) {\n await client.query(\n `UPDATE context_engine_entities SET frequency = COALESCE(frequency, 1) + 1,\n name = CASE WHEN length($2) > length(name) THEN $2 ELSE name END, updated_at = now()\n WHERE id = $1`,\n [entity.id, entityData.name],\n );\n entity = (await client.query(`SELECT * FROM context_engine_entities WHERE id = $1`, [entity.id]))\n .rows[0];\n } else {\n const id = randomUUID();\n await client.query(\n `INSERT INTO context_engine_entities (id, name, normalized_name, type, frequency)\n VALUES ($1, $2, $3, $4, 1)`,\n [id, entityData.name, normalized, entityType],\n );\n entity = (await client.query(`SELECT * FROM context_engine_entities WHERE id = $1`, [id])).rows[0];\n stats.entities_created += 1;\n }\n byNorm.set(normalized, entity!);\n byNorm.set(String(entity!.normalized_name), entity!);\n const nameLower = String(entityData.name).toLowerCase();\n for (const snap of chunkSnaps) {\n if (nameLower && String(snap.text_lower).includes(nameLower)) {\n const exists = await client.query(\n `SELECT 1 FROM context_engine_chunk_entities WHERE chunk_id = $1 AND entity_id = $2`,\n [snap.id, entity!.id],\n );\n if (!exists.rows.length) {\n await client.query(\n `INSERT INTO context_engine_chunk_entities (chunk_id, entity_id) VALUES ($1, $2)`,\n [snap.id, entity!.id],\n );\n stats.entities_found += 1;\n }\n }\n }\n }\n for (const rel of extracted.relationships) {\n const sourceNorm = normalizeEntityName(String(rel.source ?? \"\"));\n const targetNorm = normalizeEntityName(String(rel.target ?? \"\"));\n const category = String(rel.category ?? \"\").toUpperCase();\n const label = String(rel.label ?? \"\");\n const evidence = String(rel.evidence ?? \"\");\n if (!RELATIONSHIP_CATEGORIES.has(category)) continue;\n let src = byNorm.get(sourceNorm);\n let tgt = byNorm.get(targetNorm);\n if (!src) {\n src = (\n await client.query(`SELECT * FROM context_engine_entities WHERE normalized_name = $1`, [sourceNorm])\n ).rows[0];\n }\n if (!tgt) {\n tgt = (\n await client.query(`SELECT * FROM context_engine_entities WHERE normalized_name = $1`, [targetNorm])\n ).rows[0];\n }\n if (!src || !tgt) continue;\n const exists = await client.query(\n `SELECT 1 FROM context_engine_entity_relationships\n WHERE source_entity_id = $1 AND target_entity_id = $2 AND category = $3 AND label = $4`,\n [src.id, tgt.id, category, label],\n );\n if (!exists.rows.length) {\n await client.query(\n `INSERT INTO context_engine_entity_relationships\n (id, source_entity_id, target_entity_id, category, label, evidence)\n VALUES ($1, $2, $3, $4, $5, $6)`,\n [randomUUID(), src.id, tgt.id, category, label, evidence.slice(0, 200)],\n );\n stats.relationships_created += 1;\n }\n }\n await client.query(\"COMMIT\");\n } catch (e) {\n await client.query(\"ROLLBACK\");\n throw e;\n } finally {\n client.release();\n }\n return stats;\n}\n\nasync function syncToNeo4j(\n pool: Pool,\n documentId: string,\n chunkSnaps: Array<Record<string, unknown>>,\n graphStore: GraphStore,\n): Promise<void> {\n const chunkRows = chunkSnaps.map((s) => ({\n id: String(s.id),\n document_id: String(documentId),\n source_id: s.source_id,\n text_preview: String(s.text).slice(0, 200),\n position: s.idx,\n token_count: s.token_count,\n }));\n try {\n await graphStore.connect();\n const entities = (await pool.query(`SELECT * FROM context_engine_entities`)).rows;\n const entityById = new Map(entities.map((e) => [String(e.id), e]));\n const entityRows = entities.map((e) => ({\n name: e.name,\n normalized_name: e.normalized_name,\n entity_type: e.type,\n }));\n const ids = chunkSnaps.map((s) => s.id);\n const links = ids.length\n ? (\n await pool.query(`SELECT * FROM context_engine_chunk_entities WHERE chunk_id = ANY($1::uuid[])`, [\n ids,\n ])\n ).rows\n : [];\n const mentionRows = links\n .filter((l) => entityById.has(String(l.entity_id)))\n .map((l) => ({\n chunk_id: String(l.chunk_id),\n entity_name: entityById.get(String(l.entity_id))!.normalized_name,\n }));\n const rels = (await pool.query(`SELECT * FROM context_engine_entity_relationships`)).rows;\n const relRows = [];\n for (const r of rels) {\n const src = entityById.get(String(r.source_entity_id));\n const tgt = entityById.get(String(r.target_entity_id));\n if (src && tgt) {\n relRows.push({\n source_name: src.normalized_name,\n target_name: tgt.normalized_name,\n category: r.category,\n label: r.label,\n evidence: r.evidence,\n chunk_id: r.chunk_id ? String(r.chunk_id) : null,\n });\n }\n }\n await graphStore.upsertChunksBatch(chunkRows);\n await graphStore.linkSequentialChunks(String(documentId));\n await graphStore.upsertEntitiesBatch(entityRows);\n await graphStore.linkChunksToEntitiesBatch(mentionRows);\n await graphStore.upsertEntityRelationshipsBatch(relRows);\n } catch (exc) {\n console.warn(\"Neo4j sync failed (continuing on PG mirror):\", exc);\n }\n}\n\nexport async function extractEntitiesForDocument(\n documentId: string,\n opts: {\n config: ContextEngineConfig;\n pool: Pool;\n graphStore?: GraphStore | null;\n hooks?: unknown;\n },\n): Promise<Record<string, unknown>> {\n const chunkSnaps = await loadDocumentChunks(opts.pool, documentId);\n const stats: Record<string, unknown> = {\n chunk_count: chunkSnaps.length,\n entities_created: 0,\n entities_found: 0,\n relationships_created: 0,\n provider_tokens: {},\n };\n if (!chunkSnaps.length) return stats;\n\n const batches = [];\n for (let i = 0; i < chunkSnaps.length; i += CHUNKS_PER_BATCH) {\n batches.push(chunkSnaps.slice(i, i + CHUNKS_PER_BATCH));\n }\n let llmInput = 0;\n let llmOutput = 0;\n for (const batch of batches) {\n const fullText = batch.map((s) => String(s.text)).join(\"\\n\\n\");\n const extracted = await extractFromText(fullText, opts.config);\n llmInput += Number(extracted.tokens.input ?? 0);\n llmOutput += Number(extracted.tokens.output ?? 0);\n const persisted = await persistExtraction(opts.pool, batch, extracted);\n stats.entities_created = Number(stats.entities_created) + persisted.entities_created;\n stats.entities_found = Number(stats.entities_found) + persisted.entities_found;\n stats.relationships_created = Number(stats.relationships_created) + persisted.relationships_created;\n }\n const tokens = stats.provider_tokens as Record<string, number>;\n if (llmInput) tokens.graph_llm_input = llmInput;\n if (llmOutput) tokens.graph_llm_output = llmOutput;\n if (opts.graphStore) await syncToNeo4j(opts.pool, documentId, chunkSnaps, opts.graphStore);\n return stats;\n}\n","const CONSTRAINTS = [\n \"CREATE CONSTRAINT ce_chunk_unique IF NOT EXISTS FOR (c:Chunk) REQUIRE c.id IS UNIQUE\",\n \"CREATE CONSTRAINT ce_entity_unique IF NOT EXISTS FOR (e:Entity) REQUIRE e.normalized_name IS UNIQUE\",\n];\n\nconst INDEXES = [\n \"CREATE INDEX ce_entity_type_idx IF NOT EXISTS FOR (e:Entity) ON (e.type)\",\n \"CREATE INDEX ce_chunk_source_idx IF NOT EXISTS FOR (c:Chunk) ON (c.source_id)\",\n \"CREATE INDEX ce_chunk_docid_idx IF NOT EXISTS FOR (c:Chunk) ON (c.document_id)\",\n];\n\nexport async function ensureSchema(\n driver: {\n session: (opts: { database: string }) => {\n executeWrite?: unknown;\n run?: unknown;\n close: () => Promise<void>;\n };\n },\n database: string,\n): Promise<void> {\n const session = (\n driver as {\n session: (o: { database: string }) => {\n run: (q: string) => Promise<unknown>;\n close: () => Promise<void>;\n };\n }\n ).session({\n database,\n });\n try {\n for (const stmt of [...CONSTRAINTS, ...INDEXES]) {\n try {\n await session.run(stmt);\n } catch (exc) {\n console.error(\"Neo4j schema statement FAILED:\", stmt.split(\" \")[2], exc);\n }\n }\n } finally {\n await session.close();\n }\n}\n","import { createHash } from \"node:crypto\";\nimport type { GraphConfig } from \"../config.js\";\nimport { requireExtra } from \"../extras.js\";\nimport { emitError, type Hooks } from \"../hooks.js\";\nimport { ensureSchema } from \"./schema.js\";\n\nconst SYNC_BATCH_ROWS = 1000;\nconst MAX_EXPANSION = 500;\n\ntype Neo4jDriver = {\n session: (opts: { database: string }) => Neo4jSession;\n close: () => Promise<void>;\n};\ntype Neo4jSession = {\n run: (\n query: string,\n params?: Record<string, unknown>,\n ) => Promise<{ records: Array<{ get: (k: string) => unknown }>; values?: () => Promise<unknown[][]> }>;\n close: () => Promise<void>;\n};\n\nexport class GraphStore {\n cfg: GraphConfig;\n hooks: Hooks | null | undefined;\n database: string;\n driver: Neo4jDriver | null = null;\n private schemaReady = false;\n private cache = new Map<string, { expiresAt: number; value: unknown }>();\n private generation = 0;\n\n constructor(cfg: GraphConfig, opts: { hooks?: Hooks | null } = {}) {\n this.cfg = cfg;\n this.hooks = opts.hooks;\n this.database = cfg.neo4jDatabase;\n }\n\n async connect(): Promise<void> {\n if (this.driver) return;\n const neo4j = await requireExtra<{\n default?: {\n driver: (uri: string, auth: unknown) => Neo4jDriver;\n auth: { basic: (u: string, p: string) => unknown };\n };\n driver?: (uri: string, auth: unknown) => Neo4jDriver;\n auth?: { basic: (u: string, p: string) => unknown };\n }>(\"neo4j-driver\", \"graph\", \"graph features\");\n const ns = neo4j.default ?? neo4j;\n const driverFn = ns.driver;\n const auth = ns.auth;\n if (!driverFn || !auth) throw new Error(\"neo4j-driver export shape is unexpected\");\n const driver = driverFn(this.cfg.neo4jUri!, auth.basic(this.cfg.neo4jUser, this.cfg.neo4jPassword!));\n this.driver = driver;\n if (!this.schemaReady) {\n await ensureSchema(driver, this.database);\n this.schemaReady = true;\n }\n }\n\n async close(): Promise<void> {\n if (this.driver) {\n await this.driver.close();\n this.driver = null;\n this.schemaReady = false;\n }\n }\n\n async ping(timeout = 2000): Promise<boolean> {\n try {\n await this.connect();\n await Promise.race([\n this.pingInternal(),\n new Promise((_, reject) => setTimeout(() => reject(new Error(\"timeout\")), timeout)),\n ]);\n return true;\n } catch (exc) {\n this.report(exc, { service: \"neo4j\", operation: \"ping\" });\n return false;\n }\n }\n\n private async pingInternal(): Promise<void> {\n const session = this.driver!.session({ database: this.database });\n try {\n await session.run(\"RETURN 1 AS ping\");\n } finally {\n await session.close();\n }\n }\n\n private report(exc: unknown, ctx: Record<string, unknown>): void {\n if (this.hooks) emitError(this.hooks, exc, ctx);\n else console.error(\"neo4j error:\", exc, \"| ctx=\", ctx);\n }\n\n private cacheGet(key: string): unknown {\n const entry = this.cache.get(key);\n if (!entry) return null;\n if (entry.expiresAt > Date.now() / 1000) return entry.value;\n this.cache.delete(key);\n return null;\n }\n\n private cacheSet(key: string, value: unknown, ttl = 86400): void {\n this.cache.set(key, { expiresAt: Date.now() / 1000 + ttl, value });\n }\n\n async upsertChunksBatch(rows: Array<Record<string, unknown>>): Promise<number> {\n const query = `\n UNWIND $rows AS row\n MERGE (c:Chunk {id: row.id})\n SET c.document_id = row.document_id,\n c.source_id = row.source_id,\n c.text_preview = row.text_preview,\n c.position = row.position,\n c.token_count = row.token_count,\n c.updated_at = datetime()\n `;\n return this.runBatched(query, rows);\n }\n\n async upsertEntitiesBatch(rows: Array<Record<string, unknown>>): Promise<number> {\n const query = `\n UNWIND $rows AS row\n MERGE (e:Entity {normalized_name: row.normalized_name})\n SET e.name = row.name,\n e.type = row.entity_type,\n e.created_at = coalesce(e.created_at, datetime()),\n e.updated_at = datetime()\n `;\n return this.runBatched(query, rows);\n }\n\n async linkChunksToEntitiesBatch(rows: Array<Record<string, unknown>>): Promise<number> {\n const query = `\n UNWIND $rows AS row\n MATCH (c:Chunk {id: row.chunk_id})\n MATCH (e:Entity {normalized_name: row.entity_name})\n MERGE (c)-[:MENTIONS]->(e)\n `;\n return this.runBatched(query, rows);\n }\n\n async upsertEntityRelationshipsBatch(rows: Array<Record<string, unknown>>): Promise<number> {\n const query = `\n UNWIND $rows AS row\n MATCH (src:Entity {normalized_name: row.source_name})\n MATCH (tgt:Entity {normalized_name: row.target_name})\n MERGE (src)-[r:RELATES_TO {category: row.category, label: row.label}]->(tgt)\n SET r.evidence = row.evidence,\n r.chunk_id = row.chunk_id,\n r.updated_at = datetime()\n `;\n return this.runBatched(query, rows);\n }\n\n async linkSequentialChunks(documentId: string): Promise<void> {\n const query = `\n MATCH (c:Chunk {document_id: $document_id})\n WITH c ORDER BY c.position\n WITH COLLECT(c) AS chunks\n UNWIND RANGE(0, SIZE(chunks)-2) AS i\n WITH chunks[i] AS curr, chunks[i+1] AS next\n MERGE (curr)-[:NEXT]->(next)\n `;\n await this.connect();\n const session = this.driver!.session({ database: this.database });\n try {\n await session.run(query, { document_id: String(documentId) });\n } finally {\n await session.close();\n }\n this.generation += 1;\n }\n\n private async runBatched(query: string, rows: Array<Record<string, unknown>>): Promise<number> {\n if (!rows.length) return 0;\n await this.connect();\n let done = 0;\n const session = this.driver!.session({ database: this.database });\n try {\n for (let i = 0; i < rows.length; i += SYNC_BATCH_ROWS) {\n const batch = rows.slice(i, i + SYNC_BATCH_ROWS);\n await session.run(query, { rows: batch });\n done += batch.length;\n }\n } finally {\n await session.close();\n }\n this.generation += 1;\n return done;\n }\n\n async deleteSourceData(sourceId: string): Promise<{ chunks_deleted: number }> {\n await this.connect();\n const session = this.driver!.session({ database: this.database });\n try {\n const result = await session.run(\n \"MATCH (c:Chunk {source_id: $source_id}) DETACH DELETE c RETURN count(c) AS n\",\n { source_id: String(sourceId) },\n );\n const deleted = Number(result.records[0]?.get(\"n\") ?? 0);\n this.generation += 1;\n return { chunks_deleted: deleted };\n } finally {\n await session.close();\n }\n }\n\n private expansionCacheKey(queryEntities: string[], maxDepth: number, chunkIds: string[]): string {\n const chunkDigest = createHash(\"md5\")\n .update([...chunkIds].sort().join(\",\"))\n .digest(\"hex\");\n const keyContent = `g${this.generation}:${JSON.stringify([...queryEntities].sort())}:${maxDepth}:${chunkDigest}`;\n return `expansion:${createHash(\"md5\").update(keyContent).digest(\"hex\")}`;\n }\n\n async expandChunkSet(chunkIds: string[], queryEntities: string[], maxDepth = 2): Promise<string[]> {\n if (!chunkIds.length) return [];\n const depth = Math.max(1, Math.min(Math.trunc(maxDepth), 5));\n const cacheKey = this.expansionCacheKey(queryEntities, depth, chunkIds);\n const cached = this.cacheGet(cacheKey);\n if (Array.isArray(cached)) return cached as string[];\n\n const query = `\n MATCH (c:Chunk)\n WHERE c.id IN $chunk_ids\n WITH COLLECT(DISTINCT c) AS seeds\n\n CALL {\n WITH seeds\n UNWIND seeds AS c\n OPTIONAL MATCH (c)-[:MENTIONS]->(e:Entity)<-[:MENTIONS]-(related:Chunk)\n WHERE e.normalized_name IN $query_entities\n RETURN COLLECT(DISTINCT related.id) AS related_ids\n }\n CALL {\n WITH seeds\n UNWIND seeds AS c\n OPTIONAL MATCH (c)-[:NEXT*1..${depth}]-(sequential:Chunk)\n RETURN COLLECT(DISTINCT sequential.id) AS sequential_ids\n }\n\n WITH [s IN seeds | s.id] + related_ids + sequential_ids AS all_ids\n UNWIND all_ids AS chunk_id\n WITH chunk_id WHERE chunk_id IS NOT NULL\n RETURN DISTINCT chunk_id\n LIMIT $max_results\n `;\n await this.connect();\n const session = this.driver!.session({ database: this.database });\n try {\n const result = await session.run(query, {\n chunk_ids: chunkIds,\n query_entities: queryEntities,\n max_results: MAX_EXPANSION,\n });\n const expanded = result.records\n .map((r) => r.get(\"chunk_id\"))\n .filter((v) => v != null)\n .map(String);\n if (expanded.length) this.cacheSet(cacheKey, expanded);\n return expanded;\n } finally {\n await session.close();\n }\n }\n\n async getChunkConnectivityScores(chunkIds: string[]): Promise<Record<string, number>> {\n if (!chunkIds.length) return {};\n const query = `\n UNWIND $chunk_ids AS chunk_id\n MATCH (c:Chunk {id: chunk_id})\n OPTIONAL MATCH (c)-[out_next:NEXT]->()\n OPTIONAL MATCH (c)-[out_mentions:MENTIONS]->()\n OPTIONAL MATCH (c)<-[in_next:NEXT]-()\n OPTIONAL MATCH (c)<-[in_mentions:MENTIONS]-()\n WITH c.id AS id,\n count(DISTINCT out_next) + count(DISTINCT out_mentions) AS outgoing,\n count(DISTINCT in_next) + count(DISTINCT in_mentions) AS incoming\n RETURN id, (outgoing + incoming) AS total_connections\n `;\n await this.connect();\n const session = this.driver!.session({ database: this.database });\n try {\n const result = await session.run(query, { chunk_ids: chunkIds });\n const records = result.records.map((r) => ({\n id: String(r.get(\"id\")),\n total_connections: Number(r.get(\"total_connections\")),\n }));\n if (!records.length) return {};\n const maxConnections = Math.max(...records.map((r) => r.total_connections));\n if (maxConnections === 0) {\n return Object.fromEntries(records.map((r) => [r.id, 0.5]));\n }\n return Object.fromEntries(\n records.map((r) => [r.id, Math.min(1.0, r.total_connections / maxConnections)]),\n );\n } finally {\n await session.close();\n }\n }\n}\n","import type { Pool } from \"pg\";\nimport type { ContextEngineConfig } from \"../config.js\";\nimport { emitError, type Hooks } from \"../hooks.js\";\nimport type { Embedder } from \"../providers/embeddings.js\";\nimport type { AnnTunable } from \"../storage.js\";\nimport type { GraphStore } from \"./neo4j-client.js\";\n\nconst DEFAULT_WEIGHTS = {\n vector_score: 0.3,\n entity_match: 0.3,\n relationship_relevance: 0.2,\n community_match: 0.1,\n graph_connectivity: 0.1,\n};\n\nconst SEED_LIMIT = 200;\nconst ENTITY_LIMIT = 30;\nconst TOP_SEEDS_FOR_ENTITIES = 20;\n\n// The scope predicate. Textually a copy of storage.ts's SCOPE — which is the\n// canonical one — because these queries number their placeholders differently\n// ($2/$3/$4 here, $1/$2/$3 there) and pg binds are POSITIONAL, so the string\n// cannot be shared without renumbering every query on one side. Any change to\n// the canonical predicate must be made here too. Never widen it.\n//\n// $3 is cast to uuid[] so the predicate can use the document_id index —\n// same reasoning as storage.ts's SCOPE.\nconst SCOPE = `\n AND ($2::text[] IS NULL OR c.source_id = ANY($2::text[]))\n AND ($3::uuid[] IS NULL OR c.document_id = ANY($3::uuid[]))\n AND ($4::text[] IS NULL OR c.acl IS NULL OR c.acl && $4::text[])\n`;\n\nfunction vecLiteral(vector: number[]): string {\n return `[${vector.map((x) => Number(x)).join(\",\")}]`;\n}\n\nexport async function corpusIsAclUniform(pool: Pool, sourceIds: string[] | null): Promise<boolean> {\n const result = await pool.query(\n `SELECT EXISTS(SELECT 1 FROM context_engine_chunks c\n WHERE c.acl IS NOT NULL AND ($1::text[] IS NULL OR c.source_id = ANY($1::text[]))) AS has_acl`,\n [sourceIds],\n );\n return !result.rows[0]?.has_acl;\n}\n\nexport async function shouldUseCommunitySummaries(\n pool: Pool,\n opts: { sourceIds: string[] | null; principals: string[] | null },\n): Promise<boolean> {\n if (opts.principals == null) return true;\n return corpusIsAclUniform(pool, opts.sourceIds);\n}\n\nasync function deriveQueryEntities(\n pool: Pool,\n chunkIds: string[],\n opts: { sourceIds: string[] | null; documentIds?: string[] | null; principals: string[] | null },\n): Promise<Array<Record<string, unknown>>> {\n if (!chunkIds.length) return [];\n const result = await pool.query(\n `SELECT e.normalized_name, e.name, e.type, COUNT(*) AS freq\n FROM context_engine_chunk_entities ce\n JOIN context_engine_entities e ON e.id = ce.entity_id\n JOIN context_engine_chunks c ON c.id = ce.chunk_id\n WHERE ce.chunk_id = ANY($1::uuid[]) ${SCOPE}\n GROUP BY e.normalized_name, e.name, e.type\n ORDER BY freq DESC LIMIT $5`,\n [chunkIds, opts.sourceIds, opts.documentIds ?? null, opts.principals, ENTITY_LIMIT],\n );\n return result.rows.map((r) => ({\n normalized_name: r.normalized_name,\n name: r.name,\n type: r.type,\n }));\n}\n\nasync function computeVectorScores(\n pool: Pool,\n chunkIds: string[],\n vector: number[],\n): Promise<Record<string, number>> {\n if (!chunkIds.length || !vector) return {};\n const result = await pool.query(\n `SELECT c.id::text, 1 - (c.embedding <=> CAST($2 AS vector))::float AS sim\n FROM context_engine_chunks c\n WHERE c.id = ANY($1::uuid[]) AND c.embedding IS NOT NULL`,\n [chunkIds, vecLiteral(vector)],\n );\n let scores = Object.fromEntries(result.rows.map((r) => [String(r.id), Number(r.sim)]));\n const vs = Object.values(scores);\n if (vs.length) {\n const lo = Math.min(...vs);\n const hi = Math.max(...vs);\n if (hi > lo)\n scores = Object.fromEntries(Object.entries(scores).map(([k, v]) => [k, (v - lo) / (hi - lo)]));\n }\n return scores;\n}\n\nasync function computeRelationshipScores(\n pool: Pool,\n chunkIds: string[],\n queryEntityNames: string[],\n): Promise<Record<string, number>> {\n if (!chunkIds.length || !queryEntityNames.length) return {};\n const result = await pool.query(\n `SELECT r.chunk_id::text, COUNT(*) AS n\n FROM context_engine_entity_relationships r\n JOIN context_engine_entities se ON se.id = r.source_entity_id\n JOIN context_engine_entities te ON te.id = r.target_entity_id\n WHERE r.chunk_id = ANY($1::uuid[])\n AND (se.normalized_name = ANY($2::text[]) OR te.normalized_name = ANY($2::text[]))\n GROUP BY r.chunk_id`,\n [chunkIds, queryEntityNames],\n );\n const counts = Object.fromEntries(result.rows.map((r) => [String(r.chunk_id), Number(r.n)]));\n if (!Object.keys(counts).length) return {};\n const mx = Math.max(...Object.values(counts));\n return mx ? Object.fromEntries(Object.entries(counts).map(([cid, n]) => [cid, n / mx])) : {};\n}\n\nasync function computeCommunityScores(\n pool: Pool,\n chunkIds: string[],\n vector: number[],\n opts: {\n sourceIds: string[] | null;\n documentIds?: string[] | null;\n principals: string[] | null;\n useSummaries: boolean;\n },\n): Promise<Record<string, number>> {\n if (!opts.useSummaries || !chunkIds.length || !vector) return {};\n const commRows = await pool.query(\n `SELECT entity_ids, 1 - (embedding <=> CAST($1 AS vector))::float AS sim\n FROM context_engine_communities WHERE embedding IS NOT NULL\n ORDER BY embedding <=> CAST($1 AS vector) LIMIT 5`,\n [vecLiteral(vector)],\n );\n if (!commRows.rows.length) return {};\n const entityScore: Record<string, number> = {};\n for (const row of commRows.rows) {\n const sim = Number(row.sim);\n if (sim < 0.15) continue;\n for (const eid of row.entity_ids ?? []) {\n entityScore[String(eid)] = Math.max(entityScore[String(eid)] ?? 0, sim);\n }\n }\n if (!Object.keys(entityScore).length) return {};\n const result = await pool.query(\n `SELECT ce.chunk_id::text, ce.entity_id::text\n FROM context_engine_chunk_entities ce\n JOIN context_engine_chunks c ON c.id = ce.chunk_id\n WHERE ce.chunk_id = ANY($1::uuid[]) AND ce.entity_id = ANY($5::uuid[]) ${SCOPE}`,\n [chunkIds, opts.sourceIds, opts.documentIds ?? null, opts.principals, Object.keys(entityScore)],\n );\n const chunkScores: Record<string, number> = {};\n for (const row of result.rows) {\n chunkScores[row.chunk_id] = Math.max(chunkScores[row.chunk_id] ?? 0, entityScore[row.entity_id] ?? 0);\n }\n return chunkScores;\n}\n\n/** ACL-scoped vector seed search → top chunk ids (best first). Exported for\n * tests.\n *\n * `documentIds` participates at GENERATION time, not only in the caller's\n * post-filter: with a narrow document scope inside a large source,\n * off-document seeds would fill the whole SEED_LIMIT budget, the post-filter\n * would empty the leg, and the search would silently degrade to hybrid — the\n * post-filter recall-collapse class the ANN/ACL leg already fixed.\n *\n * `backend` is the chunk-plane backend the caller already owns, and it is here\n * for one reason: this is an ANN scan with `SCOPE` applied ON TOP of the index\n * walk, the identical shape `PostgresBackend.tuneAnnScan` corrects for the\n * vector leg. Untuned, the walk keeps at most `hnsw.ef_search` (40) candidates\n * before the filter runs, so a principal with a small visible slice gets few or\n * zero seeds and the whole graph leg quietly degrades to hybrid. The tuning is\n * `SET LOCAL`, hence the explicit client and transaction: it has to be the\n * connection the seed query itself runs on. A backend without the knobs\n * (non-Postgres, or none passed) is skipped.\n */\nexport async function vectorSeedIds(\n pool: Pool,\n vector: number[],\n opts: {\n sourceIds: string[] | null;\n documentIds?: string[] | null;\n principals: string[] | null;\n backend?: Partial<AnnTunable> | null;\n },\n): Promise<string[]> {\n const binds = [opts.sourceIds, opts.documentIds ?? null, opts.principals];\n // Same rule the vector leg derives `scoped` by, read off the ONE bind array\n // so a new scope dimension cannot be silently left out of it.\n const scoped = binds.some((v) => v !== null);\n const client = await pool.connect();\n try {\n await client.query(\"BEGIN\");\n await opts.backend?.tuneAnnScan?.(client, SEED_LIMIT, scoped);\n const result = await client.query(\n `SELECT c.id::text FROM context_engine_chunks c\n WHERE c.embedding IS NOT NULL ${SCOPE}\n ORDER BY c.embedding <=> CAST($1 AS vector) LIMIT $5`,\n [vecLiteral(vector), ...binds, SEED_LIMIT],\n );\n await client.query(\"COMMIT\");\n return result.rows.map((r) => String(r.id));\n } catch (err) {\n try {\n await client.query(\"ROLLBACK\");\n } catch {\n /* ignore */\n }\n throw err;\n } finally {\n client.release();\n }\n}\n\nexport async function buildGraphRanked(\n query: string,\n opts: {\n config: ContextEngineConfig;\n pool: Pool;\n embedder: Embedder;\n graphStore: GraphStore;\n hooks?: Hooks | null;\n sourceIds?: string[] | null;\n documentIds?: string[] | null;\n principals?: string[] | null;\n maxDepth?: number;\n backend?: Partial<AnnTunable> | null;\n },\n): Promise<string[]> {\n try {\n const result = await opts.embedder.embed([query], { kind: \"query\" });\n const vectors = Array.isArray(result)\n ? (result[0] as number[][])\n : ((result as { vectors?: number[][] }).vectors ?? []);\n const vector = vectors[0] ? [...vectors[0]] : null;\n if (!vector) return [];\n const sourceIds = opts.sourceIds ?? null;\n const documentIds = opts.documentIds ?? null;\n const principals = opts.principals ?? null;\n const seeds = await vectorSeedIds(opts.pool, vector, {\n sourceIds,\n documentIds,\n principals,\n backend: opts.backend,\n });\n if (!seeds.length) return [];\n const queryEntities = await deriveQueryEntities(opts.pool, seeds.slice(0, TOP_SEEDS_FOR_ENTITIES), {\n sourceIds,\n documentIds,\n principals,\n });\n const entityNorms = queryEntities.map((e) => String(e.normalized_name));\n\n let expanded: string[] = seeds;\n let connectivity: Record<string, number> = {};\n try {\n await opts.graphStore.connect();\n expanded = await opts.graphStore.expandChunkSet(seeds, entityNorms, opts.maxDepth ?? 2);\n connectivity = await opts.graphStore.getChunkConnectivityScores(expanded.length ? expanded : seeds);\n } catch (exc) {\n if (opts.hooks) emitError(opts.hooks, exc, { stage: \"graph_expand\" });\n else console.warn(\"graph leg: expansion failed:\", exc);\n expanded = seeds;\n connectivity = {};\n }\n const allIds = expanded.length ? expanded : seeds;\n const useSummaries = await shouldUseCommunitySummaries(opts.pool, { sourceIds, principals });\n const vecScores = await computeVectorScores(opts.pool, allIds, vector);\n const relScores = await computeRelationshipScores(opts.pool, allIds, entityNorms);\n const commScores = await computeCommunityScores(opts.pool, allIds, vector, {\n sourceIds,\n documentIds,\n principals,\n useSummaries,\n });\n const textRows = await opts.pool.query(\n `SELECT id::text, lower(coalesce(text,'')) AS t FROM context_engine_chunks WHERE id = ANY($1::uuid[])`,\n [allIds],\n );\n const texts = Object.fromEntries(textRows.rows.map((r) => [String(r.id), String(r.t)]));\n const weights = {\n ...DEFAULT_WEIGHTS,\n ...((\n opts.config.graph as {\n rerankWeights?: Record<string, number>;\n rerank_weights?: Record<string, number>;\n }\n ).rerankWeights ??\n (opts.config.graph as { rerank_weights?: Record<string, number> }).rerank_weights ??\n {}),\n };\n const entityNameSet = new Set(entityNorms);\n const scored: Array<[string, number]> = [];\n for (const cidRaw of allIds) {\n const cid = String(cidRaw);\n if (!(cid in texts)) continue;\n const v = vecScores[cid] ?? 0.5;\n const chunkText = texts[cid] ?? \"\";\n const matches = [...entityNameSet].filter((n) => n && chunkText.includes(n)).length;\n const e = entityNameSet.size ? Math.min(1.0, matches / Math.max(1, entityNameSet.size)) : 0;\n const r = relScores[cid] ?? 0;\n const cm = commScores[cid] ?? 0;\n const gc = connectivity[cid] ?? 0.5;\n const final =\n v * weights.vector_score +\n e * weights.entity_match +\n r * weights.relationship_relevance +\n cm * weights.community_match +\n gc * weights.graph_connectivity;\n scored.push([cid, final]);\n }\n scored.sort((a, b) => b[1] - a[1]);\n return scored.map(([cid]) => cid);\n } catch (exc) {\n if (opts.hooks) emitError(opts.hooks, exc, { stage: \"graph_embed_query\" });\n else console.warn(\"graph leg: query embed failed:\", exc);\n return [];\n }\n}\n","export type UsageKind = \"ingest\" | \"search\" | \"tool\";\n\nexport interface UsageEvent {\n kind: UsageKind;\n units: number;\n detail?: Record<string, unknown>;\n providerTokens?: Record<string, number>;\n}\n\nexport interface DocumentReport {\n documentId: string;\n name: string;\n status: string;\n pages: number | null;\n chunks: number;\n units: number;\n graphUnits: number;\n providerTokens: Record<string, number>;\n error: string | null;\n redactionFailed: string[];\n // WHY the document has less text than it should, when extraction knows —\n // see the extraction module's `UnreadableReason` for the canonical\n // semantics. Optional so the non-extracting report sites (skipped,\n // pending, upgraded) claim nothing.\n unreadableReason?: string | null;\n unreadablePages?: number;\n}\n\nexport interface IngestReport {\n documents: DocumentReport[];\n totals: {\n files: number;\n failed: number;\n units: number;\n graphUnits: number;\n [key: string]: number;\n };\n}\n\nconst PPTX_MIMES = new Set([\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n \"application/vnd.ms-powerpoint\",\n]);\nconst DOCX_MIMES = new Set([\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n \"application/msword\",\n]);\n\nexport function unitsForFile(\n mime: string,\n opts: { pages: number | null; slides: number | null; sizeBytes: number },\n): number {\n const m = mime || \"\";\n if (m === \"application/pdf\") return Math.max(1, opts.pages ?? 0);\n if (PPTX_MIMES.has(m)) return Math.max(1, opts.slides ?? 0);\n if (DOCX_MIMES.has(m)) return Math.max(1, opts.pages ?? 0);\n if (m.startsWith(\"image/\")) return 1;\n return Math.max(1, Math.ceil(opts.sizeBytes / (1024 * 1024)));\n}\n\nexport function graphUnits(chunkCount: number, primaryCommunityCount: number): number {\n return Math.ceil(chunkCount / 8) + primaryCommunityCount;\n}\n","import type { Pool } from \"pg\";\nimport type { ContextEngineConfig } from \"../config.js\";\nimport type { Hooks } from \"../hooks.js\";\nimport type { Embedder } from \"../providers/embeddings.js\";\nimport { graphUnits } from \"../usage.js\";\nimport { detectCommunities } from \"./communities.js\";\nimport { extractEntitiesForDocument } from \"./entities.js\";\nimport type { GraphStore } from \"./neo4j-client.js\";\n\nexport async function runGraphStage(opts: {\n documentId: string;\n config: ContextEngineConfig;\n hooks?: Hooks | null;\n pool: Pool;\n embedder: Embedder;\n graphStore: GraphStore;\n chunks?: unknown;\n}): Promise<number> {\n const entStats = await extractEntitiesForDocument(opts.documentId, {\n config: opts.config,\n pool: opts.pool,\n graphStore: opts.graphStore,\n hooks: opts.hooks,\n });\n const commStats = await detectCommunities({\n config: opts.config,\n pool: opts.pool,\n embedder: opts.embedder,\n hooks: opts.hooks,\n });\n const chunkCount = Number(entStats.chunk_count ?? 0);\n const primary = Number(commStats.primary_communities ?? 0);\n return graphUnits(chunkCount, primary);\n}\n","import type { GraphConfig } from \"../config.js\";\nimport { requireExtra } from \"../extras.js\";\nimport type { Hooks } from \"../hooks.js\";\nimport type { GraphStore } from \"./neo4j-client.js\";\n\nexport async function requireGraph(): Promise<void> {\n await requireExtra(\"neo4j-driver\", \"graph\", \"graph features\");\n}\n\nexport const _requireGraph = requireGraph;\n\nexport async function buildGraphStore(\n cfg: GraphConfig,\n opts: { hooks?: Hooks | null } = {},\n): Promise<GraphStore> {\n await requireGraph();\n const { GraphStore } = await import(\"./neo4j-client.js\");\n return new GraphStore(cfg, opts);\n}\n\nexport async function runGraphStage(\n ...args: Parameters<typeof import(\"./stage.js\").runGraphStage>\n): Promise<number> {\n await requireGraph();\n const { runGraphStage: impl } = await import(\"./stage.js\");\n return impl(...args);\n}\n\nexport async function buildGraphRanked(\n ...args: Parameters<typeof import(\"./retrieval.js\").buildGraphRanked>\n): Promise<string[]> {\n await requireGraph();\n const { buildGraphRanked: impl } = await import(\"./retrieval.js\");\n return impl(...args);\n}\n\nexport { detectCommunities, MAX_HIERARCHY_LEVELS } from \"./communities.js\";\nexport { CHUNKS_PER_BATCH, ENTITY_TYPES, normalizeEntityName, resolveEntity } from \"./entities.js\";\nexport { GraphStore } from \"./neo4j-client.js\";\nexport { corpusIsAclUniform, shouldUseCommunitySummaries } from \"./retrieval.js\";\n"]}
1
+ {"version":3,"sources":["../../src/errors.ts","../../src/extras.ts","../../src/hooks.ts","../../src/providers/google.ts","../../src/providers/llm.ts","../../src/graph/communities.ts","../../src/graph/entities.ts","../../src/graph/schema.ts","../../src/graph/neo4j-client.ts","../../src/graph/retrieval.ts","../../src/usage.ts","../../src/graph/stage.ts","../../src/graph/index.ts"],"names":["callLlm","jsonrepair","randomUUID","GraphStore","runGraphStage","buildGraphRanked"],"mappings":"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","file":"index.js","sourcesContent":["/** Action-surface errors — user-facing / data-dependent failures (not found, ACL, bad input).\n * Config/programming errors stay as TypeError / RangeError / Error.\n */\nexport class EngineActionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"EngineActionError\";\n }\n}\n\n/** Missing vs forbidden document: identical message so callers cannot distinguish. */\nexport class DocumentNotFoundError extends Error {\n constructor(documentId: string) {\n super(`document not found: ${documentId}`);\n this.name = \"DocumentNotFoundError\";\n }\n}\n\nexport class GraphLegUnavailable extends Error {\n constructor(message = \"graph ranked list was not supplied\") {\n super(message);\n this.name = \"GraphLegUnavailable\";\n }\n}\n\nexport class ApprovalNotPending extends Error {\n constructor(message = \"approval is not pending\") {\n super(message);\n this.name = \"ApprovalNotPending\";\n }\n}\n\nexport class ApprovalExpired extends Error {\n constructor(message = \"approval has expired\") {\n super(message);\n this.name = \"ApprovalExpired\";\n }\n}\n\nexport class CodeExecutionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"CodeExecutionError\";\n }\n}\n\nexport class CodeExecutionTimeout extends Error {\n constructor(message = \"code execution timed out\") {\n super(message);\n this.name = \"CodeExecutionTimeout\";\n }\n}\n\nexport class ExtraMissingError extends Error {\n constructor(extra: string, pkg: string, what: string) {\n super(`${what} requires the '${pkg}' package (optional extra: ${extra}): npm install ${pkg}`);\n this.name = \"ExtraMissingError\";\n }\n}\n","import { ExtraMissingError } from \"./errors.js\";\n\nexport async function tryImport<T = unknown>(specifier: string): Promise<T | null> {\n try {\n return (await import(specifier)) as T;\n } catch {\n return null;\n }\n}\n\nexport async function requireExtra<T = unknown>(specifier: string, extra: string, what: string): Promise<T> {\n try {\n return (await import(specifier)) as T;\n } catch (_err) {\n throw new ExtraMissingError(extra, specifier, what);\n }\n}\n","import type { UsageEvent } from \"./usage.js\";\n\nconst log = {\n warn: (...args: unknown[]) => console.warn(\"[context-engine]\", ...args),\n error: (...args: unknown[]) => console.error(\"[context-engine]\", ...args),\n};\n\n/**\n * One ingest stage boundary. `documentId` is null until the row is claimed\n * (extraction runs before that, so dedup can decide from the extracted\n * text); `sourceId` + `externalId` are the caller's own identity and exist\n * on every event. `detail` is per stage and always JSON-serialisable.\n */\nexport interface ProgressEvent {\n sourceId: string | null;\n externalId: string | null;\n documentId: string | null;\n name: string;\n stage: \"extract\" | \"redact\" | \"chunk\" | \"embed\" | \"structured\" | \"graph\";\n state: \"started\" | \"done\";\n detail: Record<string, unknown>;\n}\n\nexport interface Hooks {\n onUsage?: ((event: UsageEvent) => void) | null;\n onError?: ((exc: unknown, ctx: Record<string, unknown>) => void) | null;\n onToolCall?: ((event: Record<string, unknown>) => void) | null;\n /** Ingest stage boundaries, for live progress UIs. Never raises outward. */\n onProgress?: ((event: ProgressEvent) => void) | null;\n}\n\nexport function emitUsage(hooks: Hooks | null | undefined, event: UsageEvent): void {\n if (!hooks?.onUsage) return;\n try {\n hooks.onUsage(event);\n } catch {\n log.warn(\"onUsage callback raised; swallowing\");\n }\n}\n\nexport function emitError(hooks: Hooks | null | undefined, exc: unknown, ctx: Record<string, unknown>): void {\n log.error(\"context_engine error:\", exc, \"| ctx=\", ctx);\n if (!hooks?.onError) return;\n try {\n hooks.onError(exc, ctx);\n } catch {\n log.warn(\"onError callback raised; swallowing\");\n }\n}\n\n/** Report an ingest stage boundary to `hooks.onProgress`, if set. Never raises. */\nexport function emitProgress(hooks: Hooks | null | undefined, event: ProgressEvent): void {\n if (!hooks?.onProgress) return;\n try {\n hooks.onProgress(event);\n } catch {\n log.warn(\"onProgress callback raised; swallowing\");\n }\n}\n\nexport function emitToolCall(hooks: Hooks | null | undefined, event: Record<string, unknown>): void {\n if (!hooks?.onToolCall) return;\n try {\n hooks.onToolCall(event);\n } catch {\n log.warn(\"onToolCall callback raised; swallowing\");\n }\n}\n","/**\n * How a `@google/genai` client gets built — the one place that decides.\n *\n * Gemini reaches this package two ways, and they differ only in the client\n * constructor:\n *\n * - **gemini** — the Gemini Developer API, authenticated with an API key.\n * - **vertex_ai** — the same models on Vertex AI, authenticated with\n * Application Default Credentials against a GCP project.\n * `GOOGLE_APPLICATION_CREDENTIALS`, workload identity and\n * `gcloud auth application-default login` all work unchanged; there is\n * deliberately no credentials field of our own.\n *\n * Both the LLM provider and the embeddings provider need this decision, so it\n * lives here rather than in four copies (two per port) that would drift.\n *\n * Two SDK behaviours this module is built around, both read out of the real\n * package rather than assumed:\n *\n * - `project`/`location` and `apiKey` are **mutually exclusive** — the SDK\n * raises if handed both. A `vertex_ai` config that still carries a leftover\n * `apiKey` alongside a project must therefore not forward it, or every call\n * fails on a config that looks entirely reasonable.\n * - Omitting project/location is not automatically a broken config: the SDK\n * reads `GOOGLE_CLOUD_PROJECT` / `GOOGLE_CLOUD_LOCATION`, which is how a GCP\n * deployment is usually already wired. So unset fields are left ABSENT\n * rather than passed as null, and the \"is there enough auth\" question is\n * left to the SDK, the only party that can answer it.\n *\n * **This is where the two ports genuinely differ**, measured rather than\n * assumed: the Python SDK falls back to discovering the project from ADC\n * when neither config nor env supplies one, and this JS SDK does not — it\n * throws at construction. A deployment relying on ADC alone must therefore\n * name the project in config or in the environment for the TS client.\n */\nimport { ExtraMissingError } from \"../errors.js\";\n\n/** The fields `EmbeddingConfig` and `LLMConfig` share here. */\nexport interface GoogleProviderConfig {\n provider: string;\n apiKey?: string | null;\n project?: string | null;\n location?: string | null;\n}\n\ntype GenaiCtorOpts = {\n apiKey?: string | null;\n vertexai?: boolean;\n project?: string;\n location?: string;\n httpOptions?: { timeout?: number };\n};\n\n/**\n * Build a `@google/genai` client for `cfg`, in Gemini or Vertex mode.\n *\n * `timeoutMs` is required: the SDK has NO default timeout of its own, so a\n * missing one means a stuck backend hangs the call forever — on the ingest\n * path a wedged worker rather than a failed document.\n *\n * `purpose` only shapes the `ExtraMissingError` message (\"gemini llm\" vs\n * \"gemini embeddings\").\n */\nexport async function buildGenaiClient<T>(\n cfg: GoogleProviderConfig,\n timeoutMs: number,\n purpose: string,\n): Promise<T> {\n const specifier = \"@google/genai\";\n let mod: {\n GoogleGenAI?: new (opts: GenaiCtorOpts) => T;\n Client?: new (opts: GenaiCtorOpts) => T;\n };\n try {\n mod = (await import(specifier)) as typeof mod;\n } catch {\n throw new ExtraMissingError(\"gemini\", specifier, purpose);\n }\n const Ctor = mod.GoogleGenAI ?? mod.Client;\n if (!Ctor) {\n throw new ExtraMissingError(\"gemini\", specifier, purpose);\n }\n\n const opts: GenaiCtorOpts = { httpOptions: { timeout: timeoutMs } };\n\n if (cfg.provider === \"vertex_ai\") {\n opts.vertexai = true;\n if (cfg.project || cfg.location) {\n // Explicit project/location wins, and the API key is dropped: the SDK\n // refuses the combination outright.\n if (cfg.project) opts.project = cfg.project;\n if (cfg.location) opts.location = cfg.location;\n } else if (cfg.apiKey) {\n // Vertex express mode — an API key and no project. The one combination\n // where `apiKey` means anything on this provider.\n opts.apiKey = cfg.apiKey;\n }\n // Otherwise set neither, so the SDK's own env-var lookup runs untouched.\n } else {\n opts.apiKey = cfg.apiKey ?? null;\n }\n\n try {\n return new Ctor(opts);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n if (!message.includes(\"Authentication is not set up\")) throw err;\n // The SDK is right, but it cannot know what this config is called. Note\n // the port difference this message has to cover: the Python SDK falls\n // back to discovering the project from ADC, this one does not — it reads\n // the env vars and stops — so an ADC-only deployment must name the\n // project somewhere.\n throw new Error(\n `${message} Set \\`project\\` on the provider config, or export ` +\n \"GOOGLE_CLOUD_PROJECT and GOOGLE_CLOUD_LOCATION. Credentials \" +\n \"themselves come from Application Default Credentials.\",\n );\n }\n}\n","/**\n * Pluggable LLM provider.\n *\n * `callLlm(cfg, { system, user, jsonMode, images, client })` is the single entry\n * point. Returns `[text, { input, output }]`.\n *\n * Images are always PNG. 240s call timeout (every provider), no retries.\n * Injectable `client` / `fetch`.\n * `callLlm` owns and closes the client it builds unless one is passed in.\n */\n\nimport OpenAI from \"openai\";\nimport type { LLMConfig } from \"../config.js\";\nimport { ExtraMissingError } from \"../errors.js\";\nimport type { FetchImpl } from \"./embeddings.js\";\nimport { buildGenaiClient } from \"./google.js\";\n\n/** Hard cap per LLM call, EVERY provider. A non-streaming multi-page vision\n * transcription routinely generates for well over 30s (real batches run\n * minutes), so the old 30s default made every vision attempt on\n * anthropic/openai/bedrock time out and the pages land as `failed` — only\n * gemini had been given this cap. It also bounds the hang: `@google/genai`\n * has NO default timeout at all, and with the bounded render queue a hung\n * batch holds a worker slot for good. */\nexport const CALL_TIMEOUT_MS = 240_000;\n\n/** Back-compat aliases — the cap stopped being gemini-specific. */\nexport const TIMEOUT_MS = CALL_TIMEOUT_MS;\nexport const GEMINI_CALL_TIMEOUT_MS = CALL_TIMEOUT_MS;\nconst ANTHROPIC_VERSION = \"2023-06-01\";\nconst ANTHROPIC_MAX_TOKENS = 4096;\n\nconst OPENAI_FAMILY = new Set([\"openai\", \"azure_openai\", \"custom\"]);\n\n/**\n * Both reach the same models through the same SDK; only the client\n * constructor differs (API key vs ADC against a GCP project), which is why\n * they share every line below `buildGenaiClient`.\n */\nconst GOOGLE_FAMILY = new Set([\"gemini\", \"vertex_ai\"]);\n\nexport type TokenUsage = { input: number; output: number };\n\nexport type ImageBytes = Uint8Array;\n\nexport type ChatClient = {\n chat: {\n completions: {\n create(body: { model: string; messages: unknown[]; response_format?: { type: string } }): Promise<{\n choices: Array<{ message?: { content?: string | null } }>;\n usage?: { prompt_tokens?: number; completion_tokens?: number } | null;\n }>;\n };\n };\n close?: () => void | Promise<void>;\n timeout?: number;\n baseURL?: string;\n};\n\nexport type LlmCallOpts = {\n system: string;\n user: string;\n jsonMode?: boolean;\n images?: ImageBytes[] | null;\n maxTokens?: number | null;\n /** Reasoning tokens are drawn from `maxTokens`, so a caller that wants\n * transcription rather than deliberation must be able to spend the whole\n * budget on output. Omitted = the provider's default. Applied per provider\n * capability: gemini and anthropic take it directly (anthropic thinking is\n * opt-in, so 0 sends nothing and a positive budget drops `temperature` —\n * the API rejects the combination); bedrock forwards a positive budget as\n * the anthropic-style passthrough; the openai family has no portable\n * thinking control. */\n thinkingBudget?: number | null;\n temperature?: number | null;\n};\n\nexport type LLMClientOpts = {\n client?: ChatClient | null;\n fetch?: FetchImpl | null;\n fetchImpl?: FetchImpl | null;\n};\n\ntype GeminiChatClient = {\n models: {\n generateContent(args: { model: string; contents: unknown; config?: Record<string, unknown> }): Promise<{\n text?: string;\n usageMetadata?: {\n promptTokenCount?: number;\n candidatesTokenCount?: number;\n prompt_token_count?: number;\n candidates_token_count?: number;\n };\n }>;\n };\n};\n\ntype BedrockConverseResult = {\n output?: { message?: { content?: Array<{ text?: string }> } };\n usage?: { inputTokens?: number; outputTokens?: number };\n};\n\nfunction toBase64(bytes: Uint8Array): string {\n return Buffer.from(bytes).toString(\"base64\");\n}\n\nasync function postJson(\n fetchImpl: FetchImpl,\n url: string,\n body: unknown,\n headers: Record<string, string>,\n): Promise<any> {\n const resp = await fetchImpl(url, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", ...headers },\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(TIMEOUT_MS),\n });\n if (!resp.ok) {\n const text = await resp.text().catch(() => \"\");\n throw new Error(`HTTP ${resp.status} ${resp.statusText}${text ? `: ${text}` : \"\"}`);\n }\n return resp.json();\n}\n\nexport function buildOpenAIChatClient(cfg: LLMConfig): OpenAI {\n return new OpenAI({\n apiKey: cfg.apiKey ?? undefined,\n baseURL: cfg.baseUrl ?? undefined,\n timeout: TIMEOUT_MS,\n maxRetries: 0,\n });\n}\n\nexport class LLMClient {\n cfg: LLMConfig;\n provider: LLMConfig[\"provider\"];\n model: string;\n client: ChatClient | null;\n fetchImpl: FetchImpl | null;\n private genaiClient: GeminiChatClient | null = null;\n\n constructor(cfg: LLMConfig, opts: LLMClientOpts = {}) {\n this.cfg = cfg;\n this.provider = cfg.provider;\n this.model = cfg.model;\n this.client = opts.client ?? null;\n this.fetchImpl = opts.fetch ?? opts.fetchImpl ?? null;\n }\n\n async aclose(): Promise<void> {\n const closer = this.client?.close;\n if (typeof closer === \"function\") {\n await closer.call(this.client);\n }\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.aclose();\n }\n\n async call(opts: LlmCallOpts): Promise<[string, TokenUsage]> {\n const {\n system,\n user,\n jsonMode = false,\n images = null,\n maxTokens = null,\n thinkingBudget = null,\n temperature = null,\n } = opts;\n if (this.provider === \"anthropic\") {\n return this.callAnthropic(system, user, jsonMode, images, maxTokens, thinkingBudget, temperature);\n }\n if (OPENAI_FAMILY.has(this.provider)) {\n return this.callOpenAI(system, user, jsonMode, images, maxTokens, temperature);\n }\n if (GOOGLE_FAMILY.has(this.provider)) {\n return this.callGemini(system, user, jsonMode, images, maxTokens, thinkingBudget, temperature);\n }\n if (this.provider === \"bedrock\") {\n return this.callBedrock(system, user, jsonMode, images, maxTokens, thinkingBudget, temperature);\n }\n throw new Error(`unknown llm provider: ${JSON.stringify(this.provider)}`);\n }\n\n private async callAnthropic(\n system: string,\n user: string,\n jsonMode: boolean,\n images: ImageBytes[] | null,\n maxTokens: number | null,\n thinkingBudget: number | null = null,\n temperature: number | null = null,\n ): Promise<[string, TokenUsage]> {\n if (!this.fetchImpl) {\n throw new Error(\"anthropic llm client has no fetch implementation\");\n }\n if (jsonMode) {\n system = `${system}\\n\\nRespond with valid JSON only.`;\n }\n const content: Array<Record<string, unknown>> = [];\n for (const image of images ?? []) {\n content.push({\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: \"image/png\",\n data: toBase64(image),\n },\n });\n }\n content.push({ type: \"text\", text: user });\n\n const body: Record<string, unknown> = {\n model: this.model,\n max_tokens: maxTokens ?? ANTHROPIC_MAX_TOKENS,\n system,\n messages: [{ role: \"user\", content }],\n };\n if (thinkingBudget) {\n // Anthropic thinking is OPT-IN, so `thinkingBudget: 0` (the vision\n // transcription contract) correctly maps to sending nothing. The API\n // rejects a temperature alongside enabled thinking, so the budget wins\n // when a caller passes both.\n body.thinking = { type: \"enabled\", budget_tokens: thinkingBudget };\n } else if (temperature !== null) {\n // Determinism contract — the same scan must transcribe to the same\n // text twice. This was silently dropped here, so the guarantee only\n // held on gemini.\n body.temperature = temperature;\n }\n\n const data = await postJson(this.fetchImpl, \"https://api.anthropic.com/v1/messages\", body, {\n \"x-api-key\": this.cfg.apiKey ?? \"\",\n \"anthropic-version\": ANTHROPIC_VERSION,\n \"content-type\": \"application/json\",\n });\n const text = data.content[0].text as string;\n const usage = data.usage ?? {};\n return [text, { input: usage.input_tokens ?? 0, output: usage.output_tokens ?? 0 }];\n }\n\n private async callOpenAI(\n system: string,\n user: string,\n jsonMode: boolean,\n images: ImageBytes[] | null,\n maxTokens: number | null,\n temperature: number | null = null,\n ): Promise<[string, TokenUsage]> {\n if (!this.client) {\n throw new Error(\"openai-family llm client has no client\");\n }\n const content: Array<Record<string, unknown>> = [{ type: \"text\", text: user }];\n for (const image of images ?? []) {\n content.push({\n type: \"image_url\",\n image_url: { url: `data:image/png;base64,${toBase64(image)}` },\n });\n }\n const body: {\n model: string;\n messages: unknown[];\n response_format?: { type: string };\n max_completion_tokens?: number;\n temperature?: number;\n } = {\n model: this.model,\n messages: [\n { role: \"system\", content: system },\n { role: \"user\", content },\n ],\n };\n if (jsonMode) {\n body.response_format = { type: \"json_object\" };\n }\n if (maxTokens) {\n // `max_completion_tokens`, not the deprecated `max_tokens`: the\n // reasoning models reject the old name outright.\n body.max_completion_tokens = maxTokens;\n }\n if (temperature !== null) {\n // NOTE: the o-series reasoning models reject a temperature — but a\n // clear API error beats the silent nondeterminism of dropping it.\n // (`thinkingBudget` has no portable mapping here — see LlmCallOpts.)\n body.temperature = temperature;\n }\n const resp = await this.client.chat.completions.create(body);\n const text = resp.choices[0]?.message?.content ?? \"\";\n const usage = resp.usage;\n return [text, { input: usage?.prompt_tokens ?? 0, output: usage?.completion_tokens ?? 0 }];\n }\n\n private async callGemini(\n system: string,\n user: string,\n jsonMode: boolean,\n images: ImageBytes[] | null,\n maxTokens: number | null,\n thinkingBudget: number | null = null,\n temperature: number | null = null,\n ): Promise<[string, TokenUsage]> {\n if (!this.genaiClient) {\n // `buildGenaiClient` picks API-key or Vertex/ADC mode and carries the\n // timeout: the SDK has NO default one, so a dropped connection hangs\n // the call forever — and with the bounded render queue that means one\n // hung batch holds a worker slot for good, so the document simply\n // stops with nothing to show for it.\n this.genaiClient = await buildGenaiClient<GeminiChatClient>(\n this.cfg,\n GEMINI_CALL_TIMEOUT_MS,\n \"gemini llm\",\n );\n }\n const parts: unknown[] = [];\n for (const img of images ?? []) {\n parts.push({ inlineData: { mimeType: \"image/png\", data: toBase64(img) } });\n }\n parts.push({ text: user });\n\n const config: Record<string, unknown> = {\n systemInstruction: system,\n // ALWAYS off, and not as a preference. Automatic function calling means\n // the SDK itself EXECUTES a callable it was handed as a tool and loops\n // on the result — up to ten round trips — before returning anything.\n // This package passes declarations only, so today nothing is executable;\n // but that depends on every future caller continuing to do the same, and\n // an application that gates tool execution behind human approval would\n // have that gate bypassed silently, by a library, with the loop already\n // run before it could object.\n automaticFunctionCalling: { disable: true },\n };\n if (jsonMode) {\n config.responseMimeType = \"application/json\";\n }\n if (maxTokens) {\n config.maxOutputTokens = maxTokens;\n }\n if (temperature !== null) {\n config.temperature = temperature;\n }\n if (thinkingBudget !== null) {\n // Only when the CALLER asks. Reasoning tokens come out of\n // `maxOutputTokens`, so a long transcription can otherwise spend its\n // allowance deliberating and truncate part-way through. Entity\n // extraction and structured output may legitimately want the reasoning,\n // so there is no silent default.\n config.thinkingConfig = { thinkingBudget };\n }\n\n const resp = await this.genaiClient.models.generateContent({\n model: this.model,\n contents: parts,\n config,\n });\n const text = resp.text ?? \"\";\n const usageMeta = resp.usageMetadata;\n const inputTokens = usageMeta?.promptTokenCount ?? usageMeta?.prompt_token_count ?? 0;\n const outputTokens = usageMeta?.candidatesTokenCount ?? usageMeta?.candidates_token_count ?? 0;\n return [text, { input: inputTokens || 0, output: outputTokens || 0 }];\n }\n\n private async callBedrock(\n system: string,\n user: string,\n jsonMode: boolean,\n images: ImageBytes[] | null,\n maxTokens: number | null,\n thinkingBudget: number | null = null,\n temperature: number | null = null,\n ): Promise<[string, TokenUsage]> {\n const { BedrockRuntimeClient, ConverseCommand } = await loadBedrockSdk();\n if (jsonMode) {\n system = `${system}\\n\\nRespond with valid JSON only.`;\n }\n const content: Array<Record<string, unknown>> = [];\n for (const image of images ?? []) {\n content.push({ image: { format: \"png\", source: { bytes: image } } });\n }\n content.push({ text: user });\n\n const runtime = new BedrockRuntimeClient({\n maxAttempts: 1,\n requestHandler: {\n requestTimeout: TIMEOUT_MS,\n connectionTimeout: TIMEOUT_MS,\n },\n });\n try {\n const result = (await runtime.send(\n new ConverseCommand({\n modelId: this.model,\n system: [{ text: system }],\n messages: [{ role: \"user\", content }],\n ...(maxTokens || temperature !== null\n ? {\n inferenceConfig: {\n ...(maxTokens ? { maxTokens } : {}),\n ...(temperature !== null ? { temperature } : {}),\n },\n }\n : {}),\n // Anthropic-style passthrough — Converse forwards it to the model.\n // Zero (the vision transcription contract) sends nothing: thinking\n // is opt-in for the anthropic models bedrock hosts.\n ...(thinkingBudget\n ? {\n additionalModelRequestFields: {\n thinking: { type: \"enabled\", budget_tokens: thinkingBudget },\n },\n }\n : {}),\n }),\n )) as BedrockConverseResult;\n const text = result.output?.message?.content?.[0]?.text ?? \"\";\n const usage = result.usage ?? {};\n return [text, { input: usage.inputTokens ?? 0, output: usage.outputTokens ?? 0 }];\n } finally {\n runtime.destroy?.();\n }\n }\n}\n\nasync function loadBedrockSdk(): Promise<{\n BedrockRuntimeClient: new (\n cfg: Record<string, unknown>,\n ) => {\n send(cmd: unknown): Promise<unknown>;\n destroy?: () => void;\n };\n ConverseCommand: new (input: Record<string, unknown>) => unknown;\n}> {\n const specifier = \"@aws-sdk/client-bedrock-runtime\";\n try {\n return (await import(specifier)) as Awaited<ReturnType<typeof loadBedrockSdk>>;\n } catch {\n throw new ExtraMissingError(\"bedrock\", specifier, \"bedrock llm\");\n }\n}\n\nexport function buildLlmClient(cfg: LLMConfig, opts?: LLMClientOpts): LLMClient {\n if (opts?.client || opts?.fetch || opts?.fetchImpl) {\n return new LLMClient(cfg, opts);\n }\n if (cfg.provider === \"anthropic\") {\n return new LLMClient(cfg, { fetch: globalThis.fetch });\n }\n if (OPENAI_FAMILY.has(cfg.provider)) {\n return new LLMClient(cfg, { client: buildOpenAIChatClient(cfg) });\n }\n if (GOOGLE_FAMILY.has(cfg.provider) || cfg.provider === \"bedrock\") {\n return new LLMClient(cfg);\n }\n throw new Error(`unknown llm provider: ${JSON.stringify(cfg.provider)}`);\n}\n\n/**\n * Call the LLM configured by `cfg`. Returns `[text, tokenUsage]`.\n *\n * With no `client`, one is built for this call and CLOSED afterwards,\n * success or failure. Pass `client` to reuse a connection across many calls;\n * the caller then owns `aclose()`.\n */\nexport async function callLlm(\n cfg: LLMConfig,\n opts: LlmCallOpts & { client?: LLMClient | null },\n): Promise<[string, TokenUsage]> {\n const { client, ...callOpts } = opts;\n if (client) {\n return client.call(callOpts);\n }\n const owned = buildLlmClient(cfg);\n try {\n return await owned.call(callOpts);\n } finally {\n await owned.aclose();\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport { jsonrepair } from \"jsonrepair\";\nimport type { Pool } from \"pg\";\nimport type { ContextEngineConfig } from \"../config.js\";\nimport { requireExtra } from \"../extras.js\";\nimport { emitError, type Hooks } from \"../hooks.js\";\nimport type { Embedder } from \"../providers/embeddings.js\";\n\nexport const MAX_HIERARCHY_LEVELS = 3;\nexport const MIN_COMMUNITY_SIZE = 3;\nexport const MAX_SUMMARY_ENTITIES = 30;\nexport const LOUVAIN_SEED = 42;\nconst SUMMARY_SYSTEM = \"You are a knowledge graph analyst. Be factual.\";\n\nfunction mulberry32(seed: number): () => number {\n let a = seed >>> 0;\n return () => {\n a |= 0;\n a = (a + 0x6d2b79f5) | 0;\n let t = Math.imul(a ^ (a >>> 15), 1 | a);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n\ntype GraphLike = {\n addNode: (n: string) => void;\n addEdge: (a: string, b: string, attrs?: Record<string, unknown>) => void;\n hasEdge: (a: string, b: string) => boolean;\n getEdgeAttribute: (a: string, b: string, k: string) => unknown;\n setEdgeAttribute: (a: string, b: string, k: string, v: unknown) => void;\n};\n\nexport function partitionGraph(\n G: GraphLike,\n louvain: (g: unknown, o: { resolution?: number; rng?: () => number }) => Record<string, number>,\n opts: { maxLevels?: number; minSize?: number; seed?: number } = {},\n): Array<{ level: number; members: string[] }> {\n const maxLevels = opts.maxLevels ?? MAX_HIERARCHY_LEVELS;\n const minSize = opts.minSize ?? MIN_COMMUNITY_SIZE;\n const seed = opts.seed ?? LOUVAIN_SEED;\n const communities: Array<{ level: number; members: string[] }> = [];\n const seen = new Set<string>();\n for (let level = 0; level < maxLevels; level++) {\n const resolution = 1.0 / (level + 1);\n const assignment = louvain(G, { resolution, rng: mulberry32(seed + level) });\n const buckets = new Map<number, string[]>();\n for (const [node, cid] of Object.entries(assignment)) {\n const list = buckets.get(cid) ?? [];\n list.push(node);\n buckets.set(cid, list);\n }\n const kept = [...buckets.values()].filter((m) => m.length >= minSize).map((m) => [...m].sort());\n const key = JSON.stringify([...kept].map((m) => [...m].sort()).sort());\n if (seen.has(key)) continue;\n seen.add(key);\n for (const members of kept) communities.push({ level, members });\n }\n return communities;\n}\n\nasync function loadLouvain(): Promise<(g: unknown, o: unknown) => Record<string, number>> {\n const mod = await requireExtra<{ default?: unknown }>(\n \"graphology-communities-louvain\",\n \"graph\",\n \"community detection\",\n );\n const fn = mod.default ?? mod;\n return fn as (g: unknown, o: unknown) => Record<string, number>;\n}\n\nasync function detectWithPython(pool: Pool): Promise<Array<{ level: number; entity_ids: string[] }>> {\n const entities = (await pool.query(`SELECT id FROM context_engine_entities`)).rows;\n if (entities.length < MIN_COMMUNITY_SIZE) return [];\n const entityMap = new Map<string, number>();\n const entityIds: string[] = [];\n entities.forEach((e, i) => {\n entityMap.set(String(e.id), i);\n entityIds.push(String(e.id));\n });\n const relationships = (\n await pool.query(`SELECT source_entity_id, target_entity_id FROM context_engine_entity_relationships`)\n ).rows;\n\n const graphology = await requireExtra<{ default?: new (o: { type: string }) => GraphLike }>(\n \"graphology\",\n \"graph\",\n \"community detection\",\n );\n const Graph = graphology.default;\n if (!Graph) throw new Error(\"graphology export shape is unexpected\");\n const louvain = await loadLouvain();\n\n const G = new Graph({ type: \"undirected\" });\n for (let i = 0; i < entities.length; i++) G.addNode(String(i));\n let hasEdge = false;\n for (const rel of relationships) {\n const src = entityMap.get(String(rel.source_entity_id));\n const tgt = entityMap.get(String(rel.target_entity_id));\n if (src != null && tgt != null && src !== tgt) {\n hasEdge = true;\n const a = String(src);\n const b = String(tgt);\n if (G.hasEdge(a, b)) {\n const w = Number(G.getEdgeAttribute(a, b, \"weight\") ?? 1);\n G.setEdgeAttribute(a, b, \"weight\", w + 1);\n } else {\n G.addEdge(a, b, { weight: 1 });\n }\n }\n }\n if (!hasEdge) return [];\n const partitions = partitionGraph(G as never, louvain);\n return partitions.map((p) => ({\n level: p.level,\n entity_ids: p.members.map((idx) => entityIds[Number(idx)]!),\n }));\n}\n\nasync function summarizeCommunities(\n pending: Array<Record<string, unknown>>,\n config: ContextEngineConfig,\n): Promise<Array<string | null>> {\n if (!pending.length || !config.graph.extractionLlm) return pending.map(() => null);\n const blocks = pending.map((pc, idx) => {\n const entityList = ((pc.entities as Array<Record<string, unknown>>) ?? []).slice(0, MAX_SUMMARY_ENTITIES);\n const entityLines = entityList.map((e) => ` - ${e.name} (${e.type}, mentioned ${e.frequency}x)`);\n const idToName = Object.fromEntries(entityList.map((e) => [String(e.id), e.name]));\n const relLines = ((pc.relationships as Array<Record<string, unknown>>) ?? []).map(\n (r) =>\n ` - ${idToName[String(r.source_entity_id)] ?? \"?\"} -> ${r.label} -> ${idToName[String(r.target_entity_id)] ?? \"?\"}`,\n );\n return (\n `COMMUNITY ${idx}:\\nEntities (${entityList.length}):\\n` +\n entityLines.join(\"\\n\") +\n `\\nRelationships (${relLines.length}):\\n` +\n (relLines.length ? relLines.join(\"\\n\") : \" None\")\n );\n });\n const prompt =\n \"Summarize each community below in 2-4 sentences.\\n\\n\" +\n blocks.join(\"\\n\\n\") +\n '\\n\\nReturn a JSON array with one summary string per community, in order: [\"summary 0\", \"summary 1\", ...]. Return ONLY the JSON array.';\n try {\n const { callLlm } = await import(\"../providers/llm.js\");\n const out = await callLlm(config.graph.extractionLlm, {\n system: SUMMARY_SYSTEM,\n user: prompt,\n jsonMode: true,\n });\n const raw = Array.isArray(out) ? out[0] : ((out as { text?: string }).text ?? String(out));\n let summaries: unknown[] = [];\n try {\n summaries = JSON.parse(jsonrepair(String(raw)));\n } catch {\n summaries = [];\n }\n if (!Array.isArray(summaries)) summaries = [];\n while (summaries.length < pending.length) summaries.push(null);\n return summaries.slice(0, pending.length).map((s) => (typeof s === \"string\" && s.trim() ? s : null));\n } catch (exc) {\n console.warn(\"community summarization failed:\", exc);\n return pending.map(() => null);\n }\n}\n\nexport async function detectCommunities(opts: {\n config: ContextEngineConfig;\n pool: Pool;\n embedder: Embedder;\n hooks?: Hooks | null;\n}): Promise<Record<string, unknown>> {\n const stats = { communities_detected: 0, communities_summarized: 0, primary_communities: 0 };\n const communities = await detectWithPython(opts.pool);\n stats.communities_detected = communities.length;\n const pending: Array<Record<string, unknown>> = [];\n for (const comm of communities) {\n const entityIds = comm.entity_ids;\n if (entityIds.length < MIN_COMMUNITY_SIZE) continue;\n const entities = (\n await opts.pool.query(`SELECT * FROM context_engine_entities WHERE id = ANY($1::uuid[])`, [entityIds])\n ).rows;\n if (entities.length < MIN_COMMUNITY_SIZE) continue;\n const rels = (\n await opts.pool.query(\n `SELECT * FROM context_engine_entity_relationships\n WHERE source_entity_id = ANY($1::uuid[]) AND target_entity_id = ANY($1::uuid[])\n LIMIT 50`,\n [entityIds],\n )\n ).rows;\n pending.push({\n entities,\n entity_ids: entityIds,\n entity_count: entityIds.length,\n rel_count: rels.length,\n relationships: rels,\n level: comm.level ?? 0,\n });\n }\n if (!pending.length) return stats;\n const summaries = await summarizeCommunities(pending, opts.config);\n const embeddings: Array<number[] | null> = summaries.map(() => null);\n const toEmbed = summaries\n .map((s, i) => [i, s] as const)\n .filter((x): x is readonly [number, string] => Boolean(x[1]));\n if (toEmbed.length) {\n try {\n const result = await opts.embedder.embed(\n toEmbed.map(([, s]) => s),\n { kind: \"document\" },\n );\n const vectors = Array.isArray(result)\n ? (result[0] as number[][])\n : ((result as { vectors?: number[][] }).vectors ?? []);\n toEmbed.forEach(([i], idx) => {\n embeddings[i] = vectors[idx] ? [...vectors[idx]!] : null;\n });\n } catch (exc) {\n if (opts.hooks) emitError(opts.hooks, exc, { stage: \"community_embedding\" });\n else console.warn(\"community embedding failed:\", exc);\n }\n }\n\n await opts.pool.query(`DELETE FROM context_engine_communities`);\n let primary = 0;\n for (let i = 0; i < pending.length; i++) {\n const pc = pending[i]!;\n const embedding = embeddings[i];\n await opts.pool.query(\n `INSERT INTO context_engine_communities\n (id, level, entity_ids, entity_count, relationship_count, summary, embedding)\n VALUES ($1, $2, $3::jsonb, $4, $5, $6, $7::vector)`,\n [\n randomUUID(),\n pc.level,\n JSON.stringify((pc.entity_ids as string[]).map(String)),\n pc.entity_count,\n pc.rel_count,\n summaries[i],\n embedding ? `[${embedding.join(\",\")}]` : null,\n ],\n );\n if (pc.level === 0) primary += 1;\n }\n stats.communities_summarized = pending.length;\n stats.primary_communities = primary;\n return stats;\n}\n","import { randomUUID } from \"node:crypto\";\nimport { jsonrepair } from \"jsonrepair\";\nimport type { Pool } from \"pg\";\nimport type { ContextEngineConfig } from \"../config.js\";\nimport type { GraphStore } from \"./neo4j-client.js\";\n\nexport const ENTITY_TYPES = [\n \"PERSON\",\n \"ORG\",\n \"PRODUCT\",\n \"LOCATION\",\n \"REFERENCE\",\n \"TEMPORAL\",\n \"CONCEPT\",\n] as const;\nexport type EntityType = (typeof ENTITY_TYPES)[number];\n\n/**\n * Ordered so a schema can publish it (a Set has no order to publish). The\n * prompt below is built from it, so the enum a caller is steered toward and\n * the values a row can actually hold are one list.\n */\nexport const RELATIONSHIP_CATEGORY_VALUES = [\n \"HIERARCHICAL\",\n \"MEMBERSHIP\",\n \"CREATION\",\n \"TEMPORAL\",\n \"SPATIAL\",\n \"REFERENCE\",\n \"FUNCTIONAL\",\n \"QUANTITATIVE\",\n] as const;\n\nexport const RELATIONSHIP_CATEGORIES = new Set<string>(RELATIONSHIP_CATEGORY_VALUES);\n\nexport const CHUNKS_PER_BATCH = 11;\n\nconst EXTRACTION_SYSTEM = \"You are a STRICT JSON entity and relationship extraction engine.\";\n\nexport function normalizeEntityName(name: string): string {\n return (name || \"\").toLowerCase().trim().replace(/ {2}/g, \" \");\n}\n\nfunction sharedSignificantTokens(a: string, b: string, minLen = 4): boolean {\n const tokensA = new Set(a.split(/\\s+/).filter((t) => t.length >= minLen));\n const tokensB = b.split(/\\s+/).filter((t) => t.length >= minLen);\n return tokensB.some((t) => tokensA.has(t));\n}\n\n/** Exported so a test can hold the schema enums and this prompt to one list. */\nexport function buildPrompt(fullText: string): string {\n return `Extract ALL entities and relationships from the following document text.\n\nDOCUMENT TEXT:\n${fullText}\n\nENTITY TYPES: ${ENTITY_TYPES.join(\", \")}\n\nRELATIONSHIP CATEGORIES: ${RELATIONSHIP_CATEGORY_VALUES.join(\", \")}\n\nOUTPUT FORMAT (STRICT JSON):\n{\n \"entities\": [\n {\"name\": \"exact text\", \"type\": \"PERSON|ORG|PRODUCT|LOCATION|REFERENCE|TEMPORAL|CONCEPT\"}\n ],\n \"relationships\": [\n {\"source\": \"entity name\", \"target\": \"entity name\", \"category\": \"CATEGORY\", \"label\": \"verb\", \"evidence\": \"brief quote\"}\n ]\n}\n\nRULES:\n- Extract EVERY meaningful entity (people, organizations, products, locations, codes, dates, concepts)\n- Choose the MOST SPECIFIC type; only use CONCEPT when no other type fits\n- Be exhaustive but do NOT invent entities not present in the text\n- Deduplicate: each entity appears once\n- Relationships: source/target MUST be entities you extracted; category MUST be one of the 8\n- Return ONLY the JSON object\n`;\n}\n\nfunction safeJsonParse(text: string, expected: \"object\" | \"array\"): unknown {\n const stripped = text.trim();\n try {\n const result = JSON.parse(stripped);\n if (expected === \"object\" && result && typeof result === \"object\" && !Array.isArray(result))\n return result;\n if (expected === \"array\" && Array.isArray(result)) return result;\n } catch {\n /* repair */\n }\n const repaired = JSON.parse(jsonrepair(stripped));\n return repaired;\n}\n\ntype Querier = { query: Pool[\"query\"] };\n\nexport async function resolveEntity(\n db: Querier,\n _name: string,\n normalizedName: string,\n entityType: string,\n): Promise<Record<string, unknown> | null> {\n const exact = await db.query(`SELECT * FROM context_engine_entities WHERE normalized_name = $1 LIMIT 1`, [\n normalizedName,\n ]);\n if (exact.rows[0]) return exact.rows[0];\n\n const trigram = await db.query(\n `SELECT id FROM context_engine_entities\n WHERE similarity(normalized_name, $1) > 0.75\n ORDER BY similarity(normalized_name, $1) DESC LIMIT 1`,\n [normalizedName],\n );\n if (trigram.rows[0]) {\n const row = await db.query(`SELECT * FROM context_engine_entities WHERE id = $1`, [trigram.rows[0].id]);\n return row.rows[0] ?? null;\n }\n\n const typed = await db.query(\n `SELECT id, normalized_name FROM context_engine_entities\n WHERE type = $2 AND similarity(normalized_name, $1) > 0.45\n ORDER BY similarity(normalized_name, $1) DESC LIMIT 5`,\n [normalizedName, entityType],\n );\n for (const row of typed.rows) {\n if (sharedSignificantTokens(normalizedName, String(row.normalized_name))) {\n const full = await db.query(`SELECT * FROM context_engine_entities WHERE id = $1`, [row.id]);\n return full.rows[0] ?? null;\n }\n }\n return null;\n}\n\nasync function extractFromText(\n fullText: string,\n config: ContextEngineConfig,\n): Promise<{\n entities: Array<Record<string, unknown>>;\n relationships: Array<Record<string, unknown>>;\n tokens: Record<string, number>;\n}> {\n try {\n const llm = config.graph.extractionLlm;\n if (!llm) return { entities: [], relationships: [], tokens: {} };\n const { callLlm } = await import(\"../providers/llm.js\");\n const out = await callLlm(llm, {\n system: EXTRACTION_SYSTEM,\n user: buildPrompt(fullText),\n jsonMode: true,\n });\n const raw = Array.isArray(out) ? out[0] : ((out as { text?: string }).text ?? String(out));\n const tokens = (Array.isArray(out) ? out[1] : (out as { tokens?: Record<string, number> }).tokens) ?? {};\n let result: Record<string, unknown> = {};\n try {\n result = (safeJsonParse(String(raw), \"object\") as Record<string, unknown>) ?? {};\n } catch {\n result = {};\n }\n const entities = ((result.entities as unknown[]) ?? []).filter((e): e is Record<string, unknown> =>\n Boolean(e && typeof e === \"object\" && (e as { name?: unknown }).name && (e as { type?: unknown }).type),\n );\n const relationships = ((result.relationships as unknown[]) ?? []).filter(\n (r): r is Record<string, unknown> =>\n Boolean(\n r &&\n typeof r === \"object\" &&\n (r as { source?: unknown }).source &&\n (r as { target?: unknown }).target,\n ),\n );\n return { entities, relationships, tokens: tokens as Record<string, number> };\n } catch (exc) {\n console.error(\"entity extraction LLM call failed:\", exc);\n return { entities: [], relationships: [], tokens: {} };\n }\n}\n\nasync function loadDocumentChunks(pool: Pool, documentId: string): Promise<Array<Record<string, unknown>>> {\n const result = await pool.query(\n `SELECT id, text, idx, source_id, meta_data FROM context_engine_chunks WHERE document_id = $1 ORDER BY idx`,\n [documentId],\n );\n return result.rows.map((c) => ({\n id: c.id,\n text: c.text || \"\",\n text_lower: String(c.text || \"\").toLowerCase(),\n idx: c.idx || 0,\n source_id: c.source_id,\n token_count:\n (c.meta_data as { token_count?: number } | null)?.token_count ??\n Math.floor(String(c.text || \"\").length / 4),\n }));\n}\n\nasync function persistExtraction(\n pool: Pool,\n chunkSnaps: Array<Record<string, unknown>>,\n extracted: { entities: Array<Record<string, unknown>>; relationships: Array<Record<string, unknown>> },\n): Promise<{ entities_created: number; entities_found: number; relationships_created: number }> {\n const stats = { entities_created: 0, entities_found: 0, relationships_created: 0 };\n const byNorm = new Map<string, Record<string, unknown>>();\n const client = await pool.connect();\n try {\n await client.query(\"BEGIN\");\n for (const entityData of extracted.entities) {\n const normalized = normalizeEntityName(String(entityData.name));\n if (!normalized) continue;\n const entityType = String(entityData.type);\n let entity = await resolveEntity(client, String(entityData.name), normalized, entityType);\n if (entity) {\n await client.query(\n `UPDATE context_engine_entities SET frequency = COALESCE(frequency, 1) + 1,\n name = CASE WHEN length($2) > length(name) THEN $2 ELSE name END, updated_at = now()\n WHERE id = $1`,\n [entity.id, entityData.name],\n );\n entity = (await client.query(`SELECT * FROM context_engine_entities WHERE id = $1`, [entity.id]))\n .rows[0];\n } else {\n const id = randomUUID();\n await client.query(\n `INSERT INTO context_engine_entities (id, name, normalized_name, type, frequency)\n VALUES ($1, $2, $3, $4, 1)`,\n [id, entityData.name, normalized, entityType],\n );\n entity = (await client.query(`SELECT * FROM context_engine_entities WHERE id = $1`, [id])).rows[0];\n stats.entities_created += 1;\n }\n byNorm.set(normalized, entity!);\n byNorm.set(String(entity!.normalized_name), entity!);\n const nameLower = String(entityData.name).toLowerCase();\n for (const snap of chunkSnaps) {\n if (nameLower && String(snap.text_lower).includes(nameLower)) {\n const exists = await client.query(\n `SELECT 1 FROM context_engine_chunk_entities WHERE chunk_id = $1 AND entity_id = $2`,\n [snap.id, entity!.id],\n );\n if (!exists.rows.length) {\n await client.query(\n `INSERT INTO context_engine_chunk_entities (chunk_id, entity_id) VALUES ($1, $2)`,\n [snap.id, entity!.id],\n );\n stats.entities_found += 1;\n }\n }\n }\n }\n for (const rel of extracted.relationships) {\n const sourceNorm = normalizeEntityName(String(rel.source ?? \"\"));\n const targetNorm = normalizeEntityName(String(rel.target ?? \"\"));\n const category = String(rel.category ?? \"\").toUpperCase();\n const label = String(rel.label ?? \"\");\n const evidence = String(rel.evidence ?? \"\");\n if (!RELATIONSHIP_CATEGORIES.has(category)) continue;\n let src = byNorm.get(sourceNorm);\n let tgt = byNorm.get(targetNorm);\n if (!src) {\n src = (\n await client.query(`SELECT * FROM context_engine_entities WHERE normalized_name = $1`, [sourceNorm])\n ).rows[0];\n }\n if (!tgt) {\n tgt = (\n await client.query(`SELECT * FROM context_engine_entities WHERE normalized_name = $1`, [targetNorm])\n ).rows[0];\n }\n if (!src || !tgt) continue;\n const exists = await client.query(\n `SELECT 1 FROM context_engine_entity_relationships\n WHERE source_entity_id = $1 AND target_entity_id = $2 AND category = $3 AND label = $4`,\n [src.id, tgt.id, category, label],\n );\n if (!exists.rows.length) {\n await client.query(\n `INSERT INTO context_engine_entity_relationships\n (id, source_entity_id, target_entity_id, category, label, evidence)\n VALUES ($1, $2, $3, $4, $5, $6)`,\n [randomUUID(), src.id, tgt.id, category, label, evidence.slice(0, 200)],\n );\n stats.relationships_created += 1;\n }\n }\n await client.query(\"COMMIT\");\n } catch (e) {\n await client.query(\"ROLLBACK\");\n throw e;\n } finally {\n client.release();\n }\n return stats;\n}\n\nasync function syncToNeo4j(\n pool: Pool,\n documentId: string,\n chunkSnaps: Array<Record<string, unknown>>,\n graphStore: GraphStore,\n): Promise<void> {\n const chunkRows = chunkSnaps.map((s) => ({\n id: String(s.id),\n document_id: String(documentId),\n source_id: s.source_id,\n text_preview: String(s.text).slice(0, 200),\n position: s.idx,\n token_count: s.token_count,\n }));\n try {\n await graphStore.connect();\n const entities = (await pool.query(`SELECT * FROM context_engine_entities`)).rows;\n const entityById = new Map(entities.map((e) => [String(e.id), e]));\n const entityRows = entities.map((e) => ({\n name: e.name,\n normalized_name: e.normalized_name,\n entity_type: e.type,\n }));\n const ids = chunkSnaps.map((s) => s.id);\n const links = ids.length\n ? (\n await pool.query(`SELECT * FROM context_engine_chunk_entities WHERE chunk_id = ANY($1::uuid[])`, [\n ids,\n ])\n ).rows\n : [];\n const mentionRows = links\n .filter((l) => entityById.has(String(l.entity_id)))\n .map((l) => ({\n chunk_id: String(l.chunk_id),\n entity_name: entityById.get(String(l.entity_id))!.normalized_name,\n }));\n const rels = (await pool.query(`SELECT * FROM context_engine_entity_relationships`)).rows;\n const relRows = [];\n for (const r of rels) {\n const src = entityById.get(String(r.source_entity_id));\n const tgt = entityById.get(String(r.target_entity_id));\n if (src && tgt) {\n relRows.push({\n source_name: src.normalized_name,\n target_name: tgt.normalized_name,\n category: r.category,\n label: r.label,\n evidence: r.evidence,\n chunk_id: r.chunk_id ? String(r.chunk_id) : null,\n });\n }\n }\n await graphStore.upsertChunksBatch(chunkRows);\n await graphStore.linkSequentialChunks(String(documentId));\n await graphStore.upsertEntitiesBatch(entityRows);\n await graphStore.linkChunksToEntitiesBatch(mentionRows);\n await graphStore.upsertEntityRelationshipsBatch(relRows);\n } catch (exc) {\n console.warn(\"Neo4j sync failed (continuing on PG mirror):\", exc);\n }\n}\n\nexport async function extractEntitiesForDocument(\n documentId: string,\n opts: {\n config: ContextEngineConfig;\n pool: Pool;\n graphStore?: GraphStore | null;\n hooks?: unknown;\n },\n): Promise<Record<string, unknown>> {\n const chunkSnaps = await loadDocumentChunks(opts.pool, documentId);\n const stats: Record<string, unknown> = {\n chunk_count: chunkSnaps.length,\n entities_created: 0,\n entities_found: 0,\n relationships_created: 0,\n provider_tokens: {},\n };\n if (!chunkSnaps.length) return stats;\n\n const batches = [];\n for (let i = 0; i < chunkSnaps.length; i += CHUNKS_PER_BATCH) {\n batches.push(chunkSnaps.slice(i, i + CHUNKS_PER_BATCH));\n }\n let llmInput = 0;\n let llmOutput = 0;\n for (const batch of batches) {\n const fullText = batch.map((s) => String(s.text)).join(\"\\n\\n\");\n const extracted = await extractFromText(fullText, opts.config);\n llmInput += Number(extracted.tokens.input ?? 0);\n llmOutput += Number(extracted.tokens.output ?? 0);\n const persisted = await persistExtraction(opts.pool, batch, extracted);\n stats.entities_created = Number(stats.entities_created) + persisted.entities_created;\n stats.entities_found = Number(stats.entities_found) + persisted.entities_found;\n stats.relationships_created = Number(stats.relationships_created) + persisted.relationships_created;\n }\n const tokens = stats.provider_tokens as Record<string, number>;\n if (llmInput) tokens.graph_llm_input = llmInput;\n if (llmOutput) tokens.graph_llm_output = llmOutput;\n if (opts.graphStore) await syncToNeo4j(opts.pool, documentId, chunkSnaps, opts.graphStore);\n return stats;\n}\n","const CONSTRAINTS = [\n \"CREATE CONSTRAINT ce_chunk_unique IF NOT EXISTS FOR (c:Chunk) REQUIRE c.id IS UNIQUE\",\n \"CREATE CONSTRAINT ce_entity_unique IF NOT EXISTS FOR (e:Entity) REQUIRE e.normalized_name IS UNIQUE\",\n];\n\nconst INDEXES = [\n \"CREATE INDEX ce_entity_type_idx IF NOT EXISTS FOR (e:Entity) ON (e.type)\",\n \"CREATE INDEX ce_chunk_source_idx IF NOT EXISTS FOR (c:Chunk) ON (c.source_id)\",\n \"CREATE INDEX ce_chunk_docid_idx IF NOT EXISTS FOR (c:Chunk) ON (c.document_id)\",\n];\n\nexport async function ensureSchema(\n driver: {\n session: (opts: { database: string }) => {\n executeWrite?: unknown;\n run?: unknown;\n close: () => Promise<void>;\n };\n },\n database: string,\n): Promise<void> {\n const session = (\n driver as {\n session: (o: { database: string }) => {\n run: (q: string) => Promise<unknown>;\n close: () => Promise<void>;\n };\n }\n ).session({\n database,\n });\n try {\n for (const stmt of [...CONSTRAINTS, ...INDEXES]) {\n try {\n await session.run(stmt);\n } catch (exc) {\n console.error(\"Neo4j schema statement FAILED:\", stmt.split(\" \")[2], exc);\n }\n }\n } finally {\n await session.close();\n }\n}\n","import { createHash } from \"node:crypto\";\nimport type { GraphConfig } from \"../config.js\";\nimport { requireExtra } from \"../extras.js\";\nimport { emitError, type Hooks } from \"../hooks.js\";\nimport { ensureSchema } from \"./schema.js\";\n\nconst SYNC_BATCH_ROWS = 1000;\nconst MAX_EXPANSION = 500;\n\ntype Neo4jDriver = {\n session: (opts: { database: string }) => Neo4jSession;\n close: () => Promise<void>;\n};\ntype Neo4jSession = {\n run: (\n query: string,\n params?: Record<string, unknown>,\n ) => Promise<{ records: Array<{ get: (k: string) => unknown }>; values?: () => Promise<unknown[][]> }>;\n close: () => Promise<void>;\n};\n\nexport class GraphStore {\n cfg: GraphConfig;\n hooks: Hooks | null | undefined;\n database: string;\n driver: Neo4jDriver | null = null;\n private schemaReady = false;\n private cache = new Map<string, { expiresAt: number; value: unknown }>();\n private generation = 0;\n\n constructor(cfg: GraphConfig, opts: { hooks?: Hooks | null } = {}) {\n this.cfg = cfg;\n this.hooks = opts.hooks;\n this.database = cfg.neo4jDatabase;\n }\n\n async connect(): Promise<void> {\n if (this.driver) return;\n const neo4j = await requireExtra<{\n default?: {\n driver: (uri: string, auth: unknown) => Neo4jDriver;\n auth: { basic: (u: string, p: string) => unknown };\n };\n driver?: (uri: string, auth: unknown) => Neo4jDriver;\n auth?: { basic: (u: string, p: string) => unknown };\n }>(\"neo4j-driver\", \"graph\", \"graph features\");\n const ns = neo4j.default ?? neo4j;\n const driverFn = ns.driver;\n const auth = ns.auth;\n if (!driverFn || !auth) throw new Error(\"neo4j-driver export shape is unexpected\");\n const driver = driverFn(this.cfg.neo4jUri!, auth.basic(this.cfg.neo4jUser, this.cfg.neo4jPassword!));\n this.driver = driver;\n if (!this.schemaReady) {\n await ensureSchema(driver, this.database);\n this.schemaReady = true;\n }\n }\n\n async close(): Promise<void> {\n if (this.driver) {\n await this.driver.close();\n this.driver = null;\n this.schemaReady = false;\n }\n }\n\n async ping(timeout = 2000): Promise<boolean> {\n try {\n await this.connect();\n await Promise.race([\n this.pingInternal(),\n new Promise((_, reject) => setTimeout(() => reject(new Error(\"timeout\")), timeout)),\n ]);\n return true;\n } catch (exc) {\n this.report(exc, { service: \"neo4j\", operation: \"ping\" });\n return false;\n }\n }\n\n private async pingInternal(): Promise<void> {\n const session = this.driver!.session({ database: this.database });\n try {\n await session.run(\"RETURN 1 AS ping\");\n } finally {\n await session.close();\n }\n }\n\n private report(exc: unknown, ctx: Record<string, unknown>): void {\n if (this.hooks) emitError(this.hooks, exc, ctx);\n else console.error(\"neo4j error:\", exc, \"| ctx=\", ctx);\n }\n\n private cacheGet(key: string): unknown {\n const entry = this.cache.get(key);\n if (!entry) return null;\n if (entry.expiresAt > Date.now() / 1000) return entry.value;\n this.cache.delete(key);\n return null;\n }\n\n private cacheSet(key: string, value: unknown, ttl = 86400): void {\n this.cache.set(key, { expiresAt: Date.now() / 1000 + ttl, value });\n }\n\n async upsertChunksBatch(rows: Array<Record<string, unknown>>): Promise<number> {\n const query = `\n UNWIND $rows AS row\n MERGE (c:Chunk {id: row.id})\n SET c.document_id = row.document_id,\n c.source_id = row.source_id,\n c.text_preview = row.text_preview,\n c.position = row.position,\n c.token_count = row.token_count,\n c.updated_at = datetime()\n `;\n return this.runBatched(query, rows);\n }\n\n async upsertEntitiesBatch(rows: Array<Record<string, unknown>>): Promise<number> {\n const query = `\n UNWIND $rows AS row\n MERGE (e:Entity {normalized_name: row.normalized_name})\n SET e.name = row.name,\n e.type = row.entity_type,\n e.created_at = coalesce(e.created_at, datetime()),\n e.updated_at = datetime()\n `;\n return this.runBatched(query, rows);\n }\n\n async linkChunksToEntitiesBatch(rows: Array<Record<string, unknown>>): Promise<number> {\n const query = `\n UNWIND $rows AS row\n MATCH (c:Chunk {id: row.chunk_id})\n MATCH (e:Entity {normalized_name: row.entity_name})\n MERGE (c)-[:MENTIONS]->(e)\n `;\n return this.runBatched(query, rows);\n }\n\n async upsertEntityRelationshipsBatch(rows: Array<Record<string, unknown>>): Promise<number> {\n const query = `\n UNWIND $rows AS row\n MATCH (src:Entity {normalized_name: row.source_name})\n MATCH (tgt:Entity {normalized_name: row.target_name})\n MERGE (src)-[r:RELATES_TO {category: row.category, label: row.label}]->(tgt)\n SET r.evidence = row.evidence,\n r.chunk_id = row.chunk_id,\n r.updated_at = datetime()\n `;\n return this.runBatched(query, rows);\n }\n\n async linkSequentialChunks(documentId: string): Promise<void> {\n const query = `\n MATCH (c:Chunk {document_id: $document_id})\n WITH c ORDER BY c.position\n WITH COLLECT(c) AS chunks\n UNWIND RANGE(0, SIZE(chunks)-2) AS i\n WITH chunks[i] AS curr, chunks[i+1] AS next\n MERGE (curr)-[:NEXT]->(next)\n `;\n await this.connect();\n const session = this.driver!.session({ database: this.database });\n try {\n await session.run(query, { document_id: String(documentId) });\n } finally {\n await session.close();\n }\n this.generation += 1;\n }\n\n private async runBatched(query: string, rows: Array<Record<string, unknown>>): Promise<number> {\n if (!rows.length) return 0;\n await this.connect();\n let done = 0;\n const session = this.driver!.session({ database: this.database });\n try {\n for (let i = 0; i < rows.length; i += SYNC_BATCH_ROWS) {\n const batch = rows.slice(i, i + SYNC_BATCH_ROWS);\n await session.run(query, { rows: batch });\n done += batch.length;\n }\n } finally {\n await session.close();\n }\n this.generation += 1;\n return done;\n }\n\n async deleteSourceData(sourceId: string): Promise<{ chunks_deleted: number }> {\n await this.connect();\n const session = this.driver!.session({ database: this.database });\n try {\n const result = await session.run(\n \"MATCH (c:Chunk {source_id: $source_id}) DETACH DELETE c RETURN count(c) AS n\",\n { source_id: String(sourceId) },\n );\n const deleted = Number(result.records[0]?.get(\"n\") ?? 0);\n this.generation += 1;\n return { chunks_deleted: deleted };\n } finally {\n await session.close();\n }\n }\n\n private expansionCacheKey(queryEntities: string[], maxDepth: number, chunkIds: string[]): string {\n const chunkDigest = createHash(\"md5\")\n .update([...chunkIds].sort().join(\",\"))\n .digest(\"hex\");\n const keyContent = `g${this.generation}:${JSON.stringify([...queryEntities].sort())}:${maxDepth}:${chunkDigest}`;\n return `expansion:${createHash(\"md5\").update(keyContent).digest(\"hex\")}`;\n }\n\n async expandChunkSet(chunkIds: string[], queryEntities: string[], maxDepth = 2): Promise<string[]> {\n if (!chunkIds.length) return [];\n const depth = Math.max(1, Math.min(Math.trunc(maxDepth), 5));\n const cacheKey = this.expansionCacheKey(queryEntities, depth, chunkIds);\n const cached = this.cacheGet(cacheKey);\n if (Array.isArray(cached)) return cached as string[];\n\n const query = `\n MATCH (c:Chunk)\n WHERE c.id IN $chunk_ids\n WITH COLLECT(DISTINCT c) AS seeds\n\n CALL {\n WITH seeds\n UNWIND seeds AS c\n OPTIONAL MATCH (c)-[:MENTIONS]->(e:Entity)<-[:MENTIONS]-(related:Chunk)\n WHERE e.normalized_name IN $query_entities\n RETURN COLLECT(DISTINCT related.id) AS related_ids\n }\n CALL {\n WITH seeds\n UNWIND seeds AS c\n OPTIONAL MATCH (c)-[:NEXT*1..${depth}]-(sequential:Chunk)\n RETURN COLLECT(DISTINCT sequential.id) AS sequential_ids\n }\n\n WITH [s IN seeds | s.id] + related_ids + sequential_ids AS all_ids\n UNWIND all_ids AS chunk_id\n WITH chunk_id WHERE chunk_id IS NOT NULL\n RETURN DISTINCT chunk_id\n LIMIT $max_results\n `;\n await this.connect();\n const session = this.driver!.session({ database: this.database });\n try {\n const result = await session.run(query, {\n chunk_ids: chunkIds,\n query_entities: queryEntities,\n max_results: MAX_EXPANSION,\n });\n const expanded = result.records\n .map((r) => r.get(\"chunk_id\"))\n .filter((v) => v != null)\n .map(String);\n if (expanded.length) this.cacheSet(cacheKey, expanded);\n return expanded;\n } finally {\n await session.close();\n }\n }\n\n async getChunkConnectivityScores(chunkIds: string[]): Promise<Record<string, number>> {\n if (!chunkIds.length) return {};\n const query = `\n UNWIND $chunk_ids AS chunk_id\n MATCH (c:Chunk {id: chunk_id})\n OPTIONAL MATCH (c)-[out_next:NEXT]->()\n OPTIONAL MATCH (c)-[out_mentions:MENTIONS]->()\n OPTIONAL MATCH (c)<-[in_next:NEXT]-()\n OPTIONAL MATCH (c)<-[in_mentions:MENTIONS]-()\n WITH c.id AS id,\n count(DISTINCT out_next) + count(DISTINCT out_mentions) AS outgoing,\n count(DISTINCT in_next) + count(DISTINCT in_mentions) AS incoming\n RETURN id, (outgoing + incoming) AS total_connections\n `;\n await this.connect();\n const session = this.driver!.session({ database: this.database });\n try {\n const result = await session.run(query, { chunk_ids: chunkIds });\n const records = result.records.map((r) => ({\n id: String(r.get(\"id\")),\n total_connections: Number(r.get(\"total_connections\")),\n }));\n if (!records.length) return {};\n const maxConnections = Math.max(...records.map((r) => r.total_connections));\n if (maxConnections === 0) {\n return Object.fromEntries(records.map((r) => [r.id, 0.5]));\n }\n return Object.fromEntries(\n records.map((r) => [r.id, Math.min(1.0, r.total_connections / maxConnections)]),\n );\n } finally {\n await session.close();\n }\n }\n}\n","import type { Pool } from \"pg\";\nimport type { ContextEngineConfig } from \"../config.js\";\nimport { emitError, type Hooks } from \"../hooks.js\";\nimport type { Embedder } from \"../providers/embeddings.js\";\nimport type { AnnTunable } from \"../storage.js\";\nimport type { GraphStore } from \"./neo4j-client.js\";\n\nconst DEFAULT_WEIGHTS = {\n vector_score: 0.3,\n entity_match: 0.3,\n relationship_relevance: 0.2,\n community_match: 0.1,\n graph_connectivity: 0.1,\n};\n\nconst SEED_LIMIT = 200;\nconst ENTITY_LIMIT = 30;\nconst TOP_SEEDS_FOR_ENTITIES = 20;\n\n// The scope predicate. Textually a copy of storage.ts's SCOPE — which is the\n// canonical one — because these queries number their placeholders differently\n// ($2/$3/$4 here, $1/$2/$3 there) and pg binds are POSITIONAL, so the string\n// cannot be shared without renumbering every query on one side. Any change to\n// the canonical predicate must be made here too. Never widen it.\n//\n// $3 is cast to uuid[] so the predicate can use the document_id index —\n// same reasoning as storage.ts's SCOPE.\nconst SCOPE = `\n AND ($2::text[] IS NULL OR c.source_id = ANY($2::text[]))\n AND ($3::uuid[] IS NULL OR c.document_id = ANY($3::uuid[]))\n AND ($4::text[] IS NULL OR c.acl IS NULL OR c.acl && $4::text[])\n`;\n\nfunction vecLiteral(vector: number[]): string {\n return `[${vector.map((x) => Number(x)).join(\",\")}]`;\n}\n\nexport async function corpusIsAclUniform(pool: Pool, sourceIds: string[] | null): Promise<boolean> {\n const result = await pool.query(\n `SELECT EXISTS(SELECT 1 FROM context_engine_chunks c\n WHERE c.acl IS NOT NULL AND ($1::text[] IS NULL OR c.source_id = ANY($1::text[]))) AS has_acl`,\n [sourceIds],\n );\n return !result.rows[0]?.has_acl;\n}\n\nexport async function shouldUseCommunitySummaries(\n pool: Pool,\n opts: { sourceIds: string[] | null; principals: string[] | null },\n): Promise<boolean> {\n if (opts.principals == null) return true;\n return corpusIsAclUniform(pool, opts.sourceIds);\n}\n\nasync function deriveQueryEntities(\n pool: Pool,\n chunkIds: string[],\n opts: { sourceIds: string[] | null; documentIds?: string[] | null; principals: string[] | null },\n): Promise<Array<Record<string, unknown>>> {\n if (!chunkIds.length) return [];\n const result = await pool.query(\n `SELECT e.normalized_name, e.name, e.type, COUNT(*) AS freq\n FROM context_engine_chunk_entities ce\n JOIN context_engine_entities e ON e.id = ce.entity_id\n JOIN context_engine_chunks c ON c.id = ce.chunk_id\n WHERE ce.chunk_id = ANY($1::uuid[]) ${SCOPE}\n GROUP BY e.normalized_name, e.name, e.type\n ORDER BY freq DESC LIMIT $5`,\n [chunkIds, opts.sourceIds, opts.documentIds ?? null, opts.principals, ENTITY_LIMIT],\n );\n return result.rows.map((r) => ({\n normalized_name: r.normalized_name,\n name: r.name,\n type: r.type,\n }));\n}\n\nasync function computeVectorScores(\n pool: Pool,\n chunkIds: string[],\n vector: number[],\n): Promise<Record<string, number>> {\n if (!chunkIds.length || !vector) return {};\n const result = await pool.query(\n `SELECT c.id::text, 1 - (c.embedding <=> CAST($2 AS vector))::float AS sim\n FROM context_engine_chunks c\n WHERE c.id = ANY($1::uuid[]) AND c.embedding IS NOT NULL`,\n [chunkIds, vecLiteral(vector)],\n );\n let scores = Object.fromEntries(result.rows.map((r) => [String(r.id), Number(r.sim)]));\n const vs = Object.values(scores);\n if (vs.length) {\n const lo = Math.min(...vs);\n const hi = Math.max(...vs);\n if (hi > lo)\n scores = Object.fromEntries(Object.entries(scores).map(([k, v]) => [k, (v - lo) / (hi - lo)]));\n }\n return scores;\n}\n\nasync function computeRelationshipScores(\n pool: Pool,\n chunkIds: string[],\n queryEntityNames: string[],\n): Promise<Record<string, number>> {\n if (!chunkIds.length || !queryEntityNames.length) return {};\n const result = await pool.query(\n `SELECT r.chunk_id::text, COUNT(*) AS n\n FROM context_engine_entity_relationships r\n JOIN context_engine_entities se ON se.id = r.source_entity_id\n JOIN context_engine_entities te ON te.id = r.target_entity_id\n WHERE r.chunk_id = ANY($1::uuid[])\n AND (se.normalized_name = ANY($2::text[]) OR te.normalized_name = ANY($2::text[]))\n GROUP BY r.chunk_id`,\n [chunkIds, queryEntityNames],\n );\n const counts = Object.fromEntries(result.rows.map((r) => [String(r.chunk_id), Number(r.n)]));\n if (!Object.keys(counts).length) return {};\n const mx = Math.max(...Object.values(counts));\n return mx ? Object.fromEntries(Object.entries(counts).map(([cid, n]) => [cid, n / mx])) : {};\n}\n\nasync function computeCommunityScores(\n pool: Pool,\n chunkIds: string[],\n vector: number[],\n opts: {\n sourceIds: string[] | null;\n documentIds?: string[] | null;\n principals: string[] | null;\n useSummaries: boolean;\n },\n): Promise<Record<string, number>> {\n if (!opts.useSummaries || !chunkIds.length || !vector) return {};\n const commRows = await pool.query(\n `SELECT entity_ids, 1 - (embedding <=> CAST($1 AS vector))::float AS sim\n FROM context_engine_communities WHERE embedding IS NOT NULL\n ORDER BY embedding <=> CAST($1 AS vector) LIMIT 5`,\n [vecLiteral(vector)],\n );\n if (!commRows.rows.length) return {};\n const entityScore: Record<string, number> = {};\n for (const row of commRows.rows) {\n const sim = Number(row.sim);\n if (sim < 0.15) continue;\n for (const eid of row.entity_ids ?? []) {\n entityScore[String(eid)] = Math.max(entityScore[String(eid)] ?? 0, sim);\n }\n }\n if (!Object.keys(entityScore).length) return {};\n const result = await pool.query(\n `SELECT ce.chunk_id::text, ce.entity_id::text\n FROM context_engine_chunk_entities ce\n JOIN context_engine_chunks c ON c.id = ce.chunk_id\n WHERE ce.chunk_id = ANY($1::uuid[]) AND ce.entity_id = ANY($5::uuid[]) ${SCOPE}`,\n [chunkIds, opts.sourceIds, opts.documentIds ?? null, opts.principals, Object.keys(entityScore)],\n );\n const chunkScores: Record<string, number> = {};\n for (const row of result.rows) {\n chunkScores[row.chunk_id] = Math.max(chunkScores[row.chunk_id] ?? 0, entityScore[row.entity_id] ?? 0);\n }\n return chunkScores;\n}\n\n/** ACL-scoped vector seed search → top chunk ids (best first). Exported for\n * tests.\n *\n * `documentIds` participates at GENERATION time, not only in the caller's\n * post-filter: with a narrow document scope inside a large source,\n * off-document seeds would fill the whole SEED_LIMIT budget, the post-filter\n * would empty the leg, and the search would silently degrade to hybrid — the\n * post-filter recall-collapse class the ANN/ACL leg already fixed.\n *\n * `backend` is the chunk-plane backend the caller already owns, and it is here\n * for one reason: this is an ANN scan with `SCOPE` applied ON TOP of the index\n * walk, the identical shape `PostgresBackend.tuneAnnScan` corrects for the\n * vector leg. Untuned, the walk keeps at most `hnsw.ef_search` (40) candidates\n * before the filter runs, so a principal with a small visible slice gets few or\n * zero seeds and the whole graph leg quietly degrades to hybrid. The tuning is\n * `SET LOCAL`, hence the explicit client and transaction: it has to be the\n * connection the seed query itself runs on. A backend without the knobs\n * (non-Postgres, or none passed) is skipped.\n */\nexport async function vectorSeedIds(\n pool: Pool,\n vector: number[],\n opts: {\n sourceIds: string[] | null;\n documentIds?: string[] | null;\n principals: string[] | null;\n backend?: Partial<AnnTunable> | null;\n },\n): Promise<string[]> {\n const binds = [opts.sourceIds, opts.documentIds ?? null, opts.principals];\n // Same rule the vector leg derives `scoped` by, read off the ONE bind array\n // so a new scope dimension cannot be silently left out of it.\n const scoped = binds.some((v) => v !== null);\n const client = await pool.connect();\n try {\n await client.query(\"BEGIN\");\n await opts.backend?.tuneAnnScan?.(client, SEED_LIMIT, scoped);\n const result = await client.query(\n `SELECT c.id::text FROM context_engine_chunks c\n WHERE c.embedding IS NOT NULL ${SCOPE}\n ORDER BY c.embedding <=> CAST($1 AS vector) LIMIT $5`,\n [vecLiteral(vector), ...binds, SEED_LIMIT],\n );\n await client.query(\"COMMIT\");\n return result.rows.map((r) => String(r.id));\n } catch (err) {\n try {\n await client.query(\"ROLLBACK\");\n } catch {\n /* ignore */\n }\n throw err;\n } finally {\n client.release();\n }\n}\n\nexport async function buildGraphRanked(\n query: string,\n opts: {\n config: ContextEngineConfig;\n pool: Pool;\n embedder: Embedder;\n graphStore: GraphStore;\n hooks?: Hooks | null;\n sourceIds?: string[] | null;\n documentIds?: string[] | null;\n principals?: string[] | null;\n maxDepth?: number;\n backend?: Partial<AnnTunable> | null;\n },\n): Promise<string[]> {\n try {\n const result = await opts.embedder.embed([query], { kind: \"query\" });\n const vectors = Array.isArray(result)\n ? (result[0] as number[][])\n : ((result as { vectors?: number[][] }).vectors ?? []);\n const vector = vectors[0] ? [...vectors[0]] : null;\n if (!vector) return [];\n const sourceIds = opts.sourceIds ?? null;\n const documentIds = opts.documentIds ?? null;\n const principals = opts.principals ?? null;\n const seeds = await vectorSeedIds(opts.pool, vector, {\n sourceIds,\n documentIds,\n principals,\n backend: opts.backend,\n });\n if (!seeds.length) return [];\n const queryEntities = await deriveQueryEntities(opts.pool, seeds.slice(0, TOP_SEEDS_FOR_ENTITIES), {\n sourceIds,\n documentIds,\n principals,\n });\n const entityNorms = queryEntities.map((e) => String(e.normalized_name));\n\n let expanded: string[] = seeds;\n let connectivity: Record<string, number> = {};\n try {\n await opts.graphStore.connect();\n expanded = await opts.graphStore.expandChunkSet(seeds, entityNorms, opts.maxDepth ?? 2);\n connectivity = await opts.graphStore.getChunkConnectivityScores(expanded.length ? expanded : seeds);\n } catch (exc) {\n if (opts.hooks) emitError(opts.hooks, exc, { stage: \"graph_expand\" });\n else console.warn(\"graph leg: expansion failed:\", exc);\n expanded = seeds;\n connectivity = {};\n }\n const allIds = expanded.length ? expanded : seeds;\n const useSummaries = await shouldUseCommunitySummaries(opts.pool, { sourceIds, principals });\n const vecScores = await computeVectorScores(opts.pool, allIds, vector);\n const relScores = await computeRelationshipScores(opts.pool, allIds, entityNorms);\n const commScores = await computeCommunityScores(opts.pool, allIds, vector, {\n sourceIds,\n documentIds,\n principals,\n useSummaries,\n });\n const textRows = await opts.pool.query(\n `SELECT id::text, lower(coalesce(text,'')) AS t FROM context_engine_chunks WHERE id = ANY($1::uuid[])`,\n [allIds],\n );\n const texts = Object.fromEntries(textRows.rows.map((r) => [String(r.id), String(r.t)]));\n const weights = {\n ...DEFAULT_WEIGHTS,\n ...((\n opts.config.graph as {\n rerankWeights?: Record<string, number>;\n rerank_weights?: Record<string, number>;\n }\n ).rerankWeights ??\n (opts.config.graph as { rerank_weights?: Record<string, number> }).rerank_weights ??\n {}),\n };\n const entityNameSet = new Set(entityNorms);\n const scored: Array<[string, number]> = [];\n for (const cidRaw of allIds) {\n const cid = String(cidRaw);\n if (!(cid in texts)) continue;\n const v = vecScores[cid] ?? 0.5;\n const chunkText = texts[cid] ?? \"\";\n const matches = [...entityNameSet].filter((n) => n && chunkText.includes(n)).length;\n const e = entityNameSet.size ? Math.min(1.0, matches / Math.max(1, entityNameSet.size)) : 0;\n const r = relScores[cid] ?? 0;\n const cm = commScores[cid] ?? 0;\n const gc = connectivity[cid] ?? 0.5;\n const final =\n v * weights.vector_score +\n e * weights.entity_match +\n r * weights.relationship_relevance +\n cm * weights.community_match +\n gc * weights.graph_connectivity;\n scored.push([cid, final]);\n }\n scored.sort((a, b) => b[1] - a[1]);\n return scored.map(([cid]) => cid);\n } catch (exc) {\n if (opts.hooks) emitError(opts.hooks, exc, { stage: \"graph_embed_query\" });\n else console.warn(\"graph leg: query embed failed:\", exc);\n return [];\n }\n}\n","export type UsageKind = \"ingest\" | \"search\" | \"tool\";\n\nexport interface UsageEvent {\n kind: UsageKind;\n units: number;\n detail?: Record<string, unknown>;\n providerTokens?: Record<string, number>;\n}\n\nexport interface DocumentReport {\n documentId: string;\n name: string;\n status: string;\n pages: number | null;\n chunks: number;\n units: number;\n graphUnits: number;\n providerTokens: Record<string, number>;\n error: string | null;\n redactionFailed: string[];\n // WHY the document has less text than it should, when extraction knows —\n // see the extraction module's `UnreadableReason` for the canonical\n // semantics. Optional so the non-extracting report sites (skipped,\n // pending, upgraded) claim nothing.\n unreadableReason?: string | null;\n unreadablePages?: number;\n}\n\nexport interface IngestReport {\n documents: DocumentReport[];\n totals: {\n files: number;\n failed: number;\n units: number;\n graphUnits: number;\n [key: string]: number;\n };\n}\n\nconst PPTX_MIMES = new Set([\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n \"application/vnd.ms-powerpoint\",\n]);\nconst DOCX_MIMES = new Set([\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n \"application/msword\",\n]);\n\nexport function unitsForFile(\n mime: string,\n opts: { pages: number | null; slides: number | null; sizeBytes: number },\n): number {\n const m = mime || \"\";\n if (m === \"application/pdf\") return Math.max(1, opts.pages ?? 0);\n if (PPTX_MIMES.has(m)) return Math.max(1, opts.slides ?? 0);\n if (DOCX_MIMES.has(m)) return Math.max(1, opts.pages ?? 0);\n if (m.startsWith(\"image/\")) return 1;\n return Math.max(1, Math.ceil(opts.sizeBytes / (1024 * 1024)));\n}\n\nexport function graphUnits(chunkCount: number, primaryCommunityCount: number): number {\n return Math.ceil(chunkCount / 8) + primaryCommunityCount;\n}\n","import type { Pool } from \"pg\";\nimport type { ContextEngineConfig } from \"../config.js\";\nimport type { Hooks } from \"../hooks.js\";\nimport type { Embedder } from \"../providers/embeddings.js\";\nimport { graphUnits } from \"../usage.js\";\nimport { detectCommunities } from \"./communities.js\";\nimport { extractEntitiesForDocument } from \"./entities.js\";\nimport type { GraphStore } from \"./neo4j-client.js\";\n\nexport async function runGraphStage(opts: {\n documentId: string;\n config: ContextEngineConfig;\n hooks?: Hooks | null;\n pool: Pool;\n embedder: Embedder;\n graphStore: GraphStore;\n chunks?: unknown;\n}): Promise<number> {\n const entStats = await extractEntitiesForDocument(opts.documentId, {\n config: opts.config,\n pool: opts.pool,\n graphStore: opts.graphStore,\n hooks: opts.hooks,\n });\n const commStats = await detectCommunities({\n config: opts.config,\n pool: opts.pool,\n embedder: opts.embedder,\n hooks: opts.hooks,\n });\n const chunkCount = Number(entStats.chunk_count ?? 0);\n const primary = Number(commStats.primary_communities ?? 0);\n return graphUnits(chunkCount, primary);\n}\n","import type { GraphConfig } from \"../config.js\";\nimport { requireExtra } from \"../extras.js\";\nimport type { Hooks } from \"../hooks.js\";\nimport type { GraphStore } from \"./neo4j-client.js\";\n\nexport async function requireGraph(): Promise<void> {\n await requireExtra(\"neo4j-driver\", \"graph\", \"graph features\");\n}\n\nexport const _requireGraph = requireGraph;\n\nexport async function buildGraphStore(\n cfg: GraphConfig,\n opts: { hooks?: Hooks | null } = {},\n): Promise<GraphStore> {\n await requireGraph();\n const { GraphStore } = await import(\"./neo4j-client.js\");\n return new GraphStore(cfg, opts);\n}\n\nexport async function runGraphStage(\n ...args: Parameters<typeof import(\"./stage.js\").runGraphStage>\n): Promise<number> {\n await requireGraph();\n const { runGraphStage: impl } = await import(\"./stage.js\");\n return impl(...args);\n}\n\nexport async function buildGraphRanked(\n ...args: Parameters<typeof import(\"./retrieval.js\").buildGraphRanked>\n): Promise<string[]> {\n await requireGraph();\n const { buildGraphRanked: impl } = await import(\"./retrieval.js\");\n return impl(...args);\n}\n\nexport { detectCommunities, MAX_HIERARCHY_LEVELS } from \"./communities.js\";\nexport { CHUNKS_PER_BATCH, ENTITY_TYPES, normalizeEntityName, resolveEntity } from \"./entities.js\";\nexport { GraphStore } from \"./neo4j-client.js\";\nexport { corpusIsAclUniform, shouldUseCommunitySummaries } from \"./retrieval.js\";\n"]}