@vohongtho.infotech/code-intel 0.3.0 → 0.4.0
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.
- package/README.md +12 -5
- package/dist/cli/main.js +3797 -3711
- package/dist/cli/main.js.map +1 -1
- package/dist/index.d.ts +70 -6
- package/dist/index.js +5554 -6045
- package/dist/index.js.map +1 -1
- package/dist/wasm/tree-sitter-kotlin.wasm +0 -0
- package/dist/wasm/tree-sitter-swift.wasm +0 -0
- package/dist/web/assets/index-BcUIJvDD.css +2 -0
- package/dist/web/assets/{index-CkCM74It.js → index-Ds0yq7oU.js} +1 -7
- package/dist/web/index.html +2 -2
- package/package.json +24 -24
- package/dist/web/assets/index-eJGDkRsL.css +0 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/graph/id-generator.ts","../src/shared/languages.ts","../src/shared/detection.ts","../src/shared/index.ts","../src/parsing/parser-manager.ts","../src/parsing/query-runner.ts","../src/parsing/queries/typescript.ts","../src/parsing/queries/python.ts","../src/parsing/queries/java.ts","../src/parsing/queries/go.ts","../src/parsing/queries/c.ts","../src/parsing/queries/cpp.ts","../src/parsing/queries/csharp.ts","../src/parsing/queries/rust.ts","../src/parsing/queries/php.ts","../src/parsing/queries/kotlin.ts","../src/parsing/queries/ruby.ts","../src/parsing/queries/swift.ts","../../../node_modules/@opentelemetry/otlp-exporter-base/src/OTLPExporterBase.ts","../../../node_modules/@opentelemetry/otlp-exporter-base/src/types.ts","../../../node_modules/@opentelemetry/otlp-exporter-base/src/configuration/shared-configuration.ts","../../../node_modules/@opentelemetry/otlp-exporter-base/src/bounded-queue-export-promise-handler.ts","../../../node_modules/@opentelemetry/core/src/baggage/constants.ts","../../../node_modules/@opentelemetry/core/src/baggage/utils.ts","../../../node_modules/@opentelemetry/core/src/platform/node/environment.ts","../../../node_modules/@opentelemetry/core/src/platform/node/index.ts","../../../node_modules/@opentelemetry/core/src/platform/index.ts","../../../node_modules/@opentelemetry/core/src/common/time.ts","../../../node_modules/@opentelemetry/core/src/ExportResult.ts","../../../node_modules/@opentelemetry/core/src/index.ts","../../../node_modules/@opentelemetry/otlp-exporter-base/src/logging-response-handler.ts","../../../node_modules/@opentelemetry/otlp-exporter-base/src/otlp-export-delegate.ts","../../../node_modules/@opentelemetry/otlp-exporter-base/src/index.ts","../../../node_modules/@opentelemetry/otlp-transformer/src/common/internal.ts","../../../node_modules/@opentelemetry/otlp-transformer/src/common/utils.ts","../../../node_modules/@opentelemetry/otlp-transformer/src/trace/internal.ts","../../../node_modules/@opentelemetry/otlp-transformer/src/trace/json/trace.ts","../../../node_modules/@opentelemetry/otlp-transformer/src/trace/json/index.ts","../../../node_modules/@opentelemetry/otlp-transformer/src/index.ts","../../../node_modules/@opentelemetry/otlp-exporter-base/src/util.ts","../../../node_modules/@opentelemetry/otlp-exporter-base/src/configuration/otlp-http-configuration.ts","../../../node_modules/@opentelemetry/otlp-exporter-base/src/configuration/otlp-node-http-configuration.ts","../../../node_modules/@opentelemetry/otlp-exporter-base/src/is-export-retryable.ts","../../../node_modules/@opentelemetry/otlp-exporter-base/src/version.ts","../../../node_modules/@opentelemetry/otlp-exporter-base/src/transport/http-transport-utils.ts","../../../node_modules/@opentelemetry/otlp-exporter-base/src/transport/http-exporter-transport.ts","../../../node_modules/@opentelemetry/otlp-exporter-base/src/retrying-transport.ts","../../../node_modules/@opentelemetry/otlp-exporter-base/src/otlp-http-export-delegate.ts","../../../node_modules/@opentelemetry/otlp-exporter-base/src/configuration/shared-env-configuration.ts","../../../node_modules/@opentelemetry/otlp-exporter-base/src/configuration/otlp-node-http-env-configuration.ts","../../../node_modules/@opentelemetry/otlp-exporter-base/src/configuration/convert-legacy-http-options.ts","../../../node_modules/@opentelemetry/otlp-exporter-base/src/configuration/convert-legacy-node-http-options.ts","../../../node_modules/@opentelemetry/otlp-exporter-base/src/index-node-http.ts","../../../node_modules/@opentelemetry/exporter-trace-otlp-http/src/platform/node/OTLPTraceExporter.ts","../../../node_modules/@opentelemetry/exporter-trace-otlp-http/src/platform/node/index.ts","../../../node_modules/@opentelemetry/exporter-trace-otlp-http/src/platform/index.ts","../../../node_modules/@opentelemetry/exporter-trace-otlp-http/src/index.ts","../src/observability/tracing.ts","../src/shared/logger.ts","../src/parsing/queries/javascript.ts","../src/parsing/queries/dart.ts","../src/parsing/queries/index.ts","../src/pipeline/phases/parse-phase.ts","../src/pipeline/phases/resolve-phase.ts","../src/search/embedder.ts","../src/multi-repo/group-registry.ts","../src/graph/knowledge-graph.ts","../src/graph/index.ts","../src/parsing/index.ts","../src/parsing/ast-cache.ts","../src/languages/registry.ts","../src/languages/modules/typescript.ts","../src/languages/modules/python.ts","../src/languages/modules/java.ts","../src/languages/modules/go.ts","../src/languages/modules/c.ts","../src/languages/modules/cpp.ts","../src/languages/modules/csharp.ts","../src/languages/modules/rust.ts","../src/languages/modules/php.ts","../src/languages/modules/kotlin.ts","../src/languages/modules/ruby.ts","../src/languages/modules/swift.ts","../src/languages/modules/dart.ts","../src/resolver/binding-tracker.ts","../src/resolver/import-resolver.ts","../src/call-graph/call-builder.ts","../src/call-graph/call-classifier.ts","../src/inheritance/heritage-builder.ts","../src/inheritance/mro-walker.ts","../src/inheritance/override-detector.ts","../src/pipeline/dag-validator.ts","../src/pipeline/orchestrator.ts","../src/observability/metrics.ts","../src/pipeline/phases/scan-phase.ts","../src/pipeline/phases/index.ts","../src/pipeline/phases/cluster-phase.ts","../src/pipeline/phases/flow-phase.ts","../src/pipeline/workers/parse-phase-parallel.ts","../src/pipeline/workers/worker-pool.ts","../src/pipeline/workers/resolve-phase-parallel.ts","../src/scope-analysis/scope-builder.ts","../src/clustering/community-detector.ts","../src/flow-detection/entry-point-finder.ts","../src/search/text-search.ts","../src/search/index.ts","../src/search/vector-index.ts","../src/storage/repo-registry.ts","../src/storage/metadata.ts","../src/mcp-server/server.ts","../src/storage/db-manager.ts","../src/storage/schema.ts","../src/multi-repo/graph-from-db.ts","../src/multi-repo/group-sync.ts","../src/multi-repo/group-query.ts","../src/storage/csv-writer.ts","../src/storage/graph-loader.ts","../src/http/app.ts","../src/errors/codes.ts","../src/shared/fs-secure.ts","../src/auth/users-db.ts","../src/auth/secret-store.ts","../src/auth/middleware.ts","../src/jobs/jobs-db.ts","../src/governance/llm-governance.ts","../src/backup/backup-service.ts","../src/backup/backup-scheduler.ts","../src/auth/oidc.ts","../src/http/openapi.ts","../src/multi-repo/index.ts","../src/multi-repo/cross-repo-search.ts"],"names":["nodePath","path","TSLanguage","ExportResultCode","diag","init_esm","hrTime","init_utils","init_internal","resolve","fs","path6","init_node","init_platform","os","paramNode","context","relativePath","result","a","exports","Database","uuidv4","crypto","bcrypt","MAX_ATTEMPTS","__dirname","fileURLToPath","getTracer","embedNodes","saveGroup"],"mappings":"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","file":"index.js","sourcesContent":["import { NodeKind } from '../shared/index.js';\n\nexport function generateNodeId(kind: NodeKind, filePath: string, qualifiedName: string): string {\n return `${kind}:${filePath}:${qualifiedName}`;\n}\n\nexport function generateEdgeId(source: string, target: string, kind: string): string {\n return `${kind}:${source}->${target}`;\n}\n","export enum Language {\n TypeScript = 'typescript',\n JavaScript = 'javascript',\n Python = 'python',\n Java = 'java',\n Go = 'go',\n C = 'c',\n Cpp = 'cpp',\n CSharp = 'csharp',\n Rust = 'rust',\n PHP = 'php',\n Kotlin = 'kotlin',\n Ruby = 'ruby',\n Swift = 'swift',\n Dart = 'dart',\n}\n","import { Language } from './languages.js';\n\nconst EXTENSION_MAP: Record<string, Language> = {\n '.ts': Language.TypeScript,\n '.tsx': Language.TypeScript,\n '.mts': Language.TypeScript,\n '.cts': Language.TypeScript,\n '.js': Language.JavaScript,\n '.jsx': Language.JavaScript,\n '.mjs': Language.JavaScript,\n '.cjs': Language.JavaScript,\n '.py': Language.Python,\n '.pyi': Language.Python,\n '.java': Language.Java,\n '.go': Language.Go,\n '.c': Language.C,\n '.h': Language.C,\n '.cpp': Language.Cpp,\n '.cxx': Language.Cpp,\n '.cc': Language.Cpp,\n '.hpp': Language.Cpp,\n '.hxx': Language.Cpp,\n '.cs': Language.CSharp,\n '.rs': Language.Rust,\n '.php': Language.PHP,\n '.kt': Language.Kotlin,\n '.kts': Language.Kotlin,\n '.rb': Language.Ruby,\n '.swift': Language.Swift,\n '.dart': Language.Dart,\n};\n\nexport function detectLanguage(filePath: string): Language | null {\n const ext = filePath.slice(filePath.lastIndexOf('.'));\n return EXTENSION_MAP[ext] ?? null;\n}\n\nexport function getSupportedExtensions(): string[] {\n return Object.keys(EXTENSION_MAP);\n}\n","export { Language } from './languages.js';\nexport { detectLanguage, getSupportedExtensions } from './detection.js';\nexport type { NodeKind, EdgeKind, CodeNode, CodeEdge } from './graph-types.js';\nexport type {\n PipelinePhaseStatus,\n PipelineProgress,\n PipelineResult,\n} from './pipeline-types.js';\n","import { createRequire } from 'node:module';\nimport { fileURLToPath } from 'node:url';\nimport nodePath from 'node:path';\nimport { existsSync } from 'node:fs';\nimport { Language } from '../shared/index.js';\nimport { Parser, Language as TSLanguage } from 'web-tree-sitter';\n\nconst _require = createRequire(import.meta.url);\n\n/**\n * Locate the bundled wasm/ directory at runtime.\n *\n * tsup compiles parser-manager.ts into two bundles:\n * dist/index.js → import.meta.url dirname = dist/ → ./wasm = dist/wasm/ ✅\n * dist/cli/main.js → import.meta.url dirname = dist/cli → ../wasm = dist/wasm/ ✅\n *\n * We try both candidates and return the first that exists.\n */\nfunction findBundledWasmDir(): string {\n const fileDir = nodePath.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n nodePath.join(fileDir, 'wasm'), // dist/index.js → dist/wasm/\n nodePath.join(fileDir, '../wasm'), // dist/cli/main.js → dist/wasm/\n ];\n for (const candidate of candidates) {\n if (existsSync(candidate)) return candidate;\n }\n return candidates[0]; // fallback (will just not find files)\n}\n\nconst _bundledWasmDir = findBundledWasmDir();\n\n/**\n * Resolve the absolute path to a language WASM file.\n *\n * Resolution order:\n * 1. Try the grammar's own npm package (e.g. tree-sitter-typescript).\n * 2. Fall back to the bundled wasm/ directory inside this package.\n *\n * The bundled WASMs (Swift, Kotlin, Dart) are dylink.0 format, compatible\n * with web-tree-sitter 0.26.x. They are copied into wasm/ at build/publish\n * time and listed in the package.json \"files\" array so they are always\n * available to consumers without needing the optional grammar packages installed.\n *\n * Returns null when no compatible WASM can be found.\n */\nfunction wasmPath(lang: Language): string | null {\n // Grammars that ship their own dylink.0 WASM inside their npm package.\n const WASM_PACKAGE_MAP: Partial<Record<Language, string>> = {\n [Language.TypeScript]: 'tree-sitter-typescript/tree-sitter-typescript.wasm',\n [Language.JavaScript]: 'tree-sitter-javascript/tree-sitter-javascript.wasm',\n [Language.Python]: 'tree-sitter-python/tree-sitter-python.wasm',\n [Language.Java]: 'tree-sitter-java/tree-sitter-java.wasm',\n [Language.Go]: 'tree-sitter-go/tree-sitter-go.wasm',\n [Language.C]: 'tree-sitter-c/tree-sitter-c.wasm',\n [Language.Cpp]: 'tree-sitter-cpp/tree-sitter-cpp.wasm',\n [Language.CSharp]: 'tree-sitter-c-sharp/tree-sitter-c_sharp.wasm',\n [Language.Rust]: 'tree-sitter-rust/tree-sitter-rust.wasm',\n [Language.PHP]: 'tree-sitter-php/tree-sitter-php.wasm',\n [Language.Ruby]: 'tree-sitter-ruby/tree-sitter-ruby.wasm',\n // These are optional dependencies; their packages may or may not include\n // a WASM. If require.resolve fails we fall back to the bundled wasm/.\n [Language.Swift]: 'tree-sitter-swift/tree-sitter-swift.wasm',\n [Language.Kotlin]: 'tree-sitter-kotlin/tree-sitter-kotlin.wasm',\n [Language.Dart]: 'tree-sitter-dart/tree-sitter-dart.wasm',\n };\n\n // Grammars bundled inside this package's wasm/ directory as a reliable\n // fallback (dylink.0 format, confirmed working with web-tree-sitter 0.26.x).\n const BUNDLED_WASM_MAP: Partial<Record<Language, string>> = {\n [Language.Swift]: 'tree-sitter-swift.wasm',\n [Language.Kotlin]: 'tree-sitter-kotlin.wasm',\n [Language.Dart]: 'tree-sitter-dart.wasm',\n };\n\n // 1. Try resolving via the grammar's own npm package.\n const relative = WASM_PACKAGE_MAP[lang];\n if (relative) {\n try {\n return _require.resolve(relative);\n } catch {\n // Package not installed or WASM not present — fall through.\n }\n }\n\n // 2. Fall back to the WASM bundled inside this package.\n const bundled = BUNDLED_WASM_MAP[lang];\n if (bundled) {\n const bundledPath = nodePath.join(_bundledWasmDir, bundled);\n if (existsSync(bundledPath)) return bundledPath;\n }\n\n return null;\n}\n\nlet initPromise: Promise<void> | null = null;\n\n/** Initialize web-tree-sitter (idempotent). */\nexport async function initParser(): Promise<void> {\n if (!initPromise) {\n initPromise = Parser.init();\n }\n return initPromise;\n}\n\nconst languageCache = new Map<Language, TSLanguage | null>();\nconst parserCache = new Map<Language, Parser>();\n\n/**\n * Load and cache the TSLanguage WASM for a given language.\n * Returns null when no WASM grammar is available for this language.\n */\nexport async function getLanguage(lang: Language): Promise<TSLanguage | null> {\n if (languageCache.has(lang)) return languageCache.get(lang)!;\n\n const path = wasmPath(lang);\n if (!path) {\n languageCache.set(lang, null);\n return null;\n }\n\n try {\n await initParser();\n const language = await TSLanguage.load(path);\n languageCache.set(lang, language);\n return language;\n } catch {\n languageCache.set(lang, null);\n return null;\n }\n}\n\n/**\n * Get a Parser instance configured for the given language.\n * Returns null when no WASM grammar is available.\n */\nexport async function getParser(lang: Language): Promise<Parser | null> {\n const language = await getLanguage(lang);\n if (!language) return null;\n\n let parser = parserCache.get(lang);\n if (!parser) {\n parser = new Parser();\n parserCache.set(lang, parser);\n }\n parser.setLanguage(language);\n return parser;\n}\n\n/**\n * Parse source code for the given language.\n * Returns a Tree or null when the language is unsupported / WASM fails.\n */\nexport async function parseSource(\n lang: Language,\n source: string,\n): Promise<import('web-tree-sitter').Tree | null> {\n const parser = await getParser(lang);\n if (!parser) return null;\n return parser.parse(source);\n}\n\n/** Return true if tree-sitter is available for the given language. */\nexport async function isTreeSitterAvailable(lang: Language): Promise<boolean> {\n return (await getLanguage(lang)) !== null;\n}\n","import { Query } from 'web-tree-sitter';\nimport type { Node, Tree, Language } from 'web-tree-sitter';\n\nexport interface QueryCapture {\n name: string;\n node: Node;\n text: string;\n}\n\nexport interface QueryMatch {\n patternIndex: number;\n captures: QueryCapture[];\n}\n\n// ─── Query compilation cache ──────────────────────────────────────────────────\n//\n// Compiling a tree-sitter Query from source is expensive (~20-30ms per call).\n// Without caching, the parse phase calls `new Query(lang, src)` for EVERY file,\n// turning 10k files into ~10k compilations × 20ms = ~200s of pure overhead.\n//\n// This cache avoids recompilation: one `new Query` per (language, querySource)\n// pair per process/worker lifetime — typically 1 per language (3 total for a\n// TS+Python+Go repo).\n//\n// Key: Language instance (singleton from parser-manager's languageCache)\n// Value: Map<querySource, compiled Query>\n// WeakMap: Language objects won't be GC-pinned by this cache.\n\nconst _queryCache = new WeakMap<Language, Map<string, Query>>();\n\nfunction getOrCompileQuery(language: Language, querySource: string): Query {\n let langMap = _queryCache.get(language);\n if (!langMap) {\n langMap = new Map<string, Query>();\n _queryCache.set(language, langMap);\n }\n let q = langMap.get(querySource);\n if (!q) {\n q = new Query(language, querySource);\n langMap.set(querySource, q);\n }\n return q;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function runQuery(\n tree: Tree,\n language: Language,\n querySource: string,\n): QueryCapture[] {\n const query = getOrCompileQuery(language, querySource);\n const matches = query.matches(tree.rootNode);\n const captures: QueryCapture[] = [];\n\n for (const match of matches) {\n for (const capture of match.captures) {\n captures.push({\n name: capture.name,\n node: capture.node,\n text: capture.node.text,\n });\n }\n }\n\n return captures;\n}\n\n/**\n * Return all captures grouped by match, so callers can correlate captures\n * within the same pattern match (e.g. \"def.func\" + \"def.func.name\").\n */\nexport function runQueryMatches(\n tree: Tree,\n language: Language,\n querySource: string,\n): QueryMatch[] {\n const query = getOrCompileQuery(language, querySource);\n const raw = query.matches(tree.rootNode);\n return raw.map((m) => ({\n patternIndex: m.patternIndex,\n captures: m.captures.map((c) => ({\n name: c.name,\n node: c.node,\n text: c.node.text,\n })),\n }));\n}\n","export const typescriptQueries = `\n;; Class declaration\n(class_declaration\n name: (type_identifier) @def.class.name) @def.class\n\n;; Abstract class\n(abstract_class_declaration\n name: (type_identifier) @def.class.name) @def.class\n\n;; Interface declaration\n(interface_declaration\n name: (type_identifier) @def.interface.name) @def.interface\n\n;; Type alias\n(type_alias_declaration\n name: (type_identifier) @def.type_alias.name) @def.type_alias\n\n;; Enum\n(enum_declaration\n name: (identifier) @def.enum.name) @def.enum\n\n;; Function declaration\n(function_declaration\n name: (identifier) @def.func.name) @def.func\n\n;; Arrow function in variable\n(lexical_declaration\n (variable_declarator\n name: (identifier) @def.func.name\n value: (arrow_function))) @def.func\n\n;; Const/let/var variable (non-function)\n(lexical_declaration\n (variable_declarator\n name: (identifier) @def.var.name\n value: (_) @def.var.value)) @def.var\n\n;; Method definition\n(method_definition\n name: (property_identifier) @def.method.name) @def.method\n\n;; Public field definition\n(public_field_definition\n name: (property_identifier) @def.property.name) @def.property\n\n;; Import statement\n(import_statement\n source: (string) @imp.source) @imp\n\n;; Import specifier\n(import_specifier\n name: (identifier) @imp.name)\n\n;; Namespace import\n(namespace_import (identifier) @imp.namespace)\n\n;; Export statement\n(export_statement) @export\n\n;; Call expression — function call\n(call_expression\n function: (identifier) @call.name) @call\n\n;; Call expression — member call\n(call_expression\n function: (member_expression\n object: (_) @call.receiver\n property: (property_identifier) @call.method)) @call.member\n\n;; New expression\n(new_expression\n constructor: (identifier) @call.constructor) @call.new\n\n;; Class heritage — extends\n(class_heritage\n (extends_clause\n value: (identifier) @inherit.extends))\n\n;; Class heritage — implements\n(class_heritage\n (implements_clause\n (type_identifier) @inherit.implements))\n`;\n","export const pythonQueries = `\n;; Class definition\n(class_definition\n name: (identifier) @def.class.name) @def.class\n\n;; Function definition\n(function_definition\n name: (identifier) @def.func.name) @def.func\n\n;; Decorated definition\n(decorated_definition\n (function_definition\n name: (identifier) @def.func.name)) @def.func.decorated\n\n;; Import from\n(import_from_statement\n module_name: (dotted_name) @imp.source) @imp\n\n;; Import\n(import_statement\n name: (dotted_name) @imp.module) @imp.direct\n\n;; Import alias\n(aliased_import\n name: (dotted_name) @imp.alias.original\n alias: (identifier) @imp.alias.name)\n\n;; Call expression\n(call\n function: (identifier) @call.name) @call\n\n;; Attribute call\n(call\n function: (attribute\n object: (_) @call.receiver\n attribute: (identifier) @call.method)) @call.member\n\n;; Assignment\n(assignment\n left: (identifier) @def.var.name) @def.var\n\n;; Class base classes\n(class_definition\n superclasses: (argument_list\n (identifier) @inherit.extends))\n`;\n","export const javaQueries = `\n;; Class declaration\n(class_declaration\n name: (identifier) @def.class.name) @def.class\n\n;; Interface declaration\n(interface_declaration\n name: (identifier) @def.interface.name) @def.interface\n\n;; Enum declaration\n(enum_declaration\n name: (identifier) @def.enum.name) @def.enum\n\n;; Method declaration\n(method_declaration\n name: (identifier) @def.method.name) @def.method\n\n;; Constructor declaration\n(constructor_declaration\n name: (identifier) @def.constructor.name) @def.constructor\n\n;; Field declaration\n(field_declaration\n declarator: (variable_declarator\n name: (identifier) @def.property.name)) @def.property\n\n;; Import\n(import_declaration\n (scoped_identifier) @imp.source) @imp\n\n;; Call\n(method_invocation\n name: (identifier) @call.name) @call\n\n;; Object creation\n(object_creation_expression\n type: (type_identifier) @call.constructor) @call.new\n\n;; Extends\n(superclass (type_identifier) @inherit.extends)\n\n;; Implements\n(super_interfaces\n (type_list (type_identifier) @inherit.implements))\n`;\n","export const goQueries = `\n;; Function declaration\n(function_declaration\n name: (identifier) @def.func.name) @def.func\n\n;; Method declaration\n(method_declaration\n name: (field_identifier) @def.method.name) @def.method\n\n;; Type declaration — struct\n(type_declaration\n (type_spec\n name: (type_identifier) @def.struct.name\n type: (struct_type))) @def.struct\n\n;; Type declaration — interface\n(type_declaration\n (type_spec\n name: (type_identifier) @def.interface.name\n type: (interface_type))) @def.interface\n\n;; Import spec\n(import_spec\n path: (interpreted_string_literal) @imp.source) @imp\n\n;; Call expression\n(call_expression\n function: (identifier) @call.name) @call\n\n;; Selector call\n(call_expression\n function: (selector_expression\n operand: (_) @call.receiver\n field: (field_identifier) @call.method)) @call.member\n\n;; Const declaration\n(const_declaration\n (const_spec\n name: (identifier) @def.constant.name)) @def.constant\n\n;; Var declaration\n(var_declaration\n (var_spec\n name: (identifier) @def.var.name)) @def.var\n`;\n","export const cQueries = `\n;; Function definition\n(function_definition\n declarator: (function_declarator\n declarator: (identifier) @def.func.name)) @def.func\n\n;; Struct specifier\n(struct_specifier\n name: (type_identifier) @def.struct.name) @def.struct\n\n;; Enum specifier\n(enum_specifier\n name: (type_identifier) @def.enum.name) @def.enum\n\n;; Typedef\n(type_definition\n declarator: (type_identifier) @def.type_alias.name) @def.type_alias\n\n;; Include\n(preproc_include\n path: (_) @imp.source) @imp\n\n;; Call\n(call_expression\n function: (identifier) @call.name) @call\n\n;; Global variable\n(declaration\n declarator: (init_declarator\n declarator: (identifier) @def.var.name)) @def.var\n`;\n","export const cppQueries = `\n;; Class specifier\n(class_specifier\n name: (type_identifier) @def.class.name) @def.class\n\n;; Struct specifier\n(struct_specifier\n name: (type_identifier) @def.struct.name) @def.struct\n\n;; Function definition\n(function_definition\n declarator: (function_declarator\n declarator: (identifier) @def.func.name)) @def.func\n\n;; Namespace definition\n(namespace_definition\n name: (namespace_identifier) @def.namespace.name) @def.namespace\n\n;; Template declaration\n(template_declaration\n (class_specifier\n name: (type_identifier) @def.class.name)) @def.class.template\n\n;; Include\n(preproc_include\n path: (_) @imp.source) @imp\n\n;; Call\n(call_expression\n function: (identifier) @call.name) @call\n\n;; Member call\n(call_expression\n function: (field_expression\n field: (field_identifier) @call.method)) @call.member\n\n;; Base class clause\n(base_class_clause\n (type_identifier) @inherit.extends)\n\n;; Enum\n(enum_specifier\n name: (type_identifier) @def.enum.name) @def.enum\n`;\n","export const csharpQueries = `\n;; Class declaration\n(class_declaration\n name: (identifier) @def.class.name) @def.class\n\n;; Interface declaration\n(interface_declaration\n name: (identifier) @def.interface.name) @def.interface\n\n;; Struct declaration\n(struct_declaration\n name: (identifier) @def.struct.name) @def.struct\n\n;; Enum declaration\n(enum_declaration\n name: (identifier) @def.enum.name) @def.enum\n\n;; Method declaration\n(method_declaration\n name: (identifier) @def.method.name) @def.method\n\n;; Constructor declaration\n(constructor_declaration\n name: (identifier) @def.constructor.name) @def.constructor\n\n;; Property declaration\n(property_declaration\n name: (identifier) @def.property.name) @def.property\n\n;; Namespace declaration\n(namespace_declaration\n name: (_) @def.namespace.name) @def.namespace\n\n;; Using directive\n(using_directive\n (qualified_name) @imp.source) @imp\n\n;; Invocation\n(invocation_expression\n function: (identifier) @call.name) @call\n\n;; Member invocation\n(invocation_expression\n function: (member_access_expression\n name: (identifier) @call.method)) @call.member\n\n;; Object creation\n(object_creation_expression\n type: (identifier) @call.constructor) @call.new\n\n;; Base list (extends/implements)\n(base_list\n (identifier) @inherit.extends)\n`;\n","export const rustQueries = `\n;; Function item\n(function_item\n name: (identifier) @def.func.name) @def.func\n\n;; Struct item\n(struct_item\n name: (type_identifier) @def.struct.name) @def.struct\n\n;; Enum item\n(enum_item\n name: (type_identifier) @def.enum.name) @def.enum\n\n;; Trait item\n(trait_item\n name: (type_identifier) @def.trait.name) @def.trait\n\n;; Impl item\n(impl_item\n type: (type_identifier) @def.class.name) @def.impl\n\n;; Type alias\n(type_item\n name: (type_identifier) @def.type_alias.name) @def.type_alias\n\n;; Use declaration\n(use_declaration\n argument: (_) @imp.source) @imp\n\n;; Call\n(call_expression\n function: (identifier) @call.name) @call\n\n;; Method call\n(call_expression\n function: (field_expression\n field: (field_identifier) @call.method)) @call.member\n\n;; Const item\n(const_item\n name: (identifier) @def.constant.name) @def.constant\n\n;; Static item\n(static_item\n name: (identifier) @def.var.name) @def.var\n`;\n","export const phpQueries = `\n;; Class declaration\n(class_declaration\n name: (name) @def.class.name) @def.class\n\n;; Interface declaration\n(interface_declaration\n name: (name) @def.interface.name) @def.interface\n\n;; Trait declaration\n(trait_declaration\n name: (name) @def.trait.name) @def.trait\n\n;; Function definition\n(function_definition\n name: (name) @def.func.name) @def.func\n\n;; Method declaration\n(method_declaration\n name: (name) @def.method.name) @def.method\n\n;; Property declaration\n(property_declaration\n (property_element\n (variable_name) @def.property.name)) @def.property\n\n;; Namespace definition\n(namespace_definition\n name: (namespace_name) @def.namespace.name) @def.namespace\n\n;; Use declaration (import)\n(namespace_use_declaration\n (namespace_use_clause\n (qualified_name) @imp.source)) @imp\n\n;; Include/require\n(include_expression\n (_) @imp.source) @imp.include\n\n;; Function call\n(function_call_expression\n function: (name) @call.name) @call\n\n;; Method call\n(member_call_expression\n name: (name) @call.method) @call.member\n\n;; Object creation\n(object_creation_expression\n (name) @call.constructor) @call.new\n\n;; Class base clause\n(base_clause\n (name) @inherit.extends)\n\n;; Class interface clause\n(class_interface_clause\n (name) @inherit.implements)\n`;\n","export const kotlinQueries = `\n;; Class declaration (includes enum class via modifiers)\n(class_declaration\n (identifier) @def.class.name) @def.class\n\n;; Object declaration (companion objects, singletons)\n(object_declaration\n (identifier) @def.class.name) @def.class.object\n\n;; Function declaration (top-level and methods)\n(function_declaration\n (identifier) @def.func.name) @def.func\n\n;; Property declaration\n(property_declaration\n (variable_declaration\n (identifier) @def.property.name)) @def.property\n`;\n","export const rubyQueries = `\n;; Class\n(class\n name: (constant) @def.class.name) @def.class\n\n;; Module\n(module\n name: (constant) @def.module.name) @def.module\n\n;; Method\n(method\n name: (identifier) @def.method.name) @def.method\n\n;; Singleton method\n(singleton_method\n name: (identifier) @def.method.name) @def.method.static\n\n;; Assignment\n(assignment\n left: (identifier) @def.var.name) @def.var\n\n;; Require\n(call\n method: (identifier) @_method\n arguments: (argument_list (string) @imp.source)\n (#match? @_method \"^require\"))\n\n;; Call\n(call\n method: (identifier) @call.name) @call\n\n;; Superclass\n(superclass\n (constant) @inherit.extends)\n`;\n","export const swiftQueries = `\n;; In tree-sitter-swift, structs/classes/enums/actors all use class_declaration.\n;; Distinguish them with a keyword anchor.\n\n;; Struct declaration\n(class_declaration \"struct\"\n (type_identifier) @def.struct.name) @def.struct\n\n;; Class declaration\n(class_declaration \"class\"\n (type_identifier) @def.class.name) @def.class\n\n;; Enum declaration\n(class_declaration \"enum\"\n (type_identifier) @def.enum.name) @def.enum\n\n;; Protocol declaration\n(protocol_declaration\n (type_identifier) @def.interface.name) @def.interface\n\n;; Function declaration (no name: field in this grammar; positional match)\n(function_declaration\n (simple_identifier) @def.func.name) @def.func\n\n;; Property declaration\n(property_declaration\n (pattern\n (simple_identifier) @def.property.name)) @def.property\n`;\n","/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { ExportResult } from '@opentelemetry/core';\nimport type { IOtlpExportDelegate } from './otlp-export-delegate';\n\nexport class OTLPExporterBase<Internal> {\n private _delegate: IOtlpExportDelegate<Internal>;\n constructor(delegate: IOtlpExportDelegate<Internal>) {\n this._delegate = delegate;\n }\n\n /**\n * Export items.\n * @param items\n * @param resultCallback\n */\n export(\n items: Internal,\n resultCallback: (result: ExportResult) => void\n ): void {\n this._delegate.export(items, resultCallback);\n }\n\n forceFlush(): Promise<void> {\n return this._delegate.forceFlush();\n }\n\n shutdown(): Promise<void> {\n return this._delegate.shutdown();\n }\n}\n","/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Interface for handling error\n */\nexport class OTLPExporterError extends Error {\n readonly code?: number;\n override readonly name: string = 'OTLPExporterError';\n readonly data?: string;\n\n constructor(message?: string, code?: number, data?: string) {\n super(message);\n this.data = data;\n this.code = code;\n }\n}\n\n/**\n * Interface for handling export service errors\n */\nexport interface ExportServiceError {\n name: string;\n code: number;\n details: string;\n metadata: { [key: string]: unknown };\n message: string;\n stack: string;\n}\n","/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { HeadersFactory } from './otlp-http-configuration';\n\n/**\n * Configuration shared across all OTLP exporters\n *\n * Implementation note: anything added here MUST be\n * - platform-agnostic\n * - signal-agnostic\n * - transport-agnostic\n */\nexport interface OtlpSharedConfiguration {\n timeoutMillis: number;\n concurrencyLimit: number;\n compression: 'gzip' | 'none';\n}\n\nexport function validateTimeoutMillis(timeoutMillis: number) {\n if (Number.isFinite(timeoutMillis) && timeoutMillis > 0) {\n return timeoutMillis;\n }\n throw new Error(\n `Configuration: timeoutMillis is invalid, expected number greater than 0 (actual: '${timeoutMillis}')`\n );\n}\n\nexport function wrapStaticHeadersInFunction(\n headers: Record<string, string> | undefined\n): HeadersFactory | undefined {\n if (headers == null) {\n return undefined;\n }\n\n return async () => headers;\n}\n\n/**\n * @param userProvidedConfiguration Configuration options provided by the user in code.\n * @param fallbackConfiguration Fallback to use when the {@link userProvidedConfiguration} does not specify an option.\n * @param defaultConfiguration The defaults as defined by the exporter specification\n */\nexport function mergeOtlpSharedConfigurationWithDefaults(\n userProvidedConfiguration: Partial<OtlpSharedConfiguration>,\n fallbackConfiguration: Partial<OtlpSharedConfiguration>,\n defaultConfiguration: OtlpSharedConfiguration\n): OtlpSharedConfiguration {\n return {\n timeoutMillis: validateTimeoutMillis(\n userProvidedConfiguration.timeoutMillis ??\n fallbackConfiguration.timeoutMillis ??\n defaultConfiguration.timeoutMillis\n ),\n concurrencyLimit:\n userProvidedConfiguration.concurrencyLimit ??\n fallbackConfiguration.concurrencyLimit ??\n defaultConfiguration.concurrencyLimit,\n compression:\n userProvidedConfiguration.compression ??\n fallbackConfiguration.compression ??\n defaultConfiguration.compression,\n };\n}\n\nexport function getSharedConfigurationDefaults(): OtlpSharedConfiguration {\n return {\n timeoutMillis: 10000,\n concurrencyLimit: 30,\n compression: 'none',\n };\n}\n","/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nexport interface IExportPromiseHandler {\n pushPromise(promise: Promise<void>): void;\n hasReachedLimit(): boolean;\n awaitAll(): Promise<void>;\n}\n\nclass BoundedQueueExportPromiseHandler implements IExportPromiseHandler {\n private readonly _concurrencyLimit: number;\n private _sendingPromises: Promise<unknown>[] = [];\n\n /**\n * @param concurrencyLimit maximum promises allowed in a queue at the same time.\n */\n constructor(concurrencyLimit: number) {\n this._concurrencyLimit = concurrencyLimit;\n }\n\n public pushPromise(promise: Promise<void>): void {\n if (this.hasReachedLimit()) {\n throw new Error('Concurrency Limit reached');\n }\n\n this._sendingPromises.push(promise);\n const popPromise = () => {\n const index = this._sendingPromises.indexOf(promise);\n void this._sendingPromises.splice(index, 1);\n };\n promise.then(popPromise, popPromise);\n }\n\n public hasReachedLimit(): boolean {\n return this._sendingPromises.length >= this._concurrencyLimit;\n }\n\n public async awaitAll(): Promise<void> {\n await Promise.all(this._sendingPromises);\n }\n}\n\n/**\n * Promise queue for keeping track of export promises. Finished promises will be auto-dequeued.\n * Allows for awaiting all promises in the queue.\n */\nexport function createBoundedQueueExportPromiseHandler(options: {\n concurrencyLimit: number;\n}): IExportPromiseHandler {\n return new BoundedQueueExportPromiseHandler(options.concurrencyLimit);\n}\n","/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nexport const BAGGAGE_KEY_PAIR_SEPARATOR = '=';\nexport const BAGGAGE_PROPERTIES_SEPARATOR = ';';\nexport const BAGGAGE_ITEMS_SEPARATOR = ',';\n\n// Name of the http header used to propagate the baggage\nexport const BAGGAGE_HEADER = 'baggage';\n// Maximum number of name-value pairs allowed by w3c spec\nexport const BAGGAGE_MAX_NAME_VALUE_PAIRS = 180;\n// Maximum number of bytes per a single name-value pair allowed by w3c spec\nexport const BAGGAGE_MAX_PER_NAME_VALUE_PAIRS = 4096;\n// Maximum total length of all name-value pairs allowed by w3c spec\nexport const BAGGAGE_MAX_TOTAL_LENGTH = 8192;\n","/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\nimport type { Baggage, BaggageEntryMetadata } from '@opentelemetry/api';\nimport { baggageEntryMetadataFromString } from '@opentelemetry/api';\nimport {\n BAGGAGE_ITEMS_SEPARATOR,\n BAGGAGE_PROPERTIES_SEPARATOR,\n BAGGAGE_KEY_PAIR_SEPARATOR,\n BAGGAGE_MAX_TOTAL_LENGTH,\n} from './constants';\n\ntype ParsedBaggageKeyValue = {\n key: string;\n value: string;\n metadata: BaggageEntryMetadata | undefined;\n};\n\nexport function serializeKeyPairs(keyPairs: string[]): string {\n return keyPairs.reduce((hValue: string, current: string) => {\n const value = `${hValue}${\n hValue !== '' ? BAGGAGE_ITEMS_SEPARATOR : ''\n }${current}`;\n return value.length > BAGGAGE_MAX_TOTAL_LENGTH ? hValue : value;\n }, '');\n}\n\nexport function getKeyPairs(baggage: Baggage): string[] {\n return baggage.getAllEntries().map(([key, value]) => {\n let entry = `${encodeURIComponent(key)}=${encodeURIComponent(value.value)}`;\n\n // include opaque metadata if provided\n // NOTE: we intentionally don't URI-encode the metadata - that responsibility falls on the metadata implementation\n if (value.metadata !== undefined) {\n entry += BAGGAGE_PROPERTIES_SEPARATOR + value.metadata.toString();\n }\n\n return entry;\n });\n}\n\nexport function parsePairKeyValue(\n entry: string\n): ParsedBaggageKeyValue | undefined {\n if (!entry) return;\n const metadataSeparatorIndex = entry.indexOf(BAGGAGE_PROPERTIES_SEPARATOR);\n const keyPairPart =\n metadataSeparatorIndex === -1\n ? entry\n : entry.substring(0, metadataSeparatorIndex);\n\n const separatorIndex = keyPairPart.indexOf(BAGGAGE_KEY_PAIR_SEPARATOR);\n if (separatorIndex <= 0) return;\n\n const rawKey = keyPairPart.substring(0, separatorIndex).trim();\n const rawValue = keyPairPart.substring(separatorIndex + 1).trim();\n\n if (!rawKey || !rawValue) return;\n let key: string;\n let value: string;\n try {\n key = decodeURIComponent(rawKey);\n value = decodeURIComponent(rawValue);\n } catch {\n return;\n }\n\n let metadata;\n if (\n metadataSeparatorIndex !== -1 &&\n metadataSeparatorIndex < entry.length - 1\n ) {\n const metadataString = entry.substring(metadataSeparatorIndex + 1);\n metadata = baggageEntryMetadataFromString(metadataString);\n }\n\n return { key, value, metadata };\n}\n\n/**\n * Parse a string serialized in the baggage HTTP Format (without metadata):\n * https://github.com/w3c/baggage/blob/master/baggage/HTTP_HEADER_FORMAT.md\n */\nexport function parseKeyPairsIntoRecord(\n value?: string\n): Record<string, string> {\n const result: Record<string, string> = {};\n\n if (typeof value === 'string' && value.length > 0) {\n value.split(BAGGAGE_ITEMS_SEPARATOR).forEach(entry => {\n const keyPair = parsePairKeyValue(entry);\n\n if (keyPair !== undefined && keyPair.value.length > 0) {\n result[keyPair.key] = keyPair.value;\n }\n });\n }\n\n return result;\n}\n","/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { diag } from '@opentelemetry/api';\nimport { inspect } from 'util';\n\n/**\n * Retrieves a number from an environment variable.\n * - Returns `undefined` if the environment variable is empty, unset, contains only whitespace, or is not a number.\n * - Returns a number in all other cases.\n *\n * @param {string} key - The name of the environment variable to retrieve.\n * @returns {number | undefined} - The number value or `undefined`.\n */\nexport function getNumberFromEnv(key: string): number | undefined {\n const raw = process.env[key];\n if (raw == null || raw.trim() === '') {\n return undefined;\n }\n\n const value = Number(raw);\n if (isNaN(value)) {\n diag.warn(\n `Unknown value ${inspect(raw)} for ${key}, expected a number, using defaults`\n );\n return undefined;\n }\n\n return value;\n}\n\n/**\n * Retrieves a string from an environment variable.\n * - Returns `undefined` if the environment variable is empty, unset, or contains only whitespace.\n *\n * @param {string} key - The name of the environment variable to retrieve.\n * @returns {string | undefined} - The string value or `undefined`.\n */\nexport function getStringFromEnv(key: string): string | undefined {\n const raw = process.env[key];\n if (raw == null || raw.trim() === '') {\n return undefined;\n }\n return raw;\n}\n\n/**\n * Retrieves a boolean value from an environment variable.\n * - Trims leading and trailing whitespace and ignores casing.\n * - Returns `false` if the environment variable is empty, unset, or contains only whitespace.\n * - Returns `false` for strings that cannot be mapped to a boolean.\n *\n * @param {string} key - The name of the environment variable to retrieve.\n * @returns {boolean} - The boolean value or `false` if the environment variable is unset empty, unset, or contains only whitespace.\n */\nexport function getBooleanFromEnv(key: string): boolean {\n const raw = process.env[key]?.trim().toLowerCase();\n if (raw == null || raw === '') {\n // NOTE: falling back to `false` instead of `undefined` as required by the specification.\n // If you have a use-case that requires `undefined`, consider using `getStringFromEnv()` and applying the necessary\n // normalizations in the consuming code.\n return false;\n }\n if (raw === 'true') {\n return true;\n } else if (raw === 'false') {\n return false;\n } else {\n diag.warn(\n `Unknown value ${inspect(raw)} for ${key}, expected 'true' or 'false', falling back to 'false' (default)`\n );\n return false;\n }\n}\n\n/**\n * Retrieves a list of strings from an environment variable.\n * - Uses ',' as the delimiter.\n * - Trims leading and trailing whitespace from each entry.\n * - Excludes empty entries.\n * - Returns `undefined` if the environment variable is empty or contains only whitespace.\n * - Returns an empty array if all entries are empty or whitespace.\n *\n * @param {string} key - The name of the environment variable to retrieve.\n * @returns {string[] | undefined} - The list of strings or `undefined`.\n */\nexport function getStringListFromEnv(key: string): string[] | undefined {\n return getStringFromEnv(key)\n ?.split(',')\n .map(v => v.trim())\n .filter(s => s !== '');\n}\n","/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nexport {\n getStringFromEnv,\n getBooleanFromEnv,\n getNumberFromEnv,\n getStringListFromEnv,\n} from './environment';\nexport { _globalThis } from '../../common/globalThis';\nexport { SDK_INFO } from './sdk-info';\n\n/**\n * @deprecated Use performance directly.\n */\nexport const otperformance: { now(): number; readonly timeOrigin: number } =\n performance;\n","/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\nexport {\n SDK_INFO,\n _globalThis,\n otperformance,\n getBooleanFromEnv,\n getStringFromEnv,\n getNumberFromEnv,\n getStringListFromEnv,\n} from './node';\n","/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type * as api from '@opentelemetry/api';\nimport { otperformance as performance } from '../platform';\n\nconst NANOSECOND_DIGITS = 9;\nconst NANOSECOND_DIGITS_IN_MILLIS = 6;\nconst MILLISECONDS_TO_NANOSECONDS = Math.pow(10, NANOSECOND_DIGITS_IN_MILLIS);\nconst SECOND_TO_NANOSECONDS = Math.pow(10, NANOSECOND_DIGITS);\n\n/**\n * Converts a number of milliseconds from epoch to HrTime([seconds, remainder in nanoseconds]).\n * @param epochMillis\n */\nexport function millisToHrTime(epochMillis: number): api.HrTime {\n const epochSeconds = epochMillis / 1000;\n // Decimals only.\n const seconds = Math.trunc(epochSeconds);\n // Round sub-nanosecond accuracy to nanosecond.\n const nanos = Math.round((epochMillis % 1000) * MILLISECONDS_TO_NANOSECONDS);\n return [seconds, nanos];\n}\n\n/**\n * @deprecated Use `performance.timeOrigin` directly.\n */\nexport function getTimeOrigin(): number {\n return performance.timeOrigin;\n}\n\n/**\n * Returns an hrtime calculated via performance component.\n * @param performanceNow\n */\nexport function hrTime(performanceNow?: number): api.HrTime {\n const timeOrigin = millisToHrTime(performance.timeOrigin);\n const now = millisToHrTime(\n typeof performanceNow === 'number' ? performanceNow : performance.now()\n );\n\n return addHrTimes(timeOrigin, now);\n}\n\n/**\n *\n * Converts a TimeInput to an HrTime, defaults to _hrtime().\n * @param time\n */\nexport function timeInputToHrTime(time: api.TimeInput): api.HrTime {\n // process.hrtime\n if (isTimeInputHrTime(time)) {\n return time as api.HrTime;\n } else if (typeof time === 'number') {\n // Must be a performance.now() if it's smaller than process start time.\n if (time < performance.timeOrigin) {\n return hrTime(time);\n } else {\n // epoch milliseconds or performance.timeOrigin\n return millisToHrTime(time);\n }\n } else if (time instanceof Date) {\n return millisToHrTime(time.getTime());\n } else {\n throw TypeError('Invalid input type');\n }\n}\n\n/**\n * Returns a duration of two hrTime.\n * @param startTime\n * @param endTime\n */\nexport function hrTimeDuration(\n startTime: api.HrTime,\n endTime: api.HrTime\n): api.HrTime {\n let seconds = endTime[0] - startTime[0];\n let nanos = endTime[1] - startTime[1];\n\n // overflow\n if (nanos < 0) {\n seconds -= 1;\n // negate\n nanos += SECOND_TO_NANOSECONDS;\n }\n\n return [seconds, nanos];\n}\n\n/**\n * Convert hrTime to timestamp, for example \"2019-05-14T17:00:00.000123456Z\"\n * @param time\n */\nexport function hrTimeToTimeStamp(time: api.HrTime): string {\n const precision = NANOSECOND_DIGITS;\n const tmp = `${'0'.repeat(precision)}${time[1]}Z`;\n const nanoString = tmp.substring(tmp.length - precision - 1);\n const date = new Date(time[0] * 1000).toISOString();\n return date.replace('000Z', nanoString);\n}\n\n/**\n * Convert hrTime to nanoseconds.\n * @param time\n */\nexport function hrTimeToNanoseconds(time: api.HrTime): number {\n return time[0] * SECOND_TO_NANOSECONDS + time[1];\n}\n\n/**\n * Convert hrTime to milliseconds.\n * @param time\n */\nexport function hrTimeToMilliseconds(time: api.HrTime): number {\n return time[0] * 1e3 + time[1] / 1e6;\n}\n\n/**\n * Convert hrTime to microseconds.\n * @param time\n */\nexport function hrTimeToMicroseconds(time: api.HrTime): number {\n return time[0] * 1e6 + time[1] / 1e3;\n}\n\n/**\n * check if time is HrTime\n * @param value\n */\nexport function isTimeInputHrTime(value: unknown): value is api.HrTime {\n return (\n Array.isArray(value) &&\n value.length === 2 &&\n typeof value[0] === 'number' &&\n typeof value[1] === 'number'\n );\n}\n\n/**\n * check if input value is a correct types.TimeInput\n * @param value\n */\nexport function isTimeInput(\n value: unknown\n): value is api.HrTime | number | Date {\n return (\n isTimeInputHrTime(value) ||\n typeof value === 'number' ||\n value instanceof Date\n );\n}\n\n/**\n * Given 2 HrTime formatted times, return their sum as an HrTime.\n */\nexport function addHrTimes(time1: api.HrTime, time2: api.HrTime): api.HrTime {\n const out = [time1[0] + time2[0], time1[1] + time2[1]] as api.HrTime;\n\n // Nanoseconds\n if (out[1] >= SECOND_TO_NANOSECONDS) {\n out[1] -= SECOND_TO_NANOSECONDS;\n out[0] += 1;\n }\n\n return out;\n}\n","/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nexport interface ExportResult {\n code: ExportResultCode;\n error?: Error;\n}\n\nexport enum ExportResultCode {\n SUCCESS,\n FAILED,\n}\n","/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nexport { W3CBaggagePropagator } from './baggage/propagation/W3CBaggagePropagator';\nexport { AnchoredClock } from './common/anchored-clock';\nexport type { Clock } from './common/anchored-clock';\nexport { isAttributeValue, sanitizeAttributes } from './common/attributes';\nexport {\n globalErrorHandler,\n setGlobalErrorHandler,\n} from './common/global-error-handler';\nexport { loggingErrorHandler } from './common/logging-error-handler';\nexport {\n addHrTimes,\n getTimeOrigin,\n hrTime,\n hrTimeDuration,\n hrTimeToMicroseconds,\n hrTimeToMilliseconds,\n hrTimeToNanoseconds,\n hrTimeToTimeStamp,\n isTimeInput,\n isTimeInputHrTime,\n millisToHrTime,\n timeInputToHrTime,\n} from './common/time';\nexport { unrefTimer } from './common/timer-util';\nexport type { ErrorHandler, InstrumentationScope } from './common/types';\nexport { ExportResultCode } from './ExportResult';\nexport type { ExportResult } from './ExportResult';\nexport { parseKeyPairsIntoRecord } from './baggage/utils';\nexport {\n SDK_INFO,\n _globalThis,\n getStringFromEnv,\n getBooleanFromEnv,\n getNumberFromEnv,\n getStringListFromEnv,\n otperformance,\n} from './platform';\nexport { CompositePropagator } from './propagation/composite';\nexport type { CompositePropagatorConfig } from './propagation/composite';\nexport {\n TRACE_PARENT_HEADER,\n TRACE_STATE_HEADER,\n W3CTraceContextPropagator,\n parseTraceParent,\n} from './trace/W3CTraceContextPropagator';\nexport {\n RPCType,\n deleteRPCMetadata,\n getRPCMetadata,\n setRPCMetadata,\n} from './trace/rpc-metadata';\nexport type { RPCMetadata } from './trace/rpc-metadata';\nexport {\n isTracingSuppressed,\n suppressTracing,\n unsuppressTracing,\n} from './trace/suppress-tracing';\nexport { TraceState } from './trace/TraceState';\nexport { merge } from './utils/merge';\nexport { TimeoutError, callWithTimeout } from './utils/timeout';\nexport { isUrlIgnored, urlMatches } from './utils/url';\nexport { BindOnceFuture } from './utils/callback';\nexport { diagLogLevelFromString } from './utils/configuration';\nimport { _export } from './internal/exporter';\nexport const internal = {\n _export,\n};\n","/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\nimport { diag } from '@opentelemetry/api';\nimport type { IOtlpResponseHandler } from './response-handler';\n\nfunction isPartialSuccessResponse(\n response: unknown\n): response is { partialSuccess: never } {\n return Object.prototype.hasOwnProperty.call(response, 'partialSuccess');\n}\n\n/**\n * Default response handler that logs a partial success to the console.\n */\nexport function createLoggingPartialSuccessResponseHandler<\n T,\n>(): IOtlpResponseHandler<T> {\n return {\n handleResponse(response: T) {\n // Partial success MUST never be an empty object according the specification\n // see https://opentelemetry.io/docs/specs/otlp/#partial-success\n if (\n response == null ||\n !isPartialSuccessResponse(response) ||\n response.partialSuccess == null ||\n Object.keys(response.partialSuccess).length === 0\n ) {\n return;\n }\n diag.warn(\n 'Received Partial Success response:',\n JSON.stringify(response.partialSuccess)\n );\n },\n };\n}\n","/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { ExportResult } from '@opentelemetry/core';\nimport { ExportResultCode } from '@opentelemetry/core';\nimport type { IExporterTransport } from './exporter-transport';\nimport type { IExportPromiseHandler } from './bounded-queue-export-promise-handler';\nimport type { ISerializer } from '@opentelemetry/otlp-transformer';\nimport { OTLPExporterError } from './types';\nimport type { IOtlpResponseHandler } from './response-handler';\nimport { createLoggingPartialSuccessResponseHandler } from './logging-response-handler';\nimport type { DiagLogger } from '@opentelemetry/api';\nimport { diag } from '@opentelemetry/api';\n\n/**\n * Internally shared export logic for OTLP.\n */\nexport interface IOtlpExportDelegate<Internal> {\n export(\n internalRepresentation: Internal,\n resultCallback: (result: ExportResult) => void\n ): void;\n forceFlush(): Promise<void>;\n shutdown(): Promise<void>;\n}\n\nclass OTLPExportDelegate<Internal, Response>\n implements IOtlpExportDelegate<Internal>\n{\n private _diagLogger: DiagLogger;\n private _transport: IExporterTransport;\n private _serializer: ISerializer<Internal, Response>;\n private _responseHandler: IOtlpResponseHandler<Response>;\n private _promiseQueue: IExportPromiseHandler;\n private _timeout: number;\n\n constructor(\n transport: IExporterTransport,\n serializer: ISerializer<Internal, Response>,\n responseHandler: IOtlpResponseHandler<Response>,\n promiseQueue: IExportPromiseHandler,\n timeout: number\n ) {\n this._transport = transport;\n this._serializer = serializer;\n this._responseHandler = responseHandler;\n this._promiseQueue = promiseQueue;\n this._timeout = timeout;\n this._diagLogger = diag.createComponentLogger({\n namespace: 'OTLPExportDelegate',\n });\n }\n\n export(\n internalRepresentation: Internal,\n resultCallback: (result: ExportResult) => void\n ): void {\n this._diagLogger.debug('items to be sent', internalRepresentation);\n\n // don't do any work if too many exports are in progress.\n if (this._promiseQueue.hasReachedLimit()) {\n resultCallback({\n code: ExportResultCode.FAILED,\n error: new Error('Concurrent export limit reached'),\n });\n return;\n }\n\n const serializedRequest = this._serializer.serializeRequest(\n internalRepresentation\n );\n\n if (serializedRequest == null) {\n resultCallback({\n code: ExportResultCode.FAILED,\n error: new Error('Nothing to send'),\n });\n return;\n }\n\n this._promiseQueue.pushPromise(\n this._transport.send(serializedRequest, this._timeout).then(\n response => {\n if (response.status === 'success') {\n if (response.data != null) {\n try {\n this._responseHandler.handleResponse(\n this._serializer.deserializeResponse(response.data)\n );\n } catch (e) {\n this._diagLogger.warn(\n 'Export succeeded but could not deserialize response - is the response specification compliant?',\n e,\n response.data\n );\n }\n }\n // No matter the response, we can consider the export still successful.\n resultCallback({\n code: ExportResultCode.SUCCESS,\n });\n return;\n } else if (response.status === 'failure' && response.error) {\n resultCallback({\n code: ExportResultCode.FAILED,\n error: response.error,\n });\n return;\n } else if (response.status === 'retryable') {\n resultCallback({\n code: ExportResultCode.FAILED,\n error:\n response.error ??\n new OTLPExporterError('Export failed with retryable status'),\n });\n } else {\n resultCallback({\n code: ExportResultCode.FAILED,\n error: new OTLPExporterError('Export failed with unknown error'),\n });\n }\n },\n reason =>\n resultCallback({\n code: ExportResultCode.FAILED,\n error: reason,\n })\n )\n );\n }\n\n forceFlush(): Promise<void> {\n return this._promiseQueue.awaitAll();\n }\n\n async shutdown(): Promise<void> {\n this._diagLogger.debug('shutdown started');\n await this.forceFlush();\n this._transport.shutdown();\n }\n}\n\n/**\n * Creates a generic delegate for OTLP exports which only contains parts of the OTLP export that are shared across all\n * signals.\n */\nexport function createOtlpExportDelegate<Internal, Response>(\n components: {\n transport: IExporterTransport;\n serializer: ISerializer<Internal, Response>;\n promiseHandler: IExportPromiseHandler;\n },\n settings: { timeout: number }\n): IOtlpExportDelegate<Internal> {\n return new OTLPExportDelegate(\n components.transport,\n components.serializer,\n createLoggingPartialSuccessResponseHandler(),\n components.promiseHandler,\n settings.timeout\n );\n}\n","/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nexport { OTLPExporterBase } from './OTLPExporterBase';\nexport { OTLPExporterError } from './types';\n\nexport type {\n ExportResponse,\n ExportResponseFailure,\n ExportResponseSuccess,\n ExportResponseRetryable,\n} from './export-response';\n\nexport type { IExporterTransport } from './exporter-transport';\n\nexport {\n mergeOtlpSharedConfigurationWithDefaults,\n getSharedConfigurationDefaults,\n} from './configuration/shared-configuration';\nexport type { OtlpSharedConfiguration } from './configuration/shared-configuration';\n\nexport { CompressionAlgorithm } from './configuration/legacy-node-configuration';\nexport type { OTLPExporterNodeConfigBase } from './configuration/legacy-node-configuration';\nexport type { OTLPExporterConfigBase } from './configuration/legacy-base-configuration';\nexport type { IOtlpExportDelegate } from './otlp-export-delegate';\nexport { createOtlpNetworkExportDelegate } from './otlp-network-export-delegate';\n","/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\nimport type {\n IAnyValue,\n IInstrumentationScope,\n IKeyValue,\n Resource,\n} from './internal-types';\nimport type { Attributes } from '@opentelemetry/api';\nimport type { InstrumentationScope } from '@opentelemetry/core';\nimport type { Resource as ISdkResource } from '@opentelemetry/resources';\nimport type { Encoder } from './utils';\n\nexport function createResource(\n resource: ISdkResource,\n encoder: Encoder\n): Resource {\n const result: Resource = {\n attributes: toAttributes(resource.attributes, encoder),\n droppedAttributesCount: 0,\n };\n\n const schemaUrl = resource.schemaUrl;\n if (schemaUrl && schemaUrl !== '') result.schemaUrl = schemaUrl;\n\n return result;\n}\n\nexport function createInstrumentationScope(\n scope: InstrumentationScope\n): IInstrumentationScope {\n return {\n name: scope.name,\n version: scope.version,\n };\n}\n\nexport function toAttributes(\n attributes: Attributes,\n encoder: Encoder\n): IKeyValue[] {\n return Object.keys(attributes).map(key =>\n toKeyValue(key, attributes[key], encoder)\n );\n}\n\nexport function toKeyValue(\n key: string,\n value: unknown,\n encoder: Encoder\n): IKeyValue {\n return {\n key: key,\n value: toAnyValue(value, encoder),\n };\n}\n\nexport function toAnyValue(value: unknown, encoder: Encoder): IAnyValue {\n const t = typeof value;\n if (t === 'string') return { stringValue: value as string };\n if (t === 'number') {\n if (!Number.isInteger(value)) return { doubleValue: value as number };\n return { intValue: value as number };\n }\n if (t === 'boolean') return { boolValue: value as boolean };\n if (value instanceof Uint8Array)\n return { bytesValue: encoder.encodeUint8Array(value) };\n if (Array.isArray(value)) {\n const values: IAnyValue[] = new Array(value.length);\n for (let i = 0; i < value.length; i++) {\n values[i] = toAnyValue(value[i], encoder);\n }\n return { arrayValue: { values } };\n }\n if (t === 'object' && value != null) {\n const keys = Object.keys(value);\n const values: IKeyValue[] = new Array(keys.length);\n for (let i = 0; i < keys.length; i++) {\n values[i] = {\n key: keys[i],\n value: toAnyValue((value as Record<string, unknown>)[keys[i]], encoder),\n };\n }\n return { kvlistValue: { values } };\n }\n\n return {};\n}\n","/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { Fixed64, LongBits } from './internal-types';\nimport type { HrTime } from '@opentelemetry/api';\nimport { hrTimeToNanoseconds } from '@opentelemetry/core';\nimport { hexToBinary } from './hex-to-binary';\n\nexport function hrTimeToNanos(hrTime: HrTime): bigint {\n const NANOSECONDS = BigInt(1_000_000_000);\n return (\n BigInt(Math.trunc(hrTime[0])) * NANOSECONDS + BigInt(Math.trunc(hrTime[1]))\n );\n}\n\nexport function toLongBits(value: bigint): LongBits {\n const low = Number(BigInt.asUintN(32, value));\n const high = Number(BigInt.asUintN(32, value >> BigInt(32)));\n return { low, high };\n}\n\nexport function encodeAsLongBits(hrTime: HrTime): LongBits {\n const nanos = hrTimeToNanos(hrTime);\n return toLongBits(nanos);\n}\n\nexport function encodeAsString(hrTime: HrTime): string {\n const nanos = hrTimeToNanos(hrTime);\n return nanos.toString();\n}\n\nconst encodeTimestamp =\n typeof BigInt !== 'undefined' ? encodeAsString : hrTimeToNanoseconds;\n\nexport type HrTimeEncodeFunction = (hrTime: HrTime) => Fixed64;\nexport type SpanContextEncodeFunction = (\n spanContext: string\n) => string | Uint8Array;\nexport type OptionalSpanContextEncodeFunction = (\n spanContext: string | undefined\n) => string | Uint8Array | undefined;\nexport type Uint8ArrayEncodeFunction = (\n value: Uint8Array\n) => string | Uint8Array;\n\nexport interface Encoder {\n encodeHrTime: HrTimeEncodeFunction;\n encodeSpanContext: SpanContextEncodeFunction;\n encodeOptionalSpanContext: OptionalSpanContextEncodeFunction;\n encodeUint8Array: Uint8ArrayEncodeFunction;\n}\n\nfunction identity<T>(value: T): T {\n return value;\n}\n\nfunction optionalHexToBinary(str: string | undefined): Uint8Array | undefined {\n if (str === undefined) return undefined;\n return hexToBinary(str);\n}\n\n/**\n * Encoder for protobuf format.\n * Uses { high, low } timestamps and binary for span/trace IDs, leaves Uint8Array attributes as-is.\n */\nexport const PROTOBUF_ENCODER: Encoder = {\n encodeHrTime: encodeAsLongBits,\n encodeSpanContext: hexToBinary,\n encodeOptionalSpanContext: optionalHexToBinary,\n encodeUint8Array: identity,\n};\n\n/**\n * Encoder for JSON format.\n * Uses string timestamps, hex for span/trace IDs, and base64 for Uint8Array.\n */\nexport const JSON_ENCODER: Encoder = {\n encodeHrTime: encodeTimestamp,\n encodeSpanContext: identity,\n encodeOptionalSpanContext: identity,\n encodeUint8Array: (bytes: Uint8Array): string => {\n if (typeof Buffer !== 'undefined') {\n return Buffer.from(bytes).toString('base64');\n }\n\n // implementation note: not using spread operator and passing to\n // btoa to avoid stack overflow on large Uint8Arrays\n const chars = new Array(bytes.length);\n for (let i = 0; i < bytes.length; i++) {\n chars[i] = String.fromCharCode(bytes[i]);\n }\n return btoa(chars.join(''));\n },\n};\n","/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\nimport type { Link } from '@opentelemetry/api';\nimport type { Resource } from '@opentelemetry/resources';\nimport type { ReadableSpan, TimedEvent } from '@opentelemetry/sdk-trace-base';\nimport type { Encoder } from '../common/utils';\nimport {\n createInstrumentationScope,\n createResource,\n toAttributes,\n} from '../common/internal';\nimport type {\n EStatusCode,\n IEvent,\n IExportTraceServiceRequest,\n ILink,\n IResourceSpans,\n IScopeSpans,\n ISpan,\n} from './internal-types';\n\n// Span flags constants matching the OTLP specification\nconst SPAN_FLAGS_CONTEXT_HAS_IS_REMOTE_MASK = 0x100;\nconst SPAN_FLAGS_CONTEXT_IS_REMOTE_MASK = 0x200;\n\n/**\n * Builds the 32-bit span flags value combining the low 8-bit W3C TraceFlags\n * with the HAS_IS_REMOTE and IS_REMOTE bits according to the OTLP spec.\n */\nfunction buildSpanFlagsFrom(traceFlags: number, isRemote?: boolean): number {\n // low 8 bits are W3C TraceFlags (e.g., sampled)\n let flags = (traceFlags & 0xff) | SPAN_FLAGS_CONTEXT_HAS_IS_REMOTE_MASK;\n if (isRemote) {\n flags |= SPAN_FLAGS_CONTEXT_IS_REMOTE_MASK;\n }\n return flags;\n}\n\nexport function sdkSpanToOtlpSpan(span: ReadableSpan, encoder: Encoder): ISpan {\n const ctx = span.spanContext();\n const status = span.status;\n const parentSpanId = span.parentSpanContext?.spanId\n ? encoder.encodeSpanContext(span.parentSpanContext?.spanId)\n : undefined;\n return {\n traceId: encoder.encodeSpanContext(ctx.traceId),\n spanId: encoder.encodeSpanContext(ctx.spanId),\n parentSpanId: parentSpanId,\n traceState: ctx.traceState?.serialize(),\n name: span.name,\n // Span kind is offset by 1 because the API does not define a value for unset\n kind: span.kind == null ? 0 : span.kind + 1,\n startTimeUnixNano: encoder.encodeHrTime(span.startTime),\n endTimeUnixNano: encoder.encodeHrTime(span.endTime),\n attributes: toAttributes(span.attributes, encoder),\n droppedAttributesCount: span.droppedAttributesCount,\n events: span.events.map(event => toOtlpSpanEvent(event, encoder)),\n droppedEventsCount: span.droppedEventsCount,\n status: {\n // API and proto enums share the same values\n code: status.code as unknown as EStatusCode,\n message: status.message,\n },\n links: span.links.map(link => toOtlpLink(link, encoder)),\n droppedLinksCount: span.droppedLinksCount,\n flags: buildSpanFlagsFrom(ctx.traceFlags, span.parentSpanContext?.isRemote),\n };\n}\n\nexport function toOtlpLink(link: Link, encoder: Encoder): ILink {\n return {\n attributes: link.attributes ? toAttributes(link.attributes, encoder) : [],\n spanId: encoder.encodeSpanContext(link.context.spanId),\n traceId: encoder.encodeSpanContext(link.context.traceId),\n traceState: link.context.traceState?.serialize(),\n droppedAttributesCount: link.droppedAttributesCount || 0,\n flags: buildSpanFlagsFrom(link.context.traceFlags, link.context.isRemote),\n };\n}\n\nexport function toOtlpSpanEvent(\n timedEvent: TimedEvent,\n encoder: Encoder\n): IEvent {\n return {\n attributes: timedEvent.attributes\n ? toAttributes(timedEvent.attributes, encoder)\n : [],\n name: timedEvent.name,\n timeUnixNano: encoder.encodeHrTime(timedEvent.time),\n droppedAttributesCount: timedEvent.droppedAttributesCount || 0,\n };\n}\n\nexport function createExportTraceServiceRequest(\n spans: ReadableSpan[],\n encoder: Encoder\n): IExportTraceServiceRequest {\n return {\n resourceSpans: spanRecordsToResourceSpans(spans, encoder),\n };\n}\n\nfunction createResourceMap(readableSpans: ReadableSpan[]) {\n const resourceMap: Map<Resource, Map<string, ReadableSpan[]>> = new Map();\n for (const record of readableSpans) {\n let ilsMap = resourceMap.get(record.resource);\n\n if (!ilsMap) {\n ilsMap = new Map();\n resourceMap.set(record.resource, ilsMap);\n }\n\n // TODO this is duplicated in basic tracer. Consolidate on a common helper in core\n const instrumentationScopeKey = `${record.instrumentationScope.name}@${\n record.instrumentationScope.version || ''\n }:${record.instrumentationScope.schemaUrl || ''}`;\n let records = ilsMap.get(instrumentationScopeKey);\n\n if (!records) {\n records = [];\n ilsMap.set(instrumentationScopeKey, records);\n }\n\n records.push(record);\n }\n\n return resourceMap;\n}\n\nfunction spanRecordsToResourceSpans(\n readableSpans: ReadableSpan[],\n encoder: Encoder\n): IResourceSpans[] {\n const resourceMap = createResourceMap(readableSpans);\n const out: IResourceSpans[] = [];\n\n const entryIterator = resourceMap.entries();\n let entry = entryIterator.next();\n while (!entry.done) {\n const [resource, ilmMap] = entry.value;\n const scopeResourceSpans: IScopeSpans[] = [];\n const ilmIterator = ilmMap.values();\n let ilmEntry = ilmIterator.next();\n while (!ilmEntry.done) {\n const scopeSpans = ilmEntry.value;\n if (scopeSpans.length > 0) {\n const spans = scopeSpans.map(readableSpan =>\n sdkSpanToOtlpSpan(readableSpan, encoder)\n );\n\n scopeResourceSpans.push({\n scope: createInstrumentationScope(scopeSpans[0].instrumentationScope),\n spans: spans,\n schemaUrl: scopeSpans[0].instrumentationScope.schemaUrl,\n });\n }\n ilmEntry = ilmIterator.next();\n }\n const processedResource = createResource(resource, encoder);\n const transformedSpans: IResourceSpans = {\n resource: processedResource,\n scopeSpans: scopeResourceSpans,\n schemaUrl: processedResource.schemaUrl,\n };\n\n out.push(transformedSpans);\n entry = entryIterator.next();\n }\n\n return out;\n}\n","/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\nimport type { ISerializer } from '../../i-serializer';\nimport type { ReadableSpan } from '@opentelemetry/sdk-trace-base';\nimport type { IExportTraceServiceResponse } from '../export-response';\nimport { createExportTraceServiceRequest } from '../internal';\nimport { JSON_ENCODER } from '../../common/utils';\nimport { diag } from '@opentelemetry/api';\n\nexport const JsonTraceSerializer: ISerializer<\n ReadableSpan[],\n IExportTraceServiceResponse\n> = {\n serializeRequest: (arg: ReadableSpan[]) => {\n const request = createExportTraceServiceRequest(arg, JSON_ENCODER);\n const encoder = new TextEncoder();\n return encoder.encode(JSON.stringify(request));\n },\n deserializeResponse: (arg: Uint8Array) => {\n if (arg.length === 0) {\n return {};\n }\n const decoder = new TextDecoder();\n try {\n return JSON.parse(decoder.decode(arg)) as IExportTraceServiceResponse;\n } catch (err) {\n diag.warn(\n `Failed to parse trace export response: ${err.message}. Returning empty response`\n );\n return {};\n }\n },\n};\n","/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// IMPORTANT: exports added here are public\nexport { JsonTraceSerializer } from './trace';\n","/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nexport type {\n IExportMetricsPartialSuccess,\n IExportMetricsServiceResponse,\n} from './metrics';\nexport type {\n IExportTracePartialSuccess,\n IExportTraceServiceResponse,\n} from './trace';\nexport type {\n IExportLogsServiceResponse,\n IExportLogsPartialSuccess,\n} from './logs';\n\nexport { ProtobufLogsSerializer } from './logs/protobuf';\nexport { ProtobufMetricsSerializer } from './metrics/protobuf';\nexport { ProtobufTraceSerializer } from './trace/protobuf';\n\nexport { JsonLogsSerializer } from './logs/json';\nexport { JsonMetricsSerializer } from './metrics/json';\nexport { JsonTraceSerializer } from './trace/json';\n\nexport type { ISerializer } from './i-serializer';\n","/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { diag } from '@opentelemetry/api';\n\n/**\n * Parses headers from config leaving only those that have defined values\n * @param partialHeaders\n */\nexport function validateAndNormalizeHeaders(\n partialHeaders: Record<string, string> | undefined\n): Record<string, string> {\n const headers: Record<string, string> = {};\n Object.entries(partialHeaders ?? {}).forEach(([key, value]) => {\n if (typeof value !== 'undefined') {\n headers[key] = String(value);\n } else {\n diag.warn(\n `Header \"${key}\" has invalid value (${value}) and will be ignored`\n );\n }\n });\n return headers;\n}\n","/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { OtlpSharedConfiguration } from './shared-configuration';\nimport {\n getSharedConfigurationDefaults,\n mergeOtlpSharedConfigurationWithDefaults,\n} from './shared-configuration';\nimport { validateAndNormalizeHeaders } from '../util';\n\nexport type HeadersFactory = () => Promise<Record<string, string>>;\n\nexport interface OtlpHttpConfiguration extends OtlpSharedConfiguration {\n url: string;\n headers: HeadersFactory;\n}\n\nfunction mergeHeaders(\n userProvidedHeaders: HeadersFactory | undefined | null,\n fallbackHeaders: HeadersFactory | undefined | null,\n defaultHeaders: HeadersFactory\n): HeadersFactory {\n return async () => {\n const requiredHeaders = {\n ...(await defaultHeaders()),\n };\n const headers = {};\n\n // add fallback ones first\n if (fallbackHeaders != null) {\n Object.assign(headers, await fallbackHeaders());\n }\n\n // override with user-provided ones\n if (userProvidedHeaders != null) {\n Object.assign(\n headers,\n validateAndNormalizeHeaders(await userProvidedHeaders())\n );\n }\n\n // override required ones.\n return Object.assign(headers, requiredHeaders);\n };\n}\n\nfunction validateUserProvidedUrl(url: string | undefined): string | undefined {\n if (url == null) {\n return undefined;\n }\n try {\n // NOTE: In non-browser environments, `globalThis.location` will be `undefined`.\n const base = globalThis.location?.href;\n return new URL(url, base).href;\n } catch {\n throw new Error(\n `Configuration: Could not parse user-provided export URL: '${url}'`\n );\n }\n}\n\n/**\n * @param userProvidedConfiguration Configuration options provided by the user in code.\n * @param fallbackConfiguration Fallback to use when the {@link userProvidedConfiguration} does not specify an option.\n * @param defaultConfiguration The defaults as defined by the exporter specification\n */\nexport function mergeOtlpHttpConfigurationWithDefaults(\n userProvidedConfiguration: Partial<OtlpHttpConfiguration>,\n fallbackConfiguration: Partial<OtlpHttpConfiguration>,\n defaultConfiguration: OtlpHttpConfiguration\n): OtlpHttpConfiguration {\n return {\n ...mergeOtlpSharedConfigurationWithDefaults(\n userProvidedConfiguration,\n fallbackConfiguration,\n defaultConfiguration\n ),\n headers: mergeHeaders(\n userProvidedConfiguration.headers,\n fallbackConfiguration.headers,\n defaultConfiguration.headers\n ),\n url:\n validateUserProvidedUrl(userProvidedConfiguration.url) ??\n fallbackConfiguration.url ??\n defaultConfiguration.url,\n };\n}\n\nexport function getHttpConfigurationDefaults(\n requiredHeaders: Record<string, string>,\n signalResourcePath: string\n): OtlpHttpConfiguration {\n return {\n ...getSharedConfigurationDefaults(),\n headers: async () => requiredHeaders,\n url: 'http://localhost:4318/' + signalResourcePath,\n };\n}\n","/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\nimport type { OtlpHttpConfiguration } from './otlp-http-configuration';\nimport {\n getHttpConfigurationDefaults,\n mergeOtlpHttpConfigurationWithDefaults,\n} from './otlp-http-configuration';\n\n// NOTE: do not change these imports to be actual imports, otherwise they WILL break `@opentelemetry/instrumentation-http`\nimport type * as http from 'http';\nimport type * as https from 'https';\n\nexport type HttpAgentFactory = (\n protocol: string\n) => http.Agent | https.Agent | Promise<http.Agent> | Promise<https.Agent>;\n\nexport interface OtlpNodeHttpConfiguration extends OtlpHttpConfiguration {\n /**\n * Factory function for creating agents.\n *\n * @remarks\n * Prefer using {@link httpAgentFactoryFromOptions} over manually writing a factory function wherever possible.\n * If using a factory function (`HttpAgentFactory`), **do not import `http.Agent` or `https.Agent`\n * statically at the top of the file**.\n * Instead, use dynamic `import()` or `require()` to load the module. This ensures that the `http` or `https`\n * module is not loaded before `@opentelemetry/instrumentation-http` can instrument it.\n */\n agentFactory: HttpAgentFactory;\n /**\n * User agent header string to be appended to the exporter's value as a prefix.\n * Availablie since v1.49.0 of the spec.\n * Ref: https://opentelemetry.io/docs/specs/otel/protocol/exporter/#user-agent\n */\n userAgent?: string;\n}\n\nexport function httpAgentFactoryFromOptions(\n options: http.AgentOptions | https.AgentOptions\n): HttpAgentFactory {\n return async protocol => {\n const isInsecure = protocol === 'http:';\n const module = isInsecure ? import('http') : import('https');\n const { Agent } = await module;\n\n if (isInsecure) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars -- these props should not be used in agent options\n const { ca, cert, key, ...insecureOptions } =\n options as https.AgentOptions;\n return new Agent(insecureOptions);\n }\n return new Agent(options);\n };\n}\n\n/**\n * @param userProvidedConfiguration Configuration options provided by the user in code.\n * @param fallbackConfiguration Fallback to use when the {@link userProvidedConfiguration} does not specify an option.\n * @param defaultConfiguration The defaults as defined by the exporter specification\n */\nexport function mergeOtlpNodeHttpConfigurationWithDefaults(\n userProvidedConfiguration: Partial<OtlpNodeHttpConfiguration>,\n fallbackConfiguration: Partial<OtlpNodeHttpConfiguration>,\n defaultConfiguration: OtlpNodeHttpConfiguration\n): OtlpNodeHttpConfiguration {\n return {\n ...mergeOtlpHttpConfigurationWithDefaults(\n userProvidedConfiguration,\n fallbackConfiguration,\n defaultConfiguration\n ),\n agentFactory:\n userProvidedConfiguration.agentFactory ??\n fallbackConfiguration.agentFactory ??\n defaultConfiguration.agentFactory,\n userAgent: userProvidedConfiguration.userAgent,\n };\n}\n\nexport function getNodeHttpConfigurationDefaults(\n requiredHeaders: Record<string, string>,\n signalResourcePath: string\n): OtlpNodeHttpConfiguration {\n return {\n ...getHttpConfigurationDefaults(requiredHeaders, signalResourcePath),\n agentFactory: httpAgentFactoryFromOptions({ keepAlive: true }),\n };\n}\n","/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nexport function isExportHTTPErrorRetryable(statusCode: number): boolean {\n return (\n statusCode === 429 ||\n statusCode === 502 ||\n statusCode === 503 ||\n statusCode === 504\n );\n}\n\nexport function parseRetryAfterToMills(\n retryAfter?: string | undefined | null\n): number | undefined {\n if (retryAfter == null) {\n return undefined;\n }\n\n const seconds = Number.parseInt(retryAfter, 10);\n if (Number.isInteger(seconds)) {\n return seconds > 0 ? seconds * 1000 : -1;\n }\n // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Retry-After#directives\n const delay = new Date(retryAfter).getTime() - Date.now();\n\n if (delay >= 0) {\n return delay;\n }\n return 0;\n}\n","/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// this is autogenerated file, see scripts/version-update.js\nexport const VERSION = '0.215.0';\n","/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\nimport type * as http from 'http';\nimport type * as https from 'https';\nimport * as zlib from 'zlib';\nimport { Readable } from 'stream';\nimport type { ExportResponse } from '../export-response';\nimport {\n isExportHTTPErrorRetryable,\n parseRetryAfterToMills,\n} from '../is-export-retryable';\nimport { OTLPExporterError } from '../types';\nimport { VERSION } from '../version';\n\nconst DEFAULT_USER_AGENT = `OTel-OTLP-Exporter-JavaScript/${VERSION}`;\n\n/**\n * Maximum response body size (4 MB) that the HTTP transport will read.\n * If the server sends more data the connection is destroyed and the export\n * is treated as a non-retryable error regardless of status code.\n */\nexport const MAX_RESPONSE_BODY_SIZE = 4 * 1024 * 1024;\n\n/**\n * Sends data using http\n * @param request\n * @param url\n * @param headers\n * @param compression\n * @param userAgent\n * @param agent\n * @param data\n * @param timeoutMillis\n */\nexport function sendWithHttp(\n request: typeof https.request | typeof http.request,\n url: string,\n headers: Record<string, string>,\n compression: 'gzip' | 'none',\n userAgent: string | undefined,\n agent: http.Agent | https.Agent,\n data: Uint8Array,\n timeoutMillis: number\n): Promise<ExportResponse> {\n return new Promise<ExportResponse>(resolve => {\n const parsedUrl = new URL(url);\n\n if (userAgent) {\n headers['User-Agent'] = `${userAgent} ${DEFAULT_USER_AGENT}`;\n } else {\n headers['User-Agent'] = DEFAULT_USER_AGENT;\n }\n\n const options: http.RequestOptions | https.RequestOptions = {\n hostname: parsedUrl.hostname,\n port: parsedUrl.port,\n path: parsedUrl.pathname,\n method: 'POST',\n headers,\n agent,\n };\n\n const req = request(options, (res: http.IncomingMessage) => {\n const responseData: Buffer[] = [];\n let responseSize = 0;\n res.on('data', (chunk: Buffer) => {\n responseSize += chunk.length;\n if (responseSize > MAX_RESPONSE_BODY_SIZE) {\n const sizeError = new Error(\n `OTLP export response body exceeded size limit of ${MAX_RESPONSE_BODY_SIZE} bytes`\n );\n // Oversized responses are treated as non-retryable errors\n // regardless of status code.\n // Resolve before destroying: res.destroy() tears down the socket which\n // triggers ECONNRESET on req.on('error'), so, resolving first makes that\n // a no-op. res.on('error') does not fire because destroy() is called\n // without an error argument.\n resolve({ status: 'failure', error: sizeError });\n res.destroy();\n return;\n }\n responseData.push(chunk);\n });\n\n res.on('end', () => {\n if (res.statusCode && res.statusCode <= 299) {\n resolve({\n status: 'success',\n data: Buffer.concat(responseData),\n });\n } else if (\n res.statusCode &&\n isExportHTTPErrorRetryable(res.statusCode)\n ) {\n resolve({\n status: 'retryable',\n retryInMillis: parseRetryAfterToMills(res.headers['retry-after']),\n });\n } else {\n const error = new OTLPExporterError(\n res.statusMessage,\n res.statusCode,\n Buffer.concat(responseData).toString()\n );\n resolve({\n status: 'failure',\n error,\n });\n }\n });\n\n res.on('error', (error: Error) => {\n // Note: 'end' may still be emitted after 'error' on the same response object, since we're resolving a promise,\n // the first call to resolve() will determine the final state.\n if (res.statusCode && res.statusCode <= 299) {\n // If the response is successful but an error occurs while reading the response,\n // we consider it a success since the data has been sent successfully.\n resolve({\n status: 'success',\n });\n } else if (\n res.statusCode &&\n isExportHTTPErrorRetryable(res.statusCode)\n ) {\n resolve({\n status: 'retryable',\n error: error,\n retryInMillis: parseRetryAfterToMills(res.headers['retry-after']),\n });\n } else {\n resolve({\n status: 'failure',\n error,\n });\n }\n });\n });\n\n req.setTimeout(timeoutMillis, () => {\n req.destroy();\n resolve({\n status: 'retryable',\n error: new Error('Request timed out'),\n });\n });\n\n req.on('error', (error: Error) => {\n if (isHttpTransportNetworkErrorRetryable(error)) {\n resolve({\n status: 'retryable',\n error,\n });\n } else {\n resolve({\n status: 'failure',\n error,\n });\n }\n });\n\n compressAndSend(req, compression, data, (error: Error) => {\n resolve({\n status: 'failure',\n error,\n });\n });\n });\n}\n\nexport function compressAndSend(\n req: http.ClientRequest,\n compression: 'gzip' | 'none',\n data: Uint8Array,\n onError: (error: Error) => void\n) {\n let dataStream = readableFromUint8Array(data);\n\n if (compression === 'gzip') {\n req.setHeader('Content-Encoding', 'gzip');\n dataStream = dataStream\n .on('error', onError)\n .pipe(zlib.createGzip())\n .on('error', onError);\n }\n\n dataStream.pipe(req).on('error', onError);\n}\n\nfunction readableFromUint8Array(buff: string | Uint8Array): Readable {\n const readable = new Readable();\n readable.push(buff);\n readable.push(null);\n\n return readable;\n}\n\nfunction isHttpTransportNetworkErrorRetryable(error: Error): boolean {\n const RETRYABLE_NETWORK_ERROR_CODES = new Set([\n 'ECONNRESET',\n 'ECONNREFUSED',\n 'EPIPE',\n 'ETIMEDOUT',\n 'EAI_AGAIN',\n 'ENOTFOUND',\n 'ENETUNREACH',\n 'EHOSTUNREACH',\n ]);\n\n if ('code' in error && typeof error.code === 'string') {\n return RETRYABLE_NETWORK_ERROR_CODES.has(error.code);\n }\n\n return false;\n}\n","/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// NOTE: do not change these type imports to actual imports. Doing so WILL break `@opentelemetry/instrumentation-http`,\n// as they'd be imported before the http/https modules can be wrapped.\nimport type * as https from 'https';\nimport type * as http from 'http';\nimport type { ExportResponse } from '../export-response';\nimport type { IExporterTransport } from '../exporter-transport';\nimport { sendWithHttp } from './http-transport-utils';\nimport type { NodeHttpRequestParameters } from './node-http-transport-types';\n\ninterface Utils {\n agent: http.Agent | https.Agent;\n request: typeof http.request | typeof https.request;\n}\n\nclass HttpExporterTransport implements IExporterTransport {\n private _utils: Utils | null = null;\n private _parameters: NodeHttpRequestParameters;\n\n constructor(parameters: NodeHttpRequestParameters) {\n this._parameters = parameters;\n }\n\n async send(data: Uint8Array, timeoutMillis: number): Promise<ExportResponse> {\n const { agent, request } = await this._loadUtils();\n const headers = await this._parameters.headers();\n\n return sendWithHttp(\n request,\n this._parameters.url,\n headers,\n this._parameters.compression,\n this._parameters.userAgent,\n agent,\n data,\n timeoutMillis\n );\n }\n\n shutdown() {\n // intentionally left empty, nothing to do.\n }\n\n private async _loadUtils(): Promise<Utils> {\n let utils = this._utils;\n\n if (utils === null) {\n const protocol = new URL(this._parameters.url).protocol;\n const [agent, request] = await Promise.all([\n this._parameters.agentFactory(protocol),\n requestFunctionFactory(protocol),\n ]);\n utils = this._utils = { agent, request };\n }\n\n return utils;\n }\n}\n\nasync function requestFunctionFactory(\n protocol: string\n): Promise<typeof http.request | typeof https.request> {\n const module = protocol === 'http:' ? import('http') : import('https');\n const { request } = await module;\n return request;\n}\n\nexport function createHttpExporterTransport(\n parameters: NodeHttpRequestParameters\n): IExporterTransport {\n return new HttpExporterTransport(parameters);\n}\n","/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { IExporterTransport } from './exporter-transport';\nimport type { ExportResponse } from './export-response';\nimport { diag } from '@opentelemetry/api';\n\nconst MAX_ATTEMPTS = 5;\nconst INITIAL_BACKOFF = 1000;\nconst MAX_BACKOFF = 5000;\nconst BACKOFF_MULTIPLIER = 1.5;\nconst JITTER = 0.2;\n\n/**\n * Get a pseudo-random jitter that falls in the range of [-JITTER, +JITTER]\n */\nfunction getJitter() {\n return Math.random() * (2 * JITTER) - JITTER;\n}\n\nclass RetryingTransport implements IExporterTransport {\n private _transport: IExporterTransport;\n\n constructor(transport: IExporterTransport) {\n this._transport = transport;\n }\n\n private retry(\n data: Uint8Array,\n timeoutMillis: number,\n inMillis: number\n ): Promise<ExportResponse> {\n return new Promise((resolve, reject) => {\n setTimeout(() => {\n this._transport.send(data, timeoutMillis).then(resolve, reject);\n }, inMillis);\n });\n }\n\n async send(data: Uint8Array, timeoutMillis: number): Promise<ExportResponse> {\n let attempts = MAX_ATTEMPTS;\n let nextBackoff = INITIAL_BACKOFF;\n\n const deadline = Date.now() + timeoutMillis;\n let result = await this._transport.send(data, timeoutMillis);\n\n while (result.status === 'retryable' && attempts > 0) {\n attempts--;\n\n // use maximum of computed backoff and 0 to avoid negative timeouts\n const backoff = Math.max(\n Math.min(nextBackoff * (1 + getJitter()), MAX_BACKOFF),\n 0\n );\n nextBackoff = nextBackoff * BACKOFF_MULTIPLIER;\n const retryInMillis = result.retryInMillis ?? backoff;\n\n // return when expected retry time is after the export deadline.\n const remainingTimeoutMillis = deadline - Date.now();\n if (retryInMillis > remainingTimeoutMillis) {\n diag.info(\n `Export retry time ${Math.round(retryInMillis)}ms exceeds remaining timeout ${Math.round(\n remainingTimeoutMillis\n )}ms, not retrying further.`\n );\n return result;\n }\n\n diag.verbose(`Scheduling export retry in ${Math.round(retryInMillis)}ms`);\n result = await this.retry(data, remainingTimeoutMillis, retryInMillis);\n }\n\n if (result.status === 'success') {\n diag.verbose(\n `Export succeeded after ${MAX_ATTEMPTS - attempts} retry attempts.`\n );\n } else if (result.status === 'retryable') {\n diag.info(\n `Export failed after maximum retry attempts (${MAX_ATTEMPTS}).`\n );\n } else {\n diag.info(`Export failed with non-retryable error: ${result.error}`);\n }\n\n return result;\n }\n\n shutdown() {\n return this._transport.shutdown();\n }\n}\n\n/**\n * Creates an Exporter Transport that retries on 'retryable' response.\n */\nexport function createRetryingTransport(options: {\n // Underlying transport to wrap.\n transport: IExporterTransport;\n}): IExporterTransport {\n return new RetryingTransport(options.transport);\n}\n","/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\nimport type { IOtlpExportDelegate } from './otlp-export-delegate';\nimport { createOtlpExportDelegate } from './otlp-export-delegate';\nimport type { ISerializer } from '@opentelemetry/otlp-transformer';\nimport { createHttpExporterTransport } from './transport/http-exporter-transport';\nimport { createBoundedQueueExportPromiseHandler } from './bounded-queue-export-promise-handler';\nimport { createRetryingTransport } from './retrying-transport';\nimport type { OtlpNodeHttpConfiguration } from './configuration/otlp-node-http-configuration';\n\nexport function createOtlpHttpExportDelegate<Internal, Response>(\n options: OtlpNodeHttpConfiguration,\n serializer: ISerializer<Internal, Response>\n): IOtlpExportDelegate<Internal> {\n return createOtlpExportDelegate(\n {\n transport: createRetryingTransport({\n transport: createHttpExporterTransport(options),\n }),\n serializer: serializer,\n promiseHandler: createBoundedQueueExportPromiseHandler(options),\n },\n { timeout: options.timeoutMillis }\n );\n}\n","/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\nimport { getNumberFromEnv, getStringFromEnv } from '@opentelemetry/core';\nimport type { OtlpSharedConfiguration } from './shared-configuration';\nimport { diag } from '@opentelemetry/api';\n\nfunction parseAndValidateTimeoutFromEnv(\n timeoutEnvVar: string\n): number | undefined {\n const envTimeout = getNumberFromEnv(timeoutEnvVar);\n if (envTimeout != null) {\n if (Number.isFinite(envTimeout) && envTimeout > 0) {\n return envTimeout;\n }\n diag.warn(\n `Configuration: ${timeoutEnvVar} is invalid, expected number greater than 0 (actual: ${envTimeout})`\n );\n }\n\n return undefined;\n}\n\nfunction getTimeoutFromEnv(signalIdentifier: string) {\n const specificTimeout = parseAndValidateTimeoutFromEnv(\n `OTEL_EXPORTER_OTLP_${signalIdentifier}_TIMEOUT`\n );\n const nonSpecificTimeout = parseAndValidateTimeoutFromEnv(\n 'OTEL_EXPORTER_OTLP_TIMEOUT'\n );\n\n return specificTimeout ?? nonSpecificTimeout;\n}\n\nfunction parseAndValidateCompressionFromEnv(\n compressionEnvVar: string\n): 'none' | 'gzip' | undefined {\n const compression = getStringFromEnv(compressionEnvVar)?.trim();\n\n if (compression == null || compression === 'none' || compression === 'gzip') {\n return compression;\n }\n\n diag.warn(\n `Configuration: ${compressionEnvVar} is invalid, expected 'none' or 'gzip' (actual: '${compression}')`\n );\n return undefined;\n}\n\nfunction getCompressionFromEnv(\n signalIdentifier: string\n): 'none' | 'gzip' | undefined {\n const specificCompression = parseAndValidateCompressionFromEnv(\n `OTEL_EXPORTER_OTLP_${signalIdentifier}_COMPRESSION`\n );\n const nonSpecificCompression = parseAndValidateCompressionFromEnv(\n 'OTEL_EXPORTER_OTLP_COMPRESSION'\n );\n\n return specificCompression ?? nonSpecificCompression;\n}\n\nexport function getSharedConfigurationFromEnvironment(\n signalIdentifier: string\n): Partial<OtlpSharedConfiguration> {\n return {\n timeoutMillis: getTimeoutFromEnv(signalIdentifier),\n compression: getCompressionFromEnv(signalIdentifier),\n };\n}\n","/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { getStringFromEnv, parseKeyPairsIntoRecord } from '@opentelemetry/core';\nimport { diag } from '@opentelemetry/api';\nimport { getSharedConfigurationFromEnvironment } from './shared-env-configuration';\nimport { wrapStaticHeadersInFunction } from './shared-configuration';\nimport type { OtlpNodeHttpConfiguration } from './otlp-node-http-configuration';\nimport { httpAgentFactoryFromOptions } from './otlp-node-http-configuration';\n\nfunction getStaticHeadersFromEnv(\n signalIdentifier: string\n): Record<string, string> | undefined {\n const signalSpecificRawHeaders = getStringFromEnv(\n `OTEL_EXPORTER_OTLP_${signalIdentifier}_HEADERS`\n );\n const nonSignalSpecificRawHeaders = getStringFromEnv(\n 'OTEL_EXPORTER_OTLP_HEADERS'\n );\n\n const signalSpecificHeaders = parseKeyPairsIntoRecord(\n signalSpecificRawHeaders\n );\n const nonSignalSpecificHeaders = parseKeyPairsIntoRecord(\n nonSignalSpecificRawHeaders\n );\n\n if (\n Object.keys(signalSpecificHeaders).length === 0 &&\n Object.keys(nonSignalSpecificHeaders).length === 0\n ) {\n return undefined;\n }\n\n // headers are combined instead of overwritten, with the specific headers taking precedence over\n // the non-specific ones.\n return Object.assign(\n {},\n parseKeyPairsIntoRecord(nonSignalSpecificRawHeaders),\n parseKeyPairsIntoRecord(signalSpecificRawHeaders)\n );\n}\n\nfunction appendRootPathToUrlIfNeeded(url: string): string | undefined {\n try {\n const parsedUrl = new URL(url);\n // This will automatically append '/' if there's no root path.\n return parsedUrl.toString();\n } catch {\n diag.warn(\n `Configuration: Could not parse environment-provided export URL: '${url}', falling back to undefined`\n );\n return undefined;\n }\n}\n\nfunction appendResourcePathToUrl(\n url: string,\n path: string\n): string | undefined {\n try {\n // just try to parse, if it fails we catch and warn.\n new URL(url);\n } catch {\n diag.warn(\n `Configuration: Could not parse environment-provided export URL: '${url}', falling back to undefined`\n );\n return undefined;\n }\n\n if (!url.endsWith('/')) {\n url = url + '/';\n }\n url += path;\n\n try {\n // just try to parse, if it fails we catch and warn.\n new URL(url);\n } catch {\n diag.warn(\n `Configuration: Provided URL appended with '${path}' is not a valid URL, using 'undefined' instead of '${url}'`\n );\n return undefined;\n }\n\n return url;\n}\n\nfunction getNonSpecificUrlFromEnv(\n signalResourcePath: string\n): string | undefined {\n const envUrl = getStringFromEnv('OTEL_EXPORTER_OTLP_ENDPOINT');\n if (envUrl === undefined) {\n return undefined;\n }\n return appendResourcePathToUrl(envUrl, signalResourcePath);\n}\n\nfunction getSpecificUrlFromEnv(signalIdentifier: string): string | undefined {\n const envUrl = getStringFromEnv(\n `OTEL_EXPORTER_OTLP_${signalIdentifier}_ENDPOINT`\n );\n if (envUrl === undefined) {\n return undefined;\n }\n return appendRootPathToUrlIfNeeded(envUrl);\n}\n\nfunction readFileFromEnv(\n signalSpecificEnvVar: string,\n nonSignalSpecificEnvVar: string,\n warningMessage: string\n): Buffer | undefined {\n const signalSpecificPath = getStringFromEnv(signalSpecificEnvVar);\n const nonSignalSpecificPath = getStringFromEnv(nonSignalSpecificEnvVar);\n const filePath = signalSpecificPath ?? nonSignalSpecificPath;\n\n if (filePath != null) {\n try {\n return fs.readFileSync(path.resolve(process.cwd(), filePath));\n } catch {\n diag.warn(warningMessage);\n return undefined;\n }\n } else {\n return undefined;\n }\n}\n\nfunction getClientCertificateFromEnv(\n signalIdentifier: string\n): Buffer | undefined {\n return readFileFromEnv(\n `OTEL_EXPORTER_OTLP_${signalIdentifier}_CLIENT_CERTIFICATE`,\n 'OTEL_EXPORTER_OTLP_CLIENT_CERTIFICATE',\n 'Failed to read client certificate chain file'\n );\n}\n\nfunction getClientKeyFromEnv(signalIdentifier: string): Buffer | undefined {\n return readFileFromEnv(\n `OTEL_EXPORTER_OTLP_${signalIdentifier}_CLIENT_KEY`,\n 'OTEL_EXPORTER_OTLP_CLIENT_KEY',\n 'Failed to read client certificate private key file'\n );\n}\n\nfunction getRootCertificateFromEnv(\n signalIdentifier: string\n): Buffer | undefined {\n return readFileFromEnv(\n `OTEL_EXPORTER_OTLP_${signalIdentifier}_CERTIFICATE`,\n 'OTEL_EXPORTER_OTLP_CERTIFICATE',\n 'Failed to read root certificate file'\n );\n}\n\n/**\n * Reads and returns configuration from the environment\n *\n * @param signalIdentifier all caps part in environment variables that identifies the signal (e.g.: METRICS, TRACES, LOGS)\n * @param signalResourcePath signal resource path to append if necessary (e.g.: v1/metrics, v1/traces, v1/logs)\n */\nexport function getNodeHttpConfigurationFromEnvironment(\n signalIdentifier: string,\n signalResourcePath: string\n): Partial<OtlpNodeHttpConfiguration> {\n return {\n ...getSharedConfigurationFromEnvironment(signalIdentifier),\n url:\n getSpecificUrlFromEnv(signalIdentifier) ??\n getNonSpecificUrlFromEnv(signalResourcePath),\n headers: wrapStaticHeadersInFunction(\n getStaticHeadersFromEnv(signalIdentifier)\n ),\n agentFactory: httpAgentFactoryFromOptions({\n keepAlive: true,\n ca: getRootCertificateFromEnv(signalIdentifier),\n cert: getClientCertificateFromEnv(signalIdentifier),\n key: getClientKeyFromEnv(signalIdentifier),\n }),\n };\n}\n","/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { OTLPExporterConfigBase } from './legacy-base-configuration';\nimport { wrapStaticHeadersInFunction } from './shared-configuration';\nimport type { HeadersFactory } from './otlp-http-configuration';\n\nexport function convertLegacyHeaders(\n config: OTLPExporterConfigBase\n): HeadersFactory | undefined {\n if (typeof config.headers === 'function') {\n return config.headers;\n }\n return wrapStaticHeadersInFunction(config.headers);\n}\n","/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\nimport type { OTLPExporterNodeConfigBase } from './legacy-node-configuration';\nimport { diag } from '@opentelemetry/api';\nimport type {\n HttpAgentFactory,\n OtlpNodeHttpConfiguration,\n} from './otlp-node-http-configuration';\nimport {\n getNodeHttpConfigurationDefaults,\n mergeOtlpNodeHttpConfigurationWithDefaults,\n} from './otlp-node-http-configuration';\nimport { httpAgentFactoryFromOptions } from '../index-node-http';\nimport { getNodeHttpConfigurationFromEnvironment } from './otlp-node-http-env-configuration';\nimport { convertLegacyHeaders } from './convert-legacy-http-options';\n\nfunction convertLegacyAgentOptions(\n config: OTLPExporterNodeConfigBase\n): HttpAgentFactory | undefined {\n if (typeof config.httpAgentOptions === 'function') {\n return config.httpAgentOptions;\n }\n\n let legacy = config.httpAgentOptions;\n if (config.keepAlive != null) {\n legacy = { keepAlive: config.keepAlive, ...legacy };\n }\n\n if (legacy != null) {\n return httpAgentFactoryFromOptions(legacy);\n } else {\n return undefined;\n }\n}\n\n/**\n * @deprecated this will be removed in 2.0\n * @param config\n * @param signalIdentifier\n * @param signalResourcePath\n * @param requiredHeaders\n */\nexport function convertLegacyHttpOptions(\n config: OTLPExporterNodeConfigBase,\n signalIdentifier: string,\n signalResourcePath: string,\n requiredHeaders: Record<string, string>\n): OtlpNodeHttpConfiguration {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if ((config as any).metadata) {\n diag.warn('Metadata cannot be set when using http');\n }\n\n return mergeOtlpNodeHttpConfigurationWithDefaults(\n {\n url: config.url,\n headers: convertLegacyHeaders(config),\n concurrencyLimit: config.concurrencyLimit,\n timeoutMillis: config.timeoutMillis,\n compression: config.compression,\n agentFactory: convertLegacyAgentOptions(config),\n userAgent: config.userAgent,\n },\n getNodeHttpConfigurationFromEnvironment(\n signalIdentifier,\n signalResourcePath\n ),\n getNodeHttpConfigurationDefaults(requiredHeaders, signalResourcePath)\n );\n}\n","/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nexport { httpAgentFactoryFromOptions } from './configuration/otlp-node-http-configuration';\nexport { createOtlpHttpExportDelegate } from './otlp-http-export-delegate';\nexport { getSharedConfigurationFromEnvironment } from './configuration/shared-env-configuration';\nexport { convertLegacyHttpOptions } from './configuration/convert-legacy-node-http-options';\n","/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { ReadableSpan, SpanExporter } from '@opentelemetry/sdk-trace-base';\nimport type { OTLPExporterNodeConfigBase } from '@opentelemetry/otlp-exporter-base';\nimport { OTLPExporterBase } from '@opentelemetry/otlp-exporter-base';\nimport { JsonTraceSerializer } from '@opentelemetry/otlp-transformer';\nimport {\n convertLegacyHttpOptions,\n createOtlpHttpExportDelegate,\n} from '@opentelemetry/otlp-exporter-base/node-http';\n\n/**\n * Collector Trace Exporter for Node\n */\nexport class OTLPTraceExporter\n extends OTLPExporterBase<ReadableSpan[]>\n implements SpanExporter\n{\n constructor(config: OTLPExporterNodeConfigBase = {}) {\n super(\n createOtlpHttpExportDelegate(\n convertLegacyHttpOptions(config, 'TRACES', 'v1/traces', {\n 'Content-Type': 'application/json',\n }),\n JsonTraceSerializer\n )\n );\n }\n}\n","/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nexport { OTLPTraceExporter } from './OTLPTraceExporter';\n","/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nexport { OTLPTraceExporter } from './node';\n","/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nexport { OTLPTraceExporter } from './platform';\n","/**\n * OpenTelemetry distributed tracing bootstrap.\n *\n * Call `initTracing()` once at process startup — before any imports that\n * you want auto-instrumented (HTTP, DB, etc.).\n *\n * Configuration via environment variables:\n * CODE_INTEL_OTEL_ENABLED = \"true\" (default: false — opt-in)\n * CODE_INTEL_OTEL_ENDPOINT = \"http://localhost:4318\" (OTLP/HTTP)\n * CODE_INTEL_OTEL_SERVICE = \"code-intel\" (service.name attribute)\n * CODE_INTEL_OTEL_ENV = \"production\" (deployment.environment)\n *\n * When disabled, all `trace.*` calls become no-ops (zero overhead).\n */\n\nimport { NodeSDK } from '@opentelemetry/sdk-node';\nimport { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\nimport {\n SEMRESATTRS_SERVICE_NAME,\n SEMRESATTRS_DEPLOYMENT_ENVIRONMENT,\n} from '@opentelemetry/semantic-conventions';\nimport {\n trace,\n context,\n SpanStatusCode,\n type Span,\n type Attributes,\n} from '@opentelemetry/api';\n\n// Re-export so callers don't need to depend on @opentelemetry/api directly\nexport { trace, context, SpanStatusCode };\nexport type { Span, Attributes };\n\nlet _sdk: NodeSDK | null = null;\n\nexport function isTracingEnabled(): boolean {\n return process.env['CODE_INTEL_OTEL_ENABLED'] === 'true';\n}\n\nexport function initTracing(): void {\n if (!isTracingEnabled()) return;\n if (_sdk) return; // already initialised\n\n const endpoint =\n process.env['CODE_INTEL_OTEL_ENDPOINT'] ?? 'http://localhost:4318';\n const serviceName =\n process.env['CODE_INTEL_OTEL_SERVICE'] ?? 'code-intel';\n const deploymentEnv =\n process.env['CODE_INTEL_OTEL_ENV'] ?? process.env['NODE_ENV'] ?? 'development';\n\n const exporter = new OTLPTraceExporter({ url: `${endpoint}/v1/traces` });\n\n _sdk = new NodeSDK({\n resource: resourceFromAttributes({\n [SEMRESATTRS_SERVICE_NAME]: serviceName,\n [SEMRESATTRS_DEPLOYMENT_ENVIRONMENT]: deploymentEnv,\n }),\n traceExporter: exporter,\n instrumentations: [\n getNodeAutoInstrumentations({\n // Disable noisy file-system instrumentation\n '@opentelemetry/instrumentation-fs': { enabled: false },\n }),\n ],\n });\n\n _sdk.start();\n}\n\nexport async function shutdownTracing(): Promise<void> {\n if (_sdk) {\n await _sdk.shutdown();\n _sdk = null;\n }\n}\n\n// ── Tracer factory ───────────────────────────────────────────────────────────\n\nconst TRACER_NAME = 'code-intel';\n\nexport function getTracer() {\n return trace.getTracer(TRACER_NAME);\n}\n\n/**\n * Wrap an async function in a span. Safe to call even when tracing is\n * disabled — the callback still runs, the span is just a no-op.\n *\n * @param name Span name\n * @param attrs Optional initial span attributes (must not contain secrets)\n * @param fn The async work to perform\n */\nexport async function withSpan<T>(\n name: string,\n attrs: Attributes,\n fn: (span: Span) => Promise<T>,\n): Promise<T> {\n return getTracer().startActiveSpan(name, { attributes: sanitizeAttrs(attrs) }, async (span) => {\n try {\n const result = await fn(span);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (err) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: err instanceof Error ? err.message : String(err),\n });\n span.recordException(err as Error);\n throw err;\n } finally {\n span.end();\n }\n });\n}\n\n/**\n * Strip any attribute keys that look like they might carry secrets.\n * Span attributes must never include raw code, tokens, or passwords.\n */\nconst BLOCKED_ATTR_KEYS = /secret|password|token|key|auth|credential/i;\n\nexport function sanitizeAttrs(attrs: Attributes): Attributes {\n const safe: Attributes = {};\n for (const [k, v] of Object.entries(attrs)) {\n if (BLOCKED_ATTR_KEYS.test(k)) continue;\n safe[k] = v;\n }\n return safe;\n}\n\n/**\n * Get the active trace ID and span ID for log correlation.\n * Returns empty strings when tracing is not active.\n */\nexport function getActiveTraceContext(): { traceId: string; spanId: string } {\n const span = trace.getActiveSpan();\n if (!span) return { traceId: '', spanId: '' };\n const ctx = span.spanContext();\n return { traceId: ctx.traceId, spanId: ctx.spanId };\n}\n","/**\n * Logger with sensitive data masking.\n * Uses winston + winston-daily-rotate-file.\n *\n * - In production / CI (NODE_ENV=production): Console only (stdout, structured).\n * - Otherwise: Daily-rotating file logs under ./logs/ + Console.\n * - Log level controlled by LOG_LEVEL env var (default: \"info\").\n * - Sensitive keys and patterns are masked before output.\n * - Every log line includes { traceId, spanId } from the active OTel span\n * when tracing is enabled.\n *\n * @module shared/Logger\n */\nimport winston from 'winston';\nimport DailyRotateFile from 'winston-daily-rotate-file';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\n\n// Lazy OTel trace context — loaded dynamically to avoid circular deps and to\n// remain a no-op when OTel is not enabled. The getter is synchronous once\n// the module is cached.\ntype TraceContextFn = () => { traceId: string; spanId: string };\nlet _getTraceCtx: TraceContextFn | null | 'pending' = null;\n\nfunction getActiveTraceCtx(): { traceId: string; spanId: string } {\n if (_getTraceCtx === 'pending') return { traceId: '', spanId: '' };\n if (_getTraceCtx) return _getTraceCtx();\n // Attempt to lazy-load (once) without blocking\n _getTraceCtx = 'pending';\n import('../observability/tracing.js')\n .then((mod) => {\n _getTraceCtx = (mod as { getActiveTraceContext: TraceContextFn }).getActiveTraceContext;\n })\n .catch(() => {\n _getTraceCtx = null;\n });\n return { traceId: '', spanId: '' };\n}\n\n// ─── Sensitive-data masking ───────────────────────────────────────────────────\n\nconst SENSITIVE_KEYS: string[] = [\n 'password', 'passwd', 'pass', 'pwd', 'secret', 'secretkey', 'secret_key', 'secretaccesskey', 'accesskeyid',\n 'credentials', 'auth', 'authentication', 'login',\n 'api_key', 'apikey', 'api', 'access_key', 'access_token', 'accesskey',\n 'auth_key', 'auth_token', 'authkey', 'token', 'jwt', 'bearer_token',\n 'refresh_token', 'session_token', 'session_key', 'oauth_token',\n 'connection_string', 'conn_string', 'db_uri', 'db_url', 'database_url',\n 'mongodb_uri', 'mysql_uri', 'postgres_uri', 'sql_uri',\n 'db_username', 'db_password', 'db_host', 'db_port', 'db_name',\n 'encryption_key', 'crypto_key', 'private_key', 'public_key', 'ssl_key',\n 'ssh_key', 'pgp_key', 'rsa_key', 'aes_key',\n 'email', 'phone', 'telephone', 'mobile', 'ssn', 'social_security',\n 'credit_card', 'cc_number', 'card_number', 'cvv', 'expiry_date',\n 'birth_date', 'dob', 'address', 'zip_code', 'postal_code',\n 'bank_account', 'iban', 'swift_code', 'routing_number',\n 'tax_id', 'vat_number', 'financial_id',\n 'certificate', 'client_cert', 'server_cert', 'ca_cert',\n 'aws_key', 'aws_secret', 'azure_key', 'gcp_key', 's3_key',\n 'cloudinary_key', 'stripe_key', 'paypal_key', 'twilio_key',\n 'app_secret', 'client_secret', 'consumer_secret', 'encryption_secret',\n 'master_key', 'root_password', 'admin_password',\n 'config_secret', 'env_secret', 'deploy_key', 'ci_key',\n 'session_id', 'cookie_secret', 'csrf_token', 'xsrf_token',\n 'license_key', 'product_key', 'serial_number', 'activation_code',\n];\n\nconst SENSITIVE_PATTERNS: RegExp[] = [\n /(?:password|passwd|secret|api_key|access_token|auth_token|token)\\s*[:=]\\s*([^\\s,]+)/gi,\n /\\b\\d{16}\\b/gi,\n /\\b\\d{3}-\\d{2}-\\d{4}\\b/gi,\n /\\b[A-Za-z0-9]{32}\\b/gi,\n /\\b[A-Za-z0-9_-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}\\b/gi,\n /\\b\\d{10}\\b/gi,\n /\\b[A-Za-z0-9]{64}\\b/gi,\n /(?:connection_string|db_uri|db_url|mongodb_uri)\\s*[:=]\\s*([^\\s,]+)/gi,\n /(?:apikey|api_key|auth_key)\\s*[:=]\\s*([^\\s,]+)/gi,\n /(?:bearer\\s+)([a-zA-Z0-9\\-_]+\\.[a-zA-Z0-9\\-_]+\\.[a-zA-Z0-9\\-_]+)/gi,\n];\n\nconst SENSITIVE_KEYS_REGEX = new RegExp(`^(${SENSITIVE_KEYS.join('|')})$`, 'i');\n\nclass Logger {\n private static instance: winston.Logger | null = null;\n\n static maskSensitiveData(value: string): string {\n if (typeof value === 'string' && value.length > 5) {\n const firstChar = value.at(0)!;\n const lastChar = value.at(-1)!;\n return firstChar + '*'.repeat(value.length - 2) + lastChar;\n }\n return value;\n }\n\n static maskSensitive(message: string, args: unknown[] = []): { maskedMessage: string; maskedArgs: unknown[] } {\n const maskString = (input: string): string => {\n if (typeof input !== 'string') return input;\n return SENSITIVE_PATTERNS.reduce((str, pattern) => {\n return str.replace(pattern, (match: string, value: string) =>\n value ? match.replace(value, Logger.maskSensitiveData(value)) : match,\n );\n }, input);\n };\n\n const deepMask = (obj: unknown): unknown => {\n if (typeof obj === 'string') return maskString(obj);\n if (Array.isArray(obj)) return obj.map((item: unknown) => deepMask(item));\n if (typeof obj === 'object' && obj !== null) {\n return Object.entries(obj as Record<string, unknown>).reduce(\n (acc: Record<string, unknown>, [key, value]) => {\n if (value === undefined) return acc;\n const isSensitiveKey = SENSITIVE_KEYS_REGEX.test(key);\n acc[key] = isSensitiveKey && typeof value === 'string'\n ? Logger.maskSensitiveData(value)\n : deepMask(value);\n return acc;\n },\n {},\n );\n }\n return obj;\n };\n\n return {\n maskedMessage: maskString(message),\n maskedArgs: args.map((arg: unknown) => deepMask(arg)),\n };\n }\n\n /** Global log directory: ~/.code-intel/logs */\n static readonly LOG_DIR = path.join(os.homedir(), '.code-intel', 'logs');\n\n static getLogger(): winston.Logger {\n if (!Logger.instance) {\n const isProduction = process.env.NODE_ENV === 'production';\n const logLevel = process.env.LOG_LEVEL ?? 'info';\n const transports: winston.transport[] = [];\n\n // Always add console transport\n transports.push(new winston.transports.Console());\n\n if (!isProduction) {\n // Dev + global installs: rotate logs into ~/.code-intel/logs/\n try {\n if (!fs.existsSync(Logger.LOG_DIR)) {\n fs.mkdirSync(Logger.LOG_DIR, { recursive: true });\n }\n transports.push(\n new DailyRotateFile({\n filename: path.join(Logger.LOG_DIR, '%DATE%-code-intel.log'),\n datePattern: 'YYYY-MM-DD',\n maxSize: '20m',\n maxFiles: '14d',\n }),\n );\n } catch {\n // If we can't write to the log dir (e.g. read-only FS), continue console-only\n }\n }\n\n Logger.instance = winston.createLogger({\n level: logLevel,\n format: winston.format.combine(\n winston.format.timestamp(),\n winston.format.printf(({ timestamp, level, message, ...meta }) => {\n const args = (meta[Symbol.for('splat') as unknown as string] as unknown[]) || [];\n const { maskedMessage, maskedArgs } = Logger.maskSensitive(message as string, args);\n const formattedArgs = maskedArgs.map((arg: unknown) =>\n typeof arg === 'object' ? JSON.stringify(arg) : String(arg),\n );\n const suffix = formattedArgs.length ? ' ' + formattedArgs.join(' ') : '';\n // Include OTel trace context when available\n let traceCtx = '';\n try {\n const { traceId, spanId } = getActiveTraceCtx();\n if (traceId) traceCtx = ` [trace=${traceId} span=${spanId}]`;\n } catch { /* OTel not loaded */ }\n return `${timestamp} [${level.toUpperCase()}]${traceCtx}: ${maskedMessage}${suffix}`;\n }),\n ),\n transports,\n });\n }\n return Logger.instance;\n }\n\n static info(message: string, ...args: unknown[]): void {\n Logger.getLogger().info(message, ...args);\n }\n\n static warn(message: string, ...args: unknown[]): void {\n Logger.getLogger().warn(message, ...args);\n }\n\n static error(message: string, ...args: unknown[]): void {\n Logger.getLogger().error(message, ...args);\n }\n\n static debug(message: string, ...args: unknown[]): void {\n Logger.getLogger().debug(message, ...args);\n }\n}\n\nexport default Logger;\n\n// Eagerly initialize so the log directory and file transport are created on import,\n// even if no log messages are emitted during a short run.\nLogger.getLogger();\n","export const javascriptQueries = `\n;; Function declaration\n(function_declaration\n name: (identifier) @def.func.name) @def.func\n\n;; Arrow function in variable\n(lexical_declaration\n (variable_declarator\n name: (identifier) @def.func.name\n value: (arrow_function))) @def.func\n\n;; Const/let/var variable (non-function, SCREAMING_SNAKE_CASE only — kept for constants)\n(lexical_declaration\n (variable_declarator\n name: (identifier) @def.var.name\n value: (_) @def.var.value)) @def.var\n\n;; Class declaration (JS uses identifier, not type_identifier)\n(class_declaration\n name: (identifier) @def.class.name) @def.class\n\n;; Method definition\n(method_definition\n name: (property_identifier) @def.method.name) @def.method\n\n;; Public field definition (JS uses field_definition with property: field, not name:)\n(field_definition\n property: (property_identifier) @def.property.name) @def.property\n\n;; Import statement\n(import_statement\n source: (string) @imp.source) @imp\n\n;; Import specifier\n(import_specifier\n name: (identifier) @imp.name)\n\n;; Namespace import\n(namespace_import (identifier) @imp.namespace)\n\n;; Export statement\n(export_statement) @export\n\n;; Call expression — function call\n(call_expression\n function: (identifier) @call.name) @call\n\n;; Call expression — member call\n(call_expression\n function: (member_expression\n object: (_) @call.receiver\n property: (property_identifier) @call.method)) @call.member\n\n;; New expression\n(new_expression\n constructor: (identifier) @call.constructor) @call.new\n`;\n","export const dartQueries = `\n;; Class definition (includes abstract classes)\n(class_definition\n name: (identifier) @def.class.name) @def.class\n\n;; Enum declaration\n(enum_declaration\n name: (identifier) @def.enum.name) @def.enum\n\n;; Function / method signatures (top-level functions and class methods)\n;; tree-sitter-dart uses function_signature for both\n(function_signature\n name: (identifier) @def.func.name) @def.func\n`;\n","export { typescriptQueries } from './typescript.js';\nexport { javascriptQueries } from './javascript.js';\nexport { pythonQueries } from './python.js';\nexport { javaQueries } from './java.js';\nexport { goQueries } from './go.js';\nexport { cQueries } from './c.js';\nexport { cppQueries } from './cpp.js';\nexport { csharpQueries } from './csharp.js';\nexport { rustQueries } from './rust.js';\nexport { phpQueries } from './php.js';\nexport { kotlinQueries } from './kotlin.js';\nexport { rubyQueries } from './ruby.js';\nexport { swiftQueries } from './swift.js';\nexport { dartQueries } from './dart.js';\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { detectLanguage, Language } from '../../shared/index.js';\nimport type { Phase, PhaseResult, PipelineContext } from '../types.js';\nimport { generateNodeId, generateEdgeId } from '../../graph/id-generator.js';\nimport type { CodeNode, CodeEdge, NodeKind } from '../../shared/index.js';\nimport Logger from '../../shared/logger.js';\nimport { parseSource, getLanguage } from '../../parsing/parser-manager.js';\nimport { runQueryMatches } from '../../parsing/query-runner.js';\nimport type { Node as TSNode, Language as TSLanguage } from 'web-tree-sitter';\nimport {\n typescriptQueries,\n javascriptQueries,\n pythonQueries,\n javaQueries,\n goQueries,\n cQueries,\n cppQueries,\n csharpQueries,\n rustQueries,\n phpQueries,\n kotlinQueries,\n rubyQueries,\n swiftQueries,\n dartQueries,\n} from '../../parsing/queries/index.js';\n\n// ─── Query map ───────────────────────────────────────────────────────────────\n\nconst LANG_QUERIES: Partial<Record<Language, string>> = {\n [Language.TypeScript]: typescriptQueries,\n [Language.JavaScript]: javascriptQueries,\n [Language.Python]: pythonQueries,\n [Language.Java]: javaQueries,\n [Language.Go]: goQueries,\n [Language.C]: cQueries,\n [Language.Cpp]: cppQueries,\n [Language.CSharp]: csharpQueries,\n [Language.Rust]: rustQueries,\n [Language.PHP]: phpQueries,\n [Language.Kotlin]: kotlinQueries,\n [Language.Ruby]: rubyQueries,\n [Language.Swift]: swiftQueries,\n [Language.Dart]: dartQueries,\n};\n\n// ─── Capture-name → NodeKind map ─────────────────────────────────────────────\n\nconst CAPTURE_KIND: Record<string, NodeKind> = {\n 'def.func': 'function',\n 'def.func.decorated': 'function',\n 'def.method': 'method',\n 'def.method.static': 'method',\n 'def.class': 'class',\n 'def.class.object': 'class',\n 'def.class.template': 'class',\n 'def.impl': 'class',\n 'def.interface': 'interface',\n 'def.enum': 'enum',\n 'def.struct': 'struct',\n 'def.trait': 'trait',\n 'def.type_alias': 'type_alias',\n 'def.constant': 'constant',\n 'def.namespace': 'namespace',\n 'def.module': 'module',\n 'def.property': 'property',\n 'def.var': 'variable',\n 'def.constructor': 'constructor',\n};\n\n// Captures that are NOT symbol definitions (skip them)\nconst NON_DEF_PREFIXES = ['imp.', 'call.', 'export', 'inherit.'];\n\nfunction isDefCapture(name: string): boolean {\n if (!name.startsWith('def.')) return false;\n return true;\n}\n\nfunction captureKind(name: string): NodeKind | null {\n // Exact match first\n if (CAPTURE_KIND[name]) return CAPTURE_KIND[name];\n // Prefix match (e.g. \"def.func.name\" → strip \".name\" → \"def.func\")\n const base = name.replace(/\\.name$/, '');\n return CAPTURE_KIND[base] ?? null;\n}\n\n// ─── Exported-ness helpers ────────────────────────────────────────────────────\n\nfunction isExported(node: TSNode, lang: Language, name?: string): boolean {\n if (lang === Language.TypeScript || lang === Language.JavaScript) {\n // Walk ancestor chain looking for export_statement\n let cur: TSNode | null = node.parent;\n while (cur) {\n if (cur.type === 'export_statement') return true;\n cur = cur.parent;\n }\n return false;\n }\n if (lang === Language.Java || lang === Language.CSharp) {\n // Check for 'public' modifier in enclosing modifiers or parent text\n let cur: TSNode | null = node.parent;\n while (cur) {\n if (cur.type === 'modifiers') return cur.text.includes('public');\n if (cur.type === 'class_declaration' || cur.type === 'method_declaration' ||\n cur.type === 'interface_declaration' || cur.type === 'enum_declaration') {\n return cur.text.trimStart().startsWith('public');\n }\n cur = cur.parent;\n }\n return false;\n }\n if (lang === Language.Go) {\n // Go: exported iff first letter is uppercase\n const n = name ?? node.text;\n return n.length > 0 && n[0] === n[0].toUpperCase() && /[A-Z]/.test(n[0]);\n }\n if (lang === Language.Rust) {\n // Walk ancestors for visibility_modifier (pub)\n let cur: TSNode | null = node.parent;\n while (cur) {\n if (cur.type === 'visibility_modifier') return true;\n // Stop at impl block boundary\n if (cur.type === 'source_file') break;\n cur = cur.parent;\n }\n return false;\n }\n if (lang === Language.Python) {\n // Python: exported iff name doesn't start with underscore\n const n = name ?? node.text;\n return !n.startsWith('_');\n }\n // Default: everything is exported (C, C++, PHP, Ruby, Swift, etc.)\n return true;\n}\n\n// ─── Parameter extraction ─────────────────────────────────────────────────────\n\ninterface Param { name: string; type?: string }\n\nfunction extractParams(defNode: TSNode, lang: Language): Param[] {\n const params: Param[] = [];\n\n // TypeScript / JavaScript\n if (lang === Language.TypeScript || lang === Language.JavaScript) {\n const paramNode =\n defNode.childForFieldName?.('parameters') ??\n findFirstChildByType(defNode, 'formal_parameters') ??\n findFirstChildByType(defNode, 'formal_parameter');\n if (paramNode) {\n for (const child of paramNode.children) {\n if (child.type === 'required_parameter' || child.type === 'optional_parameter') {\n const namePart = child.childForFieldName?.('pattern') ?? child.firstChild;\n const typePart = child.childForFieldName?.('type');\n if (namePart) {\n params.push({\n name: namePart.text,\n type: typePart ? typePart.text.replace(/^:\\s*/, '') : undefined,\n });\n }\n } else if (child.type === 'identifier') {\n // Untyped JS parameter\n params.push({ name: child.text });\n }\n }\n }\n return params;\n }\n\n // Python\n if (lang === Language.Python) {\n const paramNode = defNode.childForFieldName?.('parameters');\n if (paramNode) {\n for (const child of paramNode.children) {\n if (child.type === 'identifier') {\n if (child.text === 'self' || child.text === 'cls') continue;\n params.push({ name: child.text });\n } else if (child.type === 'typed_parameter') {\n const name = child.children.find((c) => c.type === 'identifier');\n const type = child.children.find((c) => c.type === 'type');\n if (name) {\n params.push({ name: name.text, type: type?.text });\n }\n } else if (child.type === 'default_parameter') {\n const name = child.childForFieldName?.('name');\n if (name) params.push({ name: name.text });\n } else if (child.type === 'typed_default_parameter') {\n const name = child.childForFieldName?.('name');\n const type = child.childForFieldName?.('type');\n if (name) params.push({ name: name.text, type: type?.text });\n }\n }\n }\n return params;\n }\n\n // Go\n if (lang === Language.Go) {\n const paramNode = defNode.childForFieldName?.('parameters');\n if (paramNode) {\n for (const child of paramNode.children) {\n if (child.type === 'parameter_declaration') {\n const name = child.children.find((c) => c.type === 'identifier');\n const type = child.childForFieldName?.('type');\n if (name) params.push({ name: name.text, type: type?.text });\n }\n }\n }\n return params;\n }\n\n // Java / Kotlin / C# / PHP / Swift / Ruby — basic extraction\n const paramNode =\n defNode.childForFieldName?.('parameters') ??\n findFirstChildByType(defNode, 'formal_parameters') ??\n findFirstChildByType(defNode, 'function_value_parameters') ??\n findFirstChildByType(defNode, 'parameter_list');\n if (paramNode) {\n for (const child of paramNode.children) {\n if (child.type.includes('parameter')) {\n const name =\n child.childForFieldName?.('name') ??\n child.children.find((c) => c.type === 'identifier');\n if (name) params.push({ name: name.text });\n }\n }\n }\n return params;\n}\n\n// ─── Return type extraction ───────────────────────────────────────────────────\n\nfunction extractReturnType(defNode: TSNode, lang: Language): string | undefined {\n if (lang === Language.TypeScript || lang === Language.JavaScript) {\n const retNode = defNode.childForFieldName?.('return_type');\n return retNode ? retNode.text.replace(/^:\\s*/, '') : undefined;\n }\n if (lang === Language.Python) {\n const retNode = defNode.childForFieldName?.('return_type');\n return retNode ? retNode.text.replace(/^->\\s*/, '') : undefined;\n }\n if (lang === Language.Go) {\n const retNode = defNode.childForFieldName?.('result');\n return retNode ? retNode.text : undefined;\n }\n if (lang === Language.Java || lang === Language.Kotlin) {\n const retNode = defNode.childForFieldName?.('type');\n return retNode ? retNode.text : undefined;\n }\n if (lang === Language.Rust) {\n const retNode = defNode.childForFieldName?.('return_type');\n return retNode ? retNode.text.replace(/^->\\s*/, '') : undefined;\n }\n return undefined;\n}\n\n// ─── Doc / JSDoc extraction ───────────────────────────────────────────────────\n\nfunction extractDoc(defNode: TSNode, source: string, lang: Language): string | undefined {\n const DOC_MAX = 500;\n\n /**\n * Find the \"anchor\" node whose previous sibling we look at for a doc comment.\n * For exported declarations (e.g. `export function foo ...`), the function_declaration\n * is inside `export_statement`, so we walk up to the export_statement first.\n */\n function anchorNode(n: TSNode): TSNode {\n let cur: TSNode = n;\n while (cur.parent && cur.parent.type === 'export_statement') {\n cur = cur.parent;\n }\n return cur;\n }\n\n const anchor = anchorNode(defNode);\n\n // Walk previous siblings of the anchor to find a comment, skipping decorators\n let prev: TSNode | null = anchor.previousSibling ?? prevSibling(anchor);\n while (prev && (prev.type === 'decorator' || prev.type.includes('attribute_item'))) {\n prev = prev.previousSibling ?? prevSibling(prev);\n }\n\n if (!prev) return undefined;\n\n // TypeScript/JavaScript: /** ... */\n if (lang === Language.TypeScript || lang === Language.JavaScript) {\n if (prev.type === 'comment' && prev.text.startsWith('/**')) {\n const lines = prev.text\n .split('\\n')\n .map((l) => l.replace(/^\\s*\\*+\\s?/, '').trim())\n .filter((l) => l !== '' && l !== '/' && l !== '*');\n const doc = lines.join('\\n').slice(0, DOC_MAX);\n return doc || undefined;\n }\n return undefined;\n }\n\n // Java / C#: /** ... */\n if (lang === Language.Java || lang === Language.CSharp || lang === Language.Kotlin) {\n if (prev.type === 'block_comment' || prev.type === 'comment') {\n if (prev.text.startsWith('/**')) {\n const lines = prev.text\n .split('\\n')\n .map((l) => l.replace(/^\\s*\\*+\\s?/, '').trim())\n .filter(Boolean);\n return lines.join('\\n').slice(0, DOC_MAX) || undefined;\n }\n }\n return undefined;\n }\n\n // Python: first string in body\n if (lang === Language.Python) {\n const body = defNode.childForFieldName?.('body');\n if (body) {\n const first = body.firstChild;\n if (first?.type === 'expression_statement') {\n const s = first.firstChild;\n if (s?.type === 'string') {\n return s.text.replace(/^[\"']{1,3}|[\"']{1,3}$/g, '').trim().slice(0, DOC_MAX);\n }\n }\n }\n return undefined;\n }\n\n // Go: preceding // comment lines\n if (lang === Language.Go) {\n const lines: string[] = [];\n let cur: TSNode | null = prev;\n while (cur && cur.type === 'comment') {\n lines.unshift(cur.text.replace(/^\\/\\/\\s?/, '').trim());\n cur = cur.previousSibling ?? prevSibling(cur);\n }\n const doc = lines.join('\\n').trim().slice(0, DOC_MAX);\n return doc || undefined;\n }\n\n // Rust: /// doc lines\n if (lang === Language.Rust) {\n const lines: string[] = [];\n let cur: TSNode | null = prev;\n while (cur && cur.type === 'line_comment') {\n const t = cur.text;\n if (t.startsWith('///')) {\n lines.unshift(t.replace(/^\\/\\/\\/\\s?/, '').trim());\n } else {\n break;\n }\n cur = cur.previousSibling ?? prevSibling(cur);\n }\n const doc = lines.join('\\n').trim().slice(0, DOC_MAX);\n return doc || undefined;\n }\n\n return undefined;\n}\n\n// ─── Decorator / annotation extraction ────────────────────────────────────────\n\nfunction extractDecorators(defNode: TSNode, lang: Language): string[] {\n const decs: string[] = [];\n\n if (lang === Language.TypeScript || lang === Language.JavaScript) {\n // Decorators in TS can be:\n // 1. Children of export_statement (when exported: `@Dec() export class Foo {}`)\n // 2. Preceding siblings of the class/function node (non-exported)\n let anchor: TSNode = defNode;\n while (anchor.parent?.type === 'export_statement') anchor = anchor.parent;\n\n if (anchor.type === 'export_statement') {\n // Decorators are named children of export_statement\n for (const child of anchor.namedChildren) {\n if (child.type === 'decorator') decs.push(child.text);\n }\n } else {\n // Non-exported: decorators are preceding siblings\n let prev: TSNode | null = anchor.previousSibling;\n while (prev && prev.type === 'decorator') {\n decs.unshift(prev.text);\n prev = prev.previousSibling;\n }\n }\n return decs;\n }\n\n if (lang === Language.Java || lang === Language.Kotlin) {\n // Annotations live inside the modifiers child\n const modifiers = defNode.childForFieldName?.('modifiers');\n if (modifiers) {\n for (const child of modifiers.children) {\n if (child.type === 'marker_annotation' || child.type === 'annotation') {\n decs.push(child.text);\n }\n }\n }\n // Also preceding siblings for Kotlin\n let prev: TSNode | null = defNode.previousSibling ?? prevSibling(defNode);\n while (prev && (prev.type === 'marker_annotation' || prev.type === 'annotation')) {\n decs.unshift(prev.text);\n prev = prev.previousSibling ?? prevSibling(prev);\n }\n return decs;\n }\n\n if (lang === Language.Python) {\n // In Python AST, decorated_definition wraps decorator + definition\n const p = defNode.parent;\n if (p?.type === 'decorated_definition') {\n for (const child of p.children) {\n if (child.type === 'decorator') decs.push(child.text);\n }\n }\n return decs;\n }\n\n if (lang === Language.Rust) {\n // #[...] attribute_item nodes precede the function_item / struct_item etc.\n let prev: TSNode | null = defNode.previousSibling ?? prevSibling(defNode);\n while (prev && prev.type === 'attribute_item') {\n decs.unshift(prev.text);\n prev = prev.previousSibling ?? prevSibling(prev);\n }\n return decs;\n }\n\n return decs;\n}\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction prevSibling(node: TSNode): TSNode | null {\n const parent = node.parent;\n if (!parent) return null;\n const children = parent.children;\n const idx = children.indexOf(node);\n if (idx <= 0) return null;\n return children[idx - 1] ?? null;\n}\n\nfunction findFirstChildByType(node: TSNode, type: string): TSNode | null {\n for (const child of node.children) {\n if (child.type === type) return child;\n const found = findFirstChildByType(child, type);\n if (found) return found;\n }\n return null;\n}\n\nfunction truncate(s: string | undefined, max: number): string | undefined {\n if (!s) return undefined;\n return s.length <= max ? s : s.slice(0, max) + '…';\n}\n\n// ─── Tree-sitter parse phase ──────────────────────────────────────────────────\n\nexport const parsePhase: Phase = {\n name: 'parse',\n dependencies: ['structure'],\n async execute(context: PipelineContext): Promise<PhaseResult> {\n const start = Date.now();\n let symbolCount = 0;\n let treeSitterCount = 0;\n let regexCount = 0;\n\n // Initialise shared caches that resolve phase will reuse\n if (!context.fileCache) context.fileCache = new Map();\n if (!context.fileFunctionIndex) context.fileFunctionIndex = new Map();\n\n const CONCURRENCY = 64;\n const filePaths = context.filePaths;\n\n // ── Read all files ────────────────────────────────────────────────────────\n let readDone = 0;\n for (let i = 0; i < filePaths.length; i += CONCURRENCY) {\n const batch = filePaths.slice(i, i + CONCURRENCY);\n await Promise.all(batch.map(async (filePath) => {\n try {\n const source = await fs.promises.readFile(filePath, 'utf-8');\n context.fileCache!.set(filePath, source);\n } catch {\n // Unreadable file — skip silently\n }\n }));\n readDone += batch.length;\n context.onPhaseProgress?.('parse:read', readDone, filePaths.length);\n }\n\n // ── Parse each file ───────────────────────────────────────────────────────\n let parseDone = 0;\n for (const filePath of filePaths) {\n const lang = detectLanguage(filePath);\n if (!lang) {\n if (context.verbose) {\n const relativePath = path.relative(context.workspaceRoot, filePath);\n Logger.info(` [parse] skipped (no parser): ${relativePath}`);\n }\n continue;\n }\n\n const source = context.fileCache.get(filePath);\n if (!source) continue;\n\n const relativePath = path.relative(context.workspaceRoot, filePath);\n const fileNodeId = generateNodeId('file', relativePath, relativePath);\n\n // Store a snippet on the file node for full-text search\n const fileNode = context.graph.getNode(fileNodeId);\n if (fileNode) {\n fileNode.content = source.slice(0, 2000);\n }\n\n // ── Try tree-sitter first ──────────────────────────────────────────────\n let usedTreeSitter = false;\n const queryStr = LANG_QUERIES[lang];\n\n if (queryStr) {\n try {\n const { nodes, edges } = await extractFromTreeAsync(\n lang,\n source,\n relativePath,\n fileNodeId,\n queryStr,\n );\n\n if (nodes.length > 0 || edges.length > 0) {\n for (const n of nodes) context.graph.addNode(n);\n for (const e of edges) context.graph.addEdge(e);\n symbolCount += nodes.length;\n treeSitterCount++;\n usedTreeSitter = true;\n\n // Build per-file sorted function/method index\n const funcs = nodes\n .filter((n) => n.kind === 'function' || n.kind === 'method')\n .map((n) => ({ id: n.id, startLine: n.startLine ?? 0, endLine: n.endLine }))\n .sort((a, b) => a.startLine - b.startLine);\n if (funcs.length > 0) {\n context.fileFunctionIndex!.set(relativePath, funcs);\n }\n }\n } catch (err) {\n Logger.warn(` [parse] tree-sitter failed for ${relativePath}: ${err instanceof Error ? err.message : String(err)} — falling back to regex`);\n }\n }\n\n // ── Fallback to regex if tree-sitter didn't run ───────────────────────\n if (!usedTreeSitter) {\n regexCount++;\n const { nodes, edges } = extractWithRegex(source, lang, relativePath, fileNodeId);\n for (const n of nodes) context.graph.addNode(n);\n for (const e of edges) context.graph.addEdge(e);\n symbolCount += nodes.length;\n\n const funcs = nodes\n .filter((n) => n.kind === 'function' || n.kind === 'method')\n .map((n) => ({ id: n.id, startLine: n.startLine ?? 0, endLine: n.endLine }))\n .sort((a, b) => a.startLine - b.startLine);\n if (funcs.length > 0) {\n context.fileFunctionIndex!.set(relativePath, funcs);\n }\n }\n\n parseDone++;\n context.onPhaseProgress?.('parse', parseDone, filePaths.length);\n }\n\n const parserUsed: 'tree-sitter' | 'regex' = treeSitterCount === 0 ? 'regex' : 'tree-sitter';\n // Store parser info in context for CLI/HTTP to write into meta.json\n context.parserUsed = parserUsed;\n\n if (context.verbose) {\n Logger.info(` [parse] tree-sitter: ${treeSitterCount} files, regex fallback: ${regexCount} files`);\n }\n\n return {\n status: 'completed',\n duration: Date.now() - start,\n message: `Extracted ${symbolCount} symbols from ${filePaths.length} files (${parserUsed})`,\n };\n },\n};\n\n// ─── Tree-sitter extraction ───────────────────────────────────────────────────\n\nasync function extractFromTreeAsync(\n lang: Language,\n source: string,\n relativePath: string,\n fileNodeId: string,\n queryStr: string,\n): Promise<{ nodes: CodeNode[]; edges: CodeEdge[] }> {\n const tsLang = await getLanguage(lang);\n if (!tsLang) return { nodes: [], edges: [] };\n\n const tree = await parseSource(lang, source);\n if (!tree) return { nodes: [], edges: [] };\n\n return extractFromTree(tree.rootNode as unknown as TSNode, tsLang, source, lang, relativePath, fileNodeId, queryStr);\n}\n\nfunction extractFromTree(\n root: TSNode,\n tsLanguage: TSLanguage,\n source: string,\n lang: Language,\n relativePath: string,\n fileNodeId: string,\n queryStr: string,\n): { nodes: CodeNode[]; edges: CodeEdge[] } {\n const nodes: CodeNode[] = [];\n const edges: CodeEdge[] = [];\n const seen = new Set<string>();\n\n // Hoist line-split so we don't re-split source on every match iteration.\n const sourceLines = source.split('\\n');\n\n // Run the query to get all pattern matches\n const matches = runQueryMatches(\n { rootNode: root } as unknown as import('web-tree-sitter').Tree,\n tsLanguage,\n queryStr,\n );\n\n for (const match of matches) {\n // Find the \"def.X\" capture (the whole definition node)\n const defCapture = match.captures.find(\n (c) => isDefCapture(c.name) && !c.name.endsWith('.name'),\n );\n // Find the \"def.X.name\" capture (just the name identifier)\n const nameCapture = match.captures.find((c) => c.name.endsWith('.name'));\n\n if (!defCapture || !nameCapture) continue;\n\n const kind = captureKind(defCapture.name);\n if (!kind) continue;\n\n const name = nameCapture.text.trim();\n if (!name) continue;\n\n const dedupeKey = `${kind}:${name}`;\n if (seen.has(dedupeKey)) continue;\n seen.add(dedupeKey);\n\n const defNode = defCapture.node;\n const startLine = defNode.startPosition.row + 1; // 1-based\n const endLine = defNode.endPosition.row + 1;\n\n // Validate\n if (startLine > endLine) {\n Logger.warn(` [parse] ${relativePath}: ${name} startLine(${startLine}) > endLine(${endLine}), skipping`);\n continue;\n }\n\n // Extract rich metadata\n const params = (kind === 'function' || kind === 'method' || kind === 'constructor')\n ? extractParams(defNode, lang)\n : undefined;\n\n const returnType = (kind === 'function' || kind === 'method')\n ? extractReturnType(defNode, lang)\n : undefined;\n\n const doc = extractDoc(defNode, source, lang);\n const decorators = extractDecorators(defNode, lang);\n\n const metadata: Record<string, unknown> = {};\n if (params && params.length > 0) metadata.parameters = params;\n if (returnType) metadata.returnType = truncate(returnType, 200);\n if (doc) metadata.doc = doc;\n if (decorators.length > 0) metadata.decorators = decorators;\n\n const nodeId = generateNodeId(kind, relativePath, name);\n nodes.push({\n id: nodeId,\n kind,\n name,\n filePath: relativePath,\n startLine,\n endLine,\n exported: isExported(defNode, lang, name),\n content: sourceLines.slice(startLine - 1, Math.min(startLine + 19, endLine)).join('\\n'),\n metadata: Object.keys(metadata).length > 0 ? metadata : undefined,\n });\n\n edges.push({\n id: generateEdgeId(fileNodeId, nodeId, 'contains'),\n source: fileNodeId,\n target: nodeId,\n kind: 'contains',\n weight: 1.0,\n });\n }\n\n return { nodes, edges };\n}\n\n// ─── Regex fallback (original logic, preserved for unsupported languages) ─────\n\nfunction extractWithRegex(\n source: string,\n lang: Language,\n relativePath: string,\n fileNodeId: string,\n): { nodes: CodeNode[]; edges: CodeEdge[] } {\n const nodes: CodeNode[] = [];\n const edges: CodeEdge[] = [];\n const seen = new Set<string>();\n const lines = source.split('\\n');\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const trimmed = line.trim();\n\n if (\n trimmed.startsWith('//') ||\n trimmed.startsWith('#') ||\n trimmed.startsWith('*') ||\n trimmed.startsWith('/*')\n ) continue;\n\n const extracted = extractSymbolRegex(trimmed, lang, i + 1, relativePath);\n if (!extracted) continue;\n\n const dedupeKey = extracted.name + ':' + extracted.kind;\n if (seen.has(dedupeKey)) continue;\n seen.add(dedupeKey);\n\n const nodeId = generateNodeId(extracted.kind, relativePath, extracted.name);\n const endLine = estimateEndLine(lines, i, lang);\n\n nodes.push({\n id: nodeId,\n kind: extracted.kind,\n name: extracted.name,\n filePath: relativePath,\n startLine: i + 1,\n endLine,\n exported: extracted.exported,\n content: extractBlock(lines, i, 20),\n });\n edges.push({\n id: generateEdgeId(fileNodeId, nodeId, 'contains'),\n source: fileNodeId,\n target: nodeId,\n kind: 'contains',\n weight: 1.0,\n });\n\n if (extracted.ownerName) {\n const ownerId = generateNodeId('class', relativePath, extracted.ownerName);\n if (nodes.some((n) => n.id === ownerId)) {\n edges.push({\n id: generateEdgeId(ownerId, nodeId, 'has_member'),\n source: ownerId,\n target: nodeId,\n kind: 'has_member',\n weight: 1.0,\n });\n }\n }\n }\n\n return { nodes, edges };\n}\n\n// ─── Original regex symbol extraction (kept as fallback) ─────────────────────\n\ninterface ExtractedSymbol {\n kind: CodeNode['kind'];\n name: string;\n exported: boolean;\n ownerName?: string;\n}\n\nfunction extractSymbolRegex(\n line: string,\n lang: Language,\n _lineNum: number,\n _filePath: string,\n): ExtractedSymbol | null {\n if (lang === Language.TypeScript || lang === Language.JavaScript) {\n const func = line.match(/^(?:export\\s+)?(?:default\\s+)?(?:async\\s+)?function\\s+(\\w+)/);\n if (func) return { kind: 'function', name: func[1], exported: line.includes('export') };\n\n const arrowFunc = line.match(/^(?:export\\s+)?(?:const|let|var)\\s+(\\w+)\\s*=\\s*(?:async\\s+)?\\(/);\n if (arrowFunc) return { kind: 'function', name: arrowFunc[1], exported: line.includes('export') };\n\n const arrowFunc2 = line.match(/^(?:export\\s+)?(?:const|let|var)\\s+(\\w+)\\s*=\\s*(?:async\\s+)?(?:\\([^)]*\\)|[a-zA-Z_]\\w*)\\s*=>/);\n if (arrowFunc2) return { kind: 'function', name: arrowFunc2[1], exported: line.includes('export') };\n\n const cls = line.match(/^(?:export\\s+)?(?:default\\s+)?(?:abstract\\s+)?class\\s+(\\w+)/);\n if (cls) return { kind: 'class', name: cls[1], exported: line.includes('export') };\n\n const iface = line.match(/^(?:export\\s+)?interface\\s+(\\w+)/);\n if (iface) return { kind: 'interface', name: iface[1], exported: line.includes('export') };\n\n const enumM = line.match(/^(?:export\\s+)?enum\\s+(\\w+)/);\n if (enumM) return { kind: 'enum', name: enumM[1], exported: line.includes('export') };\n\n const typeAlias = line.match(/^(?:export\\s+)?type\\s+(\\w+)\\s*[=<]/);\n if (typeAlias) return { kind: 'type_alias', name: typeAlias[1], exported: line.includes('export') };\n\n const constVar = line.match(/^(?:export\\s+)?const\\s+(\\w+)\\s*(?::\\s*\\w[^=]*)?\\s*=/);\n if (constVar && /^[A-Z_]+$/.test(constVar[1])) {\n return { kind: 'constant', name: constVar[1], exported: line.includes('export') };\n }\n }\n\n if (lang === Language.Python) {\n const func = line.match(/^(?:async\\s+)?def\\s+(\\w+)/);\n if (func) return { kind: func[1].startsWith('__') ? 'method' : 'function', name: func[1], exported: !func[1].startsWith('_') };\n const cls = line.match(/^class\\s+(\\w+)/);\n if (cls) return { kind: 'class', name: cls[1], exported: !cls[1].startsWith('_') };\n }\n\n if (lang === Language.Java) {\n const cls = line.match(/(?:public|private|protected)?\\s*(?:static\\s+)?(?:abstract\\s+)?(?:final\\s+)?class\\s+(\\w+)/);\n if (cls) return { kind: 'class', name: cls[1], exported: line.includes('public') };\n const iface = line.match(/(?:public\\s+)?interface\\s+(\\w+)/);\n if (iface) return { kind: 'interface', name: iface[1], exported: line.includes('public') };\n const enumM = line.match(/(?:public\\s+)?enum\\s+(\\w+)/);\n if (enumM) return { kind: 'enum', name: enumM[1], exported: line.includes('public') };\n const method = line.match(/(?:public|private|protected)\\s+(?:static\\s+)?(?:[\\w<>\\[\\]]+)\\s+(\\w+)\\s*\\(/);\n if (method) return { kind: 'method', name: method[1], exported: line.includes('public') };\n }\n\n if (lang === Language.Go) {\n const func = line.match(/^func\\s+(\\w+)\\s*\\(/);\n if (func) return { kind: 'function', name: func[1], exported: func[1][0] === func[1][0].toUpperCase() };\n const method = line.match(/^func\\s+\\([^)]+\\)\\s+(\\w+)\\s*\\(/);\n if (method) return { kind: 'method', name: method[1], exported: method[1][0] === method[1][0].toUpperCase() };\n const structM = line.match(/^type\\s+(\\w+)\\s+struct\\b/);\n if (structM) return { kind: 'struct', name: structM[1], exported: structM[1][0] === structM[1][0].toUpperCase() };\n const ifaceM = line.match(/^type\\s+(\\w+)\\s+interface\\b/);\n if (ifaceM) return { kind: 'interface', name: ifaceM[1], exported: ifaceM[1][0] === ifaceM[1][0].toUpperCase() };\n }\n\n if (lang === Language.Rust) {\n const func = line.match(/^(?:pub\\s+)?(?:async\\s+)?fn\\s+(\\w+)/);\n if (func) return { kind: 'function', name: func[1], exported: line.startsWith('pub') };\n const structM = line.match(/^(?:pub\\s+)?struct\\s+(\\w+)/);\n if (structM) return { kind: 'struct', name: structM[1], exported: line.startsWith('pub') };\n const enumM = line.match(/^(?:pub\\s+)?enum\\s+(\\w+)/);\n if (enumM) return { kind: 'enum', name: enumM[1], exported: line.startsWith('pub') };\n const traitM = line.match(/^(?:pub\\s+)?trait\\s+(\\w+)/);\n if (traitM) return { kind: 'trait', name: traitM[1], exported: line.startsWith('pub') };\n const implM = line.match(/^impl(?:<[^>]*>)?\\s+(\\w+)/);\n if (implM) return { kind: 'class', name: implM[1], exported: false };\n }\n\n if (lang === Language.C || lang === Language.Cpp) {\n const cls = line.match(/^(?:class|struct)\\s+(\\w+)/);\n if (cls) return { kind: lang === Language.Cpp ? 'class' : 'struct', name: cls[1], exported: true };\n const nsM = line.match(/^namespace\\s+(\\w+)/);\n if (nsM) return { kind: 'namespace', name: nsM[1], exported: true };\n const func = line.match(/^(?:[\\w:*&<>\\[\\]]+\\s+)+(\\w+)\\s*\\([^;]*$/);\n if (func && !['if', 'for', 'while', 'switch', 'return'].includes(func[1])) {\n return { kind: 'function', name: func[1], exported: true };\n }\n }\n\n if (lang === Language.CSharp) {\n const cls = line.match(/(?:public|internal|private)?\\s*(?:static\\s+)?(?:abstract\\s+)?(?:partial\\s+)?class\\s+(\\w+)/);\n if (cls) return { kind: 'class', name: cls[1], exported: line.includes('public') };\n const iface = line.match(/(?:public\\s+)?interface\\s+(\\w+)/);\n if (iface) return { kind: 'interface', name: iface[1], exported: line.includes('public') };\n const structM = line.match(/(?:public\\s+)?struct\\s+(\\w+)/);\n if (structM) return { kind: 'struct', name: structM[1], exported: line.includes('public') };\n const method = line.match(/(?:public|private|protected|internal)\\s+(?:static\\s+)?(?:async\\s+)?(?:[\\w<>\\[\\]?]+)\\s+(\\w+)\\s*\\(/);\n if (method) return { kind: 'method', name: method[1], exported: line.includes('public') };\n const nsM = line.match(/namespace\\s+([\\w.]+)/);\n if (nsM) return { kind: 'namespace', name: nsM[1], exported: true };\n }\n\n if (lang === Language.PHP) {\n const cls = line.match(/(?:abstract\\s+)?class\\s+(\\w+)/);\n if (cls) return { kind: 'class', name: cls[1], exported: true };\n const func = line.match(/(?:public|private|protected|static\\s+)*function\\s+(\\w+)/);\n if (func) return { kind: 'function', name: func[1], exported: line.includes('public') || !line.includes('private') };\n const iface = line.match(/interface\\s+(\\w+)/);\n if (iface) return { kind: 'interface', name: iface[1], exported: true };\n const traitM = line.match(/trait\\s+(\\w+)/);\n if (traitM) return { kind: 'trait', name: traitM[1], exported: true };\n }\n\n if (lang === Language.Kotlin) {\n const cls = line.match(/(?:data\\s+|sealed\\s+|abstract\\s+|open\\s+)?class\\s+(\\w+)/);\n if (cls) return { kind: 'class', name: cls[1], exported: !line.includes('private') };\n const iface = line.match(/interface\\s+(\\w+)/);\n if (iface) return { kind: 'interface', name: iface[1], exported: !line.includes('private') };\n const func = line.match(/(?:suspend\\s+)?fun\\s+(\\w+)/);\n if (func) return { kind: 'function', name: func[1], exported: !line.includes('private') };\n const obj = line.match(/object\\s+(\\w+)/);\n if (obj) return { kind: 'class', name: obj[1], exported: !line.includes('private') };\n }\n\n if (lang === Language.Ruby) {\n const cls = line.match(/^class\\s+(\\w+)/);\n if (cls) return { kind: 'class', name: cls[1], exported: true };\n const modM = line.match(/^module\\s+(\\w+)/);\n if (modM) return { kind: 'module', name: modM[1], exported: true };\n const method = line.match(/^(?:def\\s+(?:self\\.)?(\\w+))/);\n if (method) return { kind: 'method', name: method[1], exported: true };\n }\n\n if (lang === Language.Swift) {\n const cls = line.match(/(?:public\\s+|open\\s+)?(?:final\\s+)?class\\s+(\\w+)/);\n if (cls) return { kind: 'class', name: cls[1], exported: !line.includes('private') };\n const structM = line.match(/(?:public\\s+)?struct\\s+(\\w+)/);\n if (structM) return { kind: 'struct', name: structM[1], exported: !line.includes('private') };\n const proto = line.match(/(?:public\\s+)?protocol\\s+(\\w+)/);\n if (proto) return { kind: 'interface', name: proto[1], exported: !line.includes('private') };\n const enumM = line.match(/(?:public\\s+)?enum\\s+(\\w+)/);\n if (enumM) return { kind: 'enum', name: enumM[1], exported: !line.includes('private') };\n const func = line.match(/(?:public\\s+|private\\s+|internal\\s+)?(?:static\\s+)?func\\s+(\\w+)/);\n if (func) return { kind: 'function', name: func[1], exported: !line.includes('private') };\n }\n\n if (lang === Language.Dart) {\n const cls = line.match(/(?:abstract\\s+)?class\\s+(\\w+)/);\n if (cls) return { kind: 'class', name: cls[1], exported: !cls[1].startsWith('_') };\n const func = line.match(/^(?:\\w+\\s+)?(\\w+)\\s*\\(/);\n if (func && !['if', 'for', 'while', 'switch', 'catch', 'return'].includes(func[1])) {\n return { kind: 'function', name: func[1], exported: !func[1].startsWith('_') };\n }\n }\n\n return null;\n}\n\nfunction estimateEndLine(lines: string[], startIdx: number, lang: Language): number | undefined {\n const MAX_SCAN = 200;\n const end = Math.min(startIdx + MAX_SCAN, lines.length);\n\n if (lang !== Language.Python && lang !== Language.Ruby) {\n let depth = 0;\n let foundOpen = false;\n for (let i = startIdx; i < end; i++) {\n for (const ch of lines[i]) {\n if (ch === '{') { depth++; foundOpen = true; }\n else if (ch === '}') {\n depth--;\n if (foundOpen && depth === 0) return i + 1;\n }\n }\n }\n return undefined;\n }\n\n const startIndent = (lines[startIdx].match(/^(\\s*)/) ?? ['', ''])[1].length;\n for (let i = startIdx + 1; i < end; i++) {\n const l = lines[i];\n if (l.trim() === '') continue;\n const indent = (l.match(/^(\\s*)/) ?? ['', ''])[1].length;\n if (indent <= startIndent && l.trim() !== '') return i;\n }\n return undefined;\n}\n\nfunction extractBlock(lines: string[], startIdx: number, maxLines: number): string {\n const end = Math.min(startIdx + maxLines, lines.length);\n return lines.slice(startIdx, end).join('\\n');\n}\n","import path from 'node:path';\nimport { detectLanguage } from '../../shared/index.js';\nimport type { Phase, PhaseResult, PipelineContext } from '../types.js';\nimport { generateNodeId, generateEdgeId } from '../../graph/id-generator.js';\n\ninterface ParsedImport {\n rawPath: string;\n localNames: string[];\n isDefault: boolean;\n line: number;\n}\n\ninterface ParsedCall {\n name: string;\n receiverText?: string;\n isNew: boolean;\n line: number;\n}\n\ninterface ParsedHeritage {\n className: string;\n extendsNames: string[];\n implementsNames: string[];\n}\n\n// ─── Keywords to skip when extracting calls ───────────────────────────────────\nconst CALL_KEYWORDS = new Set([\n 'if', 'for', 'while', 'switch', 'catch', 'return', 'throw',\n 'typeof', 'instanceof', 'delete', 'void', 'new', 'import', 'export',\n 'from', 'const', 'let', 'var', 'function', 'class', 'interface',\n 'type', 'enum', 'extends', 'implements',\n]);\n\nexport const resolvePhase: Phase = {\n name: 'resolve',\n dependencies: ['parse'],\n async execute(context: PipelineContext): Promise<PhaseResult> {\n const start = Date.now();\n const { graph, workspaceRoot, filePaths } = context;\n\n // Reuse content cache populated by parse phase — eliminates all double I/O\n const fileCache = context.fileCache ?? new Map<string, string>();\n // Fast sorted function index built by parse phase — O(log n) enclosing-function lookup\n const fileFunctionIndex = context.fileFunctionIndex ?? new Map<\n string,\n { id: string; startLine: number; endLine: number | undefined }[]\n >();\n\n let importEdges = 0;\n let callEdges = 0;\n let heritageEdges = 0;\n\n // ── Build file index for import resolution ────────────────────────────────\n const fileIndex = new Map<string, string>();\n for (const fp of filePaths) {\n const rel = path.relative(workspaceRoot, fp);\n fileIndex.set(rel, fp);\n const noExt = rel.replace(/\\.\\w+$/, '');\n if (!fileIndex.has(noExt)) fileIndex.set(noExt, fp);\n const base = path.basename(rel, path.extname(rel));\n if (!fileIndex.has(base)) fileIndex.set(base, fp);\n }\n\n // ── Build symbol index: name → nodeId ─────────────────────────────────────\n const symbolIndex = new Map<string, string>();\n const fileSymbolIndex = new Map<string, Map<string, string>>();\n for (const node of graph.allNodes()) {\n if ([\n 'function', 'class', 'interface', 'method', 'enum',\n 'type_alias', 'variable', 'constant', 'struct', 'trait',\n ].includes(node.kind)) {\n symbolIndex.set(node.name, node.id);\n let fileMap = fileSymbolIndex.get(node.filePath);\n if (!fileMap) { fileMap = new Map(); fileSymbolIndex.set(node.filePath, fileMap); }\n fileMap.set(node.name, node.id);\n }\n }\n\n // ── Process each file ─────────────────────────────────────────────────────\n let fileDone = 0;\n for (const filePath of filePaths) {\n const lang = detectLanguage(filePath);\n if (!lang) continue;\n\n const relativePath = path.relative(workspaceRoot, filePath);\n const fileNodeId = generateNodeId('file', relativePath, relativePath);\n\n // Use cached content — zero additional disk I/O\n const source = fileCache.get(filePath);\n if (!source) continue;\n\n const lines = source.split('\\n');\n const imports = extractImports(lines, lang === 'python');\n const calls = extractCalls(lines);\n const heritages = extractHeritage(lines);\n\n // ── Imports → IMPORTS edges ───────────────────────────────────────────\n for (const imp of imports) {\n const cleaned = imp.rawPath.replace(/['\"]/g, '');\n let resolvedRelPath: string | null = null;\n\n if (cleaned.startsWith('.')) {\n // Relative import — strip .js/.jsx since TS imports use .js but files are .ts\n const cleanedNoJs = cleaned.replace(/\\.(js|jsx)$/, '');\n const fromDir = path.dirname(relativePath);\n for (const ext of ['', '.ts', '.tsx', '.js', '.jsx', '.py', '.java', '.go', '/index.ts', '/index.js']) {\n const candidate = path.join(fromDir, cleanedNoJs + ext);\n const normalized = path.normalize(candidate);\n if (fileIndex.has(normalized)) {\n const absPath = fileIndex.get(normalized)!;\n resolvedRelPath = path.relative(workspaceRoot, absPath);\n break;\n }\n }\n } else {\n // Package import — try to find in file index\n for (const ext of ['', '.ts', '.js', '.py', '.java', '.go']) {\n if (fileIndex.has(cleaned + ext)) { resolvedRelPath = cleaned + ext; break; }\n }\n if (!resolvedRelPath) {\n const asPath = cleaned.replace(/\\./g, '/');\n for (const ext of ['', '.ts', '.js', '.py', '.java', '.go', '/index.ts', '/__init__.py']) {\n if (fileIndex.has(asPath + ext)) { resolvedRelPath = asPath + ext; break; }\n }\n }\n }\n\n if (resolvedRelPath) {\n const targetFileId = generateNodeId('file', resolvedRelPath, resolvedRelPath);\n if (graph.getNode(targetFileId)) {\n const edgeId = generateEdgeId(fileNodeId, targetFileId, 'imports');\n if (!graph.getEdge(edgeId)) {\n graph.addEdge({\n id: edgeId,\n source: fileNodeId,\n target: targetFileId,\n kind: 'imports',\n weight: 0.95,\n label: cleaned,\n });\n importEdges++;\n }\n }\n }\n }\n\n // ── Calls → CALLS edges ───────────────────────────────────────────────\n const localSymbols = fileSymbolIndex.get(relativePath);\n const funcList = fileFunctionIndex.get(relativePath); // sorted by startLine\n\n for (const call of calls) {\n // Tier 1: same-file symbol (high confidence)\n let targetId = localSymbols?.get(call.name);\n let confidence = 0.95;\n\n if (!targetId) {\n // Tier 2: global symbol (lower confidence)\n targetId = symbolIndex.get(call.name);\n confidence = 0.5;\n }\n\n if (targetId) {\n // Use fast sorted-list lookup instead of iterating all graph nodes\n const callerNodeId = funcList\n ? findEnclosingFunctionFast(funcList, call.line)\n : null;\n const sourceId = callerNodeId ?? fileNodeId;\n\n if (sourceId !== targetId) {\n const edgeId = generateEdgeId(sourceId, targetId, 'calls');\n if (!graph.getEdge(edgeId)) {\n graph.addEdge({\n id: edgeId,\n source: sourceId,\n target: targetId,\n kind: 'calls',\n weight: confidence,\n label: call.name,\n });\n callEdges++;\n }\n }\n }\n }\n\n // ── Heritage → EXTENDS/IMPLEMENTS edges ──────────────────────────────\n for (const h of heritages) {\n const classNodeId = localSymbols?.get(h.className) ?? symbolIndex.get(h.className);\n if (!classNodeId) continue;\n\n for (const ext of h.extendsNames) {\n const targetId = symbolIndex.get(ext);\n if (targetId) {\n const edgeId = generateEdgeId(classNodeId, targetId, 'extends');\n if (!graph.getEdge(edgeId)) {\n graph.addEdge({\n id: edgeId, source: classNodeId, target: targetId,\n kind: 'extends', weight: 1.0, label: `extends ${ext}`,\n });\n heritageEdges++;\n }\n }\n }\n\n for (const impl of h.implementsNames) {\n const targetId = symbolIndex.get(impl);\n if (targetId) {\n const edgeId = generateEdgeId(classNodeId, targetId, 'implements');\n if (!graph.getEdge(edgeId)) {\n graph.addEdge({\n id: edgeId, source: classNodeId, target: targetId,\n kind: 'implements', weight: 1.0, label: `implements ${impl}`,\n });\n heritageEdges++;\n }\n }\n }\n }\n fileDone++;\n context.onPhaseProgress?.('resolve', fileDone, filePaths.length);\n }\n\n return {\n status: 'completed',\n duration: Date.now() - start,\n message: `Resolved ${importEdges} imports, ${callEdges} calls, ${heritageEdges} heritage edges. Graph: ${graph.size.nodes} nodes, ${graph.size.edges} edges`,\n };\n },\n};\n\n// ─── Import extraction ────────────────────────────────────────────────────────\n\nfunction extractImports(lines: string[], isPython: boolean): ParsedImport[] {\n const imports: ParsedImport[] = [];\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i].trim();\n\n // TypeScript/JavaScript: import ... from '...'\n const tsImport = line.match(/import\\s+.*?from\\s+['\"]([^'\"]+)['\"]/);\n if (tsImport) {\n const names: string[] = [];\n const namedMatch = line.match(/\\{([^}]+)\\}/);\n if (namedMatch) {\n names.push(\n ...namedMatch[1]\n .split(',')\n .map((n) => n.trim().split(/\\s+as\\s+/).pop()!.trim())\n .filter(Boolean),\n );\n }\n const defaultMatch = line.match(/import\\s+(\\w+)/);\n if (defaultMatch && defaultMatch[1] !== 'type') names.push(defaultMatch[1]);\n imports.push({ rawPath: tsImport[1], localNames: names, isDefault: !namedMatch, line: i + 1 });\n continue;\n }\n\n // Python: from X import Y / import X\n if (isPython) {\n const fromImport = line.match(/from\\s+([\\w.]+)\\s+import\\s+(.+)/);\n if (fromImport) {\n const names = fromImport[2].split(',').map((n) => n.trim().split(/\\s+as\\s+/).pop()!.trim()).filter(Boolean);\n imports.push({ rawPath: fromImport[1], localNames: names, isDefault: false, line: i + 1 });\n continue;\n }\n const directImport = line.match(/^import\\s+([\\w.]+)(?:\\s+as\\s+(\\w+))?/);\n if (directImport) {\n imports.push({\n rawPath: directImport[1],\n localNames: [directImport[2] ?? directImport[1].split('.').pop()!],\n isDefault: false,\n line: i + 1,\n });\n continue;\n }\n }\n\n // Java/Kotlin: import com.example.Foo\n const javaImport = line.match(/^import\\s+(?:static\\s+)?([\\w.]+)/);\n if (javaImport && !line.includes('from')) {\n const parts = javaImport[1].split('.');\n imports.push({ rawPath: javaImport[1], localNames: [parts[parts.length - 1]], isDefault: false, line: i + 1 });\n continue;\n }\n\n // Go: import \"path\"\n const goImport = line.match(/^\\s*\"([^\"]+)\"/);\n if (goImport && (i > 0 && lines[i - 1]?.includes('import') || line.match(/^import\\s+\"/))) {\n const parts = goImport[1].split('/');\n imports.push({ rawPath: goImport[1], localNames: [parts[parts.length - 1]], isDefault: false, line: i + 1 });\n continue;\n }\n\n // C/C++: #include\n const includeMatch = line.match(/#include\\s+[<\"]([^>\"]+)[>\"]/);\n if (includeMatch) {\n imports.push({ rawPath: includeMatch[1], localNames: [], isDefault: false, line: i + 1 });\n continue;\n }\n\n // Rust: use crate::... / use super::...\n const rustUse = line.match(/^use\\s+([\\w:]+)/);\n if (rustUse) {\n const parts = rustUse[1].split('::');\n imports.push({ rawPath: rustUse[1], localNames: [parts[parts.length - 1]], isDefault: false, line: i + 1 });\n continue;\n }\n\n // C#: using\n const usingMatch = line.match(/^using\\s+([\\w.]+)/);\n if (usingMatch) {\n const parts = usingMatch[1].split('.');\n imports.push({ rawPath: usingMatch[1], localNames: [parts[parts.length - 1]], isDefault: false, line: i + 1 });\n }\n\n // Ruby: require\n const requireMatch = line.match(/require\\s+['\"]([^'\"]+)['\"]/);\n if (requireMatch) {\n imports.push({ rawPath: requireMatch[1], localNames: [], isDefault: false, line: i + 1 });\n }\n }\n\n return imports;\n}\n\n// ─── Call extraction ──────────────────────────────────────────────────────────\n\nfunction extractCalls(lines: string[]): ParsedCall[] {\n const calls: ParsedCall[] = [];\n const callRegex = /(?:new\\s+)?(\\w+)\\s*\\(/g;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n // Skip declaration lines\n if (/^\\s*(export\\s+)?(async\\s+)?function\\s/.test(line)) continue;\n if (/^\\s*(export\\s+)?(abstract\\s+)?class\\s/.test(line)) continue;\n if (/^\\s*(export\\s+)?interface\\s/.test(line)) continue;\n if (/^\\s*(export\\s+)?enum\\s/.test(line)) continue;\n if (/^\\s*(export\\s+)?type\\s+\\w+\\s*=/.test(line)) continue;\n if (/^\\s*import\\s/.test(line)) continue;\n if (/^\\s*\\/\\//.test(line)) continue;\n\n let match;\n callRegex.lastIndex = 0;\n while ((match = callRegex.exec(line)) !== null) {\n const name = match[1];\n if (CALL_KEYWORDS.has(name)) continue;\n const isNew = line.substring(Math.max(0, match.index - 4), match.index).includes('new');\n calls.push({ name, isNew, line: i + 1 });\n }\n\n // Member calls: receiver.method(\n const memberCallRegex = /(\\w+)\\.(\\w+)\\s*\\(/g;\n memberCallRegex.lastIndex = 0;\n while ((match = memberCallRegex.exec(line)) !== null) {\n calls.push({ name: match[2], receiverText: match[1], isNew: false, line: i + 1 });\n }\n }\n\n return calls;\n}\n\n// ─── Heritage extraction ──────────────────────────────────────────────────────\n\nfunction extractHeritage(lines: string[]): ParsedHeritage[] {\n const heritages: ParsedHeritage[] = [];\n\n for (const line of lines) {\n const classMatch = line.match(/class\\s+(\\w+)(?:\\s+extends\\s+(\\w+))?(?:\\s+implements\\s+([\\w,\\s]+))?/);\n if (classMatch) {\n const extendsNames = classMatch[2] ? [classMatch[2]] : [];\n const implementsNames = classMatch[3] ? classMatch[3].split(',').map((n) => n.trim()).filter(Boolean) : [];\n heritages.push({ className: classMatch[1], extendsNames, implementsNames });\n continue;\n }\n // Python: class Foo(Bar, Baz):\n const pyClassMatch = line.match(/class\\s+(\\w+)\\(([^)]+)\\)/);\n if (pyClassMatch) {\n const bases = pyClassMatch[2].split(',').map((n) => n.trim()).filter(Boolean);\n heritages.push({ className: pyClassMatch[1], extendsNames: bases, implementsNames: [] });\n }\n }\n\n return heritages;\n}\n\n// ─── Enclosing function lookup (O(log n) binary search on sorted list) ────────\n\nfunction findEnclosingFunctionFast(\n funcs: { id: string; startLine: number; endLine: number | undefined }[],\n line: number,\n): string | null {\n // Binary search for the last function whose startLine <= line\n let lo = 0;\n let hi = funcs.length - 1;\n let best: string | null = null;\n\n while (lo <= hi) {\n const mid = (lo + hi) >> 1;\n const fn = funcs[mid];\n if (fn.startLine <= line) {\n // Candidate — check endLine if available\n if (fn.endLine === undefined || line <= fn.endLine) {\n best = fn.id;\n }\n lo = mid + 1;\n } else {\n hi = mid - 1;\n }\n }\n\n return best;\n}\n","import type { KnowledgeGraph } from '../graph/knowledge-graph.js';\n\nexport interface EmbeddedNode {\n id: string;\n name: string;\n kind: string;\n filePath: string;\n text: string;\n embedding: number[];\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet pipelineInstance: ((text: string, opts: Record<string, unknown>) => Promise<{ data: Float32Array }>) | null = null;\n\nasync function getEmbedder() {\n if (!pipelineInstance) {\n const { pipeline } = await import('@huggingface/transformers');\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n pipelineInstance = (await pipeline('feature-extraction', 'Xenova/all-MiniLM-L6-v2')) as unknown as typeof pipelineInstance;\n }\n return pipelineInstance!;\n}\n\nexport async function embedNodes(\n graph: KnowledgeGraph,\n opts: { batchSize?: number; onProgress?: (done: number, total: number) => void } = {},\n): Promise<EmbeddedNode[]> {\n const { batchSize = 32, onProgress } = opts;\n\n // Collect candidates — skip cluster/directory/flow to save time\n const candidates: { id: string; name: string; kind: string; filePath: string; text: string }[] = [];\n for (const node of graph.allNodes()) {\n if (['cluster', 'directory', 'flow'].includes(node.kind)) continue;\n const text = buildText(node);\n candidates.push({ id: node.id, name: node.name, kind: node.kind, filePath: node.filePath, text });\n }\n\n const embedder = await getEmbedder();\n const results: EmbeddedNode[] = [];\n\n for (let i = 0; i < candidates.length; i += batchSize) {\n const batch = candidates.slice(i, i + batchSize);\n const texts = batch.map((c) => c.text);\n\n for (let j = 0; j < texts.length; j++) {\n const out = await embedder(texts[j], { pooling: 'mean', normalize: true });\n results.push({ ...batch[j], embedding: Array.from(out.data) });\n }\n\n onProgress?.(Math.min(i + batchSize, candidates.length), candidates.length);\n }\n\n return results;\n}\n\nfunction buildText(node: { name: string; kind: string; filePath: string; content?: string | null; metadata?: Record<string, unknown> | null }): string {\n const parts: string[] = [`${node.kind} ${node.name}`];\n const sig = node.metadata?.signature as string | undefined;\n if (sig) parts.push(sig);\n if (node.content) parts.push(node.content.slice(0, 256));\n parts.push(node.filePath);\n return parts.join(' ').slice(0, 512);\n}\n","/**\n * Persistent store for repo groups.\n * Each group is saved as ~/.code-intel/groups/<name>.json\n */\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\nimport type { RepoGroup, GroupMember } from './types.js';\n\nconst GROUPS_DIR = path.join(os.homedir(), '.code-intel', 'groups');\n\nfunction groupFile(name: string): string {\n return path.join(GROUPS_DIR, `${name}.json`);\n}\n\nexport function loadGroup(name: string): RepoGroup | null {\n try {\n return JSON.parse(fs.readFileSync(groupFile(name), 'utf-8')) as RepoGroup;\n } catch {\n return null;\n }\n}\n\nexport function saveGroup(group: RepoGroup): void {\n fs.mkdirSync(GROUPS_DIR, { recursive: true });\n fs.writeFileSync(groupFile(group.name), JSON.stringify(group, null, 2) + '\\n');\n}\n\nexport function listGroups(): RepoGroup[] {\n const groups: RepoGroup[] = [];\n try {\n for (const file of fs.readdirSync(GROUPS_DIR)) {\n if (!file.endsWith('.json') || file.endsWith('.sync.json')) continue;\n try {\n const g = JSON.parse(\n fs.readFileSync(path.join(GROUPS_DIR, file), 'utf-8'),\n ) as RepoGroup;\n groups.push(g);\n } catch { /* skip malformed */ }\n }\n } catch { /* dir doesn't exist yet */ }\n return groups;\n}\n\nexport function deleteGroup(name: string): void {\n try { fs.unlinkSync(groupFile(name)); } catch { /* ignore */ }\n // also remove sync artifact\n try { fs.unlinkSync(path.join(GROUPS_DIR, `${name}.sync.json`)); } catch { /* ignore */ }\n}\n\nexport function groupExists(name: string): boolean {\n return fs.existsSync(groupFile(name));\n}\n\n/** Add or update a member (by groupPath). Returns the updated group. */\nexport function addMember(groupName: string, member: GroupMember): RepoGroup {\n const group = loadGroup(groupName);\n if (!group) throw new Error(`Group \"${groupName}\" not found.`);\n // replace if same groupPath already exists\n const idx = group.members.findIndex((m) => m.groupPath === member.groupPath);\n if (idx >= 0) {\n group.members[idx] = member;\n } else {\n group.members.push(member);\n }\n saveGroup(group);\n return group;\n}\n\n/** Remove a member by groupPath. Returns the updated group. */\nexport function removeMember(groupName: string, groupPath: string): RepoGroup {\n const group = loadGroup(groupName);\n if (!group) throw new Error(`Group \"${groupName}\" not found.`);\n const before = group.members.length;\n group.members = group.members.filter((m) => m.groupPath !== groupPath);\n if (group.members.length === before) {\n throw new Error(`No member at path \"${groupPath}\" in group \"${groupName}\".`);\n }\n saveGroup(group);\n return group;\n}\n\n// ─── Sync result persistence ──────────────────────────────────────────────────\n\nimport type { GroupSyncResult } from './types.js';\n\nexport function saveSyncResult(result: GroupSyncResult): void {\n fs.mkdirSync(GROUPS_DIR, { recursive: true });\n fs.writeFileSync(\n path.join(GROUPS_DIR, `${result.groupName}.sync.json`),\n JSON.stringify(result, null, 2) + '\\n',\n );\n}\n\nexport function loadSyncResult(groupName: string): GroupSyncResult | null {\n try {\n return JSON.parse(\n fs.readFileSync(path.join(GROUPS_DIR, `${groupName}.sync.json`), 'utf-8'),\n ) as GroupSyncResult;\n } catch {\n return null;\n }\n}\n","import type { CodeNode, CodeEdge, EdgeKind } from '../shared/index.js';\n\nexport interface KnowledgeGraph {\n addNode(node: CodeNode): void;\n addEdge(edge: CodeEdge): void;\n getNode(id: string): CodeNode | undefined;\n getEdge(id: string): CodeEdge | undefined;\n findEdgesByKind(kind: EdgeKind): Iterable<CodeEdge>;\n findEdgesFrom(sourceId: string): Iterable<CodeEdge>;\n findEdgesTo(targetId: string): Iterable<CodeEdge>;\n removeNodeCascade(id: string): void;\n removeEdge(id: string): void;\n allNodes(): Iterable<CodeNode>;\n allEdges(): Iterable<CodeEdge>;\n readonly size: { nodes: number; edges: number };\n clear(): void;\n}\n\nexport function createKnowledgeGraph(): KnowledgeGraph {\n const nodes = new Map<string, CodeNode>();\n const edges = new Map<string, CodeEdge>();\n const edgesByKind = new Map<EdgeKind, Set<string>>();\n const edgesFromNode = new Map<string, Set<string>>();\n const edgesToNode = new Map<string, Set<string>>();\n\n function indexEdge(edge: CodeEdge): void {\n let kindSet = edgesByKind.get(edge.kind);\n if (!kindSet) {\n kindSet = new Set();\n edgesByKind.set(edge.kind, kindSet);\n }\n kindSet.add(edge.id);\n\n let fromSet = edgesFromNode.get(edge.source);\n if (!fromSet) {\n fromSet = new Set();\n edgesFromNode.set(edge.source, fromSet);\n }\n fromSet.add(edge.id);\n\n let toSet = edgesToNode.get(edge.target);\n if (!toSet) {\n toSet = new Set();\n edgesToNode.set(edge.target, toSet);\n }\n toSet.add(edge.id);\n }\n\n function unindexEdge(edge: CodeEdge): void {\n edgesByKind.get(edge.kind)?.delete(edge.id);\n edgesFromNode.get(edge.source)?.delete(edge.id);\n edgesToNode.get(edge.target)?.delete(edge.id);\n }\n\n return {\n addNode(node: CodeNode): void {\n nodes.set(node.id, node);\n },\n\n addEdge(edge: CodeEdge): void {\n edges.set(edge.id, edge);\n indexEdge(edge);\n },\n\n getNode(id: string): CodeNode | undefined {\n return nodes.get(id);\n },\n\n getEdge(id: string): CodeEdge | undefined {\n return edges.get(id);\n },\n\n *findEdgesByKind(kind: EdgeKind): Iterable<CodeEdge> {\n const ids = edgesByKind.get(kind);\n if (!ids) return;\n for (const id of ids) {\n const edge = edges.get(id);\n if (edge) yield edge;\n }\n },\n\n *findEdgesFrom(sourceId: string): Iterable<CodeEdge> {\n const ids = edgesFromNode.get(sourceId);\n if (!ids) return;\n for (const id of ids) {\n const edge = edges.get(id);\n if (edge) yield edge;\n }\n },\n\n *findEdgesTo(targetId: string): Iterable<CodeEdge> {\n const ids = edgesToNode.get(targetId);\n if (!ids) return;\n for (const id of ids) {\n const edge = edges.get(id);\n if (edge) yield edge;\n }\n },\n\n removeNodeCascade(id: string): void {\n const fromEdges = edgesFromNode.get(id);\n if (fromEdges) {\n for (const edgeId of [...fromEdges]) {\n const edge = edges.get(edgeId);\n if (edge) {\n unindexEdge(edge);\n edges.delete(edgeId);\n }\n }\n }\n const toEdges = edgesToNode.get(id);\n if (toEdges) {\n for (const edgeId of [...toEdges]) {\n const edge = edges.get(edgeId);\n if (edge) {\n unindexEdge(edge);\n edges.delete(edgeId);\n }\n }\n }\n edgesFromNode.delete(id);\n edgesToNode.delete(id);\n nodes.delete(id);\n },\n\n removeEdge(id: string): void {\n const edge = edges.get(id);\n if (edge) {\n unindexEdge(edge);\n edges.delete(id);\n }\n },\n\n *allNodes(): Iterable<CodeNode> {\n yield* nodes.values();\n },\n\n *allEdges(): Iterable<CodeEdge> {\n yield* edges.values();\n },\n\n get size() {\n return { nodes: nodes.size, edges: edges.size };\n },\n\n clear(): void {\n nodes.clear();\n edges.clear();\n edgesByKind.clear();\n edgesFromNode.clear();\n edgesToNode.clear();\n },\n };\n}\n","export { createKnowledgeGraph } from './knowledge-graph.js';\nexport type { KnowledgeGraph } from './knowledge-graph.js';\nexport { generateNodeId, generateEdgeId } from './id-generator.js';\n","export { initParser, getParser, getLanguage, parseSource, isTreeSitterAvailable } from './parser-manager.js';\nexport { runQuery, runQueryMatches } from './query-runner.js';\nexport type { QueryCapture, QueryMatch } from './query-runner.js';\nexport { AstCache } from './ast-cache.js';\n","import { Tree } from 'web-tree-sitter';\n\nconst DEFAULT_MAX = 500;\n\nexport class AstCache {\n private cache = new Map<string, { tree: Tree; accessedAt: number }>();\n private maxEntries: number;\n\n constructor(maxEntries = DEFAULT_MAX) {\n this.maxEntries = maxEntries;\n }\n\n get(filePath: string): Tree | undefined {\n const entry = this.cache.get(filePath);\n if (entry) {\n entry.accessedAt = Date.now();\n return entry.tree;\n }\n return undefined;\n }\n\n set(filePath: string, tree: Tree): void {\n if (this.cache.size >= this.maxEntries) {\n this.evictLRU();\n }\n this.cache.set(filePath, { tree, accessedAt: Date.now() });\n }\n\n has(filePath: string): boolean {\n return this.cache.has(filePath);\n }\n\n clear(): void {\n this.cache.clear();\n }\n\n get size(): number {\n return this.cache.size;\n }\n\n private evictLRU(): void {\n let oldest: string | null = null;\n let oldestTime = Infinity;\n for (const [key, entry] of this.cache) {\n if (entry.accessedAt < oldestTime) {\n oldest = key;\n oldestTime = entry.accessedAt;\n }\n }\n if (oldest) {\n this.cache.delete(oldest);\n }\n }\n}\n","import { Language } from '../shared/index.js';\nimport type { LanguageModule } from './types.js';\nimport { typescriptModule, javascriptModule } from './modules/typescript.js';\nimport { pythonModule } from './modules/python.js';\nimport { javaModule } from './modules/java.js';\nimport { goModule } from './modules/go.js';\nimport { cModule } from './modules/c.js';\nimport { cppModule } from './modules/cpp.js';\nimport { csharpModule } from './modules/csharp.js';\nimport { rustModule } from './modules/rust.js';\nimport { phpModule } from './modules/php.js';\nimport { kotlinModule } from './modules/kotlin.js';\nimport { rubyModule } from './modules/ruby.js';\nimport { swiftModule } from './modules/swift.js';\nimport { dartModule } from './modules/dart.js';\n\nconst MODULES: Record<Language, LanguageModule> = {\n [Language.TypeScript]: typescriptModule,\n [Language.JavaScript]: javascriptModule,\n [Language.Python]: pythonModule,\n [Language.Java]: javaModule,\n [Language.Go]: goModule,\n [Language.C]: cModule,\n [Language.Cpp]: cppModule,\n [Language.CSharp]: csharpModule,\n [Language.Rust]: rustModule,\n [Language.PHP]: phpModule,\n [Language.Kotlin]: kotlinModule,\n [Language.Ruby]: rubyModule,\n [Language.Swift]: swiftModule,\n [Language.Dart]: dartModule,\n};\n\nexport function getLanguageModule(lang: Language): LanguageModule {\n return MODULES[lang];\n}\n\nexport function getAllLanguageModules(): LanguageModule[] {\n return Object.values(MODULES);\n}\n","import { Language } from '../../shared/index.js';\nimport type { Node } from 'web-tree-sitter';\nimport type { LanguageModule, FileSet } from '../types.js';\nimport { typescriptQueries } from '../../parsing/queries/typescript.js';\nimport path from 'node:path';\n\nfunction resolveRelative(rawPath: string, fromFile: string, workspace: FileSet): string | null {\n const fromDir = path.dirname(fromFile);\n const cleaned = rawPath.replace(/['\"]/g, '');\n const extensions = ['.ts', '.tsx', '.js', '.jsx', '/index.ts', '/index.js'];\n const resolved = workspace.resolve(fromDir, cleaned);\n if (resolved) return resolved;\n for (const ext of extensions) {\n const r = workspace.resolve(fromDir, cleaned + ext);\n if (r) return r;\n }\n return null;\n}\n\nexport const typescriptModule: LanguageModule = {\n lang: Language.TypeScript,\n fileExtensions: ['.ts', '.tsx', '.mts', '.cts'],\n queries: typescriptQueries,\n importStyle: 'explicit',\n inheritanceStrategy: 'depth-first',\n\n resolveImport(rawPath: string, fromFile: string, workspace: FileSet): string | null {\n const cleaned = rawPath.replace(/['\"]/g, '');\n if (cleaned.startsWith('.')) {\n return resolveRelative(rawPath, fromFile, workspace);\n }\n return workspace.findByPackage(cleaned);\n },\n\n isExported(node: Node): boolean {\n const parent = node.parent;\n if (!parent) return false;\n return parent.type === 'export_statement' || node.type === 'export_statement';\n },\n\n extractType(node: Node): string | null {\n const typeAnnotation = node.childForFieldName('type');\n return typeAnnotation?.text ?? null;\n },\n};\n\nexport const javascriptModule: LanguageModule = {\n ...typescriptModule,\n lang: Language.JavaScript,\n fileExtensions: ['.js', '.jsx', '.mjs', '.cjs'],\n};\n","import { Language } from '../../shared/index.js';\nimport type { Node } from 'web-tree-sitter';\nimport type { LanguageModule, FileSet } from '../types.js';\nimport { pythonQueries } from '../../parsing/queries/python.js';\nimport path from 'node:path';\n\nexport const pythonModule: LanguageModule = {\n lang: Language.Python,\n fileExtensions: ['.py', '.pyi'],\n queries: pythonQueries,\n importStyle: 'namespace',\n inheritanceStrategy: 'c3',\n\n resolveImport(rawPath: string, fromFile: string, workspace: FileSet): string | null {\n const cleaned = rawPath.replace(/['\"]/g, '');\n const parts = cleaned.split('.');\n const fromDir = path.dirname(fromFile);\n\n // Try as relative path\n const relPath = parts.join('/');\n for (const suffix of ['/__init__.py', '.py']) {\n const r = workspace.resolve(fromDir, relPath + suffix);\n if (r) return r;\n }\n\n // Try as package from root\n return workspace.findByPackage(cleaned);\n },\n\n isExported(node: Node): boolean {\n // Python: names starting with _ are private by convention\n const name = node.childForFieldName('name');\n if (!name) return true;\n return !name.text.startsWith('_');\n },\n\n extractType(node: Node): string | null {\n const returnType = node.childForFieldName('return_type');\n return returnType?.text ?? null;\n },\n};\n","import { Language } from '../../shared/index.js';\nimport type { Node } from 'web-tree-sitter';\nimport type { LanguageModule, FileSet } from '../types.js';\nimport { javaQueries } from '../../parsing/queries/java.js';\n\nexport const javaModule: LanguageModule = {\n lang: Language.Java,\n fileExtensions: ['.java'],\n queries: javaQueries,\n importStyle: 'explicit',\n inheritanceStrategy: 'depth-first',\n\n resolveImport(rawPath: string, _fromFile: string, workspace: FileSet): string | null {\n const cleaned = rawPath.replace(/['\"]/g, '');\n const filePath = cleaned.replace(/\\./g, '/') + '.java';\n return workspace.findByPackage(filePath);\n },\n\n isExported(node: Node): boolean {\n const text = node.text;\n return text.includes('public');\n },\n\n extractType(node: Node): string | null {\n const typeNode = node.childForFieldName('type');\n return typeNode?.text ?? null;\n },\n};\n","import { Language } from '../../shared/index.js';\nimport type { Node } from 'web-tree-sitter';\nimport type { LanguageModule, FileSet } from '../types.js';\nimport { goQueries } from '../../parsing/queries/go.js';\n\nexport const goModule: LanguageModule = {\n lang: Language.Go,\n fileExtensions: ['.go'],\n queries: goQueries,\n importStyle: 'wildcard',\n inheritanceStrategy: 'depth-first',\n\n resolveImport(rawPath: string, _fromFile: string, workspace: FileSet): string | null {\n const cleaned = rawPath.replace(/['\"]/g, '');\n return workspace.findByPackage(cleaned);\n },\n\n isExported(node: Node): boolean {\n const name = node.childForFieldName('name');\n if (!name) return false;\n const first = name.text[0];\n return first === first.toUpperCase() && first !== first.toLowerCase();\n },\n\n extractType(node: Node): string | null {\n const typeNode = node.childForFieldName('type');\n return typeNode?.text ?? null;\n },\n};\n","import { Language } from '../../shared/index.js';\nimport type { Node } from 'web-tree-sitter';\nimport type { LanguageModule, FileSet } from '../types.js';\nimport { cQueries } from '../../parsing/queries/c.js';\nimport path from 'node:path';\n\nexport const cModule: LanguageModule = {\n lang: Language.C,\n fileExtensions: ['.c', '.h'],\n queries: cQueries,\n importStyle: 'include',\n inheritanceStrategy: 'none',\n\n resolveImport(rawPath: string, fromFile: string, workspace: FileSet): string | null {\n const cleaned = rawPath.replace(/[<>\"']/g, '');\n const fromDir = path.dirname(fromFile);\n return workspace.resolve(fromDir, cleaned);\n },\n\n isExported(_node: Node): boolean {\n return true; // C: all non-static symbols are visible\n },\n\n extractType(node: Node): string | null {\n const typeNode = node.childForFieldName('type');\n return typeNode?.text ?? null;\n },\n};\n","import { Language } from '../../shared/index.js';\nimport type { Node } from 'web-tree-sitter';\nimport type { LanguageModule, FileSet } from '../types.js';\nimport { cppQueries } from '../../parsing/queries/cpp.js';\nimport path from 'node:path';\n\nexport const cppModule: LanguageModule = {\n lang: Language.Cpp,\n fileExtensions: ['.cpp', '.cxx', '.cc', '.hpp', '.hxx'],\n queries: cppQueries,\n importStyle: 'include',\n inheritanceStrategy: 'depth-first',\n\n resolveImport(rawPath: string, fromFile: string, workspace: FileSet): string | null {\n const cleaned = rawPath.replace(/[<>\"']/g, '');\n const fromDir = path.dirname(fromFile);\n return workspace.resolve(fromDir, cleaned);\n },\n\n isExported(_node: Node): boolean {\n return true;\n },\n\n extractType(node: Node): string | null {\n const typeNode = node.childForFieldName('type');\n return typeNode?.text ?? null;\n },\n};\n","import { Language } from '../../shared/index.js';\nimport type { Node } from 'web-tree-sitter';\nimport type { LanguageModule, FileSet } from '../types.js';\nimport { csharpQueries } from '../../parsing/queries/csharp.js';\n\nexport const csharpModule: LanguageModule = {\n lang: Language.CSharp,\n fileExtensions: ['.cs'],\n queries: csharpQueries,\n importStyle: 'explicit',\n inheritanceStrategy: 'depth-first',\n\n resolveImport(rawPath: string, _fromFile: string, workspace: FileSet): string | null {\n const cleaned = rawPath.replace(/['\"]/g, '');\n return workspace.findByPackage(cleaned);\n },\n\n isExported(node: Node): boolean {\n return node.text.includes('public') || node.text.includes('internal');\n },\n\n extractType(node: Node): string | null {\n const typeNode = node.childForFieldName('type');\n return typeNode?.text ?? null;\n },\n};\n","import { Language } from '../../shared/index.js';\nimport type { Node } from 'web-tree-sitter';\nimport type { LanguageModule, FileSet } from '../types.js';\nimport { rustQueries } from '../../parsing/queries/rust.js';\n\nexport const rustModule: LanguageModule = {\n lang: Language.Rust,\n fileExtensions: ['.rs'],\n queries: rustQueries,\n importStyle: 'explicit',\n inheritanceStrategy: 'none',\n\n resolveImport(rawPath: string, _fromFile: string, workspace: FileSet): string | null {\n const cleaned = rawPath.replace(/['\"]/g, '');\n const parts = cleaned.split('::');\n const filePath = parts.join('/') + '.rs';\n return workspace.findByPackage(filePath);\n },\n\n isExported(node: Node): boolean {\n return node.text.startsWith('pub ') || node.text.startsWith('pub(');\n },\n\n extractType(node: Node): string | null {\n const returnType = node.childForFieldName('return_type');\n return returnType?.text ?? null;\n },\n};\n","import { Language } from '../../shared/index.js';\nimport type { Node } from 'web-tree-sitter';\nimport type { LanguageModule, FileSet } from '../types.js';\nimport { phpQueries } from '../../parsing/queries/php.js';\n\nexport const phpModule: LanguageModule = {\n lang: Language.PHP,\n fileExtensions: ['.php'],\n queries: phpQueries,\n importStyle: 'explicit',\n inheritanceStrategy: 'depth-first',\n\n resolveImport(rawPath: string, _fromFile: string, workspace: FileSet): string | null {\n const cleaned = rawPath.replace(/['\"\\\\]/g, '/').replace(/^\\//, '');\n return workspace.findByPackage(cleaned + '.php');\n },\n\n isExported(node: Node): boolean {\n return node.text.includes('public') || !node.text.includes('private');\n },\n\n extractType(node: Node): string | null {\n const typeNode = node.childForFieldName('type');\n return typeNode?.text ?? null;\n },\n};\n","import { Language } from '../../shared/index.js';\nimport type { Node } from 'web-tree-sitter';\nimport type { LanguageModule, FileSet } from '../types.js';\nimport { kotlinQueries } from '../../parsing/queries/kotlin.js';\n\nexport const kotlinModule: LanguageModule = {\n lang: Language.Kotlin,\n fileExtensions: ['.kt', '.kts'],\n queries: kotlinQueries,\n importStyle: 'explicit',\n inheritanceStrategy: 'depth-first',\n\n resolveImport(rawPath: string, _fromFile: string, workspace: FileSet): string | null {\n const cleaned = rawPath.replace(/['\"]/g, '');\n const filePath = cleaned.replace(/\\./g, '/') + '.kt';\n return workspace.findByPackage(filePath);\n },\n\n isExported(node: Node): boolean {\n return !node.text.includes('private') && !node.text.includes('internal');\n },\n\n extractType(node: Node): string | null {\n const typeNode = node.childForFieldName('type');\n return typeNode?.text ?? null;\n },\n};\n","import { Language } from '../../shared/index.js';\nimport type { Node } from 'web-tree-sitter';\nimport type { LanguageModule, FileSet } from '../types.js';\nimport { rubyQueries } from '../../parsing/queries/ruby.js';\n\nexport const rubyModule: LanguageModule = {\n lang: Language.Ruby,\n fileExtensions: ['.rb'],\n queries: rubyQueries,\n importStyle: 'wildcard',\n inheritanceStrategy: 'mixin-aware',\n\n resolveImport(rawPath: string, _fromFile: string, workspace: FileSet): string | null {\n const cleaned = rawPath.replace(/['\"]/g, '');\n return workspace.findByPackage(cleaned + '.rb') ?? workspace.findByPackage(cleaned);\n },\n\n isExported(_node: Node): boolean {\n return true; // Ruby: methods are public by default\n },\n\n extractType(_node: Node): string | null {\n return null; // Ruby: dynamic typing\n },\n};\n","import { Language } from '../../shared/index.js';\nimport type { Node } from 'web-tree-sitter';\nimport type { LanguageModule, FileSet } from '../types.js';\nimport { swiftQueries } from '../../parsing/queries/swift.js';\n\nexport const swiftModule: LanguageModule = {\n lang: Language.Swift,\n fileExtensions: ['.swift'],\n queries: swiftQueries,\n importStyle: 'wildcard',\n inheritanceStrategy: 'depth-first',\n\n resolveImport(rawPath: string, _fromFile: string, workspace: FileSet): string | null {\n const cleaned = rawPath.replace(/['\"]/g, '');\n return workspace.findByPackage(cleaned);\n },\n\n isExported(node: Node): boolean {\n return !node.text.includes('private') && !node.text.includes('fileprivate');\n },\n\n extractType(node: Node): string | null {\n const typeAnnotation = node.childForFieldName('type');\n return typeAnnotation?.text ?? null;\n },\n};\n","import { Language } from '../../shared/index.js';\nimport type { Node } from 'web-tree-sitter';\nimport type { LanguageModule, FileSet } from '../types.js';\nimport { typescriptQueries } from '../../parsing/queries/typescript.js';\nimport path from 'node:path';\n\nexport const dartModule: LanguageModule = {\n lang: Language.Dart,\n fileExtensions: ['.dart'],\n queries: typescriptQueries, // Dart grammar fallback\n importStyle: 'wildcard',\n inheritanceStrategy: 'depth-first',\n\n resolveImport(rawPath: string, fromFile: string, workspace: FileSet): string | null {\n const cleaned = rawPath.replace(/['\"]/g, '');\n if (cleaned.startsWith('package:')) {\n const pkg = cleaned.replace('package:', '');\n return workspace.findByPackage(pkg);\n }\n const fromDir = path.dirname(fromFile);\n return workspace.resolve(fromDir, cleaned);\n },\n\n isExported(node: Node): boolean {\n const name = node.childForFieldName('name');\n if (!name) return true;\n return !name.text.startsWith('_');\n },\n\n extractType(node: Node): string | null {\n const typeNode = node.childForFieldName('type');\n return typeNode?.text ?? null;\n },\n};\n","export interface ImportBinding {\n localName: string;\n sourcePath: string;\n exportedName: string;\n isDefault: boolean;\n isNamespace: boolean;\n}\n\nexport class BindingTracker {\n private bindings = new Map<string, Map<string, ImportBinding>>();\n\n addBinding(filePath: string, binding: ImportBinding): void {\n let fileBindings = this.bindings.get(filePath);\n if (!fileBindings) {\n fileBindings = new Map();\n this.bindings.set(filePath, fileBindings);\n }\n fileBindings.set(binding.localName, binding);\n }\n\n getBinding(filePath: string, localName: string): ImportBinding | undefined {\n return this.bindings.get(filePath)?.get(localName);\n }\n\n getFileBindings(filePath: string): ImportBinding[] {\n const fileBindings = this.bindings.get(filePath);\n return fileBindings ? [...fileBindings.values()] : [];\n }\n\n clear(): void {\n this.bindings.clear();\n }\n}\n","import type { CodeEdge } from '../shared/index.js';\nimport type { LanguageModule, FileSet } from '../languages/types.js';\nimport { BindingTracker } from './binding-tracker.js';\nimport type { ImportBinding } from './binding-tracker.js';\nimport { generateEdgeId } from '../graph/id-generator.js';\n\nexport interface ImportInfo {\n rawPath: string;\n localNames: string[];\n isDefault: boolean;\n isNamespace: boolean;\n namespaceName?: string;\n}\n\nexport interface ImportResolutionResult {\n edges: CodeEdge[];\n bindings: BindingTracker;\n}\n\nexport function resolveImports(\n filePath: string,\n fileNodeId: string,\n imports: ImportInfo[],\n langModule: LanguageModule,\n workspace: FileSet,\n): ImportResolutionResult {\n const bindings = new BindingTracker();\n const edges: CodeEdge[] = [];\n const maxReExportHops = 5;\n\n for (const imp of imports) {\n let resolvedPath = langModule.resolveImport(imp.rawPath, filePath, workspace);\n\n // Re-export chain walking\n let hops = 0;\n const visited = new Set<string>();\n while (resolvedPath && hops < maxReExportHops && !visited.has(resolvedPath)) {\n visited.add(resolvedPath);\n hops++;\n // For now, just accept the first resolution\n break;\n }\n\n if (!resolvedPath) continue;\n\n const targetNodeId = `file:${resolvedPath}:${resolvedPath}`;\n const edge: CodeEdge = {\n id: generateEdgeId(fileNodeId, targetNodeId, 'imports'),\n source: fileNodeId,\n target: targetNodeId,\n kind: 'imports',\n weight: 0.95,\n label: imp.rawPath,\n };\n edges.push(edge);\n\n for (const localName of imp.localNames) {\n const binding: ImportBinding = {\n localName,\n sourcePath: resolvedPath,\n exportedName: localName,\n isDefault: imp.isDefault,\n isNamespace: imp.isNamespace,\n };\n bindings.addBinding(filePath, binding);\n }\n }\n\n return { edges, bindings };\n}\n","import type { CodeEdge, CodeNode } from '../shared/index.js';\nimport type { KnowledgeGraph } from '../graph/knowledge-graph.js';\nimport type { BindingTracker } from '../resolver/binding-tracker.js';\nimport { generateEdgeId } from '../graph/id-generator.js';\nimport type { CallSite } from './call-classifier.js';\n\ninterface ResolutionTier {\n name: string;\n confidence: number;\n resolve(callSite: CallSite): string | null;\n}\n\nexport function buildCallEdges(\n callSites: CallSite[],\n graph: KnowledgeGraph,\n bindings: BindingTracker,\n): CodeEdge[] {\n const edges: CodeEdge[] = [];\n const symbolIndex = buildSymbolIndex(graph);\n\n const tiers: ResolutionTier[] = [\n {\n name: 'same-file',\n confidence: 0.95,\n resolve(cs: CallSite) {\n const key = `${cs.callerFilePath}:${cs.name}`;\n return symbolIndex.get(key) ?? null;\n },\n },\n {\n name: 'imported',\n confidence: 0.9,\n resolve(cs: CallSite) {\n const binding = bindings.getBinding(cs.callerFilePath, cs.name);\n if (!binding) return null;\n const key = `${binding.sourcePath}:${binding.exportedName}`;\n return symbolIndex.get(key) ?? null;\n },\n },\n {\n name: 'global',\n confidence: 0.5,\n resolve(cs: CallSite) {\n return globalSymbolIndex.get(cs.name) ?? null;\n },\n },\n ];\n\n const globalSymbolIndex = new Map<string, string>();\n for (const node of graph.allNodes()) {\n if (['function', 'method', 'class', 'constructor'].includes(node.kind)) {\n if (!globalSymbolIndex.has(node.name)) {\n globalSymbolIndex.set(node.name, node.id);\n }\n }\n }\n\n for (const cs of callSites) {\n for (const tier of tiers) {\n const targetId = tier.resolve(cs);\n if (targetId && targetId !== cs.callerNodeId) {\n edges.push({\n id: generateEdgeId(cs.callerNodeId, targetId, 'calls'),\n source: cs.callerNodeId,\n target: targetId,\n kind: 'calls',\n weight: tier.confidence,\n label: cs.name,\n });\n break;\n }\n }\n }\n\n return edges;\n}\n\nfunction buildSymbolIndex(graph: KnowledgeGraph): Map<string, string> {\n const index = new Map<string, string>();\n for (const node of graph.allNodes()) {\n if (['function', 'method', 'class', 'constructor', 'variable'].includes(node.kind)) {\n const key = `${node.filePath}:${node.name}`;\n index.set(key, node.id);\n }\n }\n return index;\n}\n","export type CallKind = 'free' | 'member' | 'constructor';\n\nexport interface CallSite {\n callerNodeId: string;\n callerFilePath: string;\n name: string;\n receiverText?: string;\n kind: CallKind;\n line: number;\n argCount: number;\n}\n\nexport function classifyCall(\n name: string,\n hasReceiver: boolean,\n isNew: boolean,\n): CallKind {\n if (isNew) return 'constructor';\n if (hasReceiver) return 'member';\n if (name[0] === name[0].toUpperCase() && name[0] !== name[0].toLowerCase()) {\n return 'constructor';\n }\n return 'free';\n}\n","import type { CodeEdge } from '../shared/index.js';\nimport type { KnowledgeGraph } from '../graph/knowledge-graph.js';\nimport { generateEdgeId } from '../graph/id-generator.js';\n\nexport interface HeritageInfo {\n classNodeId: string;\n extendsNames: string[];\n implementsNames: string[];\n}\n\nexport function buildHeritageEdges(\n heritages: HeritageInfo[],\n graph: KnowledgeGraph,\n): CodeEdge[] {\n const edges: CodeEdge[] = [];\n const classIndex = new Map<string, string>();\n\n for (const node of graph.allNodes()) {\n if (['class', 'interface', 'struct', 'trait'].includes(node.kind)) {\n classIndex.set(node.name, node.id);\n }\n }\n\n for (const h of heritages) {\n for (const name of h.extendsNames) {\n const targetId = classIndex.get(name);\n if (targetId) {\n edges.push({\n id: generateEdgeId(h.classNodeId, targetId, 'extends'),\n source: h.classNodeId,\n target: targetId,\n kind: 'extends',\n weight: 1.0,\n label: `extends ${name}`,\n });\n }\n }\n\n for (const name of h.implementsNames) {\n const targetId = classIndex.get(name);\n if (targetId) {\n edges.push({\n id: generateEdgeId(h.classNodeId, targetId, 'implements'),\n source: h.classNodeId,\n target: targetId,\n kind: 'implements',\n weight: 1.0,\n label: `implements ${name}`,\n });\n }\n }\n }\n\n return edges;\n}\n","export type MroStrategy = 'depth-first' | 'c3' | 'mixin-aware' | 'none';\n\nexport function computeMRO(\n classId: string,\n parentMap: Map<string, string[]>,\n strategy: MroStrategy,\n): string[] {\n switch (strategy) {\n case 'depth-first':\n return depthFirstMRO(classId, parentMap);\n case 'c3':\n return c3Linearize(classId, parentMap);\n case 'mixin-aware':\n return mixinAwareMRO(classId, parentMap);\n case 'none':\n return [classId];\n }\n}\n\nfunction depthFirstMRO(classId: string, parentMap: Map<string, string[]>): string[] {\n const result: string[] = [];\n const visited = new Set<string>();\n const stack = [classId];\n\n while (stack.length > 0) {\n const current = stack.pop()!;\n if (visited.has(current)) continue;\n visited.add(current);\n result.push(current);\n const parents = parentMap.get(current) ?? [];\n for (let i = parents.length - 1; i >= 0; i--) {\n stack.push(parents[i]);\n }\n }\n\n return result;\n}\n\nfunction c3Linearize(classId: string, parentMap: Map<string, string[]>): string[] {\n const cache = new Map<string, string[]>();\n const inProgress = new Set<string>();\n\n function linearize(cls: string): string[] {\n if (cache.has(cls)) return cache.get(cls)!;\n if (inProgress.has(cls)) return [cls]; // cycle detected\n\n inProgress.add(cls);\n const parents = parentMap.get(cls) ?? [];\n\n if (parents.length === 0) {\n const result = [cls];\n cache.set(cls, result);\n inProgress.delete(cls);\n return result;\n }\n\n const parentLinearizations = parents.map((p) => linearize(p));\n const sequences = [...parentLinearizations, parents];\n const result = [cls];\n\n while (sequences.some((s) => s.length > 0)) {\n let found = false;\n for (const seq of sequences) {\n if (seq.length === 0) continue;\n const head = seq[0];\n const inTail = sequences.some((s) => s.indexOf(head) > 0);\n if (!inTail) {\n result.push(head);\n for (const s of sequences) {\n const idx = s.indexOf(head);\n if (idx >= 0) s.splice(idx, 1);\n }\n found = true;\n break;\n }\n }\n if (!found) break; // inconsistent hierarchy\n }\n\n cache.set(cls, result);\n inProgress.delete(cls);\n return result;\n }\n\n return linearize(classId);\n}\n\nfunction mixinAwareMRO(classId: string, parentMap: Map<string, string[]>): string[] {\n // Simplified: prepend → direct → included\n return depthFirstMRO(classId, parentMap);\n}\n","import type { CodeEdge } from '../shared/index.js';\nimport type { KnowledgeGraph } from '../graph/knowledge-graph.js';\nimport { generateEdgeId } from '../graph/id-generator.js';\n\nexport function detectOverrides(graph: KnowledgeGraph): CodeEdge[] {\n const edges: CodeEdge[] = [];\n const methodsByOwner = new Map<string, Map<string, string>>();\n\n // Build owner → methods map\n for (const edge of graph.findEdgesByKind('has_member')) {\n const member = graph.getNode(edge.target);\n if (member && member.kind === 'method') {\n let methods = methodsByOwner.get(edge.source);\n if (!methods) {\n methods = new Map();\n methodsByOwner.set(edge.source, methods);\n }\n methods.set(member.name, member.id);\n }\n }\n\n // Check extends edges\n for (const extendsEdge of graph.findEdgesByKind('extends')) {\n const childMethods = methodsByOwner.get(extendsEdge.source);\n const parentMethods = methodsByOwner.get(extendsEdge.target);\n if (!childMethods || !parentMethods) continue;\n\n for (const [methodName, childMethodId] of childMethods) {\n const parentMethodId = parentMethods.get(methodName);\n if (parentMethodId) {\n edges.push({\n id: generateEdgeId(childMethodId, parentMethodId, 'overrides'),\n source: childMethodId,\n target: parentMethodId,\n kind: 'overrides',\n weight: 1.0,\n label: `overrides ${methodName}`,\n });\n }\n }\n }\n\n return edges;\n}\n","import type { Phase } from './types.js';\n\nexport interface ValidationError {\n type: 'duplicate' | 'missing-dep' | 'cycle';\n message: string;\n}\n\nexport function validateDAG(phases: Phase[]): ValidationError[] {\n const errors: ValidationError[] = [];\n const names = new Set<string>();\n\n // Check duplicates\n for (const phase of phases) {\n if (names.has(phase.name)) {\n errors.push({ type: 'duplicate', message: `Duplicate phase name: ${phase.name}` });\n }\n names.add(phase.name);\n }\n\n // Check missing deps\n for (const phase of phases) {\n for (const dep of phase.dependencies) {\n if (!names.has(dep)) {\n errors.push({\n type: 'missing-dep',\n message: `Phase \"${phase.name}\" depends on missing phase \"${dep}\"`,\n });\n }\n }\n }\n\n // Check cycles using DFS\n const visiting = new Set<string>();\n const visited = new Set<string>();\n const phaseMap = new Map(phases.map((p) => [p.name, p]));\n\n function dfs(name: string, path: string[]): boolean {\n if (visiting.has(name)) {\n const cycleStart = path.indexOf(name);\n const cycle = path.slice(cycleStart).concat(name);\n errors.push({ type: 'cycle', message: `Cycle detected: ${cycle.join(' → ')}` });\n return true;\n }\n if (visited.has(name)) return false;\n\n visiting.add(name);\n path.push(name);\n\n const phase = phaseMap.get(name);\n if (phase) {\n for (const dep of phase.dependencies) {\n if (dfs(dep, path)) return true;\n }\n }\n\n visiting.delete(name);\n visited.add(name);\n path.pop();\n return false;\n }\n\n for (const phase of phases) {\n if (!visited.has(phase.name)) {\n dfs(phase.name, []);\n }\n }\n\n return errors;\n}\n\nexport function topologicalSort(phases: Phase[]): Phase[] {\n const phaseMap = new Map(phases.map((p) => [p.name, p]));\n const inDegree = new Map<string, number>();\n const adjList = new Map<string, string[]>();\n\n for (const phase of phases) {\n inDegree.set(phase.name, 0);\n adjList.set(phase.name, []);\n }\n\n for (const phase of phases) {\n for (const dep of phase.dependencies) {\n adjList.get(dep)?.push(phase.name);\n inDegree.set(phase.name, (inDegree.get(phase.name) ?? 0) + 1);\n }\n }\n\n const queue: string[] = [];\n for (const [name, degree] of inDegree) {\n if (degree === 0) queue.push(name);\n }\n\n const sorted: Phase[] = [];\n while (queue.length > 0) {\n const current = queue.shift()!;\n sorted.push(phaseMap.get(current)!);\n for (const neighbor of adjList.get(current) ?? []) {\n const newDegree = (inDegree.get(neighbor) ?? 1) - 1;\n inDegree.set(neighbor, newDegree);\n if (newDegree === 0) queue.push(neighbor);\n }\n }\n\n return sorted;\n}\n","import type { Phase, PhaseResult, PipelineContext } from './types.js';\nimport { validateDAG, topologicalSort } from './dag-validator.js';\nimport { withSpan, isTracingEnabled } from '../observability/tracing.js';\nimport { pipelinePhaseDurationSeconds } from '../observability/metrics.js';\n\nexport interface PipelineRunResult {\n success: boolean;\n results: Map<string, PhaseResult>;\n totalDuration: number;\n}\n\nexport async function runPipeline(\n phases: Phase[],\n context: PipelineContext,\n): Promise<PipelineRunResult> {\n const errors = validateDAG(phases);\n if (errors.length > 0) {\n throw new Error(`Pipeline validation failed:\\n${errors.map((e) => e.message).join('\\n')}`);\n }\n\n const sorted = topologicalSort(phases);\n const results = new Map<string, PhaseResult>();\n const startTime = Date.now();\n let success = true;\n\n for (const phase of sorted) {\n context.onProgress?.(phase.name, 'running');\n const phaseStart = Date.now();\n\n const runPhase = async (): Promise<{ result: PhaseResult }> => {\n const depResults = new Map<string, PhaseResult>();\n for (const dep of phase.dependencies) {\n const depResult = results.get(dep);\n if (depResult) depResults.set(dep, depResult);\n }\n const result = await phase.execute(context, depResults);\n return { result };\n };\n\n try {\n let result: PhaseResult;\n if (isTracingEnabled()) {\n const out = await withSpan(\n `pipeline.phase.${phase.name}`,\n { 'pipeline.phase': phase.name },\n async () => runPhase(),\n );\n result = out.result;\n } else {\n result = (await runPhase()).result;\n }\n\n const durationSec = (Date.now() - phaseStart) / 1000;\n pipelinePhaseDurationSeconds.observe({ phase: phase.name, status: result.status }, durationSec);\n\n results.set(phase.name, result);\n context.onProgress?.(phase.name, result.status);\n\n if (result.status === 'failed') {\n success = false;\n break;\n }\n } catch (err) {\n const result: PhaseResult = {\n status: 'failed',\n duration: Date.now() - phaseStart,\n message: err instanceof Error ? err.message : String(err),\n };\n pipelinePhaseDurationSeconds.observe({ phase: phase.name, status: 'failed' }, (Date.now() - phaseStart) / 1000);\n results.set(phase.name, result);\n context.onProgress?.(phase.name, 'failed');\n success = false;\n break;\n }\n }\n\n return {\n success,\n results,\n totalDuration: Date.now() - startTime,\n };\n}\n","/**\n * Prometheus metrics for code-intel platform.\n * Uses prom-client to expose /metrics endpoint.\n */\nimport { Registry, Counter, Histogram, Gauge, collectDefaultMetrics } from 'prom-client';\n\n// ── Singleton registry ────────────────────────────────────────────────────────\n\nexport const metricsRegistry = new Registry();\n\n// Collect default Node.js metrics (heap, eventloop, gc, etc.)\ncollectDefaultMetrics({ register: metricsRegistry });\n\n// ── Counters ──────────────────────────────────────────────────────────────────\n\nexport const httpRequestsTotal = new Counter({\n name: 'http_requests_total',\n help: 'Total number of HTTP requests',\n labelNames: ['method', 'route', 'status_code'] as const,\n registers: [metricsRegistry],\n});\n\nexport const pipelineAnalysesTotal = new Counter({\n name: 'pipeline_analyses_total',\n help: 'Total number of pipeline analyses run',\n labelNames: ['status'] as const,\n registers: [metricsRegistry],\n});\n\nexport const mcpToolCallsTotal = new Counter({\n name: 'mcp_tool_calls_total',\n help: 'Total number of MCP tool calls',\n labelNames: ['tool', 'status'] as const,\n registers: [metricsRegistry],\n});\n\nexport const authAttemptsTotal = new Counter({\n name: 'auth_attempts_total',\n help: 'Total number of authentication attempts',\n labelNames: ['method', 'outcome'] as const,\n registers: [metricsRegistry],\n});\n\n// ── Histograms ────────────────────────────────────────────────────────────────\n\nexport const httpRequestDurationSeconds = new Histogram({\n name: 'http_request_duration_seconds',\n help: 'HTTP request duration in seconds',\n labelNames: ['method', 'route', 'status_code'] as const,\n buckets: [0.01, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10],\n registers: [metricsRegistry],\n});\n\nexport const pipelinePhaseDurationSeconds = new Histogram({\n name: 'pipeline_phase_duration_seconds',\n help: 'Duration of individual pipeline phases in seconds',\n labelNames: ['phase', 'status'] as const,\n buckets: [0.1, 0.5, 1, 2, 5, 10, 30, 60, 120],\n registers: [metricsRegistry],\n});\n\nexport const mcpToolDurationSeconds = new Histogram({\n name: 'mcp_tool_duration_seconds',\n help: 'Duration of MCP tool calls in seconds',\n labelNames: ['tool'] as const,\n buckets: [0.01, 0.05, 0.1, 0.5, 1, 5],\n registers: [metricsRegistry],\n});\n\n// ── Gauges ────────────────────────────────────────────────────────────────────\n\nexport const pipelineNodesTotal = new Gauge({\n name: 'pipeline_nodes_total',\n help: 'Total number of nodes in the knowledge graph',\n labelNames: ['repo'] as const,\n registers: [metricsRegistry],\n});\n\nexport const pipelineEdgesTotal = new Gauge({\n name: 'pipeline_edges_total',\n help: 'Total number of edges in the knowledge graph',\n labelNames: ['repo'] as const,\n registers: [metricsRegistry],\n});\n\nexport const jobQueueDepth = new Gauge({\n name: 'job_queue_depth',\n help: 'Current number of jobs in the queue',\n labelNames: ['status'] as const,\n registers: [metricsRegistry],\n});\n\nexport const activeSessionsTotal = new Gauge({\n name: 'active_sessions_total',\n help: 'Current number of active user sessions',\n registers: [metricsRegistry],\n});\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { detectLanguage, getSupportedExtensions } from '../../shared/index.js';\nimport type { Phase, PhaseResult, PipelineContext } from '../types.js';\nimport { generateNodeId } from '../../graph/id-generator.js';\n\nconst IGNORED_DIRS = new Set([\n 'node_modules', '.git', '.svn', '.hg', 'dist', 'dist-tests', 'build', 'out',\n '__pycache__', '.tox', '.pytest_cache', '.mypy_cache',\n 'vendor', 'target', '.code-intel', 'coverage', '.next',\n '.turbo', '.cache', 'tmp', 'temp', '.parcel-cache', '.venv', 'venv',\n '.env', 'env', '__snapshots__', '.nyc_output', 'storybook-static',\n]);\n\n/**\n * Load extra ignore patterns from .codeintelignore in the workspace root.\n * Format: one glob/dir name per line, # for comments.\n */\nfunction loadIgnorePatterns(workspaceRoot: string): Set<string> {\n try {\n const raw = fs.readFileSync(path.join(workspaceRoot, '.codeintelignore'), 'utf-8');\n const extras = new Set<string>();\n for (const line of raw.split('\\n')) {\n const trimmed = line.trim();\n if (trimmed && !trimmed.startsWith('#')) extras.add(trimmed);\n }\n return extras;\n } catch {\n return new Set();\n }\n}\n\nconst IGNORED_FILE_SUFFIXES = ['.d.ts', '.js.map', '.d.ts.map', '.min.js', '.min.css'];\nconst MAX_FILE_SIZE_BYTES = 512 * 1024; // skip files > 512 KB\n\nexport const scanPhase: Phase = {\n name: 'scan',\n dependencies: [],\n async execute(context: PipelineContext): Promise<PhaseResult> {\n const start = Date.now();\n const extensions = new Set(getSupportedExtensions());\n const filePaths: string[] = [];\n const extraIgnore = loadIgnorePatterns(context.workspaceRoot);\n\n function walk(dir: string): void {\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n\n for (const entry of entries) {\n // Skip hidden directories and ignored directories\n if (entry.isDirectory()) {\n if (entry.name.startsWith('.')) continue;\n if (IGNORED_DIRS.has(entry.name)) continue;\n if (extraIgnore.has(entry.name)) continue;\n walk(path.join(dir, entry.name));\n } else if (entry.isFile()) {\n const name = entry.name;\n // Skip known non-source suffixes\n if (IGNORED_FILE_SUFFIXES.some((s) => name.endsWith(s))) continue;\n const ext = path.extname(name);\n if (!extensions.has(ext)) continue;\n const fullPath = path.join(dir, name);\n // Skip very large files (generated code, minified assets)\n try {\n const stat = fs.statSync(fullPath);\n if (stat.size > MAX_FILE_SIZE_BYTES) continue;\n } catch {\n continue;\n }\n filePaths.push(fullPath);\n }\n }\n }\n\n walk(context.workspaceRoot);\n context.filePaths.push(...filePaths);\n context.onPhaseProgress?.('scan', filePaths.length, filePaths.length);\n\n return {\n status: 'completed',\n duration: Date.now() - start,\n message: `Found ${filePaths.length} source files`,\n };\n },\n};\n\nexport const structurePhase: Phase = {\n name: 'structure',\n dependencies: ['scan'],\n async execute(context: PipelineContext): Promise<PhaseResult> {\n const start = Date.now();\n const dirs = new Set<string>();\n\n let structDone = 0;\n for (const filePath of context.filePaths) {\n const relativePath = path.relative(context.workspaceRoot, filePath);\n const lang = detectLanguage(filePath);\n\n context.graph.addNode({\n id: generateNodeId('file', relativePath, relativePath),\n kind: 'file',\n name: path.basename(filePath),\n filePath: relativePath,\n metadata: lang ? { language: lang } : undefined,\n });\n\n // Collect directories\n let dir = path.dirname(relativePath);\n while (dir && dir !== '.' && dir !== '') {\n if (dirs.has(dir)) break;\n dirs.add(dir);\n dir = path.dirname(dir);\n }\n structDone++;\n context.onPhaseProgress?.('structure', structDone, context.filePaths.length);\n }\n\n for (const dir of dirs) {\n context.graph.addNode({\n id: generateNodeId('directory', dir, dir),\n kind: 'directory',\n name: path.basename(dir),\n filePath: dir,\n });\n }\n\n return {\n status: 'completed',\n duration: Date.now() - start,\n message: `Created ${context.filePaths.length} file nodes, ${dirs.size} directory nodes`,\n };\n },\n};\n","export { scanPhase, structurePhase } from './scan-phase.js';\nexport { parsePhase } from './parse-phase.js';\nexport { resolvePhase } from './resolve-phase.js';\nexport { clusterPhase } from './cluster-phase.js';\nexport { flowPhase } from './flow-phase.js';\nexport { parsePhaseParallel } from '../workers/parse-phase-parallel.js';\nexport { resolvePhaseParallel } from '../workers/resolve-phase-parallel.js';\n","import type { Phase, PhaseResult, PipelineContext } from '../types.js';\nimport { generateNodeId, generateEdgeId } from '../../graph/id-generator.js';\n\nexport const clusterPhase: Phase = {\n name: 'cluster',\n dependencies: ['resolve'],\n async execute(context: PipelineContext): Promise<PhaseResult> {\n const start = Date.now();\n const { graph } = context;\n\n const relevantKinds = new Set(['function', 'class', 'method', 'interface', 'struct', 'trait', 'enum']);\n const nodesByDir = new Map<string, { id: string; name: string }[]>();\n\n for (const node of graph.allNodes()) {\n if (!relevantKinds.has(node.kind)) continue;\n const dir = node.filePath.split('/').slice(0, -1).join('/') || '.';\n let group = nodesByDir.get(dir);\n if (!group) {\n group = [];\n nodesByDir.set(dir, group);\n }\n group.push({ id: node.id, name: node.name });\n }\n\n let clusterCount = 0;\n const dirEntries = [...nodesByDir.entries()];\n let clusterDone = 0;\n for (const [dir, members] of dirEntries) {\n clusterDone++;\n context.onPhaseProgress?.('cluster', clusterDone, dirEntries.length);\n if (members.length < 2) continue;\n\n const clusterId = generateNodeId('cluster', dir, `cluster-${clusterCount}`);\n const label = dir.split('/').filter(Boolean).pop() ?? `cluster-${clusterCount}`;\n\n graph.addNode({\n id: clusterId,\n kind: 'cluster',\n name: label,\n filePath: dir,\n metadata: { memberCount: members.length },\n });\n\n for (const member of members) {\n graph.addEdge({\n id: generateEdgeId(member.id, clusterId, 'belongs_to'),\n source: member.id,\n target: clusterId,\n kind: 'belongs_to',\n weight: 1.0,\n });\n }\n clusterCount++;\n }\n\n return {\n status: 'completed',\n duration: Date.now() - start,\n message: `Created ${clusterCount} clusters`,\n };\n },\n};\n","import type { Phase, PhaseResult, PipelineContext } from '../types.js';\nimport { generateNodeId, generateEdgeId } from '../../graph/id-generator.js';\n\nexport const flowPhase: Phase = {\n name: 'flow',\n dependencies: ['resolve'],\n async execute(context: PipelineContext): Promise<PhaseResult> {\n const start = Date.now();\n const { graph } = context;\n\n // Find entry points: exported functions with no incoming call edges\n const calledNodes = new Set<string>();\n for (const edge of graph.findEdgesByKind('calls')) {\n calledNodes.add(edge.target);\n }\n\n const entryPoints: { id: string; name: string; score: number; filePath: string }[] = [];\n\n for (const node of graph.allNodes()) {\n if (!['function', 'method'].includes(node.kind)) continue;\n\n let score = 0;\n const hasCallers = calledNodes.has(node.id);\n const outCalls = [...graph.findEdgesFrom(node.id)].filter((e) => e.kind === 'calls');\n\n if (!hasCallers && outCalls.length > 0) score += 10;\n if (node.exported) score += 5;\n if (/^(main|handle|init|start|run|execute|process|serve|listen|bootstrap)/.test(node.name)) score += 3;\n if (node.filePath.includes('test') || node.filePath.includes('spec') || node.filePath.includes('__test')) score -= 20;\n if (node.filePath.includes('route') || node.filePath.includes('controller') || node.filePath.includes('handler')) score += 8;\n\n if (score >= 5) {\n entryPoints.push({ id: node.id, name: node.name, score, filePath: node.filePath });\n }\n }\n\n entryPoints.sort((a, b) => b.score - a.score);\n\n // Trace flows from top entry points (max 20)\n const maxFlows = 75;\n const maxDepth = 10;\n const maxBranching = 4;\n let flowCount = 0;\n const epSlice = entryPoints.slice(0, 20);\n\n for (let epIdx = 0; epIdx < epSlice.length; epIdx++) {\n const ep = epSlice[epIdx];\n context.onPhaseProgress?.('flow', epIdx + 1, epSlice.length);\n if (flowCount >= maxFlows) break;\n\n // BFS trace\n const queue: { nodeId: string; path: string[] }[] = [{ nodeId: ep.id, path: [ep.id] }];\n const visited = new Set<string>();\n\n while (queue.length > 0 && flowCount < maxFlows) {\n const { nodeId, path } = queue.shift()!;\n if (path.length > maxDepth) continue;\n\n const callEdges = [...graph.findEdgesFrom(nodeId)]\n .filter((e) => e.kind === 'calls')\n .slice(0, maxBranching);\n\n if (callEdges.length === 0 && path.length >= 3) {\n // Record flow\n const flowId = generateNodeId('flow', ep.filePath, `flow-${flowCount}`);\n graph.addNode({\n id: flowId,\n kind: 'flow',\n name: `${ep.name} flow ${flowCount}`,\n filePath: ep.filePath,\n metadata: { steps: path, entryPoint: ep.name },\n });\n\n // Add step_of edges\n for (let i = 0; i < path.length; i++) {\n graph.addEdge({\n id: generateEdgeId(path[i], flowId, `step_of_${i}`),\n source: path[i],\n target: flowId,\n kind: 'step_of',\n weight: 1.0,\n label: `step ${i + 1}`,\n });\n }\n\n flowCount++;\n continue;\n }\n\n for (const edge of callEdges) {\n if (visited.has(edge.target)) continue;\n visited.add(edge.target);\n queue.push({ nodeId: edge.target, path: [...path, edge.target] });\n }\n }\n }\n\n return {\n status: 'completed',\n duration: Date.now() - start,\n message: `Found ${entryPoints.length} entry points, traced ${flowCount} flows`,\n };\n },\n};\n","/**\n * parse-phase-parallel.ts — Drop-in parallel replacement for parse-phase.ts\n *\n * Uses WorkerPool<ParseTask, ParseResult> to distribute file parsing across\n * N worker threads (default: os.cpus().length - 1).\n *\n * Falls back gracefully to sequential execution if workers fail to start.\n */\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\nimport { fileURLToPath } from 'node:url';\nimport { detectLanguage, Language } from '../../shared/index.js';\nimport type { Phase, PhaseResult, PipelineContext } from '../types.js';\nimport { generateNodeId } from '../../graph/id-generator.js';\nimport Logger from '../../shared/logger.js';\nimport { WorkerPool } from './worker-pool.js';\nimport type { ParseTask, ParseResult } from './parse-worker.js';\nimport {\n typescriptQueries, javascriptQueries, pythonQueries, javaQueries, goQueries,\n cQueries, cppQueries, csharpQueries, rustQueries, phpQueries,\n kotlinQueries, rubyQueries, swiftQueries, dartQueries,\n} from '../../parsing/queries/index.js';\n\nconst LANG_QUERIES: Partial<Record<Language, string>> = {\n [Language.TypeScript]: typescriptQueries,\n [Language.JavaScript]: javascriptQueries,\n [Language.Python]: pythonQueries,\n [Language.Java]: javaQueries,\n [Language.Go]: goQueries,\n [Language.C]: cQueries,\n [Language.Cpp]: cppQueries,\n [Language.CSharp]: csharpQueries,\n [Language.Rust]: rustQueries,\n [Language.PHP]: phpQueries,\n [Language.Kotlin]: kotlinQueries,\n [Language.Ruby]: rubyQueries,\n [Language.Swift]: swiftQueries,\n [Language.Dart]: dartQueries,\n};\n\n// Resolve the compiled worker script path (dist/pipeline/workers/parse-worker.js)\nfunction workerScriptPath(): string {\n const thisFile = fileURLToPath(import.meta.url);\n return path.join(path.dirname(thisFile), 'parse-worker.js');\n}\n\nexport const parsePhaseParallel: Phase = {\n name: 'parse',\n dependencies: ['structure'],\n\n async execute(context: PipelineContext): Promise<PhaseResult> {\n const start = Date.now();\n\n if (!context.fileCache) context.fileCache = new Map();\n if (!context.fileFunctionIndex) context.fileFunctionIndex = new Map();\n\n const filePaths = context.filePaths;\n const workerCount = parseInt(process.env['PARSE_WORKERS'] ?? '', 10) || Math.max(1, os.cpus().length - 1);\n\n // ── Read all files into cache ─────────────────────────────────────────────\n const CONCURRENCY = 64;\n for (let i = 0; i < filePaths.length; i += CONCURRENCY) {\n const batch = filePaths.slice(i, i + CONCURRENCY);\n await Promise.all(batch.map(async (filePath) => {\n try {\n const source = await fs.promises.readFile(filePath, 'utf-8');\n context.fileCache!.set(filePath, source);\n } catch { /* skip */ }\n }));\n }\n\n // ── Try to start the worker pool ──────────────────────────────────────────\n const workerScript = workerScriptPath();\n const workerScriptExists = fs.existsSync(workerScript);\n\n if (!workerScriptExists || workerCount === 1) {\n // Worker script not built yet or forced single-threaded — delegate to\n // the regular sequential parse phase\n Logger.info(`[parse-parallel] falling back to sequential (workerCount=${workerCount}, scriptExists=${workerScriptExists})`);\n const { parsePhase } = await import('../phases/parse-phase.js');\n return parsePhase.execute(context, new Map());\n }\n\n // ── Build tasks ───────────────────────────────────────────────────────────\n const tasks: ParseTask[] = [];\n for (const filePath of filePaths) {\n const lang = detectLanguage(filePath);\n if (!lang) continue;\n const source = context.fileCache.get(filePath);\n if (!source) continue;\n const relativePath = path.relative(context.workspaceRoot, filePath);\n const fileNodeId = generateNodeId('file', relativePath, relativePath);\n\n // Store file content snippet on the file node\n const fileNode = context.graph.getNode(fileNodeId);\n if (fileNode) fileNode.content = source.slice(0, 2000);\n\n tasks.push({\n taskId: filePath,\n filePath,\n relativePath,\n source,\n lang: lang as string,\n fileNodeId,\n queryStr: LANG_QUERIES[lang] ?? null,\n });\n }\n\n // ── Run tasks in worker pool ──────────────────────────────────────────────\n const pool = new WorkerPool<ParseTask, ParseResult>({\n workerScript,\n workerCount,\n maxQueueSize: 200,\n });\n await pool.init();\n\n let symbolCount = 0;\n let treeSitterCount = 0;\n let regexCount = 0;\n let parseDone = 0;\n\n // Backpressure: wait for queue to drain below threshold before submitting more\n const BATCH_SIZE = 100;\n\n for (let i = 0; i < tasks.length; i += BATCH_SIZE) {\n const batch = tasks.slice(i, i + BATCH_SIZE);\n const results = await Promise.all(batch.map((t) => pool.run(t).catch((err: Error) => ({\n taskId: t.taskId,\n nodes: [],\n edges: [],\n usedTreeSitter: false,\n error: err.message,\n } as ParseResult))));\n\n for (const res of results) {\n if (res.error) {\n Logger.warn(`[parse-parallel] task error: ${res.error}`);\n }\n for (const n of res.nodes) context.graph.addNode(n);\n for (const e of res.edges) context.graph.addEdge(e);\n symbolCount += res.nodes.length;\n if (res.usedTreeSitter) treeSitterCount++;\n else regexCount++;\n\n // Build per-file sorted function index\n const relativePath = path.relative(context.workspaceRoot, res.taskId);\n const funcs = res.nodes\n .filter((n) => n.kind === 'function' || n.kind === 'method')\n .map((n) => ({ id: n.id, startLine: n.startLine ?? 0, endLine: n.endLine }))\n .sort((a, b) => a.startLine - b.startLine);\n if (funcs.length > 0) context.fileFunctionIndex!.set(relativePath, funcs);\n\n parseDone++;\n context.onPhaseProgress?.('parse', parseDone, tasks.length);\n }\n }\n\n await pool.close();\n\n const parserUsed: 'tree-sitter' | 'regex' = treeSitterCount === 0 ? 'regex' : 'tree-sitter';\n context.parserUsed = parserUsed;\n\n if (context.verbose) {\n Logger.info(`[parse-parallel] ${workerCount} workers, tree-sitter: ${treeSitterCount}, regex: ${regexCount}`);\n }\n\n return {\n status: 'completed',\n duration: Date.now() - start,\n message: `Extracted ${symbolCount} symbols from ${filePaths.length} files (${parserUsed}, ${workerCount} workers)`,\n };\n },\n};\n","/**\n * worker-pool.ts — Generic worker-thread pool with backpressure.\n *\n * - N workers (default: os.cpus().length - 1; PARSE_WORKERS env override)\n * - Work queue with backpressure: pauses when queue > 200\n * - Worker crash → restart + re-queue pending work\n * - Progress events forwarded to caller via onProgress callback\n */\nimport { Worker } from 'node:worker_threads';\nimport os from 'node:os';\nimport { EventEmitter } from 'node:events';\nimport Logger from '../../shared/logger.js';\n\nexport interface WorkerPoolOptions {\n workerScript: string; // absolute path to the worker .js file\n workerCount?: number; // default: os.cpus().length - 1 (min 1)\n maxQueueSize?: number; // backpressure threshold (default 200)\n maxTaskRetries?: number; // max retries on worker crash (default 2)\n}\n\ninterface PendingTask<I, O> {\n id: string;\n input: I;\n resolve: (result: O) => void;\n reject: (err: Error) => void;\n retries: number;\n}\n\ninterface ActiveWorker<I, O> {\n worker: Worker;\n currentTask: PendingTask<I, O> | null;\n}\n\nexport class WorkerPool<I extends { taskId: string }, O extends { taskId: string; error?: string }> extends EventEmitter {\n private workers: ActiveWorker<I, O>[] = [];\n private queue: PendingTask<I, O>[] = [];\n private readonly workerScript: string;\n private readonly workerCount: number;\n private readonly maxQueueSize: number;\n private readonly maxTaskRetries: number;\n private closed = false;\n\n constructor(opts: WorkerPoolOptions) {\n super();\n this.workerScript = opts.workerScript;\n this.workerCount = opts.workerCount ?? Math.max(1, os.cpus().length - 1);\n this.maxQueueSize = opts.maxQueueSize ?? 200;\n this.maxTaskRetries = opts.maxTaskRetries ?? 2;\n }\n\n /** Spawn all workers. Must be called before run(). */\n async init(): Promise<void> {\n for (let i = 0; i < this.workerCount; i++) {\n this.spawnWorker();\n }\n }\n\n private spawnWorker(): void {\n const aw: ActiveWorker<I, O> = { worker: null!, currentTask: null };\n const w = new Worker(this.workerScript);\n\n w.on('message', (result: O) => {\n const task = aw.currentTask;\n aw.currentTask = null;\n if (task) {\n if (result.error) {\n task.reject(new Error(result.error));\n } else {\n task.resolve(result);\n }\n }\n this.emit('taskDone');\n this.dequeue(aw);\n });\n\n w.on('error', (err) => {\n Logger.warn(`[WorkerPool] worker error: ${err.message}`);\n const task = aw.currentTask;\n aw.currentTask = null;\n\n // Re-spawn replacement worker\n const idx = this.workers.indexOf(aw);\n if (idx >= 0) this.workers.splice(idx, 1);\n if (!this.closed) this.spawnWorker();\n\n // Re-queue the task that was in flight (up to maxTaskRetries)\n if (task) {\n task.retries = (task.retries ?? 0) + 1;\n if (task.retries <= this.maxTaskRetries) {\n Logger.info(`[WorkerPool] re-queuing task ${task.id} after worker crash (retry ${task.retries})`);\n this.queue.unshift(task);\n this.drainQueue();\n } else {\n Logger.warn(`[WorkerPool] task ${task.id} exceeded max retries (${this.maxTaskRetries}), rejecting`);\n task.reject(new Error(`Worker crashed after ${this.maxTaskRetries} retries`));\n }\n }\n });\n\n w.on('exit', (code) => {\n if (code !== 0 && !this.closed) {\n Logger.warn(`[WorkerPool] worker exited with code ${code}`);\n }\n });\n\n aw.worker = w;\n this.workers.push(aw);\n this.dequeue(aw);\n }\n\n /** Submit a task. Resolves with the worker result or rejects on error. */\n run(input: I): Promise<O> {\n if (this.closed) return Promise.reject(new Error('WorkerPool is closed'));\n\n return new Promise((resolve, reject) => {\n const task: PendingTask<I, O> = { id: input.taskId, input, resolve, reject, retries: 0 };\n this.queue.push(task);\n\n if (this.queue.length > this.maxQueueSize) {\n // Backpressure: emit event; callers should await until queue drains\n this.emit('backpressure', this.queue.length);\n }\n\n this.drainQueue();\n });\n }\n\n private drainQueue(): void {\n for (const aw of this.workers) {\n if (!aw.currentTask) this.dequeue(aw);\n }\n }\n\n private dequeue(aw: ActiveWorker<I, O>): void {\n if (this.queue.length === 0 || aw.currentTask !== null) return;\n const task = this.queue.shift()!;\n aw.currentTask = task;\n aw.worker.postMessage(task.input);\n }\n\n get queueLength(): number { return this.queue.length; }\n get size(): number { return this.workerCount; }\n\n /** Terminate all workers gracefully. */\n async close(): Promise<void> {\n this.closed = true;\n await Promise.all(this.workers.map((aw) => aw.worker.terminate()));\n this.workers = [];\n }\n}\n","/**\n * resolve-phase-parallel.ts — Drop-in parallel replacement for resolve-phase.ts\n *\n * Builds read-only index snapshots (symbolIndex, fileSymbolIndex, fileIndex),\n * shares them with resolve workers via workerData, then distributes one\n * ResolveTask per file across the pool and merges all edge results.\n */\nimport { Worker } from 'node:worker_threads';\nimport path from 'node:path';\nimport os from 'node:os';\nimport fs from 'node:fs';\nimport { fileURLToPath } from 'node:url';\nimport { detectLanguage } from '../../shared/index.js';\nimport type { Phase, PhaseResult, PipelineContext } from '../types.js';\nimport { generateNodeId, generateEdgeId } from '../../graph/id-generator.js';\nimport Logger from '../../shared/logger.js';\nimport type { ResolveSnapshot, ResolveTask, ResolveResult } from './resolve-worker.js';\n\nfunction workerScriptPath(): string {\n const thisFile = fileURLToPath(import.meta.url);\n return path.join(path.dirname(thisFile), 'resolve-worker.js');\n}\n\nexport const resolvePhaseParallel: Phase = {\n name: 'resolve',\n dependencies: ['parse'],\n\n async execute(context: PipelineContext): Promise<PhaseResult> {\n const start = Date.now();\n const { graph, workspaceRoot, filePaths } = context;\n\n const fileCache = context.fileCache ?? new Map<string, string>();\n const fileFunctionIndex = context.fileFunctionIndex ?? new Map<string, { id: string; startLine: number; endLine: number | undefined }[]>();\n\n // ── Build indices ─────────────────────────────────────────────────────────\n const fileIndex: Record<string, string> = {};\n for (const fp of filePaths) {\n const rel = path.relative(workspaceRoot, fp);\n fileIndex[rel] = fp;\n const noExt = rel.replace(/\\.\\w+$/, '');\n if (!fileIndex[noExt]) fileIndex[noExt] = fp;\n const base = path.basename(rel, path.extname(rel));\n if (!fileIndex[base]) fileIndex[base] = fp;\n }\n\n const symbolIndex: Record<string, string> = {};\n const fileSymbolIndex: Record<string, Record<string, string>> = {};\n for (const node of graph.allNodes()) {\n if (['function', 'class', 'interface', 'method', 'enum', 'type_alias', 'variable', 'constant', 'struct', 'trait'].includes(node.kind)) {\n symbolIndex[node.name] = node.id;\n if (!fileSymbolIndex[node.filePath]) fileSymbolIndex[node.filePath] = {};\n fileSymbolIndex[node.filePath][node.name] = node.id;\n }\n }\n\n const snapshot: ResolveSnapshot = { symbolIndex, fileSymbolIndex, fileIndex, workspaceRoot };\n\n // ── Check if worker script exists ─────────────────────────────────────────\n const workerScript = workerScriptPath();\n const workerScriptExists = fs.existsSync(workerScript);\n const workerCount = parseInt(process.env['PARSE_WORKERS'] ?? '', 10) || Math.max(1, os.cpus().length - 1);\n\n if (!workerScriptExists || workerCount === 1) {\n Logger.info(`[resolve-parallel] falling back to sequential`);\n const { resolvePhase } = await import('../phases/resolve-phase.js');\n return resolvePhase.execute(context, new Map());\n }\n\n // ── Build tasks ───────────────────────────────────────────────────────────\n const tasks: ResolveTask[] = [];\n for (const filePath of filePaths) {\n const lang = detectLanguage(filePath);\n if (!lang) continue;\n const source = fileCache.get(filePath);\n if (!source) continue;\n const relativePath = path.relative(workspaceRoot, filePath);\n const fileNodeId = generateNodeId('file', relativePath, relativePath);\n const funcList = fileFunctionIndex.get(relativePath) ?? [];\n tasks.push({ taskId: filePath, filePath, relativePath, fileNodeId, source, funcList });\n }\n\n // ── Spawn resolve workers (pass snapshot via workerData) ──────────────────\n let importEdges = 0;\n let callEdges = 0;\n let heritageEdges = 0;\n let fileDone = 0;\n\n const BATCH_SIZE = 100;\n\n // We spawn one pool of workers sharing the same snapshot via workerData\n // Use a simple Promise-based dispatch (workers are stateless per message)\n const workers: { w: Worker; busy: boolean }[] = [];\n for (let i = 0; i < workerCount; i++) {\n workers.push({ w: new Worker(workerScript, { workerData: snapshot }), busy: false });\n }\n\n const pendingResolvers = new Map<string, (r: ResolveResult) => void>();\n for (const { w } of workers) {\n w.on('message', (result: ResolveResult) => {\n const resolve = pendingResolvers.get(result.taskId);\n if (resolve) { pendingResolvers.delete(result.taskId); resolve(result); }\n });\n w.on('error', (err) => Logger.warn(`[resolve-worker] error: ${err.message}`));\n }\n\n let workerIdx = 0;\n function runTask(task: ResolveTask): Promise<ResolveResult> {\n return new Promise((resolve) => {\n pendingResolvers.set(task.taskId, resolve);\n const { w } = workers[workerIdx % workers.length];\n workerIdx++;\n w.postMessage(task);\n });\n }\n\n const seen = new Set<string>();\n\n for (let i = 0; i < tasks.length; i += BATCH_SIZE) {\n const batch = tasks.slice(i, i + BATCH_SIZE);\n const results = await Promise.all(batch.map((t) => runTask(t)));\n\n for (const res of results) {\n if (res.error) Logger.warn(`[resolve-parallel] task error: ${res.error}`);\n for (const edge of res.edges) {\n if (seen.has(edge.id)) continue;\n seen.add(edge.id);\n graph.addEdge(edge);\n if (edge.kind === 'imports') importEdges++;\n else if (edge.kind === 'calls') callEdges++;\n else heritageEdges++;\n }\n fileDone++;\n context.onPhaseProgress?.('resolve', fileDone, tasks.length);\n }\n }\n\n await Promise.all(workers.map(({ w }) => w.terminate()));\n\n return {\n status: 'completed',\n duration: Date.now() - start,\n message: `Resolved ${importEdges} imports, ${callEdges} calls, ${heritageEdges} heritage edges. Graph: ${graph.size.nodes} nodes, ${graph.size.edges} edges`,\n };\n },\n};\n","export interface Scope {\n name: string;\n kind: 'module' | 'function' | 'block' | 'class';\n parent: Scope | null;\n bindings: Map<string, ScopeBinding>;\n children: Scope[];\n}\n\nexport interface ScopeBinding {\n name: string;\n nodeId: string;\n kind: 'variable' | 'function' | 'class' | 'parameter' | 'import';\n}\n\nexport function createScope(\n name: string,\n kind: Scope['kind'],\n parent: Scope | null = null,\n): Scope {\n const scope: Scope = { name, kind, parent, bindings: new Map(), children: [] };\n parent?.children.push(scope);\n return scope;\n}\n\nexport function resolveBinding(name: string, scope: Scope): ScopeBinding | null {\n let current: Scope | null = scope;\n while (current !== null) {\n const binding = current.bindings.get(name);\n if (binding) return binding;\n current = current.parent;\n }\n return null;\n}\n\nexport function addBinding(scope: Scope, binding: ScopeBinding): void {\n scope.bindings.set(binding.name, binding);\n}\n","import type { CodeNode } from '../shared/index.js';\nimport type { KnowledgeGraph } from '../graph/knowledge-graph.js';\nimport { generateNodeId, generateEdgeId } from '../graph/id-generator.js';\n\nexport interface ClusterResult {\n clusterId: string;\n label: string;\n memberIds: string[];\n}\n\nexport function detectCommunities(graph: KnowledgeGraph): ClusterResult[] {\n // Build adjacency for relevant node kinds\n const relevantKinds = new Set(['function', 'class', 'method', 'interface', 'struct']);\n const nodes: CodeNode[] = [];\n\n for (const node of graph.allNodes()) {\n if (relevantKinds.has(node.kind)) {\n nodes.push(node);\n }\n }\n\n if (nodes.length < 10) return [];\n\n // Group by file directory as simple heuristic clustering\n const dirGroups = new Map<string, CodeNode[]>();\n for (const node of nodes) {\n const dir = node.filePath.split('/').slice(0, -1).join('/') || '.';\n let group = dirGroups.get(dir);\n if (!group) {\n group = [];\n dirGroups.set(dir, group);\n }\n group.push(node);\n }\n\n const clusters: ClusterResult[] = [];\n let idx = 0;\n\n for (const [dir, members] of dirGroups) {\n if (members.length < 2) continue;\n const clusterId = generateNodeId('cluster', dir, `cluster-${idx}`);\n const label = generateLabel(dir, members);\n\n clusters.push({\n clusterId,\n label,\n memberIds: members.map((m) => m.id),\n });\n idx++;\n }\n\n return clusters;\n}\n\nfunction generateLabel(dir: string, members: CodeNode[]): string {\n const parts = dir.split('/').filter(Boolean);\n if (parts.length > 0) {\n return parts[parts.length - 1];\n }\n return `cluster-${members[0]?.name ?? 'unknown'}`;\n}\n\nexport function addClustersToGraph(graph: KnowledgeGraph, clusters: ClusterResult[]): void {\n for (const cluster of clusters) {\n graph.addNode({\n id: cluster.clusterId,\n kind: 'cluster',\n name: cluster.label,\n filePath: '',\n metadata: { memberCount: cluster.memberIds.length },\n });\n\n for (const memberId of cluster.memberIds) {\n graph.addEdge({\n id: generateEdgeId(memberId, cluster.clusterId, 'belongs_to'),\n source: memberId,\n target: cluster.clusterId,\n kind: 'belongs_to',\n weight: 1.0,\n });\n }\n }\n}\n","import type { KnowledgeGraph } from '../graph/knowledge-graph.js';\n\nexport interface EntryPoint {\n nodeId: string;\n name: string;\n score: number;\n filePath: string;\n}\n\nexport function findEntryPoints(graph: KnowledgeGraph): EntryPoint[] {\n const calledNodes = new Set<string>();\n for (const edge of graph.findEdgesByKind('calls')) {\n calledNodes.add(edge.target);\n }\n\n const entryPoints: EntryPoint[] = [];\n\n for (const node of graph.allNodes()) {\n if (!['function', 'method'].includes(node.kind)) continue;\n\n const outEdges = [...graph.findEdgesFrom(node.id)].filter((e) => e.kind === 'calls');\n const inDegree = calledNodes.has(node.id) ? 1 : 0;\n\n let score = 0;\n if (outEdges.length > 0 && inDegree === 0) score += 10;\n if (node.exported) score += 5;\n if (/^(main|handle|init|start|run|execute|process|serve|listen)/.test(node.name)) score += 3;\n if (node.filePath.includes('test') || node.filePath.includes('spec')) score -= 20;\n if (node.filePath.includes('route') || node.filePath.includes('controller')) score += 8;\n\n if (score >= 5) {\n entryPoints.push({\n nodeId: node.id,\n name: node.name,\n score,\n filePath: node.filePath,\n });\n }\n }\n\n return entryPoints.sort((a, b) => b.score - a.score);\n}\n\nexport interface FlowTrace {\n entryPointId: string;\n steps: string[];\n}\n\nexport function traceFlow(\n entryId: string,\n graph: KnowledgeGraph,\n maxDepth = 10,\n maxBranching = 4,\n): FlowTrace[] {\n const flows: FlowTrace[] = [];\n const maxFlows = 75;\n\n function bfs(): void {\n const queue: { nodeId: string; path: string[] }[] = [{ nodeId: entryId, path: [entryId] }];\n const visited = new Set<string>();\n\n while (queue.length > 0 && flows.length < maxFlows) {\n const { nodeId, path } = queue.shift()!;\n if (path.length > maxDepth) continue;\n\n const callEdges = [...graph.findEdgesFrom(nodeId)]\n .filter((e) => e.kind === 'calls')\n .slice(0, maxBranching);\n\n if (callEdges.length === 0 && path.length >= 3) {\n flows.push({ entryPointId: entryId, steps: [...path] });\n continue;\n }\n\n for (const edge of callEdges) {\n if (visited.has(edge.target)) continue;\n visited.add(edge.target);\n queue.push({ nodeId: edge.target, path: [...path, edge.target] });\n }\n }\n }\n\n bfs();\n return deduplicateFlows(flows);\n}\n\nfunction deduplicateFlows(flows: FlowTrace[]): FlowTrace[] {\n const result: FlowTrace[] = [];\n\n for (const flow of flows) {\n const edges = new Set<string>();\n for (let i = 0; i < flow.steps.length - 1; i++) {\n edges.add(`${flow.steps[i]}->${flow.steps[i + 1]}`);\n }\n\n const isDuplicate = result.some((existing) => {\n const existingEdges = new Set<string>();\n for (let i = 0; i < existing.steps.length - 1; i++) {\n existingEdges.add(`${existing.steps[i]}->${existing.steps[i + 1]}`);\n }\n let overlap = 0;\n for (const e of edges) {\n if (existingEdges.has(e)) overlap++;\n }\n return overlap / Math.max(edges.size, 1) > 0.7;\n });\n\n if (!isDuplicate) result.push(flow);\n }\n\n return result;\n}\n","import type { KnowledgeGraph } from '../graph/knowledge-graph.js';\n\nexport interface SearchResult {\n nodeId: string;\n name: string;\n kind: string;\n filePath: string;\n score: number;\n snippet?: string;\n}\n\nexport function textSearch(\n graph: KnowledgeGraph,\n query: string,\n limit = 20,\n): SearchResult[] {\n const terms = query.toLowerCase().split(/\\s+/).filter(Boolean);\n const results: SearchResult[] = [];\n\n // Deprioritize test/dist paths\n const isTestPath = (fp: string) =>\n fp.includes('test') || fp.includes('spec') || fp.includes('__test');\n const isDistPath = (fp: string) =>\n fp.includes('/dist') || fp.includes('\\\\dist') || fp.includes('.d.ts');\n\n for (const node of graph.allNodes()) {\n if (['directory', 'cluster', 'flow'].includes(node.kind)) continue;\n\n let score = 0;\n const nameLC = node.name.toLowerCase();\n const pathLC = node.filePath.toLowerCase();\n\n for (const term of terms) {\n if (nameLC === term) score += 10;\n else if (nameLC.startsWith(term)) score += 7;\n else if (nameLC.includes(term)) score += 5;\n if (pathLC.includes(term)) score += 2;\n if (node.content?.toLowerCase().includes(term)) score += 3;\n }\n\n // Boost source files over compiled/test files\n if (score > 0) {\n if (isDistPath(node.filePath)) score -= 8;\n if (isTestPath(node.filePath)) score -= 4;\n // Boost by kind relevance\n if (['function', 'class', 'interface', 'method'].includes(node.kind)) score += 1;\n }\n\n if (score > 0) {\n results.push({\n nodeId: node.id,\n name: node.name,\n kind: node.kind,\n filePath: node.filePath,\n score,\n snippet: node.content?.slice(0, 200),\n });\n }\n }\n\n results.sort((a, b) => b.score - a.score);\n return results.slice(0, limit);\n}\n\nexport function reciprocalRankFusion(\n ...rankings: SearchResult[][]\n): SearchResult[] {\n const K = 60;\n const scoreMap = new Map<string, { result: SearchResult; rrfScore: number }>();\n\n for (const ranking of rankings) {\n for (let rank = 0; rank < ranking.length; rank++) {\n const result = ranking[rank];\n const existing = scoreMap.get(result.nodeId);\n const rrfContribution = 1 / (K + rank + 1);\n\n if (existing) {\n existing.rrfScore += rrfContribution;\n } else {\n scoreMap.set(result.nodeId, {\n result,\n rrfScore: rrfContribution,\n });\n }\n }\n }\n\n return [...scoreMap.values()]\n .sort((a, b) => b.rrfScore - a.rrfScore)\n .map((entry) => ({ ...entry.result, score: entry.rrfScore }));\n}\n","export { textSearch, reciprocalRankFusion } from './text-search.js';\nexport type { SearchResult } from './text-search.js';\nexport { embedNodes } from './embedder.js';\nexport type { EmbeddedNode } from './embedder.js';\nexport { VectorIndex } from './vector-index.js';\nexport type { VectorHit } from './vector-index.js';\n\n","import { DbManager } from '../storage/db-manager.js';\nimport type { EmbeddedNode } from './embedder.js';\n\nconst EMBED_TABLE = 'embed_nodes';\nconst EMBED_DIM = 384; // all-MiniLM-L6-v2 output dimension\nconst INDEX_NAME = 'embed_vec_idx';\n\nexport class VectorIndex {\n private db: DbManager;\n\n constructor(db: DbManager) {\n this.db = db;\n }\n\n async init(): Promise<void> {\n // Install + load VECTOR extension\n await this.db.execute('INSTALL VECTOR');\n await this.db.execute('LOAD EXTENSION VECTOR');\n\n // Create node table for embeddings\n await this.db.execute(`\n CREATE NODE TABLE IF NOT EXISTS ${EMBED_TABLE} (\n id STRING,\n name STRING,\n kind STRING,\n file_path STRING,\n text STRING,\n embedding FLOAT[${EMBED_DIM}],\n PRIMARY KEY (id)\n )\n `);\n }\n\n async buildIndex(nodes: EmbeddedNode[]): Promise<void> {\n // Drop existing data\n await this.db.execute(`MATCH (n:${EMBED_TABLE}) DETACH DELETE n`).catch(() => {});\n\n // Insert embeddings\n for (const node of nodes) {\n const vecLiteral = `[${node.embedding.join(',')}]`;\n await this.db.execute(\n `CREATE (:${EMBED_TABLE} {\n id: '${esc(node.id)}',\n name: '${esc(node.name)}',\n kind: '${esc(node.kind)}',\n file_path: '${esc(node.filePath)}',\n text: '${esc(node.text)}',\n embedding: ${vecLiteral}\n })`,\n );\n }\n\n // Drop and recreate vector index (signature: tableName, indexName, propertyName)\n await this.db.execute(`CALL DROP_VECTOR_INDEX('${EMBED_TABLE}', '${INDEX_NAME}')`).catch(() => {});\n await this.db.execute(`CALL CREATE_VECTOR_INDEX('${EMBED_TABLE}', '${INDEX_NAME}', 'embedding')`);\n // Do NOT close the DB - keep connection open for searches\n }\n\n async search(queryEmbedding: number[], topK = 10): Promise<VectorHit[]> {\n const vecLiteral = `[${queryEmbedding.join(',')}]`;\n const rows = await this.db.query(\n `CALL QUERY_VECTOR_INDEX('${EMBED_TABLE}', '${INDEX_NAME}', ${vecLiteral}, ${topK}) RETURN node.id, node.name, node.kind, node.file_path, distance`,\n );\n return rows.map((r) => ({\n nodeId: String(r['node.id']),\n name: String(r['node.name']),\n kind: String(r['node.kind']),\n filePath: String(r['node.file_path']),\n score: 1 - Number(r['distance']), // cosine distance → similarity\n }));\n }\n\n async isBuilt(): Promise<boolean> {\n try {\n const rows = await this.db.query(`MATCH (n:${EMBED_TABLE}) RETURN count(n) AS cnt`);\n return Number(rows[0]?.cnt ?? 0) > 0;\n } catch {\n return false;\n }\n }\n}\n\nexport interface VectorHit {\n nodeId: string;\n name: string;\n kind: string;\n filePath: string;\n score: number; // 0..1 where 1 = most similar\n}\n\nfunction esc(s: string): string {\n return s.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\").replace(/\\n/g, '\\\\n').replace(/\\r/g, '');\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\n\nexport interface RepoEntry {\n name: string;\n path: string;\n indexedAt: string;\n stats: { nodes: number; edges: number; files: number };\n}\n\nconst GLOBAL_DIR = path.join(os.homedir(), '.code-intel');\nconst REPOS_FILE = path.join(GLOBAL_DIR, 'repos.json');\n\nexport function loadRegistry(): RepoEntry[] {\n try {\n const data = fs.readFileSync(REPOS_FILE, 'utf-8');\n return JSON.parse(data);\n } catch {\n return [];\n }\n}\n\nexport function saveRegistry(entries: RepoEntry[]): void {\n fs.mkdirSync(GLOBAL_DIR, { recursive: true });\n fs.writeFileSync(REPOS_FILE, JSON.stringify(entries, null, 2));\n}\n\nexport function upsertRepo(entry: RepoEntry): void {\n const entries = loadRegistry();\n const idx = entries.findIndex((e) => e.path === entry.path);\n if (idx >= 0) {\n entries[idx] = entry;\n } else {\n entries.push(entry);\n }\n saveRegistry(entries);\n}\n\nexport function removeRepo(repoPath: string): void {\n const entries = loadRegistry().filter((e) => e.path !== repoPath);\n saveRegistry(entries);\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nexport interface IndexMetadata {\n indexedAt: string;\n indexVersion?: string; // UUID, bumped on every successful analysis\n commitHash?: string;\n /** Parser used during analysis: 'tree-sitter' | 'regex' */\n parser?: 'tree-sitter' | 'regex';\n /** mtime (ms since epoch) for each indexed file path (relative to workspace root) */\n lastAnalyzedMtimes?: Record<string, number>;\n stats: {\n nodes: number;\n edges: number;\n files: number;\n duration: number;\n };\n}\n\nexport function saveMetadata(repoDir: string, metadata: IndexMetadata): void {\n const metaDir = path.join(repoDir, '.code-intel');\n fs.mkdirSync(metaDir, { recursive: true });\n fs.writeFileSync(path.join(metaDir, 'meta.json'), JSON.stringify(metadata, null, 2));\n}\n\nexport function loadMetadata(repoDir: string): IndexMetadata | null {\n try {\n const data = fs.readFileSync(path.join(repoDir, '.code-intel', 'meta.json'), 'utf-8');\n return JSON.parse(data);\n } catch {\n return null;\n }\n}\n\nexport function getDbPath(repoDir: string): string {\n return path.join(repoDir, '.code-intel', 'graph.db');\n}\n\nexport function getVectorDbPath(repoDir: string): string {\n return path.join(repoDir, '.code-intel', 'vector.db');\n}\n","import { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n ListResourcesRequestSchema,\n ReadResourceRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js';\nimport type { KnowledgeGraph } from '../graph/knowledge-graph.js';\nimport { textSearch } from '../search/text-search.js';\nimport { loadRegistry } from '../storage/repo-registry.js';\nimport { loadMetadata } from '../storage/metadata.js';\nimport {\n listGroups,\n loadGroup,\n saveGroup,\n loadSyncResult,\n saveSyncResult,\n} from '../multi-repo/group-registry.js';\nimport { syncGroup } from '../multi-repo/group-sync.js';\nimport { queryGroup } from '../multi-repo/group-query.js';\nimport { execSync } from 'node:child_process';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { withSpan, isTracingEnabled, sanitizeAttrs } from '../observability/tracing.js';\nimport { mcpToolCallsTotal, mcpToolDurationSeconds } from '../observability/metrics.js';\n\nexport function createMcpServer(graph: KnowledgeGraph, repoName: string, workspaceRoot?: string): Server {\n const server = new Server(\n { name: 'code-intel', version: '0.1.0' },\n { capabilities: { tools: {}, resources: {} } },\n );\n\n // ─── Tool Definitions ──────────────────────────────────────────────────────\n\n // ── Shared _token property injected into every tool schema ─────────────────\n const _tokenProp = {\n _token: { type: 'string' as const, description: 'Required if CODE_INTEL_TOKEN is configured' },\n };\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [\n // ── Core repo tools ──────────────────────────────────────────────────\n {\n name: 'repos',\n description: 'List all indexed repositories with node and edge counts',\n inputSchema: { type: 'object' as const, properties: { ..._tokenProp } },\n },\n {\n name: 'overview',\n description: 'Repository summary: total nodes/edges and a full breakdown of node and edge counts by kind. Use this first to understand the shape of the codebase.',\n inputSchema: { type: 'object' as const, properties: { ..._tokenProp } },\n },\n\n // ── Search & inspect ─────────────────────────────────────────────────\n {\n name: 'search',\n description: 'BM25 keyword search across all indexed symbols — functions, classes, files, routes, etc.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n query: { type: 'string', description: 'Search query (symbol name, keyword, or partial match)' },\n limit: { type: 'number', description: 'Max results to return (default: 20)' },\n ..._tokenProp,\n },\n required: ['query'],\n },\n },\n {\n name: 'inspect',\n description: '360° view of a symbol: definition location, callers, callees, heritage (extends/implements), members, cluster, and source preview (first 500 chars)',\n inputSchema: {\n type: 'object' as const,\n properties: {\n symbol_name: { type: 'string', description: 'Exact symbol name to inspect' },\n ..._tokenProp,\n },\n required: ['symbol_name'],\n },\n },\n {\n name: 'blast_radius',\n description: 'Impact analysis: traverse the call/import graph to find all symbols that depend on or are affected by a given symbol. Returns risk level (LOW / MEDIUM / HIGH).',\n inputSchema: {\n type: 'object' as const,\n properties: {\n target: { type: 'string', description: 'Target symbol name' },\n direction: {\n type: 'string',\n enum: ['callers', 'callees', 'both'],\n description: 'Which direction to trace — callers (who depends on it), callees (what it depends on), or both (default: both)',\n },\n max_hops: { type: 'number', description: 'Maximum traversal depth (default: 5)' },\n ..._tokenProp,\n },\n required: ['target'],\n },\n },\n {\n name: 'file_symbols',\n description: 'List all symbols defined in a specific file — useful to understand what a file exports or contains without reading raw source.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n file_path: { type: 'string', description: 'File path (partial match is supported, e.g. \"auth/login.ts\")' },\n ..._tokenProp,\n },\n required: ['file_path'],\n },\n },\n {\n name: 'find_path',\n description: 'Find the shortest call/import path between two symbols. Useful for tracing how one module reaches another.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n from: { type: 'string', description: 'Source symbol name' },\n to: { type: 'string', description: 'Target symbol name' },\n max_hops: { type: 'number', description: 'Maximum path length to search (default: 8)' },\n ..._tokenProp,\n },\n required: ['from', 'to'],\n },\n },\n {\n name: 'list_exports',\n description: 'List all exported symbols in the repository. Helps AI understand the public API surface of the codebase.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n kind: {\n type: 'string',\n description: 'Filter by node kind: function | class | interface | method | type_alias | constant | enum (optional)',\n },\n limit: { type: 'number', description: 'Max results (default: 100)' },\n ..._tokenProp,\n },\n },\n },\n\n // ── Routes, clusters, flows ──────────────────────────────────────────\n {\n name: 'routes',\n description: 'List all HTTP route handler mappings detected in the codebase (kind=route or route/handler/controller files)',\n inputSchema: { type: 'object' as const, properties: { ..._tokenProp } },\n },\n {\n name: 'clusters',\n description: 'List detected code clusters (directory-based communities) with member counts and top 10 symbols each. Useful for understanding code organisation.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n limit: { type: 'number', description: 'Max clusters to return (default: 50)' },\n ..._tokenProp,\n },\n },\n },\n {\n name: 'flows',\n description: 'List all detected execution flows — entry points traced through the call graph. Each flow has a name, entry point, and ordered steps.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n limit: { type: 'number', description: 'Max flows to return (default: 50)' },\n ..._tokenProp,\n },\n },\n },\n\n // ── Git change impact ─────────────────────────────────────────────────\n {\n name: 'detect_changes',\n description: 'Git-diff impact analysis: detects which source files and line ranges changed (HEAD vs working tree or a custom diff), maps them to graph symbols, and computes the combined blast radius. Ideal for PR review or pre-commit analysis.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n base_ref: {\n type: 'string',\n description: 'Git ref to diff against (default: HEAD). Examples: \"HEAD~1\", \"main\", a commit SHA.',\n },\n diff_text: {\n type: 'string',\n description: 'Raw unified diff text. If provided, base_ref is ignored and this diff is parsed directly.',\n },\n ..._tokenProp,\n },\n },\n },\n\n // ── Raw query ─────────────────────────────────────────────────────────\n {\n name: 'raw_query',\n description: 'Execute a simplified Cypher-like graph query. Supports: name=\\'X\\' (exact name match) or :kind (list nodes of a kind, max 50)',\n inputSchema: {\n type: 'object' as const,\n properties: {\n cypher: { type: 'string', description: \"Query string — e.g. name='runPipeline' or :function\" },\n ..._tokenProp,\n },\n required: ['cypher'],\n },\n },\n\n // ── Group / multi-repo tools ──────────────────────────────────────────\n {\n name: 'group_list',\n description: 'List all configured repository groups, or show the full membership of one group. Repository groups track multiple repos as a logical system.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n name: { type: 'string', description: 'Group name to inspect (optional — omit to list all groups)' },\n ..._tokenProp,\n },\n },\n },\n {\n name: 'group_sync',\n description: 'Extract cross-repo contracts (exports, routes, schemas, events) from every member repo in a group and detect provider→consumer links via name matching and RRF scoring.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n name: { type: 'string', description: 'Group name to sync' },\n ..._tokenProp,\n },\n required: ['name'],\n },\n },\n {\n name: 'group_contracts',\n description: 'Inspect extracted contracts and confidence-ranked cross-repo links from the last group sync. Supports filtering by kind, repo, and minimum confidence.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n name: { type: 'string', description: 'Group name' },\n kind: {\n type: 'string',\n enum: ['export', 'route', 'schema', 'event'],\n description: 'Filter by contract kind (optional)',\n },\n repo: { type: 'string', description: 'Filter by registry name (optional)' },\n min_confidence: { type: 'number', description: 'Minimum link confidence 0–1 (default: 0)' },\n ..._tokenProp,\n },\n required: ['name'],\n },\n },\n {\n name: 'group_query',\n description: 'BM25 search across all repos in a group, merged via Reciprocal Rank Fusion (RRF). Returns a unified ranked list plus per-repo breakdown.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n name: { type: 'string', description: 'Group name' },\n query: { type: 'string', description: 'Search query' },\n limit: { type: 'number', description: 'Max results per repo (default: 10)' },\n ..._tokenProp,\n },\n required: ['name', 'query'],\n },\n },\n {\n name: 'group_status',\n description: 'Check index freshness and sync staleness for all repos in a group. Flags repos that have not been indexed or are stale (>24h).',\n inputSchema: {\n type: 'object' as const,\n properties: {\n name: { type: 'string', description: 'Group name' },\n ..._tokenProp,\n },\n required: ['name'],\n },\n },\n ],\n }));\n\n // ─── Tool Handlers ─────────────────────────────────────────────────────────\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n const a = (args ?? {}) as Record<string, unknown>;\n\n // ── Token authentication ───────────────────────────────────────────────\n const expectedToken = process.env['CODE_INTEL_TOKEN'];\n if (expectedToken) {\n const providedToken = a._token;\n if (providedToken !== expectedToken) {\n return {\n content: [{ type: 'text', text: JSON.stringify({ error: 'Unauthorized: invalid or missing CODE_INTEL_TOKEN' }) }],\n isError: true,\n };\n }\n }\n\n // ── OTel span + Prometheus metrics wrapper ─────────────────────────────\n const startMs = Date.now();\n const dispatch = () => dispatchTool(name, a, graph, repoName, workspaceRoot);\n\n let result: Awaited<ReturnType<typeof dispatchTool>>;\n let status = 'success';\n try {\n if (isTracingEnabled()) {\n result = await withSpan(\n `mcp.tool.${name}`,\n sanitizeAttrs({ 'mcp.tool': name, 'mcp.repo': repoName }),\n dispatch,\n );\n } else {\n result = await dispatch();\n }\n if (result.isError) status = 'error';\n } catch (err) {\n status = 'error';\n mcpToolCallsTotal.inc({ tool: name, status });\n mcpToolDurationSeconds.observe({ tool: name }, (Date.now() - startMs) / 1000);\n throw err;\n }\n mcpToolCallsTotal.inc({ tool: name, status });\n mcpToolDurationSeconds.observe({ tool: name }, (Date.now() - startMs) / 1000);\n return result;\n });\n\n // ─── Resources ───────────────────────────────────────────────────────────────\n registerResources(server, graph, repoName);\n\n return server;\n}\n// ─── Tool dispatch (extracted for testability + OTel wrapping) ───────────────\n\ntype ToolResult = { content: { type: string; text: string }[]; isError?: boolean };\n\nasync function dispatchTool(\n name: string,\n a: Record<string, unknown>,\n graph: KnowledgeGraph,\n repoName: string,\n workspaceRoot: string | undefined,\n): Promise<ToolResult> {\n switch (name) {\n\n // ── repos ──────────────────────────────────────────────────────────────\n case 'repos': {\n const registry = loadRegistry();\n return {\n content: [{\n type: 'text',\n text: JSON.stringify(\n registry.map((r) => ({ name: r.name, path: r.path, indexedAt: r.indexedAt, stats: r.stats })),\n null, 2,\n ),\n }],\n };\n }\n\n // ── overview ───────────────────────────────────────────────────────────\n case 'overview': {\n const kindCounts: Record<string, number> = {};\n for (const node of graph.allNodes()) {\n kindCounts[node.kind] = (kindCounts[node.kind] ?? 0) + 1;\n }\n const edgeCounts: Record<string, number> = {};\n for (const edge of graph.allEdges()) {\n edgeCounts[edge.kind] = (edgeCounts[edge.kind] ?? 0) + 1;\n }\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n repo: repoName,\n stats: graph.size,\n nodeCounts: kindCounts,\n edgeCounts,\n }, null, 2),\n }],\n };\n }\n\n // ── search ─────────────────────────────────────────────────────────────\n case 'search': {\n const query = a.query as string;\n const limit = (a.limit as number) ?? 20;\n const results = textSearch(graph, query, limit);\n return { content: [{ type: 'text', text: JSON.stringify(results, null, 2) }] };\n }\n\n // ── inspect ────────────────────────────────────────────────────────────\n case 'inspect': {\n const symbolName = a.symbol_name as string;\n const node = findNodeByName(graph, symbolName);\n if (!node) return { content: [{ type: 'text', text: `Symbol \"${symbolName}\" not found. Try search first.` }] };\n\n const incoming = [...graph.findEdgesTo(node.id)];\n const outgoing = [...graph.findEdgesFrom(node.id)];\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n node: {\n id: node.id,\n kind: node.kind,\n name: node.name,\n filePath: node.filePath,\n startLine: node.startLine,\n endLine: node.endLine,\n exported: node.exported,\n },\n callers: incoming.filter((e) => e.kind === 'calls').map((e) => ({\n id: e.source, name: graph.getNode(e.source)?.name, file: graph.getNode(e.source)?.filePath,\n })),\n callees: outgoing.filter((e) => e.kind === 'calls').map((e) => ({\n id: e.target, name: graph.getNode(e.target)?.name, file: graph.getNode(e.target)?.filePath,\n })),\n imports: incoming.filter((e) => e.kind === 'imports').map((e) => graph.getNode(e.source)?.name),\n importedBy: outgoing.filter((e) => e.kind === 'imports').map((e) => graph.getNode(e.target)?.name),\n extends: outgoing.filter((e) => e.kind === 'extends').map((e) => graph.getNode(e.target)?.name),\n implements: outgoing.filter((e) => e.kind === 'implements').map((e) => graph.getNode(e.target)?.name),\n members: outgoing.filter((e) => e.kind === 'has_member').map((e) => ({\n name: graph.getNode(e.target)?.name, kind: graph.getNode(e.target)?.kind,\n })),\n cluster: incoming.filter((e) => e.kind === 'belongs_to').map((e) => graph.getNode(e.target)?.name)[0],\n content: node.content?.slice(0, 500),\n }, null, 2),\n }],\n };\n }\n\n // ── blast_radius ───────────────────────────────────────────────────────\n case 'blast_radius': {\n const target = a.target as string;\n const direction = (a.direction as string) ?? 'both';\n const maxHops = (a.max_hops as number) ?? 5;\n const node = findNodeByName(graph, target);\n if (!node) return { content: [{ type: 'text', text: `Symbol \"${target}\" not found.` }] };\n\n const affected = new Set<string>();\n const queue: { id: string; depth: number }[] = [{ id: node.id, depth: 0 }];\n const visited = new Set<string>();\n\n while (queue.length > 0) {\n const { id, depth } = queue.shift()!;\n if (visited.has(id) || depth > maxHops) continue;\n visited.add(id);\n affected.add(id);\n\n if (direction === 'callers' || direction === 'both') {\n for (const edge of graph.findEdgesTo(id)) {\n if (edge.kind === 'calls' || edge.kind === 'imports') queue.push({ id: edge.source, depth: depth + 1 });\n }\n }\n if (direction === 'callees' || direction === 'both') {\n for (const edge of graph.findEdgesFrom(id)) {\n if (edge.kind === 'calls' || edge.kind === 'imports') queue.push({ id: edge.target, depth: depth + 1 });\n }\n }\n }\n\n const affectedDetails = [...affected].map((id) => {\n const n = graph.getNode(id);\n return n ? { id, name: n.name, kind: n.kind, filePath: n.filePath } : { id };\n });\n\n const risk = affected.size > 10 ? 'HIGH' : affected.size > 5 ? 'MEDIUM' : 'LOW';\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n target: node.name,\n affectedCount: affected.size,\n riskLevel: risk,\n affected: affectedDetails,\n }, null, 2),\n }],\n };\n }\n\n // ── file_symbols ───────────────────────────────────────────────────────\n case 'file_symbols': {\n const filePath = a.file_path as string;\n const matches: { kind: string; name: string; startLine: number | undefined; exported: boolean | undefined }[] = [];\n for (const node of graph.allNodes()) {\n if (node.filePath && node.filePath.includes(filePath)) {\n matches.push({ kind: node.kind, name: node.name, startLine: node.startLine, exported: node.exported });\n }\n }\n if (matches.length === 0) {\n return { content: [{ type: 'text', text: `No symbols found for file path matching \"${filePath}\".` }] };\n }\n matches.sort((a, b) => (a.startLine ?? 0) - (b.startLine ?? 0));\n return { content: [{ type: 'text', text: JSON.stringify(matches, null, 2) }] };\n }\n\n // ── find_path ──────────────────────────────────────────────────────────\n case 'find_path': {\n const fromName = a.from as string;\n const toName = a.to as string;\n const maxHops = (a.max_hops as number) ?? 8;\n\n const fromNode = findNodeByName(graph, fromName);\n const toNode = findNodeByName(graph, toName);\n\n if (!fromNode) return { content: [{ type: 'text', text: `Source symbol \"${fromName}\" not found.` }] };\n if (!toNode) return { content: [{ type: 'text', text: `Target symbol \"${toName}\" not found.` }] };\n\n // BFS for shortest path\n type PathNode = { id: string; path: string[] };\n const queue: PathNode[] = [{ id: fromNode.id, path: [fromNode.id] }];\n const visited = new Set<string>();\n\n let foundPath: string[] | null = null;\n while (queue.length > 0) {\n const { id, path: currentPath } = queue.shift()!;\n if (visited.has(id)) continue;\n visited.add(id);\n\n if (id === toNode.id) { foundPath = currentPath; break; }\n if (currentPath.length > maxHops) continue;\n\n for (const edge of graph.findEdgesFrom(id)) {\n if ((edge.kind === 'calls' || edge.kind === 'imports') && !visited.has(edge.target)) {\n queue.push({ id: edge.target, path: [...currentPath, edge.target] });\n }\n }\n }\n\n if (!foundPath) {\n return { content: [{ type: 'text', text: `No path found from \"${fromName}\" to \"${toName}\" within ${maxHops} hops.` }] };\n }\n\n const pathDetails = foundPath.map((id) => {\n const n = graph.getNode(id);\n return n ? { id, name: n.name, kind: n.kind, filePath: n.filePath } : { id };\n });\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({ from: fromName, to: toName, hops: foundPath.length - 1, path: pathDetails }, null, 2),\n }],\n };\n }\n\n // ── list_exports ───────────────────────────────────────────────────────\n case 'list_exports': {\n const kindFilter = a.kind as string | undefined;\n const limit = (a.limit as number) ?? 100;\n const exports: { kind: string; name: string; filePath: string; startLine: number | undefined }[] = [];\n\n for (const node of graph.allNodes()) {\n if (!node.exported) continue;\n if (kindFilter && node.kind !== kindFilter) continue;\n exports.push({ kind: node.kind, name: node.name, filePath: node.filePath, startLine: node.startLine });\n if (exports.length >= limit) break;\n }\n\n return { content: [{ type: 'text', text: JSON.stringify({ total: exports.length, exports }, null, 2) }] };\n }\n\n // ── routes ─────────────────────────────────────────────────────────────\n case 'routes': {\n const routes: { name: string; filePath: string; startLine: number | undefined }[] = [];\n for (const node of graph.allNodes()) {\n if (node.kind === 'route' || (node.kind === 'function' && /route|handler|controller/i.test(node.filePath))) {\n routes.push({ name: node.name, filePath: node.filePath, startLine: node.startLine });\n }\n }\n return { content: [{ type: 'text', text: JSON.stringify(routes, null, 2) }] };\n }\n\n // ── clusters ───────────────────────────────────────────────────────────\n case 'clusters': {\n const limit = (a.limit as number) ?? 50;\n const clusters: {\n id: string;\n name: string;\n memberCount: number;\n topSymbols: { name: string; kind: string }[];\n }[] = [];\n\n for (const node of graph.allNodes()) {\n if (node.kind === 'cluster') {\n const members: { name: string; kind: string }[] = [];\n for (const edge of graph.findEdgesTo(node.id)) {\n if (edge.kind === 'belongs_to') {\n const member = graph.getNode(edge.source);\n if (member && member.kind !== 'cluster') {\n members.push({ name: member.name, kind: member.kind });\n }\n }\n }\n clusters.push({\n id: node.id,\n name: node.name,\n memberCount: (node.metadata?.memberCount as number | undefined) ?? members.length,\n topSymbols: members.slice(0, 10),\n });\n if (clusters.length >= limit) break;\n }\n }\n return { content: [{ type: 'text', text: JSON.stringify(clusters, null, 2) }] };\n }\n\n // ── flows ──────────────────────────────────────────────────────────────\n case 'flows': {\n const limit = (a.limit as number) ?? 50;\n const flows: {\n id: string;\n name: string;\n entryPoint: string | undefined;\n steps: unknown;\n stepCount: number;\n }[] = [];\n\n for (const node of graph.allNodes()) {\n if (node.kind === 'flow') {\n const steps = node.metadata?.steps as unknown[] | undefined;\n flows.push({\n id: node.id,\n name: node.name,\n entryPoint: node.metadata?.entryPoint as string | undefined,\n steps: steps ?? [],\n stepCount: Array.isArray(steps) ? steps.length : 0,\n });\n if (flows.length >= limit) break;\n }\n }\n return { content: [{ type: 'text', text: JSON.stringify(flows, null, 2) }] };\n }\n\n // ── detect_changes ─────────────────────────────────────────────────────\n case 'detect_changes': {\n const baseRef = (a.base_ref as string) ?? 'HEAD';\n const diffTextInput = a.diff_text as string | undefined;\n\n let diffText: string;\n const repoRoot = workspaceRoot ?? process.cwd();\n\n if (diffTextInput) {\n diffText = diffTextInput;\n } else {\n try {\n diffText = execSync(`git diff ${baseRef}`, { cwd: repoRoot, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] });\n if (!diffText.trim()) {\n // Fall back to staged + unstaged\n diffText = execSync(`git diff HEAD`, { cwd: repoRoot, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] });\n }\n } catch {\n return { content: [{ type: 'text', text: `Could not run git diff in ${repoRoot}. Ensure the path is a Git repository.` }] };\n }\n }\n\n if (!diffText.trim()) {\n return { content: [{ type: 'text', text: 'No changes detected in git diff.' }] };\n }\n\n // Parse unified diff → { filePath, changedLines: number[] }\n const changedFiles = parseDiff(diffText);\n\n // Map changed lines to graph nodes\n const hitNodes = new Set<string>();\n for (const { filePath: changedFile, changedLines } of changedFiles) {\n for (const node of graph.allNodes()) {\n if (!node.filePath) continue;\n // Normalize path comparison (strip repo root prefix)\n const normNode = node.filePath.replace(repoRoot + '/', '').replace(repoRoot + path.sep, '');\n const normChanged = changedFile.replace(/^a\\/|^b\\//, '');\n if (!normNode.endsWith(normChanged) && !normChanged.endsWith(normNode)) continue;\n\n if (node.startLine !== undefined && node.endLine !== undefined) {\n const overlaps = changedLines.some((l) => l >= node.startLine! && l <= node.endLine!);\n if (overlaps) hitNodes.add(node.id);\n } else if (node.startLine !== undefined) {\n const overlaps = changedLines.some((l) => Math.abs(l - node.startLine!) <= 3);\n if (overlaps) hitNodes.add(node.id);\n }\n }\n }\n\n // Compute combined blast radius from all hit nodes\n const allAffected = new Set<string>();\n for (const startId of hitNodes) {\n const queue: { id: string; depth: number }[] = [{ id: startId, depth: 0 }];\n const visited = new Set<string>();\n while (queue.length > 0) {\n const { id, depth } = queue.shift()!;\n if (visited.has(id) || depth > 5) continue;\n visited.add(id);\n allAffected.add(id);\n for (const edge of graph.findEdgesTo(id)) {\n if (edge.kind === 'calls' || edge.kind === 'imports') queue.push({ id: edge.source, depth: depth + 1 });\n }\n }\n }\n\n const changedSymbols = [...hitNodes].map((id) => {\n const n = graph.getNode(id);\n return n ? { id, name: n.name, kind: n.kind, filePath: n.filePath } : { id };\n });\n\n const affectedSymbols = [...allAffected]\n .filter((id) => !hitNodes.has(id))\n .map((id) => {\n const n = graph.getNode(id);\n return n ? { id, name: n.name, kind: n.kind, filePath: n.filePath } : { id };\n });\n\n const risk = allAffected.size > 10 ? 'HIGH' : allAffected.size > 4 ? 'MEDIUM' : 'LOW';\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n baseRef,\n changedFiles: changedFiles.map((f) => f.filePath),\n directlyChangedSymbols: changedSymbols,\n transitivelyAffectedSymbols: affectedSymbols,\n totalAffected: allAffected.size,\n riskLevel: risk,\n }, null, 2),\n }],\n };\n }\n\n // ── raw_query ──────────────────────────────────────────────────────────\n case 'raw_query': {\n const q = a.cypher as string;\n const nameMatch = q?.match(/name\\s*=\\s*['\"]([^'\"]+)['\"]/i);\n if (nameMatch) {\n const results = [];\n for (const node of graph.allNodes()) {\n if (node.name === nameMatch[1]) results.push(node);\n }\n return { content: [{ type: 'text', text: JSON.stringify(results, null, 2) }] };\n }\n const kindMatch = q?.match(/:\\s*(\\w+)/);\n if (kindMatch) {\n const results = [];\n for (const node of graph.allNodes()) {\n if (node.kind === kindMatch[1]) results.push(node);\n if (results.length >= 50) break;\n }\n return { content: [{ type: 'text', text: JSON.stringify(results, null, 2) }] };\n }\n return { content: [{ type: 'text', text: 'Query not recognized. Use name=\\'X\\' or :kind syntax.' }] };\n }\n\n // ── group_list ─────────────────────────────────────────────────────────\n case 'group_list': {\n const groupName = a.name as string | undefined;\n if (groupName) {\n const group = loadGroup(groupName);\n if (!group) return { content: [{ type: 'text', text: `Group \"${groupName}\" not found.` }] };\n return { content: [{ type: 'text', text: JSON.stringify(group, null, 2) }] };\n }\n const groups = listGroups();\n return {\n content: [{\n type: 'text',\n text: JSON.stringify(\n groups.map((g) => ({ name: g.name, createdAt: g.createdAt, lastSync: g.lastSync, memberCount: g.members.length, members: g.members })),\n null, 2,\n ),\n }],\n };\n }\n\n // ── group_sync ─────────────────────────────────────────────────────────\n case 'group_sync': {\n const groupName = a.name as string;\n const group = loadGroup(groupName);\n if (!group) return { content: [{ type: 'text', text: `Group \"${groupName}\" not found.` }] };\n if (group.members.length === 0) return { content: [{ type: 'text', text: `Group \"${groupName}\" has no members.` }] };\n\n const result = await syncGroup(group);\n saveSyncResult(result);\n group.lastSync = result.syncedAt;\n saveGroup(group);\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n groupName: result.groupName,\n syncedAt: result.syncedAt,\n memberCount: result.memberCount,\n contractCount: result.contracts.length,\n linkCount: result.links.length,\n topLinks: result.links.slice(0, 20),\n }, null, 2),\n }],\n };\n }\n\n // ── group_contracts ────────────────────────────────────────────────────\n case 'group_contracts': {\n const groupName = a.name as string;\n const kindFilter = a.kind as string | undefined;\n const repoFilter = a.repo as string | undefined;\n const minConf = (a.min_confidence as number) ?? 0;\n\n const result = loadSyncResult(groupName);\n if (!result) return { content: [{ type: 'text', text: `No sync data for group \"${groupName}\". Run group_sync first.` }] };\n\n let contracts = result.contracts;\n if (kindFilter) contracts = contracts.filter((c) => c.kind === kindFilter);\n if (repoFilter) contracts = contracts.filter((c) => c.repoName === repoFilter);\n\n let links = result.links.filter((l) => l.confidence >= minConf);\n if (repoFilter) links = links.filter((l) => l.providerRepo === repoFilter || l.consumerRepo === repoFilter);\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({ syncedAt: result.syncedAt, contracts, links }, null, 2),\n }],\n };\n }\n\n // ── group_query ────────────────────────────────────────────────────────\n case 'group_query': {\n const groupName = a.name as string;\n const query = a.query as string;\n const limit = (a.limit as number) ?? 10;\n\n const group = loadGroup(groupName);\n if (!group) return { content: [{ type: 'text', text: `Group \"${groupName}\" not found.` }] };\n\n const { perRepo, merged } = await queryGroup(group, query, limit);\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({ query, merged, perRepo }, null, 2),\n }],\n };\n }\n\n // ── group_status ───────────────────────────────────────────────────────\n case 'group_status': {\n const groupName = a.name as string;\n const group = loadGroup(groupName);\n if (!group) return { content: [{ type: 'text', text: `Group \"${groupName}\" not found.` }] };\n\n const registry = loadRegistry();\n const now = Date.now();\n\n const memberStatus = group.members.map((m) => {\n const regEntry = registry.find((r) => r.name === m.registryName);\n if (!regEntry) return { groupPath: m.groupPath, registryName: m.registryName, status: 'NOT_IN_REGISTRY' };\n\n const meta = loadMetadata(regEntry.path);\n if (!meta) return { groupPath: m.groupPath, registryName: m.registryName, repoPath: regEntry.path, status: 'NOT_INDEXED' };\n\n const ageMin = Math.round((now - new Date(meta.indexedAt).getTime()) / 60000);\n const stale = ageMin > 1440;\n return {\n groupPath: m.groupPath,\n registryName: m.registryName,\n repoPath: regEntry.path,\n indexedAt: meta.indexedAt,\n ageMinutes: ageMin,\n status: stale ? 'STALE' : 'OK',\n stats: meta.stats,\n };\n });\n\n const syncAge = group.lastSync\n ? Math.round((now - new Date(group.lastSync).getTime()) / 60000)\n : null;\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n group: groupName,\n lastSync: group.lastSync ?? null,\n syncAgeMinutes: syncAge,\n members: memberStatus,\n }, null, 2),\n }],\n };\n }\n\n default:\n return { content: [{ type: 'text', text: `Unknown tool: ${name}` }] };\n }\n}\n\n// ─── Resources section returns to createMcpServer via separate call ──────────\n// The Resources handlers need to be registered inside createMcpServer.\n// (See below where we call registerResources(server, graph, repoName).)\n\nfunction registerResources(server: Server, graph: KnowledgeGraph, repoName: string): void {\n server.setRequestHandler(ListResourcesRequestSchema, async () => ({\n resources: [\n { uri: `codeintel://repo/${repoName}/overview`, name: `${repoName} Overview`, mimeType: 'application/json' },\n { uri: `codeintel://repo/${repoName}/clusters`, name: `${repoName} Clusters`, mimeType: 'application/json' },\n { uri: `codeintel://repo/${repoName}/flows`, name: `${repoName} Flows`, mimeType: 'application/json' },\n ],\n }));\n\n server.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n const { uri } = request.params;\n\n if (uri.endsWith('/overview')) {\n const kindCounts: Record<string, number> = {};\n for (const node of graph.allNodes()) {\n kindCounts[node.kind] = (kindCounts[node.kind] ?? 0) + 1;\n }\n return { contents: [{ uri, mimeType: 'application/json', text: JSON.stringify({ repo: repoName, stats: graph.size, nodeCounts: kindCounts }) }] };\n }\n\n if (uri.endsWith('/clusters')) {\n const clusters = [];\n for (const node of graph.allNodes()) {\n if (node.kind === 'cluster') clusters.push({ id: node.id, name: node.name, memberCount: node.metadata?.memberCount });\n }\n return { contents: [{ uri, mimeType: 'application/json', text: JSON.stringify(clusters) }] };\n }\n\n if (uri.endsWith('/flows')) {\n const flows = [];\n for (const node of graph.allNodes()) {\n if (node.kind === 'flow') flows.push({ id: node.id, name: node.name, steps: node.metadata?.steps, entryPoint: node.metadata?.entryPoint });\n }\n return { contents: [{ uri, mimeType: 'application/json', text: JSON.stringify(flows) }] };\n }\n\n throw new Error(`Unknown resource: ${uri}`);\n });\n}\n\nexport async function startMcpStdio(graph: KnowledgeGraph, repoName: string, workspaceRoot?: string): Promise<void> {\n if (process.env['CODE_INTEL_TOKEN']) {\n process.stderr.write('[code-intel] CODE_INTEL_TOKEN is configured — all tool calls must include { \"_token\": \"<value>\" } in their arguments.\\n');\n }\n const server = createMcpServer(graph, repoName, workspaceRoot);\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n\n// ─── Helpers ───────────────────────────────────────────────────────────────────\n\nfunction findNodeByName(graph: KnowledgeGraph, name: string) {\n for (const node of graph.allNodes()) {\n if (node.name === name) return node;\n }\n return undefined;\n}\n\n/**\n * Parse a unified diff text and return a list of changed files with their\n * changed line numbers (new-file side, i.e. \"+\" lines).\n */\nfunction parseDiff(diffText: string): { filePath: string; changedLines: number[] }[] {\n const result: { filePath: string; changedLines: number[] }[] = [];\n let currentFile: string | null = null;\n let currentNewLine = 0;\n const changedLinesMap = new Map<string, number[]>();\n\n for (const raw of diffText.split('\\n')) {\n // diff --git a/src/foo.ts b/src/foo.ts OR +++ b/src/foo.ts\n const fileMatch = raw.match(/^\\+\\+\\+ b\\/(.+)/);\n if (fileMatch) {\n currentFile = fileMatch[1];\n if (!changedLinesMap.has(currentFile)) changedLinesMap.set(currentFile, []);\n continue;\n }\n\n // @@ -oldStart,oldLen +newStart,newLen @@\n const hunkMatch = raw.match(/^@@ -\\d+(?:,\\d+)? \\+(\\d+)(?:,\\d+)? @@/);\n if (hunkMatch) {\n currentNewLine = parseInt(hunkMatch[1], 10);\n continue;\n }\n\n if (!currentFile) continue;\n\n if (raw.startsWith('+') && !raw.startsWith('+++')) {\n changedLinesMap.get(currentFile)!.push(currentNewLine);\n currentNewLine++;\n } else if (raw.startsWith('-') && !raw.startsWith('---')) {\n // deleted line: don't advance new-side line counter\n } else if (!raw.startsWith('\\\\')) {\n currentNewLine++;\n }\n }\n\n for (const [filePath, changedLines] of changedLinesMap) {\n result.push({ filePath, changedLines });\n }\n return result;\n}\n","import { Database, Connection } from '@ladybugdb/core';\nimport path from 'node:path';\nimport fs from 'node:fs';\n\nexport class DbManager {\n private db: InstanceType<typeof Database> | null = null;\n private conn: InstanceType<typeof Connection> | null = null;\n private dbPath: string;\n\n constructor(dbPath: string) {\n this.dbPath = dbPath;\n }\n\n async init(): Promise<void> {\n fs.mkdirSync(path.dirname(this.dbPath), { recursive: true });\n this.db = new Database(this.dbPath);\n await this.db.init();\n this.conn = new Connection(this.db);\n await this.conn.init();\n }\n\n async query(cypher: string): Promise<Record<string, unknown>[]> {\n if (!this.conn) throw new Error('Database not initialized');\n const result = await this.conn.query(cypher);\n const qr = Array.isArray(result) ? result[0] : result;\n const rows = await qr.getAll();\n qr.close();\n return rows as Record<string, unknown>[];\n }\n\n async execute(cypher: string): Promise<void> {\n if (!this.conn) throw new Error('Database not initialized');\n const result = await this.conn.query(cypher);\n const qr = Array.isArray(result) ? result[0] : result;\n qr.close();\n }\n\n close(): void {\n // Use closeSync() so the DB flushes/checkpoints to disk before returning.\n // Calling the async close() without await causes a 60-90s delay at process\n // exit as Node waits for the pending flush promises to resolve.\n try {\n this.conn?.closeSync();\n } catch { /* ignore */ }\n try {\n this.db?.closeSync();\n } catch { /* ignore */ }\n this.conn = null;\n this.db = null;\n }\n\n get isOpen(): boolean {\n return this.conn !== null;\n }\n}\n","import type { NodeKind } from '../shared/index.js';\n\nexport const NODE_TABLE_MAP: Record<NodeKind, string> = {\n file: 'file_nodes',\n directory: 'dir_nodes',\n function: 'func_nodes',\n class: 'class_nodes',\n interface: 'iface_nodes',\n method: 'method_nodes',\n constructor: 'ctor_nodes',\n variable: 'var_nodes',\n property: 'prop_nodes',\n struct: 'struct_nodes',\n enum: 'enum_nodes',\n trait: 'trait_nodes',\n namespace: 'ns_nodes',\n module: 'mod_nodes',\n type_alias: 'type_nodes',\n constant: 'const_nodes',\n route: 'route_nodes',\n cluster: 'cluster_nodes',\n flow: 'flow_nodes',\n};\n\nexport const ALL_NODE_TABLES = [...new Set(Object.values(NODE_TABLE_MAP))];\n\nexport function getCreateNodeTableDDL(tableName: string): string {\n return `CREATE NODE TABLE IF NOT EXISTS ${tableName} (\n id STRING,\n name STRING,\n file_path STRING,\n start_line INT64,\n end_line INT64,\n exported BOOLEAN,\n content STRING,\n metadata STRING,\n PRIMARY KEY (id)\n)`;\n}\n\nexport function getCreateEdgeTableDDL(): string[] {\n const uniqueTables = ALL_NODE_TABLES;\n\n // Create edge table group connecting all node table pairs.\n // REL TABLE GROUP supports multiple FROM-TO pairs without duplicate errors,\n // and allows per-pair COPY: COPY code_edges FROM '...' (HEADER=TRUE, FROM='x', TO='y')\n const fromToPairs: string[] = [];\n for (const from of uniqueTables) {\n for (const to of uniqueTables) {\n fromToPairs.push(`FROM ${from} TO ${to}`);\n }\n }\n\n return [`CREATE REL TABLE GROUP IF NOT EXISTS code_edges (\n ${fromToPairs.join(',\\n ')},\n kind STRING,\n weight DOUBLE,\n label STRING\n)`];\n}\n","/**\n * graph-from-db.ts\n * Loads a KnowledgeGraph from a persisted LadybugDB graph.db.\n * Used by group-sync to read each repo's index without re-analyzing.\n */\nimport type { KnowledgeGraph } from '../graph/knowledge-graph.js';\nimport { DbManager } from '../storage/db-manager.js';\nimport { ALL_NODE_TABLES, NODE_TABLE_MAP } from '../storage/schema.js';\nimport type { CodeNode, CodeEdge, NodeKind, EdgeKind } from '../shared/index.js';\n\n// Reverse map: tableName → NodeKind\nconst TABLE_TO_KIND: Record<string, NodeKind> = Object.fromEntries(\n Object.entries(NODE_TABLE_MAP).map(([kind, table]) => [table, kind as NodeKind]),\n);\n\nfunction parseRow(row: Record<string, unknown>, kind: NodeKind): CodeNode {\n return {\n id: String(row['id'] ?? ''),\n kind,\n name: String(row['name'] ?? ''),\n filePath: String(row['file_path'] ?? ''),\n startLine: row['start_line'] != null ? Number(row['start_line']) : undefined,\n endLine: row['end_line'] != null ? Number(row['end_line']) : undefined,\n exported: row['exported'] != null ? Boolean(row['exported']) : undefined,\n content: row['content'] ? String(row['content']) : undefined,\n metadata: row['metadata'] ? (() => {\n try { return JSON.parse(String(row['metadata'])) as Record<string, unknown>; } catch { return undefined; }\n })() : undefined,\n };\n}\n\nexport async function loadGraphFromDB(\n graph: KnowledgeGraph,\n db: DbManager,\n): Promise<void> {\n // Load all node tables\n for (const table of ALL_NODE_TABLES) {\n const kind = TABLE_TO_KIND[table];\n if (!kind) continue;\n let rows: Record<string, unknown>[] = [];\n try {\n rows = await db.query(`MATCH (n:${table}) RETURN n.id, n.name, n.file_path, n.start_line, n.end_line, n.exported, n.content, n.metadata`);\n } catch {\n // table may not exist in older DBs\n continue;\n }\n for (const row of rows) {\n // kuzu returns column names as aliases\n const node = parseRow({\n id: row['n.id'],\n name: row['n.name'],\n file_path: row['n.file_path'],\n start_line: row['n.start_line'],\n end_line: row['n.end_line'],\n exported: row['n.exported'],\n content: row['n.content'],\n metadata: row['n.metadata'],\n }, kind);\n if (node.id && node.name) graph.addNode(node);\n }\n }\n\n // Load edges\n try {\n const edgeRows = await db.query(\n `MATCH (a)-[e:code_edges]->(b) RETURN a.id, b.id, e.kind, e.weight, e.label`,\n );\n for (const row of edgeRows) {\n const sourceId = String(row['a.id'] ?? '');\n const targetId = String(row['b.id'] ?? '');\n const kind = String(row['e.kind'] ?? '') as EdgeKind;\n if (!sourceId || !targetId || !kind) continue;\n const edge: CodeEdge = {\n id: `${sourceId}::${kind}::${targetId}`,\n source: sourceId,\n target: targetId,\n kind,\n weight: row['e.weight'] != null ? Number(row['e.weight']) : undefined,\n label: row['e.label'] ? String(row['e.label']) : undefined,\n };\n graph.addEdge(edge);\n }\n } catch {\n // edges table may not exist in older DBs\n }\n}\n","/**\n * group-sync.ts\n * Loads each member repo's knowledge graph from its .code-intel/graph.db,\n * extracts contracts (exports, routes, events, schemas), and matches them\n * across repos to produce ContractLinks.\n */\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport type { RepoGroup, Contract, ContractLink, GroupSyncResult } from './types.js';\nimport { loadRegistry } from '../storage/repo-registry.js';\nimport { DbManager } from '../storage/db-manager.js';\nimport { createKnowledgeGraph, type KnowledgeGraph } from '../graph/knowledge-graph.js';\nimport { loadGraphFromDB } from './graph-from-db.js';\nimport Logger from '../shared/logger.js';\n\n// ─── Extract contracts from a single repo's graph ────────────────────────────\n\nfunction extractContracts(\n graph: KnowledgeGraph,\n repoName: string,\n repoPath: string,\n): Contract[] {\n const contracts: Contract[] = [];\n\n for (const node of graph.allNodes()) {\n // exported symbols → 'export' contracts\n if (\n node.exported === true &&\n ['function', 'class', 'interface', 'method', 'type_alias', 'constant', 'enum', 'struct', 'trait'].includes(node.kind)\n ) {\n contracts.push({\n repoName,\n repoPath,\n kind: 'export',\n name: node.name,\n nodeId: node.id,\n nodeKind: node.kind,\n filePath: node.filePath,\n signature: node.content?.split('\\n')[0]?.trim(),\n });\n }\n\n // route nodes → 'route' contracts\n if (node.kind === 'route') {\n contracts.push({\n repoName,\n repoPath,\n kind: 'route',\n name: node.name,\n nodeId: node.id,\n nodeKind: node.kind,\n filePath: node.filePath,\n signature: node.content?.split('\\n')[0]?.trim(),\n });\n }\n\n // interfaces / type aliases with \"event\" or \"schema\" in name → schema/event contracts\n if (['interface', 'type_alias'].includes(node.kind)) {\n const nameLower = node.name.toLowerCase();\n if (nameLower.includes('event') || nameLower.includes('message')) {\n contracts.push({\n repoName,\n repoPath,\n kind: 'event',\n name: node.name,\n nodeId: node.id,\n nodeKind: node.kind,\n filePath: node.filePath,\n });\n } else if (nameLower.includes('schema') || nameLower.includes('dto') || nameLower.includes('request') || nameLower.includes('response')) {\n contracts.push({\n repoName,\n repoPath,\n kind: 'schema',\n name: node.name,\n nodeId: node.id,\n nodeKind: node.kind,\n filePath: node.filePath,\n });\n }\n }\n }\n\n return contracts;\n}\n\n// ─── Match contracts across repos ────────────────────────────────────────────\n\nfunction matchContracts(allContracts: Contract[]): ContractLink[] {\n const links: ContractLink[] = [];\n\n // Group contracts by repo\n const byRepo = new Map<string, Contract[]>();\n for (const c of allContracts) {\n const arr = byRepo.get(c.repoName) ?? [];\n arr.push(c);\n byRepo.set(c.repoName, arr);\n }\n\n const repoNames = [...byRepo.keys()];\n\n for (let i = 0; i < repoNames.length; i++) {\n for (let j = 0; j < repoNames.length; j++) {\n if (i === j) continue;\n const providerContracts = byRepo.get(repoNames[i])!;\n const consumerContracts = byRepo.get(repoNames[j])!;\n\n // Build a name map for the consumer\n const consumerByName = new Map<string, Contract>();\n for (const c of consumerContracts) consumerByName.set(c.name, c);\n\n for (const provider of providerContracts) {\n const consumer = consumerByName.get(provider.name);\n if (consumer) {\n // same-kind matches are more confident\n const sameKind = provider.kind === consumer.kind;\n links.push({\n providerRepo: provider.repoName,\n providerContract: provider.name,\n consumerRepo: consumer.repoName,\n consumerContract: consumer.name,\n matchKind: provider.kind === 'route' ? 'route-match' : 'name-match',\n confidence: sameKind ? 0.9 : 0.6,\n });\n } else {\n // partial-name match (camelCase contained)\n const providerLC = provider.name.toLowerCase();\n for (const c of consumerContracts) {\n if (c.name.toLowerCase().includes(providerLC) || providerLC.includes(c.name.toLowerCase())) {\n if (c.name.length >= 4 && provider.name.length >= 4) {\n links.push({\n providerRepo: provider.repoName,\n providerContract: provider.name,\n consumerRepo: c.repoName,\n consumerContract: c.name,\n matchKind: 'name-match',\n confidence: 0.4,\n });\n }\n }\n }\n }\n }\n }\n }\n\n // Deduplicate: keep highest-confidence for a given (pRepo, pContract, cRepo) triple\n const seen = new Map<string, ContractLink>();\n for (const link of links) {\n const key = `${link.providerRepo}:${link.providerContract}:${link.consumerRepo}:${link.consumerContract}`;\n const existing = seen.get(key);\n if (!existing || link.confidence > existing.confidence) {\n seen.set(key, link);\n }\n }\n\n return [...seen.values()].sort((a, b) => b.confidence - a.confidence);\n}\n\n// ─── Main sync function ───────────────────────────────────────────────────────\n\nexport async function syncGroup(group: RepoGroup): Promise<GroupSyncResult> {\n const registry = loadRegistry();\n const allContracts: Contract[] = [];\n\n for (const member of group.members) {\n // Resolve the actual repo path from the registry\n const regEntry = registry.find((r) => r.name === member.registryName);\n if (!regEntry) {\n Logger.warn(` ⚠ Registry entry \"${member.registryName}\" not found — skipping ${member.groupPath}`);\n continue;\n }\n\n const dbPath = path.join(regEntry.path, '.code-intel', 'graph.db');\n if (!fs.existsSync(dbPath)) {\n Logger.warn(` ⚠ No index at ${dbPath} — run \\`code-intel analyze ${regEntry.path}\\` first`);\n continue;\n }\n\n const graph = createKnowledgeGraph();\n const db = new DbManager(dbPath);\n try {\n await db.init();\n await loadGraphFromDB(graph, db);\n db.close();\n } catch (err) {\n db.close();\n Logger.warn(` ⚠ Could not load graph for \"${member.registryName}\": ${err instanceof Error ? err.message : err}`);\n continue;\n }\n\n const contracts = extractContracts(graph, member.registryName, regEntry.path);\n Logger.info(` ✓ ${member.registryName} (${member.groupPath}): ${contracts.length} contracts`);\n allContracts.push(...contracts);\n }\n\n const links = matchContracts(allContracts);\n\n return {\n groupName: group.name,\n syncedAt: new Date().toISOString(),\n memberCount: group.members.length,\n contracts: allContracts,\n links,\n };\n}\n","/**\n * group-query.ts\n * Search execution flows across all repos in a group.\n * Loads each repo's graph, runs text search, and merges via RRF.\n */\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport type { RepoGroup } from './types.js';\nimport type { SearchResult } from '../search/text-search.js';\nimport { textSearch, reciprocalRankFusion } from '../search/text-search.js';\nimport { loadRegistry } from '../storage/repo-registry.js';\nimport { DbManager } from '../storage/db-manager.js';\nimport { createKnowledgeGraph } from '../graph/knowledge-graph.js';\nimport { loadGraphFromDB } from './graph-from-db.js';\n\nexport interface GroupQueryResult {\n repoName: string;\n repoPath: string;\n groupPath: string;\n results: SearchResult[];\n}\n\nexport async function queryGroup(\n group: RepoGroup,\n query: string,\n limit = 20,\n): Promise<{ perRepo: GroupQueryResult[]; merged: SearchResult[] }> {\n const registry = loadRegistry();\n const perRepo: GroupQueryResult[] = [];\n const allRankings: SearchResult[][] = [];\n\n for (const member of group.members) {\n const regEntry = registry.find((r) => r.name === member.registryName);\n if (!regEntry) continue;\n\n const dbPath = path.join(regEntry.path, '.code-intel', 'graph.db');\n if (!fs.existsSync(dbPath)) continue;\n\n const graph = createKnowledgeGraph();\n const db = new DbManager(dbPath);\n try {\n await db.init();\n await loadGraphFromDB(graph, db);\n db.close();\n } catch {\n db.close();\n continue;\n }\n\n const results = textSearch(graph, query, limit);\n // Tag each result with repo info via snippet prefix\n const taggedResults: SearchResult[] = results.map((r) => ({\n ...r,\n snippet: `[${member.registryName}] ${r.snippet ?? ''}`.trim(),\n }));\n\n perRepo.push({\n repoName: member.registryName,\n repoPath: regEntry.path,\n groupPath: member.groupPath,\n results: taggedResults,\n });\n allRankings.push(taggedResults);\n }\n\n const merged = reciprocalRankFusion(...allRankings).slice(0, limit);\n return { perRepo, merged };\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport type { CodeNode, CodeEdge } from '../shared/index.js';\nimport type { KnowledgeGraph } from '../graph/knowledge-graph.js';\nimport { NODE_TABLE_MAP } from './schema.js';\n\n/**\n * Write per-node-table CSV files synchronously.\n * Returns a Map of tableName → absolute file path.\n *\n * Content and metadata fields have actual newlines escaped to the 2-char\n * sequence `\\n` (backslash + n) before writing. This avoids LadybugDB's\n * PARALLEL=FALSE CSV reader bug where quoted fields spanning multiple lines\n * are mis-parsed when they contain no `\"\"` escapes — causing \"expected N\n * values per row, but got N-1\" errors for code with embedded newlines.\n */\nexport function writeNodeCSVs(graph: KnowledgeGraph, outputDir: string): Map<string, string> {\n fs.mkdirSync(outputDir, { recursive: true });\n\n const header = 'id,name,file_path,start_line,end_line,exported,content,metadata\\n';\n const tableBuffers = new Map<string, string[]>();\n const tableFilePaths = new Map<string, string>();\n\n for (const node of graph.allNodes()) {\n const table = NODE_TABLE_MAP[node.kind];\n if (!tableBuffers.has(table)) {\n tableBuffers.set(table, [header]);\n tableFilePaths.set(table, path.join(outputDir, `${table}.csv`));\n }\n tableBuffers.get(table)!.push(\n csvRow([\n node.id,\n node.name,\n node.filePath,\n String(node.startLine ?? ''),\n String(node.endLine ?? ''),\n String(node.exported ?? false),\n // Escape embedded newlines so the CSV never contains multi-line\n // quoted fields. LadybugDB PARALLEL=FALSE has a bug where it\n // mis-parses quoted fields with embedded newlines that contain no\n // internal \"\" sequences (treating them as truncated records).\n escapeNewlines((node.content ?? '').slice(0, 1000)),\n node.metadata ? escapeNewlines(JSON.stringify(node.metadata)) : '',\n ]) + '\\n',\n );\n }\n\n for (const [table, lines] of tableBuffers) {\n fs.writeFileSync(tableFilePaths.get(table)!, lines.join(''), 'utf-8');\n }\n\n return tableFilePaths;\n}\n\nexport interface EdgeCSVGroup {\n fromTable: string;\n toTable: string;\n filePath: string;\n}\n\n/**\n * Write per-edge-group CSV files synchronously.\n * Returns an array of EdgeCSVGroup descriptors.\n */\nexport function writeEdgeCSV(graph: KnowledgeGraph, outputDir: string): EdgeCSVGroup[] {\n fs.mkdirSync(outputDir, { recursive: true });\n\n const header = 'from_id,to_id,kind,weight,label\\n';\n const groups = new Map<string, { lines: string[]; from: string; to: string; filePath: string }>();\n\n for (const edge of graph.allEdges()) {\n const sourceNode = graph.getNode(edge.source);\n const targetNode = graph.getNode(edge.target);\n if (!sourceNode || !targetNode) continue;\n\n const fromTable = NODE_TABLE_MAP[sourceNode.kind];\n const toTable = NODE_TABLE_MAP[targetNode.kind];\n const key = `${fromTable}->${toTable}`;\n\n if (!groups.has(key)) {\n const filePath = path.join(outputDir, `edges_${fromTable}_${toTable}.csv`);\n groups.set(key, { lines: [header], from: fromTable, to: toTable, filePath });\n }\n\n groups.get(key)!.lines.push(\n csvRow([\n edge.source,\n edge.target,\n edge.kind,\n String(edge.weight ?? 1.0),\n edge.label ?? '',\n ]) + '\\n',\n );\n }\n\n const result: EdgeCSVGroup[] = [];\n for (const group of groups.values()) {\n fs.writeFileSync(group.filePath, group.lines.join(''), 'utf-8');\n result.push({ fromTable: group.from, toTable: group.to, filePath: group.filePath });\n }\n\n return result;\n}\n\nfunction csvRow(fields: string[]): string {\n return fields.map((f) => {\n if (f.includes(',') || f.includes('\"') || f.includes('\\n')) {\n return '\"' + f.replace(/\"/g, '\"\"') + '\"';\n }\n return f;\n }).join(',');\n}\n\n/**\n * Escape literal newlines (LF and CR) to the two-character sequences `\\n`\n * and `\\r`. This prevents multi-line quoted CSV fields, which LadybugDB's\n * sequential CSV reader (PARALLEL=FALSE) mis-parses under certain conditions:\n * if a quoted field contains a raw newline but no `\"\"` sequences the reader\n * occasionally treats the line break as a record separator and produces\n * \"expected N values per row, but got N-1\" errors.\n *\n * Callers that need to read the value back can unescape with:\n * value.replace(/\\\\n/g, '\\n').replace(/\\\\r/g, '\\r')\n */\nfunction escapeNewlines(s: string): string {\n // Only do the work when actually needed — avoids churning the string\n // for the common case (short names, file paths, metadata without newlines).\n if (!s.includes('\\n') && !s.includes('\\r')) return s;\n return s.replace(/\\r/g, '\\\\r').replace(/\\n/g, '\\\\n');\n}\n","import fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport type { KnowledgeGraph } from '../graph/knowledge-graph.js';\nimport { DbManager } from './db-manager.js';\nimport { ALL_NODE_TABLES, getCreateNodeTableDDL, getCreateEdgeTableDDL, NODE_TABLE_MAP } from './schema.js';\nimport type { CodeNode } from '../shared/index.js';\nimport { writeNodeCSVs, writeEdgeCSV } from './csv-writer.js';\n\n// ─── loadGraphToDB — bulk CSV COPY (fast path) ────────────────────────────────\n\n/**\n * Load graph into DB using bulk CSV COPY — dramatically faster than\n * individual CREATE statements (10-100× speedup for large repos).\n *\n * Strategy:\n * 1. Create tables\n * 2. Write all nodes to per-table CSV files in a temp dir\n * 3. Write all edges to per-fromTable→toTable CSV files\n * 4. COPY each CSV file into the corresponding table\n * 5. Clean up temp dir\n *\n * Falls back to individual CREATE statements per table if COPY fails.\n */\nexport async function loadGraphToDB(\n graph: KnowledgeGraph,\n dbManager: DbManager,\n): Promise<{ nodeCount: number; edgeCount: number }> {\n // Create all node tables\n for (const table of ALL_NODE_TABLES) {\n await dbManager.execute(getCreateNodeTableDDL(table));\n }\n\n // Create edge table\n const edgeDDLs = getCreateEdgeTableDDL();\n for (const ddl of edgeDDLs) {\n try {\n await dbManager.execute(ddl);\n } catch {\n // Edge table with all pairs might fail — ignore\n }\n }\n\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'code-intel-csv-'));\n\n try {\n // ── Write CSVs (synchronous) ────────────────────────────────────────────\n const nodeTableFiles = writeNodeCSVs(graph, tmpDir);\n const edgeGroups = writeEdgeCSV(graph, tmpDir);\n\n // Pre-compute per-table node counts and per-group edge counts from the in-memory graph.\n const tableNodeCounts = new Map<string, number>();\n for (const node of graph.allNodes()) {\n const t = NODE_TABLE_MAP[node.kind];\n tableNodeCounts.set(t, (tableNodeCounts.get(t) ?? 0) + 1);\n }\n const edgeGroupCounts = new Map<string, number>();\n for (const edge of graph.allEdges()) {\n const src = graph.getNode(edge.source);\n const tgt = graph.getNode(edge.target);\n if (!src || !tgt) continue;\n const key = `${NODE_TABLE_MAP[src.kind]}->${NODE_TABLE_MAP[tgt.kind]}`;\n edgeGroupCounts.set(key, (edgeGroupCounts.get(key) ?? 0) + 1);\n }\n\n // ── COPY nodes ──────────────────────────────────────────────────────────\n // PARALLEL=FALSE is required because node `content` fields contain real source\n // code with embedded newlines, which the parallel CSV reader does not support.\n // Newlines are escaped to \\n literals in the CSV (see csv-writer.ts) to prevent\n // LadybugDB's sequential reader from mis-parsing quoted multi-line fields.\n let nodeCount = 0;\n for (const [table, csvPath] of nodeTableFiles) {\n if (!fs.existsSync(csvPath)) continue;\n const stat = fs.statSync(csvPath);\n // Skip empty CSV files (only header line ≈ <50 bytes)\n if (stat.size < 50) continue;\n try {\n await dbManager.execute(\n `COPY ${table} FROM '${csvPath.replace(/\\\\/g, '/')}' (HEADER=TRUE, PARALLEL=FALSE)`,\n );\n nodeCount += tableNodeCounts.get(table) ?? 0;\n } catch {\n // Fall back to individual inserts for this table\n nodeCount += await loadTableFallback(graph, table, dbManager);\n }\n }\n\n // ── COPY edges ──────────────────────────────────────────────────────────\n let edgeCount = 0;\n for (const group of edgeGroups) {\n if (!fs.existsSync(group.filePath)) continue;\n const stat = fs.statSync(group.filePath);\n if (stat.size < 50) continue;\n try {\n await dbManager.execute(\n `COPY code_edges FROM '${group.filePath.replace(/\\\\/g, '/')}' (HEADER=TRUE, PARALLEL=FALSE, FROM='${group.fromTable}', TO='${group.toTable}')`,\n );\n edgeCount += edgeGroupCounts.get(`${group.fromTable}->${group.toTable}`) ?? 0;\n } catch {\n // Fall back to per-edge inserts for this group\n edgeCount += await loadEdgeGroupFallback(graph, group.fromTable, group.toTable, dbManager);\n }\n }\n\n return { nodeCount, edgeCount };\n } finally {\n try { fs.rmSync(tmpDir, { recursive: true, force: true }); } catch { /* ignore */ }\n }\n}\n\n// ─── Fallback helpers ─────────────────────────────────────────────────────────\n\nasync function loadTableFallback(\n graph: KnowledgeGraph,\n table: string,\n dbManager: DbManager,\n): Promise<number> {\n let count = 0;\n for (const node of graph.allNodes()) {\n if (NODE_TABLE_MAP[node.kind] !== table) continue;\n const props = buildNodeProps(node);\n try {\n await dbManager.execute(`CREATE (:${table} ${props})`);\n count++;\n } catch { /* skip duplicate */ }\n }\n return count;\n}\n\nasync function loadEdgeGroupFallback(\n graph: KnowledgeGraph,\n fromTable: string,\n toTable: string,\n dbManager: DbManager,\n): Promise<number> {\n let count = 0;\n for (const edge of graph.allEdges()) {\n const sourceNode = graph.getNode(edge.source);\n const targetNode = graph.getNode(edge.target);\n if (!sourceNode || !targetNode) continue;\n if (NODE_TABLE_MAP[sourceNode.kind] !== fromTable) continue;\n if (NODE_TABLE_MAP[targetNode.kind] !== toTable) continue;\n try {\n await dbManager.execute(\n `MATCH (a:${fromTable} {id: '${escCypher(edge.source)}'}), (b:${toTable} {id: '${escCypher(edge.target)}'}) ` +\n `CREATE (a)-[:code_edges {kind: '${edge.kind}', weight: ${edge.weight ?? 1.0}, label: '${escCypher(edge.label ?? '')}'}]->(b)`,\n );\n count++;\n } catch { /* skip */ }\n }\n return count;\n}\n\n// ─── Upsert helpers (incremental indexing) ────────────────────────────────────\n\n/**\n * Upsert a single node: DELETE existing node with same id then re-CREATE.\n * KùzuDB does not have MERGE, so we simulate it with DELETE + CREATE.\n */\nexport async function upsertNode(node: CodeNode, dbManager: DbManager): Promise<void> {\n const table = NODE_TABLE_MAP[node.kind];\n const props = buildNodeProps(node);\n try {\n await dbManager.execute(`MATCH (n:${table} {id: '${escCypher(node.id)}'}) DELETE n`);\n } catch { /* Node may not exist — ignore */ }\n try {\n await dbManager.execute(`CREATE (:${table} ${props})`);\n } catch { /* Skip on error */ }\n}\n\n/**\n * Upsert a batch of nodes (max 100 per transaction for performance).\n */\nexport async function upsertNodes(nodes: CodeNode[], dbManager: DbManager): Promise<number> {\n let count = 0;\n const BATCH = 100;\n for (let i = 0; i < nodes.length; i += BATCH) {\n const batch = nodes.slice(i, i + BATCH);\n await Promise.all(batch.map((n) => upsertNode(n, dbManager)));\n count += batch.length;\n }\n return count;\n}\n\n/**\n * Remove all nodes (and their edges) for a given file path.\n */\nexport async function removeNodesForFile(filePath: string, dbManager: DbManager): Promise<void> {\n const escaped = escCypher(filePath);\n for (const table of ALL_NODE_TABLES) {\n try {\n await dbManager.execute(\n `MATCH (n:${table}) WHERE n.file_path = '${escaped}' DETACH DELETE n`,\n );\n } catch { /* Table may not exist — ignore */ }\n }\n}\n\n/**\n * Remove all edges whose source or target node has the given file_path.\n */\nexport async function removeEdgesForFile(filePath: string, dbManager: DbManager): Promise<void> {\n const escaped = escCypher(filePath);\n try {\n await dbManager.execute(\n `MATCH (a)-[e:code_edges]->(b) WHERE a.file_path = '${escaped}' OR b.file_path = '${escaped}' DELETE e`,\n );\n } catch { /* Edges table may not exist — ignore */ }\n}\n\n// ─── Private helpers ──────────────────────────────────────────────────────────\n\nfunction buildNodeProps(node: CodeNode): string {\n const parts: string[] = [\n `id: '${escCypher(node.id)}'`,\n `name: '${escCypher(node.name)}'`,\n `file_path: '${escCypher(node.filePath)}'`,\n ];\n if (node.startLine !== undefined) parts.push(`start_line: ${node.startLine}`);\n if (node.endLine !== undefined) parts.push(`end_line: ${node.endLine}`);\n if (node.exported !== undefined) parts.push(`exported: ${node.exported}`);\n if (node.content) parts.push(`content: '${escCypher(node.content.slice(0, 500))}'`);\n if (node.metadata) parts.push(`metadata: '${escCypher(JSON.stringify(node.metadata))}'`);\n return `{${parts.join(', ')}}`;\n}\n\nfunction escCypher(s: string): string {\n return s.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\").replace(/\\n/g, '\\\\n').replace(/\\r/g, '');\n}\n","import express from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport cors from 'cors';\nimport helmet from 'helmet';\nimport cookieParser from 'cookie-parser';\nimport { doubleCsrf } from 'csrf-csrf';\nimport { rateLimit } from 'express-rate-limit';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { KnowledgeGraph } from '../graph/knowledge-graph.js';\nimport { textSearch } from '../search/text-search.js';\nimport { DbManager, getDbPath, getVectorDbPath } from '../storage/index.js';\nimport { loadMetadata } from '../storage/metadata.js';\nimport { VectorIndex } from '../search/vector-index.js';\nimport fs from 'node:fs';\nimport { listGroups, loadGroup, loadSyncResult, saveSyncResult } from '../multi-repo/group-registry.js';\nimport { syncGroup } from '../multi-repo/group-sync.js';\nimport { queryGroup } from '../multi-repo/group-query.js';\nimport { createKnowledgeGraph } from '../graph/knowledge-graph.js';\nimport { loadGraphFromDB } from '../multi-repo/graph-from-db.js';\nimport { loadRegistry } from '../storage/repo-registry.js';\nimport Logger from '../shared/logger.js';\nimport { AppError, ErrorCodes } from '../errors/codes.js';\nimport {\n requestIdMiddleware,\n authMiddleware,\n requireAuth,\n requireRole,\n requireRepoAccess,\n requireToolScope,\n buildSessionCookie,\n clearSessionCookie,\n createSession,\n verifyPassword,\n sessionStore,\n} from '../auth/middleware.js';\nimport { getOrCreateUsersDB } from '../auth/users-db.js';\nimport type { Role } from '../auth/users-db.js';\nimport { getOrCreateJobsDB } from '../jobs/jobs-db.js';\nimport type { JobStatus } from '../jobs/jobs-db.js';\nimport { governanceLogger } from '../governance/llm-governance.js';\nimport { createBackupScheduler } from '../backup/backup-scheduler.js';\nimport {\n isOIDCConfigured,\n getOIDCConfig,\n getDiscoveredConfig,\n buildOIDCLoginUrl,\n handleOIDCCallback,\n deriveUsername,\n initiateDeviceFlow,\n pollDeviceFlow,\n refreshOIDCToken,\n} from '../auth/oidc.js';\nimport {\n metricsRegistry,\n httpRequestsTotal,\n httpRequestDurationSeconds,\n pipelineNodesTotal,\n pipelineEdgesTotal,\n activeSessionsTotal,\n authAttemptsTotal,\n} from '../observability/metrics.js';\nimport { withSpan, isTracingEnabled } from '../observability/tracing.js';\nimport { openApiSpec } from './openapi.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n// Web UI is bundled into dist/web/ at publish time.\n// Fallback to the monorepo sibling path for local dev.\nconst WEB_DIST = (() => {\n // dist/cli/main.js → ../web = dist/web/ (global install & npm pack)\n const bundled = path.resolve(__dirname, '..', 'web');\n if (fs.existsSync(bundled)) return bundled;\n // Monorepo dev: dist/cli/ → ../../../web/dist = code-intel/web/dist\n return path.resolve(__dirname, '..', '..', '..', 'web', 'dist');\n})();\n\n// ── CORS allowed origins ──────────────────────────────────────────────────────\n\nfunction getAllowedOrigins(): string[] {\n const env = process.env['CODE_INTEL_CORS_ORIGINS'];\n if (env) return env.split(',').map((s) => s.trim());\n return ['http://localhost:3000', 'http://localhost:4747', 'http://localhost:4748'];\n}\n\n// ── Rate limiters ─────────────────────────────────────────────────────────────\n\nfunction createDefaultLimiter() {\n const max = parseInt(process.env['CODE_INTEL_RATE_LIMIT_MAX'] ?? '100', 10);\n const windowMs =\n parseInt(process.env['CODE_INTEL_RATE_LIMIT_WINDOW_MS'] ?? `${15 * 60 * 1000}`, 10);\n return rateLimit({\n windowMs,\n max,\n standardHeaders: true,\n legacyHeaders: false,\n skip: (req) => req.path.startsWith('/health') || req.path === '/metrics',\n message: {\n error: {\n code: ErrorCodes.RATE_LIMIT_EXCEEDED,\n message: 'Too many requests',\n hint: 'Slow down — you are sending requests too fast. Try again later.',\n },\n },\n });\n}\n\n// ── App factory ───────────────────────────────────────────────────────────────\n\nexport function createApp(graph: KnowledgeGraph, repoName: string, workspaceRoot?: string): express.Application {\n const app = express();\n\n // Trust proxy (for correct IP detection behind nginx/caddy)\n app.set('trust proxy', 1);\n\n // ── Security middleware ─────────────────────────────────────────────────────\n app.use(\n helmet({\n contentSecurityPolicy: false, // disabled to allow Web UI to load scripts\n }),\n );\n // CORS: actively reject non-allowlisted Origins (no `*` in production).\n // Requests without an Origin header (e.g. server-side, curl) are allowed\n // through; the browser is the entity enforcing CORS, so this only matters\n // for cross-origin browser requests.\n const allowedOrigins = getAllowedOrigins();\n app.use(\n cors({\n origin: (origin, callback) => {\n if (!origin) { callback(null, true); return; }\n if (allowedOrigins.includes(origin)) { callback(null, true); return; }\n // Non-allowlisted origin: do not echo Access-Control-Allow-Origin\n // (browser will block the response). Server-side request still\n // proceeds so we can return a normal 403/401 from downstream handlers.\n callback(null, false);\n },\n credentials: true,\n }),\n );\n app.use(cookieParser());\n app.use(express.json({ limit: '1mb' }));\n app.use(createDefaultLimiter());\n\n // ── CSRF protection setup ───────────────────────────────────────────────────\n const { generateCsrfToken, doubleCsrfProtection } = doubleCsrf({\n getSecret: () => process.env['CODE_INTEL_CSRF_SECRET'] ?? 'csrf-secret-change-in-production',\n getSessionIdentifier: (req) => {\n // Use the session cookie value or IP as the session identifier\n const cookieHeader = req.headers['cookie'] ?? '';\n const match = cookieHeader.match(/code_intel_session=([^;]+)/);\n return match ? decodeURIComponent(match[1] ?? '') : (req.ip ?? 'anonymous');\n },\n cookieName: process.env['NODE_ENV'] === 'production' ? '__Host-csrf-token' : 'csrf-token',\n cookieOptions: {\n sameSite: 'strict',\n path: '/',\n secure: process.env['NODE_ENV'] === 'production',\n httpOnly: true,\n },\n size: 64,\n getCsrfTokenFromRequest: (req) => req.headers['x-csrf-token'],\n });\n\n // ── Request ID + Auth middleware ────────────────────────────────────────────\n app.use(requestIdMiddleware);\n app.use(authMiddleware);\n\n // ── X-Index-Version header on every response ─────────────────────────────\n app.use((_req: Request, res: Response, next: NextFunction): void => {\n if (workspaceRoot) {\n try {\n const meta = loadMetadata(workspaceRoot);\n if (meta?.indexVersion) res.setHeader('X-Index-Version', meta.indexVersion);\n } catch { /* non-fatal */ }\n }\n next();\n });\n\n // ── Audit log: every authenticated request ──────────────────────────────────\n // Writes an entry to the audit_log table on response finish.\n // Skips /health/* and /metrics (high-frequency, unauthenticated).\n app.use((req: Request, res: Response, next: NextFunction): void => {\n res.on('finish', () => {\n if (!req.user) return; // unauthenticated requests are not audited here\n if (req.path.startsWith('/health') || req.path === '/metrics') return;\n const outcome: 'allow' | 'deny' = res.statusCode < 400 ? 'allow' : 'deny';\n try {\n const db = getOrCreateUsersDB();\n db.logAccess(req.user.id, req.path, req.method, outcome, req.ip ?? 'unknown');\n } catch { /* never throw from audit — it must not affect the response */ }\n });\n next();\n });\n\n // ── HTTP metrics + OTel span per request ────────────────────────────────────\n app.use((req: Request, res: Response, next: NextFunction): void => {\n const start = Date.now();\n if (isTracingEnabled()) {\n // Import is already cached after the first call\n void import('../observability/tracing.js').then(({ getTracer, sanitizeAttrs: sa }) => {\n const span = getTracer().startSpan(`HTTP ${req.method} ${req.path}`, {\n attributes: sa({\n 'http.method': req.method,\n 'http.url': req.path,\n 'http.request_id': req.requestId ?? '',\n }),\n });\n res.on('finish', () => {\n const route = req.route?.path ?? req.path ?? 'unknown';\n const method = req.method;\n const statusCode = String(res.statusCode);\n const durationSec = (Date.now() - start) / 1000;\n httpRequestsTotal.inc({ method, route, status_code: statusCode });\n httpRequestDurationSeconds.observe({ method, route, status_code: statusCode }, durationSec);\n span.setAttribute('http.status_code', res.statusCode);\n span.setAttribute('http.route', route);\n span.end();\n });\n });\n } else {\n res.on('finish', () => {\n const route = req.route?.path ?? req.path ?? 'unknown';\n const method = req.method;\n const statusCode = String(res.statusCode);\n const durationSec = (Date.now() - start) / 1000;\n httpRequestsTotal.inc({ method, route, status_code: statusCode });\n httpRequestDurationSeconds.observe({ method, route, status_code: statusCode }, durationSec);\n });\n }\n next();\n });\n\n // ── Lazy-init vector index ──────────────────────────────────────────────────\n let vectorIndex: VectorIndex | null = null;\n let vectorIndexBuilding = false;\n let vectorIndexReady = false;\n\n async function ensureVectorIndex(): Promise<VectorIndex | null> {\n if (vectorIndexReady && vectorIndex) return vectorIndex;\n if (!workspaceRoot || vectorIndexBuilding) return null;\n vectorIndexBuilding = true;\n try {\n const { embedNodes } = await import('../search/embedder.js');\n const dbPath = getVectorDbPath(workspaceRoot);\n const db = new DbManager(dbPath);\n await db.init();\n const idx = new VectorIndex(db);\n await idx.init();\n const alreadyBuilt = await idx.isBuilt();\n if (!alreadyBuilt) {\n Logger.info(' [vector] Building embeddings…');\n const nodes = await embedNodes(graph, {\n onProgress: (done, total) => {\n if (done % 50 === 0 || done === total) process.stdout.write(`\\r [vector] ${done}/${total}`);\n },\n });\n Logger.info('');\n await idx.buildIndex(nodes);\n Logger.info(` [vector] Index built: ${nodes.length} embeddings`);\n } else {\n Logger.info(' [vector] Index already exists, skipping rebuild.');\n }\n vectorIndex = idx;\n vectorIndexReady = true;\n return idx;\n } catch (err) {\n Logger.warn(' [vector] Index build failed:', err instanceof Error ? err.message : err);\n return null;\n } finally {\n vectorIndexBuilding = false;\n }\n }\n\n if (workspaceRoot) {\n setImmediate(() => ensureVectorIndex().catch(() => {}));\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // PUBLIC routes (no auth required)\n // ═══════════════════════════════════════════════════════════════════════════\n\n // ── Prometheus metrics ──────────────────────────────────────────────────────\n\n app.get('/metrics', async (_req, res) => {\n try {\n // Update live gauges before scrape\n pipelineNodesTotal.set({ repo: repoName }, graph.size.nodes);\n pipelineEdgesTotal.set({ repo: repoName }, graph.size.edges);\n activeSessionsTotal.set(sessionStore.size);\n const output = await metricsRegistry.metrics();\n res.set('Content-Type', metricsRegistry.contentType);\n res.end(output);\n } catch (err) {\n res.status(500).end(String(err));\n }\n });\n\n // ── Health checks ───────────────────────────────────────────────────────────\n\n app.get('/health/live', (_req, res) => {\n res.json({ status: 'ok', timestamp: new Date().toISOString() });\n });\n\n app.get('/health/ready', (_req, res) => {\n if (graph.size.nodes === 0 && workspaceRoot) {\n res.status(503).json({ status: 'error', reason: 'Index not loaded yet' });\n return;\n }\n res.json({\n status: 'ok',\n nodes: graph.size.nodes,\n edges: graph.size.edges,\n timestamp: new Date().toISOString(),\n });\n });\n\n app.get('/health/startup', (_req, res) => {\n res.json({ status: 'ok', timestamp: new Date().toISOString() });\n });\n\n // ── Auth routes ─────────────────────────────────────────────────────────────\n\n // Public CSRF token endpoint — clients must call this first\n app.get('/auth/csrf-token', (req, res) => {\n const token = generateCsrfToken(req, res);\n res.json({ csrfToken: token });\n });\n\n // Bootstrap status — tells UI whether first-run setup is needed\n app.get('/auth/bootstrap-status', (_req, res) => {\n const db = getOrCreateUsersDB();\n res.json({ needsBootstrap: !db.hasAnyUser() });\n });\n\n // Apply CSRF protection to all state-changing routes\n app.use(doubleCsrfProtection);\n\n // Bootstrap — create first admin (only works when no users exist)\n app.post('/auth/bootstrap', async (req: Request, res: Response) => {\n const db = getOrCreateUsersDB();\n if (db.hasAnyUser()) {\n res.status(400).json({\n error: {\n code: 'CI-1004',\n message: 'Bootstrap already completed',\n hint: 'An admin account already exists. Use /auth/login instead.',\n requestId: req.requestId,\n timestamp: new Date().toISOString(),\n },\n });\n return;\n }\n const { username, password } = req.body as { username?: string; password?: string };\n if (!username || !password || password.length < 8) {\n res.status(400).json({\n error: {\n code: ErrorCodes.INVALID_REQUEST,\n message: 'username and password (min 8 chars) are required',\n requestId: req.requestId,\n timestamp: new Date().toISOString(),\n },\n });\n return;\n }\n const user = db.createUser(username, password, 'admin');\n const sessionId = createSession({ id: user.id, username: user.username, role: user.role });\n res.setHeader('Set-Cookie', buildSessionCookie(sessionId));\n res.status(201).json({ user: { id: user.id, username: user.username, role: user.role } });\n });\n\n app.post('/auth/login', async (req: Request, res: Response) => {\n const { username, password } = req.body as { username?: string; password?: string };\n if (!username || !password) {\n res.status(400).json({\n error: {\n code: ErrorCodes.INVALID_REQUEST,\n message: 'username and password are required',\n hint: 'Provide { \"username\": \"...\", \"password\": \"...\" } in request body',\n requestId: req.requestId,\n timestamp: new Date().toISOString(),\n },\n });\n return;\n }\n\n const db = getOrCreateUsersDB();\n const user = db.findUserByUsername(username);\n\n if (!user) {\n db.logAccess('unknown', `/auth/login`, 'login', 'deny', req.ip ?? 'unknown');\n authAttemptsTotal.inc({ method: 'local', outcome: 'failure' });\n res.status(401).json({\n error: {\n code: ErrorCodes.UNAUTHORIZED,\n message: 'Invalid username or password',\n hint: 'Check your credentials and try again',\n requestId: req.requestId,\n timestamp: new Date().toISOString(),\n },\n });\n return;\n }\n\n const valid = await verifyPassword(password, user.passwordHash);\n if (!valid) {\n db.logAccess(user.id, `/auth/login`, 'login', 'deny', req.ip ?? 'unknown');\n authAttemptsTotal.inc({ method: 'local', outcome: 'failure' });\n res.status(401).json({\n error: {\n code: ErrorCodes.UNAUTHORIZED,\n message: 'Invalid username or password',\n hint: 'Check your credentials and try again',\n requestId: req.requestId,\n timestamp: new Date().toISOString(),\n },\n });\n return;\n }\n\n const sessionId = createSession({ id: user.id, username: user.username, role: user.role });\n db.logAccess(user.id, '/auth/login', 'login', 'allow', req.ip ?? 'unknown');\n authAttemptsTotal.inc({ method: 'local', outcome: 'success' });\n res.setHeader('Set-Cookie', buildSessionCookie(sessionId));\n res.json({ user: { id: user.id, username: user.username, role: user.role } });\n });\n\n app.post('/auth/logout', (req: Request, res: Response) => {\n res.setHeader('Set-Cookie', clearSessionCookie());\n res.json({ message: 'Logged out successfully' });\n });\n\n app.get('/auth/status', (req: Request, res: Response) => {\n if (!req.user) {\n res.status(401).json({ authenticated: false });\n return;\n }\n res.json({\n authenticated: true,\n user: { id: req.user.id, username: req.user.username, role: req.user.role },\n authMethod: req.user.authMethod,\n });\n });\n\n // ── OIDC / OAuth2 routes (1.3) ──────────────────────────────────────────────\n\n // Probe: is OIDC configured?\n app.get('/auth/oidc/status', async (_req, res) => {\n if (!isOIDCConfigured()) {\n res.json({ enabled: false });\n return;\n }\n const cfg = getOIDCConfig()!;\n // Attempt discovery to confirm provider is reachable\n const discovered = await getDiscoveredConfig();\n res.json({\n enabled: true,\n issuer: cfg.issuer,\n reachable: discovered !== null,\n });\n });\n\n // Step 1: redirect to provider\n app.get('/auth/oidc/login', async (req: Request, res: Response) => {\n if (!isOIDCConfigured()) {\n res.status(503).json({\n error: {\n code: 'CI-1005',\n message: 'OIDC is not configured',\n hint: 'Set CODE_INTEL_OIDC_ISSUER, CODE_INTEL_OIDC_CLIENT_ID, CODE_INTEL_OIDC_CLIENT_SECRET env vars',\n requestId: req.requestId,\n timestamp: new Date().toISOString(),\n },\n });\n return;\n }\n\n try {\n const result = await buildOIDCLoginUrl();\n if (!result) {\n res.status(503).json({\n error: {\n code: 'CI-1005',\n message: 'OIDC provider unreachable',\n hint: 'The OIDC issuer could not be reached. Check CODE_INTEL_OIDC_ISSUER and network connectivity.',\n requestId: req.requestId,\n timestamp: new Date().toISOString(),\n },\n });\n return;\n }\n res.redirect(302, result.redirectUrl);\n } catch (err) {\n Logger.warn('[oidc] Login redirect failed:', err instanceof Error ? err.message : err);\n res.status(500).json({\n error: {\n code: 'CI-5000',\n message: 'OIDC login initiation failed',\n hint: err instanceof Error ? err.message : 'Unknown error',\n requestId: req.requestId,\n timestamp: new Date().toISOString(),\n },\n });\n }\n });\n\n // Step 2: provider redirects back here with code + state\n app.get('/auth/callback', async (req: Request, res: Response) => {\n const { state, error, error_description } = req.query as Record<string, string | undefined>;\n\n // Provider error (e.g. user denied)\n if (error) {\n Logger.warn('[oidc] Provider returned error:', error, error_description);\n res.redirect(302, `/?oidc_error=${encodeURIComponent(error_description ?? error)}`);\n return;\n }\n\n if (!state) {\n res.status(400).json({\n error: {\n code: 'CI-1200',\n message: 'Missing state parameter in OIDC callback',\n requestId: req.requestId,\n timestamp: new Date().toISOString(),\n },\n });\n return;\n }\n\n try {\n const currentUrl = new URL(\n req.originalUrl,\n getOIDCConfig()?.redirectUri ?? `http://localhost:4747`,\n );\n const { userInfo } = await handleOIDCCallback(currentUrl, state);\n\n // Determine provider from issuer\n const cfg = getOIDCConfig()!;\n const provider = cfg.issuer;\n\n const db = getOrCreateUsersDB();\n\n // Find or provision user\n let user = db.findUserByOIDC(provider, userInfo.sub);\n if (user) {\n // Existing user — update last login\n db.touchOIDCIdentity(provider, userInfo.sub);\n authAttemptsTotal.inc({ method: 'oidc', outcome: 'success' });\n } else {\n // New user — auto-provision with default role\n const username = deriveUsername(userInfo);\n // Ensure username uniqueness by appending a suffix if needed\n let finalUsername = username;\n let suffix = 1;\n while (db.findUserByUsername(finalUsername)) {\n finalUsername = `${username}_${suffix++}`;\n }\n const { user: newUser } = db.provisionOIDCUser(\n finalUsername,\n cfg.defaultRole,\n provider,\n userInfo.sub,\n userInfo.email,\n userInfo.name,\n );\n user = { ...newUser, oidcIdentityId: '' };\n authAttemptsTotal.inc({ method: 'oidc', outcome: 'success' });\n Logger.info(`[oidc] Auto-provisioned new user: ${finalUsername} (${cfg.defaultRole})`);\n }\n\n const sessionId = createSession({ id: user.id, username: user.username, role: user.role });\n db.logAccess(user.id, '/auth/callback', 'oidc-login', 'allow', req.ip ?? 'unknown');\n res.setHeader('Set-Cookie', buildSessionCookie(sessionId));\n // Redirect back to the web UI\n res.redirect(302, '/');\n } catch (err) {\n Logger.warn('[oidc] Callback failed:', err instanceof Error ? err.message : err);\n authAttemptsTotal.inc({ method: 'oidc', outcome: 'failure' });\n const msg = err instanceof Error ? err.message : 'OIDC callback failed';\n res.redirect(302, `/?oidc_error=${encodeURIComponent(msg)}`);\n }\n });\n\n // OIDC refresh — called by clients with a stored OIDC refresh token\n app.post('/auth/oidc/refresh', async (req: Request, res: Response) => {\n const { refresh_token } = req.body as { refresh_token?: string };\n if (!refresh_token) {\n res.status(400).json({\n error: {\n code: 'CI-1200',\n message: 'refresh_token required',\n requestId: req.requestId,\n timestamp: new Date().toISOString(),\n },\n });\n return;\n }\n const result = await refreshOIDCToken(refresh_token);\n if (!result) {\n res.status(401).json({\n error: {\n code: 'CI-1000',\n message: 'Refresh token invalid or OIDC provider unreachable',\n hint: 'Re-login via /auth/oidc/login',\n requestId: req.requestId,\n timestamp: new Date().toISOString(),\n },\n });\n return;\n }\n res.json(result);\n });\n\n // Fallback: OIDC unavailable → redirect to local login\n app.get('/auth/oidc/fallback', (_req, res) => {\n res.redirect(302, '/login');\n });\n\n // ═══════════════════════════════════════════════════════════════════════════\n // PROTECTED routes — require authentication\n // ═══════════════════════════════════════════════════════════════════════════\n\n app.use('/api/v1', requireAuth);\n\n // ── Legacy /api/* → redirect to /api/v1/* ──────────────────────────────────\n app.use('/api', (req: Request, res: Response, next: NextFunction) => {\n if (!req.path.startsWith('/v1')) {\n res.redirect(301, `/api/v1${req.path}`);\n return;\n }\n next();\n });\n\n // ── OpenAPI spec + Swagger UI (dev only) ────────────────────────────────────\n app.get('/api/v1/openapi.json', (_req, res) => {\n res.json(openApiSpec);\n });\n\n if (process.env['NODE_ENV'] !== 'production') {\n app.get('/api/v1/docs', (_req, res) => {\n res.setHeader('Content-Type', 'text/html');\n res.end(`<!DOCTYPE html>\n<html>\n<head>\n <title>Code Intel API Docs</title>\n <meta charset=\"utf-8\"/>\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <link rel=\"stylesheet\" type=\"text/css\" href=\"https://unpkg.com/swagger-ui-dist@5/swagger-ui.css\" >\n</head>\n<body>\n <div id=\"swagger-ui\"></div>\n <script src=\"https://unpkg.com/swagger-ui-dist@5/swagger-ui-bundle.js\"> </script>\n <script>\n SwaggerUIBundle({\n url: \"/api/v1/openapi.json\",\n dom_id: '#swagger-ui',\n presets: [SwaggerUIBundle.presets.apis, SwaggerUIBundle.SwaggerUIStandalonePreset],\n layout: \"BaseLayout\"\n })\n </script>\n</body>\n</html>`);\n });\n }\n\n // ── Health (detailed) ───────────────────────────────────────────────────────\n app.get('/api/v1/health', (req: Request, res: Response) => {\n const db = getOrCreateUsersDB();\n const memUsage = process.memoryUsage();\n res.json({\n status: 'ok',\n nodes: graph.size.nodes,\n edges: graph.size.edges,\n users: db.hasAnyUser(),\n workspaceRoot,\n memory: {\n heapUsedMb: Math.round(memUsage.heapUsed / 1024 / 1024),\n heapTotalMb: Math.round(memUsage.heapTotal / 1024 / 1024),\n rssMb: Math.round(memUsage.rss / 1024 / 1024),\n },\n timestamp: new Date().toISOString(),\n requestId: req.requestId,\n });\n });\n\n // ── Repos ───────────────────────────────────────────────────────────────────\n app.get('/api/v1/repos', (_req, res) => {\n const registry = loadRegistry();\n if (registry.length === 0) {\n res.json([{ name: repoName, path: workspaceRoot ?? '', nodes: graph.size.nodes, edges: graph.size.edges, indexedAt: null }]);\n return;\n }\n res.json(registry.map((r) => ({\n name: r.name,\n path: r.path,\n nodes: r.stats.nodes,\n edges: r.stats.edges,\n indexedAt: r.indexedAt,\n active: r.path === workspaceRoot,\n })));\n });\n\n // ── Graph helpers ───────────────────────────────────────────────────────────\n async function loadRepoGraph(requestedRepo: string): Promise<KnowledgeGraph | null> {\n if (requestedRepo === repoName) return graph;\n const registry = loadRegistry();\n const entry = registry.find((r) => r.name === requestedRepo || r.path === requestedRepo);\n if (!entry) return null;\n const dbPath = path.join(entry.path, '.code-intel', 'graph.db');\n if (!fs.existsSync(dbPath)) return null;\n const repoGraph = createKnowledgeGraph();\n const db = new DbManager(dbPath);\n try {\n await db.init();\n await loadGraphFromDB(repoGraph, db);\n db.close();\n return repoGraph;\n } catch {\n db.close();\n return null;\n }\n }\n\n async function getGraphForRepo(requestedRepo: string | undefined): Promise<KnowledgeGraph> {\n if (!requestedRepo || requestedRepo === repoName) return graph;\n const g = await loadRepoGraph(requestedRepo);\n return g ?? graph;\n }\n\n // ── Graph download ──────────────────────────────────────────────────────────\n app.get('/api/v1/graph/:repo', requireRepoAccess((req) => {\n const p = req.params['repo'];\n const repo = Array.isArray(p) ? p[0] : p;\n return repo ? decodeURIComponent(repo) : undefined;\n }), async (req, res) => {\n const rawRepo = req.params['repo'];\n const requestedRepo = decodeURIComponent(Array.isArray(rawRepo) ? (rawRepo[0] ?? '') : (rawRepo ?? ''));\n const g = await loadRepoGraph(requestedRepo);\n if (!g) {\n res.status(404).json({\n error: {\n code: ErrorCodes.NOT_FOUND,\n message: `Repo \"${requestedRepo}\" not found or not indexed`,\n hint: `Run: code-intel analyze <path>`,\n requestId: req.requestId,\n timestamp: new Date().toISOString(),\n },\n });\n return;\n }\n res.json({ nodes: [...g.allNodes()], edges: [...g.allEdges()] });\n });\n\n // ── Search ──────────────────────────────────────────────────────────────────\n app.post('/api/v1/search', requireToolScope('search'), async (req, res) => {\n const { query, limit, repo } = req.body as { query?: string; limit?: number; repo?: string };\n const g = await getGraphForRepo(repo);\n const results = textSearch(g, query ?? '', limit ?? 20);\n res.json({ results });\n });\n\n // ── Vector search ───────────────────────────────────────────────────────────\n app.post('/api/v1/vector-search', async (req, res) => {\n const { query, limit = 10 } = req.body as { query?: string; limit?: number };\n if (!query) { res.status(400).json({ error: { code: ErrorCodes.INVALID_REQUEST, message: 'Missing query', hint: 'Provide { \"query\": \"...\" } in request body' } }); return; }\n const idx = await ensureVectorIndex();\n if (!idx) {\n const results = textSearch(graph, query, limit);\n res.json({ results, source: 'text-fallback', vectorReady: false });\n return;\n }\n try {\n const { pipeline } = await import('@huggingface/transformers');\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const embedder = (await pipeline('feature-extraction', 'Xenova/all-MiniLM-L6-v2')) as unknown as (text: string, opts: Record<string, unknown>) => Promise<{ data: Float32Array }>;\n const out = await embedder(query, { pooling: 'mean', normalize: true });\n const queryEmbedding = Array.from(out.data);\n const hits = await idx.search(queryEmbedding, limit);\n res.json({ results: hits.map((h) => ({ nodeId: h.nodeId, name: h.name, kind: h.kind, filePath: h.filePath, score: h.score })), source: 'vector', vectorReady: true });\n } catch (err) {\n const results = textSearch(graph, query, limit);\n res.json({ results, source: 'text-fallback', vectorReady: false, error: err instanceof Error ? err.message : String(err) });\n }\n });\n\n // ── Vector status ───────────────────────────────────────────────────────────\n app.get('/api/v1/vector-status', (_req, res) => {\n res.json({ ready: vectorIndexReady, building: vectorIndexBuilding });\n });\n\n // ── File read ───────────────────────────────────────────────────────────────\n app.post('/api/v1/files/read', requireToolScope('read_file'), (req, res) => {\n const { file_path } = req.body as { file_path?: string };\n if (!file_path) { res.status(400).json({ error: { code: ErrorCodes.INVALID_REQUEST, message: 'Missing file_path' } }); return; }\n // Security: must be within a known repo path\n const registry = loadRegistry();\n const isAllowed = workspaceRoot\n ? file_path.startsWith(workspaceRoot)\n : registry.some((r) => file_path.startsWith(r.path));\n if (!isAllowed) {\n res.status(403).json({ error: { code: ErrorCodes.FORBIDDEN, message: 'Access denied', hint: 'File path must be within an indexed repository' } });\n return;\n }\n try {\n const content = fs.readFileSync(file_path, 'utf-8');\n res.json({ content });\n } catch {\n res.status(404).json({ error: { code: ErrorCodes.NOT_FOUND, message: 'File not found' } });\n }\n });\n\n // ── Grep ────────────────────────────────────────────────────────────────────\n app.post('/api/v1/grep', requireToolScope('grep'), (req, res) => {\n const { pattern, file_paths } = req.body as { pattern?: string; file_paths?: string[] };\n const results: { file: string; line: number; text: string }[] = [];\n try {\n const regex = new RegExp(pattern ?? '', 'gi');\n const paths: string[] = file_paths ?? [];\n if (paths.length === 0) {\n for (const node of graph.allNodes()) {\n if (node.kind === 'file' && node.content) {\n const lines = node.content.split('\\n');\n for (let i = 0; i < lines.length; i++) {\n if (regex.test(lines[i]!)) results.push({ file: node.filePath, line: i + 1, text: lines[i]!.trim() });\n regex.lastIndex = 0;\n }\n }\n }\n }\n res.json({ results: results.slice(0, 100) });\n } catch {\n res.status(400).json({ error: { code: ErrorCodes.INVALID_REQUEST, message: 'Invalid regex pattern' } });\n }\n });\n\n // ── Cypher query ────────────────────────────────────────────────────────────\n app.post('/api/v1/cypher', async (req, res) => {\n const { query: q } = req.body as { query?: string };\n if (!q) { res.status(400).json({ error: { code: ErrorCodes.INVALID_REQUEST, message: 'Missing query' } }); return; }\n if (workspaceRoot) {\n try {\n const dbPath = getDbPath(workspaceRoot);\n const dbm = new DbManager(dbPath);\n await dbm.init();\n const rows = await dbm.query(q);\n dbm.close();\n res.json({ results: rows });\n return;\n } catch { /* fall through */ }\n }\n try {\n const nameMatch = q.match(/name\\s*=\\s*['\"]([^'\"]+)['\"]/i);\n if (nameMatch) {\n const name = nameMatch[1];\n const results = [];\n for (const node of graph.allNodes()) {\n if (node.name === name) {\n results.push({ node, incoming: [...graph.findEdgesTo(node.id)].length, outgoing: [...graph.findEdgesFrom(node.id)].length });\n }\n }\n res.json({ results });\n return;\n }\n const kindMatch = q.match(/:\\s*(\\w+)/);\n if (kindMatch) {\n const kind = kindMatch[1];\n const results = [];\n for (const node of graph.allNodes()) {\n if (node.kind === kind) results.push(node);\n if (results.length >= 50) break;\n }\n res.json({ results });\n return;\n }\n res.json({ results: [], message: 'Query not recognized.' });\n } catch {\n res.status(400).json({ error: { code: ErrorCodes.INVALID_REQUEST, message: 'Invalid query' } });\n }\n });\n\n // ── Node detail ─────────────────────────────────────────────────────────────\n app.get('/api/v1/nodes/:id', async (req, res) => {\n const nodeId = decodeURIComponent(req.params.id);\n const g = await getGraphForRepo(req.query['repo'] as string | undefined);\n const node = g.getNode(nodeId);\n if (!node) {\n res.status(404).json({ error: { code: ErrorCodes.NOT_FOUND, message: 'Node not found', requestId: req.requestId } });\n return;\n }\n const incoming = [...g.findEdgesTo(nodeId)];\n const outgoing = [...g.findEdgesFrom(nodeId)];\n res.json({\n node,\n callers: incoming.filter((e) => e.kind === 'calls').map((e) => ({ id: e.source, name: g.getNode(e.source)?.name, weight: e.weight })),\n callees: outgoing.filter((e) => e.kind === 'calls').map((e) => ({ id: e.target, name: g.getNode(e.target)?.name, weight: e.weight })),\n imports: outgoing.filter((e) => e.kind === 'imports').map((e) => ({ id: e.target, name: g.getNode(e.target)?.name })),\n importedBy: incoming.filter((e) => e.kind === 'imports').map((e) => ({ id: e.source, name: g.getNode(e.source)?.name })),\n extends: outgoing.filter((e) => e.kind === 'extends').map((e) => ({ id: e.target, name: g.getNode(e.target)?.name })),\n implementsEdges: outgoing.filter((e) => e.kind === 'implements').map((e) => ({ id: e.target, name: g.getNode(e.target)?.name })),\n members: outgoing.filter((e) => e.kind === 'has_member').map((e) => ({ id: e.target, name: g.getNode(e.target)?.name, kind: g.getNode(e.target)?.kind })),\n cluster: incoming.filter((e) => e.kind === 'belongs_to').map((e) => g.getNode(e.target)?.name)[0],\n });\n });\n\n // ── Blast radius ────────────────────────────────────────────────────────────\n app.post('/api/v1/blast-radius', async (req, res) => {\n const { target, direction = 'both', max_hops = 5, repo } = req.body as { target?: string; direction?: string; max_hops?: number; repo?: string };\n const g = await getGraphForRepo(repo);\n let targetNode = null;\n for (const node of g.allNodes()) {\n if (node.name === target || node.id === target) { targetNode = node; break; }\n }\n if (!targetNode) {\n res.status(404).json({ error: { code: ErrorCodes.NOT_FOUND, message: `Symbol \"${target}\" not found`, requestId: req.requestId } });\n return;\n }\n const affected = new Map<string, { name: string; kind: string; depth: number }>();\n const queue: { id: string; depth: number }[] = [{ id: targetNode.id, depth: 0 }];\n const visited = new Set<string>();\n while (queue.length > 0) {\n const { id, depth } = queue.shift()!;\n if (visited.has(id) || depth > max_hops) continue;\n visited.add(id);\n const node = g.getNode(id);\n if (node) affected.set(id, { name: node.name, kind: node.kind, depth });\n if (direction === 'callers' || direction === 'both') {\n for (const edge of g.findEdgesTo(id)) {\n if (edge.kind === 'calls' || edge.kind === 'imports') queue.push({ id: edge.source, depth: depth + 1 });\n }\n }\n if (direction === 'callees' || direction === 'both') {\n for (const edge of g.findEdgesFrom(id)) {\n if (edge.kind === 'calls' || edge.kind === 'imports') queue.push({ id: edge.target, depth: depth + 1 });\n }\n }\n }\n res.json({\n target: targetNode.name,\n affectedCount: [...affected.values()].filter((a) => a.depth > 0).length,\n affected: [...affected.entries()].map(([id, info]) => ({ id, ...info })).filter((a) => a.depth > 0),\n });\n });\n\n // ── Flows ───────────────────────────────────────────────────────────────────\n app.get('/api/v1/flows', async (req, res) => {\n const g = await getGraphForRepo(req.query['repo'] as string | undefined);\n const flows: { id: string; name: string; steps: unknown }[] = [];\n for (const node of g.allNodes()) {\n if (node.kind === 'flow') flows.push({ id: node.id, name: node.name, steps: node.metadata?.steps });\n }\n res.json({ flows });\n });\n\n // ── Clusters ────────────────────────────────────────────────────────────────\n app.get('/api/v1/clusters', async (req, res) => {\n const g = await getGraphForRepo(req.query['repo'] as string | undefined);\n const clusters: { id: string; name: string; memberCount: number }[] = [];\n for (const node of g.allNodes()) {\n if (node.kind === 'cluster') clusters.push({ id: node.id, name: node.name, memberCount: (node.metadata?.memberCount as number) ?? 0 });\n }\n res.json({ clusters });\n });\n\n // ── Jobs ────────────────────────────────────────────────────────────────────\n app.get('/api/v1/jobs', (req: Request, res: Response) => {\n const { status, repo } = req.query as { status?: string; repo?: string };\n const jobsDB = getOrCreateJobsDB();\n const filters: { status?: JobStatus; repoPath?: string } = {};\n if (status) filters.status = status as JobStatus;\n if (repo) filters.repoPath = repo;\n const jobs = jobsDB.listJobs(filters);\n res.json({ jobs });\n });\n\n app.delete('/api/v1/jobs/:id', (req: Request, res: Response) => {\n const jobsDB = getOrCreateJobsDB();\n const { id } = req.params;\n const job = jobsDB.getJob(id as string);\n if (!job) {\n res.status(404).json({\n error: {\n code: ErrorCodes.NOT_FOUND,\n message: `Job \"${id}\" not found`,\n requestId: req.requestId,\n timestamp: new Date().toISOString(),\n },\n });\n return;\n }\n const cancelled = jobsDB.cancel(id as string);\n if (cancelled) {\n res.json({ message: `Job \"${id}\" cancelled`, id });\n } else {\n res.status(409).json({\n error: {\n code: ErrorCodes.INVALID_REQUEST,\n message: `Job \"${id}\" cannot be cancelled (status: ${job.status})`,\n hint: 'Only pending or running jobs can be cancelled',\n requestId: req.requestId,\n timestamp: new Date().toISOString(),\n },\n });\n }\n });\n\n // ── Groups ──────────────────────────────────────────────────────────────────\n app.get('/api/v1/groups', (_req, res) => {\n const groups = listGroups();\n res.json(groups.map((g) => ({ name: g.name, memberCount: g.members.length, lastSync: g.lastSync ?? null, createdAt: g.createdAt })));\n });\n\n app.get('/api/v1/groups/:name', (req, res) => {\n const group = loadGroup(req.params.name);\n if (!group) { res.status(404).json({ error: { code: ErrorCodes.NOT_FOUND, message: 'Group not found' } }); return; }\n res.json(group);\n });\n\n app.get('/api/v1/groups/:name/contracts', (req, res) => {\n const result = loadSyncResult(req.params.name);\n if (!result) { res.status(404).json({ error: { code: ErrorCodes.NOT_FOUND, message: 'No sync result. Run sync first.' } }); return; }\n res.json(result);\n });\n\n app.post('/api/v1/groups/:name/sync', async (req, res) => {\n const group = loadGroup(req.params.name);\n if (!group) { res.status(404).json({ error: { code: ErrorCodes.NOT_FOUND, message: 'Group not found' } }); return; }\n try {\n const result = await syncGroup(group);\n saveSyncResult(result);\n group.lastSync = result.syncedAt;\n const { saveGroup } = await import('../multi-repo/group-registry.js');\n saveGroup(group);\n res.json(result);\n } catch (err) {\n res.status(500).json({ error: { code: ErrorCodes.INTERNAL_ERROR, message: err instanceof Error ? err.message : String(err) } });\n }\n });\n\n app.post('/api/v1/groups/:name/search', async (req, res) => {\n const group = loadGroup(req.params.name);\n if (!group) { res.status(404).json({ error: { code: ErrorCodes.NOT_FOUND, message: 'Group not found' } }); return; }\n const { q, limit = 20 } = req.body as { q?: string; limit?: number };\n if (!q) { res.status(400).json({ error: { code: ErrorCodes.INVALID_REQUEST, message: 'Missing query q' } }); return; }\n try {\n const { perRepo, merged } = await queryGroup(group, q, limit);\n res.json({ perRepo, merged });\n } catch (err) {\n res.status(500).json({ error: { code: ErrorCodes.INTERNAL_ERROR, message: err instanceof Error ? err.message : String(err) } });\n }\n });\n\n app.get('/api/v1/groups/:name/graph', async (req, res) => {\n const group = loadGroup(req.params.name);\n if (!group) { res.status(404).json({ error: { code: ErrorCodes.NOT_FOUND, message: 'Group not found' } }); return; }\n const registry = loadRegistry();\n const mergedGraph = createKnowledgeGraph();\n for (const member of group.members) {\n const regEntry = registry.find((r) => r.name === member.registryName);\n if (!regEntry) continue;\n const dbPath = path.join(regEntry.path, '.code-intel', 'graph.db');\n if (!fs.existsSync(dbPath)) continue;\n const db = new DbManager(dbPath);\n try {\n await db.init();\n await loadGraphFromDB(mergedGraph, db);\n db.close();\n } catch { db.close(); }\n }\n res.json({ nodes: [...mergedGraph.allNodes()], edges: [...mergedGraph.allEdges()] });\n });\n\n // ── Web UI static files ─────────────────────────────────────────────────────\n if (fs.existsSync(WEB_DIST)) {\n app.use(express.static(WEB_DIST));\n app.get('/{*path}', (_req, res) => {\n res.sendFile(path.join(WEB_DIST, 'index.html'));\n });\n }\n\n // ── Admin API — requires admin role ──────────────────────────────────────────\n app.use('/admin', requireRole('admin'));\n\n // List users\n app.get('/admin/users', (_req, res) => {\n const db = getOrCreateUsersDB();\n res.json({ users: db.listUsers() });\n });\n\n // Create user\n app.post('/admin/users', async (req: Request, res: Response) => {\n const { username, password, role } = req.body as { username?: string; password?: string; role?: string };\n if (!username || !password || !role) {\n res.status(400).json({ error: { code: ErrorCodes.INVALID_REQUEST, message: 'username, password, role required', requestId: req.requestId, timestamp: new Date().toISOString() } });\n return;\n }\n const validRoles: Role[] = ['admin', 'analyst', 'viewer', 'repo-owner'];\n if (!validRoles.includes(role as Role)) {\n res.status(400).json({ error: { code: ErrorCodes.INVALID_REQUEST, message: `role must be one of: ${validRoles.join(', ')}`, requestId: req.requestId, timestamp: new Date().toISOString() } });\n return;\n }\n const db = getOrCreateUsersDB();\n const user = db.createUser(username, password, role as Role);\n res.status(201).json({ user });\n });\n\n // Delete user\n app.delete('/admin/users/:username', (req: Request, res: Response) => {\n const { username } = req.params;\n const db = getOrCreateUsersDB();\n db.deleteUser(username as string);\n res.json({ message: `User ${username} deleted` });\n });\n\n // Set user role\n app.patch('/admin/users/:username/role', (req: Request, res: Response) => {\n const { username } = req.params;\n const { role } = req.body as { role?: string };\n const validRoles: Role[] = ['admin', 'analyst', 'viewer', 'repo-owner'];\n if (!role || !validRoles.includes(role as Role)) {\n res.status(400).json({ error: { code: ErrorCodes.INVALID_REQUEST, message: 'valid role required', requestId: req.requestId, timestamp: new Date().toISOString() } });\n return;\n }\n const db = getOrCreateUsersDB();\n db.setRole(username as string, role as Role);\n res.json({ message: `Role updated` });\n });\n\n // List tokens\n app.get('/admin/tokens', (_req, res) => {\n const db = getOrCreateUsersDB();\n res.json({ tokens: db.listTokens() });\n });\n\n // Revoke token\n app.delete('/admin/tokens/:id', (req: Request, res: Response) => {\n const db = getOrCreateUsersDB();\n db.revokeToken(req.params.id as string);\n res.json({ message: 'Token revoked' });\n });\n\n // Governance log\n app.get('/admin/governance/log', (req: Request, res: Response) => {\n const limit = Math.min(parseInt((req.query['limit'] as string | undefined) ?? '100', 10), 1000);\n const entries = governanceLogger.readLog(limit);\n res.json({ entries, count: entries.length, enabled: governanceLogger.isEnabled() });\n });\n\n // ── CSRF error handler ──────────────────────────────────────────────────────\n app.use((err: unknown, req: Request, res: Response, next: NextFunction): void => {\n if (err && typeof err === 'object' && 'code' in err && (err as { code: string }).code === 'EBADCSRFTOKEN') {\n res.status(403).json({\n error: {\n code: 'CI-1003',\n message: 'Invalid CSRF token',\n hint: 'Fetch a fresh CSRF token from GET /auth/csrf-token and include it as X-CSRF-Token header',\n requestId: (req as Request & { requestId?: string }).requestId,\n timestamp: new Date().toISOString(),\n },\n });\n return;\n }\n next(err);\n });\n\n // ── Global error handler ────────────────────────────────────────────────────\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n app.use((err: Error, req: Request, res: Response, _next: NextFunction) => {\n Logger.error('Unhandled error:', err.message);\n if (err instanceof AppError) {\n res.status(err.statusCode).json({\n error: {\n code: err.code,\n message: err.message,\n hint: err.hint,\n requestId: req.requestId,\n timestamp: new Date().toISOString(),\n },\n });\n return;\n }\n // body-parser errors carry a `status`/`statusCode` and a `type`.\n // Honor them so payload-too-large (413), bad JSON (400), etc. surface\n // with the correct HTTP status.\n const e = err as Error & { status?: number; statusCode?: number; type?: string };\n const bodyParserStatus = e.status ?? e.statusCode;\n if (\n typeof bodyParserStatus === 'number' &&\n bodyParserStatus >= 400 &&\n bodyParserStatus < 500\n ) {\n const code =\n e.type === 'entity.too.large'\n ? ErrorCodes.PAYLOAD_TOO_LARGE\n : ErrorCodes.INVALID_REQUEST;\n const message =\n e.type === 'entity.too.large'\n ? 'Request payload too large (max 1MB)'\n : err.message;\n res.status(bodyParserStatus).json({\n error: {\n code,\n message,\n hint:\n e.type === 'entity.too.large'\n ? 'Reduce the request body size to under 1MB.'\n : undefined,\n requestId: req.requestId,\n timestamp: new Date().toISOString(),\n },\n });\n return;\n }\n res.status(500).json({\n error: {\n code: ErrorCodes.INTERNAL_ERROR,\n message: 'Internal server error',\n hint: 'Check server logs for details',\n requestId: req.requestId,\n timestamp: new Date().toISOString(),\n },\n });\n });\n\n return app;\n}\n\nexport function startHttpServer(\n graph: KnowledgeGraph,\n repoName: string,\n port = 4747,\n workspaceRoot?: string,\n): void {\n // Bootstrap check\n const db = getOrCreateUsersDB();\n if (!db.hasAnyUser()) {\n console.log('\\n ⚠ No admin account found.');\n console.log(' Run: code-intel user create admin --role admin\\n');\n }\n\n const app = createApp(graph, repoName, workspaceRoot);\n app.listen(port, () => {\n Logger.info(`Code Intelligence server running at http://localhost:${port}`);\n Logger.info(` Graph: ${graph.size.nodes} nodes, ${graph.size.edges} edges`);\n Logger.info(` Auth: login at http://localhost:${port}/auth/login`);\n\n // Start automated backup scheduler if enabled\n const scheduler = createBackupScheduler();\n scheduler.start(workspaceRoot);\n });\n}\n","export const ErrorCodes = {\n UNAUTHORIZED: 'CI-1000',\n FORBIDDEN: 'CI-1001',\n NOT_FOUND: 'CI-1002',\n ANALYSIS_IN_PROGRESS: 'CI-1003',\n INDEX_NOT_FOUND: 'CI-1004',\n DB_CORRUPTED: 'CI-1042',\n RATE_LIMIT_EXCEEDED: 'CI-1100',\n PAYLOAD_TOO_LARGE: 'CI-1101',\n INVALID_REQUEST: 'CI-1200',\n INTERNAL_ERROR: 'CI-5000',\n} as const;\n\nexport class AppError extends Error {\n constructor(\n public code: string,\n message: string,\n public hint: string,\n public statusCode: number = 500,\n public docs?: string,\n ) {\n super(message);\n this.name = 'AppError';\n }\n}\n","/**\n * Filesystem helpers that enforce restrictive POSIX permissions on\n * `.code-intel/` directories and the secret-bearing files inside them.\n *\n * Behaviour:\n * - Directories are created with mode 0o700 (owner-only access).\n * - Files are chmod'd to 0o600 (owner read/write only).\n * - On Windows (`process.platform === 'win32'`), chmod is largely a no-op;\n * callers should use ACLs instead. We still issue the calls so the\n * intent is documented and tested on POSIX.\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nconst SECURE_DIR_MODE = 0o700;\nconst SECURE_FILE_MODE = 0o600;\n\n/**\n * Create `dir` (and parents) with mode 0o700. Idempotent: if the directory\n * already exists with a looser mode, tighten it back to 0o700.\n */\nexport function secureMkdir(dir: string): void {\n fs.mkdirSync(dir, { recursive: true, mode: SECURE_DIR_MODE });\n // Re-apply mode in case the directory pre-existed with looser perms.\n if (process.platform !== 'win32') {\n try {\n fs.chmodSync(dir, SECURE_DIR_MODE);\n } catch {\n /* not fatal — read-only filesystems, ACL'd parents */\n }\n }\n}\n\n/**\n * chmod a file to 0o600. Safe to call on Windows (no-op).\n */\nexport function secureChmodFile(file: string): void {\n if (process.platform === 'win32') return;\n try {\n fs.chmodSync(file, SECURE_FILE_MODE);\n } catch {\n /* swallow — best-effort */\n }\n}\n\n/**\n * Write a file with mode 0o600 in a single atomic step. Creates parent dirs\n * with secureMkdir first.\n */\nexport function secureWriteFile(file: string, data: string | Buffer): void {\n secureMkdir(path.dirname(file));\n fs.writeFileSync(file, data, { mode: SECURE_FILE_MODE });\n // Re-apply explicit chmod for the case where the file already existed.\n secureChmodFile(file);\n}\n\n/**\n * Apply 0o600 to every `*.db` file inside `dir` (non-recursive). Used after\n * subsystems that wrap better-sqlite3 to seal the freshly-created DB files.\n */\nexport function tightenDbFiles(dir: string): void {\n if (process.platform === 'win32') return;\n if (!fs.existsSync(dir)) return;\n for (const name of fs.readdirSync(dir)) {\n if (name.endsWith('.db') || name.endsWith('.db-wal') || name.endsWith('.db-shm')) {\n try {\n fs.chmodSync(path.join(dir, name), SECURE_FILE_MODE);\n } catch {\n /* best-effort */\n }\n }\n }\n}\n\nexport const SECURE_MODES = {\n dir: SECURE_DIR_MODE,\n file: SECURE_FILE_MODE,\n};\n","import Database from 'better-sqlite3';\nimport bcrypt from 'bcrypt';\nimport crypto from 'node:crypto';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { v4 as uuidv4 } from 'uuid';\nimport { secureMkdir, secureChmodFile, tightenDbFiles } from '../shared/fs-secure.js';\n\nexport type Role = 'admin' | 'analyst' | 'viewer' | 'repo-owner';\n\nexport interface User {\n id: string;\n username: string;\n role: Role;\n createdAt: string;\n}\n\nexport interface Token {\n id: string;\n name: string;\n role: Role;\n scopedRepos?: string[]; // null/undefined means all repos\n scopedTools?: string[]; // null/undefined means all tools\n expiresAt?: string;\n lastUsedAt?: string;\n createdAt: string;\n}\n\nexport interface OIDCIdentity {\n id: string;\n userId: string;\n provider: string; // e.g. 'github', 'google', 'custom'\n sub: string; // Provider subject identifier\n email?: string;\n name?: string;\n createdAt: string;\n lastLoginAt?: string;\n}\n\nconst BCRYPT_ROUNDS = 12;\n\nexport class UsersDB {\n private db: Database.Database;\n\n constructor(dbPath: string) {\n const dir = path.dirname(dbPath);\n secureMkdir(dir);\n this.db = new Database(dbPath);\n this.db.pragma('journal_mode = WAL');\n this.db.pragma('foreign_keys = ON');\n this.createTables();\n // Ensure 0o600 on the freshly created .db (and -wal/-shm) files.\n secureChmodFile(dbPath);\n tightenDbFiles(dir);\n }\n\n private createTables(): void {\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS users (\n id TEXT PRIMARY KEY,\n username TEXT UNIQUE NOT NULL,\n passwordHash TEXT NOT NULL,\n role TEXT NOT NULL,\n createdAt TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS tokens (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n hashedToken TEXT UNIQUE NOT NULL,\n role TEXT NOT NULL,\n expiresAt TEXT NULL,\n lastUsedAt TEXT NULL,\n createdAt TEXT NOT NULL,\n revokedAt TEXT NULL\n );\n\n CREATE TABLE IF NOT EXISTS audit_log (\n id TEXT PRIMARY KEY,\n userId TEXT NOT NULL,\n resource TEXT NOT NULL,\n action TEXT NOT NULL,\n outcome TEXT NOT NULL,\n ip TEXT NOT NULL,\n timestamp TEXT NOT NULL\n );\n `);\n\n // OIDC identities — links a local user to an external provider subject\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS oidc_identities (\n id TEXT PRIMARY KEY,\n userId TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,\n provider TEXT NOT NULL,\n sub TEXT NOT NULL,\n email TEXT NULL,\n name TEXT NULL,\n createdAt TEXT NOT NULL,\n lastLoginAt TEXT NULL,\n UNIQUE (provider, sub)\n );\n `);\n\n // Add columns if they don't exist (idempotent migration)\n try { this.db.exec(`ALTER TABLE tokens ADD COLUMN scopedRepos TEXT NULL`); } catch { /* already exists */ }\n try { this.db.exec(`ALTER TABLE tokens ADD COLUMN scopedTools TEXT NULL`); } catch { /* already exists */ }\n }\n\n // ── Users ──────────────────────────────────────────────────────────────────\n\n createUser(username: string, password: string, role: Role): User {\n const id = uuidv4();\n const passwordHash = bcrypt.hashSync(password, BCRYPT_ROUNDS);\n const createdAt = new Date().toISOString();\n\n this.db\n .prepare(\n 'INSERT INTO users (id, username, passwordHash, role, createdAt) VALUES (?, ?, ?, ?, ?)',\n )\n .run(id, username, passwordHash, role, createdAt);\n\n return { id, username, role, createdAt };\n }\n\n findUserByUsername(username: string): (User & { passwordHash: string }) | null {\n const row = this.db\n .prepare('SELECT id, username, passwordHash, role, createdAt FROM users WHERE username = ?')\n .get(username) as { id: string; username: string; passwordHash: string; role: string; createdAt: string } | undefined;\n\n if (!row) return null;\n return {\n id: row.id,\n username: row.username,\n passwordHash: row.passwordHash,\n role: row.role as Role,\n createdAt: row.createdAt,\n };\n }\n\n listUsers(): User[] {\n const rows = this.db\n .prepare('SELECT id, username, role, createdAt FROM users ORDER BY createdAt ASC')\n .all() as { id: string; username: string; role: string; createdAt: string }[];\n return rows.map((r) => ({ id: r.id, username: r.username, role: r.role as Role, createdAt: r.createdAt }));\n }\n\n deleteUser(username: string): void {\n this.db.prepare('DELETE FROM users WHERE username = ?').run(username);\n }\n\n setRole(username: string, role: Role): void {\n this.db.prepare('UPDATE users SET role = ? WHERE username = ?').run(role, username);\n }\n\n resetPassword(username: string, newPassword: string): void {\n const passwordHash = bcrypt.hashSync(newPassword, BCRYPT_ROUNDS);\n this.db.prepare('UPDATE users SET passwordHash = ? WHERE username = ?').run(passwordHash, username);\n }\n\n // ── Tokens ─────────────────────────────────────────────────────────────────\n\n createToken(\n name: string,\n role: Role,\n expiresAt?: string,\n scopedRepos?: string[],\n scopedTools?: string[],\n ): { token: Token; rawToken: string } {\n const id = uuidv4();\n const rawToken = `cit_${crypto.randomBytes(32).toString('hex')}`;\n const hashedToken = crypto.createHash('sha256').update(rawToken).digest('hex');\n const createdAt = new Date().toISOString();\n\n this.db\n .prepare(\n 'INSERT INTO tokens (id, name, hashedToken, role, expiresAt, lastUsedAt, createdAt, revokedAt, scopedRepos, scopedTools) VALUES (?, ?, ?, ?, ?, NULL, ?, NULL, ?, ?)',\n )\n .run(\n id,\n name,\n hashedToken,\n role,\n expiresAt ?? null,\n createdAt,\n scopedRepos ? JSON.stringify(scopedRepos) : null,\n scopedTools ? JSON.stringify(scopedTools) : null,\n );\n\n const token: Token = { id, name, role, scopedRepos, scopedTools, expiresAt, createdAt };\n return { token, rawToken };\n }\n\n findTokenByHash(hash: string): Token | null {\n const row = this.db\n .prepare(\n 'SELECT id, name, role, expiresAt, lastUsedAt, createdAt, scopedRepos, scopedTools FROM tokens WHERE hashedToken = ? AND revokedAt IS NULL',\n )\n .get(hash) as { id: string; name: string; role: string; expiresAt: string | null; lastUsedAt: string | null; createdAt: string; scopedRepos: string | null; scopedTools: string | null } | undefined;\n\n if (!row) return null;\n\n // Check expiry\n if (row.expiresAt && new Date(row.expiresAt) < new Date()) return null;\n\n return {\n id: row.id,\n name: row.name,\n role: row.role as Role,\n scopedRepos: row.scopedRepos ? (JSON.parse(row.scopedRepos) as string[]) : undefined,\n scopedTools: row.scopedTools ? (JSON.parse(row.scopedTools) as string[]) : undefined,\n expiresAt: row.expiresAt ?? undefined,\n lastUsedAt: row.lastUsedAt ?? undefined,\n createdAt: row.createdAt,\n };\n }\n\n listTokens(): Token[] {\n const rows = this.db\n .prepare(\n 'SELECT id, name, role, expiresAt, lastUsedAt, createdAt, scopedRepos, scopedTools FROM tokens WHERE revokedAt IS NULL ORDER BY createdAt ASC',\n )\n .all() as { id: string; name: string; role: string; expiresAt: string | null; lastUsedAt: string | null; createdAt: string; scopedRepos: string | null; scopedTools: string | null }[];\n\n return rows.map((r) => ({\n id: r.id,\n name: r.name,\n role: r.role as Role,\n scopedRepos: r.scopedRepos ? (JSON.parse(r.scopedRepos) as string[]) : undefined,\n scopedTools: r.scopedTools ? (JSON.parse(r.scopedTools) as string[]) : undefined,\n expiresAt: r.expiresAt ?? undefined,\n lastUsedAt: r.lastUsedAt ?? undefined,\n createdAt: r.createdAt,\n }));\n }\n\n revokeToken(id: string): void {\n this.db\n .prepare('UPDATE tokens SET revokedAt = ? WHERE id = ?')\n .run(new Date().toISOString(), id);\n }\n\n updateLastUsed(id: string): void {\n this.db\n .prepare('UPDATE tokens SET lastUsedAt = ? WHERE id = ?')\n .run(new Date().toISOString(), id);\n }\n\n // ── Audit log ──────────────────────────────────────────────────────────────\n\n logAccess(\n userId: string,\n resource: string,\n action: string,\n outcome: 'allow' | 'deny',\n ip: string,\n ): void {\n this.db\n .prepare(\n 'INSERT INTO audit_log (id, userId, resource, action, outcome, ip, timestamp) VALUES (?, ?, ?, ?, ?, ?, ?)',\n )\n .run(uuidv4(), userId, resource, action, outcome, ip, new Date().toISOString());\n }\n\n // ── OIDC Identity management ────────────────────────────────────────────────\n\n /**\n * Find an existing local user linked to an OIDC provider + sub.\n * Returns `null` if no such link exists yet (first login → auto-provision).\n */\n findUserByOIDC(provider: string, sub: string): (User & { oidcIdentityId: string }) | null {\n const row = this.db\n .prepare(`\n SELECT u.id, u.username, u.role, u.createdAt, oi.id as oidcId\n FROM oidc_identities oi\n JOIN users u ON u.id = oi.userId\n WHERE oi.provider = ? AND oi.sub = ?\n `)\n .get(provider, sub) as {\n id: string; username: string; role: string; createdAt: string; oidcId: string\n } | undefined;\n\n if (!row) return null;\n return {\n id: row.id,\n username: row.username,\n role: row.role as Role,\n createdAt: row.createdAt,\n oidcIdentityId: row.oidcId,\n };\n }\n\n /**\n * Create a local user and link it to an OIDC identity in a single transaction.\n * Password is set to a random 32-byte value — the user can only log in via OIDC.\n */\n provisionOIDCUser(\n username: string,\n role: Role,\n provider: string,\n sub: string,\n email?: string,\n name?: string,\n ): { user: User; oidcIdentityId: string } {\n // Random password — user cannot log in with it (OIDC only)\n const randomPassword = crypto.randomBytes(32).toString('hex');\n const passwordHash = bcrypt.hashSync(randomPassword, BCRYPT_ROUNDS);\n const userId = uuidv4();\n const identityId = uuidv4();\n const now = new Date().toISOString();\n\n const insertUser = this.db.prepare(\n 'INSERT INTO users (id, username, passwordHash, role, createdAt) VALUES (?, ?, ?, ?, ?)',\n );\n const insertIdentity = this.db.prepare(\n 'INSERT INTO oidc_identities (id, userId, provider, sub, email, name, createdAt, lastLoginAt) VALUES (?, ?, ?, ?, ?, ?, ?, ?)',\n );\n\n // Wrap in a transaction for atomicity\n const run = this.db.transaction(() => {\n insertUser.run(userId, username, passwordHash, role, now);\n insertIdentity.run(identityId, userId, provider, sub, email ?? null, name ?? null, now, now);\n });\n run();\n\n const user: User = { id: userId, username, role, createdAt: now };\n return { user, oidcIdentityId: identityId };\n }\n\n /**\n * Link an existing local user to a new OIDC identity.\n */\n linkOIDCIdentity(\n userId: string,\n provider: string,\n sub: string,\n email?: string,\n name?: string,\n ): string {\n const id = uuidv4();\n const now = new Date().toISOString();\n this.db\n .prepare(\n 'INSERT OR REPLACE INTO oidc_identities (id, userId, provider, sub, email, name, createdAt, lastLoginAt) VALUES (?, ?, ?, ?, ?, ?, ?, ?)',\n )\n .run(id, userId, provider, sub, email ?? null, name ?? null, now, now);\n return id;\n }\n\n /**\n * Update lastLoginAt timestamp for an OIDC identity.\n */\n touchOIDCIdentity(provider: string, sub: string): void {\n this.db\n .prepare(\n 'UPDATE oidc_identities SET lastLoginAt = ? WHERE provider = ? AND sub = ?',\n )\n .run(new Date().toISOString(), provider, sub);\n }\n\n /**\n * List all OIDC identities linked to a user.\n */\n listOIDCIdentities(userId: string): OIDCIdentity[] {\n const rows = this.db\n .prepare(\n 'SELECT id, userId, provider, sub, email, name, createdAt, lastLoginAt FROM oidc_identities WHERE userId = ?',\n )\n .all(userId) as {\n id: string; userId: string; provider: string; sub: string;\n email: string | null; name: string | null; createdAt: string; lastLoginAt: string | null\n }[];\n return rows.map((r) => ({\n id: r.id,\n userId: r.userId,\n provider: r.provider,\n sub: r.sub,\n email: r.email ?? undefined,\n name: r.name ?? undefined,\n createdAt: r.createdAt,\n lastLoginAt: r.lastLoginAt ?? undefined,\n }));\n }\n\n /**\n * Unlink an OIDC identity from a user (by identityId).\n */\n unlinkOIDCIdentity(identityId: string): void {\n this.db.prepare('DELETE FROM oidc_identities WHERE id = ?').run(identityId);\n }\n\n // ── Audit log query ────────────────────────────────────────────────────────\n\n /**\n * Retrieve recent audit log entries (most-recent first).\n * Primarily intended for testing and admin inspection.\n */\n getAuditLog(limit = 100): { id: string; userId: string; resource: string; action: string; outcome: string; ip: string; timestamp: string }[] {\n return this.db\n .prepare(\n 'SELECT id, userId, resource, action, outcome, ip, timestamp FROM audit_log ORDER BY timestamp DESC LIMIT ?',\n )\n .all(limit) as { id: string; userId: string; resource: string; action: string; outcome: string; ip: string; timestamp: string }[];\n }\n\n // ── Bootstrap check ────────────────────────────────────────────────────────\n\n hasAnyUser(): boolean {\n const row = this.db.prepare('SELECT COUNT(*) as count FROM users').get() as { count: number };\n return row.count > 0;\n }\n\n close(): void {\n this.db.close();\n }\n}\n\nexport function getUsersDBPath(): string {\n return process.env['CODE_INTEL_USERS_DB_PATH'] ?? path.join(os.homedir(), '.code-intel', 'users.db');\n}\n\nlet _usersDB: UsersDB | null = null;\n\nexport function getOrCreateUsersDB(): UsersDB {\n if (!_usersDB) {\n _usersDB = new UsersDB(getUsersDBPath());\n }\n return _usersDB;\n}\n\n/**\n * Reset the UsersDB singleton. Used in tests to isolate per-test databases.\n * DO NOT call in production code.\n */\nexport function resetUsersDBForTesting(): void {\n if (_usersDB) {\n try { _usersDB.close(); } catch { /* ignore */ }\n }\n _usersDB = null;\n}\n","/**\n * Encrypted `.code-intel/.secrets` store (AES-256-GCM).\n *\n * Layout on disk:\n * ┌─────────────┬─────────────┬─────────────┬──────────────┐\n * │ salt(16) │ iv(12) │ authTag(16)│ ciphertext │\n * └─────────────┴─────────────┴─────────────┴──────────────┘\n *\n * Key derivation: scrypt(password, salt, 32 bytes, N=2^15).\n * Password sources (in order):\n * 1. `CODE_INTEL_SECRET_KEY` env var (caller-supplied)\n * 2. A machine-bound passphrase derived from `os.hostname() + os.userInfo()`\n * (good enough for local-only persistence; user MUST set the env var\n * for any networked or shared machine).\n */\n\nimport crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { secureMkdir, secureWriteFile, secureChmodFile } from '../shared/fs-secure.js';\n\nconst ALG = 'aes-256-gcm';\nconst KEY_LEN = 32;\nconst SALT_LEN = 16;\nconst IV_LEN = 12;\nconst TAG_LEN = 16;\n// scrypt cost: read at call time so tests can lower it via CODE_INTEL_SCRYPT_N.\n// Default N=2^14 uses ~16MB RAM — well within Node's maxmem defaults.\nfunction getScryptN(): number {\n const v = parseInt(process.env['CODE_INTEL_SCRYPT_N'] ?? '', 10);\n return (Number.isInteger(v) && v >= 1024) ? v : (1 << 14);\n}\n\nexport interface SecretsBlob {\n [key: string]: string;\n}\n\nexport function getSecretsPath(): string {\n return (\n process.env['CODE_INTEL_SECRETS_PATH'] ??\n path.join(os.homedir(), '.code-intel', '.secrets')\n );\n}\n\nfunction getMasterPassword(): string {\n const fromEnv = process.env['CODE_INTEL_SECRET_KEY'];\n if (fromEnv && fromEnv.length >= 16) return fromEnv;\n // Machine-bound fallback.\n let username = 'unknown';\n try {\n username = os.userInfo().username;\n } catch {\n /* ignore */\n }\n return `code-intel-machine:${os.hostname()}:${username}:${os.platform()}`;\n}\n\nfunction deriveKey(password: string, salt: Buffer): Buffer {\n return crypto.scryptSync(password, salt, KEY_LEN, { N: getScryptN(), r: 8, p: 1 });\n}\n\nexport function encryptSecrets(blob: SecretsBlob): Buffer {\n const password = getMasterPassword();\n const salt = crypto.randomBytes(SALT_LEN);\n const iv = crypto.randomBytes(IV_LEN);\n const key = deriveKey(password, salt);\n const cipher = crypto.createCipheriv(ALG, key, iv);\n const plaintext = Buffer.from(JSON.stringify(blob), 'utf8');\n const ciphertext = Buffer.concat([cipher.update(plaintext), cipher.final()]);\n const authTag = cipher.getAuthTag();\n return Buffer.concat([salt, iv, authTag, ciphertext]);\n}\n\nexport function decryptSecrets(encrypted: Buffer): SecretsBlob {\n if (encrypted.length < SALT_LEN + IV_LEN + TAG_LEN) {\n throw new Error('Secrets blob is truncated or invalid');\n }\n const salt = encrypted.subarray(0, SALT_LEN);\n const iv = encrypted.subarray(SALT_LEN, SALT_LEN + IV_LEN);\n const authTag = encrypted.subarray(SALT_LEN + IV_LEN, SALT_LEN + IV_LEN + TAG_LEN);\n const ciphertext = encrypted.subarray(SALT_LEN + IV_LEN + TAG_LEN);\n\n const password = getMasterPassword();\n const key = deriveKey(password, salt);\n const decipher = crypto.createDecipheriv(ALG, key, iv);\n decipher.setAuthTag(authTag);\n const plaintext = Buffer.concat([decipher.update(ciphertext), decipher.final()]);\n return JSON.parse(plaintext.toString('utf8')) as SecretsBlob;\n}\n\n/**\n * Read the on-disk secrets file. Returns `{}` if the file does not exist.\n * Throws if the file exists but is corrupted / wrong key.\n */\nexport function loadSecrets(secretsPath: string = getSecretsPath()): SecretsBlob {\n if (!fs.existsSync(secretsPath)) return {};\n const blob = fs.readFileSync(secretsPath);\n return decryptSecrets(blob);\n}\n\nexport function saveSecrets(\n blob: SecretsBlob,\n secretsPath: string = getSecretsPath(),\n): void {\n secureMkdir(path.dirname(secretsPath));\n const encrypted = encryptSecrets(blob);\n secureWriteFile(secretsPath, encrypted);\n secureChmodFile(secretsPath);\n}\n\nexport function setSecret(\n key: string,\n value: string,\n secretsPath: string = getSecretsPath(),\n): void {\n const blob = loadSecrets(secretsPath);\n blob[key] = value;\n saveSecrets(blob, secretsPath);\n}\n\nexport function getSecret(\n key: string,\n secretsPath: string = getSecretsPath(),\n): string | undefined {\n return loadSecrets(secretsPath)[key];\n}\n\nexport function deleteSecret(\n key: string,\n secretsPath: string = getSecretsPath(),\n): void {\n const blob = loadSecrets(secretsPath);\n delete blob[key];\n saveSecrets(blob, secretsPath);\n}\n\nexport function listSecretKeys(secretsPath: string = getSecretsPath()): string[] {\n return Object.keys(loadSecrets(secretsPath));\n}\n","import type { Request, Response, NextFunction } from 'express';\nimport crypto from 'node:crypto';\nimport { v4 as uuidv4 } from 'uuid';\nimport bcrypt from 'bcrypt';\nimport type { Role } from './users-db.js';\nimport { getOrCreateUsersDB } from './users-db.js';\nimport { ErrorCodes } from '../errors/codes.js';\nimport { getSecret } from './secret-store.js';\n\n// ── Augment Express request ───────────────────────────────────────────────────\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace Express {\n interface Request {\n user?: { id: string; username: string; role: Role; authMethod: 'session' | 'token'; scopedRepos?: string[]; scopedTools?: string[] };\n requestId?: string;\n }\n }\n}\n\n// ── Session store ─────────────────────────────────────────────────────────────\n\nexport interface SessionEntry {\n userId: string;\n username: string;\n role: Role;\n expiresAt: number;\n}\n\nexport const sessionStore = new Map<string, SessionEntry>();\n\nconst SESSION_COOKIE_NAME = 'code_intel_session';\n\nfunction getSessionTtlMs(): number {\n const hours = parseInt(process.env['CODE_INTEL_SESSION_TTL_HOURS'] ?? '8', 10);\n return (isNaN(hours) ? 8 : hours) * 60 * 60 * 1000;\n}\n\nexport function createSession(user: { id: string; username: string; role: Role }): string {\n const sessionId = uuidv4();\n const expiresAt = Date.now() + getSessionTtlMs();\n sessionStore.set(sessionId, { userId: user.id, username: user.username, role: user.role, expiresAt });\n return sessionId;\n}\n\nexport function getSession(sessionId: string): SessionEntry | null {\n const entry = sessionStore.get(sessionId);\n if (!entry) return null;\n if (Date.now() > entry.expiresAt) {\n sessionStore.delete(sessionId);\n return null;\n }\n // Slide the window: if more than 25% of TTL has elapsed, renew\n const ttlMs = getSessionTtlMs();\n const remaining = entry.expiresAt - Date.now();\n if (remaining < ttlMs * 0.75) {\n entry.expiresAt = Date.now() + ttlMs;\n }\n return entry;\n}\n\nexport function deleteSession(sessionId: string): void {\n sessionStore.delete(sessionId);\n}\n\n// ── Middleware: attach requestId ──────────────────────────────────────────────\n\nexport function requestIdMiddleware(req: Request, res: Response, next: NextFunction): void {\n req.requestId = uuidv4();\n res.setHeader('X-Request-ID', req.requestId);\n next();\n}\n\n// ── Helper: is localhost ──────────────────────────────────────────────────────\n\nfunction isLocalhost(req: Request): boolean {\n const ip = req.ip ?? req.socket?.remoteAddress ?? '';\n return ip === '127.0.0.1' || ip === '::1' || ip === '::ffff:127.0.0.1';\n}\n\n// ── Middleware: authenticate via session OR Bearer token ──────────────────────\n\nexport function authMiddleware(req: Request, res: Response, next: NextFunction): void {\n // 1. Try session cookie\n const cookies = parseCookies(req.headers['cookie'] ?? '');\n const sessionId = cookies[SESSION_COOKIE_NAME];\n if (sessionId) {\n const session = getSession(sessionId);\n if (session) {\n req.user = { id: session.userId, username: session.username, role: session.role, authMethod: 'session' };\n // Refresh session cookie if the session was renewed (sliding window)\n res.setHeader('Set-Cookie', buildSessionCookie(sessionId));\n next();\n return;\n }\n }\n\n // 2. Try Bearer token\n const authHeader = req.headers['authorization'] ?? '';\n if (authHeader.startsWith('Bearer ')) {\n const rawToken = authHeader.slice(7).trim();\n if (rawToken) {\n const hash = crypto.createHash('sha256').update(rawToken).digest('hex');\n const db = getOrCreateUsersDB();\n const tokenRecord = db.findTokenByHash(hash);\n if (tokenRecord) {\n // Check rotation grace period — if this token was rotated, allow it\n // only until the grace expiry stored at rotate-grace:<id>.\n const graceKey = `rotate-grace:${tokenRecord.id}`;\n try {\n const graceExpiry = getSecret(graceKey);\n if (graceExpiry && new Date(graceExpiry) < new Date()) {\n // Grace period has elapsed — revoke immediately and deny\n setImmediate(() => db.revokeToken(tokenRecord.id));\n next();\n return;\n }\n } catch {\n /* secret store unavailable — proceed normally */\n }\n // Update last used asynchronously (fire-and-forget)\n setImmediate(() => db.updateLastUsed(tokenRecord.id));\n req.user = {\n id: tokenRecord.id,\n username: `token:${tokenRecord.name}`,\n role: tokenRecord.role,\n authMethod: 'token',\n scopedRepos: tokenRecord.scopedRepos,\n scopedTools: tokenRecord.scopedTools,\n };\n next();\n return;\n }\n }\n }\n\n // 3. Dev auto-login\n if (process.env['CODE_INTEL_DEV_AUTO_LOGIN'] === 'true' && isLocalhost(req)) {\n const db = getOrCreateUsersDB();\n const users = db.listUsers();\n if (users.length === 1 && users[0]!.role === 'admin') {\n const user = users[0]!;\n req.user = { id: user.id, username: user.username, role: user.role, authMethod: 'session' };\n }\n }\n\n next();\n}\n\n// ── Middleware: require authentication ────────────────────────────────────────\n\nexport function requireAuth(req: Request, res: Response, next: NextFunction): void {\n if (!req.user) {\n res.status(401).json({\n error: {\n code: ErrorCodes.UNAUTHORIZED,\n message: 'Authentication required',\n hint: 'Provide Authorization: Bearer <token> header or login at /auth/login',\n requestId: req.requestId,\n timestamp: new Date().toISOString(),\n },\n });\n return;\n }\n next();\n}\n\n// ── Middleware factory: require role ──────────────────────────────────────────\n\nexport function requireRole(\n ...roles: Role[]\n): (req: Request, res: Response, next: NextFunction) => void {\n return (req: Request, res: Response, next: NextFunction): void => {\n if (!req.user) {\n res.status(401).json({\n error: {\n code: ErrorCodes.UNAUTHORIZED,\n message: 'Authentication required',\n hint: 'Provide Authorization: Bearer <token> header or login at /auth/login',\n requestId: req.requestId,\n timestamp: new Date().toISOString(),\n },\n });\n return;\n }\n if (!roles.includes(req.user.role)) {\n res.status(403).json({\n error: {\n code: ErrorCodes.FORBIDDEN,\n message: 'Insufficient permissions',\n hint: 'Your role does not have access to this resource',\n requestId: req.requestId,\n timestamp: new Date().toISOString(),\n },\n });\n return;\n }\n next();\n };\n}\n\n// ── Middleware factory: require repo access ───────────────────────────────────\n\nexport function requireRepoAccess(\n getRepoId: (req: Request) => string | undefined,\n): (req: Request, res: Response, next: NextFunction) => void {\n return (req: Request, res: Response, next: NextFunction): void => {\n if (!req.user) {\n res.status(401).json({\n error: {\n code: ErrorCodes.UNAUTHORIZED,\n message: 'Authentication required',\n requestId: req.requestId,\n timestamp: new Date().toISOString(),\n },\n });\n return;\n }\n // Admin and analyst have access to all repos\n if (req.user.role === 'admin' || req.user.role === 'analyst') {\n next();\n return;\n }\n // Check token repo scoping\n if (req.user.authMethod === 'token' && req.user.scopedRepos && req.user.scopedRepos.length > 0) {\n const repoId = getRepoId(req);\n if (repoId && !req.user.scopedRepos.includes(repoId)) {\n res.status(403).json({\n error: {\n code: ErrorCodes.FORBIDDEN,\n message: 'Token does not have access to this repository',\n hint: `This token is scoped to: ${req.user.scopedRepos.join(', ')}`,\n requestId: req.requestId,\n timestamp: new Date().toISOString(),\n },\n });\n return;\n }\n }\n next();\n };\n}\n\nexport function requireToolScope(\n toolName: string,\n): (req: Request, res: Response, next: NextFunction) => void {\n return (req: Request, res: Response, next: NextFunction): void => {\n if (!req.user) {\n res.status(401).json({\n error: {\n code: ErrorCodes.UNAUTHORIZED,\n message: 'Authentication required',\n requestId: req.requestId,\n timestamp: new Date().toISOString(),\n },\n });\n return;\n }\n // No tool scoping set → allow all\n if (!req.user.scopedTools || req.user.scopedTools.length === 0) {\n next();\n return;\n }\n if (!req.user.scopedTools.includes(toolName)) {\n res.status(403).json({\n error: {\n code: ErrorCodes.FORBIDDEN,\n message: `Token does not have access to tool: ${toolName}`,\n hint: `This token is scoped to tools: ${req.user.scopedTools.join(', ')}`,\n requestId: req.requestId,\n timestamp: new Date().toISOString(),\n },\n });\n return;\n }\n next();\n };\n}\n\nexport function parseCookies(cookieHeader: string): Record<string, string> {\n const result: Record<string, string> = {};\n for (const part of cookieHeader.split(';')) {\n const [key, ...vals] = part.trim().split('=');\n if (key) result[key.trim()] = decodeURIComponent(vals.join('=').trim());\n }\n return result;\n}\n\n// ── Cookie helpers (used in app.ts auth routes) ───────────────────────────────\n\nexport function buildSessionCookie(sessionId: string): string {\n const isProduction = process.env['NODE_ENV'] === 'production';\n const maxAge = Math.floor(getSessionTtlMs() / 1000);\n const parts = [\n `${SESSION_COOKIE_NAME}=${encodeURIComponent(sessionId)}`,\n `HttpOnly`,\n `Max-Age=${maxAge}`,\n `Path=/`,\n `SameSite=${isProduction ? 'Strict' : 'Lax'}`,\n ];\n if (isProduction) parts.push('Secure');\n return parts.join('; ');\n}\n\nexport function clearSessionCookie(): string {\n return `${SESSION_COOKIE_NAME}=; HttpOnly; Max-Age=0; Path=/; SameSite=Lax`;\n}\n\n// ── Re-export bcrypt verify for use in auth routes ────────────────────────────\n\nexport async function verifyPassword(plain: string, hash: string): Promise<boolean> {\n return bcrypt.compare(plain, hash);\n}\n","/**\n * Durable Job Model — jobs.db\n *\n * State machine: pending → running → success | failed | cancelled\n * - Jobs survive process restart\n * - Retry with exponential backoff (3 attempts: 5s, 30s, 120s)\n * - Dead-letter queue for exhausted retries\n * - Idempotent job submission\n */\nimport Database from 'better-sqlite3';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\nimport { v4 as uuidv4 } from 'uuid';\n\nexport type JobStatus = 'pending' | 'running' | 'success' | 'failed' | 'cancelled' | 'dead';\nexport type JobKind = 'analyze' | 'backup' | 'sync' | 'embed';\n\nexport interface Job {\n id: string;\n kind: JobKind;\n status: JobStatus;\n repoPath: string;\n params: string; // JSON string\n attempts: number;\n maxAttempts: number;\n createdAt: string;\n startedAt?: string;\n finishedAt?: string;\n error?: string;\n result?: string; // JSON string\n}\n\nconst RETRY_DELAYS_SECONDS = [5, 30, 120];\nconst MAX_ATTEMPTS = 3;\nconst STUCK_THRESHOLD_MINUTES = 30;\n\nexport class JobsDB {\n private db: Database.Database;\n\n constructor(dbPath: string) {\n fs.mkdirSync(path.dirname(dbPath), { recursive: true });\n this.db = new Database(dbPath);\n this.db.pragma('journal_mode = WAL');\n this.db.pragma('foreign_keys = ON');\n this.createTables();\n // On startup, recover any jobs that were 'running' when the process died\n this.recoverStuckJobs();\n }\n\n private createTables(): void {\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS jobs (\n id TEXT PRIMARY KEY,\n kind TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'pending',\n repoPath TEXT NOT NULL,\n params TEXT NOT NULL DEFAULT '{}',\n attempts INTEGER NOT NULL DEFAULT 0,\n maxAttempts INTEGER NOT NULL DEFAULT ${MAX_ATTEMPTS},\n createdAt TEXT NOT NULL,\n startedAt TEXT NULL,\n finishedAt TEXT NULL,\n error TEXT NULL,\n result TEXT NULL,\n nextRetryAt TEXT NULL,\n idempotencyKey TEXT UNIQUE NULL\n );\n CREATE INDEX IF NOT EXISTS jobs_status ON jobs(status);\n CREATE INDEX IF NOT EXISTS jobs_repoPath ON jobs(repoPath);\n `);\n }\n\n /**\n * Submit a job. Idempotent: same idempotencyKey returns the existing job.\n */\n submit(kind: JobKind, repoPath: string, params: Record<string, unknown> = {}, idempotencyKey?: string): Job {\n // Check idempotency\n if (idempotencyKey) {\n const existing = this.db\n .prepare('SELECT * FROM jobs WHERE idempotencyKey = ?')\n .get(idempotencyKey) as Record<string, unknown> | undefined;\n if (existing) return this._mapRow(existing);\n }\n\n const id = uuidv4();\n const createdAt = new Date().toISOString();\n this.db\n .prepare(\n `INSERT INTO jobs (id, kind, status, repoPath, params, attempts, maxAttempts, createdAt, idempotencyKey)\n VALUES (?, ?, 'pending', ?, ?, 0, ?, ?, ?)`,\n )\n .run(id, kind, repoPath, JSON.stringify(params), MAX_ATTEMPTS, createdAt, idempotencyKey ?? null);\n\n return this.getJob(id)!;\n }\n\n getJob(id: string): Job | null {\n const row = this.db.prepare('SELECT * FROM jobs WHERE id = ?').get(id);\n if (!row) return null;\n return this._mapRow(row as Record<string, unknown>);\n }\n\n listJobs(filters: { status?: JobStatus; repoPath?: string } = {}): Job[] {\n let sql = 'SELECT * FROM jobs WHERE 1=1';\n const params: unknown[] = [];\n if (filters.status) { sql += ' AND status = ?'; params.push(filters.status); }\n if (filters.repoPath) { sql += ' AND repoPath = ?'; params.push(filters.repoPath); }\n sql += ' ORDER BY createdAt DESC LIMIT 100';\n const rows = this.db.prepare(sql).all(...params) as Record<string, unknown>[];\n return rows.map((r) => this._mapRow(r));\n }\n\n /**\n * Mark a job as running (transitions from pending).\n */\n markRunning(id: string): void {\n this.db\n .prepare(`UPDATE jobs SET status = 'running', startedAt = ?, attempts = attempts + 1 WHERE id = ? AND status IN ('pending', 'failed')`)\n .run(new Date().toISOString(), id);\n }\n\n /**\n * Mark a job as succeeded.\n */\n markSuccess(id: string, result?: Record<string, unknown>): void {\n this.db\n .prepare(`UPDATE jobs SET status = 'success', finishedAt = ?, result = ? WHERE id = ?`)\n .run(new Date().toISOString(), result ? JSON.stringify(result) : null, id);\n }\n\n /**\n * Mark a job as failed. If max attempts reached, move to 'dead'. Otherwise schedule retry.\n */\n markFailed(id: string, error: string): void {\n const job = this.getJob(id);\n if (!job) return;\n\n if (job.attempts >= job.maxAttempts) {\n this.db\n .prepare(`UPDATE jobs SET status = 'dead', finishedAt = ?, error = ? WHERE id = ?`)\n .run(new Date().toISOString(), error, id);\n } else {\n const delaySeconds = RETRY_DELAYS_SECONDS[job.attempts] ?? 120;\n const nextRetryAt = new Date(Date.now() + delaySeconds * 1000).toISOString();\n this.db\n .prepare(`UPDATE jobs SET status = 'failed', finishedAt = ?, error = ?, nextRetryAt = ? WHERE id = ?`)\n .run(new Date().toISOString(), error, nextRetryAt, id);\n }\n }\n\n /**\n * Cancel a pending or running job.\n */\n cancel(id: string): boolean {\n const info = this.db\n .prepare(`UPDATE jobs SET status = 'cancelled', finishedAt = ? WHERE id = ? AND status IN ('pending', 'running')`)\n .run(new Date().toISOString(), id);\n return (info.changes ?? 0) > 0;\n }\n\n /**\n * Get jobs ready to retry (failed with nextRetryAt in the past).\n */\n getPendingRetries(): Job[] {\n const now = new Date().toISOString();\n const rows = this.db\n .prepare(`SELECT * FROM jobs WHERE status = 'failed' AND nextRetryAt <= ? AND attempts < maxAttempts`)\n .all(now) as Record<string, unknown>[];\n return rows.map((r) => this._mapRow(r));\n }\n\n /**\n * Recover jobs stuck in 'running' state (process crash recovery).\n */\n private recoverStuckJobs(): void {\n const cutoff = new Date(Date.now() - STUCK_THRESHOLD_MINUTES * 60 * 1000).toISOString();\n // Jobs stuck running for > 30min → re-queue as failed for retry\n this.db\n .prepare(`UPDATE jobs SET status = 'failed', error = 'Process crash or stuck job — recovered on restart', nextRetryAt = datetime('now') WHERE status = 'running' AND startedAt < ?`)\n .run(cutoff);\n }\n\n /**\n * Detect jobs stuck for > 30 min (running but not completed).\n */\n detectStuckJobs(): Job[] {\n const cutoff = new Date(Date.now() - STUCK_THRESHOLD_MINUTES * 60 * 1000).toISOString();\n const rows = this.db\n .prepare(`SELECT * FROM jobs WHERE status = 'running' AND startedAt < ?`)\n .all(cutoff) as Record<string, unknown>[];\n return rows.map((r) => this._mapRow(r));\n }\n\n close(): void {\n this.db.close();\n }\n\n private _mapRow(row: Record<string, unknown>): Job {\n return {\n id: row['id'] as string,\n kind: row['kind'] as JobKind,\n status: row['status'] as JobStatus,\n repoPath: row['repoPath'] as string,\n params: row['params'] as string,\n attempts: row['attempts'] as number,\n maxAttempts: row['maxAttempts'] as number,\n createdAt: row['createdAt'] as string,\n startedAt: (row['startedAt'] as string | null) ?? undefined,\n finishedAt: (row['finishedAt'] as string | null) ?? undefined,\n error: (row['error'] as string | null) ?? undefined,\n result: (row['result'] as string | null) ?? undefined,\n };\n }\n}\n\nexport function getJobsDBPath(): string {\n return path.join(os.homedir(), '.code-intel', 'jobs.db');\n}\n\nlet _jobsDB: JobsDB | null = null;\nexport function getOrCreateJobsDB(): JobsDB {\n if (!_jobsDB) _jobsDB = new JobsDB(getJobsDBPath());\n return _jobsDB;\n}\n","/**\n * LLM Governance Logger — opt-in audit log for AI/LLM calls.\n *\n * When CODE_INTEL_GOVERNANCE_LOGGING=true, logs every LLM invocation to\n * ~/.code-intel/llm-governance.jsonl (JSON Lines format).\n *\n * IMPORTANT: Never log raw source code, file contents, tokens, or passwords.\n * Only log: model, user/agent identity, tool/purpose, token counts, timestamp.\n */\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\nimport { v4 as uuidv4 } from 'uuid';\n\nexport interface GovernanceLogEntry {\n id: string;\n timestamp: string;\n model: string;\n userId: string;\n purpose: string;\n promptTokens: number;\n responseTokens: number;\n durationMs: number;\n outcome: 'success' | 'error';\n errorCode?: string;\n}\n\nexport class LLMGovernanceLogger {\n /** Is governance logging enabled? */\n isEnabled(): boolean {\n return process.env['CODE_INTEL_GOVERNANCE_LOGGING'] === 'true';\n }\n\n /** Path to the JSONL log file. */\n getLogPath(): string {\n return (\n process.env['CODE_INTEL_GOVERNANCE_LOG_PATH'] ??\n path.join(os.homedir(), '.code-intel', 'llm-governance.jsonl')\n );\n }\n\n /**\n * Append an entry to the governance log.\n * No-op when isEnabled() returns false.\n * Never throws — governance must not impact the request path.\n */\n log(entry: Omit<GovernanceLogEntry, 'id' | 'timestamp'>): void {\n if (!this.isEnabled()) return;\n try {\n const full: GovernanceLogEntry = {\n id: uuidv4(),\n timestamp: new Date().toISOString(),\n ...entry,\n };\n const logPath = this.getLogPath();\n fs.mkdirSync(path.dirname(logPath), { recursive: true });\n fs.appendFileSync(logPath, JSON.stringify(full) + '\\n', 'utf-8');\n } catch {\n /* non-fatal — governance logging must never crash the app */\n }\n }\n\n /**\n * Read the last `limit` governance log entries (most-recent last, JSONL order).\n * Returns empty array when logging is disabled or file does not exist.\n */\n readLog(limit = 100): GovernanceLogEntry[] {\n try {\n const raw = fs.readFileSync(this.getLogPath(), 'utf-8');\n const lines = raw\n .split('\\n')\n .filter((l) => l.trim().length > 0)\n .slice(-limit);\n return lines.map((l) => JSON.parse(l) as GovernanceLogEntry);\n } catch {\n return [];\n }\n }\n}\n\n/** Singleton governance logger. */\nexport const governanceLogger = new LLMGovernanceLogger();\n","/**\n * BackupService — creates AES-256-GCM encrypted backups of all code-intel data.\n *\n * Archives: graph.db, vector.db, meta.json, registry, config\n * Encryption: AES-256-GCM with a per-backup random IV\n * Manifest: SHA-256 hash of each file\n * Optional S3 upload: set CODE_INTEL_BACKUP_S3_BUCKET + credentials\n */\nimport crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport https from 'node:https';\nimport path from 'node:path';\nimport os from 'node:os';\nimport { v4 as uuidv4 } from 'uuid';\n\n// ── S3 configuration ──────────────────────────────────────────────────────────\n\nexport interface S3Config {\n bucket: string;\n region: string;\n accessKeyId: string;\n secretAccessKey: string;\n prefix: string;\n}\n\nexport function getS3Config(): S3Config | null {\n const bucket = process.env['CODE_INTEL_BACKUP_S3_BUCKET'];\n const accessKeyId = process.env['CODE_INTEL_BACKUP_S3_ACCESS_KEY_ID'];\n const secretAccessKey = process.env['CODE_INTEL_BACKUP_S3_SECRET_ACCESS_KEY'];\n if (!bucket || !accessKeyId || !secretAccessKey) return null;\n return {\n bucket,\n region: process.env['CODE_INTEL_BACKUP_S3_REGION'] ?? 'us-east-1',\n accessKeyId,\n secretAccessKey,\n prefix: process.env['CODE_INTEL_BACKUP_S3_PREFIX'] ?? 'code-intel-backups/',\n };\n}\n\n// ── AWS SigV4 signing (pure Node.js, no extra deps) ───────────────────────────\n\nfunction hmac(key: Buffer | string, data: string): Buffer {\n return crypto.createHmac('sha256', key).update(data, 'utf-8').digest();\n}\n\nfunction sha256hex(data: Buffer | string): string {\n return crypto.createHash('sha256').update(data).digest('hex');\n}\n\nfunction sigV4SigningKey(secret: string, date: string, region: string, service: string): Buffer {\n const kDate = hmac(`AWS4${secret}`, date);\n const kRegion = hmac(kDate, region);\n const kService = hmac(kRegion, service);\n return hmac(kService, 'aws4_request');\n}\n\ninterface S3RequestOptions {\n method: string;\n cfg: S3Config;\n key: string; // S3 object key (without leading /)\n body?: Buffer;\n query?: Record<string, string>;\n}\n\nfunction s3Request(opts: S3RequestOptions): Promise<{ statusCode: number; body: string }> {\n return new Promise((resolve, reject) => {\n const { method, cfg, key, body, query } = opts;\n const host = `${cfg.bucket}.s3.${cfg.region}.amazonaws.com`;\n const now = new Date();\n const amzDate = now.toISOString().replace(/[:\\-]|\\.\\d{3}/g, '').slice(0, 15) + 'Z'; // YYYYMMDDTHHMMSSz\n const dateStamp = amzDate.slice(0, 8); // YYYYMMDD\n\n const payloadHash = body ? sha256hex(body) : sha256hex(Buffer.alloc(0));\n const encodedPath = `/${key.split('/').map(encodeURIComponent).join('/')}`;\n\n const queryStr = query\n ? Object.keys(query).sort().map((k) => `${encodeURIComponent(k)}=${encodeURIComponent(query[k]!)}`).join('&')\n : '';\n\n const canonicalHeaders =\n `host:${host}\\n` +\n `x-amz-content-sha256:${payloadHash}\\n` +\n `x-amz-date:${amzDate}\\n`;\n const signedHeaders = 'host;x-amz-content-sha256;x-amz-date';\n\n const canonicalRequest = [\n method,\n encodedPath,\n queryStr,\n canonicalHeaders,\n signedHeaders,\n payloadHash,\n ].join('\\n');\n\n const credentialScope = `${dateStamp}/${cfg.region}/s3/aws4_request`;\n const stringToSign = [\n 'AWS4-HMAC-SHA256',\n amzDate,\n credentialScope,\n sha256hex(Buffer.from(canonicalRequest, 'utf-8')),\n ].join('\\n');\n\n const signingKey = sigV4SigningKey(cfg.secretAccessKey, dateStamp, cfg.region, 's3');\n const signature = hmac(signingKey, stringToSign).toString('hex');\n\n const authorization =\n `AWS4-HMAC-SHA256 Credential=${cfg.accessKeyId}/${credentialScope}, ` +\n `SignedHeaders=${signedHeaders}, Signature=${signature}`;\n\n const reqPath = encodedPath + (queryStr ? `?${queryStr}` : '');\n\n const reqOptions: https.RequestOptions = {\n hostname: host,\n path: reqPath,\n method,\n headers: {\n 'Host': host,\n 'X-Amz-Date': amzDate,\n 'X-Amz-Content-Sha256': payloadHash,\n 'Authorization': authorization,\n ...(body ? { 'Content-Length': String(body.length) } : {}),\n },\n };\n\n const req = https.request(reqOptions, (res) => {\n const chunks: Buffer[] = [];\n res.on('data', (c: Buffer) => chunks.push(c));\n res.on('end', () => resolve({ statusCode: res.statusCode ?? 0, body: Buffer.concat(chunks).toString('utf-8') }));\n });\n req.on('error', reject);\n if (body) req.write(body);\n req.end();\n });\n}\n\nexport interface BackupManifest {\n id: string;\n createdAt: string;\n files: Array<{ name: string; sha256: string; size: number }>;\n version: string;\n}\n\nexport interface BackupEntry {\n id: string;\n createdAt: string;\n path: string;\n size: number;\n repoPath: string;\n}\n\nconst BACKUP_VERSION = '1.0';\nconst ALGORITHM = 'aes-256-gcm';\nconst KEY_LENGTH = 32; // 256 bits\nconst IV_LENGTH = 16;\n\nexport function getBackupDir(): string {\n return path.join(os.homedir(), '.code-intel', 'backups');\n}\n\nexport function getBackupKey(): Buffer {\n const keyHex = process.env['CODE_INTEL_BACKUP_KEY'];\n if (keyHex && keyHex.length >= 64) {\n return Buffer.from(keyHex.slice(0, 64), 'hex');\n }\n // Derive a stable key from machine-specific data (for dev convenience)\n const seed = `code-intel-backup-${os.hostname()}-${os.homedir()}`;\n return crypto.createHash('sha256').update(seed).digest();\n}\n\nfunction sha256File(filePath: string): string {\n const data = fs.readFileSync(filePath);\n return crypto.createHash('sha256').update(data).digest('hex');\n}\n\nfunction encryptBuffer(data: Buffer, key: Buffer): Buffer {\n const iv = crypto.randomBytes(IV_LENGTH);\n const cipher = crypto.createCipheriv(ALGORITHM, key, iv);\n const encrypted = Buffer.concat([cipher.update(data), cipher.final()]);\n const authTag = cipher.getAuthTag();\n // Format: [IV (16)] [authTag (16)] [ciphertext]\n return Buffer.concat([iv, authTag, encrypted]);\n}\n\nfunction decryptBuffer(data: Buffer, key: Buffer): Buffer {\n const iv = data.subarray(0, IV_LENGTH);\n const authTag = data.subarray(IV_LENGTH, IV_LENGTH + 16);\n const ciphertext = data.subarray(IV_LENGTH + 16);\n const decipher = crypto.createDecipheriv(ALGORITHM, key, iv);\n decipher.setAuthTag(authTag);\n return Buffer.concat([decipher.update(ciphertext), decipher.final()]);\n}\n\nexport class BackupService {\n private backupDir: string;\n private key: Buffer;\n\n constructor(backupDir?: string) {\n this.backupDir = backupDir ?? getBackupDir();\n this.key = getBackupKey();\n fs.mkdirSync(this.backupDir, { recursive: true });\n }\n\n /**\n * Create a backup for a repository.\n * Returns the backup entry.\n */\n createBackup(repoPath: string): BackupEntry {\n const codeIntelDir = path.join(repoPath, '.code-intel');\n const id = uuidv4();\n const createdAt = new Date().toISOString();\n\n // Collect files to backup\n const filesToBackup: Array<{ name: string; localPath: string }> = [];\n const candidates = ['graph.db', 'vector.db', 'meta.json'];\n for (const f of candidates) {\n const fp = path.join(codeIntelDir, f);\n if (fs.existsSync(fp)) {\n filesToBackup.push({ name: f, localPath: fp });\n }\n }\n\n // Also backup registry + users DB\n const registryPath = path.join(os.homedir(), '.code-intel', 'registry.json');\n if (fs.existsSync(registryPath)) {\n filesToBackup.push({ name: 'registry.json', localPath: registryPath });\n }\n const usersDbPath = path.join(os.homedir(), '.code-intel', 'users.db');\n if (fs.existsSync(usersDbPath)) {\n filesToBackup.push({ name: 'users.db', localPath: usersDbPath });\n }\n\n if (filesToBackup.length === 0) {\n throw new Error(`No backup files found in ${codeIntelDir}. Run \\`code-intel analyze\\` first.`);\n }\n\n // Build manifest\n const manifest: BackupManifest = {\n id,\n createdAt,\n version: BACKUP_VERSION,\n files: filesToBackup.map((f) => {\n const data = fs.readFileSync(f.localPath);\n return {\n name: f.name,\n sha256: crypto.createHash('sha256').update(data).digest('hex'),\n size: data.length,\n };\n }),\n };\n\n // Pack all into a single encrypted archive (NDJSON-style sections)\n // Format: JSON-header-line\\n[file-chunk-1][file-chunk-2]...\n // Each file chunk: [name-len (4 bytes BE)] [name] [data-len (8 bytes BE)] [data]\n const parts: Buffer[] = [];\n\n // Manifest header\n const manifestBuf = Buffer.from(JSON.stringify(manifest), 'utf-8');\n const manifestLenBuf = Buffer.alloc(4);\n manifestLenBuf.writeUInt32BE(manifestBuf.length, 0);\n parts.push(manifestLenBuf, manifestBuf);\n\n // File sections\n for (const f of filesToBackup) {\n const data = fs.readFileSync(f.localPath);\n const nameBuf = Buffer.from(f.name, 'utf-8');\n const nameLenBuf = Buffer.alloc(2);\n nameLenBuf.writeUInt16BE(nameBuf.length, 0);\n const dataLenBuf = Buffer.alloc(8);\n dataLenBuf.writeBigUInt64BE(BigInt(data.length), 0);\n parts.push(nameLenBuf, nameBuf, dataLenBuf, data);\n }\n\n const plaintext = Buffer.concat(parts);\n const encrypted = encryptBuffer(plaintext, this.key);\n\n const backupFileName = `backup-${id}.cib`;\n const backupPath = path.join(this.backupDir, backupFileName);\n fs.writeFileSync(backupPath, encrypted);\n\n // Write index entry\n const entry: BackupEntry = {\n id,\n createdAt,\n path: backupPath,\n size: encrypted.length,\n repoPath,\n };\n this._appendIndex(entry);\n\n // Auto-upload to S3 if configured\n if (process.env['CODE_INTEL_BACKUP_S3_AUTO_UPLOAD'] === 'true') {\n this.uploadToS3(entry).catch(() => { /* non-fatal */ });\n }\n\n return entry;\n }\n\n // ── S3 methods ─────────────────────────────────────────────────────────────\n\n /** Returns the parsed S3 config or null if not configured. */\n getS3Config(): S3Config | null {\n return getS3Config();\n }\n\n /**\n * Upload a local backup file to S3.\n * Returns the S3 object key.\n */\n async uploadToS3(entry: BackupEntry): Promise<string> {\n const cfg = getS3Config();\n if (!cfg) throw new Error('S3 not configured. Set CODE_INTEL_BACKUP_S3_BUCKET, CODE_INTEL_BACKUP_S3_ACCESS_KEY_ID, CODE_INTEL_BACKUP_S3_SECRET_ACCESS_KEY.');\n\n const fileName = path.basename(entry.path);\n const s3Key = `${cfg.prefix}${fileName}`;\n const body = fs.readFileSync(entry.path);\n\n const result = await s3Request({ method: 'PUT', cfg, key: s3Key, body });\n if (result.statusCode < 200 || result.statusCode >= 300) {\n throw new Error(`S3 upload failed (HTTP ${result.statusCode}): ${result.body.slice(0, 200)}`);\n }\n return s3Key;\n }\n\n /**\n * Download a backup from S3 and save to destPath.\n */\n async downloadFromS3(s3Key: string, destPath: string): Promise<void> {\n const cfg = getS3Config();\n if (!cfg) throw new Error('S3 not configured.');\n\n const result = await s3Request({ method: 'GET', cfg, key: s3Key });\n if (result.statusCode < 200 || result.statusCode >= 300) {\n throw new Error(`S3 download failed (HTTP ${result.statusCode}): ${result.body.slice(0, 200)}`);\n }\n fs.mkdirSync(path.dirname(destPath), { recursive: true });\n fs.writeFileSync(destPath, Buffer.from(result.body, 'binary'));\n }\n\n /**\n * List backup objects in S3 with the configured prefix.\n */\n async listS3Backups(): Promise<Array<{ key: string; size: number; lastModified: string }>> {\n const cfg = getS3Config();\n if (!cfg) throw new Error('S3 not configured.');\n\n const result = await s3Request({\n method: 'GET',\n cfg,\n key: '',\n query: { 'list-type': '2', prefix: cfg.prefix },\n });\n if (result.statusCode < 200 || result.statusCode >= 300) {\n throw new Error(`S3 list failed (HTTP ${result.statusCode}): ${result.body.slice(0, 200)}`);\n }\n\n // Parse S3 LIST XML response (simple regex approach — no xml parser needed)\n const entries: Array<{ key: string; size: number; lastModified: string }> = [];\n const contentsRegex = /<Contents>([\\s\\S]*?)<\\/Contents>/g;\n let match: RegExpExecArray | null;\n while ((match = contentsRegex.exec(result.body)) !== null) {\n const block = match[1]!;\n const keyM = /<Key>(.*?)<\\/Key>/.exec(block);\n const sizeM = /<Size>(\\d+)<\\/Size>/.exec(block);\n const lmM = /<LastModified>(.*?)<\\/LastModified>/.exec(block);\n if (keyM && sizeM && lmM) {\n entries.push({ key: keyM[1]!, size: parseInt(sizeM[1]!, 10), lastModified: lmM[1]! });\n }\n }\n return entries;\n }\n\n /**\n * List all backup entries.\n */\n listBackups(): BackupEntry[] {\n return this._loadIndex();\n }\n\n /**\n * Restore a backup by ID to the target repo path.\n */\n restoreBackup(backupId: string, targetRepoPath?: string): void {\n const entries = this._loadIndex();\n const entry = entries.find((e) => e.id === backupId);\n if (!entry) {\n throw new Error(`Backup \"${backupId}\" not found.`);\n }\n if (!fs.existsSync(entry.path)) {\n throw new Error(`Backup file not found at: ${entry.path}`);\n }\n\n const encrypted = fs.readFileSync(entry.path);\n let plaintext: Buffer;\n try {\n plaintext = decryptBuffer(encrypted, this.key);\n } catch {\n throw new Error(`Backup decryption failed — invalid key or corrupted backup.`);\n }\n\n // Parse manifest\n let offset = 0;\n const manifestLen = plaintext.readUInt32BE(offset);\n offset += 4;\n const manifestStr = plaintext.subarray(offset, offset + manifestLen).toString('utf-8');\n offset += manifestLen;\n const manifest: BackupManifest = JSON.parse(manifestStr);\n\n const restoreBase = targetRepoPath ?? entry.repoPath;\n const codeIntelDir = path.join(restoreBase, '.code-intel');\n fs.mkdirSync(codeIntelDir, { recursive: true });\n\n // Restore files\n for (const fileEntry of manifest.files) {\n const nameLen = plaintext.readUInt16BE(offset);\n offset += 2;\n const name = plaintext.subarray(offset, offset + nameLen).toString('utf-8');\n offset += nameLen;\n const dataLen = Number(plaintext.readBigUInt64BE(offset));\n offset += 8;\n const data = plaintext.subarray(offset, offset + dataLen);\n offset += dataLen;\n\n // Verify SHA-256\n const expectedHash = fileEntry.sha256;\n const actualHash = crypto.createHash('sha256').update(data).digest('hex');\n if (actualHash !== expectedHash) {\n throw new Error(`SHA-256 mismatch for \"${name}\". Backup may be corrupted.`);\n }\n\n // Restore global files to ~/.code-intel/\n let destPath: string;\n if (name === 'registry.json' || name === 'users.db') {\n destPath = path.join(os.homedir(), '.code-intel', name);\n } else {\n destPath = path.join(codeIntelDir, name);\n }\n fs.writeFileSync(destPath, data);\n }\n }\n\n /**\n * Apply retention policy: keep N daily, M weekly, L monthly backups.\n */\n applyRetention(options = { daily: 7, weekly: 4, monthly: 12 }): number {\n const entries = this._loadIndex()\n .filter((e) => fs.existsSync(e.path))\n .sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());\n\n const keep = new Set<string>();\n const now = new Date();\n\n // Keep daily (last N days)\n const dailyCutoff = new Date(now);\n dailyCutoff.setDate(dailyCutoff.getDate() - options.daily);\n for (const e of entries) {\n if (new Date(e.createdAt) >= dailyCutoff) keep.add(e.id);\n }\n\n // Keep weekly (1 per week for last M weeks)\n const weekSeen = new Set<string>();\n for (const e of entries) {\n const d = new Date(e.createdAt);\n const weekKey = `${d.getFullYear()}-W${Math.floor(d.getDate() / 7)}`;\n if (!weekSeen.has(weekKey) && weekSeen.size < options.weekly) {\n weekSeen.add(weekKey);\n keep.add(e.id);\n }\n }\n\n // Keep monthly (1 per month for last L months)\n const monthSeen = new Set<string>();\n for (const e of entries) {\n const d = new Date(e.createdAt);\n const monthKey = `${d.getFullYear()}-${d.getMonth()}`;\n if (!monthSeen.has(monthKey) && monthSeen.size < options.monthly) {\n monthSeen.add(monthKey);\n keep.add(e.id);\n }\n }\n\n // Delete backups not in keep set\n let deleted = 0;\n for (const e of entries) {\n if (!keep.has(e.id)) {\n try {\n fs.unlinkSync(e.path);\n deleted++;\n } catch { /* already gone */ }\n }\n }\n\n // Re-write index with only kept entries\n const kept = entries.filter((e) => keep.has(e.id));\n this._saveIndex(kept);\n return deleted;\n }\n\n // ── Index helpers ──────────────────────────────────────────────────────────\n\n private _indexPath(): string {\n return path.join(this.backupDir, 'index.json');\n }\n\n private _loadIndex(): BackupEntry[] {\n try {\n return JSON.parse(fs.readFileSync(this._indexPath(), 'utf-8')) as BackupEntry[];\n } catch {\n return [];\n }\n }\n\n private _saveIndex(entries: BackupEntry[]): void {\n fs.writeFileSync(this._indexPath(), JSON.stringify(entries, null, 2));\n }\n\n private _appendIndex(entry: BackupEntry): void {\n const entries = this._loadIndex();\n entries.push(entry);\n this._saveIndex(entries);\n }\n}\n","/**\n * BackupScheduler — runs automated backups on a configurable daily schedule.\n *\n * Config via env vars:\n * CODE_INTEL_BACKUP_SCHEDULE_ENABLED Set to 'true' to enable (disabled by default)\n * CODE_INTEL_BACKUP_SCHEDULE_HOUR Hour of day (0-23) to run daily backup (default: 2)\n * CODE_INTEL_BACKUP_SCHEDULE_REPOS Comma-separated repo paths to back up.\n * Falls back to workspaceRoot passed to start().\n */\nimport { BackupService } from './backup-service.js';\nimport Logger from '../shared/logger.js';\n\nexport class BackupScheduler {\n private timer: ReturnType<typeof setTimeout> | null = null;\n private interval: ReturnType<typeof setInterval> | null = null;\n private svc: BackupService;\n\n constructor(backupDir?: string) {\n this.svc = new BackupService(backupDir);\n }\n\n /** Is the scheduler enabled via environment? */\n isEnabled(): boolean {\n return process.env['CODE_INTEL_BACKUP_SCHEDULE_ENABLED'] === 'true';\n }\n\n /**\n * Start the scheduler. The first backup fires at the next occurrence of\n * CODE_INTEL_BACKUP_SCHEDULE_HOUR (default: 2am), then every 24 hours.\n */\n start(workspaceRoot?: string): void {\n if (!this.isEnabled()) return;\n\n const hour = parseInt(process.env['CODE_INTEL_BACKUP_SCHEDULE_HOUR'] ?? '2', 10);\n const repoPaths = this._resolveRepoPaths(workspaceRoot);\n\n if (repoPaths.length === 0) {\n Logger.warn('[backup-scheduler] No repo paths configured — scheduler idle.');\n return;\n }\n\n const msUntilNext = this._msUntilNextHour(hour);\n Logger.info(\n `[backup-scheduler] Scheduled daily backups at ${hour}:00. ` +\n `Next run in ${Math.round(msUntilNext / 1000 / 60)} min for: ${repoPaths.join(', ')}`,\n );\n\n this.timer = setTimeout(() => {\n void this._runBackups(repoPaths);\n // After the first run, fire every 24 hours\n this.interval = setInterval(() => {\n void this._runBackups(repoPaths);\n }, 24 * 60 * 60 * 1000);\n }, msUntilNext);\n }\n\n /** Stop the scheduler. */\n stop(): void {\n if (this.timer) { clearTimeout(this.timer); this.timer = null; }\n if (this.interval) { clearInterval(this.interval); this.interval = null; }\n }\n\n // ── Private helpers ────────────────────────────────────────────────────────\n\n private async _runBackups(repoPaths: string[]): Promise<void> {\n for (const repoPath of repoPaths) {\n try {\n const entry = this.svc.createBackup(repoPath);\n Logger.info(`[backup-scheduler] ✓ Backup created for ${repoPath} → ${entry.id} (${(entry.size / 1024).toFixed(1)} KB)`);\n\n // Apply retention policy after each backup\n const deleted = this.svc.applyRetention();\n if (deleted > 0) {\n Logger.info(`[backup-scheduler] Retention: removed ${deleted} old backup(s).`);\n }\n } catch (err) {\n Logger.warn(`[backup-scheduler] ✗ Backup failed for ${repoPath}: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n }\n\n private _resolveRepoPaths(workspaceRoot?: string): string[] {\n const env = process.env['CODE_INTEL_BACKUP_SCHEDULE_REPOS'];\n if (env) {\n return env.split(',').map((r) => r.trim()).filter(Boolean);\n }\n return workspaceRoot ? [workspaceRoot] : [];\n }\n\n /** Milliseconds until the next occurrence of the given hour (0-23). */\n private _msUntilNextHour(hour: number): number {\n const now = new Date();\n const next = new Date(now);\n next.setHours(hour, 0, 0, 0);\n if (next <= now) {\n // Already passed today — schedule for tomorrow\n next.setDate(next.getDate() + 1);\n }\n return next.getTime() - now.getTime();\n }\n}\n\nexport function createBackupScheduler(backupDir?: string): BackupScheduler {\n return new BackupScheduler(backupDir);\n}\n","/**\n * OIDC / OAuth2 Integration — 1.3\n *\n * Supports: GitHub, GitLab, Google, Okta, Azure AD, and any standards-compliant\n * OpenID Connect provider via issuer URL discovery.\n *\n * Configuration is driven by environment variables:\n * CODE_INTEL_OIDC_ISSUER – issuer URL (e.g. https://accounts.google.com)\n * CODE_INTEL_OIDC_CLIENT_ID – client_id\n * CODE_INTEL_OIDC_CLIENT_SECRET – client_secret\n * CODE_INTEL_OIDC_REDIRECT_URI – callback URL (e.g. http://localhost:4747/auth/callback)\n * CODE_INTEL_OIDC_SCOPES – space-separated, default: \"openid email profile\"\n * CODE_INTEL_OIDC_DEFAULT_ROLE – role assigned on first login, default: \"viewer\"\n * CODE_INTEL_BASE_URL – base URL of this server (used to build redirect_uri when REDIRECT_URI unset)\n */\n\nimport * as oidcClient from 'openid-client';\nimport crypto from 'node:crypto';\nimport type { Role } from './users-db.js';\nimport Logger from '../shared/logger.js';\n\n// ── Known-provider helper configs ────────────────────────────────────────────\n\nexport type OIDCProvider =\n | 'github'\n | 'gitlab'\n | 'google'\n | 'okta'\n | 'azure'\n | 'custom';\n\nconst PROVIDER_ISSUERS: Record<string, string> = {\n github: 'https://token.actions.githubusercontent.com', // GitHub OIDC\n google: 'https://accounts.google.com',\n // gitlab & okta require a tenant URL — must be passed via CODE_INTEL_OIDC_ISSUER\n};\n\n// ── PKCE / state in-memory store (server-side, short-lived) ──────────────────\n//\n// Maps state → { codeVerifier, nonce, createdAt }\n// Entries are cleaned up after 10 minutes (standard auth-flow timeout).\n\ninterface OIDCPendingFlow {\n codeVerifier: string;\n nonce: string;\n createdAt: number;\n}\n\nexport const oidcPendingFlows = new Map<string, OIDCPendingFlow>();\n\nconst FLOW_TTL_MS = 10 * 60 * 1000; // 10 minutes\n\nexport function cleanExpiredFlows(): void {\n const now = Date.now();\n for (const [state, flow] of oidcPendingFlows.entries()) {\n if (now - flow.createdAt > FLOW_TTL_MS) {\n oidcPendingFlows.delete(state);\n }\n }\n}\n\n// Clean every 5 minutes\nsetInterval(cleanExpiredFlows, 5 * 60 * 1000).unref();\n\n// ── OIDCConfig — parsed from env ──────────────────────────────────────────────\n\nexport interface OIDCConfig {\n issuer: string;\n clientId: string;\n clientSecret: string;\n redirectUri: string;\n scopes: string;\n defaultRole: Role;\n}\n\nexport function getOIDCConfig(): OIDCConfig | null {\n const issuer =\n process.env['CODE_INTEL_OIDC_ISSUER'] ?? '';\n const clientId =\n process.env['CODE_INTEL_OIDC_CLIENT_ID'] ?? '';\n const clientSecret =\n process.env['CODE_INTEL_OIDC_CLIENT_SECRET'] ?? '';\n\n if (!issuer || !clientId || !clientSecret) {\n return null; // OIDC not configured\n }\n\n const base =\n process.env['CODE_INTEL_BASE_URL'] ?? 'http://localhost:4747';\n const redirectUri =\n process.env['CODE_INTEL_OIDC_REDIRECT_URI'] ??\n `${base}/auth/callback`;\n\n const scopes =\n process.env['CODE_INTEL_OIDC_SCOPES'] ?? 'openid email profile';\n\n const rawRole =\n process.env['CODE_INTEL_OIDC_DEFAULT_ROLE'] ?? 'viewer';\n const validRoles: Role[] = ['admin', 'analyst', 'viewer', 'repo-owner'];\n const defaultRole: Role = validRoles.includes(rawRole as Role)\n ? (rawRole as Role)\n : 'viewer';\n\n return { issuer, clientId, clientSecret, redirectUri, scopes, defaultRole };\n}\n\n// ── Cached discovered configuration ──────────────────────────────────────────\n\nlet _cachedConfig: oidcClient.Configuration | null = null;\nlet _cachedIssuer = '';\n\nexport async function getDiscoveredConfig(): Promise<oidcClient.Configuration | null> {\n const cfg = getOIDCConfig();\n if (!cfg) return null;\n\n // Re-discover if issuer changed (e.g. config hot-reload)\n if (_cachedConfig && _cachedIssuer === cfg.issuer) {\n return _cachedConfig;\n }\n\n try {\n Logger.info(`[oidc] Discovering OIDC config from: ${cfg.issuer}`);\n const config = await oidcClient.discovery(\n new URL(cfg.issuer),\n cfg.clientId,\n cfg.clientSecret,\n );\n _cachedConfig = config;\n _cachedIssuer = cfg.issuer;\n Logger.info('[oidc] Discovery succeeded');\n return config;\n } catch (err) {\n Logger.warn(\n '[oidc] Discovery failed:',\n err instanceof Error ? err.message : err,\n );\n return null;\n }\n}\n\n// Force a fresh discovery (useful in tests / config changes)\nexport function resetOIDCConfig(): void {\n _cachedConfig = null;\n _cachedIssuer = '';\n}\n\n// ── Step 1: Build authorization redirect URL (server-side) ───────────────────\n\nexport interface OIDCLoginInit {\n redirectUrl: string;\n state: string;\n}\n\nexport async function buildOIDCLoginUrl(): Promise<OIDCLoginInit | null> {\n const cfg = getOIDCConfig();\n if (!cfg) return null;\n\n const config = await getDiscoveredConfig();\n if (!config) return null;\n\n const codeVerifier = oidcClient.randomPKCECodeVerifier();\n const codeChallenge = await oidcClient.calculatePKCECodeChallenge(codeVerifier);\n const state = oidcClient.randomState();\n const nonce = oidcClient.randomNonce();\n\n const params: Record<string, string> = {\n redirect_uri: cfg.redirectUri,\n scope: cfg.scopes,\n code_challenge: codeChallenge,\n code_challenge_method: 'S256',\n state,\n nonce,\n };\n\n const redirectUrl = oidcClient.buildAuthorizationUrl(config, params);\n\n oidcPendingFlows.set(state, {\n codeVerifier,\n nonce,\n createdAt: Date.now(),\n });\n\n return { redirectUrl: redirectUrl.href, state };\n}\n\n// ── Step 2: Handle callback — exchange code for tokens + get user info ────────\n\nexport interface OIDCUserInfo {\n sub: string; // Provider user ID\n email?: string;\n name?: string;\n preferred_username?: string;\n}\n\nexport interface OIDCCallbackResult {\n userInfo: OIDCUserInfo;\n accessToken: string;\n refreshToken?: string;\n idTokenClaims: Record<string, unknown>;\n}\n\nexport async function handleOIDCCallback(\n currentUrl: URL,\n state: string,\n): Promise<OIDCCallbackResult> {\n const cfg = getOIDCConfig();\n if (!cfg) throw new Error('OIDC is not configured');\n\n // Validate state FIRST — before any network calls so the error is deterministic\n const flow = oidcPendingFlows.get(state);\n if (!flow) {\n throw new Error('Invalid or expired OIDC state. Please start the login again.');\n }\n\n // Check TTL expiry before consuming the entry\n if (Date.now() - flow.createdAt > FLOW_TTL_MS) {\n oidcPendingFlows.delete(state);\n throw new Error('OIDC flow expired. Please start the login again.');\n }\n\n // Consume the state entry\n oidcPendingFlows.delete(state);\n\n // Now attempt discovery — only after state has been validated\n const config = await getDiscoveredConfig();\n if (!config) throw new Error('OIDC provider unreachable');\n\n // Exchange authorization code for tokens\n const tokens = await oidcClient.authorizationCodeGrant(config, currentUrl, {\n pkceCodeVerifier: flow.codeVerifier,\n expectedState: state,\n expectedNonce: flow.nonce,\n });\n\n // Extract ID token claims — cast to indexable map\n const idTokenClaims: Record<string, unknown> =\n (tokens.claims() as Record<string, unknown> | undefined) ?? {};\n\n // Fetch userinfo\n let userInfo: OIDCUserInfo;\n try {\n const raw = (await oidcClient.fetchUserInfo(\n config,\n tokens.access_token,\n idTokenClaims['sub'] as string,\n )) as Record<string, unknown>;\n userInfo = {\n sub: (raw['sub'] as string | undefined) ?? (idTokenClaims['sub'] as string),\n email:\n (raw['email'] as string | undefined) ??\n (idTokenClaims['email'] as string | undefined),\n name:\n (raw['name'] as string | undefined) ??\n (idTokenClaims['name'] as string | undefined),\n preferred_username:\n (raw['preferred_username'] as string | undefined) ??\n (idTokenClaims['preferred_username'] as string | undefined),\n };\n } catch {\n // Fallback: use claims from the ID token directly\n userInfo = {\n sub: idTokenClaims['sub'] as string,\n email: idTokenClaims['email'] as string | undefined,\n name: idTokenClaims['name'] as string | undefined,\n preferred_username: idTokenClaims['preferred_username'] as string | undefined,\n };\n }\n\n return {\n userInfo,\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token,\n idTokenClaims,\n };\n}\n\n// ── Device Authorization Flow (CLI: `code-intel auth login`) ─────────────────\n//\n// Used when the CLI needs to authenticate without a browser redirect URI\n// pointing back to localhost.\n\nexport interface DeviceFlowInit {\n userCode: string;\n verificationUri: string;\n verificationUriComplete: string;\n expiresIn: number;\n}\n\nexport async function initiateDeviceFlow(): Promise<{\n deviceResponse: oidcClient.DeviceAuthorizationResponse & { device_code: string };\n config: oidcClient.Configuration;\n} | null> {\n const cfg = getOIDCConfig();\n if (!cfg) return null;\n\n const config = await getDiscoveredConfig();\n if (!config) return null;\n\n const deviceResponse = await oidcClient.initiateDeviceAuthorization(config, {\n scope: cfg.scopes,\n });\n\n return { deviceResponse: deviceResponse as typeof deviceResponse & { device_code: string }, config };\n}\n\nexport async function pollDeviceFlow(\n config: oidcClient.Configuration,\n deviceResponse: oidcClient.DeviceAuthorizationResponse,\n): Promise<OIDCCallbackResult> {\n const tokens = await oidcClient.pollDeviceAuthorizationGrant(\n config,\n deviceResponse,\n );\n\n const idTokenClaims: Record<string, unknown> =\n (tokens.claims() as Record<string, unknown> | undefined) ?? {};\n\n const userInfo: OIDCUserInfo = {\n sub: idTokenClaims['sub'] as string,\n email: idTokenClaims['email'] as string | undefined,\n name: idTokenClaims['name'] as string | undefined,\n preferred_username: idTokenClaims['preferred_username'] as string | undefined,\n };\n\n return {\n userInfo,\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token,\n idTokenClaims,\n };\n}\n\n// ── Refresh token rotation ────────────────────────────────────────────────────\n\nexport async function refreshOIDCToken(\n refreshToken: string,\n): Promise<{ accessToken: string; refreshToken?: string } | null> {\n const config = await getDiscoveredConfig();\n if (!config) return null;\n\n try {\n const tokens = await oidcClient.refreshTokenGrant(config, refreshToken);\n return {\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token,\n };\n } catch (err) {\n Logger.warn('[oidc] Refresh token rotation failed:', err instanceof Error ? err.message : err);\n return null;\n }\n}\n\n// ── Derive a local username from OIDC user info ───────────────────────────────\n\nexport function deriveUsername(userInfo: OIDCUserInfo): string {\n // Prefer preferred_username → email prefix → sub hash\n if (userInfo.preferred_username) return userInfo.preferred_username;\n if (userInfo.email) {\n const [prefix] = userInfo.email.split('@');\n if (prefix && prefix.length > 0) return prefix;\n }\n // Fallback: first 12 chars of SHA-256(sub)\n return 'oidc_' + crypto.createHash('sha256').update(userInfo.sub).digest('hex').slice(0, 12);\n}\n\n// ── OIDC availability check ───────────────────────────────────────────────────\n\nexport function isOIDCConfigured(): boolean {\n return getOIDCConfig() !== null;\n}\n","/**\n * OpenAPI 3.1 specification for code-intel HTTP API v1.\n */\nexport const openApiSpec = {\n openapi: '3.1.0',\n info: {\n title: 'Code Intelligence Platform API',\n version: '1.0.0',\n description: 'HTTP API for the Code Intelligence Platform — explore knowledge graphs, search symbols, run blast-radius analysis, and manage repositories.',\n license: { name: 'MIT' },\n contact: { name: 'vohongtho', url: 'https://github.com/vohongtho/code-intel-platform' },\n },\n servers: [\n { url: '/api/v1', description: 'Current API version' },\n ],\n components: {\n securitySchemes: {\n BearerAuth: {\n type: 'http',\n scheme: 'bearer',\n description: 'API token created with `code-intel token create`',\n },\n SessionCookie: {\n type: 'apiKey',\n in: 'cookie',\n name: 'code_intel_session',\n description: 'Session cookie obtained from POST /auth/login',\n },\n },\n schemas: {\n ErrorResponse: {\n type: 'object',\n properties: {\n error: {\n type: 'object',\n properties: {\n code: { type: 'string', example: 'CI-1000' },\n message: { type: 'string' },\n hint: { type: 'string' },\n requestId: { type: 'string' },\n timestamp: { type: 'string', format: 'date-time' },\n },\n required: ['code', 'message'],\n },\n },\n },\n CodeNode: {\n type: 'object',\n properties: {\n id: { type: 'string' },\n name: { type: 'string' },\n kind: { type: 'string', enum: ['function', 'class', 'interface', 'method', 'variable', 'file', 'module', 'type', 'enum', 'cluster', 'flow'] },\n filePath: { type: 'string' },\n startLine: { type: 'integer' },\n endLine: { type: 'integer' },\n exported: { type: 'boolean' },\n language: { type: 'string' },\n },\n required: ['id', 'name', 'kind', 'filePath'],\n },\n HealthResponse: {\n type: 'object',\n properties: {\n status: { type: 'string', enum: ['ok', 'error'] },\n timestamp: { type: 'string', format: 'date-time' },\n },\n },\n },\n },\n security: [{ BearerAuth: [] }, { SessionCookie: [] }],\n paths: {\n '/health': {\n get: {\n tags: ['Health'],\n summary: 'Detailed health status',\n security: [{ BearerAuth: [] }],\n responses: {\n '200': { description: 'Health details', content: { 'application/json': { schema: { '$ref': '#/components/schemas/HealthResponse' } } } },\n '401': { description: 'Unauthorized', content: { 'application/json': { schema: { '$ref': '#/components/schemas/ErrorResponse' } } } },\n },\n },\n },\n '/repos': {\n get: {\n tags: ['Repositories'],\n summary: 'List indexed repositories',\n responses: {\n '200': { description: 'List of repos', content: { 'application/json': { schema: { type: 'array', items: { type: 'object' } } } } },\n '401': { description: 'Unauthorized', content: { 'application/json': { schema: { '$ref': '#/components/schemas/ErrorResponse' } } } },\n },\n },\n },\n '/graph/{repo}': {\n get: {\n tags: ['Graph'],\n summary: 'Download full graph for a repository',\n parameters: [{ name: 'repo', in: 'path', required: true, schema: { type: 'string' } }],\n responses: {\n '200': { description: 'Graph nodes and edges', content: { 'application/json': { schema: { type: 'object', properties: { nodes: { type: 'array' }, edges: { type: 'array' } } } } } },\n '404': { description: 'Repo not found', content: { 'application/json': { schema: { '$ref': '#/components/schemas/ErrorResponse' } } } },\n },\n },\n },\n '/search': {\n post: {\n tags: ['Search'],\n summary: 'BM25 text search across all symbols',\n requestBody: {\n required: true,\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'Search query' },\n limit: { type: 'integer', default: 20 },\n repo: { type: 'string', description: 'Optional repo filter' },\n },\n required: ['query'],\n },\n },\n },\n },\n responses: {\n '200': { description: 'Search results', content: { 'application/json': { schema: { type: 'object', properties: { results: { type: 'array', items: { '$ref': '#/components/schemas/CodeNode' } } } } } } },\n },\n },\n },\n '/vector-search': {\n post: {\n tags: ['Search'],\n summary: 'Semantic vector search using embeddings',\n requestBody: {\n required: true,\n content: { 'application/json': { schema: { type: 'object', properties: { query: { type: 'string' }, limit: { type: 'integer', default: 10 } }, required: ['query'] } } },\n },\n responses: {\n '200': { description: 'Vector search results', content: { 'application/json': { schema: { type: 'object' } } } },\n },\n },\n },\n '/nodes/{id}': {\n get: {\n tags: ['Nodes'],\n summary: 'Get detailed information about a symbol node',\n parameters: [{ name: 'id', in: 'path', required: true, schema: { type: 'string' } }],\n responses: {\n '200': { description: 'Node detail', content: { 'application/json': { schema: { type: 'object' } } } },\n '404': { description: 'Node not found', content: { 'application/json': { schema: { '$ref': '#/components/schemas/ErrorResponse' } } } },\n },\n },\n },\n '/blast-radius': {\n post: {\n tags: ['Analysis'],\n summary: 'Compute blast radius (impact) of a symbol change',\n requestBody: {\n required: true,\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n target: { type: 'string', description: 'Symbol name or node ID' },\n direction: { type: 'string', enum: ['callers', 'callees', 'both'], default: 'both' },\n max_hops: { type: 'integer', default: 5 },\n repo: { type: 'string' },\n },\n required: ['target'],\n },\n },\n },\n },\n responses: {\n '200': { description: 'Blast radius result', content: { 'application/json': { schema: { type: 'object' } } } },\n '404': { description: 'Symbol not found', content: { 'application/json': { schema: { '$ref': '#/components/schemas/ErrorResponse' } } } },\n },\n },\n },\n '/flows': {\n get: {\n tags: ['Graph'],\n summary: 'List execution flows detected in the graph',\n parameters: [{ name: 'repo', in: 'query', schema: { type: 'string' } }],\n responses: {\n '200': { description: 'List of flows', content: { 'application/json': { schema: { type: 'object' } } } },\n },\n },\n },\n '/clusters': {\n get: {\n tags: ['Graph'],\n summary: 'List community clusters detected in the graph',\n parameters: [{ name: 'repo', in: 'query', schema: { type: 'string' } }],\n responses: {\n '200': { description: 'List of clusters', content: { 'application/json': { schema: { type: 'object' } } } },\n },\n },\n },\n '/groups': {\n get: {\n tags: ['Groups'],\n summary: 'List all multi-repo groups',\n responses: {\n '200': { description: 'List of groups', content: { 'application/json': { schema: { type: 'array' } } } },\n },\n },\n },\n '/groups/{name}': {\n get: {\n tags: ['Groups'],\n summary: 'Get group configuration',\n parameters: [{ name: 'name', in: 'path', required: true, schema: { type: 'string' } }],\n responses: {\n '200': { description: 'Group config', content: { 'application/json': { schema: { type: 'object' } } } },\n '404': { description: 'Group not found', content: { 'application/json': { schema: { '$ref': '#/components/schemas/ErrorResponse' } } } },\n },\n },\n },\n '/files/read': {\n post: {\n tags: ['Files'],\n summary: 'Read a source file from an indexed repository',\n requestBody: {\n required: true,\n content: { 'application/json': { schema: { type: 'object', properties: { file_path: { type: 'string' } }, required: ['file_path'] } } },\n },\n responses: {\n '200': { description: 'File content', content: { 'application/json': { schema: { type: 'object', properties: { content: { type: 'string' } } } } } },\n '403': { description: 'Forbidden', content: { 'application/json': { schema: { '$ref': '#/components/schemas/ErrorResponse' } } } },\n '404': { description: 'Not found', content: { 'application/json': { schema: { '$ref': '#/components/schemas/ErrorResponse' } } } },\n },\n },\n },\n '/vector-status': {\n get: {\n tags: ['Search'],\n summary: 'Check whether the vector index is ready',\n responses: {\n '200': { description: 'Vector index status', content: { 'application/json': { schema: { type: 'object', properties: { ready: { type: 'boolean' }, building: { type: 'boolean' } }, required: ['ready', 'building'] } } } },\n },\n },\n },\n '/grep': {\n post: {\n tags: ['Files'],\n summary: 'Grep for a regex pattern across indexed file nodes',\n requestBody: {\n required: true,\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n pattern: { type: 'string', description: 'Regular expression pattern' },\n file_paths: { type: 'array', items: { type: 'string' }, description: 'Optional list of file paths to search' },\n },\n required: ['pattern'],\n },\n },\n },\n },\n responses: {\n '200': { description: 'Grep results', content: { 'application/json': { schema: { type: 'object', properties: { results: { type: 'array', items: { type: 'object', properties: { file: { type: 'string' }, line: { type: 'integer' }, text: { type: 'string' } } } } } } } } },\n '400': { description: 'Bad request', content: { 'application/json': { schema: { '$ref': '#/components/schemas/ErrorResponse' } } } },\n },\n },\n },\n '/cypher': {\n post: {\n tags: ['Graph'],\n summary: 'Run a Cypher-like query against the knowledge graph',\n requestBody: {\n required: true,\n content: { 'application/json': { schema: { type: 'object', properties: { query: { type: 'string' } }, required: ['query'] } } },\n },\n responses: {\n '200': { description: 'Query results', content: { 'application/json': { schema: { type: 'object', properties: { results: { type: 'array' } } } } } },\n '400': { description: 'Bad request', content: { 'application/json': { schema: { '$ref': '#/components/schemas/ErrorResponse' } } } },\n },\n },\n },\n '/jobs': {\n get: {\n tags: ['Jobs'],\n summary: 'List analysis jobs with optional status/repo filters',\n parameters: [\n { name: 'status', in: 'query', schema: { type: 'string', enum: ['pending', 'running', 'success', 'failed', 'cancelled', 'dead'] } },\n { name: 'repo', in: 'query', schema: { type: 'string' } },\n ],\n responses: {\n '200': { description: 'List of jobs', content: { 'application/json': { schema: { type: 'object', properties: { jobs: { type: 'array', items: { type: 'object' } } } } } } },\n '401': { description: 'Unauthorized', content: { 'application/json': { schema: { '$ref': '#/components/schemas/ErrorResponse' } } } },\n },\n },\n },\n '/jobs/{id}': {\n delete: {\n tags: ['Jobs'],\n summary: 'Cancel an analysis job',\n parameters: [{ name: 'id', in: 'path', required: true, schema: { type: 'string' } }],\n responses: {\n '200': { description: 'Job cancelled', content: { 'application/json': { schema: { type: 'object', properties: { message: { type: 'string' }, id: { type: 'string' } } } } } },\n '404': { description: 'Job not found', content: { 'application/json': { schema: { '$ref': '#/components/schemas/ErrorResponse' } } } },\n '409': { description: 'Job cannot be cancelled', content: { 'application/json': { schema: { '$ref': '#/components/schemas/ErrorResponse' } } } },\n },\n },\n },\n '/groups/{name}/contracts': {\n get: {\n tags: ['Groups'],\n summary: 'Get the last sync result / contracts for a group',\n parameters: [{ name: 'name', in: 'path', required: true, schema: { type: 'string' } }],\n responses: {\n '200': { description: 'Sync result', content: { 'application/json': { schema: { type: 'object' } } } },\n '404': { description: 'Not found', content: { 'application/json': { schema: { '$ref': '#/components/schemas/ErrorResponse' } } } },\n },\n },\n },\n '/groups/{name}/sync': {\n post: {\n tags: ['Groups'],\n summary: 'Sync all members of a group and compute cross-repo contracts',\n parameters: [{ name: 'name', in: 'path', required: true, schema: { type: 'string' } }],\n responses: {\n '200': { description: 'Sync result', content: { 'application/json': { schema: { type: 'object' } } } },\n '404': { description: 'Group not found', content: { 'application/json': { schema: { '$ref': '#/components/schemas/ErrorResponse' } } } },\n },\n },\n },\n '/groups/{name}/search': {\n post: {\n tags: ['Groups'],\n summary: 'Search across all repos in a group',\n parameters: [{ name: 'name', in: 'path', required: true, schema: { type: 'string' } }],\n requestBody: {\n required: true,\n content: { 'application/json': { schema: { type: 'object', properties: { q: { type: 'string' }, limit: { type: 'integer', default: 20 } }, required: ['q'] } } },\n },\n responses: {\n '200': { description: 'Search results per repo and merged', content: { 'application/json': { schema: { type: 'object', properties: { perRepo: { type: 'object' }, merged: { type: 'array' } } } } } },\n '400': { description: 'Bad request', content: { 'application/json': { schema: { '$ref': '#/components/schemas/ErrorResponse' } } } },\n '404': { description: 'Group not found', content: { 'application/json': { schema: { '$ref': '#/components/schemas/ErrorResponse' } } } },\n },\n },\n },\n '/groups/{name}/graph': {\n get: {\n tags: ['Groups'],\n summary: 'Retrieve the merged knowledge graph for all repos in a group',\n parameters: [{ name: 'name', in: 'path', required: true, schema: { type: 'string' } }],\n responses: {\n '200': { description: 'Merged graph nodes and edges', content: { 'application/json': { schema: { type: 'object', properties: { nodes: { type: 'array' }, edges: { type: 'array' } } } } } },\n '404': { description: 'Group not found', content: { 'application/json': { schema: { '$ref': '#/components/schemas/ErrorResponse' } } } },\n },\n },\n },\n },\n};\n","export type { RepoGroup, GroupMember, Contract, ContractLink, ContractKind, GroupSyncResult, LinkKind } from './types.js';\nexport { loadGroup, saveGroup, listGroups, deleteGroup, groupExists, addMember, removeMember, saveSyncResult, loadSyncResult } from './group-registry.js';\nexport { syncGroup } from './group-sync.js';\nexport { queryGroup } from './group-query.js';\nexport type { GroupQueryResult } from './group-query.js';\nexport { loadGraphFromDB } from './graph-from-db.js';\n\n// Legacy export kept for backwards compatibility\nexport { mergeSearchResults } from './cross-repo-search.js';\n","import type { SearchResult } from '../search/text-search.js';\nimport { reciprocalRankFusion } from '../search/text-search.js';\n\nexport function mergeSearchResults(...perRepoResults: SearchResult[][]): SearchResult[] {\n return reciprocalRankFusion(...perRepoResults);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/graph/id-generator.ts","../src/shared/languages.ts","../src/shared/detection.ts","../src/shared/index.ts","../src/parsing/parser-manager.ts","../src/parsing/query-runner.ts","../src/parsing/queries/typescript.ts","../src/parsing/queries/python.ts","../src/parsing/queries/java.ts","../src/parsing/queries/go.ts","../src/parsing/queries/c.ts","../src/parsing/queries/cpp.ts","../src/parsing/queries/csharp.ts","../src/parsing/queries/rust.ts","../src/parsing/queries/php.ts","../src/parsing/queries/kotlin.ts","../src/parsing/queries/ruby.ts","../src/parsing/queries/swift.ts","../src/observability/tracing.ts","../src/shared/logger.ts","../src/parsing/queries/javascript.ts","../src/parsing/queries/dart.ts","../src/parsing/queries/index.ts","../src/pipeline/phases/parse-phase.ts","../src/pipeline/phases/resolve-phase.ts","../src/llm/providers/openai.ts","../src/llm/providers/anthropic.ts","../src/llm/providers/ollama.ts","../src/llm/factory.ts","../src/search/embedder.ts","../src/multi-repo/group-registry.ts","../src/health/dead-code.ts","../src/health/circular-deps.ts","../src/health/god-nodes.ts","../src/health/orphan-files.ts","../src/health/health-score.ts","../src/errors/codes.ts","../src/shared/fs-secure.ts","../src/auth/users-db.ts","../src/auth/secret-store.ts","../src/auth/middleware.ts","../src/http/websocket-auth.ts","../src/http/websocket-server.ts","../src/graph/knowledge-graph.ts","../src/graph/index.ts","../src/parsing/index.ts","../src/parsing/ast-cache.ts","../src/languages/registry.ts","../src/languages/modules/typescript.ts","../src/languages/modules/python.ts","../src/languages/modules/java.ts","../src/languages/modules/go.ts","../src/languages/modules/c.ts","../src/languages/modules/cpp.ts","../src/languages/modules/csharp.ts","../src/languages/modules/rust.ts","../src/languages/modules/php.ts","../src/languages/modules/kotlin.ts","../src/languages/modules/ruby.ts","../src/languages/modules/swift.ts","../src/languages/modules/dart.ts","../src/resolver/binding-tracker.ts","../src/resolver/import-resolver.ts","../src/call-graph/call-builder.ts","../src/call-graph/call-classifier.ts","../src/inheritance/heritage-builder.ts","../src/inheritance/mro-walker.ts","../src/inheritance/override-detector.ts","../src/pipeline/dag-validator.ts","../src/pipeline/orchestrator.ts","../src/observability/metrics.ts","../src/pipeline/phases/scan-phase.ts","../src/pipeline/phases/index.ts","../src/pipeline/phases/cluster-phase.ts","../src/pipeline/phases/flow-phase.ts","../src/governance/llm-governance.ts","../src/pipeline/workers/parse-phase-parallel.ts","../src/pipeline/workers/worker-pool.ts","../src/pipeline/workers/resolve-phase-parallel.ts","../src/scope-analysis/scope-builder.ts","../src/clustering/community-detector.ts","../src/flow-detection/entry-point-finder.ts","../src/search/text-search.ts","../src/search/index.ts","../src/search/vector-index.ts","../src/search/hybrid-search.ts","../src/storage/db-manager.ts","../src/storage/schema.ts","../src/storage/csv-writer.ts","../src/storage/graph-loader.ts","../src/storage/repo-registry.ts","../src/storage/metadata.ts","../src/mcp-server/server.ts","../src/multi-repo/graph-from-db.ts","../src/multi-repo/group-sync.ts","../src/multi-repo/group-query.ts","../src/http/app.ts","../src/jobs/jobs-db.ts","../src/backup/backup-service.ts","../src/backup/backup-scheduler.ts","../src/auth/oidc.ts","../src/http/openapi.ts","../src/multi-repo/index.ts","../src/multi-repo/cross-repo-search.ts"],"names":["nodePath","path","TSLanguage","os","fs","paramNode","context","relativePath","OpenAIProvider","AnthropicProvider","OllamaProvider","Database","uuidv4","crypto","bcrypt","result","EMBED_DIM","bm25Results","computeHealthReport","a","exports","__dirname","fileURLToPath","getTracer","embedNodes","saveGroup","WsServer"],"mappings":"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","file":"index.js","sourcesContent":["import { NodeKind } from '../shared/index.js';\n\nexport function generateNodeId(kind: NodeKind, filePath: string, qualifiedName: string): string {\n return `${kind}:${filePath}:${qualifiedName}`;\n}\n\nexport function generateEdgeId(source: string, target: string, kind: string): string {\n return `${kind}:${source}->${target}`;\n}\n","export enum Language {\n TypeScript = 'typescript',\n JavaScript = 'javascript',\n Python = 'python',\n Java = 'java',\n Go = 'go',\n C = 'c',\n Cpp = 'cpp',\n CSharp = 'csharp',\n Rust = 'rust',\n PHP = 'php',\n Kotlin = 'kotlin',\n Ruby = 'ruby',\n Swift = 'swift',\n Dart = 'dart',\n}\n","import { Language } from './languages.js';\n\nconst EXTENSION_MAP: Record<string, Language> = {\n '.ts': Language.TypeScript,\n '.tsx': Language.TypeScript,\n '.mts': Language.TypeScript,\n '.cts': Language.TypeScript,\n '.js': Language.JavaScript,\n '.jsx': Language.JavaScript,\n '.mjs': Language.JavaScript,\n '.cjs': Language.JavaScript,\n '.py': Language.Python,\n '.pyi': Language.Python,\n '.java': Language.Java,\n '.go': Language.Go,\n '.c': Language.C,\n '.h': Language.C,\n '.cpp': Language.Cpp,\n '.cxx': Language.Cpp,\n '.cc': Language.Cpp,\n '.hpp': Language.Cpp,\n '.hxx': Language.Cpp,\n '.cs': Language.CSharp,\n '.rs': Language.Rust,\n '.php': Language.PHP,\n '.kt': Language.Kotlin,\n '.kts': Language.Kotlin,\n '.rb': Language.Ruby,\n '.swift': Language.Swift,\n '.dart': Language.Dart,\n};\n\nexport function detectLanguage(filePath: string): Language | null {\n const ext = filePath.slice(filePath.lastIndexOf('.'));\n return EXTENSION_MAP[ext] ?? null;\n}\n\nexport function getSupportedExtensions(): string[] {\n return Object.keys(EXTENSION_MAP);\n}\n","export { Language } from './languages.js';\nexport { detectLanguage, getSupportedExtensions } from './detection.js';\nexport type { NodeKind, EdgeKind, CodeNode, CodeEdge } from './graph-types.js';\nexport type {\n PipelinePhaseStatus,\n PipelineProgress,\n PipelineResult,\n} from './pipeline-types.js';\n","import { createRequire } from 'node:module';\nimport { fileURLToPath } from 'node:url';\nimport nodePath from 'node:path';\nimport { existsSync } from 'node:fs';\nimport { Language } from '../shared/index.js';\nimport { Parser, Language as TSLanguage } from 'web-tree-sitter';\n\nconst _require = createRequire(import.meta.url);\n\n/**\n * Locate the bundled wasm/ directory at runtime.\n *\n * tsup compiles parser-manager.ts into two bundles:\n * dist/index.js → import.meta.url dirname = dist/ → ./wasm = dist/wasm/ ✅\n * dist/cli/main.js → import.meta.url dirname = dist/cli → ../wasm = dist/wasm/ ✅\n *\n * We try both candidates and return the first that exists.\n */\nfunction findBundledWasmDir(): string {\n const fileDir = nodePath.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n nodePath.join(fileDir, 'wasm'), // dist/index.js → dist/wasm/\n nodePath.join(fileDir, '../wasm'), // dist/cli/main.js → dist/wasm/\n ];\n for (const candidate of candidates) {\n if (existsSync(candidate)) return candidate;\n }\n return candidates[0]; // fallback (will just not find files)\n}\n\nconst _bundledWasmDir = findBundledWasmDir();\n\n/**\n * Resolve the absolute path to a language WASM file.\n *\n * Resolution order:\n * 1. Try the grammar's own npm package (e.g. tree-sitter-typescript).\n * 2. Fall back to the bundled wasm/ directory inside this package.\n *\n * The bundled WASMs (Swift, Kotlin, Dart) are dylink.0 format, compatible\n * with web-tree-sitter 0.26.x. They are copied into wasm/ at build/publish\n * time and listed in the package.json \"files\" array so they are always\n * available to consumers without needing the optional grammar packages installed.\n *\n * Returns null when no compatible WASM can be found.\n */\nfunction wasmPath(lang: Language): string | null {\n // Grammars that ship their own dylink.0 WASM inside their npm package.\n const WASM_PACKAGE_MAP: Partial<Record<Language, string>> = {\n [Language.TypeScript]: 'tree-sitter-typescript/tree-sitter-typescript.wasm',\n [Language.JavaScript]: 'tree-sitter-javascript/tree-sitter-javascript.wasm',\n [Language.Python]: 'tree-sitter-python/tree-sitter-python.wasm',\n [Language.Java]: 'tree-sitter-java/tree-sitter-java.wasm',\n [Language.Go]: 'tree-sitter-go/tree-sitter-go.wasm',\n [Language.C]: 'tree-sitter-c/tree-sitter-c.wasm',\n [Language.Cpp]: 'tree-sitter-cpp/tree-sitter-cpp.wasm',\n [Language.CSharp]: 'tree-sitter-c-sharp/tree-sitter-c_sharp.wasm',\n [Language.Rust]: 'tree-sitter-rust/tree-sitter-rust.wasm',\n [Language.PHP]: 'tree-sitter-php/tree-sitter-php.wasm',\n [Language.Ruby]: 'tree-sitter-ruby/tree-sitter-ruby.wasm',\n // These are optional dependencies; their packages may or may not include\n // a WASM. If require.resolve fails we fall back to the bundled wasm/.\n [Language.Swift]: 'tree-sitter-swift/tree-sitter-swift.wasm',\n [Language.Kotlin]: 'tree-sitter-kotlin/tree-sitter-kotlin.wasm',\n [Language.Dart]: 'tree-sitter-dart/tree-sitter-dart.wasm',\n };\n\n // Grammars bundled inside this package's wasm/ directory as a reliable\n // fallback (dylink.0 format, confirmed working with web-tree-sitter 0.26.x).\n const BUNDLED_WASM_MAP: Partial<Record<Language, string>> = {\n [Language.Swift]: 'tree-sitter-swift.wasm',\n [Language.Kotlin]: 'tree-sitter-kotlin.wasm',\n [Language.Dart]: 'tree-sitter-dart.wasm',\n };\n\n // 1. Try resolving via the grammar's own npm package.\n const relative = WASM_PACKAGE_MAP[lang];\n if (relative) {\n try {\n return _require.resolve(relative);\n } catch {\n // Package not installed or WASM not present — fall through.\n }\n }\n\n // 2. Fall back to the WASM bundled inside this package.\n const bundled = BUNDLED_WASM_MAP[lang];\n if (bundled) {\n const bundledPath = nodePath.join(_bundledWasmDir, bundled);\n if (existsSync(bundledPath)) return bundledPath;\n }\n\n return null;\n}\n\nlet initPromise: Promise<void> | null = null;\n\n/** Initialize web-tree-sitter (idempotent). */\nexport async function initParser(): Promise<void> {\n if (!initPromise) {\n initPromise = Parser.init();\n }\n return initPromise;\n}\n\nconst languageCache = new Map<Language, TSLanguage | null>();\nconst parserCache = new Map<Language, Parser>();\n\n/**\n * Load and cache the TSLanguage WASM for a given language.\n * Returns null when no WASM grammar is available for this language.\n */\nexport async function getLanguage(lang: Language): Promise<TSLanguage | null> {\n if (languageCache.has(lang)) return languageCache.get(lang)!;\n\n const path = wasmPath(lang);\n if (!path) {\n languageCache.set(lang, null);\n return null;\n }\n\n try {\n await initParser();\n const language = await TSLanguage.load(path);\n languageCache.set(lang, language);\n return language;\n } catch {\n languageCache.set(lang, null);\n return null;\n }\n}\n\n/**\n * Get a Parser instance configured for the given language.\n * Returns null when no WASM grammar is available.\n */\nexport async function getParser(lang: Language): Promise<Parser | null> {\n const language = await getLanguage(lang);\n if (!language) return null;\n\n let parser = parserCache.get(lang);\n if (!parser) {\n parser = new Parser();\n parserCache.set(lang, parser);\n }\n parser.setLanguage(language);\n return parser;\n}\n\n/**\n * Parse source code for the given language.\n * Returns a Tree or null when the language is unsupported / WASM fails.\n */\nexport async function parseSource(\n lang: Language,\n source: string,\n): Promise<import('web-tree-sitter').Tree | null> {\n const parser = await getParser(lang);\n if (!parser) return null;\n return parser.parse(source);\n}\n\n/** Return true if tree-sitter is available for the given language. */\nexport async function isTreeSitterAvailable(lang: Language): Promise<boolean> {\n return (await getLanguage(lang)) !== null;\n}\n","import { Query } from 'web-tree-sitter';\nimport type { Node, Tree, Language } from 'web-tree-sitter';\n\nexport interface QueryCapture {\n name: string;\n node: Node;\n text: string;\n}\n\nexport interface QueryMatch {\n patternIndex: number;\n captures: QueryCapture[];\n}\n\n// ─── Query compilation cache ──────────────────────────────────────────────────\n//\n// Compiling a tree-sitter Query from source is expensive (~20-30ms per call).\n// Without caching, the parse phase calls `new Query(lang, src)` for EVERY file,\n// turning 10k files into ~10k compilations × 20ms = ~200s of pure overhead.\n//\n// This cache avoids recompilation: one `new Query` per (language, querySource)\n// pair per process/worker lifetime — typically 1 per language (3 total for a\n// TS+Python+Go repo).\n//\n// Key: Language instance (singleton from parser-manager's languageCache)\n// Value: Map<querySource, compiled Query>\n// WeakMap: Language objects won't be GC-pinned by this cache.\n\nconst _queryCache = new WeakMap<Language, Map<string, Query>>();\n\nfunction getOrCompileQuery(language: Language, querySource: string): Query {\n let langMap = _queryCache.get(language);\n if (!langMap) {\n langMap = new Map<string, Query>();\n _queryCache.set(language, langMap);\n }\n let q = langMap.get(querySource);\n if (!q) {\n q = new Query(language, querySource);\n langMap.set(querySource, q);\n }\n return q;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function runQuery(\n tree: Tree,\n language: Language,\n querySource: string,\n): QueryCapture[] {\n const query = getOrCompileQuery(language, querySource);\n const matches = query.matches(tree.rootNode);\n const captures: QueryCapture[] = [];\n\n for (const match of matches) {\n for (const capture of match.captures) {\n captures.push({\n name: capture.name,\n node: capture.node,\n text: capture.node.text,\n });\n }\n }\n\n return captures;\n}\n\n/**\n * Return all captures grouped by match, so callers can correlate captures\n * within the same pattern match (e.g. \"def.func\" + \"def.func.name\").\n */\nexport function runQueryMatches(\n tree: Tree,\n language: Language,\n querySource: string,\n): QueryMatch[] {\n const query = getOrCompileQuery(language, querySource);\n const raw = query.matches(tree.rootNode);\n return raw.map((m) => ({\n patternIndex: m.patternIndex,\n captures: m.captures.map((c) => ({\n name: c.name,\n node: c.node,\n text: c.node.text,\n })),\n }));\n}\n","export const typescriptQueries = `\n;; Class declaration\n(class_declaration\n name: (type_identifier) @def.class.name) @def.class\n\n;; Abstract class\n(abstract_class_declaration\n name: (type_identifier) @def.class.name) @def.class\n\n;; Interface declaration\n(interface_declaration\n name: (type_identifier) @def.interface.name) @def.interface\n\n;; Type alias\n(type_alias_declaration\n name: (type_identifier) @def.type_alias.name) @def.type_alias\n\n;; Enum\n(enum_declaration\n name: (identifier) @def.enum.name) @def.enum\n\n;; Function declaration\n(function_declaration\n name: (identifier) @def.func.name) @def.func\n\n;; Arrow function in variable\n(lexical_declaration\n (variable_declarator\n name: (identifier) @def.func.name\n value: (arrow_function))) @def.func\n\n;; Const/let/var variable (non-function)\n(lexical_declaration\n (variable_declarator\n name: (identifier) @def.var.name\n value: (_) @def.var.value)) @def.var\n\n;; Method definition\n(method_definition\n name: (property_identifier) @def.method.name) @def.method\n\n;; Public field definition\n(public_field_definition\n name: (property_identifier) @def.property.name) @def.property\n\n;; Import statement\n(import_statement\n source: (string) @imp.source) @imp\n\n;; Import specifier\n(import_specifier\n name: (identifier) @imp.name)\n\n;; Namespace import\n(namespace_import (identifier) @imp.namespace)\n\n;; Export statement\n(export_statement) @export\n\n;; Call expression — function call\n(call_expression\n function: (identifier) @call.name) @call\n\n;; Call expression — member call\n(call_expression\n function: (member_expression\n object: (_) @call.receiver\n property: (property_identifier) @call.method)) @call.member\n\n;; New expression\n(new_expression\n constructor: (identifier) @call.constructor) @call.new\n\n;; Class heritage — extends\n(class_heritage\n (extends_clause\n value: (identifier) @inherit.extends))\n\n;; Class heritage — implements\n(class_heritage\n (implements_clause\n (type_identifier) @inherit.implements))\n`;\n","export const pythonQueries = `\n;; Class definition\n(class_definition\n name: (identifier) @def.class.name) @def.class\n\n;; Function definition\n(function_definition\n name: (identifier) @def.func.name) @def.func\n\n;; Decorated definition\n(decorated_definition\n (function_definition\n name: (identifier) @def.func.name)) @def.func.decorated\n\n;; Import from\n(import_from_statement\n module_name: (dotted_name) @imp.source) @imp\n\n;; Import\n(import_statement\n name: (dotted_name) @imp.module) @imp.direct\n\n;; Import alias\n(aliased_import\n name: (dotted_name) @imp.alias.original\n alias: (identifier) @imp.alias.name)\n\n;; Call expression\n(call\n function: (identifier) @call.name) @call\n\n;; Attribute call\n(call\n function: (attribute\n object: (_) @call.receiver\n attribute: (identifier) @call.method)) @call.member\n\n;; Assignment\n(assignment\n left: (identifier) @def.var.name) @def.var\n\n;; Class base classes\n(class_definition\n superclasses: (argument_list\n (identifier) @inherit.extends))\n`;\n","export const javaQueries = `\n;; Class declaration\n(class_declaration\n name: (identifier) @def.class.name) @def.class\n\n;; Interface declaration\n(interface_declaration\n name: (identifier) @def.interface.name) @def.interface\n\n;; Enum declaration\n(enum_declaration\n name: (identifier) @def.enum.name) @def.enum\n\n;; Method declaration\n(method_declaration\n name: (identifier) @def.method.name) @def.method\n\n;; Constructor declaration\n(constructor_declaration\n name: (identifier) @def.constructor.name) @def.constructor\n\n;; Field declaration\n(field_declaration\n declarator: (variable_declarator\n name: (identifier) @def.property.name)) @def.property\n\n;; Import\n(import_declaration\n (scoped_identifier) @imp.source) @imp\n\n;; Call\n(method_invocation\n name: (identifier) @call.name) @call\n\n;; Object creation\n(object_creation_expression\n type: (type_identifier) @call.constructor) @call.new\n\n;; Extends\n(superclass (type_identifier) @inherit.extends)\n\n;; Implements\n(super_interfaces\n (type_list (type_identifier) @inherit.implements))\n`;\n","export const goQueries = `\n;; Function declaration\n(function_declaration\n name: (identifier) @def.func.name) @def.func\n\n;; Method declaration\n(method_declaration\n name: (field_identifier) @def.method.name) @def.method\n\n;; Type declaration — struct\n(type_declaration\n (type_spec\n name: (type_identifier) @def.struct.name\n type: (struct_type))) @def.struct\n\n;; Type declaration — interface\n(type_declaration\n (type_spec\n name: (type_identifier) @def.interface.name\n type: (interface_type))) @def.interface\n\n;; Import spec\n(import_spec\n path: (interpreted_string_literal) @imp.source) @imp\n\n;; Call expression\n(call_expression\n function: (identifier) @call.name) @call\n\n;; Selector call\n(call_expression\n function: (selector_expression\n operand: (_) @call.receiver\n field: (field_identifier) @call.method)) @call.member\n\n;; Const declaration\n(const_declaration\n (const_spec\n name: (identifier) @def.constant.name)) @def.constant\n\n;; Var declaration\n(var_declaration\n (var_spec\n name: (identifier) @def.var.name)) @def.var\n`;\n","export const cQueries = `\n;; Function definition\n(function_definition\n declarator: (function_declarator\n declarator: (identifier) @def.func.name)) @def.func\n\n;; Struct specifier\n(struct_specifier\n name: (type_identifier) @def.struct.name) @def.struct\n\n;; Enum specifier\n(enum_specifier\n name: (type_identifier) @def.enum.name) @def.enum\n\n;; Typedef\n(type_definition\n declarator: (type_identifier) @def.type_alias.name) @def.type_alias\n\n;; Include\n(preproc_include\n path: (_) @imp.source) @imp\n\n;; Call\n(call_expression\n function: (identifier) @call.name) @call\n\n;; Global variable\n(declaration\n declarator: (init_declarator\n declarator: (identifier) @def.var.name)) @def.var\n`;\n","export const cppQueries = `\n;; Class specifier\n(class_specifier\n name: (type_identifier) @def.class.name) @def.class\n\n;; Struct specifier\n(struct_specifier\n name: (type_identifier) @def.struct.name) @def.struct\n\n;; Function definition\n(function_definition\n declarator: (function_declarator\n declarator: (identifier) @def.func.name)) @def.func\n\n;; Namespace definition\n(namespace_definition\n name: (namespace_identifier) @def.namespace.name) @def.namespace\n\n;; Template declaration\n(template_declaration\n (class_specifier\n name: (type_identifier) @def.class.name)) @def.class.template\n\n;; Include\n(preproc_include\n path: (_) @imp.source) @imp\n\n;; Call\n(call_expression\n function: (identifier) @call.name) @call\n\n;; Member call\n(call_expression\n function: (field_expression\n field: (field_identifier) @call.method)) @call.member\n\n;; Base class clause\n(base_class_clause\n (type_identifier) @inherit.extends)\n\n;; Enum\n(enum_specifier\n name: (type_identifier) @def.enum.name) @def.enum\n`;\n","export const csharpQueries = `\n;; Class declaration\n(class_declaration\n name: (identifier) @def.class.name) @def.class\n\n;; Interface declaration\n(interface_declaration\n name: (identifier) @def.interface.name) @def.interface\n\n;; Struct declaration\n(struct_declaration\n name: (identifier) @def.struct.name) @def.struct\n\n;; Enum declaration\n(enum_declaration\n name: (identifier) @def.enum.name) @def.enum\n\n;; Method declaration\n(method_declaration\n name: (identifier) @def.method.name) @def.method\n\n;; Constructor declaration\n(constructor_declaration\n name: (identifier) @def.constructor.name) @def.constructor\n\n;; Property declaration\n(property_declaration\n name: (identifier) @def.property.name) @def.property\n\n;; Namespace declaration\n(namespace_declaration\n name: (_) @def.namespace.name) @def.namespace\n\n;; Using directive\n(using_directive\n (qualified_name) @imp.source) @imp\n\n;; Invocation\n(invocation_expression\n function: (identifier) @call.name) @call\n\n;; Member invocation\n(invocation_expression\n function: (member_access_expression\n name: (identifier) @call.method)) @call.member\n\n;; Object creation\n(object_creation_expression\n type: (identifier) @call.constructor) @call.new\n\n;; Base list (extends/implements)\n(base_list\n (identifier) @inherit.extends)\n`;\n","export const rustQueries = `\n;; Function item\n(function_item\n name: (identifier) @def.func.name) @def.func\n\n;; Struct item\n(struct_item\n name: (type_identifier) @def.struct.name) @def.struct\n\n;; Enum item\n(enum_item\n name: (type_identifier) @def.enum.name) @def.enum\n\n;; Trait item\n(trait_item\n name: (type_identifier) @def.trait.name) @def.trait\n\n;; Impl item\n(impl_item\n type: (type_identifier) @def.class.name) @def.impl\n\n;; Type alias\n(type_item\n name: (type_identifier) @def.type_alias.name) @def.type_alias\n\n;; Use declaration\n(use_declaration\n argument: (_) @imp.source) @imp\n\n;; Call\n(call_expression\n function: (identifier) @call.name) @call\n\n;; Method call\n(call_expression\n function: (field_expression\n field: (field_identifier) @call.method)) @call.member\n\n;; Const item\n(const_item\n name: (identifier) @def.constant.name) @def.constant\n\n;; Static item\n(static_item\n name: (identifier) @def.var.name) @def.var\n`;\n","export const phpQueries = `\n;; Class declaration\n(class_declaration\n name: (name) @def.class.name) @def.class\n\n;; Interface declaration\n(interface_declaration\n name: (name) @def.interface.name) @def.interface\n\n;; Trait declaration\n(trait_declaration\n name: (name) @def.trait.name) @def.trait\n\n;; Function definition\n(function_definition\n name: (name) @def.func.name) @def.func\n\n;; Method declaration\n(method_declaration\n name: (name) @def.method.name) @def.method\n\n;; Property declaration\n(property_declaration\n (property_element\n (variable_name) @def.property.name)) @def.property\n\n;; Namespace definition\n(namespace_definition\n name: (namespace_name) @def.namespace.name) @def.namespace\n\n;; Use declaration (import)\n(namespace_use_declaration\n (namespace_use_clause\n (qualified_name) @imp.source)) @imp\n\n;; Include/require\n(include_expression\n (_) @imp.source) @imp.include\n\n;; Function call\n(function_call_expression\n function: (name) @call.name) @call\n\n;; Method call\n(member_call_expression\n name: (name) @call.method) @call.member\n\n;; Object creation\n(object_creation_expression\n (name) @call.constructor) @call.new\n\n;; Class base clause\n(base_clause\n (name) @inherit.extends)\n\n;; Class interface clause\n(class_interface_clause\n (name) @inherit.implements)\n`;\n","export const kotlinQueries = `\n;; Class declaration (includes enum class via modifiers)\n(class_declaration\n (identifier) @def.class.name) @def.class\n\n;; Object declaration (companion objects, singletons)\n(object_declaration\n (identifier) @def.class.name) @def.class.object\n\n;; Function declaration (top-level and methods)\n(function_declaration\n (identifier) @def.func.name) @def.func\n\n;; Property declaration\n(property_declaration\n (variable_declaration\n (identifier) @def.property.name)) @def.property\n`;\n","export const rubyQueries = `\n;; Class\n(class\n name: (constant) @def.class.name) @def.class\n\n;; Module\n(module\n name: (constant) @def.module.name) @def.module\n\n;; Method\n(method\n name: (identifier) @def.method.name) @def.method\n\n;; Singleton method\n(singleton_method\n name: (identifier) @def.method.name) @def.method.static\n\n;; Assignment\n(assignment\n left: (identifier) @def.var.name) @def.var\n\n;; Require\n(call\n method: (identifier) @_method\n arguments: (argument_list (string) @imp.source)\n (#match? @_method \"^require\"))\n\n;; Call\n(call\n method: (identifier) @call.name) @call\n\n;; Superclass\n(superclass\n (constant) @inherit.extends)\n`;\n","export const swiftQueries = `\n;; In tree-sitter-swift, structs/classes/enums/actors all use class_declaration.\n;; Distinguish them with a keyword anchor.\n\n;; Struct declaration\n(class_declaration \"struct\"\n (type_identifier) @def.struct.name) @def.struct\n\n;; Class declaration\n(class_declaration \"class\"\n (type_identifier) @def.class.name) @def.class\n\n;; Enum declaration\n(class_declaration \"enum\"\n (type_identifier) @def.enum.name) @def.enum\n\n;; Protocol declaration\n(protocol_declaration\n (type_identifier) @def.interface.name) @def.interface\n\n;; Function declaration (no name: field in this grammar; positional match)\n(function_declaration\n (simple_identifier) @def.func.name) @def.func\n\n;; Property declaration\n(property_declaration\n (pattern\n (simple_identifier) @def.property.name)) @def.property\n`;\n","/**\n * OpenTelemetry distributed tracing bootstrap.\n *\n * Call `initTracing()` once at process startup — before any imports that\n * you want auto-instrumented (HTTP, DB, etc.).\n *\n * Configuration via environment variables:\n * CODE_INTEL_OTEL_ENABLED = \"true\" (default: false — opt-in)\n * CODE_INTEL_OTEL_ENDPOINT = \"http://localhost:4318\" (OTLP/HTTP)\n * CODE_INTEL_OTEL_SERVICE = \"code-intel\" (service.name attribute)\n * CODE_INTEL_OTEL_ENV = \"production\" (deployment.environment)\n *\n * When disabled, all `trace.*` calls become no-ops (zero overhead).\n */\n\nimport { NodeSDK } from '@opentelemetry/sdk-node';\nimport { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\nimport {\n SEMRESATTRS_SERVICE_NAME,\n SEMRESATTRS_DEPLOYMENT_ENVIRONMENT,\n} from '@opentelemetry/semantic-conventions';\nimport {\n trace,\n context,\n SpanStatusCode,\n type Span,\n type Attributes,\n} from '@opentelemetry/api';\n\n// Re-export so callers don't need to depend on @opentelemetry/api directly\nexport { trace, context, SpanStatusCode };\nexport type { Span, Attributes };\n\nlet _sdk: NodeSDK | null = null;\n\nexport function isTracingEnabled(): boolean {\n return process.env['CODE_INTEL_OTEL_ENABLED'] === 'true';\n}\n\nexport function initTracing(): void {\n if (!isTracingEnabled()) return;\n if (_sdk) return; // already initialised\n\n const endpoint =\n process.env['CODE_INTEL_OTEL_ENDPOINT'] ?? 'http://localhost:4318';\n const serviceName =\n process.env['CODE_INTEL_OTEL_SERVICE'] ?? 'code-intel';\n const deploymentEnv =\n process.env['CODE_INTEL_OTEL_ENV'] ?? process.env['NODE_ENV'] ?? 'development';\n\n const exporter = new OTLPTraceExporter({ url: `${endpoint}/v1/traces` });\n\n _sdk = new NodeSDK({\n resource: resourceFromAttributes({\n [SEMRESATTRS_SERVICE_NAME]: serviceName,\n [SEMRESATTRS_DEPLOYMENT_ENVIRONMENT]: deploymentEnv,\n }),\n traceExporter: exporter,\n instrumentations: [\n getNodeAutoInstrumentations({\n // Disable noisy file-system instrumentation\n '@opentelemetry/instrumentation-fs': { enabled: false },\n }),\n ],\n });\n\n _sdk.start();\n}\n\nexport async function shutdownTracing(): Promise<void> {\n if (_sdk) {\n await _sdk.shutdown();\n _sdk = null;\n }\n}\n\n// ── Tracer factory ───────────────────────────────────────────────────────────\n\nconst TRACER_NAME = 'code-intel';\n\nexport function getTracer() {\n return trace.getTracer(TRACER_NAME);\n}\n\n/**\n * Wrap an async function in a span. Safe to call even when tracing is\n * disabled — the callback still runs, the span is just a no-op.\n *\n * @param name Span name\n * @param attrs Optional initial span attributes (must not contain secrets)\n * @param fn The async work to perform\n */\nexport async function withSpan<T>(\n name: string,\n attrs: Attributes,\n fn: (span: Span) => Promise<T>,\n): Promise<T> {\n return getTracer().startActiveSpan(name, { attributes: sanitizeAttrs(attrs) }, async (span) => {\n try {\n const result = await fn(span);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (err) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: err instanceof Error ? err.message : String(err),\n });\n span.recordException(err as Error);\n throw err;\n } finally {\n span.end();\n }\n });\n}\n\n/**\n * Strip any attribute keys that look like they might carry secrets.\n * Span attributes must never include raw code, tokens, or passwords.\n */\nconst BLOCKED_ATTR_KEYS = /secret|password|token|key|auth|credential/i;\n\nexport function sanitizeAttrs(attrs: Attributes): Attributes {\n const safe: Attributes = {};\n for (const [k, v] of Object.entries(attrs)) {\n if (BLOCKED_ATTR_KEYS.test(k)) continue;\n safe[k] = v;\n }\n return safe;\n}\n\n/**\n * Get the active trace ID and span ID for log correlation.\n * Returns empty strings when tracing is not active.\n */\nexport function getActiveTraceContext(): { traceId: string; spanId: string } {\n const span = trace.getActiveSpan();\n if (!span) return { traceId: '', spanId: '' };\n const ctx = span.spanContext();\n return { traceId: ctx.traceId, spanId: ctx.spanId };\n}\n","/**\n * Logger with sensitive data masking.\n * Uses winston + winston-daily-rotate-file.\n *\n * - In production / CI (NODE_ENV=production): Console only (stdout, structured).\n * - Otherwise: Daily-rotating file logs under ./logs/ + Console.\n * - Log level controlled by LOG_LEVEL env var (default: \"info\").\n * - Sensitive keys and patterns are masked before output.\n * - Every log line includes { traceId, spanId } from the active OTel span\n * when tracing is enabled.\n *\n * @module shared/Logger\n */\nimport winston from 'winston';\nimport DailyRotateFile from 'winston-daily-rotate-file';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\n\n// Lazy OTel trace context — loaded dynamically to avoid circular deps and to\n// remain a no-op when OTel is not enabled. The getter is synchronous once\n// the module is cached.\ntype TraceContextFn = () => { traceId: string; spanId: string };\nlet _getTraceCtx: TraceContextFn | null | 'pending' = null;\n\nfunction getActiveTraceCtx(): { traceId: string; spanId: string } {\n if (_getTraceCtx === 'pending') return { traceId: '', spanId: '' };\n if (_getTraceCtx) return _getTraceCtx();\n // Attempt to lazy-load (once) without blocking\n _getTraceCtx = 'pending';\n import('../observability/tracing.js')\n .then((mod) => {\n _getTraceCtx = (mod as { getActiveTraceContext: TraceContextFn }).getActiveTraceContext;\n })\n .catch(() => {\n _getTraceCtx = null;\n });\n return { traceId: '', spanId: '' };\n}\n\n// ─── Sensitive-data masking ───────────────────────────────────────────────────\n\nconst SENSITIVE_KEYS: string[] = [\n 'password', 'passwd', 'pass', 'pwd', 'secret', 'secretkey', 'secret_key', 'secretaccesskey', 'accesskeyid',\n 'credentials', 'auth', 'authentication', 'login',\n 'api_key', 'apikey', 'api', 'access_key', 'access_token', 'accesskey',\n 'auth_key', 'auth_token', 'authkey', 'token', 'jwt', 'bearer_token',\n 'refresh_token', 'session_token', 'session_key', 'oauth_token',\n 'connection_string', 'conn_string', 'db_uri', 'db_url', 'database_url',\n 'mongodb_uri', 'mysql_uri', 'postgres_uri', 'sql_uri',\n 'db_username', 'db_password', 'db_host', 'db_port', 'db_name',\n 'encryption_key', 'crypto_key', 'private_key', 'public_key', 'ssl_key',\n 'ssh_key', 'pgp_key', 'rsa_key', 'aes_key',\n 'email', 'phone', 'telephone', 'mobile', 'ssn', 'social_security',\n 'credit_card', 'cc_number', 'card_number', 'cvv', 'expiry_date',\n 'birth_date', 'dob', 'address', 'zip_code', 'postal_code',\n 'bank_account', 'iban', 'swift_code', 'routing_number',\n 'tax_id', 'vat_number', 'financial_id',\n 'certificate', 'client_cert', 'server_cert', 'ca_cert',\n 'aws_key', 'aws_secret', 'azure_key', 'gcp_key', 's3_key',\n 'cloudinary_key', 'stripe_key', 'paypal_key', 'twilio_key',\n 'app_secret', 'client_secret', 'consumer_secret', 'encryption_secret',\n 'master_key', 'root_password', 'admin_password',\n 'config_secret', 'env_secret', 'deploy_key', 'ci_key',\n 'session_id', 'cookie_secret', 'csrf_token', 'xsrf_token',\n 'license_key', 'product_key', 'serial_number', 'activation_code',\n];\n\nconst SENSITIVE_PATTERNS: RegExp[] = [\n /(?:password|passwd|secret|api_key|access_token|auth_token|token)\\s*[:=]\\s*([^\\s,]+)/gi,\n /\\b\\d{16}\\b/gi,\n /\\b\\d{3}-\\d{2}-\\d{4}\\b/gi,\n /\\b[A-Za-z0-9]{32}\\b/gi,\n /\\b[A-Za-z0-9_-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}\\b/gi,\n /\\b\\d{10}\\b/gi,\n /\\b[A-Za-z0-9]{64}\\b/gi,\n /(?:connection_string|db_uri|db_url|mongodb_uri)\\s*[:=]\\s*([^\\s,]+)/gi,\n /(?:apikey|api_key|auth_key)\\s*[:=]\\s*([^\\s,]+)/gi,\n /(?:bearer\\s+)([a-zA-Z0-9\\-_]+\\.[a-zA-Z0-9\\-_]+\\.[a-zA-Z0-9\\-_]+)/gi,\n];\n\nconst SENSITIVE_KEYS_REGEX = new RegExp(`^(${SENSITIVE_KEYS.join('|')})$`, 'i');\n\nclass Logger {\n private static instance: winston.Logger | null = null;\n\n static maskSensitiveData(value: string): string {\n if (typeof value === 'string' && value.length > 5) {\n const firstChar = value.at(0)!;\n const lastChar = value.at(-1)!;\n return firstChar + '*'.repeat(value.length - 2) + lastChar;\n }\n return value;\n }\n\n static maskSensitive(message: string, args: unknown[] = []): { maskedMessage: string; maskedArgs: unknown[] } {\n const maskString = (input: string): string => {\n if (typeof input !== 'string') return input;\n return SENSITIVE_PATTERNS.reduce((str, pattern) => {\n return str.replace(pattern, (match: string, value: string) =>\n value ? match.replace(value, Logger.maskSensitiveData(value)) : match,\n );\n }, input);\n };\n\n const deepMask = (obj: unknown): unknown => {\n if (typeof obj === 'string') return maskString(obj);\n if (Array.isArray(obj)) return obj.map((item: unknown) => deepMask(item));\n if (typeof obj === 'object' && obj !== null) {\n return Object.entries(obj as Record<string, unknown>).reduce(\n (acc: Record<string, unknown>, [key, value]) => {\n if (value === undefined) return acc;\n const isSensitiveKey = SENSITIVE_KEYS_REGEX.test(key);\n acc[key] = isSensitiveKey && typeof value === 'string'\n ? Logger.maskSensitiveData(value)\n : deepMask(value);\n return acc;\n },\n {},\n );\n }\n return obj;\n };\n\n return {\n maskedMessage: maskString(message),\n maskedArgs: args.map((arg: unknown) => deepMask(arg)),\n };\n }\n\n /** Global log directory: ~/.code-intel/logs */\n static readonly LOG_DIR = path.join(os.homedir(), '.code-intel', 'logs');\n\n static getLogger(): winston.Logger {\n if (!Logger.instance) {\n const isProduction = process.env.NODE_ENV === 'production';\n const logLevel = process.env.LOG_LEVEL ?? 'info';\n const transports: winston.transport[] = [];\n\n // Always add console transport\n transports.push(new winston.transports.Console());\n\n if (!isProduction) {\n // Dev + global installs: rotate logs into ~/.code-intel/logs/\n try {\n if (!fs.existsSync(Logger.LOG_DIR)) {\n fs.mkdirSync(Logger.LOG_DIR, { recursive: true });\n }\n transports.push(\n new DailyRotateFile({\n filename: path.join(Logger.LOG_DIR, '%DATE%-code-intel.log'),\n datePattern: 'YYYY-MM-DD',\n maxSize: '20m',\n maxFiles: '14d',\n }),\n );\n } catch {\n // If we can't write to the log dir (e.g. read-only FS), continue console-only\n }\n }\n\n Logger.instance = winston.createLogger({\n level: logLevel,\n format: winston.format.combine(\n winston.format.timestamp(),\n winston.format.printf(({ timestamp, level, message, ...meta }) => {\n const args = (meta[Symbol.for('splat') as unknown as string] as unknown[]) || [];\n const { maskedMessage, maskedArgs } = Logger.maskSensitive(message as string, args);\n const formattedArgs = maskedArgs.map((arg: unknown) =>\n typeof arg === 'object' ? JSON.stringify(arg) : String(arg),\n );\n const suffix = formattedArgs.length ? ' ' + formattedArgs.join(' ') : '';\n // Include OTel trace context when available\n let traceCtx = '';\n try {\n const { traceId, spanId } = getActiveTraceCtx();\n if (traceId) traceCtx = ` [trace=${traceId} span=${spanId}]`;\n } catch { /* OTel not loaded */ }\n return `${timestamp} [${level.toUpperCase()}]${traceCtx}: ${maskedMessage}${suffix}`;\n }),\n ),\n transports,\n });\n }\n return Logger.instance;\n }\n\n static info(message: string, ...args: unknown[]): void {\n Logger.getLogger().info(message, ...args);\n }\n\n static warn(message: string, ...args: unknown[]): void {\n Logger.getLogger().warn(message, ...args);\n }\n\n static error(message: string, ...args: unknown[]): void {\n Logger.getLogger().error(message, ...args);\n }\n\n static debug(message: string, ...args: unknown[]): void {\n Logger.getLogger().debug(message, ...args);\n }\n}\n\nexport default Logger;\n\n// Eagerly initialize so the log directory and file transport are created on import,\n// even if no log messages are emitted during a short run.\nLogger.getLogger();\n","export const javascriptQueries = `\n;; Function declaration\n(function_declaration\n name: (identifier) @def.func.name) @def.func\n\n;; Arrow function in variable\n(lexical_declaration\n (variable_declarator\n name: (identifier) @def.func.name\n value: (arrow_function))) @def.func\n\n;; Const/let/var variable (non-function, SCREAMING_SNAKE_CASE only — kept for constants)\n(lexical_declaration\n (variable_declarator\n name: (identifier) @def.var.name\n value: (_) @def.var.value)) @def.var\n\n;; Class declaration (JS uses identifier, not type_identifier)\n(class_declaration\n name: (identifier) @def.class.name) @def.class\n\n;; Method definition\n(method_definition\n name: (property_identifier) @def.method.name) @def.method\n\n;; Public field definition (JS uses field_definition with property: field, not name:)\n(field_definition\n property: (property_identifier) @def.property.name) @def.property\n\n;; Import statement\n(import_statement\n source: (string) @imp.source) @imp\n\n;; Import specifier\n(import_specifier\n name: (identifier) @imp.name)\n\n;; Namespace import\n(namespace_import (identifier) @imp.namespace)\n\n;; Export statement\n(export_statement) @export\n\n;; Call expression — function call\n(call_expression\n function: (identifier) @call.name) @call\n\n;; Call expression — member call\n(call_expression\n function: (member_expression\n object: (_) @call.receiver\n property: (property_identifier) @call.method)) @call.member\n\n;; New expression\n(new_expression\n constructor: (identifier) @call.constructor) @call.new\n`;\n","export const dartQueries = `\n;; Class definition (includes abstract classes)\n(class_definition\n name: (identifier) @def.class.name) @def.class\n\n;; Enum declaration\n(enum_declaration\n name: (identifier) @def.enum.name) @def.enum\n\n;; Function / method signatures (top-level functions and class methods)\n;; tree-sitter-dart uses function_signature for both\n(function_signature\n name: (identifier) @def.func.name) @def.func\n`;\n","export { typescriptQueries } from './typescript.js';\nexport { javascriptQueries } from './javascript.js';\nexport { pythonQueries } from './python.js';\nexport { javaQueries } from './java.js';\nexport { goQueries } from './go.js';\nexport { cQueries } from './c.js';\nexport { cppQueries } from './cpp.js';\nexport { csharpQueries } from './csharp.js';\nexport { rustQueries } from './rust.js';\nexport { phpQueries } from './php.js';\nexport { kotlinQueries } from './kotlin.js';\nexport { rubyQueries } from './ruby.js';\nexport { swiftQueries } from './swift.js';\nexport { dartQueries } from './dart.js';\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { detectLanguage, Language } from '../../shared/index.js';\nimport type { Phase, PhaseResult, PipelineContext } from '../types.js';\nimport { generateNodeId, generateEdgeId } from '../../graph/id-generator.js';\nimport type { CodeNode, CodeEdge, NodeKind } from '../../shared/index.js';\nimport Logger from '../../shared/logger.js';\nimport { parseSource, getLanguage } from '../../parsing/parser-manager.js';\nimport { runQueryMatches } from '../../parsing/query-runner.js';\nimport type { Node as TSNode, Language as TSLanguage } from 'web-tree-sitter';\nimport {\n typescriptQueries,\n javascriptQueries,\n pythonQueries,\n javaQueries,\n goQueries,\n cQueries,\n cppQueries,\n csharpQueries,\n rustQueries,\n phpQueries,\n kotlinQueries,\n rubyQueries,\n swiftQueries,\n dartQueries,\n} from '../../parsing/queries/index.js';\n\n// ─── Query map ───────────────────────────────────────────────────────────────\n\nconst LANG_QUERIES: Partial<Record<Language, string>> = {\n [Language.TypeScript]: typescriptQueries,\n [Language.JavaScript]: javascriptQueries,\n [Language.Python]: pythonQueries,\n [Language.Java]: javaQueries,\n [Language.Go]: goQueries,\n [Language.C]: cQueries,\n [Language.Cpp]: cppQueries,\n [Language.CSharp]: csharpQueries,\n [Language.Rust]: rustQueries,\n [Language.PHP]: phpQueries,\n [Language.Kotlin]: kotlinQueries,\n [Language.Ruby]: rubyQueries,\n [Language.Swift]: swiftQueries,\n [Language.Dart]: dartQueries,\n};\n\n// ─── Capture-name → NodeKind map ─────────────────────────────────────────────\n\nconst CAPTURE_KIND: Record<string, NodeKind> = {\n 'def.func': 'function',\n 'def.func.decorated': 'function',\n 'def.method': 'method',\n 'def.method.static': 'method',\n 'def.class': 'class',\n 'def.class.object': 'class',\n 'def.class.template': 'class',\n 'def.impl': 'class',\n 'def.interface': 'interface',\n 'def.enum': 'enum',\n 'def.struct': 'struct',\n 'def.trait': 'trait',\n 'def.type_alias': 'type_alias',\n 'def.constant': 'constant',\n 'def.namespace': 'namespace',\n 'def.module': 'module',\n 'def.property': 'property',\n 'def.var': 'variable',\n 'def.constructor': 'constructor',\n};\n\n// Captures that are NOT symbol definitions (skip them)\nconst NON_DEF_PREFIXES = ['imp.', 'call.', 'export', 'inherit.'];\n\nfunction isDefCapture(name: string): boolean {\n if (!name.startsWith('def.')) return false;\n return true;\n}\n\nfunction captureKind(name: string): NodeKind | null {\n // Exact match first\n if (CAPTURE_KIND[name]) return CAPTURE_KIND[name];\n // Prefix match (e.g. \"def.func.name\" → strip \".name\" → \"def.func\")\n const base = name.replace(/\\.name$/, '');\n return CAPTURE_KIND[base] ?? null;\n}\n\n// ─── Exported-ness helpers ────────────────────────────────────────────────────\n\nfunction isExported(node: TSNode, lang: Language, name?: string): boolean {\n if (lang === Language.TypeScript || lang === Language.JavaScript) {\n // Walk ancestor chain looking for export_statement\n let cur: TSNode | null = node.parent;\n while (cur) {\n if (cur.type === 'export_statement') return true;\n cur = cur.parent;\n }\n return false;\n }\n if (lang === Language.Java || lang === Language.CSharp) {\n // Check for 'public' modifier in enclosing modifiers or parent text\n let cur: TSNode | null = node.parent;\n while (cur) {\n if (cur.type === 'modifiers') return cur.text.includes('public');\n if (cur.type === 'class_declaration' || cur.type === 'method_declaration' ||\n cur.type === 'interface_declaration' || cur.type === 'enum_declaration') {\n return cur.text.trimStart().startsWith('public');\n }\n cur = cur.parent;\n }\n return false;\n }\n if (lang === Language.Go) {\n // Go: exported iff first letter is uppercase\n const n = name ?? node.text;\n return n.length > 0 && n[0] === n[0].toUpperCase() && /[A-Z]/.test(n[0]);\n }\n if (lang === Language.Rust) {\n // Walk ancestors for visibility_modifier (pub)\n let cur: TSNode | null = node.parent;\n while (cur) {\n if (cur.type === 'visibility_modifier') return true;\n // Stop at impl block boundary\n if (cur.type === 'source_file') break;\n cur = cur.parent;\n }\n return false;\n }\n if (lang === Language.Python) {\n // Python: exported iff name doesn't start with underscore\n const n = name ?? node.text;\n return !n.startsWith('_');\n }\n // Default: everything is exported (C, C++, PHP, Ruby, Swift, etc.)\n return true;\n}\n\n// ─── Parameter extraction ─────────────────────────────────────────────────────\n\ninterface Param { name: string; type?: string }\n\nfunction extractParams(defNode: TSNode, lang: Language): Param[] {\n const params: Param[] = [];\n\n // TypeScript / JavaScript\n if (lang === Language.TypeScript || lang === Language.JavaScript) {\n const paramNode =\n defNode.childForFieldName?.('parameters') ??\n findFirstChildByType(defNode, 'formal_parameters') ??\n findFirstChildByType(defNode, 'formal_parameter');\n if (paramNode) {\n for (const child of paramNode.children) {\n if (child.type === 'required_parameter' || child.type === 'optional_parameter') {\n const namePart = child.childForFieldName?.('pattern') ?? child.firstChild;\n const typePart = child.childForFieldName?.('type');\n if (namePart) {\n params.push({\n name: namePart.text,\n type: typePart ? typePart.text.replace(/^:\\s*/, '') : undefined,\n });\n }\n } else if (child.type === 'identifier') {\n // Untyped JS parameter\n params.push({ name: child.text });\n }\n }\n }\n return params;\n }\n\n // Python\n if (lang === Language.Python) {\n const paramNode = defNode.childForFieldName?.('parameters');\n if (paramNode) {\n for (const child of paramNode.children) {\n if (child.type === 'identifier') {\n if (child.text === 'self' || child.text === 'cls') continue;\n params.push({ name: child.text });\n } else if (child.type === 'typed_parameter') {\n const name = child.children.find((c) => c.type === 'identifier');\n const type = child.children.find((c) => c.type === 'type');\n if (name) {\n params.push({ name: name.text, type: type?.text });\n }\n } else if (child.type === 'default_parameter') {\n const name = child.childForFieldName?.('name');\n if (name) params.push({ name: name.text });\n } else if (child.type === 'typed_default_parameter') {\n const name = child.childForFieldName?.('name');\n const type = child.childForFieldName?.('type');\n if (name) params.push({ name: name.text, type: type?.text });\n }\n }\n }\n return params;\n }\n\n // Go\n if (lang === Language.Go) {\n const paramNode = defNode.childForFieldName?.('parameters');\n if (paramNode) {\n for (const child of paramNode.children) {\n if (child.type === 'parameter_declaration') {\n const name = child.children.find((c) => c.type === 'identifier');\n const type = child.childForFieldName?.('type');\n if (name) params.push({ name: name.text, type: type?.text });\n }\n }\n }\n return params;\n }\n\n // Java / Kotlin / C# / PHP / Swift / Ruby — basic extraction\n const paramNode =\n defNode.childForFieldName?.('parameters') ??\n findFirstChildByType(defNode, 'formal_parameters') ??\n findFirstChildByType(defNode, 'function_value_parameters') ??\n findFirstChildByType(defNode, 'parameter_list');\n if (paramNode) {\n for (const child of paramNode.children) {\n if (child.type.includes('parameter')) {\n const name =\n child.childForFieldName?.('name') ??\n child.children.find((c) => c.type === 'identifier');\n if (name) params.push({ name: name.text });\n }\n }\n }\n return params;\n}\n\n// ─── Return type extraction ───────────────────────────────────────────────────\n\nfunction extractReturnType(defNode: TSNode, lang: Language): string | undefined {\n if (lang === Language.TypeScript || lang === Language.JavaScript) {\n const retNode = defNode.childForFieldName?.('return_type');\n return retNode ? retNode.text.replace(/^:\\s*/, '') : undefined;\n }\n if (lang === Language.Python) {\n const retNode = defNode.childForFieldName?.('return_type');\n return retNode ? retNode.text.replace(/^->\\s*/, '') : undefined;\n }\n if (lang === Language.Go) {\n const retNode = defNode.childForFieldName?.('result');\n return retNode ? retNode.text : undefined;\n }\n if (lang === Language.Java || lang === Language.Kotlin) {\n const retNode = defNode.childForFieldName?.('type');\n return retNode ? retNode.text : undefined;\n }\n if (lang === Language.Rust) {\n const retNode = defNode.childForFieldName?.('return_type');\n return retNode ? retNode.text.replace(/^->\\s*/, '') : undefined;\n }\n return undefined;\n}\n\n// ─── Doc / JSDoc extraction ───────────────────────────────────────────────────\n\nfunction extractDoc(defNode: TSNode, source: string, lang: Language): string | undefined {\n const DOC_MAX = 500;\n\n /**\n * Find the \"anchor\" node whose previous sibling we look at for a doc comment.\n * For exported declarations (e.g. `export function foo ...`), the function_declaration\n * is inside `export_statement`, so we walk up to the export_statement first.\n */\n function anchorNode(n: TSNode): TSNode {\n let cur: TSNode = n;\n while (cur.parent && cur.parent.type === 'export_statement') {\n cur = cur.parent;\n }\n return cur;\n }\n\n const anchor = anchorNode(defNode);\n\n // Walk previous siblings of the anchor to find a comment, skipping decorators\n let prev: TSNode | null = anchor.previousSibling ?? prevSibling(anchor);\n while (prev && (prev.type === 'decorator' || prev.type.includes('attribute_item'))) {\n prev = prev.previousSibling ?? prevSibling(prev);\n }\n\n if (!prev) return undefined;\n\n // TypeScript/JavaScript: /** ... */\n if (lang === Language.TypeScript || lang === Language.JavaScript) {\n if (prev.type === 'comment' && prev.text.startsWith('/**')) {\n const lines = prev.text\n .split('\\n')\n .map((l) => l.replace(/^\\s*\\*+\\s?/, '').trim())\n .filter((l) => l !== '' && l !== '/' && l !== '*');\n const doc = lines.join('\\n').slice(0, DOC_MAX);\n return doc || undefined;\n }\n return undefined;\n }\n\n // Java / C#: /** ... */\n if (lang === Language.Java || lang === Language.CSharp || lang === Language.Kotlin) {\n if (prev.type === 'block_comment' || prev.type === 'comment') {\n if (prev.text.startsWith('/**')) {\n const lines = prev.text\n .split('\\n')\n .map((l) => l.replace(/^\\s*\\*+\\s?/, '').trim())\n .filter(Boolean);\n return lines.join('\\n').slice(0, DOC_MAX) || undefined;\n }\n }\n return undefined;\n }\n\n // Python: first string in body\n if (lang === Language.Python) {\n const body = defNode.childForFieldName?.('body');\n if (body) {\n const first = body.firstChild;\n if (first?.type === 'expression_statement') {\n const s = first.firstChild;\n if (s?.type === 'string') {\n return s.text.replace(/^[\"']{1,3}|[\"']{1,3}$/g, '').trim().slice(0, DOC_MAX);\n }\n }\n }\n return undefined;\n }\n\n // Go: preceding // comment lines\n if (lang === Language.Go) {\n const lines: string[] = [];\n let cur: TSNode | null = prev;\n while (cur && cur.type === 'comment') {\n lines.unshift(cur.text.replace(/^\\/\\/\\s?/, '').trim());\n cur = cur.previousSibling ?? prevSibling(cur);\n }\n const doc = lines.join('\\n').trim().slice(0, DOC_MAX);\n return doc || undefined;\n }\n\n // Rust: /// doc lines\n if (lang === Language.Rust) {\n const lines: string[] = [];\n let cur: TSNode | null = prev;\n while (cur && cur.type === 'line_comment') {\n const t = cur.text;\n if (t.startsWith('///')) {\n lines.unshift(t.replace(/^\\/\\/\\/\\s?/, '').trim());\n } else {\n break;\n }\n cur = cur.previousSibling ?? prevSibling(cur);\n }\n const doc = lines.join('\\n').trim().slice(0, DOC_MAX);\n return doc || undefined;\n }\n\n return undefined;\n}\n\n// ─── Decorator / annotation extraction ────────────────────────────────────────\n\nfunction extractDecorators(defNode: TSNode, lang: Language): string[] {\n const decs: string[] = [];\n\n if (lang === Language.TypeScript || lang === Language.JavaScript) {\n // Decorators in TS can be:\n // 1. Children of export_statement (when exported: `@Dec() export class Foo {}`)\n // 2. Preceding siblings of the class/function node (non-exported)\n let anchor: TSNode = defNode;\n while (anchor.parent?.type === 'export_statement') anchor = anchor.parent;\n\n if (anchor.type === 'export_statement') {\n // Decorators are named children of export_statement\n for (const child of anchor.namedChildren) {\n if (child.type === 'decorator') decs.push(child.text);\n }\n } else {\n // Non-exported: decorators are preceding siblings\n let prev: TSNode | null = anchor.previousSibling;\n while (prev && prev.type === 'decorator') {\n decs.unshift(prev.text);\n prev = prev.previousSibling;\n }\n }\n return decs;\n }\n\n if (lang === Language.Java || lang === Language.Kotlin) {\n // Annotations live inside the modifiers child\n const modifiers = defNode.childForFieldName?.('modifiers');\n if (modifiers) {\n for (const child of modifiers.children) {\n if (child.type === 'marker_annotation' || child.type === 'annotation') {\n decs.push(child.text);\n }\n }\n }\n // Also preceding siblings for Kotlin\n let prev: TSNode | null = defNode.previousSibling ?? prevSibling(defNode);\n while (prev && (prev.type === 'marker_annotation' || prev.type === 'annotation')) {\n decs.unshift(prev.text);\n prev = prev.previousSibling ?? prevSibling(prev);\n }\n return decs;\n }\n\n if (lang === Language.Python) {\n // In Python AST, decorated_definition wraps decorator + definition\n const p = defNode.parent;\n if (p?.type === 'decorated_definition') {\n for (const child of p.children) {\n if (child.type === 'decorator') decs.push(child.text);\n }\n }\n return decs;\n }\n\n if (lang === Language.Rust) {\n // #[...] attribute_item nodes precede the function_item / struct_item etc.\n let prev: TSNode | null = defNode.previousSibling ?? prevSibling(defNode);\n while (prev && prev.type === 'attribute_item') {\n decs.unshift(prev.text);\n prev = prev.previousSibling ?? prevSibling(prev);\n }\n return decs;\n }\n\n return decs;\n}\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction prevSibling(node: TSNode): TSNode | null {\n const parent = node.parent;\n if (!parent) return null;\n const children = parent.children;\n const idx = children.indexOf(node);\n if (idx <= 0) return null;\n return children[idx - 1] ?? null;\n}\n\nfunction findFirstChildByType(node: TSNode, type: string): TSNode | null {\n for (const child of node.children) {\n if (child.type === type) return child;\n const found = findFirstChildByType(child, type);\n if (found) return found;\n }\n return null;\n}\n\nfunction truncate(s: string | undefined, max: number): string | undefined {\n if (!s) return undefined;\n return s.length <= max ? s : s.slice(0, max) + '…';\n}\n\n// ─── Tree-sitter parse phase ──────────────────────────────────────────────────\n\nexport const parsePhase: Phase = {\n name: 'parse',\n dependencies: ['structure'],\n async execute(context: PipelineContext): Promise<PhaseResult> {\n const start = Date.now();\n let symbolCount = 0;\n let treeSitterCount = 0;\n let regexCount = 0;\n\n // Initialise shared caches that resolve phase will reuse\n if (!context.fileCache) context.fileCache = new Map();\n if (!context.fileFunctionIndex) context.fileFunctionIndex = new Map();\n\n const CONCURRENCY = 64;\n const filePaths = context.filePaths;\n\n // ── Read all files ────────────────────────────────────────────────────────\n let readDone = 0;\n for (let i = 0; i < filePaths.length; i += CONCURRENCY) {\n const batch = filePaths.slice(i, i + CONCURRENCY);\n await Promise.all(batch.map(async (filePath) => {\n try {\n const source = await fs.promises.readFile(filePath, 'utf-8');\n context.fileCache!.set(filePath, source);\n } catch {\n // Unreadable file — skip silently\n }\n }));\n readDone += batch.length;\n context.onPhaseProgress?.('parse:read', readDone, filePaths.length);\n }\n\n // ── Parse each file ───────────────────────────────────────────────────────\n let parseDone = 0;\n for (const filePath of filePaths) {\n const lang = detectLanguage(filePath);\n if (!lang) {\n if (context.verbose) {\n const relativePath = path.relative(context.workspaceRoot, filePath);\n Logger.info(` [parse] skipped (no parser): ${relativePath}`);\n }\n continue;\n }\n\n const source = context.fileCache.get(filePath);\n if (!source) continue;\n\n const relativePath = path.relative(context.workspaceRoot, filePath);\n const fileNodeId = generateNodeId('file', relativePath, relativePath);\n\n // Store a snippet on the file node for full-text search\n const fileNode = context.graph.getNode(fileNodeId);\n if (fileNode) {\n fileNode.content = source.slice(0, 2000);\n }\n\n // ── Try tree-sitter first ──────────────────────────────────────────────\n let usedTreeSitter = false;\n const queryStr = LANG_QUERIES[lang];\n\n if (queryStr) {\n try {\n const { nodes, edges } = await extractFromTreeAsync(\n lang,\n source,\n relativePath,\n fileNodeId,\n queryStr,\n );\n\n if (nodes.length > 0 || edges.length > 0) {\n for (const n of nodes) context.graph.addNode(n);\n for (const e of edges) context.graph.addEdge(e);\n symbolCount += nodes.length;\n treeSitterCount++;\n usedTreeSitter = true;\n\n // Build per-file sorted function/method index\n const funcs = nodes\n .filter((n) => n.kind === 'function' || n.kind === 'method')\n .map((n) => ({ id: n.id, startLine: n.startLine ?? 0, endLine: n.endLine }))\n .sort((a, b) => a.startLine - b.startLine);\n if (funcs.length > 0) {\n context.fileFunctionIndex!.set(relativePath, funcs);\n }\n }\n } catch (err) {\n Logger.warn(` [parse] tree-sitter failed for ${relativePath}: ${err instanceof Error ? err.message : String(err)} — falling back to regex`);\n }\n }\n\n // ── Fallback to regex if tree-sitter didn't run ───────────────────────\n if (!usedTreeSitter) {\n regexCount++;\n const { nodes, edges } = extractWithRegex(source, lang, relativePath, fileNodeId);\n for (const n of nodes) context.graph.addNode(n);\n for (const e of edges) context.graph.addEdge(e);\n symbolCount += nodes.length;\n\n const funcs = nodes\n .filter((n) => n.kind === 'function' || n.kind === 'method')\n .map((n) => ({ id: n.id, startLine: n.startLine ?? 0, endLine: n.endLine }))\n .sort((a, b) => a.startLine - b.startLine);\n if (funcs.length > 0) {\n context.fileFunctionIndex!.set(relativePath, funcs);\n }\n }\n\n parseDone++;\n context.onPhaseProgress?.('parse', parseDone, filePaths.length);\n }\n\n const parserUsed: 'tree-sitter' | 'regex' = treeSitterCount === 0 ? 'regex' : 'tree-sitter';\n // Store parser info in context for CLI/HTTP to write into meta.json\n context.parserUsed = parserUsed;\n\n if (context.verbose) {\n Logger.info(` [parse] tree-sitter: ${treeSitterCount} files, regex fallback: ${regexCount} files`);\n }\n\n return {\n status: 'completed',\n duration: Date.now() - start,\n message: `Extracted ${symbolCount} symbols from ${filePaths.length} files (${parserUsed})`,\n };\n },\n};\n\n// ─── Tree-sitter extraction ───────────────────────────────────────────────────\n\nasync function extractFromTreeAsync(\n lang: Language,\n source: string,\n relativePath: string,\n fileNodeId: string,\n queryStr: string,\n): Promise<{ nodes: CodeNode[]; edges: CodeEdge[] }> {\n const tsLang = await getLanguage(lang);\n if (!tsLang) return { nodes: [], edges: [] };\n\n const tree = await parseSource(lang, source);\n if (!tree) return { nodes: [], edges: [] };\n\n return extractFromTree(tree.rootNode as unknown as TSNode, tsLang, source, lang, relativePath, fileNodeId, queryStr);\n}\n\nfunction extractFromTree(\n root: TSNode,\n tsLanguage: TSLanguage,\n source: string,\n lang: Language,\n relativePath: string,\n fileNodeId: string,\n queryStr: string,\n): { nodes: CodeNode[]; edges: CodeEdge[] } {\n const nodes: CodeNode[] = [];\n const edges: CodeEdge[] = [];\n const seen = new Set<string>();\n\n // Hoist line-split so we don't re-split source on every match iteration.\n const sourceLines = source.split('\\n');\n\n // Run the query to get all pattern matches\n const matches = runQueryMatches(\n { rootNode: root } as unknown as import('web-tree-sitter').Tree,\n tsLanguage,\n queryStr,\n );\n\n for (const match of matches) {\n // Find the \"def.X\" capture (the whole definition node)\n const defCapture = match.captures.find(\n (c) => isDefCapture(c.name) && !c.name.endsWith('.name'),\n );\n // Find the \"def.X.name\" capture (just the name identifier)\n const nameCapture = match.captures.find((c) => c.name.endsWith('.name'));\n\n if (!defCapture || !nameCapture) continue;\n\n const kind = captureKind(defCapture.name);\n if (!kind) continue;\n\n const name = nameCapture.text.trim();\n if (!name) continue;\n\n const dedupeKey = `${kind}:${name}`;\n if (seen.has(dedupeKey)) continue;\n seen.add(dedupeKey);\n\n const defNode = defCapture.node;\n const startLine = defNode.startPosition.row + 1; // 1-based\n const endLine = defNode.endPosition.row + 1;\n\n // Validate\n if (startLine > endLine) {\n Logger.warn(` [parse] ${relativePath}: ${name} startLine(${startLine}) > endLine(${endLine}), skipping`);\n continue;\n }\n\n // Extract rich metadata\n const params = (kind === 'function' || kind === 'method' || kind === 'constructor')\n ? extractParams(defNode, lang)\n : undefined;\n\n const returnType = (kind === 'function' || kind === 'method')\n ? extractReturnType(defNode, lang)\n : undefined;\n\n const doc = extractDoc(defNode, source, lang);\n const decorators = extractDecorators(defNode, lang);\n\n const metadata: Record<string, unknown> = {};\n if (params && params.length > 0) metadata.parameters = params;\n if (returnType) metadata.returnType = truncate(returnType, 200);\n if (doc) metadata.doc = doc;\n if (decorators.length > 0) metadata.decorators = decorators;\n\n const nodeId = generateNodeId(kind, relativePath, name);\n nodes.push({\n id: nodeId,\n kind,\n name,\n filePath: relativePath,\n startLine,\n endLine,\n exported: isExported(defNode, lang, name),\n content: sourceLines.slice(startLine - 1, Math.min(startLine + 19, endLine)).join('\\n'),\n metadata: Object.keys(metadata).length > 0 ? metadata : undefined,\n });\n\n edges.push({\n id: generateEdgeId(fileNodeId, nodeId, 'contains'),\n source: fileNodeId,\n target: nodeId,\n kind: 'contains',\n weight: 1.0,\n });\n }\n\n return { nodes, edges };\n}\n\n// ─── Regex fallback (original logic, preserved for unsupported languages) ─────\n\nfunction extractWithRegex(\n source: string,\n lang: Language,\n relativePath: string,\n fileNodeId: string,\n): { nodes: CodeNode[]; edges: CodeEdge[] } {\n const nodes: CodeNode[] = [];\n const edges: CodeEdge[] = [];\n const seen = new Set<string>();\n const lines = source.split('\\n');\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const trimmed = line.trim();\n\n if (\n trimmed.startsWith('//') ||\n trimmed.startsWith('#') ||\n trimmed.startsWith('*') ||\n trimmed.startsWith('/*')\n ) continue;\n\n const extracted = extractSymbolRegex(trimmed, lang, i + 1, relativePath);\n if (!extracted) continue;\n\n const dedupeKey = extracted.name + ':' + extracted.kind;\n if (seen.has(dedupeKey)) continue;\n seen.add(dedupeKey);\n\n const nodeId = generateNodeId(extracted.kind, relativePath, extracted.name);\n const endLine = estimateEndLine(lines, i, lang);\n\n nodes.push({\n id: nodeId,\n kind: extracted.kind,\n name: extracted.name,\n filePath: relativePath,\n startLine: i + 1,\n endLine,\n exported: extracted.exported,\n content: extractBlock(lines, i, 20),\n });\n edges.push({\n id: generateEdgeId(fileNodeId, nodeId, 'contains'),\n source: fileNodeId,\n target: nodeId,\n kind: 'contains',\n weight: 1.0,\n });\n\n if (extracted.ownerName) {\n const ownerId = generateNodeId('class', relativePath, extracted.ownerName);\n if (nodes.some((n) => n.id === ownerId)) {\n edges.push({\n id: generateEdgeId(ownerId, nodeId, 'has_member'),\n source: ownerId,\n target: nodeId,\n kind: 'has_member',\n weight: 1.0,\n });\n }\n }\n }\n\n return { nodes, edges };\n}\n\n// ─── Original regex symbol extraction (kept as fallback) ─────────────────────\n\ninterface ExtractedSymbol {\n kind: CodeNode['kind'];\n name: string;\n exported: boolean;\n ownerName?: string;\n}\n\nfunction extractSymbolRegex(\n line: string,\n lang: Language,\n _lineNum: number,\n _filePath: string,\n): ExtractedSymbol | null {\n if (lang === Language.TypeScript || lang === Language.JavaScript) {\n const func = line.match(/^(?:export\\s+)?(?:default\\s+)?(?:async\\s+)?function\\s+(\\w+)/);\n if (func) return { kind: 'function', name: func[1], exported: line.includes('export') };\n\n const arrowFunc = line.match(/^(?:export\\s+)?(?:const|let|var)\\s+(\\w+)\\s*=\\s*(?:async\\s+)?\\(/);\n if (arrowFunc) return { kind: 'function', name: arrowFunc[1], exported: line.includes('export') };\n\n const arrowFunc2 = line.match(/^(?:export\\s+)?(?:const|let|var)\\s+(\\w+)\\s*=\\s*(?:async\\s+)?(?:\\([^)]*\\)|[a-zA-Z_]\\w*)\\s*=>/);\n if (arrowFunc2) return { kind: 'function', name: arrowFunc2[1], exported: line.includes('export') };\n\n const cls = line.match(/^(?:export\\s+)?(?:default\\s+)?(?:abstract\\s+)?class\\s+(\\w+)/);\n if (cls) return { kind: 'class', name: cls[1], exported: line.includes('export') };\n\n const iface = line.match(/^(?:export\\s+)?interface\\s+(\\w+)/);\n if (iface) return { kind: 'interface', name: iface[1], exported: line.includes('export') };\n\n const enumM = line.match(/^(?:export\\s+)?enum\\s+(\\w+)/);\n if (enumM) return { kind: 'enum', name: enumM[1], exported: line.includes('export') };\n\n const typeAlias = line.match(/^(?:export\\s+)?type\\s+(\\w+)\\s*[=<]/);\n if (typeAlias) return { kind: 'type_alias', name: typeAlias[1], exported: line.includes('export') };\n\n const constVar = line.match(/^(?:export\\s+)?const\\s+(\\w+)\\s*(?::\\s*\\w[^=]*)?\\s*=/);\n if (constVar && /^[A-Z_]+$/.test(constVar[1])) {\n return { kind: 'constant', name: constVar[1], exported: line.includes('export') };\n }\n }\n\n if (lang === Language.Python) {\n const func = line.match(/^(?:async\\s+)?def\\s+(\\w+)/);\n if (func) return { kind: func[1].startsWith('__') ? 'method' : 'function', name: func[1], exported: !func[1].startsWith('_') };\n const cls = line.match(/^class\\s+(\\w+)/);\n if (cls) return { kind: 'class', name: cls[1], exported: !cls[1].startsWith('_') };\n }\n\n if (lang === Language.Java) {\n const cls = line.match(/(?:public|private|protected)?\\s*(?:static\\s+)?(?:abstract\\s+)?(?:final\\s+)?class\\s+(\\w+)/);\n if (cls) return { kind: 'class', name: cls[1], exported: line.includes('public') };\n const iface = line.match(/(?:public\\s+)?interface\\s+(\\w+)/);\n if (iface) return { kind: 'interface', name: iface[1], exported: line.includes('public') };\n const enumM = line.match(/(?:public\\s+)?enum\\s+(\\w+)/);\n if (enumM) return { kind: 'enum', name: enumM[1], exported: line.includes('public') };\n const method = line.match(/(?:public|private|protected)\\s+(?:static\\s+)?(?:[\\w<>\\[\\]]+)\\s+(\\w+)\\s*\\(/);\n if (method) return { kind: 'method', name: method[1], exported: line.includes('public') };\n }\n\n if (lang === Language.Go) {\n const func = line.match(/^func\\s+(\\w+)\\s*\\(/);\n if (func) return { kind: 'function', name: func[1], exported: func[1][0] === func[1][0].toUpperCase() };\n const method = line.match(/^func\\s+\\([^)]+\\)\\s+(\\w+)\\s*\\(/);\n if (method) return { kind: 'method', name: method[1], exported: method[1][0] === method[1][0].toUpperCase() };\n const structM = line.match(/^type\\s+(\\w+)\\s+struct\\b/);\n if (structM) return { kind: 'struct', name: structM[1], exported: structM[1][0] === structM[1][0].toUpperCase() };\n const ifaceM = line.match(/^type\\s+(\\w+)\\s+interface\\b/);\n if (ifaceM) return { kind: 'interface', name: ifaceM[1], exported: ifaceM[1][0] === ifaceM[1][0].toUpperCase() };\n }\n\n if (lang === Language.Rust) {\n const func = line.match(/^(?:pub\\s+)?(?:async\\s+)?fn\\s+(\\w+)/);\n if (func) return { kind: 'function', name: func[1], exported: line.startsWith('pub') };\n const structM = line.match(/^(?:pub\\s+)?struct\\s+(\\w+)/);\n if (structM) return { kind: 'struct', name: structM[1], exported: line.startsWith('pub') };\n const enumM = line.match(/^(?:pub\\s+)?enum\\s+(\\w+)/);\n if (enumM) return { kind: 'enum', name: enumM[1], exported: line.startsWith('pub') };\n const traitM = line.match(/^(?:pub\\s+)?trait\\s+(\\w+)/);\n if (traitM) return { kind: 'trait', name: traitM[1], exported: line.startsWith('pub') };\n const implM = line.match(/^impl(?:<[^>]*>)?\\s+(\\w+)/);\n if (implM) return { kind: 'class', name: implM[1], exported: false };\n }\n\n if (lang === Language.C || lang === Language.Cpp) {\n const cls = line.match(/^(?:class|struct)\\s+(\\w+)/);\n if (cls) return { kind: lang === Language.Cpp ? 'class' : 'struct', name: cls[1], exported: true };\n const nsM = line.match(/^namespace\\s+(\\w+)/);\n if (nsM) return { kind: 'namespace', name: nsM[1], exported: true };\n const func = line.match(/^(?:[\\w:*&<>\\[\\]]+\\s+)+(\\w+)\\s*\\([^;]*$/);\n if (func && !['if', 'for', 'while', 'switch', 'return'].includes(func[1])) {\n return { kind: 'function', name: func[1], exported: true };\n }\n }\n\n if (lang === Language.CSharp) {\n const cls = line.match(/(?:public|internal|private)?\\s*(?:static\\s+)?(?:abstract\\s+)?(?:partial\\s+)?class\\s+(\\w+)/);\n if (cls) return { kind: 'class', name: cls[1], exported: line.includes('public') };\n const iface = line.match(/(?:public\\s+)?interface\\s+(\\w+)/);\n if (iface) return { kind: 'interface', name: iface[1], exported: line.includes('public') };\n const structM = line.match(/(?:public\\s+)?struct\\s+(\\w+)/);\n if (structM) return { kind: 'struct', name: structM[1], exported: line.includes('public') };\n const method = line.match(/(?:public|private|protected|internal)\\s+(?:static\\s+)?(?:async\\s+)?(?:[\\w<>\\[\\]?]+)\\s+(\\w+)\\s*\\(/);\n if (method) return { kind: 'method', name: method[1], exported: line.includes('public') };\n const nsM = line.match(/namespace\\s+([\\w.]+)/);\n if (nsM) return { kind: 'namespace', name: nsM[1], exported: true };\n }\n\n if (lang === Language.PHP) {\n const cls = line.match(/(?:abstract\\s+)?class\\s+(\\w+)/);\n if (cls) return { kind: 'class', name: cls[1], exported: true };\n const func = line.match(/(?:public|private|protected|static\\s+)*function\\s+(\\w+)/);\n if (func) return { kind: 'function', name: func[1], exported: line.includes('public') || !line.includes('private') };\n const iface = line.match(/interface\\s+(\\w+)/);\n if (iface) return { kind: 'interface', name: iface[1], exported: true };\n const traitM = line.match(/trait\\s+(\\w+)/);\n if (traitM) return { kind: 'trait', name: traitM[1], exported: true };\n }\n\n if (lang === Language.Kotlin) {\n const cls = line.match(/(?:data\\s+|sealed\\s+|abstract\\s+|open\\s+)?class\\s+(\\w+)/);\n if (cls) return { kind: 'class', name: cls[1], exported: !line.includes('private') };\n const iface = line.match(/interface\\s+(\\w+)/);\n if (iface) return { kind: 'interface', name: iface[1], exported: !line.includes('private') };\n const func = line.match(/(?:suspend\\s+)?fun\\s+(\\w+)/);\n if (func) return { kind: 'function', name: func[1], exported: !line.includes('private') };\n const obj = line.match(/object\\s+(\\w+)/);\n if (obj) return { kind: 'class', name: obj[1], exported: !line.includes('private') };\n }\n\n if (lang === Language.Ruby) {\n const cls = line.match(/^class\\s+(\\w+)/);\n if (cls) return { kind: 'class', name: cls[1], exported: true };\n const modM = line.match(/^module\\s+(\\w+)/);\n if (modM) return { kind: 'module', name: modM[1], exported: true };\n const method = line.match(/^(?:def\\s+(?:self\\.)?(\\w+))/);\n if (method) return { kind: 'method', name: method[1], exported: true };\n }\n\n if (lang === Language.Swift) {\n const cls = line.match(/(?:public\\s+|open\\s+)?(?:final\\s+)?class\\s+(\\w+)/);\n if (cls) return { kind: 'class', name: cls[1], exported: !line.includes('private') };\n const structM = line.match(/(?:public\\s+)?struct\\s+(\\w+)/);\n if (structM) return { kind: 'struct', name: structM[1], exported: !line.includes('private') };\n const proto = line.match(/(?:public\\s+)?protocol\\s+(\\w+)/);\n if (proto) return { kind: 'interface', name: proto[1], exported: !line.includes('private') };\n const enumM = line.match(/(?:public\\s+)?enum\\s+(\\w+)/);\n if (enumM) return { kind: 'enum', name: enumM[1], exported: !line.includes('private') };\n const func = line.match(/(?:public\\s+|private\\s+|internal\\s+)?(?:static\\s+)?func\\s+(\\w+)/);\n if (func) return { kind: 'function', name: func[1], exported: !line.includes('private') };\n }\n\n if (lang === Language.Dart) {\n const cls = line.match(/(?:abstract\\s+)?class\\s+(\\w+)/);\n if (cls) return { kind: 'class', name: cls[1], exported: !cls[1].startsWith('_') };\n const func = line.match(/^(?:\\w+\\s+)?(\\w+)\\s*\\(/);\n if (func && !['if', 'for', 'while', 'switch', 'catch', 'return'].includes(func[1])) {\n return { kind: 'function', name: func[1], exported: !func[1].startsWith('_') };\n }\n }\n\n return null;\n}\n\nfunction estimateEndLine(lines: string[], startIdx: number, lang: Language): number | undefined {\n const MAX_SCAN = 200;\n const end = Math.min(startIdx + MAX_SCAN, lines.length);\n\n if (lang !== Language.Python && lang !== Language.Ruby) {\n let depth = 0;\n let foundOpen = false;\n for (let i = startIdx; i < end; i++) {\n for (const ch of lines[i]) {\n if (ch === '{') { depth++; foundOpen = true; }\n else if (ch === '}') {\n depth--;\n if (foundOpen && depth === 0) return i + 1;\n }\n }\n }\n return undefined;\n }\n\n const startIndent = (lines[startIdx].match(/^(\\s*)/) ?? ['', ''])[1].length;\n for (let i = startIdx + 1; i < end; i++) {\n const l = lines[i];\n if (l.trim() === '') continue;\n const indent = (l.match(/^(\\s*)/) ?? ['', ''])[1].length;\n if (indent <= startIndent && l.trim() !== '') return i;\n }\n return undefined;\n}\n\nfunction extractBlock(lines: string[], startIdx: number, maxLines: number): string {\n const end = Math.min(startIdx + maxLines, lines.length);\n return lines.slice(startIdx, end).join('\\n');\n}\n","import path from 'node:path';\nimport { detectLanguage } from '../../shared/index.js';\nimport type { Phase, PhaseResult, PipelineContext } from '../types.js';\nimport { generateNodeId, generateEdgeId } from '../../graph/id-generator.js';\n\ninterface ParsedImport {\n rawPath: string;\n localNames: string[];\n isDefault: boolean;\n line: number;\n}\n\ninterface ParsedCall {\n name: string;\n receiverText?: string;\n isNew: boolean;\n line: number;\n}\n\ninterface ParsedHeritage {\n className: string;\n extendsNames: string[];\n implementsNames: string[];\n}\n\n// ─── Keywords to skip when extracting calls ───────────────────────────────────\nconst CALL_KEYWORDS = new Set([\n 'if', 'for', 'while', 'switch', 'catch', 'return', 'throw',\n 'typeof', 'instanceof', 'delete', 'void', 'new', 'import', 'export',\n 'from', 'const', 'let', 'var', 'function', 'class', 'interface',\n 'type', 'enum', 'extends', 'implements',\n]);\n\nexport const resolvePhase: Phase = {\n name: 'resolve',\n dependencies: ['parse'],\n async execute(context: PipelineContext): Promise<PhaseResult> {\n const start = Date.now();\n const { graph, workspaceRoot, filePaths } = context;\n\n // Reuse content cache populated by parse phase — eliminates all double I/O\n const fileCache = context.fileCache ?? new Map<string, string>();\n // Fast sorted function index built by parse phase — O(log n) enclosing-function lookup\n const fileFunctionIndex = context.fileFunctionIndex ?? new Map<\n string,\n { id: string; startLine: number; endLine: number | undefined }[]\n >();\n\n let importEdges = 0;\n let callEdges = 0;\n let heritageEdges = 0;\n\n // ── Build file index for import resolution ────────────────────────────────\n const fileIndex = new Map<string, string>();\n for (const fp of filePaths) {\n const rel = path.relative(workspaceRoot, fp);\n fileIndex.set(rel, fp);\n const noExt = rel.replace(/\\.\\w+$/, '');\n if (!fileIndex.has(noExt)) fileIndex.set(noExt, fp);\n const base = path.basename(rel, path.extname(rel));\n if (!fileIndex.has(base)) fileIndex.set(base, fp);\n }\n\n // ── Build symbol index: name → nodeId ─────────────────────────────────────\n const symbolIndex = new Map<string, string>();\n const fileSymbolIndex = new Map<string, Map<string, string>>();\n for (const node of graph.allNodes()) {\n if ([\n 'function', 'class', 'interface', 'method', 'enum',\n 'type_alias', 'variable', 'constant', 'struct', 'trait',\n ].includes(node.kind)) {\n symbolIndex.set(node.name, node.id);\n let fileMap = fileSymbolIndex.get(node.filePath);\n if (!fileMap) { fileMap = new Map(); fileSymbolIndex.set(node.filePath, fileMap); }\n fileMap.set(node.name, node.id);\n }\n }\n\n // ── Process each file ─────────────────────────────────────────────────────\n let fileDone = 0;\n for (const filePath of filePaths) {\n const lang = detectLanguage(filePath);\n if (!lang) continue;\n\n const relativePath = path.relative(workspaceRoot, filePath);\n const fileNodeId = generateNodeId('file', relativePath, relativePath);\n\n // Use cached content — zero additional disk I/O\n const source = fileCache.get(filePath);\n if (!source) continue;\n\n const lines = source.split('\\n');\n const imports = extractImports(lines, lang === 'python');\n const calls = extractCalls(lines);\n const heritages = extractHeritage(lines);\n\n // ── Imports → IMPORTS edges ───────────────────────────────────────────\n for (const imp of imports) {\n const cleaned = imp.rawPath.replace(/['\"]/g, '');\n let resolvedRelPath: string | null = null;\n\n if (cleaned.startsWith('.')) {\n // Relative import — strip .js/.jsx since TS imports use .js but files are .ts\n const cleanedNoJs = cleaned.replace(/\\.(js|jsx)$/, '');\n const fromDir = path.dirname(relativePath);\n for (const ext of ['', '.ts', '.tsx', '.js', '.jsx', '.py', '.java', '.go', '/index.ts', '/index.js']) {\n const candidate = path.join(fromDir, cleanedNoJs + ext);\n const normalized = path.normalize(candidate);\n if (fileIndex.has(normalized)) {\n const absPath = fileIndex.get(normalized)!;\n resolvedRelPath = path.relative(workspaceRoot, absPath);\n break;\n }\n }\n } else {\n // Package import — try to find in file index\n for (const ext of ['', '.ts', '.js', '.py', '.java', '.go']) {\n if (fileIndex.has(cleaned + ext)) { resolvedRelPath = cleaned + ext; break; }\n }\n if (!resolvedRelPath) {\n const asPath = cleaned.replace(/\\./g, '/');\n for (const ext of ['', '.ts', '.js', '.py', '.java', '.go', '/index.ts', '/__init__.py']) {\n if (fileIndex.has(asPath + ext)) { resolvedRelPath = asPath + ext; break; }\n }\n }\n }\n\n if (resolvedRelPath) {\n const targetFileId = generateNodeId('file', resolvedRelPath, resolvedRelPath);\n if (graph.getNode(targetFileId)) {\n const edgeId = generateEdgeId(fileNodeId, targetFileId, 'imports');\n if (!graph.getEdge(edgeId)) {\n graph.addEdge({\n id: edgeId,\n source: fileNodeId,\n target: targetFileId,\n kind: 'imports',\n weight: 0.95,\n label: cleaned,\n });\n importEdges++;\n }\n }\n }\n }\n\n // ── Calls → CALLS edges ───────────────────────────────────────────────\n const localSymbols = fileSymbolIndex.get(relativePath);\n const funcList = fileFunctionIndex.get(relativePath); // sorted by startLine\n\n for (const call of calls) {\n // Tier 1: same-file symbol (high confidence)\n let targetId = localSymbols?.get(call.name);\n let confidence = 0.95;\n\n if (!targetId) {\n // Tier 2: global symbol (lower confidence)\n targetId = symbolIndex.get(call.name);\n confidence = 0.5;\n }\n\n if (targetId) {\n // Use fast sorted-list lookup instead of iterating all graph nodes\n const callerNodeId = funcList\n ? findEnclosingFunctionFast(funcList, call.line)\n : null;\n const sourceId = callerNodeId ?? fileNodeId;\n\n if (sourceId !== targetId) {\n const edgeId = generateEdgeId(sourceId, targetId, 'calls');\n if (!graph.getEdge(edgeId)) {\n graph.addEdge({\n id: edgeId,\n source: sourceId,\n target: targetId,\n kind: 'calls',\n weight: confidence,\n label: call.name,\n });\n callEdges++;\n }\n }\n }\n }\n\n // ── Heritage → EXTENDS/IMPLEMENTS edges ──────────────────────────────\n for (const h of heritages) {\n const classNodeId = localSymbols?.get(h.className) ?? symbolIndex.get(h.className);\n if (!classNodeId) continue;\n\n for (const ext of h.extendsNames) {\n const targetId = symbolIndex.get(ext);\n if (targetId) {\n const edgeId = generateEdgeId(classNodeId, targetId, 'extends');\n if (!graph.getEdge(edgeId)) {\n graph.addEdge({\n id: edgeId, source: classNodeId, target: targetId,\n kind: 'extends', weight: 1.0, label: `extends ${ext}`,\n });\n heritageEdges++;\n }\n }\n }\n\n for (const impl of h.implementsNames) {\n const targetId = symbolIndex.get(impl);\n if (targetId) {\n const edgeId = generateEdgeId(classNodeId, targetId, 'implements');\n if (!graph.getEdge(edgeId)) {\n graph.addEdge({\n id: edgeId, source: classNodeId, target: targetId,\n kind: 'implements', weight: 1.0, label: `implements ${impl}`,\n });\n heritageEdges++;\n }\n }\n }\n }\n fileDone++;\n context.onPhaseProgress?.('resolve', fileDone, filePaths.length);\n }\n\n return {\n status: 'completed',\n duration: Date.now() - start,\n message: `Resolved ${importEdges} imports, ${callEdges} calls, ${heritageEdges} heritage edges. Graph: ${graph.size.nodes} nodes, ${graph.size.edges} edges`,\n };\n },\n};\n\n// ─── Import extraction ────────────────────────────────────────────────────────\n\nfunction extractImports(lines: string[], isPython: boolean): ParsedImport[] {\n const imports: ParsedImport[] = [];\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i].trim();\n\n // TypeScript/JavaScript: import ... from '...'\n const tsImport = line.match(/import\\s+.*?from\\s+['\"]([^'\"]+)['\"]/);\n if (tsImport) {\n const names: string[] = [];\n const namedMatch = line.match(/\\{([^}]+)\\}/);\n if (namedMatch) {\n names.push(\n ...namedMatch[1]\n .split(',')\n .map((n) => n.trim().split(/\\s+as\\s+/).pop()!.trim())\n .filter(Boolean),\n );\n }\n const defaultMatch = line.match(/import\\s+(\\w+)/);\n if (defaultMatch && defaultMatch[1] !== 'type') names.push(defaultMatch[1]);\n imports.push({ rawPath: tsImport[1], localNames: names, isDefault: !namedMatch, line: i + 1 });\n continue;\n }\n\n // Python: from X import Y / import X\n if (isPython) {\n const fromImport = line.match(/from\\s+([\\w.]+)\\s+import\\s+(.+)/);\n if (fromImport) {\n const names = fromImport[2].split(',').map((n) => n.trim().split(/\\s+as\\s+/).pop()!.trim()).filter(Boolean);\n imports.push({ rawPath: fromImport[1], localNames: names, isDefault: false, line: i + 1 });\n continue;\n }\n const directImport = line.match(/^import\\s+([\\w.]+)(?:\\s+as\\s+(\\w+))?/);\n if (directImport) {\n imports.push({\n rawPath: directImport[1],\n localNames: [directImport[2] ?? directImport[1].split('.').pop()!],\n isDefault: false,\n line: i + 1,\n });\n continue;\n }\n }\n\n // Java/Kotlin: import com.example.Foo\n const javaImport = line.match(/^import\\s+(?:static\\s+)?([\\w.]+)/);\n if (javaImport && !line.includes('from')) {\n const parts = javaImport[1].split('.');\n imports.push({ rawPath: javaImport[1], localNames: [parts[parts.length - 1]], isDefault: false, line: i + 1 });\n continue;\n }\n\n // Go: import \"path\"\n const goImport = line.match(/^\\s*\"([^\"]+)\"/);\n if (goImport && (i > 0 && lines[i - 1]?.includes('import') || line.match(/^import\\s+\"/))) {\n const parts = goImport[1].split('/');\n imports.push({ rawPath: goImport[1], localNames: [parts[parts.length - 1]], isDefault: false, line: i + 1 });\n continue;\n }\n\n // C/C++: #include\n const includeMatch = line.match(/#include\\s+[<\"]([^>\"]+)[>\"]/);\n if (includeMatch) {\n imports.push({ rawPath: includeMatch[1], localNames: [], isDefault: false, line: i + 1 });\n continue;\n }\n\n // Rust: use crate::... / use super::...\n const rustUse = line.match(/^use\\s+([\\w:]+)/);\n if (rustUse) {\n const parts = rustUse[1].split('::');\n imports.push({ rawPath: rustUse[1], localNames: [parts[parts.length - 1]], isDefault: false, line: i + 1 });\n continue;\n }\n\n // C#: using\n const usingMatch = line.match(/^using\\s+([\\w.]+)/);\n if (usingMatch) {\n const parts = usingMatch[1].split('.');\n imports.push({ rawPath: usingMatch[1], localNames: [parts[parts.length - 1]], isDefault: false, line: i + 1 });\n }\n\n // Ruby: require\n const requireMatch = line.match(/require\\s+['\"]([^'\"]+)['\"]/);\n if (requireMatch) {\n imports.push({ rawPath: requireMatch[1], localNames: [], isDefault: false, line: i + 1 });\n }\n }\n\n return imports;\n}\n\n// ─── Call extraction ──────────────────────────────────────────────────────────\n\nfunction extractCalls(lines: string[]): ParsedCall[] {\n const calls: ParsedCall[] = [];\n const callRegex = /(?:new\\s+)?(\\w+)\\s*\\(/g;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n // Skip declaration lines\n if (/^\\s*(export\\s+)?(async\\s+)?function\\s/.test(line)) continue;\n if (/^\\s*(export\\s+)?(abstract\\s+)?class\\s/.test(line)) continue;\n if (/^\\s*(export\\s+)?interface\\s/.test(line)) continue;\n if (/^\\s*(export\\s+)?enum\\s/.test(line)) continue;\n if (/^\\s*(export\\s+)?type\\s+\\w+\\s*=/.test(line)) continue;\n if (/^\\s*import\\s/.test(line)) continue;\n if (/^\\s*\\/\\//.test(line)) continue;\n\n let match;\n callRegex.lastIndex = 0;\n while ((match = callRegex.exec(line)) !== null) {\n const name = match[1];\n if (CALL_KEYWORDS.has(name)) continue;\n const isNew = line.substring(Math.max(0, match.index - 4), match.index).includes('new');\n calls.push({ name, isNew, line: i + 1 });\n }\n\n // Member calls: receiver.method(\n const memberCallRegex = /(\\w+)\\.(\\w+)\\s*\\(/g;\n memberCallRegex.lastIndex = 0;\n while ((match = memberCallRegex.exec(line)) !== null) {\n calls.push({ name: match[2], receiverText: match[1], isNew: false, line: i + 1 });\n }\n }\n\n return calls;\n}\n\n// ─── Heritage extraction ──────────────────────────────────────────────────────\n\nfunction extractHeritage(lines: string[]): ParsedHeritage[] {\n const heritages: ParsedHeritage[] = [];\n\n for (const line of lines) {\n const classMatch = line.match(/class\\s+(\\w+)(?:\\s+extends\\s+(\\w+))?(?:\\s+implements\\s+([\\w,\\s]+))?/);\n if (classMatch) {\n const extendsNames = classMatch[2] ? [classMatch[2]] : [];\n const implementsNames = classMatch[3] ? classMatch[3].split(',').map((n) => n.trim()).filter(Boolean) : [];\n heritages.push({ className: classMatch[1], extendsNames, implementsNames });\n continue;\n }\n // Python: class Foo(Bar, Baz):\n const pyClassMatch = line.match(/class\\s+(\\w+)\\(([^)]+)\\)/);\n if (pyClassMatch) {\n const bases = pyClassMatch[2].split(',').map((n) => n.trim()).filter(Boolean);\n heritages.push({ className: pyClassMatch[1], extendsNames: bases, implementsNames: [] });\n }\n }\n\n return heritages;\n}\n\n// ─── Enclosing function lookup (O(log n) binary search on sorted list) ────────\n\nfunction findEnclosingFunctionFast(\n funcs: { id: string; startLine: number; endLine: number | undefined }[],\n line: number,\n): string | null {\n // Binary search for the last function whose startLine <= line\n let lo = 0;\n let hi = funcs.length - 1;\n let best: string | null = null;\n\n while (lo <= hi) {\n const mid = (lo + hi) >> 1;\n const fn = funcs[mid];\n if (fn.startLine <= line) {\n // Candidate — check endLine if available\n if (fn.endLine === undefined || line <= fn.endLine) {\n best = fn.id;\n }\n lo = mid + 1;\n } else {\n hi = mid - 1;\n }\n }\n\n return best;\n}\n","/**\n * OpenAI provider — uses the `openai` npm package (optional peer dep).\n * Model defaults to gpt-4o-mini; configurable via LLMConfig.model.\n * API key read from $OPENAI_API_KEY.\n */\nimport type { LLMProvider } from '../provider.js';\n\nexport class OpenAIProvider implements LLMProvider {\n readonly modelName: string;\n\n constructor(model?: string) {\n this.modelName = model ?? 'gpt-4o-mini';\n }\n\n async summarize(prompt: string): Promise<string> {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore — openai is an optional peer dependency; not in devDeps\n const { default: OpenAI } = await import('openai');\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const client = new OpenAI({ apiKey: process.env['OPENAI_API_KEY'] }) as any;\n const res = await client.chat.completions.create({\n model: this.modelName,\n messages: [{ role: 'user', content: prompt }],\n max_tokens: 200,\n });\n return res.choices?.[0]?.message?.content?.trim() ?? '';\n }\n}\n","/**\n * Anthropic provider — uses the `@anthropic-ai/sdk` package (optional peer dep).\n * Model defaults to claude-haiku-4-5; configurable via LLMConfig.model.\n * API key read from $ANTHROPIC_API_KEY.\n */\nimport type { LLMProvider } from '../provider.js';\n\nexport class AnthropicProvider implements LLMProvider {\n readonly modelName: string;\n\n constructor(model?: string) {\n this.modelName = model ?? 'claude-haiku-4-5';\n }\n\n async summarize(prompt: string): Promise<string> {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore — @anthropic-ai/sdk is an optional peer dependency; not in devDeps\n const Anthropic = (await import('@anthropic-ai/sdk')).default;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const client = new Anthropic({ apiKey: process.env['ANTHROPIC_API_KEY'] }) as any;\n const res = await client.messages.create({\n model: this.modelName,\n max_tokens: 200,\n messages: [{ role: 'user', content: prompt }],\n });\n const block = res.content?.[0];\n return block && block.type === 'text' ? block.text.trim() : '';\n }\n}\n","/**\n * Ollama provider — calls the local HTTP API at http://localhost:11434.\n * Model defaults to 'llama3'; configurable via LLMConfig.model.\n * No external package needed — uses native fetch.\n */\nimport type { LLMProvider } from '../provider.js';\n\nexport class OllamaProvider implements LLMProvider {\n readonly modelName: string;\n private readonly baseUrl: string;\n\n constructor(model?: string, baseUrl?: string) {\n this.modelName = model ?? 'llama3';\n this.baseUrl = baseUrl ?? 'http://localhost:11434';\n }\n\n async summarize(prompt: string): Promise<string> {\n const url = `${this.baseUrl}/api/generate`;\n const res = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n model: this.modelName,\n prompt,\n stream: false,\n options: { num_predict: 200 },\n }),\n });\n\n if (!res.ok) {\n throw new Error(`Ollama request failed: ${res.status} ${res.statusText}`);\n }\n\n const json = await res.json() as { response?: string };\n return (json.response ?? '').trim();\n }\n}\n","/**\n * Factory: create an LLMProvider from LLMConfig.\n * Uses dynamic imports so provider packages are only loaded when needed.\n */\nimport type { LLMConfig, LLMProvider } from './provider.js';\n\nexport async function createLLMProvider(config: LLMConfig = {}): Promise<LLMProvider> {\n const { provider = 'ollama', model } = config;\n\n switch (provider) {\n case 'openai': {\n const { OpenAIProvider } = await import('./providers/openai.js');\n return new OpenAIProvider(model);\n }\n case 'anthropic': {\n const { AnthropicProvider } = await import('./providers/anthropic.js');\n return new AnthropicProvider(model);\n }\n case 'ollama':\n default: {\n const { OllamaProvider } = await import('./providers/ollama.js');\n return new OllamaProvider(model);\n }\n }\n}\n","import type { KnowledgeGraph } from '../graph/knowledge-graph.js';\n\nexport interface EmbeddedNode {\n id: string;\n name: string;\n kind: string;\n filePath: string;\n text: string;\n embedding: number[];\n}\n\nconst EMBED_DIM = 384; // all-MiniLM-L6-v2 output dimension\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet pipelineInstance: ((text: string | string[], opts: Record<string, unknown>) => Promise<{ data: Float32Array }>) | null = null;\n\nexport async function getEmbedder() {\n if (!pipelineInstance) {\n const { pipeline } = await import('@huggingface/transformers');\n // dtype:'q8' loads the int8-quantized ONNX weights — ~2-4× faster on CPU,\n // negligible quality difference for code-symbol embeddings.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n pipelineInstance = (await pipeline('feature-extraction', 'Xenova/all-MiniLM-L6-v2', { dtype: 'q8' } as any)) as unknown as typeof pipelineInstance;\n }\n return pipelineInstance!;\n}\n\nexport async function embedNodes(\n graph: KnowledgeGraph,\n opts: { batchSize?: number; onProgress?: (done: number, total: number) => void } = {},\n): Promise<EmbeddedNode[]> {\n // Larger batch = fewer forward passes = faster overall\n const { batchSize = 64, onProgress } = opts;\n\n // Collect candidates — skip cluster/directory/flow to save time\n const candidates: { id: string; name: string; kind: string; filePath: string; text: string; embeddingSource: 'summary' | 'code' }[] = [];\n for (const node of graph.allNodes()) {\n if (['cluster', 'directory', 'flow'].includes(node.kind)) continue;\n const { text, embeddingSource } = buildText(node);\n candidates.push({ id: node.id, name: node.name, kind: node.kind, filePath: node.filePath, text, embeddingSource });\n }\n\n const embedder = await getEmbedder();\n const results: EmbeddedNode[] = [];\n\n for (let i = 0; i < candidates.length; i += batchSize) {\n const batch = candidates.slice(i, i + batchSize);\n const texts = batch.map((c) => c.text);\n\n // ── True batch inference ──────────────────────────────────────────────────\n // Pass the entire texts array in one forward pass instead of N sequential\n // calls. The pipeline returns a flat Float32Array of shape [B * EMBED_DIM].\n const out = await embedder(texts, { pooling: 'mean', normalize: true });\n\n for (let j = 0; j < batch.length; j++) {\n const start = j * EMBED_DIM;\n // subarray() gives a view (no copy) into the underlying buffer\n const embedding = Array.from(out.data.subarray(start, start + EMBED_DIM));\n const candidate = batch[j];\n\n // Mark the node with embeddingSource so callers know which path was used\n const graphNode = graph.getNode(candidate.id);\n if (graphNode) {\n if (!graphNode.metadata) (graphNode as { metadata: Record<string, unknown> }).metadata = {};\n graphNode.metadata!['embeddingSource'] = candidate.embeddingSource;\n }\n\n results.push({ id: candidate.id, name: candidate.name, kind: candidate.kind, filePath: candidate.filePath, text: candidate.text, embedding });\n }\n\n onProgress?.(Math.min(i + batchSize, candidates.length), candidates.length);\n }\n\n return results;\n}\n\nexport function buildText(node: { name: string; kind: string; filePath: string; content?: string | null; metadata?: Record<string, unknown> | null }): { text: string; embeddingSource: 'summary' | 'code' } {\n const sig = node.metadata?.signature as string | undefined;\n const summary = node.metadata?.summary as string | undefined;\n\n if (summary) {\n // Summary-based text: \"[{kind}] {name}\\n{signature}\\n{summary}\" capped at 512\n const text = `[${node.kind}] ${node.name}\\n${sig ?? ''}\\n${summary}`.slice(0, 512);\n return { text, embeddingSource: 'summary' };\n }\n\n // Code-based fallback (original behaviour)\n const parts: string[] = [`${node.kind} ${node.name}`];\n if (sig) parts.push(sig);\n if (node.content) parts.push(node.content.slice(0, 256));\n parts.push(node.filePath);\n return { text: parts.join(' ').slice(0, 512), embeddingSource: 'code' };\n}\n","/**\n * Persistent store for repo groups.\n * Each group is saved as ~/.code-intel/groups/<name>.json\n */\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\nimport type { RepoGroup, GroupMember } from './types.js';\n\nconst GROUPS_DIR = path.join(os.homedir(), '.code-intel', 'groups');\n\nfunction groupFile(name: string): string {\n return path.join(GROUPS_DIR, `${name}.json`);\n}\n\nexport function loadGroup(name: string): RepoGroup | null {\n try {\n return JSON.parse(fs.readFileSync(groupFile(name), 'utf-8')) as RepoGroup;\n } catch {\n return null;\n }\n}\n\nexport function saveGroup(group: RepoGroup): void {\n fs.mkdirSync(GROUPS_DIR, { recursive: true });\n fs.writeFileSync(groupFile(group.name), JSON.stringify(group, null, 2) + '\\n');\n}\n\nexport function listGroups(): RepoGroup[] {\n const groups: RepoGroup[] = [];\n try {\n for (const file of fs.readdirSync(GROUPS_DIR)) {\n if (!file.endsWith('.json') || file.endsWith('.sync.json')) continue;\n try {\n const g = JSON.parse(\n fs.readFileSync(path.join(GROUPS_DIR, file), 'utf-8'),\n ) as RepoGroup;\n groups.push(g);\n } catch { /* skip malformed */ }\n }\n } catch { /* dir doesn't exist yet */ }\n return groups;\n}\n\nexport function deleteGroup(name: string): void {\n try { fs.unlinkSync(groupFile(name)); } catch { /* ignore */ }\n // also remove sync artifact\n try { fs.unlinkSync(path.join(GROUPS_DIR, `${name}.sync.json`)); } catch { /* ignore */ }\n}\n\nexport function groupExists(name: string): boolean {\n return fs.existsSync(groupFile(name));\n}\n\n/** Add or update a member (by groupPath). Returns the updated group. */\nexport function addMember(groupName: string, member: GroupMember): RepoGroup {\n const group = loadGroup(groupName);\n if (!group) throw new Error(`Group \"${groupName}\" not found.`);\n // replace if same groupPath already exists\n const idx = group.members.findIndex((m) => m.groupPath === member.groupPath);\n if (idx >= 0) {\n group.members[idx] = member;\n } else {\n group.members.push(member);\n }\n saveGroup(group);\n return group;\n}\n\n/** Remove a member by groupPath. Returns the updated group. */\nexport function removeMember(groupName: string, groupPath: string): RepoGroup {\n const group = loadGroup(groupName);\n if (!group) throw new Error(`Group \"${groupName}\" not found.`);\n const before = group.members.length;\n group.members = group.members.filter((m) => m.groupPath !== groupPath);\n if (group.members.length === before) {\n throw new Error(`No member at path \"${groupPath}\" in group \"${groupName}\".`);\n }\n saveGroup(group);\n return group;\n}\n\n// ─── Sync result persistence ──────────────────────────────────────────────────\n\nimport type { GroupSyncResult } from './types.js';\n\nexport function saveSyncResult(result: GroupSyncResult): void {\n fs.mkdirSync(GROUPS_DIR, { recursive: true });\n fs.writeFileSync(\n path.join(GROUPS_DIR, `${result.groupName}.sync.json`),\n JSON.stringify(result, null, 2) + '\\n',\n );\n}\n\nexport function loadSyncResult(groupName: string): GroupSyncResult | null {\n try {\n return JSON.parse(\n fs.readFileSync(path.join(GROUPS_DIR, `${groupName}.sync.json`), 'utf-8'),\n ) as GroupSyncResult;\n } catch {\n return null;\n }\n}\n","import type { KnowledgeGraph } from '../graph/knowledge-graph.js';\n\nexport interface DeadCodeResult {\n nodeId: string;\n name: string;\n kind: string;\n filePath: string;\n}\n\nconst DEAD_CODE_KINDS = new Set(['function', 'class', 'method', 'interface']);\nconst TEST_PATH_RE = /test|spec|__test/i;\nconst ENTRY_POINT_NAME_RE = /^(main|index|bootstrap|server|app)$/i;\n\n/**\n * Detect dead code: exported symbols with zero callers AND zero importers.\n * Excludes: entry points (score >= 5 in flow phase), test files, @deprecated symbols.\n */\nexport function detectDeadCode(graph: KnowledgeGraph): DeadCodeResult[] {\n const results: DeadCodeResult[] = [];\n\n // Build set of entry-point node IDs (nodes that have flow nodes connected via step_of)\n const entryPointIds = new Set<string>();\n for (const edge of graph.findEdgesByKind('step_of')) {\n // step_of: source=flow/step → target=function/entry\n // The entry point is the target\n const targetNode = graph.getNode(edge.target);\n if (targetNode) entryPointIds.add(edge.target);\n // Also the source if it's the first step\n const sourceNode = graph.getNode(edge.source);\n if (sourceNode) entryPointIds.add(edge.source);\n }\n\n for (const node of graph.allNodes()) {\n // Only consider exported nodes in the target kinds\n if (!node.exported) continue;\n if (!DEAD_CODE_KINDS.has(node.kind)) continue;\n\n // Exclude test files\n if (TEST_PATH_RE.test(node.filePath)) continue;\n\n // Exclude deprecated\n const meta = node.metadata as Record<string, unknown> | undefined;\n if (meta?.deprecated === true) continue;\n\n // Exclude entry points by name\n if (ENTRY_POINT_NAME_RE.test(node.name)) continue;\n\n // Exclude entry points connected via step_of edges\n if (entryPointIds.has(node.id)) continue;\n\n // Check incoming calls edges\n let hasCallers = false;\n for (const edge of graph.findEdgesTo(node.id)) {\n if (edge.kind === 'calls') { hasCallers = true; break; }\n }\n if (hasCallers) continue;\n\n // Check incoming imports edges\n let hasImporters = false;\n for (const edge of graph.findEdgesTo(node.id)) {\n if (edge.kind === 'imports') { hasImporters = true; break; }\n }\n if (hasImporters) continue;\n\n // Mark on node metadata\n const health = ((node.metadata ?? {}) as Record<string, unknown>);\n const existingHealth = (health['health'] ?? {}) as Record<string, unknown>;\n node.metadata = {\n ...health,\n health: { ...existingHealth, deadCode: true },\n };\n\n results.push({\n nodeId: node.id,\n name: node.name,\n kind: node.kind,\n filePath: node.filePath,\n });\n }\n\n return results;\n}\n","import type { KnowledgeGraph } from '../graph/knowledge-graph.js';\n\nexport interface CycleResult {\n cycleId: string;\n members: string[]; // node IDs in the cycle\n}\n\n/**\n * Detect circular dependencies using Tarjan's SCC on the imports graph.\n * SCC size > 1 = cycle.\n * Sets metadata.health.inCycle = true, metadata.health.cycleId on affected nodes.\n * Performance: O(V+E) — handles 10k nodes < 100ms.\n */\nexport function detectCircularDeps(graph: KnowledgeGraph): CycleResult[] {\n // Build adjacency list from imports edges (file → file)\n const nodeIds: string[] = [];\n const nodeIndexMap = new Map<string, number>();\n\n // Collect all file nodes first\n for (const node of graph.allNodes()) {\n if (node.kind === 'file') {\n nodeIndexMap.set(node.id, nodeIds.length);\n nodeIds.push(node.id);\n }\n }\n\n const n = nodeIds.length;\n // Build adjacency list (index-based for performance)\n const adj: number[][] = Array.from({ length: n }, () => []);\n\n for (const edge of graph.findEdgesByKind('imports')) {\n const srcIdx = nodeIndexMap.get(edge.source);\n const tgtIdx = nodeIndexMap.get(edge.target);\n if (srcIdx !== undefined && tgtIdx !== undefined && srcIdx !== tgtIdx) {\n adj[srcIdx]!.push(tgtIdx);\n }\n }\n\n // Tarjan's SCC — iterative to avoid stack overflow on large graphs\n const index: number[] = new Array(n).fill(-1);\n const lowlink: number[] = new Array(n).fill(0);\n const onStack: boolean[] = new Array(n).fill(false);\n const stack: number[] = [];\n const sccs: number[][] = [];\n let idx = 0;\n\n // Iterative Tarjan using explicit call stack\n // Each stack frame: { v, childIdx }\n type Frame = { v: number; childIdx: number };\n const callStack: Frame[] = [];\n\n for (let startV = 0; startV < n; startV++) {\n if (index[startV] !== -1) continue;\n\n // Push initial frame\n callStack.push({ v: startV, childIdx: 0 });\n index[startV] = lowlink[startV] = idx++;\n stack.push(startV);\n onStack[startV] = true;\n\n while (callStack.length > 0) {\n const frame = callStack[callStack.length - 1]!;\n const { v } = frame;\n const neighbors = adj[v]!;\n\n if (frame.childIdx < neighbors.length) {\n const w = neighbors[frame.childIdx]!;\n frame.childIdx++;\n\n if (index[w] === -1) {\n // Tree edge: recurse\n index[w] = lowlink[w] = idx++;\n stack.push(w);\n onStack[w] = true;\n callStack.push({ v: w, childIdx: 0 });\n } else if (onStack[w]) {\n // Back edge: update lowlink\n if (lowlink[w]! < lowlink[v]!) {\n lowlink[v] = lowlink[w]!;\n }\n }\n } else {\n // Done with this node: pop\n callStack.pop();\n\n if (callStack.length > 0) {\n const parentFrame = callStack[callStack.length - 1]!;\n const parent = parentFrame.v;\n // Update parent's lowlink\n if (lowlink[v]! < lowlink[parent]!) {\n lowlink[parent] = lowlink[v]!;\n }\n }\n\n // If v is root of an SCC\n if (lowlink[v] === index[v]) {\n const scc: number[] = [];\n let w: number;\n do {\n w = stack.pop()!;\n onStack[w] = false;\n scc.push(w);\n } while (w !== v);\n sccs.push(scc);\n }\n }\n }\n }\n\n // Filter SCCs with size > 1 (those are cycles)\n const results: CycleResult[] = [];\n let cycleCounter = 0;\n\n for (const scc of sccs) {\n if (scc.length <= 1) continue;\n\n const cycleId = `cycle-${cycleCounter++}`;\n const members = scc.map((i) => nodeIds[i]!);\n\n results.push({ cycleId, members });\n\n // Mark nodes in graph\n for (const nodeId of members) {\n const node = graph.getNode(nodeId);\n if (!node) continue;\n const health = (node.metadata ?? {}) as Record<string, unknown>;\n const existingHealth = (health['health'] ?? {}) as Record<string, unknown>;\n node.metadata = {\n ...health,\n health: { ...existingHealth, inCycle: true, cycleId },\n };\n }\n }\n\n return results;\n}\n","import type { KnowledgeGraph } from '../graph/knowledge-graph.js';\n\nexport interface GodNodeResult {\n nodeId: string;\n name: string;\n kind: string;\n filePath: string;\n reason: string;\n}\n\nexport interface GodNodeConfig {\n maxMethods?: number; // default: 20\n maxCallers?: number; // default: 50\n}\n\n/**\n * Detect god classes: classes with > maxMethods methods OR > maxCallers callers.\n * Sets metadata.health.isGodNode = true, metadata.health.godReason on affected nodes.\n */\nexport function detectGodNodes(graph: KnowledgeGraph, config?: GodNodeConfig): GodNodeResult[] {\n const maxMethods = config?.maxMethods ?? 20;\n const maxCallers = config?.maxCallers ?? 50;\n\n const results: GodNodeResult[] = [];\n\n for (const node of graph.allNodes()) {\n if (node.kind !== 'class') continue;\n\n // Count methods (outgoing has_member edges pointing to method nodes)\n let methodCount = 0;\n for (const edge of graph.findEdgesFrom(node.id)) {\n if (edge.kind === 'has_member') {\n const member = graph.getNode(edge.target);\n if (member && (member.kind === 'method' || member.kind === 'constructor')) {\n methodCount++;\n }\n }\n }\n\n // Count callers (incoming calls edges)\n let callerCount = 0;\n for (const edge of graph.findEdgesTo(node.id)) {\n if (edge.kind === 'calls') callerCount++;\n }\n\n const isTooManyMethods = methodCount > maxMethods;\n const isTooManyCallers = callerCount > maxCallers;\n\n if (!isTooManyMethods && !isTooManyCallers) continue;\n\n const reasons: string[] = [];\n if (isTooManyMethods) reasons.push(`${methodCount} methods (limit: ${maxMethods})`);\n if (isTooManyCallers) reasons.push(`${callerCount} callers (limit: ${maxCallers})`);\n const reason = reasons.join(', ');\n\n // Mark on node metadata\n const health = (node.metadata ?? {}) as Record<string, unknown>;\n const existingHealth = (health['health'] ?? {}) as Record<string, unknown>;\n node.metadata = {\n ...health,\n health: { ...existingHealth, isGodNode: true, godReason: reason },\n };\n\n results.push({\n nodeId: node.id,\n name: node.name,\n kind: node.kind,\n filePath: node.filePath,\n reason,\n });\n }\n\n return results;\n}\n","import type { KnowledgeGraph } from '../graph/knowledge-graph.js';\n\nexport interface OrphanFileResult {\n nodeId: string;\n filePath: string;\n}\n\n// Exclude config files, test fixtures, declaration files, mock files\nconst EXCLUDE_RE = /\\.(d\\.ts|config\\.[tj]s|fixture|mock)$/i;\nconst TEST_DIR_RE = /[/\\\\]test[/\\\\]|[/\\\\]tests[/\\\\]|[/\\\\]__tests__[/\\\\]/i;\n\n/**\n * Detect orphan files: file nodes with no imports and no importers.\n * Excludes: config files, test fixtures, *.d.ts\n * Sets file.metadata.health.orphan = true on affected nodes.\n */\nexport function detectOrphanFiles(graph: KnowledgeGraph): OrphanFileResult[] {\n const results: OrphanFileResult[] = [];\n\n for (const node of graph.allNodes()) {\n if (node.kind !== 'file') continue;\n\n // Exclude declaration files, config files, fixtures, mocks\n if (EXCLUDE_RE.test(node.filePath)) continue;\n\n // Exclude test directories\n if (TEST_DIR_RE.test(node.filePath)) continue;\n\n // Check no outgoing imports edges\n let hasOutgoingImports = false;\n for (const edge of graph.findEdgesFrom(node.id)) {\n if (edge.kind === 'imports') { hasOutgoingImports = true; break; }\n }\n if (hasOutgoingImports) continue;\n\n // Check no incoming imports edges\n let hasIncomingImports = false;\n for (const edge of graph.findEdgesTo(node.id)) {\n if (edge.kind === 'imports') { hasIncomingImports = true; break; }\n }\n if (hasIncomingImports) continue;\n\n // Mark on node metadata\n const health = (node.metadata ?? {}) as Record<string, unknown>;\n const existingHealth = (health['health'] ?? {}) as Record<string, unknown>;\n node.metadata = {\n ...health,\n health: { ...existingHealth, orphan: true },\n };\n\n results.push({\n nodeId: node.id,\n filePath: node.filePath,\n });\n }\n\n return results;\n}\n","import type { KnowledgeGraph } from '../graph/knowledge-graph.js';\nimport { detectDeadCode } from './dead-code.js';\nimport type { DeadCodeResult } from './dead-code.js';\nimport { detectCircularDeps } from './circular-deps.js';\nimport type { CycleResult } from './circular-deps.js';\nimport { detectGodNodes } from './god-nodes.js';\nimport type { GodNodeResult, GodNodeConfig } from './god-nodes.js';\nimport { detectOrphanFiles } from './orphan-files.js';\nimport type { OrphanFileResult } from './orphan-files.js';\n\nexport type { DeadCodeResult, CycleResult, GodNodeResult, GodNodeConfig, OrphanFileResult };\n\nexport interface HealthReport {\n deadCode: DeadCodeResult[];\n cycles: CycleResult[];\n godNodes: GodNodeResult[];\n orphanFiles: OrphanFileResult[];\n score: number; // 0-100\n grade: '🟢' | '🟡' | '🔴';\n}\n\n/**\n * Run all health checks and compute health score.\n * Score formula: 100 - (deadCode.length * 0.5 + cycles.length * 5 + godNodes.length * 2 + orphanFiles.length * 1)\n * Clamped to [0, 100].\n * Grade: >= 80 = 🟢, >= 60 = 🟡, < 60 = 🔴\n */\nexport function computeHealthReport(graph: KnowledgeGraph, godNodeConfig?: GodNodeConfig): HealthReport {\n const deadCode = detectDeadCode(graph);\n const cycles = detectCircularDeps(graph);\n const godNodes = detectGodNodes(graph, godNodeConfig);\n const orphanFiles = detectOrphanFiles(graph);\n\n const raw =\n 100 -\n (deadCode.length * 0.5 +\n cycles.length * 5 +\n godNodes.length * 2 +\n orphanFiles.length * 1);\n\n const score = Math.max(0, Math.min(100, raw));\n const grade: '🟢' | '🟡' | '🔴' = score >= 80 ? '🟢' : score >= 60 ? '🟡' : '🔴';\n\n return {\n deadCode,\n cycles,\n godNodes,\n orphanFiles,\n score,\n grade,\n };\n}\n","export const ErrorCodes = {\n UNAUTHORIZED: 'CI-1000',\n FORBIDDEN: 'CI-1001',\n NOT_FOUND: 'CI-1002',\n ANALYSIS_IN_PROGRESS: 'CI-1003',\n INDEX_NOT_FOUND: 'CI-1004',\n DB_CORRUPTED: 'CI-1042',\n RATE_LIMIT_EXCEEDED: 'CI-1100',\n PAYLOAD_TOO_LARGE: 'CI-1101',\n INVALID_REQUEST: 'CI-1200',\n INTERNAL_ERROR: 'CI-5000',\n} as const;\n\nexport class AppError extends Error {\n constructor(\n public code: string,\n message: string,\n public hint: string,\n public statusCode: number = 500,\n public docs?: string,\n ) {\n super(message);\n this.name = 'AppError';\n }\n}\n","/**\n * Filesystem helpers that enforce restrictive POSIX permissions on\n * `.code-intel/` directories and the secret-bearing files inside them.\n *\n * Behaviour:\n * - Directories are created with mode 0o700 (owner-only access).\n * - Files are chmod'd to 0o600 (owner read/write only).\n * - On Windows (`process.platform === 'win32'`), chmod is largely a no-op;\n * callers should use ACLs instead. We still issue the calls so the\n * intent is documented and tested on POSIX.\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nconst SECURE_DIR_MODE = 0o700;\nconst SECURE_FILE_MODE = 0o600;\n\n/**\n * Create `dir` (and parents) with mode 0o700. Idempotent: if the directory\n * already exists with a looser mode, tighten it back to 0o700.\n */\nexport function secureMkdir(dir: string): void {\n fs.mkdirSync(dir, { recursive: true, mode: SECURE_DIR_MODE });\n // Re-apply mode in case the directory pre-existed with looser perms.\n if (process.platform !== 'win32') {\n try {\n fs.chmodSync(dir, SECURE_DIR_MODE);\n } catch {\n /* not fatal — read-only filesystems, ACL'd parents */\n }\n }\n}\n\n/**\n * chmod a file to 0o600. Safe to call on Windows (no-op).\n */\nexport function secureChmodFile(file: string): void {\n if (process.platform === 'win32') return;\n try {\n fs.chmodSync(file, SECURE_FILE_MODE);\n } catch {\n /* swallow — best-effort */\n }\n}\n\n/**\n * Write a file with mode 0o600 in a single atomic step. Creates parent dirs\n * with secureMkdir first.\n */\nexport function secureWriteFile(file: string, data: string | Buffer): void {\n secureMkdir(path.dirname(file));\n fs.writeFileSync(file, data, { mode: SECURE_FILE_MODE });\n // Re-apply explicit chmod for the case where the file already existed.\n secureChmodFile(file);\n}\n\n/**\n * Apply 0o600 to every `*.db` file inside `dir` (non-recursive). Used after\n * subsystems that wrap better-sqlite3 to seal the freshly-created DB files.\n */\nexport function tightenDbFiles(dir: string): void {\n if (process.platform === 'win32') return;\n if (!fs.existsSync(dir)) return;\n for (const name of fs.readdirSync(dir)) {\n if (name.endsWith('.db') || name.endsWith('.db-wal') || name.endsWith('.db-shm')) {\n try {\n fs.chmodSync(path.join(dir, name), SECURE_FILE_MODE);\n } catch {\n /* best-effort */\n }\n }\n }\n}\n\nexport const SECURE_MODES = {\n dir: SECURE_DIR_MODE,\n file: SECURE_FILE_MODE,\n};\n","import Database from 'better-sqlite3';\nimport bcrypt from 'bcrypt';\nimport crypto from 'node:crypto';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { v4 as uuidv4 } from 'uuid';\nimport { secureMkdir, secureChmodFile, tightenDbFiles } from '../shared/fs-secure.js';\n\nexport type Role = 'admin' | 'analyst' | 'viewer' | 'repo-owner';\n\nexport interface User {\n id: string;\n username: string;\n role: Role;\n createdAt: string;\n}\n\nexport interface Token {\n id: string;\n name: string;\n role: Role;\n scopedRepos?: string[]; // null/undefined means all repos\n scopedTools?: string[]; // null/undefined means all tools\n expiresAt?: string;\n lastUsedAt?: string;\n createdAt: string;\n}\n\nexport interface OIDCIdentity {\n id: string;\n userId: string;\n provider: string; // e.g. 'github', 'google', 'custom'\n sub: string; // Provider subject identifier\n email?: string;\n name?: string;\n createdAt: string;\n lastLoginAt?: string;\n}\n\nconst BCRYPT_ROUNDS = 12;\n\nexport class UsersDB {\n private db: Database.Database;\n\n constructor(dbPath: string) {\n const dir = path.dirname(dbPath);\n secureMkdir(dir);\n this.db = new Database(dbPath);\n this.db.pragma('journal_mode = WAL');\n this.db.pragma('foreign_keys = ON');\n this.createTables();\n // Ensure 0o600 on the freshly created .db (and -wal/-shm) files.\n secureChmodFile(dbPath);\n tightenDbFiles(dir);\n }\n\n private createTables(): void {\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS users (\n id TEXT PRIMARY KEY,\n username TEXT UNIQUE NOT NULL,\n passwordHash TEXT NOT NULL,\n role TEXT NOT NULL,\n createdAt TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS tokens (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n hashedToken TEXT UNIQUE NOT NULL,\n role TEXT NOT NULL,\n expiresAt TEXT NULL,\n lastUsedAt TEXT NULL,\n createdAt TEXT NOT NULL,\n revokedAt TEXT NULL\n );\n\n CREATE TABLE IF NOT EXISTS audit_log (\n id TEXT PRIMARY KEY,\n userId TEXT NOT NULL,\n resource TEXT NOT NULL,\n action TEXT NOT NULL,\n outcome TEXT NOT NULL,\n ip TEXT NOT NULL,\n timestamp TEXT NOT NULL\n );\n `);\n\n // OIDC identities — links a local user to an external provider subject\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS oidc_identities (\n id TEXT PRIMARY KEY,\n userId TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,\n provider TEXT NOT NULL,\n sub TEXT NOT NULL,\n email TEXT NULL,\n name TEXT NULL,\n createdAt TEXT NOT NULL,\n lastLoginAt TEXT NULL,\n UNIQUE (provider, sub)\n );\n `);\n\n // Add columns if they don't exist (idempotent migration)\n try { this.db.exec(`ALTER TABLE tokens ADD COLUMN scopedRepos TEXT NULL`); } catch { /* already exists */ }\n try { this.db.exec(`ALTER TABLE tokens ADD COLUMN scopedTools TEXT NULL`); } catch { /* already exists */ }\n }\n\n // ── Users ──────────────────────────────────────────────────────────────────\n\n createUser(username: string, password: string, role: Role): User {\n const id = uuidv4();\n const passwordHash = bcrypt.hashSync(password, BCRYPT_ROUNDS);\n const createdAt = new Date().toISOString();\n\n this.db\n .prepare(\n 'INSERT INTO users (id, username, passwordHash, role, createdAt) VALUES (?, ?, ?, ?, ?)',\n )\n .run(id, username, passwordHash, role, createdAt);\n\n return { id, username, role, createdAt };\n }\n\n findUserByUsername(username: string): (User & { passwordHash: string }) | null {\n const row = this.db\n .prepare('SELECT id, username, passwordHash, role, createdAt FROM users WHERE username = ?')\n .get(username) as { id: string; username: string; passwordHash: string; role: string; createdAt: string } | undefined;\n\n if (!row) return null;\n return {\n id: row.id,\n username: row.username,\n passwordHash: row.passwordHash,\n role: row.role as Role,\n createdAt: row.createdAt,\n };\n }\n\n listUsers(): User[] {\n const rows = this.db\n .prepare('SELECT id, username, role, createdAt FROM users ORDER BY createdAt ASC')\n .all() as { id: string; username: string; role: string; createdAt: string }[];\n return rows.map((r) => ({ id: r.id, username: r.username, role: r.role as Role, createdAt: r.createdAt }));\n }\n\n deleteUser(username: string): void {\n this.db.prepare('DELETE FROM users WHERE username = ?').run(username);\n }\n\n setRole(username: string, role: Role): void {\n this.db.prepare('UPDATE users SET role = ? WHERE username = ?').run(role, username);\n }\n\n resetPassword(username: string, newPassword: string): void {\n const passwordHash = bcrypt.hashSync(newPassword, BCRYPT_ROUNDS);\n this.db.prepare('UPDATE users SET passwordHash = ? WHERE username = ?').run(passwordHash, username);\n }\n\n // ── Tokens ─────────────────────────────────────────────────────────────────\n\n createToken(\n name: string,\n role: Role,\n expiresAt?: string,\n scopedRepos?: string[],\n scopedTools?: string[],\n ): { token: Token; rawToken: string } {\n const id = uuidv4();\n const rawToken = `cit_${crypto.randomBytes(32).toString('hex')}`;\n const hashedToken = crypto.createHash('sha256').update(rawToken).digest('hex');\n const createdAt = new Date().toISOString();\n\n this.db\n .prepare(\n 'INSERT INTO tokens (id, name, hashedToken, role, expiresAt, lastUsedAt, createdAt, revokedAt, scopedRepos, scopedTools) VALUES (?, ?, ?, ?, ?, NULL, ?, NULL, ?, ?)',\n )\n .run(\n id,\n name,\n hashedToken,\n role,\n expiresAt ?? null,\n createdAt,\n scopedRepos ? JSON.stringify(scopedRepos) : null,\n scopedTools ? JSON.stringify(scopedTools) : null,\n );\n\n const token: Token = { id, name, role, scopedRepos, scopedTools, expiresAt, createdAt };\n return { token, rawToken };\n }\n\n findTokenByHash(hash: string): Token | null {\n const row = this.db\n .prepare(\n 'SELECT id, name, role, expiresAt, lastUsedAt, createdAt, scopedRepos, scopedTools FROM tokens WHERE hashedToken = ? AND revokedAt IS NULL',\n )\n .get(hash) as { id: string; name: string; role: string; expiresAt: string | null; lastUsedAt: string | null; createdAt: string; scopedRepos: string | null; scopedTools: string | null } | undefined;\n\n if (!row) return null;\n\n // Check expiry\n if (row.expiresAt && new Date(row.expiresAt) < new Date()) return null;\n\n return {\n id: row.id,\n name: row.name,\n role: row.role as Role,\n scopedRepos: row.scopedRepos ? (JSON.parse(row.scopedRepos) as string[]) : undefined,\n scopedTools: row.scopedTools ? (JSON.parse(row.scopedTools) as string[]) : undefined,\n expiresAt: row.expiresAt ?? undefined,\n lastUsedAt: row.lastUsedAt ?? undefined,\n createdAt: row.createdAt,\n };\n }\n\n listTokens(): Token[] {\n const rows = this.db\n .prepare(\n 'SELECT id, name, role, expiresAt, lastUsedAt, createdAt, scopedRepos, scopedTools FROM tokens WHERE revokedAt IS NULL ORDER BY createdAt ASC',\n )\n .all() as { id: string; name: string; role: string; expiresAt: string | null; lastUsedAt: string | null; createdAt: string; scopedRepos: string | null; scopedTools: string | null }[];\n\n return rows.map((r) => ({\n id: r.id,\n name: r.name,\n role: r.role as Role,\n scopedRepos: r.scopedRepos ? (JSON.parse(r.scopedRepos) as string[]) : undefined,\n scopedTools: r.scopedTools ? (JSON.parse(r.scopedTools) as string[]) : undefined,\n expiresAt: r.expiresAt ?? undefined,\n lastUsedAt: r.lastUsedAt ?? undefined,\n createdAt: r.createdAt,\n }));\n }\n\n revokeToken(id: string): void {\n this.db\n .prepare('UPDATE tokens SET revokedAt = ? WHERE id = ?')\n .run(new Date().toISOString(), id);\n }\n\n updateLastUsed(id: string): void {\n this.db\n .prepare('UPDATE tokens SET lastUsedAt = ? WHERE id = ?')\n .run(new Date().toISOString(), id);\n }\n\n // ── Audit log ──────────────────────────────────────────────────────────────\n\n logAccess(\n userId: string,\n resource: string,\n action: string,\n outcome: 'allow' | 'deny',\n ip: string,\n ): void {\n this.db\n .prepare(\n 'INSERT INTO audit_log (id, userId, resource, action, outcome, ip, timestamp) VALUES (?, ?, ?, ?, ?, ?, ?)',\n )\n .run(uuidv4(), userId, resource, action, outcome, ip, new Date().toISOString());\n }\n\n // ── OIDC Identity management ────────────────────────────────────────────────\n\n /**\n * Find an existing local user linked to an OIDC provider + sub.\n * Returns `null` if no such link exists yet (first login → auto-provision).\n */\n findUserByOIDC(provider: string, sub: string): (User & { oidcIdentityId: string }) | null {\n const row = this.db\n .prepare(`\n SELECT u.id, u.username, u.role, u.createdAt, oi.id as oidcId\n FROM oidc_identities oi\n JOIN users u ON u.id = oi.userId\n WHERE oi.provider = ? AND oi.sub = ?\n `)\n .get(provider, sub) as {\n id: string; username: string; role: string; createdAt: string; oidcId: string\n } | undefined;\n\n if (!row) return null;\n return {\n id: row.id,\n username: row.username,\n role: row.role as Role,\n createdAt: row.createdAt,\n oidcIdentityId: row.oidcId,\n };\n }\n\n /**\n * Create a local user and link it to an OIDC identity in a single transaction.\n * Password is set to a random 32-byte value — the user can only log in via OIDC.\n */\n provisionOIDCUser(\n username: string,\n role: Role,\n provider: string,\n sub: string,\n email?: string,\n name?: string,\n ): { user: User; oidcIdentityId: string } {\n // Random password — user cannot log in with it (OIDC only)\n const randomPassword = crypto.randomBytes(32).toString('hex');\n const passwordHash = bcrypt.hashSync(randomPassword, BCRYPT_ROUNDS);\n const userId = uuidv4();\n const identityId = uuidv4();\n const now = new Date().toISOString();\n\n const insertUser = this.db.prepare(\n 'INSERT INTO users (id, username, passwordHash, role, createdAt) VALUES (?, ?, ?, ?, ?)',\n );\n const insertIdentity = this.db.prepare(\n 'INSERT INTO oidc_identities (id, userId, provider, sub, email, name, createdAt, lastLoginAt) VALUES (?, ?, ?, ?, ?, ?, ?, ?)',\n );\n\n // Wrap in a transaction for atomicity\n const run = this.db.transaction(() => {\n insertUser.run(userId, username, passwordHash, role, now);\n insertIdentity.run(identityId, userId, provider, sub, email ?? null, name ?? null, now, now);\n });\n run();\n\n const user: User = { id: userId, username, role, createdAt: now };\n return { user, oidcIdentityId: identityId };\n }\n\n /**\n * Link an existing local user to a new OIDC identity.\n */\n linkOIDCIdentity(\n userId: string,\n provider: string,\n sub: string,\n email?: string,\n name?: string,\n ): string {\n const id = uuidv4();\n const now = new Date().toISOString();\n this.db\n .prepare(\n 'INSERT OR REPLACE INTO oidc_identities (id, userId, provider, sub, email, name, createdAt, lastLoginAt) VALUES (?, ?, ?, ?, ?, ?, ?, ?)',\n )\n .run(id, userId, provider, sub, email ?? null, name ?? null, now, now);\n return id;\n }\n\n /**\n * Update lastLoginAt timestamp for an OIDC identity.\n */\n touchOIDCIdentity(provider: string, sub: string): void {\n this.db\n .prepare(\n 'UPDATE oidc_identities SET lastLoginAt = ? WHERE provider = ? AND sub = ?',\n )\n .run(new Date().toISOString(), provider, sub);\n }\n\n /**\n * List all OIDC identities linked to a user.\n */\n listOIDCIdentities(userId: string): OIDCIdentity[] {\n const rows = this.db\n .prepare(\n 'SELECT id, userId, provider, sub, email, name, createdAt, lastLoginAt FROM oidc_identities WHERE userId = ?',\n )\n .all(userId) as {\n id: string; userId: string; provider: string; sub: string;\n email: string | null; name: string | null; createdAt: string; lastLoginAt: string | null\n }[];\n return rows.map((r) => ({\n id: r.id,\n userId: r.userId,\n provider: r.provider,\n sub: r.sub,\n email: r.email ?? undefined,\n name: r.name ?? undefined,\n createdAt: r.createdAt,\n lastLoginAt: r.lastLoginAt ?? undefined,\n }));\n }\n\n /**\n * Unlink an OIDC identity from a user (by identityId).\n */\n unlinkOIDCIdentity(identityId: string): void {\n this.db.prepare('DELETE FROM oidc_identities WHERE id = ?').run(identityId);\n }\n\n // ── Audit log query ────────────────────────────────────────────────────────\n\n /**\n * Retrieve recent audit log entries (most-recent first).\n * Primarily intended for testing and admin inspection.\n */\n getAuditLog(limit = 100): { id: string; userId: string; resource: string; action: string; outcome: string; ip: string; timestamp: string }[] {\n return this.db\n .prepare(\n 'SELECT id, userId, resource, action, outcome, ip, timestamp FROM audit_log ORDER BY timestamp DESC LIMIT ?',\n )\n .all(limit) as { id: string; userId: string; resource: string; action: string; outcome: string; ip: string; timestamp: string }[];\n }\n\n // ── Bootstrap check ────────────────────────────────────────────────────────\n\n hasAnyUser(): boolean {\n const row = this.db.prepare('SELECT COUNT(*) as count FROM users').get() as { count: number };\n return row.count > 0;\n }\n\n close(): void {\n this.db.close();\n }\n}\n\nexport function getUsersDBPath(): string {\n return process.env['CODE_INTEL_USERS_DB_PATH'] ?? path.join(os.homedir(), '.code-intel', 'users.db');\n}\n\nlet _usersDB: UsersDB | null = null;\n\nexport function getOrCreateUsersDB(): UsersDB {\n if (!_usersDB) {\n _usersDB = new UsersDB(getUsersDBPath());\n }\n return _usersDB;\n}\n\n/**\n * Reset the UsersDB singleton. Used in tests to isolate per-test databases.\n * DO NOT call in production code.\n */\nexport function resetUsersDBForTesting(): void {\n if (_usersDB) {\n try { _usersDB.close(); } catch { /* ignore */ }\n }\n _usersDB = null;\n}\n","/**\n * Encrypted `.code-intel/.secrets` store (AES-256-GCM).\n *\n * Layout on disk:\n * ┌─────────────┬─────────────┬─────────────┬──────────────┐\n * │ salt(16) │ iv(12) │ authTag(16)│ ciphertext │\n * └─────────────┴─────────────┴─────────────┴──────────────┘\n *\n * Key derivation: scrypt(password, salt, 32 bytes, N=2^15).\n * Password sources (in order):\n * 1. `CODE_INTEL_SECRET_KEY` env var (caller-supplied)\n * 2. A machine-bound passphrase derived from `os.hostname() + os.userInfo()`\n * (good enough for local-only persistence; user MUST set the env var\n * for any networked or shared machine).\n */\n\nimport crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { secureMkdir, secureWriteFile, secureChmodFile } from '../shared/fs-secure.js';\n\nconst ALG = 'aes-256-gcm';\nconst KEY_LEN = 32;\nconst SALT_LEN = 16;\nconst IV_LEN = 12;\nconst TAG_LEN = 16;\n// scrypt cost: read at call time so tests can lower it via CODE_INTEL_SCRYPT_N.\n// Default N=2^14 uses ~16MB RAM — well within Node's maxmem defaults.\nfunction getScryptN(): number {\n const v = parseInt(process.env['CODE_INTEL_SCRYPT_N'] ?? '', 10);\n return (Number.isInteger(v) && v >= 1024) ? v : (1 << 14);\n}\n\nexport interface SecretsBlob {\n [key: string]: string;\n}\n\nexport function getSecretsPath(): string {\n return (\n process.env['CODE_INTEL_SECRETS_PATH'] ??\n path.join(os.homedir(), '.code-intel', '.secrets')\n );\n}\n\nfunction getMasterPassword(): string {\n const fromEnv = process.env['CODE_INTEL_SECRET_KEY'];\n if (fromEnv && fromEnv.length >= 16) return fromEnv;\n // Machine-bound fallback.\n let username = 'unknown';\n try {\n username = os.userInfo().username;\n } catch {\n /* ignore */\n }\n return `code-intel-machine:${os.hostname()}:${username}:${os.platform()}`;\n}\n\nfunction deriveKey(password: string, salt: Buffer): Buffer {\n return crypto.scryptSync(password, salt, KEY_LEN, { N: getScryptN(), r: 8, p: 1 });\n}\n\nexport function encryptSecrets(blob: SecretsBlob): Buffer {\n const password = getMasterPassword();\n const salt = crypto.randomBytes(SALT_LEN);\n const iv = crypto.randomBytes(IV_LEN);\n const key = deriveKey(password, salt);\n const cipher = crypto.createCipheriv(ALG, key, iv);\n const plaintext = Buffer.from(JSON.stringify(blob), 'utf8');\n const ciphertext = Buffer.concat([cipher.update(plaintext), cipher.final()]);\n const authTag = cipher.getAuthTag();\n return Buffer.concat([salt, iv, authTag, ciphertext]);\n}\n\nexport function decryptSecrets(encrypted: Buffer): SecretsBlob {\n if (encrypted.length < SALT_LEN + IV_LEN + TAG_LEN) {\n throw new Error('Secrets blob is truncated or invalid');\n }\n const salt = encrypted.subarray(0, SALT_LEN);\n const iv = encrypted.subarray(SALT_LEN, SALT_LEN + IV_LEN);\n const authTag = encrypted.subarray(SALT_LEN + IV_LEN, SALT_LEN + IV_LEN + TAG_LEN);\n const ciphertext = encrypted.subarray(SALT_LEN + IV_LEN + TAG_LEN);\n\n const password = getMasterPassword();\n const key = deriveKey(password, salt);\n const decipher = crypto.createDecipheriv(ALG, key, iv);\n decipher.setAuthTag(authTag);\n const plaintext = Buffer.concat([decipher.update(ciphertext), decipher.final()]);\n return JSON.parse(plaintext.toString('utf8')) as SecretsBlob;\n}\n\n/**\n * Read the on-disk secrets file. Returns `{}` if the file does not exist.\n * Throws if the file exists but is corrupted / wrong key.\n */\nexport function loadSecrets(secretsPath: string = getSecretsPath()): SecretsBlob {\n if (!fs.existsSync(secretsPath)) return {};\n const blob = fs.readFileSync(secretsPath);\n return decryptSecrets(blob);\n}\n\nexport function saveSecrets(\n blob: SecretsBlob,\n secretsPath: string = getSecretsPath(),\n): void {\n secureMkdir(path.dirname(secretsPath));\n const encrypted = encryptSecrets(blob);\n secureWriteFile(secretsPath, encrypted);\n secureChmodFile(secretsPath);\n}\n\nexport function setSecret(\n key: string,\n value: string,\n secretsPath: string = getSecretsPath(),\n): void {\n const blob = loadSecrets(secretsPath);\n blob[key] = value;\n saveSecrets(blob, secretsPath);\n}\n\nexport function getSecret(\n key: string,\n secretsPath: string = getSecretsPath(),\n): string | undefined {\n return loadSecrets(secretsPath)[key];\n}\n\nexport function deleteSecret(\n key: string,\n secretsPath: string = getSecretsPath(),\n): void {\n const blob = loadSecrets(secretsPath);\n delete blob[key];\n saveSecrets(blob, secretsPath);\n}\n\nexport function listSecretKeys(secretsPath: string = getSecretsPath()): string[] {\n return Object.keys(loadSecrets(secretsPath));\n}\n","import type { Request, Response, NextFunction } from 'express';\nimport crypto from 'node:crypto';\nimport { v4 as uuidv4 } from 'uuid';\nimport bcrypt from 'bcrypt';\nimport type { Role } from './users-db.js';\nimport { getOrCreateUsersDB } from './users-db.js';\nimport { ErrorCodes } from '../errors/codes.js';\nimport { getSecret } from './secret-store.js';\n\n// ── Augment Express request ───────────────────────────────────────────────────\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace Express {\n interface Request {\n user?: { id: string; username: string; role: Role; authMethod: 'session' | 'token'; scopedRepos?: string[]; scopedTools?: string[] };\n requestId?: string;\n }\n }\n}\n\n// ── Session store ─────────────────────────────────────────────────────────────\n\nexport interface SessionEntry {\n userId: string;\n username: string;\n role: Role;\n expiresAt: number;\n}\n\nexport const sessionStore = new Map<string, SessionEntry>();\n\nconst SESSION_COOKIE_NAME = 'code_intel_session';\n\nfunction getSessionTtlMs(): number {\n const hours = parseInt(process.env['CODE_INTEL_SESSION_TTL_HOURS'] ?? '8', 10);\n return (isNaN(hours) ? 8 : hours) * 60 * 60 * 1000;\n}\n\nexport function createSession(user: { id: string; username: string; role: Role }): string {\n const sessionId = uuidv4();\n const expiresAt = Date.now() + getSessionTtlMs();\n sessionStore.set(sessionId, { userId: user.id, username: user.username, role: user.role, expiresAt });\n return sessionId;\n}\n\nexport function getSession(sessionId: string): SessionEntry | null {\n const entry = sessionStore.get(sessionId);\n if (!entry) return null;\n if (Date.now() > entry.expiresAt) {\n sessionStore.delete(sessionId);\n return null;\n }\n // Slide the window: if more than 25% of TTL has elapsed, renew\n const ttlMs = getSessionTtlMs();\n const remaining = entry.expiresAt - Date.now();\n if (remaining < ttlMs * 0.75) {\n entry.expiresAt = Date.now() + ttlMs;\n }\n return entry;\n}\n\nexport function deleteSession(sessionId: string): void {\n sessionStore.delete(sessionId);\n}\n\n// ── Middleware: attach requestId ──────────────────────────────────────────────\n\nexport function requestIdMiddleware(req: Request, res: Response, next: NextFunction): void {\n req.requestId = uuidv4();\n res.setHeader('X-Request-ID', req.requestId);\n next();\n}\n\n// ── Helper: is localhost ──────────────────────────────────────────────────────\n\nfunction isLocalhost(req: Request): boolean {\n const ip = req.ip ?? req.socket?.remoteAddress ?? '';\n return ip === '127.0.0.1' || ip === '::1' || ip === '::ffff:127.0.0.1';\n}\n\n// ── Middleware: authenticate via session OR Bearer token ──────────────────────\n\nexport function authMiddleware(req: Request, res: Response, next: NextFunction): void {\n // 1. Try session cookie\n const cookies = parseCookies(req.headers['cookie'] ?? '');\n const sessionId = cookies[SESSION_COOKIE_NAME];\n if (sessionId) {\n const session = getSession(sessionId);\n if (session) {\n req.user = { id: session.userId, username: session.username, role: session.role, authMethod: 'session' };\n // Refresh session cookie if the session was renewed (sliding window)\n res.setHeader('Set-Cookie', buildSessionCookie(sessionId));\n next();\n return;\n }\n }\n\n // 2. Try Bearer token\n const authHeader = req.headers['authorization'] ?? '';\n if (authHeader.startsWith('Bearer ')) {\n const rawToken = authHeader.slice(7).trim();\n if (rawToken) {\n const hash = crypto.createHash('sha256').update(rawToken).digest('hex');\n const db = getOrCreateUsersDB();\n const tokenRecord = db.findTokenByHash(hash);\n if (tokenRecord) {\n // Check rotation grace period — if this token was rotated, allow it\n // only until the grace expiry stored at rotate-grace:<id>.\n const graceKey = `rotate-grace:${tokenRecord.id}`;\n try {\n const graceExpiry = getSecret(graceKey);\n if (graceExpiry && new Date(graceExpiry) < new Date()) {\n // Grace period has elapsed — revoke immediately and deny\n setImmediate(() => db.revokeToken(tokenRecord.id));\n next();\n return;\n }\n } catch {\n /* secret store unavailable — proceed normally */\n }\n // Update last used asynchronously (fire-and-forget)\n setImmediate(() => db.updateLastUsed(tokenRecord.id));\n req.user = {\n id: tokenRecord.id,\n username: `token:${tokenRecord.name}`,\n role: tokenRecord.role,\n authMethod: 'token',\n scopedRepos: tokenRecord.scopedRepos,\n scopedTools: tokenRecord.scopedTools,\n };\n next();\n return;\n }\n }\n }\n\n // 3. Dev auto-login\n if (process.env['CODE_INTEL_DEV_AUTO_LOGIN'] === 'true' && isLocalhost(req)) {\n const db = getOrCreateUsersDB();\n const users = db.listUsers();\n if (users.length === 1 && users[0]!.role === 'admin') {\n const user = users[0]!;\n req.user = { id: user.id, username: user.username, role: user.role, authMethod: 'session' };\n }\n }\n\n next();\n}\n\n// ── Middleware: require authentication ────────────────────────────────────────\n\nexport function requireAuth(req: Request, res: Response, next: NextFunction): void {\n if (!req.user) {\n res.status(401).json({\n error: {\n code: ErrorCodes.UNAUTHORIZED,\n message: 'Authentication required',\n hint: 'Provide Authorization: Bearer <token> header or login at /auth/login',\n requestId: req.requestId,\n timestamp: new Date().toISOString(),\n },\n });\n return;\n }\n next();\n}\n\n// ── Middleware factory: require role ──────────────────────────────────────────\n\nexport function requireRole(\n ...roles: Role[]\n): (req: Request, res: Response, next: NextFunction) => void {\n return (req: Request, res: Response, next: NextFunction): void => {\n if (!req.user) {\n res.status(401).json({\n error: {\n code: ErrorCodes.UNAUTHORIZED,\n message: 'Authentication required',\n hint: 'Provide Authorization: Bearer <token> header or login at /auth/login',\n requestId: req.requestId,\n timestamp: new Date().toISOString(),\n },\n });\n return;\n }\n if (!roles.includes(req.user.role)) {\n res.status(403).json({\n error: {\n code: ErrorCodes.FORBIDDEN,\n message: 'Insufficient permissions',\n hint: 'Your role does not have access to this resource',\n requestId: req.requestId,\n timestamp: new Date().toISOString(),\n },\n });\n return;\n }\n next();\n };\n}\n\n// ── Middleware factory: require repo access ───────────────────────────────────\n\nexport function requireRepoAccess(\n getRepoId: (req: Request) => string | undefined,\n): (req: Request, res: Response, next: NextFunction) => void {\n return (req: Request, res: Response, next: NextFunction): void => {\n if (!req.user) {\n res.status(401).json({\n error: {\n code: ErrorCodes.UNAUTHORIZED,\n message: 'Authentication required',\n requestId: req.requestId,\n timestamp: new Date().toISOString(),\n },\n });\n return;\n }\n // Admin and analyst have access to all repos\n if (req.user.role === 'admin' || req.user.role === 'analyst') {\n next();\n return;\n }\n // Check token repo scoping\n if (req.user.authMethod === 'token' && req.user.scopedRepos && req.user.scopedRepos.length > 0) {\n const repoId = getRepoId(req);\n if (repoId && !req.user.scopedRepos.includes(repoId)) {\n res.status(403).json({\n error: {\n code: ErrorCodes.FORBIDDEN,\n message: 'Token does not have access to this repository',\n hint: `This token is scoped to: ${req.user.scopedRepos.join(', ')}`,\n requestId: req.requestId,\n timestamp: new Date().toISOString(),\n },\n });\n return;\n }\n }\n next();\n };\n}\n\nexport function requireToolScope(\n toolName: string,\n): (req: Request, res: Response, next: NextFunction) => void {\n return (req: Request, res: Response, next: NextFunction): void => {\n if (!req.user) {\n res.status(401).json({\n error: {\n code: ErrorCodes.UNAUTHORIZED,\n message: 'Authentication required',\n requestId: req.requestId,\n timestamp: new Date().toISOString(),\n },\n });\n return;\n }\n // No tool scoping set → allow all\n if (!req.user.scopedTools || req.user.scopedTools.length === 0) {\n next();\n return;\n }\n if (!req.user.scopedTools.includes(toolName)) {\n res.status(403).json({\n error: {\n code: ErrorCodes.FORBIDDEN,\n message: `Token does not have access to tool: ${toolName}`,\n hint: `This token is scoped to tools: ${req.user.scopedTools.join(', ')}`,\n requestId: req.requestId,\n timestamp: new Date().toISOString(),\n },\n });\n return;\n }\n next();\n };\n}\n\nexport function parseCookies(cookieHeader: string): Record<string, string> {\n const result: Record<string, string> = {};\n for (const part of cookieHeader.split(';')) {\n const [key, ...vals] = part.trim().split('=');\n if (key) result[key.trim()] = decodeURIComponent(vals.join('=').trim());\n }\n return result;\n}\n\n// ── Cookie helpers (used in app.ts auth routes) ───────────────────────────────\n\nexport function buildSessionCookie(sessionId: string): string {\n const isProduction = process.env['NODE_ENV'] === 'production';\n const maxAge = Math.floor(getSessionTtlMs() / 1000);\n const parts = [\n `${SESSION_COOKIE_NAME}=${encodeURIComponent(sessionId)}`,\n `HttpOnly`,\n `Max-Age=${maxAge}`,\n `Path=/`,\n `SameSite=${isProduction ? 'Strict' : 'Lax'}`,\n ];\n if (isProduction) parts.push('Secure');\n return parts.join('; ');\n}\n\nexport function clearSessionCookie(): string {\n return `${SESSION_COOKIE_NAME}=; HttpOnly; Max-Age=0; Path=/; SameSite=Lax`;\n}\n\n// ── Re-export bcrypt verify for use in auth routes ────────────────────────────\n\nexport async function verifyPassword(plain: string, hash: string): Promise<boolean> {\n return bcrypt.compare(plain, hash);\n}\n","/**\n * WebSocket handshake authentication.\n *\n * Validates the upgrade request by extracting credentials from either:\n * 1. `code_intel_session` cookie (browser session), OR\n * 2. `Authorization: Bearer <token>` header, OR\n * 3. `?token=<token>` query parameter (fallback for clients that cannot\n * set Authorization headers in the handshake, e.g. some browsers).\n *\n * Returns the authenticated user identity, or `null` if the handshake\n * should be rejected. Servers should call this from `noServer` mode and\n * close the socket with status 4401 (custom) or HTTP 401 if it returns null.\n */\n\nimport type { IncomingMessage } from 'node:http';\nimport crypto from 'node:crypto';\nimport { getSession, parseCookies } from '../auth/middleware.js';\nimport { getOrCreateUsersDB } from '../auth/users-db.js';\nimport type { Role } from '../auth/users-db.js';\n\nexport interface WebSocketUser {\n id: string;\n username: string;\n role: Role;\n authMethod: 'session' | 'token';\n}\n\n/**\n * Verify a WebSocket upgrade request.\n * Returns the authenticated user, or `null` if the handshake should be rejected.\n */\nexport function verifyWebSocketHandshake(req: IncomingMessage): WebSocketUser | null {\n // 1. Try session cookie\n const cookieHeader = (req.headers['cookie'] ?? '') as string;\n const cookies = parseCookies(cookieHeader);\n const sessionId = cookies['code_intel_session'];\n if (sessionId) {\n const session = getSession(sessionId);\n if (session) {\n return {\n id: session.userId,\n username: session.username,\n role: session.role,\n authMethod: 'session',\n };\n }\n }\n\n // 2. Try Authorization Bearer header\n const authHeader = (req.headers['authorization'] ?? '') as string;\n if (authHeader.startsWith('Bearer ')) {\n const token = authHeader.slice(7).trim();\n if (token) {\n const user = lookupTokenUser(token);\n if (user) return user;\n }\n }\n\n // 3. Try ?token=<token> query parameter\n const url = req.url ?? '';\n const queryStart = url.indexOf('?');\n if (queryStart !== -1) {\n const query = new URLSearchParams(url.slice(queryStart + 1));\n const queryToken = query.get('token');\n if (queryToken) {\n const user = lookupTokenUser(queryToken);\n if (user) return user;\n }\n }\n\n return null;\n}\n\nfunction lookupTokenUser(rawToken: string): WebSocketUser | null {\n try {\n const hash = crypto.createHash('sha256').update(rawToken).digest('hex');\n const db = getOrCreateUsersDB();\n const tokenRecord = db.findTokenByHash(hash);\n if (!tokenRecord) return null;\n return {\n id: tokenRecord.id,\n username: `token:${tokenRecord.name}`,\n role: tokenRecord.role,\n authMethod: 'token',\n };\n } catch {\n return null;\n }\n}\n","/**\n * WsServer — WebSocket push server for live graph-update notifications.\n *\n * Attaches to an existing Node.js HTTP server (same port as Express).\n * Auth: checks the `code_intel_session` cookie, `Authorization: Bearer <token>`,\n * or `?token=<token>` query param via the existing websocket-auth module.\n *\n * On file change: caller calls broadcast() to push a `graph:updated` message\n * to all authenticated connected clients.\n *\n * Client auto-reconnect is the client's responsibility.\n */\n\nimport { WebSocketServer, WebSocket } from 'ws';\nimport type { Server } from 'node:http';\nimport type { IncomingMessage } from 'node:http';\nimport { verifyWebSocketHandshake } from './websocket-auth.js';\nimport Logger from '../shared/logger.js';\n\nexport interface GraphUpdatedMessage {\n type: 'graph:updated';\n indexVersion: string;\n stats: { nodes: number; edges: number };\n changedFiles: string[];\n timestamp: string;\n}\n\nexport class WsServer {\n private readonly wss: WebSocketServer;\n private readonly clients = new Set<WebSocket>();\n\n constructor(httpServer: Server) {\n this.wss = new WebSocketServer({ server: httpServer, path: '/ws' });\n\n this.wss.on('connection', (ws: WebSocket, req: IncomingMessage) => {\n // Authenticate the handshake\n const user = verifyWebSocketHandshake(req);\n if (!user) {\n Logger.warn('[ws] rejected unauthenticated connection');\n ws.close(4401, 'Unauthorized');\n return;\n }\n\n Logger.info(`[ws] client connected: ${user.username}`);\n this.clients.add(ws);\n\n ws.on('close', () => {\n this.clients.delete(ws);\n Logger.info(`[ws] client disconnected: ${user.username}`);\n });\n\n ws.on('error', (err) => {\n Logger.warn('[ws] client error:', err.message);\n this.clients.delete(ws);\n });\n });\n\n this.wss.on('error', (err) => {\n Logger.warn('[ws] server error:', err.message);\n });\n }\n\n /** Broadcast a message to all authenticated connected clients. */\n broadcast(msg: GraphUpdatedMessage): void {\n const payload = JSON.stringify(msg);\n let sent = 0;\n for (const client of this.clients) {\n if (client.readyState === WebSocket.OPEN) {\n client.send(payload);\n sent++;\n }\n }\n Logger.info(`[ws] broadcast → ${sent} client(s)`);\n }\n\n get clientCount(): number {\n return this.clients.size;\n }\n\n close(): void {\n for (const client of this.clients) {\n try { client.close(); } catch { /* ignore */ }\n }\n this.clients.clear();\n this.wss.close();\n }\n}\n","import type { CodeNode, CodeEdge, EdgeKind } from '../shared/index.js';\n\nexport interface KnowledgeGraph {\n addNode(node: CodeNode): void;\n addEdge(edge: CodeEdge): void;\n getNode(id: string): CodeNode | undefined;\n getEdge(id: string): CodeEdge | undefined;\n findEdgesByKind(kind: EdgeKind): Iterable<CodeEdge>;\n findEdgesFrom(sourceId: string): Iterable<CodeEdge>;\n findEdgesTo(targetId: string): Iterable<CodeEdge>;\n removeNodeCascade(id: string): void;\n removeEdge(id: string): void;\n allNodes(): Iterable<CodeNode>;\n allEdges(): Iterable<CodeEdge>;\n readonly size: { nodes: number; edges: number };\n clear(): void;\n}\n\nexport function createKnowledgeGraph(): KnowledgeGraph {\n const nodes = new Map<string, CodeNode>();\n const edges = new Map<string, CodeEdge>();\n const edgesByKind = new Map<EdgeKind, Set<string>>();\n const edgesFromNode = new Map<string, Set<string>>();\n const edgesToNode = new Map<string, Set<string>>();\n\n function indexEdge(edge: CodeEdge): void {\n let kindSet = edgesByKind.get(edge.kind);\n if (!kindSet) {\n kindSet = new Set();\n edgesByKind.set(edge.kind, kindSet);\n }\n kindSet.add(edge.id);\n\n let fromSet = edgesFromNode.get(edge.source);\n if (!fromSet) {\n fromSet = new Set();\n edgesFromNode.set(edge.source, fromSet);\n }\n fromSet.add(edge.id);\n\n let toSet = edgesToNode.get(edge.target);\n if (!toSet) {\n toSet = new Set();\n edgesToNode.set(edge.target, toSet);\n }\n toSet.add(edge.id);\n }\n\n function unindexEdge(edge: CodeEdge): void {\n edgesByKind.get(edge.kind)?.delete(edge.id);\n edgesFromNode.get(edge.source)?.delete(edge.id);\n edgesToNode.get(edge.target)?.delete(edge.id);\n }\n\n return {\n addNode(node: CodeNode): void {\n nodes.set(node.id, node);\n },\n\n addEdge(edge: CodeEdge): void {\n edges.set(edge.id, edge);\n indexEdge(edge);\n },\n\n getNode(id: string): CodeNode | undefined {\n return nodes.get(id);\n },\n\n getEdge(id: string): CodeEdge | undefined {\n return edges.get(id);\n },\n\n *findEdgesByKind(kind: EdgeKind): Iterable<CodeEdge> {\n const ids = edgesByKind.get(kind);\n if (!ids) return;\n for (const id of ids) {\n const edge = edges.get(id);\n if (edge) yield edge;\n }\n },\n\n *findEdgesFrom(sourceId: string): Iterable<CodeEdge> {\n const ids = edgesFromNode.get(sourceId);\n if (!ids) return;\n for (const id of ids) {\n const edge = edges.get(id);\n if (edge) yield edge;\n }\n },\n\n *findEdgesTo(targetId: string): Iterable<CodeEdge> {\n const ids = edgesToNode.get(targetId);\n if (!ids) return;\n for (const id of ids) {\n const edge = edges.get(id);\n if (edge) yield edge;\n }\n },\n\n removeNodeCascade(id: string): void {\n const fromEdges = edgesFromNode.get(id);\n if (fromEdges) {\n for (const edgeId of [...fromEdges]) {\n const edge = edges.get(edgeId);\n if (edge) {\n unindexEdge(edge);\n edges.delete(edgeId);\n }\n }\n }\n const toEdges = edgesToNode.get(id);\n if (toEdges) {\n for (const edgeId of [...toEdges]) {\n const edge = edges.get(edgeId);\n if (edge) {\n unindexEdge(edge);\n edges.delete(edgeId);\n }\n }\n }\n edgesFromNode.delete(id);\n edgesToNode.delete(id);\n nodes.delete(id);\n },\n\n removeEdge(id: string): void {\n const edge = edges.get(id);\n if (edge) {\n unindexEdge(edge);\n edges.delete(id);\n }\n },\n\n *allNodes(): Iterable<CodeNode> {\n yield* nodes.values();\n },\n\n *allEdges(): Iterable<CodeEdge> {\n yield* edges.values();\n },\n\n get size() {\n return { nodes: nodes.size, edges: edges.size };\n },\n\n clear(): void {\n nodes.clear();\n edges.clear();\n edgesByKind.clear();\n edgesFromNode.clear();\n edgesToNode.clear();\n },\n };\n}\n","export { createKnowledgeGraph } from './knowledge-graph.js';\nexport type { KnowledgeGraph } from './knowledge-graph.js';\nexport { generateNodeId, generateEdgeId } from './id-generator.js';\n","export { initParser, getParser, getLanguage, parseSource, isTreeSitterAvailable } from './parser-manager.js';\nexport { runQuery, runQueryMatches } from './query-runner.js';\nexport type { QueryCapture, QueryMatch } from './query-runner.js';\nexport { AstCache } from './ast-cache.js';\n","import { Tree } from 'web-tree-sitter';\n\nconst DEFAULT_MAX = 500;\n\nexport class AstCache {\n private cache = new Map<string, { tree: Tree; accessedAt: number }>();\n private maxEntries: number;\n\n constructor(maxEntries = DEFAULT_MAX) {\n this.maxEntries = maxEntries;\n }\n\n get(filePath: string): Tree | undefined {\n const entry = this.cache.get(filePath);\n if (entry) {\n entry.accessedAt = Date.now();\n return entry.tree;\n }\n return undefined;\n }\n\n set(filePath: string, tree: Tree): void {\n if (this.cache.size >= this.maxEntries) {\n this.evictLRU();\n }\n this.cache.set(filePath, { tree, accessedAt: Date.now() });\n }\n\n has(filePath: string): boolean {\n return this.cache.has(filePath);\n }\n\n clear(): void {\n this.cache.clear();\n }\n\n get size(): number {\n return this.cache.size;\n }\n\n private evictLRU(): void {\n let oldest: string | null = null;\n let oldestTime = Infinity;\n for (const [key, entry] of this.cache) {\n if (entry.accessedAt < oldestTime) {\n oldest = key;\n oldestTime = entry.accessedAt;\n }\n }\n if (oldest) {\n this.cache.delete(oldest);\n }\n }\n}\n","import { Language } from '../shared/index.js';\nimport type { LanguageModule } from './types.js';\nimport { typescriptModule, javascriptModule } from './modules/typescript.js';\nimport { pythonModule } from './modules/python.js';\nimport { javaModule } from './modules/java.js';\nimport { goModule } from './modules/go.js';\nimport { cModule } from './modules/c.js';\nimport { cppModule } from './modules/cpp.js';\nimport { csharpModule } from './modules/csharp.js';\nimport { rustModule } from './modules/rust.js';\nimport { phpModule } from './modules/php.js';\nimport { kotlinModule } from './modules/kotlin.js';\nimport { rubyModule } from './modules/ruby.js';\nimport { swiftModule } from './modules/swift.js';\nimport { dartModule } from './modules/dart.js';\n\nconst MODULES: Record<Language, LanguageModule> = {\n [Language.TypeScript]: typescriptModule,\n [Language.JavaScript]: javascriptModule,\n [Language.Python]: pythonModule,\n [Language.Java]: javaModule,\n [Language.Go]: goModule,\n [Language.C]: cModule,\n [Language.Cpp]: cppModule,\n [Language.CSharp]: csharpModule,\n [Language.Rust]: rustModule,\n [Language.PHP]: phpModule,\n [Language.Kotlin]: kotlinModule,\n [Language.Ruby]: rubyModule,\n [Language.Swift]: swiftModule,\n [Language.Dart]: dartModule,\n};\n\nexport function getLanguageModule(lang: Language): LanguageModule {\n return MODULES[lang];\n}\n\nexport function getAllLanguageModules(): LanguageModule[] {\n return Object.values(MODULES);\n}\n","import { Language } from '../../shared/index.js';\nimport type { Node } from 'web-tree-sitter';\nimport type { LanguageModule, FileSet } from '../types.js';\nimport { typescriptQueries } from '../../parsing/queries/typescript.js';\nimport path from 'node:path';\n\nfunction resolveRelative(rawPath: string, fromFile: string, workspace: FileSet): string | null {\n const fromDir = path.dirname(fromFile);\n const cleaned = rawPath.replace(/['\"]/g, '');\n const extensions = ['.ts', '.tsx', '.js', '.jsx', '/index.ts', '/index.js'];\n const resolved = workspace.resolve(fromDir, cleaned);\n if (resolved) return resolved;\n for (const ext of extensions) {\n const r = workspace.resolve(fromDir, cleaned + ext);\n if (r) return r;\n }\n return null;\n}\n\nexport const typescriptModule: LanguageModule = {\n lang: Language.TypeScript,\n fileExtensions: ['.ts', '.tsx', '.mts', '.cts'],\n queries: typescriptQueries,\n importStyle: 'explicit',\n inheritanceStrategy: 'depth-first',\n\n resolveImport(rawPath: string, fromFile: string, workspace: FileSet): string | null {\n const cleaned = rawPath.replace(/['\"]/g, '');\n if (cleaned.startsWith('.')) {\n return resolveRelative(rawPath, fromFile, workspace);\n }\n return workspace.findByPackage(cleaned);\n },\n\n isExported(node: Node): boolean {\n const parent = node.parent;\n if (!parent) return false;\n return parent.type === 'export_statement' || node.type === 'export_statement';\n },\n\n extractType(node: Node): string | null {\n const typeAnnotation = node.childForFieldName('type');\n return typeAnnotation?.text ?? null;\n },\n};\n\nexport const javascriptModule: LanguageModule = {\n ...typescriptModule,\n lang: Language.JavaScript,\n fileExtensions: ['.js', '.jsx', '.mjs', '.cjs'],\n};\n","import { Language } from '../../shared/index.js';\nimport type { Node } from 'web-tree-sitter';\nimport type { LanguageModule, FileSet } from '../types.js';\nimport { pythonQueries } from '../../parsing/queries/python.js';\nimport path from 'node:path';\n\nexport const pythonModule: LanguageModule = {\n lang: Language.Python,\n fileExtensions: ['.py', '.pyi'],\n queries: pythonQueries,\n importStyle: 'namespace',\n inheritanceStrategy: 'c3',\n\n resolveImport(rawPath: string, fromFile: string, workspace: FileSet): string | null {\n const cleaned = rawPath.replace(/['\"]/g, '');\n const parts = cleaned.split('.');\n const fromDir = path.dirname(fromFile);\n\n // Try as relative path\n const relPath = parts.join('/');\n for (const suffix of ['/__init__.py', '.py']) {\n const r = workspace.resolve(fromDir, relPath + suffix);\n if (r) return r;\n }\n\n // Try as package from root\n return workspace.findByPackage(cleaned);\n },\n\n isExported(node: Node): boolean {\n // Python: names starting with _ are private by convention\n const name = node.childForFieldName('name');\n if (!name) return true;\n return !name.text.startsWith('_');\n },\n\n extractType(node: Node): string | null {\n const returnType = node.childForFieldName('return_type');\n return returnType?.text ?? null;\n },\n};\n","import { Language } from '../../shared/index.js';\nimport type { Node } from 'web-tree-sitter';\nimport type { LanguageModule, FileSet } from '../types.js';\nimport { javaQueries } from '../../parsing/queries/java.js';\n\nexport const javaModule: LanguageModule = {\n lang: Language.Java,\n fileExtensions: ['.java'],\n queries: javaQueries,\n importStyle: 'explicit',\n inheritanceStrategy: 'depth-first',\n\n resolveImport(rawPath: string, _fromFile: string, workspace: FileSet): string | null {\n const cleaned = rawPath.replace(/['\"]/g, '');\n const filePath = cleaned.replace(/\\./g, '/') + '.java';\n return workspace.findByPackage(filePath);\n },\n\n isExported(node: Node): boolean {\n const text = node.text;\n return text.includes('public');\n },\n\n extractType(node: Node): string | null {\n const typeNode = node.childForFieldName('type');\n return typeNode?.text ?? null;\n },\n};\n","import { Language } from '../../shared/index.js';\nimport type { Node } from 'web-tree-sitter';\nimport type { LanguageModule, FileSet } from '../types.js';\nimport { goQueries } from '../../parsing/queries/go.js';\n\nexport const goModule: LanguageModule = {\n lang: Language.Go,\n fileExtensions: ['.go'],\n queries: goQueries,\n importStyle: 'wildcard',\n inheritanceStrategy: 'depth-first',\n\n resolveImport(rawPath: string, _fromFile: string, workspace: FileSet): string | null {\n const cleaned = rawPath.replace(/['\"]/g, '');\n return workspace.findByPackage(cleaned);\n },\n\n isExported(node: Node): boolean {\n const name = node.childForFieldName('name');\n if (!name) return false;\n const first = name.text[0];\n return first === first.toUpperCase() && first !== first.toLowerCase();\n },\n\n extractType(node: Node): string | null {\n const typeNode = node.childForFieldName('type');\n return typeNode?.text ?? null;\n },\n};\n","import { Language } from '../../shared/index.js';\nimport type { Node } from 'web-tree-sitter';\nimport type { LanguageModule, FileSet } from '../types.js';\nimport { cQueries } from '../../parsing/queries/c.js';\nimport path from 'node:path';\n\nexport const cModule: LanguageModule = {\n lang: Language.C,\n fileExtensions: ['.c', '.h'],\n queries: cQueries,\n importStyle: 'include',\n inheritanceStrategy: 'none',\n\n resolveImport(rawPath: string, fromFile: string, workspace: FileSet): string | null {\n const cleaned = rawPath.replace(/[<>\"']/g, '');\n const fromDir = path.dirname(fromFile);\n return workspace.resolve(fromDir, cleaned);\n },\n\n isExported(_node: Node): boolean {\n return true; // C: all non-static symbols are visible\n },\n\n extractType(node: Node): string | null {\n const typeNode = node.childForFieldName('type');\n return typeNode?.text ?? null;\n },\n};\n","import { Language } from '../../shared/index.js';\nimport type { Node } from 'web-tree-sitter';\nimport type { LanguageModule, FileSet } from '../types.js';\nimport { cppQueries } from '../../parsing/queries/cpp.js';\nimport path from 'node:path';\n\nexport const cppModule: LanguageModule = {\n lang: Language.Cpp,\n fileExtensions: ['.cpp', '.cxx', '.cc', '.hpp', '.hxx'],\n queries: cppQueries,\n importStyle: 'include',\n inheritanceStrategy: 'depth-first',\n\n resolveImport(rawPath: string, fromFile: string, workspace: FileSet): string | null {\n const cleaned = rawPath.replace(/[<>\"']/g, '');\n const fromDir = path.dirname(fromFile);\n return workspace.resolve(fromDir, cleaned);\n },\n\n isExported(_node: Node): boolean {\n return true;\n },\n\n extractType(node: Node): string | null {\n const typeNode = node.childForFieldName('type');\n return typeNode?.text ?? null;\n },\n};\n","import { Language } from '../../shared/index.js';\nimport type { Node } from 'web-tree-sitter';\nimport type { LanguageModule, FileSet } from '../types.js';\nimport { csharpQueries } from '../../parsing/queries/csharp.js';\n\nexport const csharpModule: LanguageModule = {\n lang: Language.CSharp,\n fileExtensions: ['.cs'],\n queries: csharpQueries,\n importStyle: 'explicit',\n inheritanceStrategy: 'depth-first',\n\n resolveImport(rawPath: string, _fromFile: string, workspace: FileSet): string | null {\n const cleaned = rawPath.replace(/['\"]/g, '');\n return workspace.findByPackage(cleaned);\n },\n\n isExported(node: Node): boolean {\n return node.text.includes('public') || node.text.includes('internal');\n },\n\n extractType(node: Node): string | null {\n const typeNode = node.childForFieldName('type');\n return typeNode?.text ?? null;\n },\n};\n","import { Language } from '../../shared/index.js';\nimport type { Node } from 'web-tree-sitter';\nimport type { LanguageModule, FileSet } from '../types.js';\nimport { rustQueries } from '../../parsing/queries/rust.js';\n\nexport const rustModule: LanguageModule = {\n lang: Language.Rust,\n fileExtensions: ['.rs'],\n queries: rustQueries,\n importStyle: 'explicit',\n inheritanceStrategy: 'none',\n\n resolveImport(rawPath: string, _fromFile: string, workspace: FileSet): string | null {\n const cleaned = rawPath.replace(/['\"]/g, '');\n const parts = cleaned.split('::');\n const filePath = parts.join('/') + '.rs';\n return workspace.findByPackage(filePath);\n },\n\n isExported(node: Node): boolean {\n return node.text.startsWith('pub ') || node.text.startsWith('pub(');\n },\n\n extractType(node: Node): string | null {\n const returnType = node.childForFieldName('return_type');\n return returnType?.text ?? null;\n },\n};\n","import { Language } from '../../shared/index.js';\nimport type { Node } from 'web-tree-sitter';\nimport type { LanguageModule, FileSet } from '../types.js';\nimport { phpQueries } from '../../parsing/queries/php.js';\n\nexport const phpModule: LanguageModule = {\n lang: Language.PHP,\n fileExtensions: ['.php'],\n queries: phpQueries,\n importStyle: 'explicit',\n inheritanceStrategy: 'depth-first',\n\n resolveImport(rawPath: string, _fromFile: string, workspace: FileSet): string | null {\n const cleaned = rawPath.replace(/['\"\\\\]/g, '/').replace(/^\\//, '');\n return workspace.findByPackage(cleaned + '.php');\n },\n\n isExported(node: Node): boolean {\n return node.text.includes('public') || !node.text.includes('private');\n },\n\n extractType(node: Node): string | null {\n const typeNode = node.childForFieldName('type');\n return typeNode?.text ?? null;\n },\n};\n","import { Language } from '../../shared/index.js';\nimport type { Node } from 'web-tree-sitter';\nimport type { LanguageModule, FileSet } from '../types.js';\nimport { kotlinQueries } from '../../parsing/queries/kotlin.js';\n\nexport const kotlinModule: LanguageModule = {\n lang: Language.Kotlin,\n fileExtensions: ['.kt', '.kts'],\n queries: kotlinQueries,\n importStyle: 'explicit',\n inheritanceStrategy: 'depth-first',\n\n resolveImport(rawPath: string, _fromFile: string, workspace: FileSet): string | null {\n const cleaned = rawPath.replace(/['\"]/g, '');\n const filePath = cleaned.replace(/\\./g, '/') + '.kt';\n return workspace.findByPackage(filePath);\n },\n\n isExported(node: Node): boolean {\n return !node.text.includes('private') && !node.text.includes('internal');\n },\n\n extractType(node: Node): string | null {\n const typeNode = node.childForFieldName('type');\n return typeNode?.text ?? null;\n },\n};\n","import { Language } from '../../shared/index.js';\nimport type { Node } from 'web-tree-sitter';\nimport type { LanguageModule, FileSet } from '../types.js';\nimport { rubyQueries } from '../../parsing/queries/ruby.js';\n\nexport const rubyModule: LanguageModule = {\n lang: Language.Ruby,\n fileExtensions: ['.rb'],\n queries: rubyQueries,\n importStyle: 'wildcard',\n inheritanceStrategy: 'mixin-aware',\n\n resolveImport(rawPath: string, _fromFile: string, workspace: FileSet): string | null {\n const cleaned = rawPath.replace(/['\"]/g, '');\n return workspace.findByPackage(cleaned + '.rb') ?? workspace.findByPackage(cleaned);\n },\n\n isExported(_node: Node): boolean {\n return true; // Ruby: methods are public by default\n },\n\n extractType(_node: Node): string | null {\n return null; // Ruby: dynamic typing\n },\n};\n","import { Language } from '../../shared/index.js';\nimport type { Node } from 'web-tree-sitter';\nimport type { LanguageModule, FileSet } from '../types.js';\nimport { swiftQueries } from '../../parsing/queries/swift.js';\n\nexport const swiftModule: LanguageModule = {\n lang: Language.Swift,\n fileExtensions: ['.swift'],\n queries: swiftQueries,\n importStyle: 'wildcard',\n inheritanceStrategy: 'depth-first',\n\n resolveImport(rawPath: string, _fromFile: string, workspace: FileSet): string | null {\n const cleaned = rawPath.replace(/['\"]/g, '');\n return workspace.findByPackage(cleaned);\n },\n\n isExported(node: Node): boolean {\n return !node.text.includes('private') && !node.text.includes('fileprivate');\n },\n\n extractType(node: Node): string | null {\n const typeAnnotation = node.childForFieldName('type');\n return typeAnnotation?.text ?? null;\n },\n};\n","import { Language } from '../../shared/index.js';\nimport type { Node } from 'web-tree-sitter';\nimport type { LanguageModule, FileSet } from '../types.js';\nimport { typescriptQueries } from '../../parsing/queries/typescript.js';\nimport path from 'node:path';\n\nexport const dartModule: LanguageModule = {\n lang: Language.Dart,\n fileExtensions: ['.dart'],\n queries: typescriptQueries, // Dart grammar fallback\n importStyle: 'wildcard',\n inheritanceStrategy: 'depth-first',\n\n resolveImport(rawPath: string, fromFile: string, workspace: FileSet): string | null {\n const cleaned = rawPath.replace(/['\"]/g, '');\n if (cleaned.startsWith('package:')) {\n const pkg = cleaned.replace('package:', '');\n return workspace.findByPackage(pkg);\n }\n const fromDir = path.dirname(fromFile);\n return workspace.resolve(fromDir, cleaned);\n },\n\n isExported(node: Node): boolean {\n const name = node.childForFieldName('name');\n if (!name) return true;\n return !name.text.startsWith('_');\n },\n\n extractType(node: Node): string | null {\n const typeNode = node.childForFieldName('type');\n return typeNode?.text ?? null;\n },\n};\n","export interface ImportBinding {\n localName: string;\n sourcePath: string;\n exportedName: string;\n isDefault: boolean;\n isNamespace: boolean;\n}\n\nexport class BindingTracker {\n private bindings = new Map<string, Map<string, ImportBinding>>();\n\n addBinding(filePath: string, binding: ImportBinding): void {\n let fileBindings = this.bindings.get(filePath);\n if (!fileBindings) {\n fileBindings = new Map();\n this.bindings.set(filePath, fileBindings);\n }\n fileBindings.set(binding.localName, binding);\n }\n\n getBinding(filePath: string, localName: string): ImportBinding | undefined {\n return this.bindings.get(filePath)?.get(localName);\n }\n\n getFileBindings(filePath: string): ImportBinding[] {\n const fileBindings = this.bindings.get(filePath);\n return fileBindings ? [...fileBindings.values()] : [];\n }\n\n clear(): void {\n this.bindings.clear();\n }\n}\n","import type { CodeEdge } from '../shared/index.js';\nimport type { LanguageModule, FileSet } from '../languages/types.js';\nimport { BindingTracker } from './binding-tracker.js';\nimport type { ImportBinding } from './binding-tracker.js';\nimport { generateEdgeId } from '../graph/id-generator.js';\n\nexport interface ImportInfo {\n rawPath: string;\n localNames: string[];\n isDefault: boolean;\n isNamespace: boolean;\n namespaceName?: string;\n}\n\nexport interface ImportResolutionResult {\n edges: CodeEdge[];\n bindings: BindingTracker;\n}\n\nexport function resolveImports(\n filePath: string,\n fileNodeId: string,\n imports: ImportInfo[],\n langModule: LanguageModule,\n workspace: FileSet,\n): ImportResolutionResult {\n const bindings = new BindingTracker();\n const edges: CodeEdge[] = [];\n const maxReExportHops = 5;\n\n for (const imp of imports) {\n let resolvedPath = langModule.resolveImport(imp.rawPath, filePath, workspace);\n\n // Re-export chain walking\n let hops = 0;\n const visited = new Set<string>();\n while (resolvedPath && hops < maxReExportHops && !visited.has(resolvedPath)) {\n visited.add(resolvedPath);\n hops++;\n // For now, just accept the first resolution\n break;\n }\n\n if (!resolvedPath) continue;\n\n const targetNodeId = `file:${resolvedPath}:${resolvedPath}`;\n const edge: CodeEdge = {\n id: generateEdgeId(fileNodeId, targetNodeId, 'imports'),\n source: fileNodeId,\n target: targetNodeId,\n kind: 'imports',\n weight: 0.95,\n label: imp.rawPath,\n };\n edges.push(edge);\n\n for (const localName of imp.localNames) {\n const binding: ImportBinding = {\n localName,\n sourcePath: resolvedPath,\n exportedName: localName,\n isDefault: imp.isDefault,\n isNamespace: imp.isNamespace,\n };\n bindings.addBinding(filePath, binding);\n }\n }\n\n return { edges, bindings };\n}\n","import type { CodeEdge, CodeNode } from '../shared/index.js';\nimport type { KnowledgeGraph } from '../graph/knowledge-graph.js';\nimport type { BindingTracker } from '../resolver/binding-tracker.js';\nimport { generateEdgeId } from '../graph/id-generator.js';\nimport type { CallSite } from './call-classifier.js';\n\ninterface ResolutionTier {\n name: string;\n confidence: number;\n resolve(callSite: CallSite): string | null;\n}\n\nexport function buildCallEdges(\n callSites: CallSite[],\n graph: KnowledgeGraph,\n bindings: BindingTracker,\n): CodeEdge[] {\n const edges: CodeEdge[] = [];\n const symbolIndex = buildSymbolIndex(graph);\n\n const tiers: ResolutionTier[] = [\n {\n name: 'same-file',\n confidence: 0.95,\n resolve(cs: CallSite) {\n const key = `${cs.callerFilePath}:${cs.name}`;\n return symbolIndex.get(key) ?? null;\n },\n },\n {\n name: 'imported',\n confidence: 0.9,\n resolve(cs: CallSite) {\n const binding = bindings.getBinding(cs.callerFilePath, cs.name);\n if (!binding) return null;\n const key = `${binding.sourcePath}:${binding.exportedName}`;\n return symbolIndex.get(key) ?? null;\n },\n },\n {\n name: 'global',\n confidence: 0.5,\n resolve(cs: CallSite) {\n return globalSymbolIndex.get(cs.name) ?? null;\n },\n },\n ];\n\n const globalSymbolIndex = new Map<string, string>();\n for (const node of graph.allNodes()) {\n if (['function', 'method', 'class', 'constructor'].includes(node.kind)) {\n if (!globalSymbolIndex.has(node.name)) {\n globalSymbolIndex.set(node.name, node.id);\n }\n }\n }\n\n for (const cs of callSites) {\n for (const tier of tiers) {\n const targetId = tier.resolve(cs);\n if (targetId && targetId !== cs.callerNodeId) {\n edges.push({\n id: generateEdgeId(cs.callerNodeId, targetId, 'calls'),\n source: cs.callerNodeId,\n target: targetId,\n kind: 'calls',\n weight: tier.confidence,\n label: cs.name,\n });\n break;\n }\n }\n }\n\n return edges;\n}\n\nfunction buildSymbolIndex(graph: KnowledgeGraph): Map<string, string> {\n const index = new Map<string, string>();\n for (const node of graph.allNodes()) {\n if (['function', 'method', 'class', 'constructor', 'variable'].includes(node.kind)) {\n const key = `${node.filePath}:${node.name}`;\n index.set(key, node.id);\n }\n }\n return index;\n}\n","export type CallKind = 'free' | 'member' | 'constructor';\n\nexport interface CallSite {\n callerNodeId: string;\n callerFilePath: string;\n name: string;\n receiverText?: string;\n kind: CallKind;\n line: number;\n argCount: number;\n}\n\nexport function classifyCall(\n name: string,\n hasReceiver: boolean,\n isNew: boolean,\n): CallKind {\n if (isNew) return 'constructor';\n if (hasReceiver) return 'member';\n if (name[0] === name[0].toUpperCase() && name[0] !== name[0].toLowerCase()) {\n return 'constructor';\n }\n return 'free';\n}\n","import type { CodeEdge } from '../shared/index.js';\nimport type { KnowledgeGraph } from '../graph/knowledge-graph.js';\nimport { generateEdgeId } from '../graph/id-generator.js';\n\nexport interface HeritageInfo {\n classNodeId: string;\n extendsNames: string[];\n implementsNames: string[];\n}\n\nexport function buildHeritageEdges(\n heritages: HeritageInfo[],\n graph: KnowledgeGraph,\n): CodeEdge[] {\n const edges: CodeEdge[] = [];\n const classIndex = new Map<string, string>();\n\n for (const node of graph.allNodes()) {\n if (['class', 'interface', 'struct', 'trait'].includes(node.kind)) {\n classIndex.set(node.name, node.id);\n }\n }\n\n for (const h of heritages) {\n for (const name of h.extendsNames) {\n const targetId = classIndex.get(name);\n if (targetId) {\n edges.push({\n id: generateEdgeId(h.classNodeId, targetId, 'extends'),\n source: h.classNodeId,\n target: targetId,\n kind: 'extends',\n weight: 1.0,\n label: `extends ${name}`,\n });\n }\n }\n\n for (const name of h.implementsNames) {\n const targetId = classIndex.get(name);\n if (targetId) {\n edges.push({\n id: generateEdgeId(h.classNodeId, targetId, 'implements'),\n source: h.classNodeId,\n target: targetId,\n kind: 'implements',\n weight: 1.0,\n label: `implements ${name}`,\n });\n }\n }\n }\n\n return edges;\n}\n","export type MroStrategy = 'depth-first' | 'c3' | 'mixin-aware' | 'none';\n\nexport function computeMRO(\n classId: string,\n parentMap: Map<string, string[]>,\n strategy: MroStrategy,\n): string[] {\n switch (strategy) {\n case 'depth-first':\n return depthFirstMRO(classId, parentMap);\n case 'c3':\n return c3Linearize(classId, parentMap);\n case 'mixin-aware':\n return mixinAwareMRO(classId, parentMap);\n case 'none':\n return [classId];\n }\n}\n\nfunction depthFirstMRO(classId: string, parentMap: Map<string, string[]>): string[] {\n const result: string[] = [];\n const visited = new Set<string>();\n const stack = [classId];\n\n while (stack.length > 0) {\n const current = stack.pop()!;\n if (visited.has(current)) continue;\n visited.add(current);\n result.push(current);\n const parents = parentMap.get(current) ?? [];\n for (let i = parents.length - 1; i >= 0; i--) {\n stack.push(parents[i]);\n }\n }\n\n return result;\n}\n\nfunction c3Linearize(classId: string, parentMap: Map<string, string[]>): string[] {\n const cache = new Map<string, string[]>();\n const inProgress = new Set<string>();\n\n function linearize(cls: string): string[] {\n if (cache.has(cls)) return cache.get(cls)!;\n if (inProgress.has(cls)) return [cls]; // cycle detected\n\n inProgress.add(cls);\n const parents = parentMap.get(cls) ?? [];\n\n if (parents.length === 0) {\n const result = [cls];\n cache.set(cls, result);\n inProgress.delete(cls);\n return result;\n }\n\n const parentLinearizations = parents.map((p) => linearize(p));\n const sequences = [...parentLinearizations, parents];\n const result = [cls];\n\n while (sequences.some((s) => s.length > 0)) {\n let found = false;\n for (const seq of sequences) {\n if (seq.length === 0) continue;\n const head = seq[0];\n const inTail = sequences.some((s) => s.indexOf(head) > 0);\n if (!inTail) {\n result.push(head);\n for (const s of sequences) {\n const idx = s.indexOf(head);\n if (idx >= 0) s.splice(idx, 1);\n }\n found = true;\n break;\n }\n }\n if (!found) break; // inconsistent hierarchy\n }\n\n cache.set(cls, result);\n inProgress.delete(cls);\n return result;\n }\n\n return linearize(classId);\n}\n\nfunction mixinAwareMRO(classId: string, parentMap: Map<string, string[]>): string[] {\n // Simplified: prepend → direct → included\n return depthFirstMRO(classId, parentMap);\n}\n","import type { CodeEdge } from '../shared/index.js';\nimport type { KnowledgeGraph } from '../graph/knowledge-graph.js';\nimport { generateEdgeId } from '../graph/id-generator.js';\n\nexport function detectOverrides(graph: KnowledgeGraph): CodeEdge[] {\n const edges: CodeEdge[] = [];\n const methodsByOwner = new Map<string, Map<string, string>>();\n\n // Build owner → methods map\n for (const edge of graph.findEdgesByKind('has_member')) {\n const member = graph.getNode(edge.target);\n if (member && member.kind === 'method') {\n let methods = methodsByOwner.get(edge.source);\n if (!methods) {\n methods = new Map();\n methodsByOwner.set(edge.source, methods);\n }\n methods.set(member.name, member.id);\n }\n }\n\n // Check extends edges\n for (const extendsEdge of graph.findEdgesByKind('extends')) {\n const childMethods = methodsByOwner.get(extendsEdge.source);\n const parentMethods = methodsByOwner.get(extendsEdge.target);\n if (!childMethods || !parentMethods) continue;\n\n for (const [methodName, childMethodId] of childMethods) {\n const parentMethodId = parentMethods.get(methodName);\n if (parentMethodId) {\n edges.push({\n id: generateEdgeId(childMethodId, parentMethodId, 'overrides'),\n source: childMethodId,\n target: parentMethodId,\n kind: 'overrides',\n weight: 1.0,\n label: `overrides ${methodName}`,\n });\n }\n }\n }\n\n return edges;\n}\n","import type { Phase } from './types.js';\n\nexport interface ValidationError {\n type: 'duplicate' | 'missing-dep' | 'cycle';\n message: string;\n}\n\nexport function validateDAG(phases: Phase[]): ValidationError[] {\n const errors: ValidationError[] = [];\n const names = new Set<string>();\n\n // Check duplicates\n for (const phase of phases) {\n if (names.has(phase.name)) {\n errors.push({ type: 'duplicate', message: `Duplicate phase name: ${phase.name}` });\n }\n names.add(phase.name);\n }\n\n // Check missing deps\n for (const phase of phases) {\n for (const dep of phase.dependencies) {\n if (!names.has(dep)) {\n errors.push({\n type: 'missing-dep',\n message: `Phase \"${phase.name}\" depends on missing phase \"${dep}\"`,\n });\n }\n }\n }\n\n // Check cycles using DFS\n const visiting = new Set<string>();\n const visited = new Set<string>();\n const phaseMap = new Map(phases.map((p) => [p.name, p]));\n\n function dfs(name: string, path: string[]): boolean {\n if (visiting.has(name)) {\n const cycleStart = path.indexOf(name);\n const cycle = path.slice(cycleStart).concat(name);\n errors.push({ type: 'cycle', message: `Cycle detected: ${cycle.join(' → ')}` });\n return true;\n }\n if (visited.has(name)) return false;\n\n visiting.add(name);\n path.push(name);\n\n const phase = phaseMap.get(name);\n if (phase) {\n for (const dep of phase.dependencies) {\n if (dfs(dep, path)) return true;\n }\n }\n\n visiting.delete(name);\n visited.add(name);\n path.pop();\n return false;\n }\n\n for (const phase of phases) {\n if (!visited.has(phase.name)) {\n dfs(phase.name, []);\n }\n }\n\n return errors;\n}\n\nexport function topologicalSort(phases: Phase[]): Phase[] {\n const phaseMap = new Map(phases.map((p) => [p.name, p]));\n const inDegree = new Map<string, number>();\n const adjList = new Map<string, string[]>();\n\n for (const phase of phases) {\n inDegree.set(phase.name, 0);\n adjList.set(phase.name, []);\n }\n\n for (const phase of phases) {\n for (const dep of phase.dependencies) {\n adjList.get(dep)?.push(phase.name);\n inDegree.set(phase.name, (inDegree.get(phase.name) ?? 0) + 1);\n }\n }\n\n const queue: string[] = [];\n for (const [name, degree] of inDegree) {\n if (degree === 0) queue.push(name);\n }\n\n const sorted: Phase[] = [];\n while (queue.length > 0) {\n const current = queue.shift()!;\n sorted.push(phaseMap.get(current)!);\n for (const neighbor of adjList.get(current) ?? []) {\n const newDegree = (inDegree.get(neighbor) ?? 1) - 1;\n inDegree.set(neighbor, newDegree);\n if (newDegree === 0) queue.push(neighbor);\n }\n }\n\n return sorted;\n}\n","import type { Phase, PhaseResult, PipelineContext } from './types.js';\nimport { validateDAG, topologicalSort } from './dag-validator.js';\nimport { withSpan, isTracingEnabled } from '../observability/tracing.js';\nimport { pipelinePhaseDurationSeconds } from '../observability/metrics.js';\n\nexport interface PipelineRunResult {\n success: boolean;\n results: Map<string, PhaseResult>;\n totalDuration: number;\n}\n\nexport async function runPipeline(\n phases: Phase[],\n context: PipelineContext,\n): Promise<PipelineRunResult> {\n const errors = validateDAG(phases);\n if (errors.length > 0) {\n throw new Error(`Pipeline validation failed:\\n${errors.map((e) => e.message).join('\\n')}`);\n }\n\n const sorted = topologicalSort(phases);\n const results = new Map<string, PhaseResult>();\n const startTime = Date.now();\n let success = true;\n\n for (const phase of sorted) {\n context.onProgress?.(phase.name, 'running');\n const phaseStart = Date.now();\n\n const runPhase = async (): Promise<{ result: PhaseResult }> => {\n const depResults = new Map<string, PhaseResult>();\n for (const dep of phase.dependencies) {\n const depResult = results.get(dep);\n if (depResult) depResults.set(dep, depResult);\n }\n const result = await phase.execute(context, depResults);\n return { result };\n };\n\n try {\n let result: PhaseResult;\n if (isTracingEnabled()) {\n const out = await withSpan(\n `pipeline.phase.${phase.name}`,\n { 'pipeline.phase': phase.name },\n async () => runPhase(),\n );\n result = out.result;\n } else {\n result = (await runPhase()).result;\n }\n\n const durationSec = (Date.now() - phaseStart) / 1000;\n pipelinePhaseDurationSeconds.observe({ phase: phase.name, status: result.status }, durationSec);\n\n results.set(phase.name, result);\n context.onProgress?.(phase.name, result.status);\n\n if (result.status === 'failed') {\n success = false;\n break;\n }\n } catch (err) {\n const result: PhaseResult = {\n status: 'failed',\n duration: Date.now() - phaseStart,\n message: err instanceof Error ? err.message : String(err),\n };\n pipelinePhaseDurationSeconds.observe({ phase: phase.name, status: 'failed' }, (Date.now() - phaseStart) / 1000);\n results.set(phase.name, result);\n context.onProgress?.(phase.name, 'failed');\n success = false;\n break;\n }\n }\n\n return {\n success,\n results,\n totalDuration: Date.now() - startTime,\n };\n}\n","/**\n * Prometheus metrics for code-intel platform.\n * Uses prom-client to expose /metrics endpoint.\n */\nimport { Registry, Counter, Histogram, Gauge, collectDefaultMetrics } from 'prom-client';\n\n// ── Singleton registry ────────────────────────────────────────────────────────\n\nexport const metricsRegistry = new Registry();\n\n// Collect default Node.js metrics (heap, eventloop, gc, etc.)\ncollectDefaultMetrics({ register: metricsRegistry });\n\n// ── Counters ──────────────────────────────────────────────────────────────────\n\nexport const httpRequestsTotal = new Counter({\n name: 'http_requests_total',\n help: 'Total number of HTTP requests',\n labelNames: ['method', 'route', 'status_code'] as const,\n registers: [metricsRegistry],\n});\n\nexport const pipelineAnalysesTotal = new Counter({\n name: 'pipeline_analyses_total',\n help: 'Total number of pipeline analyses run',\n labelNames: ['status'] as const,\n registers: [metricsRegistry],\n});\n\nexport const mcpToolCallsTotal = new Counter({\n name: 'mcp_tool_calls_total',\n help: 'Total number of MCP tool calls',\n labelNames: ['tool', 'status'] as const,\n registers: [metricsRegistry],\n});\n\nexport const authAttemptsTotal = new Counter({\n name: 'auth_attempts_total',\n help: 'Total number of authentication attempts',\n labelNames: ['method', 'outcome'] as const,\n registers: [metricsRegistry],\n});\n\n// ── Histograms ────────────────────────────────────────────────────────────────\n\nexport const httpRequestDurationSeconds = new Histogram({\n name: 'http_request_duration_seconds',\n help: 'HTTP request duration in seconds',\n labelNames: ['method', 'route', 'status_code'] as const,\n buckets: [0.01, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10],\n registers: [metricsRegistry],\n});\n\nexport const pipelinePhaseDurationSeconds = new Histogram({\n name: 'pipeline_phase_duration_seconds',\n help: 'Duration of individual pipeline phases in seconds',\n labelNames: ['phase', 'status'] as const,\n buckets: [0.1, 0.5, 1, 2, 5, 10, 30, 60, 120],\n registers: [metricsRegistry],\n});\n\nexport const mcpToolDurationSeconds = new Histogram({\n name: 'mcp_tool_duration_seconds',\n help: 'Duration of MCP tool calls in seconds',\n labelNames: ['tool'] as const,\n buckets: [0.01, 0.05, 0.1, 0.5, 1, 5],\n registers: [metricsRegistry],\n});\n\n// ── Gauges ────────────────────────────────────────────────────────────────────\n\nexport const pipelineNodesTotal = new Gauge({\n name: 'pipeline_nodes_total',\n help: 'Total number of nodes in the knowledge graph',\n labelNames: ['repo'] as const,\n registers: [metricsRegistry],\n});\n\nexport const pipelineEdgesTotal = new Gauge({\n name: 'pipeline_edges_total',\n help: 'Total number of edges in the knowledge graph',\n labelNames: ['repo'] as const,\n registers: [metricsRegistry],\n});\n\nexport const jobQueueDepth = new Gauge({\n name: 'job_queue_depth',\n help: 'Current number of jobs in the queue',\n labelNames: ['status'] as const,\n registers: [metricsRegistry],\n});\n\nexport const activeSessionsTotal = new Gauge({\n name: 'active_sessions_total',\n help: 'Current number of active user sessions',\n registers: [metricsRegistry],\n});\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { detectLanguage, getSupportedExtensions } from '../../shared/index.js';\nimport type { Phase, PhaseResult, PipelineContext } from '../types.js';\nimport { generateNodeId } from '../../graph/id-generator.js';\n\nconst IGNORED_DIRS = new Set([\n 'node_modules', '.git', '.svn', '.hg', 'dist', 'dist-tests', 'build', 'out',\n '__pycache__', '.tox', '.pytest_cache', '.mypy_cache',\n 'vendor', 'target', '.code-intel', 'coverage', '.next',\n '.turbo', '.cache', 'tmp', 'temp', '.parcel-cache', '.venv', 'venv',\n '.env', 'env', '__snapshots__', '.nyc_output', 'storybook-static',\n]);\n\n/**\n * Load extra ignore patterns from .codeintelignore in the workspace root.\n * Format: one glob/dir name per line, # for comments.\n */\nfunction loadIgnorePatterns(workspaceRoot: string): Set<string> {\n try {\n const raw = fs.readFileSync(path.join(workspaceRoot, '.codeintelignore'), 'utf-8');\n const extras = new Set<string>();\n for (const line of raw.split('\\n')) {\n const trimmed = line.trim();\n if (trimmed && !trimmed.startsWith('#')) extras.add(trimmed);\n }\n return extras;\n } catch {\n return new Set();\n }\n}\n\nconst IGNORED_FILE_SUFFIXES = ['.d.ts', '.js.map', '.d.ts.map', '.min.js', '.min.css'];\nconst MAX_FILE_SIZE_BYTES = 512 * 1024; // skip files > 512 KB\n\nexport const scanPhase: Phase = {\n name: 'scan',\n dependencies: [],\n async execute(context: PipelineContext): Promise<PhaseResult> {\n const start = Date.now();\n const extensions = new Set(getSupportedExtensions());\n const filePaths: string[] = [];\n const extraIgnore = loadIgnorePatterns(context.workspaceRoot);\n\n function walk(dir: string): void {\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n\n for (const entry of entries) {\n // Skip hidden directories and ignored directories\n if (entry.isDirectory()) {\n if (entry.name.startsWith('.')) continue;\n if (IGNORED_DIRS.has(entry.name)) continue;\n if (extraIgnore.has(entry.name)) continue;\n walk(path.join(dir, entry.name));\n } else if (entry.isFile()) {\n const name = entry.name;\n // Skip known non-source suffixes\n if (IGNORED_FILE_SUFFIXES.some((s) => name.endsWith(s))) continue;\n const ext = path.extname(name);\n if (!extensions.has(ext)) continue;\n const fullPath = path.join(dir, name);\n // Skip very large files (generated code, minified assets)\n try {\n const stat = fs.statSync(fullPath);\n if (stat.size > MAX_FILE_SIZE_BYTES) continue;\n } catch {\n continue;\n }\n filePaths.push(fullPath);\n }\n }\n }\n\n walk(context.workspaceRoot);\n context.filePaths.push(...filePaths);\n context.onPhaseProgress?.('scan', filePaths.length, filePaths.length);\n\n return {\n status: 'completed',\n duration: Date.now() - start,\n message: `Found ${filePaths.length} source files`,\n };\n },\n};\n\nexport const structurePhase: Phase = {\n name: 'structure',\n dependencies: ['scan'],\n async execute(context: PipelineContext): Promise<PhaseResult> {\n const start = Date.now();\n const dirs = new Set<string>();\n\n let structDone = 0;\n for (const filePath of context.filePaths) {\n const relativePath = path.relative(context.workspaceRoot, filePath);\n const lang = detectLanguage(filePath);\n\n context.graph.addNode({\n id: generateNodeId('file', relativePath, relativePath),\n kind: 'file',\n name: path.basename(filePath),\n filePath: relativePath,\n metadata: lang ? { language: lang } : undefined,\n });\n\n // Collect directories\n let dir = path.dirname(relativePath);\n while (dir && dir !== '.' && dir !== '') {\n if (dirs.has(dir)) break;\n dirs.add(dir);\n dir = path.dirname(dir);\n }\n structDone++;\n context.onPhaseProgress?.('structure', structDone, context.filePaths.length);\n }\n\n for (const dir of dirs) {\n context.graph.addNode({\n id: generateNodeId('directory', dir, dir),\n kind: 'directory',\n name: path.basename(dir),\n filePath: dir,\n });\n }\n\n return {\n status: 'completed',\n duration: Date.now() - start,\n message: `Created ${context.filePaths.length} file nodes, ${dirs.size} directory nodes`,\n };\n },\n};\n","export { scanPhase, structurePhase } from './scan-phase.js';\nexport { parsePhase } from './parse-phase.js';\nexport { resolvePhase } from './resolve-phase.js';\nexport { clusterPhase } from './cluster-phase.js';\nexport { flowPhase } from './flow-phase.js';\nexport { summarizePhase, createSummarizePhase } from './summarize-phase.js';\nexport { parsePhaseParallel } from '../workers/parse-phase-parallel.js';\nexport { resolvePhaseParallel } from '../workers/resolve-phase-parallel.js';\n","import type { Phase, PhaseResult, PipelineContext } from '../types.js';\nimport { generateNodeId, generateEdgeId } from '../../graph/id-generator.js';\n\nexport const clusterPhase: Phase = {\n name: 'cluster',\n dependencies: ['resolve'],\n async execute(context: PipelineContext): Promise<PhaseResult> {\n const start = Date.now();\n const { graph } = context;\n\n const relevantKinds = new Set(['function', 'class', 'method', 'interface', 'struct', 'trait', 'enum']);\n const nodesByDir = new Map<string, { id: string; name: string }[]>();\n\n for (const node of graph.allNodes()) {\n if (!relevantKinds.has(node.kind)) continue;\n const dir = node.filePath.split('/').slice(0, -1).join('/') || '.';\n let group = nodesByDir.get(dir);\n if (!group) {\n group = [];\n nodesByDir.set(dir, group);\n }\n group.push({ id: node.id, name: node.name });\n }\n\n let clusterCount = 0;\n const dirEntries = [...nodesByDir.entries()];\n let clusterDone = 0;\n for (const [dir, members] of dirEntries) {\n clusterDone++;\n context.onPhaseProgress?.('cluster', clusterDone, dirEntries.length);\n if (members.length < 2) continue;\n\n const clusterId = generateNodeId('cluster', dir, `cluster-${clusterCount}`);\n const label = dir.split('/').filter(Boolean).pop() ?? `cluster-${clusterCount}`;\n\n graph.addNode({\n id: clusterId,\n kind: 'cluster',\n name: label,\n filePath: dir,\n metadata: { memberCount: members.length },\n });\n\n for (const member of members) {\n graph.addEdge({\n id: generateEdgeId(member.id, clusterId, 'belongs_to'),\n source: member.id,\n target: clusterId,\n kind: 'belongs_to',\n weight: 1.0,\n });\n }\n clusterCount++;\n }\n\n return {\n status: 'completed',\n duration: Date.now() - start,\n message: `Created ${clusterCount} clusters`,\n };\n },\n};\n","import type { Phase, PhaseResult, PipelineContext } from '../types.js';\nimport { generateNodeId, generateEdgeId } from '../../graph/id-generator.js';\n\nexport const flowPhase: Phase = {\n name: 'flow',\n dependencies: ['resolve'],\n async execute(context: PipelineContext): Promise<PhaseResult> {\n const start = Date.now();\n const { graph } = context;\n\n // Find entry points: exported functions with no incoming call edges\n const calledNodes = new Set<string>();\n for (const edge of graph.findEdgesByKind('calls')) {\n calledNodes.add(edge.target);\n }\n\n const entryPoints: { id: string; name: string; score: number; filePath: string }[] = [];\n\n for (const node of graph.allNodes()) {\n if (!['function', 'method'].includes(node.kind)) continue;\n\n let score = 0;\n const hasCallers = calledNodes.has(node.id);\n const outCalls = [...graph.findEdgesFrom(node.id)].filter((e) => e.kind === 'calls');\n\n if (!hasCallers && outCalls.length > 0) score += 10;\n if (node.exported) score += 5;\n if (/^(main|handle|init|start|run|execute|process|serve|listen|bootstrap)/.test(node.name)) score += 3;\n if (node.filePath.includes('test') || node.filePath.includes('spec') || node.filePath.includes('__test')) score -= 20;\n if (node.filePath.includes('route') || node.filePath.includes('controller') || node.filePath.includes('handler')) score += 8;\n\n if (score >= 5) {\n entryPoints.push({ id: node.id, name: node.name, score, filePath: node.filePath });\n }\n }\n\n entryPoints.sort((a, b) => b.score - a.score);\n\n // Trace flows from top entry points (max 20)\n const maxFlows = 75;\n const maxDepth = 10;\n const maxBranching = 4;\n let flowCount = 0;\n const epSlice = entryPoints.slice(0, 20);\n\n for (let epIdx = 0; epIdx < epSlice.length; epIdx++) {\n const ep = epSlice[epIdx];\n context.onPhaseProgress?.('flow', epIdx + 1, epSlice.length);\n if (flowCount >= maxFlows) break;\n\n // BFS trace\n const queue: { nodeId: string; path: string[] }[] = [{ nodeId: ep.id, path: [ep.id] }];\n const visited = new Set<string>();\n\n while (queue.length > 0 && flowCount < maxFlows) {\n const { nodeId, path } = queue.shift()!;\n if (path.length > maxDepth) continue;\n\n const callEdges = [...graph.findEdgesFrom(nodeId)]\n .filter((e) => e.kind === 'calls')\n .slice(0, maxBranching);\n\n if (callEdges.length === 0 && path.length >= 3) {\n // Record flow\n const flowId = generateNodeId('flow', ep.filePath, `flow-${flowCount}`);\n graph.addNode({\n id: flowId,\n kind: 'flow',\n name: `${ep.name} flow ${flowCount}`,\n filePath: ep.filePath,\n metadata: { steps: path, entryPoint: ep.name },\n });\n\n // Add step_of edges\n for (let i = 0; i < path.length; i++) {\n graph.addEdge({\n id: generateEdgeId(path[i], flowId, `step_of_${i}`),\n source: path[i],\n target: flowId,\n kind: 'step_of',\n weight: 1.0,\n label: `step ${i + 1}`,\n });\n }\n\n flowCount++;\n continue;\n }\n\n for (const edge of callEdges) {\n if (visited.has(edge.target)) continue;\n visited.add(edge.target);\n queue.push({ nodeId: edge.target, path: [...path, edge.target] });\n }\n }\n }\n\n return {\n status: 'completed',\n duration: Date.now() - start,\n message: `Found ${entryPoints.length} entry points, traced ${flowCount} flows`,\n };\n },\n};\n","/**\n * LLM Governance Logger — opt-in audit log for AI/LLM calls.\n *\n * When CODE_INTEL_GOVERNANCE_LOGGING=true, logs every LLM invocation to\n * ~/.code-intel/llm-governance.jsonl (JSON Lines format).\n *\n * IMPORTANT: Never log raw source code, file contents, tokens, or passwords.\n * Only log: model, user/agent identity, tool/purpose, token counts, timestamp.\n */\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\nimport { v4 as uuidv4 } from 'uuid';\n\nexport interface GovernanceLogEntry {\n id: string;\n timestamp: string;\n model: string;\n userId: string;\n purpose: string;\n promptTokens: number;\n responseTokens: number;\n durationMs: number;\n outcome: 'success' | 'error';\n errorCode?: string;\n}\n\nexport class LLMGovernanceLogger {\n /** Is governance logging enabled? */\n isEnabled(): boolean {\n return process.env['CODE_INTEL_GOVERNANCE_LOGGING'] === 'true';\n }\n\n /** Path to the JSONL log file. */\n getLogPath(): string {\n return (\n process.env['CODE_INTEL_GOVERNANCE_LOG_PATH'] ??\n path.join(os.homedir(), '.code-intel', 'llm-governance.jsonl')\n );\n }\n\n /**\n * Append an entry to the governance log.\n * No-op when isEnabled() returns false.\n * Never throws — governance must not impact the request path.\n */\n log(entry: Omit<GovernanceLogEntry, 'id' | 'timestamp'>): void {\n if (!this.isEnabled()) return;\n try {\n const full: GovernanceLogEntry = {\n id: uuidv4(),\n timestamp: new Date().toISOString(),\n ...entry,\n };\n const logPath = this.getLogPath();\n fs.mkdirSync(path.dirname(logPath), { recursive: true });\n fs.appendFileSync(logPath, JSON.stringify(full) + '\\n', 'utf-8');\n } catch {\n /* non-fatal — governance logging must never crash the app */\n }\n }\n\n /**\n * Read the last `limit` governance log entries (most-recent last, JSONL order).\n * Returns empty array when logging is disabled or file does not exist.\n */\n readLog(limit = 100): GovernanceLogEntry[] {\n try {\n const raw = fs.readFileSync(this.getLogPath(), 'utf-8');\n const lines = raw\n .split('\\n')\n .filter((l) => l.trim().length > 0)\n .slice(-limit);\n return lines.map((l) => JSON.parse(l) as GovernanceLogEntry);\n } catch {\n return [];\n }\n }\n}\n\n/** Singleton governance logger. */\nexport const governanceLogger = new LLMGovernanceLogger();\n","/**\n * parse-phase-parallel.ts — Drop-in parallel replacement for parse-phase.ts\n *\n * Uses WorkerPool<ParseTask, ParseResult> to distribute file parsing across\n * N worker threads (default: os.cpus().length - 1).\n *\n * Falls back gracefully to sequential execution if workers fail to start.\n */\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\nimport { fileURLToPath } from 'node:url';\nimport { detectLanguage, Language } from '../../shared/index.js';\nimport type { Phase, PhaseResult, PipelineContext } from '../types.js';\nimport { generateNodeId } from '../../graph/id-generator.js';\nimport Logger from '../../shared/logger.js';\nimport { WorkerPool } from './worker-pool.js';\nimport type { ParseTask, ParseResult } from './parse-worker.js';\nimport {\n typescriptQueries, javascriptQueries, pythonQueries, javaQueries, goQueries,\n cQueries, cppQueries, csharpQueries, rustQueries, phpQueries,\n kotlinQueries, rubyQueries, swiftQueries, dartQueries,\n} from '../../parsing/queries/index.js';\n\nconst LANG_QUERIES: Partial<Record<Language, string>> = {\n [Language.TypeScript]: typescriptQueries,\n [Language.JavaScript]: javascriptQueries,\n [Language.Python]: pythonQueries,\n [Language.Java]: javaQueries,\n [Language.Go]: goQueries,\n [Language.C]: cQueries,\n [Language.Cpp]: cppQueries,\n [Language.CSharp]: csharpQueries,\n [Language.Rust]: rustQueries,\n [Language.PHP]: phpQueries,\n [Language.Kotlin]: kotlinQueries,\n [Language.Ruby]: rubyQueries,\n [Language.Swift]: swiftQueries,\n [Language.Dart]: dartQueries,\n};\n\n// Resolve the compiled worker script path (dist/pipeline/workers/parse-worker.js)\nfunction workerScriptPath(): string {\n const thisFile = fileURLToPath(import.meta.url);\n return path.join(path.dirname(thisFile), 'parse-worker.js');\n}\n\nexport const parsePhaseParallel: Phase = {\n name: 'parse',\n dependencies: ['structure'],\n\n async execute(context: PipelineContext): Promise<PhaseResult> {\n const start = Date.now();\n\n if (!context.fileCache) context.fileCache = new Map();\n if (!context.fileFunctionIndex) context.fileFunctionIndex = new Map();\n\n const filePaths = context.filePaths;\n const workerCount = parseInt(process.env['PARSE_WORKERS'] ?? '', 10) || Math.max(1, os.cpus().length - 1);\n\n // ── Read all files into cache ─────────────────────────────────────────────\n const CONCURRENCY = 64;\n for (let i = 0; i < filePaths.length; i += CONCURRENCY) {\n const batch = filePaths.slice(i, i + CONCURRENCY);\n await Promise.all(batch.map(async (filePath) => {\n try {\n const source = await fs.promises.readFile(filePath, 'utf-8');\n context.fileCache!.set(filePath, source);\n } catch { /* skip */ }\n }));\n }\n\n // ── Try to start the worker pool ──────────────────────────────────────────\n const workerScript = workerScriptPath();\n const workerScriptExists = fs.existsSync(workerScript);\n\n if (!workerScriptExists || workerCount === 1) {\n // Worker script not built yet or forced single-threaded — delegate to\n // the regular sequential parse phase\n Logger.info(`[parse-parallel] falling back to sequential (workerCount=${workerCount}, scriptExists=${workerScriptExists})`);\n const { parsePhase } = await import('../phases/parse-phase.js');\n return parsePhase.execute(context, new Map());\n }\n\n // ── Build tasks ───────────────────────────────────────────────────────────\n const tasks: ParseTask[] = [];\n for (const filePath of filePaths) {\n const lang = detectLanguage(filePath);\n if (!lang) continue;\n const source = context.fileCache.get(filePath);\n if (!source) continue;\n const relativePath = path.relative(context.workspaceRoot, filePath);\n const fileNodeId = generateNodeId('file', relativePath, relativePath);\n\n // Store file content snippet on the file node\n const fileNode = context.graph.getNode(fileNodeId);\n if (fileNode) fileNode.content = source.slice(0, 2000);\n\n tasks.push({\n taskId: filePath,\n filePath,\n relativePath,\n source,\n lang: lang as string,\n fileNodeId,\n queryStr: LANG_QUERIES[lang] ?? null,\n });\n }\n\n // ── Run tasks in worker pool ──────────────────────────────────────────────\n const pool = new WorkerPool<ParseTask, ParseResult>({\n workerScript,\n workerCount,\n maxQueueSize: 200,\n });\n await pool.init();\n\n let symbolCount = 0;\n let treeSitterCount = 0;\n let regexCount = 0;\n let parseDone = 0;\n\n // Backpressure: wait for queue to drain below threshold before submitting more\n const BATCH_SIZE = 100;\n\n for (let i = 0; i < tasks.length; i += BATCH_SIZE) {\n const batch = tasks.slice(i, i + BATCH_SIZE);\n const results = await Promise.all(batch.map((t) => pool.run(t).catch((err: Error) => ({\n taskId: t.taskId,\n nodes: [],\n edges: [],\n usedTreeSitter: false,\n error: err.message,\n } as ParseResult))));\n\n for (const res of results) {\n if (res.error) {\n Logger.warn(`[parse-parallel] task error: ${res.error}`);\n }\n for (const n of res.nodes) context.graph.addNode(n);\n for (const e of res.edges) context.graph.addEdge(e);\n symbolCount += res.nodes.length;\n if (res.usedTreeSitter) treeSitterCount++;\n else regexCount++;\n\n // Build per-file sorted function index\n const relativePath = path.relative(context.workspaceRoot, res.taskId);\n const funcs = res.nodes\n .filter((n) => n.kind === 'function' || n.kind === 'method')\n .map((n) => ({ id: n.id, startLine: n.startLine ?? 0, endLine: n.endLine }))\n .sort((a, b) => a.startLine - b.startLine);\n if (funcs.length > 0) context.fileFunctionIndex!.set(relativePath, funcs);\n\n parseDone++;\n context.onPhaseProgress?.('parse', parseDone, tasks.length);\n }\n }\n\n await pool.close();\n\n const parserUsed: 'tree-sitter' | 'regex' = treeSitterCount === 0 ? 'regex' : 'tree-sitter';\n context.parserUsed = parserUsed;\n\n if (context.verbose) {\n Logger.info(`[parse-parallel] ${workerCount} workers, tree-sitter: ${treeSitterCount}, regex: ${regexCount}`);\n }\n\n return {\n status: 'completed',\n duration: Date.now() - start,\n message: `Extracted ${symbolCount} symbols from ${filePaths.length} files (${parserUsed}, ${workerCount} workers)`,\n };\n },\n};\n","/**\n * worker-pool.ts — Generic worker-thread pool with backpressure.\n *\n * - N workers (default: os.cpus().length - 1; PARSE_WORKERS env override)\n * - Work queue with backpressure: pauses when queue > 200\n * - Worker crash → restart + re-queue pending work\n * - Progress events forwarded to caller via onProgress callback\n */\nimport { Worker } from 'node:worker_threads';\nimport os from 'node:os';\nimport { EventEmitter } from 'node:events';\nimport Logger from '../../shared/logger.js';\n\nexport interface WorkerPoolOptions {\n workerScript: string; // absolute path to the worker .js file\n workerCount?: number; // default: os.cpus().length - 1 (min 1)\n maxQueueSize?: number; // backpressure threshold (default 200)\n maxTaskRetries?: number; // max retries on worker crash (default 2)\n}\n\ninterface PendingTask<I, O> {\n id: string;\n input: I;\n resolve: (result: O) => void;\n reject: (err: Error) => void;\n retries: number;\n}\n\ninterface ActiveWorker<I, O> {\n worker: Worker;\n currentTask: PendingTask<I, O> | null;\n}\n\nexport class WorkerPool<I extends { taskId: string }, O extends { taskId: string; error?: string }> extends EventEmitter {\n private workers: ActiveWorker<I, O>[] = [];\n private queue: PendingTask<I, O>[] = [];\n private readonly workerScript: string;\n private readonly workerCount: number;\n private readonly maxQueueSize: number;\n private readonly maxTaskRetries: number;\n private closed = false;\n\n constructor(opts: WorkerPoolOptions) {\n super();\n this.workerScript = opts.workerScript;\n this.workerCount = opts.workerCount ?? Math.max(1, os.cpus().length - 1);\n this.maxQueueSize = opts.maxQueueSize ?? 200;\n this.maxTaskRetries = opts.maxTaskRetries ?? 2;\n }\n\n /** Spawn all workers. Must be called before run(). */\n async init(): Promise<void> {\n for (let i = 0; i < this.workerCount; i++) {\n this.spawnWorker();\n }\n }\n\n private spawnWorker(): void {\n const aw: ActiveWorker<I, O> = { worker: null!, currentTask: null };\n const w = new Worker(this.workerScript);\n\n w.on('message', (result: O) => {\n const task = aw.currentTask;\n aw.currentTask = null;\n if (task) {\n if (result.error) {\n task.reject(new Error(result.error));\n } else {\n task.resolve(result);\n }\n }\n this.emit('taskDone');\n this.dequeue(aw);\n });\n\n w.on('error', (err) => {\n Logger.warn(`[WorkerPool] worker error: ${err.message}`);\n const task = aw.currentTask;\n aw.currentTask = null;\n\n // Re-spawn replacement worker\n const idx = this.workers.indexOf(aw);\n if (idx >= 0) this.workers.splice(idx, 1);\n if (!this.closed) this.spawnWorker();\n\n // Re-queue the task that was in flight (up to maxTaskRetries)\n if (task) {\n task.retries = (task.retries ?? 0) + 1;\n if (task.retries <= this.maxTaskRetries) {\n Logger.info(`[WorkerPool] re-queuing task ${task.id} after worker crash (retry ${task.retries})`);\n this.queue.unshift(task);\n this.drainQueue();\n } else {\n Logger.warn(`[WorkerPool] task ${task.id} exceeded max retries (${this.maxTaskRetries}), rejecting`);\n task.reject(new Error(`Worker crashed after ${this.maxTaskRetries} retries`));\n }\n }\n });\n\n w.on('exit', (code) => {\n if (code !== 0 && !this.closed) {\n Logger.warn(`[WorkerPool] worker exited with code ${code}`);\n }\n });\n\n aw.worker = w;\n this.workers.push(aw);\n this.dequeue(aw);\n }\n\n /** Submit a task. Resolves with the worker result or rejects on error. */\n run(input: I): Promise<O> {\n if (this.closed) return Promise.reject(new Error('WorkerPool is closed'));\n\n return new Promise((resolve, reject) => {\n const task: PendingTask<I, O> = { id: input.taskId, input, resolve, reject, retries: 0 };\n this.queue.push(task);\n\n if (this.queue.length > this.maxQueueSize) {\n // Backpressure: emit event; callers should await until queue drains\n this.emit('backpressure', this.queue.length);\n }\n\n this.drainQueue();\n });\n }\n\n private drainQueue(): void {\n for (const aw of this.workers) {\n if (!aw.currentTask) this.dequeue(aw);\n }\n }\n\n private dequeue(aw: ActiveWorker<I, O>): void {\n if (this.queue.length === 0 || aw.currentTask !== null) return;\n const task = this.queue.shift()!;\n aw.currentTask = task;\n aw.worker.postMessage(task.input);\n }\n\n get queueLength(): number { return this.queue.length; }\n get size(): number { return this.workerCount; }\n\n /** Terminate all workers gracefully. */\n async close(): Promise<void> {\n this.closed = true;\n await Promise.all(this.workers.map((aw) => aw.worker.terminate()));\n this.workers = [];\n }\n}\n","/**\n * resolve-phase-parallel.ts — Drop-in parallel replacement for resolve-phase.ts\n *\n * Builds read-only index snapshots (symbolIndex, fileSymbolIndex, fileIndex),\n * shares them with resolve workers via workerData, then distributes one\n * ResolveTask per file across the pool and merges all edge results.\n */\nimport { Worker } from 'node:worker_threads';\nimport path from 'node:path';\nimport os from 'node:os';\nimport fs from 'node:fs';\nimport { fileURLToPath } from 'node:url';\nimport { detectLanguage } from '../../shared/index.js';\nimport type { Phase, PhaseResult, PipelineContext } from '../types.js';\nimport { generateNodeId, generateEdgeId } from '../../graph/id-generator.js';\nimport Logger from '../../shared/logger.js';\nimport type { ResolveSnapshot, ResolveTask, ResolveResult } from './resolve-worker.js';\n\nfunction workerScriptPath(): string {\n const thisFile = fileURLToPath(import.meta.url);\n return path.join(path.dirname(thisFile), 'resolve-worker.js');\n}\n\nexport const resolvePhaseParallel: Phase = {\n name: 'resolve',\n dependencies: ['parse'],\n\n async execute(context: PipelineContext): Promise<PhaseResult> {\n const start = Date.now();\n const { graph, workspaceRoot, filePaths } = context;\n\n const fileCache = context.fileCache ?? new Map<string, string>();\n const fileFunctionIndex = context.fileFunctionIndex ?? new Map<string, { id: string; startLine: number; endLine: number | undefined }[]>();\n\n // ── Build indices ─────────────────────────────────────────────────────────\n const fileIndex: Record<string, string> = {};\n for (const fp of filePaths) {\n const rel = path.relative(workspaceRoot, fp);\n fileIndex[rel] = fp;\n const noExt = rel.replace(/\\.\\w+$/, '');\n if (!fileIndex[noExt]) fileIndex[noExt] = fp;\n const base = path.basename(rel, path.extname(rel));\n if (!fileIndex[base]) fileIndex[base] = fp;\n }\n\n const symbolIndex: Record<string, string> = {};\n const fileSymbolIndex: Record<string, Record<string, string>> = {};\n for (const node of graph.allNodes()) {\n if (['function', 'class', 'interface', 'method', 'enum', 'type_alias', 'variable', 'constant', 'struct', 'trait'].includes(node.kind)) {\n symbolIndex[node.name] = node.id;\n if (!fileSymbolIndex[node.filePath]) fileSymbolIndex[node.filePath] = {};\n fileSymbolIndex[node.filePath][node.name] = node.id;\n }\n }\n\n const snapshot: ResolveSnapshot = { symbolIndex, fileSymbolIndex, fileIndex, workspaceRoot };\n\n // ── Check if worker script exists ─────────────────────────────────────────\n const workerScript = workerScriptPath();\n const workerScriptExists = fs.existsSync(workerScript);\n const workerCount = parseInt(process.env['PARSE_WORKERS'] ?? '', 10) || Math.max(1, os.cpus().length - 1);\n\n if (!workerScriptExists || workerCount === 1) {\n Logger.info(`[resolve-parallel] falling back to sequential`);\n const { resolvePhase } = await import('../phases/resolve-phase.js');\n return resolvePhase.execute(context, new Map());\n }\n\n // ── Build tasks ───────────────────────────────────────────────────────────\n const tasks: ResolveTask[] = [];\n for (const filePath of filePaths) {\n const lang = detectLanguage(filePath);\n if (!lang) continue;\n const source = fileCache.get(filePath);\n if (!source) continue;\n const relativePath = path.relative(workspaceRoot, filePath);\n const fileNodeId = generateNodeId('file', relativePath, relativePath);\n const funcList = fileFunctionIndex.get(relativePath) ?? [];\n tasks.push({ taskId: filePath, filePath, relativePath, fileNodeId, source, funcList });\n }\n\n // ── Spawn resolve workers (pass snapshot via workerData) ──────────────────\n let importEdges = 0;\n let callEdges = 0;\n let heritageEdges = 0;\n let fileDone = 0;\n\n const BATCH_SIZE = 100;\n\n // We spawn one pool of workers sharing the same snapshot via workerData\n // Use a simple Promise-based dispatch (workers are stateless per message)\n const workers: { w: Worker; busy: boolean }[] = [];\n for (let i = 0; i < workerCount; i++) {\n workers.push({ w: new Worker(workerScript, { workerData: snapshot }), busy: false });\n }\n\n const pendingResolvers = new Map<string, (r: ResolveResult) => void>();\n for (const { w } of workers) {\n w.on('message', (result: ResolveResult) => {\n const resolve = pendingResolvers.get(result.taskId);\n if (resolve) { pendingResolvers.delete(result.taskId); resolve(result); }\n });\n w.on('error', (err) => Logger.warn(`[resolve-worker] error: ${err.message}`));\n }\n\n let workerIdx = 0;\n function runTask(task: ResolveTask): Promise<ResolveResult> {\n return new Promise((resolve) => {\n pendingResolvers.set(task.taskId, resolve);\n const { w } = workers[workerIdx % workers.length];\n workerIdx++;\n w.postMessage(task);\n });\n }\n\n const seen = new Set<string>();\n\n for (let i = 0; i < tasks.length; i += BATCH_SIZE) {\n const batch = tasks.slice(i, i + BATCH_SIZE);\n const results = await Promise.all(batch.map((t) => runTask(t)));\n\n for (const res of results) {\n if (res.error) Logger.warn(`[resolve-parallel] task error: ${res.error}`);\n for (const edge of res.edges) {\n if (seen.has(edge.id)) continue;\n seen.add(edge.id);\n graph.addEdge(edge);\n if (edge.kind === 'imports') importEdges++;\n else if (edge.kind === 'calls') callEdges++;\n else heritageEdges++;\n }\n fileDone++;\n context.onPhaseProgress?.('resolve', fileDone, tasks.length);\n }\n }\n\n await Promise.all(workers.map(({ w }) => w.terminate()));\n\n return {\n status: 'completed',\n duration: Date.now() - start,\n message: `Resolved ${importEdges} imports, ${callEdges} calls, ${heritageEdges} heritage edges. Graph: ${graph.size.nodes} nodes, ${graph.size.edges} edges`,\n };\n },\n};\n","export interface Scope {\n name: string;\n kind: 'module' | 'function' | 'block' | 'class';\n parent: Scope | null;\n bindings: Map<string, ScopeBinding>;\n children: Scope[];\n}\n\nexport interface ScopeBinding {\n name: string;\n nodeId: string;\n kind: 'variable' | 'function' | 'class' | 'parameter' | 'import';\n}\n\nexport function createScope(\n name: string,\n kind: Scope['kind'],\n parent: Scope | null = null,\n): Scope {\n const scope: Scope = { name, kind, parent, bindings: new Map(), children: [] };\n parent?.children.push(scope);\n return scope;\n}\n\nexport function resolveBinding(name: string, scope: Scope): ScopeBinding | null {\n let current: Scope | null = scope;\n while (current !== null) {\n const binding = current.bindings.get(name);\n if (binding) return binding;\n current = current.parent;\n }\n return null;\n}\n\nexport function addBinding(scope: Scope, binding: ScopeBinding): void {\n scope.bindings.set(binding.name, binding);\n}\n","import type { CodeNode } from '../shared/index.js';\nimport type { KnowledgeGraph } from '../graph/knowledge-graph.js';\nimport { generateNodeId, generateEdgeId } from '../graph/id-generator.js';\n\nexport interface ClusterResult {\n clusterId: string;\n label: string;\n memberIds: string[];\n}\n\nexport function detectCommunities(graph: KnowledgeGraph): ClusterResult[] {\n // Build adjacency for relevant node kinds\n const relevantKinds = new Set(['function', 'class', 'method', 'interface', 'struct']);\n const nodes: CodeNode[] = [];\n\n for (const node of graph.allNodes()) {\n if (relevantKinds.has(node.kind)) {\n nodes.push(node);\n }\n }\n\n if (nodes.length < 10) return [];\n\n // Group by file directory as simple heuristic clustering\n const dirGroups = new Map<string, CodeNode[]>();\n for (const node of nodes) {\n const dir = node.filePath.split('/').slice(0, -1).join('/') || '.';\n let group = dirGroups.get(dir);\n if (!group) {\n group = [];\n dirGroups.set(dir, group);\n }\n group.push(node);\n }\n\n const clusters: ClusterResult[] = [];\n let idx = 0;\n\n for (const [dir, members] of dirGroups) {\n if (members.length < 2) continue;\n const clusterId = generateNodeId('cluster', dir, `cluster-${idx}`);\n const label = generateLabel(dir, members);\n\n clusters.push({\n clusterId,\n label,\n memberIds: members.map((m) => m.id),\n });\n idx++;\n }\n\n return clusters;\n}\n\nfunction generateLabel(dir: string, members: CodeNode[]): string {\n const parts = dir.split('/').filter(Boolean);\n if (parts.length > 0) {\n return parts[parts.length - 1];\n }\n return `cluster-${members[0]?.name ?? 'unknown'}`;\n}\n\nexport function addClustersToGraph(graph: KnowledgeGraph, clusters: ClusterResult[]): void {\n for (const cluster of clusters) {\n graph.addNode({\n id: cluster.clusterId,\n kind: 'cluster',\n name: cluster.label,\n filePath: '',\n metadata: { memberCount: cluster.memberIds.length },\n });\n\n for (const memberId of cluster.memberIds) {\n graph.addEdge({\n id: generateEdgeId(memberId, cluster.clusterId, 'belongs_to'),\n source: memberId,\n target: cluster.clusterId,\n kind: 'belongs_to',\n weight: 1.0,\n });\n }\n }\n}\n","import type { KnowledgeGraph } from '../graph/knowledge-graph.js';\n\nexport interface EntryPoint {\n nodeId: string;\n name: string;\n score: number;\n filePath: string;\n}\n\nexport function findEntryPoints(graph: KnowledgeGraph): EntryPoint[] {\n const calledNodes = new Set<string>();\n for (const edge of graph.findEdgesByKind('calls')) {\n calledNodes.add(edge.target);\n }\n\n const entryPoints: EntryPoint[] = [];\n\n for (const node of graph.allNodes()) {\n if (!['function', 'method'].includes(node.kind)) continue;\n\n const outEdges = [...graph.findEdgesFrom(node.id)].filter((e) => e.kind === 'calls');\n const inDegree = calledNodes.has(node.id) ? 1 : 0;\n\n let score = 0;\n if (outEdges.length > 0 && inDegree === 0) score += 10;\n if (node.exported) score += 5;\n if (/^(main|handle|init|start|run|execute|process|serve|listen)/.test(node.name)) score += 3;\n if (node.filePath.includes('test') || node.filePath.includes('spec')) score -= 20;\n if (node.filePath.includes('route') || node.filePath.includes('controller')) score += 8;\n\n if (score >= 5) {\n entryPoints.push({\n nodeId: node.id,\n name: node.name,\n score,\n filePath: node.filePath,\n });\n }\n }\n\n return entryPoints.sort((a, b) => b.score - a.score);\n}\n\nexport interface FlowTrace {\n entryPointId: string;\n steps: string[];\n}\n\nexport function traceFlow(\n entryId: string,\n graph: KnowledgeGraph,\n maxDepth = 10,\n maxBranching = 4,\n): FlowTrace[] {\n const flows: FlowTrace[] = [];\n const maxFlows = 75;\n\n function bfs(): void {\n const queue: { nodeId: string; path: string[] }[] = [{ nodeId: entryId, path: [entryId] }];\n const visited = new Set<string>();\n\n while (queue.length > 0 && flows.length < maxFlows) {\n const { nodeId, path } = queue.shift()!;\n if (path.length > maxDepth) continue;\n\n const callEdges = [...graph.findEdgesFrom(nodeId)]\n .filter((e) => e.kind === 'calls')\n .slice(0, maxBranching);\n\n if (callEdges.length === 0 && path.length >= 3) {\n flows.push({ entryPointId: entryId, steps: [...path] });\n continue;\n }\n\n for (const edge of callEdges) {\n if (visited.has(edge.target)) continue;\n visited.add(edge.target);\n queue.push({ nodeId: edge.target, path: [...path, edge.target] });\n }\n }\n }\n\n bfs();\n return deduplicateFlows(flows);\n}\n\nfunction deduplicateFlows(flows: FlowTrace[]): FlowTrace[] {\n const result: FlowTrace[] = [];\n\n for (const flow of flows) {\n const edges = new Set<string>();\n for (let i = 0; i < flow.steps.length - 1; i++) {\n edges.add(`${flow.steps[i]}->${flow.steps[i + 1]}`);\n }\n\n const isDuplicate = result.some((existing) => {\n const existingEdges = new Set<string>();\n for (let i = 0; i < existing.steps.length - 1; i++) {\n existingEdges.add(`${existing.steps[i]}->${existing.steps[i + 1]}`);\n }\n let overlap = 0;\n for (const e of edges) {\n if (existingEdges.has(e)) overlap++;\n }\n return overlap / Math.max(edges.size, 1) > 0.7;\n });\n\n if (!isDuplicate) result.push(flow);\n }\n\n return result;\n}\n","import type { KnowledgeGraph } from '../graph/knowledge-graph.js';\n\nexport interface SearchResult {\n nodeId: string;\n name: string;\n kind: string;\n filePath: string;\n score: number;\n snippet?: string;\n}\n\nexport function textSearch(\n graph: KnowledgeGraph,\n query: string,\n limit = 20,\n): SearchResult[] {\n const terms = query.toLowerCase().split(/\\s+/).filter(Boolean);\n const results: SearchResult[] = [];\n\n // Deprioritize test/dist paths\n const isTestPath = (fp: string) =>\n fp.includes('test') || fp.includes('spec') || fp.includes('__test');\n const isDistPath = (fp: string) =>\n fp.includes('/dist') || fp.includes('\\\\dist') || fp.includes('.d.ts');\n\n for (const node of graph.allNodes()) {\n if (['directory', 'cluster', 'flow'].includes(node.kind)) continue;\n\n let score = 0;\n const nameLC = node.name.toLowerCase();\n const pathLC = node.filePath.toLowerCase();\n\n for (const term of terms) {\n if (nameLC === term) score += 10;\n else if (nameLC.startsWith(term)) score += 7;\n else if (nameLC.includes(term)) score += 5;\n if (pathLC.includes(term)) score += 2;\n if (node.content?.toLowerCase().includes(term)) score += 3;\n }\n\n // Boost source files over compiled/test files\n if (score > 0) {\n if (isDistPath(node.filePath)) score -= 8;\n if (isTestPath(node.filePath)) score -= 4;\n // Boost by kind relevance\n if (['function', 'class', 'interface', 'method'].includes(node.kind)) score += 1;\n }\n\n if (score > 0) {\n results.push({\n nodeId: node.id,\n name: node.name,\n kind: node.kind,\n filePath: node.filePath,\n score,\n snippet: node.content?.slice(0, 200),\n });\n }\n }\n\n results.sort((a, b) => b.score - a.score);\n return results.slice(0, limit);\n}\n\nexport function reciprocalRankFusion(\n ...rankings: SearchResult[][]\n): SearchResult[] {\n const K = 60;\n const scoreMap = new Map<string, { result: SearchResult; rrfScore: number }>();\n\n for (const ranking of rankings) {\n for (let rank = 0; rank < ranking.length; rank++) {\n const result = ranking[rank];\n const existing = scoreMap.get(result.nodeId);\n const rrfContribution = 1 / (K + rank + 1);\n\n if (existing) {\n existing.rrfScore += rrfContribution;\n } else {\n scoreMap.set(result.nodeId, {\n result,\n rrfScore: rrfContribution,\n });\n }\n }\n }\n\n return [...scoreMap.values()]\n .sort((a, b) => b.rrfScore - a.rrfScore)\n .map((entry) => ({ ...entry.result, score: entry.rrfScore }));\n}\n","export { textSearch, reciprocalRankFusion } from './text-search.js';\nexport type { SearchResult } from './text-search.js';\nexport { embedNodes, getEmbedder, buildText } from './embedder.js';\nexport type { EmbeddedNode } from './embedder.js';\nexport { VectorIndex } from './vector-index.js';\nexport type { VectorHit } from './vector-index.js';\nexport { hybridSearch } from './hybrid-search.js';\nexport type { HybridSearchOptions, HybridSearchResult } from './hybrid-search.js';\n\n","/**\n * VectorIndex — flat embedding store backed by better-sqlite3 with JS cosine similarity.\n *\n * Performance choices:\n * - Embeddings are stored as raw BLOB (Float32Array binary) — 4× smaller than JSON TEXT\n * and ~10× faster to deserialize (no JSON.parse, just Buffer.from → Float32Array).\n * - After buildIndex() / init(), embeddings are cached as Float32Array in memory so\n * search() is a pure in-process SIMD-friendly loop — no disk I/O per query.\n * - buildIndex() runs all inserts inside a single SQLite transaction.\n * - Batch embedding in embedder.ts (batchSize=64) reduces HuggingFace pipeline calls.\n */\nimport Database from 'better-sqlite3';\nimport type { EmbeddedNode } from './embedder.js';\n\nconst EMBED_TABLE = 'embed_nodes';\nconst EMBED_DIM = 384;\n\ninterface CachedRow {\n nodeId: string;\n name: string;\n kind: string;\n filePath: string;\n embedding: Float32Array;\n}\n\nexport class VectorIndex {\n private sqlitePath: string;\n private db: Database.Database | null = null;\n /** In-memory cache — populated after buildIndex() or first search() */\n private cache: CachedRow[] | null = null;\n\n constructor(sqlitePath: string) {\n this.sqlitePath = sqlitePath;\n }\n\n async init(): Promise<void> {\n this.db = new Database(this.sqlitePath);\n // WAL mode: faster writes, concurrent reads\n this.db.pragma('journal_mode = WAL');\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS ${EMBED_TABLE} (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n kind TEXT NOT NULL,\n file_path TEXT NOT NULL,\n text TEXT NOT NULL,\n embedding BLOB NOT NULL\n )\n `);\n }\n\n async buildIndex(nodes: EmbeddedNode[]): Promise<void> {\n if (!this.db) throw new Error('VectorIndex not initialized');\n\n this.db.exec(`DELETE FROM ${EMBED_TABLE}`);\n\n const stmt = this.db.prepare(`\n INSERT INTO ${EMBED_TABLE} (id, name, kind, file_path, text, embedding)\n VALUES (@id, @name, @kind, @filePath, @text, @embedding)\n `);\n\n // Single transaction for all inserts — dramatically faster than auto-commit\n const insertMany = this.db.transaction((items: EmbeddedNode[]) => {\n for (const node of items) {\n stmt.run({\n id: node.id,\n name: node.name,\n kind: node.kind,\n filePath: node.filePath,\n text: node.text,\n // Store as packed Float32 bytes — 4× smaller than JSON, no parse overhead\n embedding: Buffer.from(new Float32Array(node.embedding).buffer),\n });\n }\n });\n insertMany(nodes);\n\n // Populate in-memory cache immediately after building\n this.cache = nodes.map((n) => ({\n nodeId: n.id,\n name: n.name,\n kind: n.kind,\n filePath: n.filePath,\n embedding: new Float32Array(n.embedding),\n }));\n }\n\n async search(queryEmbedding: number[], topK = 10): Promise<VectorHit[]> {\n if (!this.db) throw new Error('VectorIndex not initialized');\n\n // Populate cache on first search if buildIndex() wasn't called this session\n if (!this.cache) {\n this.cache = this._loadCache();\n }\n\n const query = new Float32Array(queryEmbedding);\n const qNorm = norm(query);\n\n const scored: { hit: VectorHit; score: number }[] = this.cache.map((row) => ({\n hit: {\n nodeId: row.nodeId,\n name: row.name,\n kind: row.kind,\n filePath: row.filePath,\n score: 0,\n },\n score: dotProduct(query, row.embedding) / (qNorm * norm(row.embedding) || 1),\n }));\n\n // Partial sort: only need top-K (O(n log k) vs O(n log n))\n return topKSort(scored, topK).map((s) => ({ ...s.hit, score: s.score }));\n }\n\n async isBuilt(): Promise<boolean> {\n if (!this.db) return false;\n try {\n const row = this.db\n .prepare(`SELECT count(*) AS cnt FROM ${EMBED_TABLE}`)\n .get() as { cnt: number };\n return Number(row.cnt) > 0;\n } catch {\n return false;\n }\n }\n\n close(): void {\n this.cache = null;\n try { this.db?.close(); } catch { /* ignore */ }\n this.db = null;\n }\n\n // ── private ────────────────────────────────────────────────────────────────\n\n private _loadCache(): CachedRow[] {\n const rows = this.db!\n .prepare(`SELECT id, name, kind, file_path, embedding FROM ${EMBED_TABLE}`)\n .all() as { id: string; name: string; kind: string; file_path: string; embedding: Buffer }[];\n\n return rows.map((row) => ({\n nodeId: row.id,\n name: row.name,\n kind: row.kind,\n filePath: row.file_path,\n embedding: new Float32Array(row.embedding.buffer, row.embedding.byteOffset, EMBED_DIM),\n }));\n }\n}\n\nexport interface VectorHit {\n nodeId: string;\n name: string;\n kind: string;\n filePath: string;\n score: number; // 0..1 where 1 = most similar\n}\n\n// ── Math helpers (Float32Array — faster than number[]) ──────────────────────\n\nfunction dotProduct(a: Float32Array, b: Float32Array): number {\n let dot = 0;\n for (let i = 0; i < a.length; i++) dot += a[i] * b[i];\n return dot;\n}\n\nfunction norm(a: Float32Array): number {\n let n = 0;\n for (let i = 0; i < a.length; i++) n += a[i] * a[i];\n return Math.sqrt(n);\n}\n\n/** O(n·k) partial sort — much faster than full sort when topK << n */\nfunction topKSort<T>(items: T[], k: number, score: (t: T) => number = (t: any) => t.score): T[] {\n if (items.length <= k) return items.sort((a, b) => score(b) - score(a));\n // Simple max-heap approach: maintain a min-heap of size k\n const heap: T[] = [];\n for (const item of items) {\n if (heap.length < k) {\n heap.push(item);\n if (heap.length === k) heapify(heap, score);\n } else if (score(item) > score(heap[0])) {\n heap[0] = item;\n siftDown(heap, 0, score);\n }\n }\n return heap.sort((a, b) => score(b) - score(a));\n}\n\nfunction heapify<T>(arr: T[], score: (t: T) => number): void {\n for (let i = Math.floor(arr.length / 2) - 1; i >= 0; i--) siftDown(arr, i, score);\n}\n\nfunction siftDown<T>(arr: T[], i: number, score: (t: T) => number): void {\n const n = arr.length;\n while (true) {\n let min = i;\n const l = 2 * i + 1, r = 2 * i + 2;\n if (l < n && score(arr[l]) < score(arr[min])) min = l;\n if (r < n && score(arr[r]) < score(arr[min])) min = r;\n if (min === i) break;\n [arr[i], arr[min]] = [arr[min], arr[i]];\n i = min;\n }\n}\n","import fs from 'node:fs';\nimport type { KnowledgeGraph } from '../graph/knowledge-graph.js';\nimport { textSearch, reciprocalRankFusion } from './text-search.js';\nimport type { SearchResult } from './text-search.js';\nimport { VectorIndex } from './vector-index.js';\nimport { getEmbedder } from './embedder.js';\n\nexport interface HybridSearchOptions {\n vectorDbPath?: string; // path to vector.db; if absent → BM25 only\n bm25Limit?: number; // results to fetch from BM25 before RRF (default: 50)\n vectorLimit?: number; // results to fetch from vector before RRF (default: 50)\n}\n\nexport interface HybridSearchResult {\n nodeId: string;\n name: string;\n kind: string;\n filePath: string;\n score: number;\n snippet?: string;\n searchMode: 'bm25' | 'vector' | 'hybrid';\n}\n\nexport async function hybridSearch(\n graph: KnowledgeGraph,\n query: string,\n limit: number,\n options: HybridSearchOptions = {},\n): Promise<{ results: HybridSearchResult[]; searchMode: 'bm25' | 'vector' | 'hybrid' }> {\n const { vectorDbPath, bm25Limit = 50, vectorLimit = 50 } = options;\n\n // Always run BM25 search\n const bm25Promise = Promise.resolve(textSearch(graph, query, bm25Limit));\n\n // Determine if vector search is available\n const hasVectorDb = Boolean(vectorDbPath && fs.existsSync(vectorDbPath));\n\n if (!hasVectorDb) {\n // BM25-only path\n const bm25Results = await bm25Promise;\n return {\n results: bm25Results.slice(0, limit).map((r) => ({ ...r, searchMode: 'bm25' as const })),\n searchMode: 'bm25',\n };\n }\n\n // Run BM25 + vector search in parallel\n const vectorPromise = runVectorSearch(vectorDbPath!, query, vectorLimit);\n const [bm25Results, vectorResults] = await Promise.all([bm25Promise, vectorPromise]);\n\n if (vectorResults === null || vectorResults.length === 0) {\n // Vector search failed or returned nothing — fall back to BM25\n return {\n results: bm25Results.slice(0, limit).map((r) => ({ ...r, searchMode: 'bm25' as const })),\n searchMode: 'bm25',\n };\n }\n\n // Convert vector hits to SearchResult format for RRF\n const vectorAsSearchResults: SearchResult[] = vectorResults.map((h) => ({\n nodeId: h.nodeId,\n name: h.name,\n kind: h.kind,\n filePath: h.filePath,\n score: h.score,\n snippet: graph.getNode(h.nodeId)?.content?.slice(0, 200),\n }));\n\n // Merge with Reciprocal Rank Fusion\n const merged = reciprocalRankFusion(bm25Results, vectorAsSearchResults);\n\n return {\n results: merged.slice(0, limit).map((r) => ({ ...r, searchMode: 'hybrid' as const })),\n searchMode: 'hybrid',\n };\n}\n\n/**\n * Run vector search against the given db path. Returns null on any error so\n * the caller can fall back gracefully to BM25-only results.\n */\nasync function runVectorSearch(\n vectorDbPath: string,\n query: string,\n topK: number,\n): Promise<Array<{ nodeId: string; name: string; kind: string; filePath: string; score: number }> | null> {\n try {\n const idx = new VectorIndex(vectorDbPath);\n await idx.init();\n\n const built = await idx.isBuilt();\n if (!built) {\n idx.close();\n return null;\n }\n\n // Embed the query using the same model used for node embeddings\n const embedder = await getEmbedder();\n const out = await embedder(query, { pooling: 'mean', normalize: true });\n const queryEmbedding = Array.from(out.data);\n\n const hits = await idx.search(queryEmbedding, topK);\n idx.close();\n return hits;\n } catch {\n return null;\n }\n}\n","import { Database, Connection } from '@ladybugdb/core';\nimport path from 'node:path';\nimport fs from 'node:fs';\n\nexport class DbManager {\n private db: InstanceType<typeof Database> | null = null;\n private conn: InstanceType<typeof Connection> | null = null;\n private dbPath: string;\n\n constructor(dbPath: string) {\n this.dbPath = dbPath;\n }\n\n async init(): Promise<void> {\n fs.mkdirSync(path.dirname(this.dbPath), { recursive: true });\n this.db = new Database(this.dbPath);\n await this.db.init();\n this.conn = new Connection(this.db);\n await this.conn.init();\n }\n\n async query(cypher: string): Promise<Record<string, unknown>[]> {\n if (!this.conn) throw new Error('Database not initialized');\n const result = await this.conn.query(cypher);\n const qr = Array.isArray(result) ? result[0] : result;\n const rows = await qr.getAll();\n qr.close();\n return rows as Record<string, unknown>[];\n }\n\n async execute(cypher: string): Promise<void> {\n if (!this.conn) throw new Error('Database not initialized');\n const result = await this.conn.query(cypher);\n const qr = Array.isArray(result) ? result[0] : result;\n qr.close();\n }\n\n close(): void {\n // Use closeSync() so the DB flushes/checkpoints to disk before returning.\n // Calling the async close() without await causes a 60-90s delay at process\n // exit as Node waits for the pending flush promises to resolve.\n try {\n this.conn?.closeSync();\n } catch { /* ignore */ }\n try {\n this.db?.closeSync();\n } catch { /* ignore */ }\n this.conn = null;\n this.db = null;\n }\n\n get isOpen(): boolean {\n return this.conn !== null;\n }\n}\n","import type { NodeKind } from '../shared/index.js';\n\nexport const NODE_TABLE_MAP: Record<NodeKind, string> = {\n file: 'file_nodes',\n directory: 'dir_nodes',\n function: 'func_nodes',\n class: 'class_nodes',\n interface: 'iface_nodes',\n method: 'method_nodes',\n constructor: 'ctor_nodes',\n variable: 'var_nodes',\n property: 'prop_nodes',\n struct: 'struct_nodes',\n enum: 'enum_nodes',\n trait: 'trait_nodes',\n namespace: 'ns_nodes',\n module: 'mod_nodes',\n type_alias: 'type_nodes',\n constant: 'const_nodes',\n route: 'route_nodes',\n cluster: 'cluster_nodes',\n flow: 'flow_nodes',\n};\n\nexport const ALL_NODE_TABLES = [...new Set(Object.values(NODE_TABLE_MAP))];\n\nexport function getCreateNodeTableDDL(tableName: string): string {\n return `CREATE NODE TABLE IF NOT EXISTS ${tableName} (\n id STRING,\n name STRING,\n file_path STRING,\n start_line INT64,\n end_line INT64,\n exported BOOLEAN,\n content STRING,\n metadata STRING,\n PRIMARY KEY (id)\n)`;\n}\n\nexport function getCreateEdgeTableDDL(): string[] {\n const uniqueTables = ALL_NODE_TABLES;\n\n // Create edge table group connecting all node table pairs.\n // REL TABLE GROUP supports multiple FROM-TO pairs without duplicate errors,\n // and allows per-pair COPY: COPY code_edges FROM '...' (HEADER=TRUE, FROM='x', TO='y')\n const fromToPairs: string[] = [];\n for (const from of uniqueTables) {\n for (const to of uniqueTables) {\n fromToPairs.push(`FROM ${from} TO ${to}`);\n }\n }\n\n return [`CREATE REL TABLE GROUP IF NOT EXISTS code_edges (\n ${fromToPairs.join(',\\n ')},\n kind STRING,\n weight DOUBLE,\n label STRING\n)`];\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport type { CodeNode, CodeEdge } from '../shared/index.js';\nimport type { KnowledgeGraph } from '../graph/knowledge-graph.js';\nimport { NODE_TABLE_MAP } from './schema.js';\n\n/**\n * Write per-node-table CSV files synchronously.\n * Returns a Map of tableName → absolute file path.\n *\n * Content and metadata fields have actual newlines escaped to the 2-char\n * sequence `\\n` (backslash + n) before writing. This avoids LadybugDB's\n * PARALLEL=FALSE CSV reader bug where quoted fields spanning multiple lines\n * are mis-parsed when they contain no `\"\"` escapes — causing \"expected N\n * values per row, but got N-1\" errors for code with embedded newlines.\n */\nexport function writeNodeCSVs(graph: KnowledgeGraph, outputDir: string): Map<string, string> {\n fs.mkdirSync(outputDir, { recursive: true });\n\n const header = 'id,name,file_path,start_line,end_line,exported,content,metadata\\n';\n const tableBuffers = new Map<string, string[]>();\n const tableFilePaths = new Map<string, string>();\n\n for (const node of graph.allNodes()) {\n const table = NODE_TABLE_MAP[node.kind];\n if (!tableBuffers.has(table)) {\n tableBuffers.set(table, [header]);\n tableFilePaths.set(table, path.join(outputDir, `${table}.csv`));\n }\n tableBuffers.get(table)!.push(\n csvRow([\n node.id,\n node.name,\n node.filePath,\n String(node.startLine ?? ''),\n String(node.endLine ?? ''),\n String(node.exported ?? false),\n // Escape embedded newlines so the CSV never contains multi-line\n // quoted fields. LadybugDB PARALLEL=FALSE has a bug where it\n // mis-parses quoted fields with embedded newlines that contain no\n // internal \"\" sequences (treating them as truncated records).\n escapeNewlines((node.content ?? '').slice(0, 1000)),\n node.metadata ? escapeNewlines(JSON.stringify(node.metadata)) : '',\n ]) + '\\n',\n );\n }\n\n for (const [table, lines] of tableBuffers) {\n fs.writeFileSync(tableFilePaths.get(table)!, lines.join(''), 'utf-8');\n }\n\n return tableFilePaths;\n}\n\nexport interface EdgeCSVGroup {\n fromTable: string;\n toTable: string;\n filePath: string;\n}\n\n/**\n * Write per-edge-group CSV files synchronously.\n * Returns an array of EdgeCSVGroup descriptors.\n */\nexport function writeEdgeCSV(graph: KnowledgeGraph, outputDir: string): EdgeCSVGroup[] {\n fs.mkdirSync(outputDir, { recursive: true });\n\n const header = 'from_id,to_id,kind,weight,label\\n';\n const groups = new Map<string, { lines: string[]; from: string; to: string; filePath: string }>();\n\n for (const edge of graph.allEdges()) {\n const sourceNode = graph.getNode(edge.source);\n const targetNode = graph.getNode(edge.target);\n if (!sourceNode || !targetNode) continue;\n\n const fromTable = NODE_TABLE_MAP[sourceNode.kind];\n const toTable = NODE_TABLE_MAP[targetNode.kind];\n const key = `${fromTable}->${toTable}`;\n\n if (!groups.has(key)) {\n const filePath = path.join(outputDir, `edges_${fromTable}_${toTable}.csv`);\n groups.set(key, { lines: [header], from: fromTable, to: toTable, filePath });\n }\n\n groups.get(key)!.lines.push(\n csvRow([\n edge.source,\n edge.target,\n edge.kind,\n String(edge.weight ?? 1.0),\n edge.label ?? '',\n ]) + '\\n',\n );\n }\n\n const result: EdgeCSVGroup[] = [];\n for (const group of groups.values()) {\n fs.writeFileSync(group.filePath, group.lines.join(''), 'utf-8');\n result.push({ fromTable: group.from, toTable: group.to, filePath: group.filePath });\n }\n\n return result;\n}\n\nfunction csvRow(fields: string[]): string {\n return fields.map((f) => {\n if (f.includes(',') || f.includes('\"') || f.includes('\\n')) {\n return '\"' + f.replace(/\"/g, '\"\"') + '\"';\n }\n return f;\n }).join(',');\n}\n\n/**\n * Escape literal newlines (LF and CR) to the two-character sequences `\\n`\n * and `\\r`. This prevents multi-line quoted CSV fields, which LadybugDB's\n * sequential CSV reader (PARALLEL=FALSE) mis-parses under certain conditions:\n * if a quoted field contains a raw newline but no `\"\"` sequences the reader\n * occasionally treats the line break as a record separator and produces\n * \"expected N values per row, but got N-1\" errors.\n *\n * Callers that need to read the value back can unescape with:\n * value.replace(/\\\\n/g, '\\n').replace(/\\\\r/g, '\\r')\n */\nfunction escapeNewlines(s: string): string {\n // Only do the work when actually needed — avoids churning the string\n // for the common case (short names, file paths, metadata without newlines).\n if (!s.includes('\\n') && !s.includes('\\r')) return s;\n return s.replace(/\\r/g, '\\\\r').replace(/\\n/g, '\\\\n');\n}\n","import fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport type { KnowledgeGraph } from '../graph/knowledge-graph.js';\nimport { DbManager } from './db-manager.js';\nimport { ALL_NODE_TABLES, getCreateNodeTableDDL, getCreateEdgeTableDDL, NODE_TABLE_MAP } from './schema.js';\nimport type { CodeNode } from '../shared/index.js';\nimport { writeNodeCSVs, writeEdgeCSV } from './csv-writer.js';\n\n// ─── loadGraphToDB — bulk CSV COPY (fast path) ────────────────────────────────\n\n/**\n * Load graph into DB using bulk CSV COPY — dramatically faster than\n * individual CREATE statements (10-100× speedup for large repos).\n *\n * Strategy:\n * 1. Create tables\n * 2. Write all nodes to per-table CSV files in a temp dir\n * 3. Write all edges to per-fromTable→toTable CSV files\n * 4. COPY each CSV file into the corresponding table\n * 5. Clean up temp dir\n *\n * Falls back to individual CREATE statements per table if COPY fails.\n */\nexport async function loadGraphToDB(\n graph: KnowledgeGraph,\n dbManager: DbManager,\n): Promise<{ nodeCount: number; edgeCount: number }> {\n // Create all node tables\n for (const table of ALL_NODE_TABLES) {\n await dbManager.execute(getCreateNodeTableDDL(table));\n }\n\n // Create edge table\n const edgeDDLs = getCreateEdgeTableDDL();\n for (const ddl of edgeDDLs) {\n try {\n await dbManager.execute(ddl);\n } catch {\n // Edge table with all pairs might fail — ignore\n }\n }\n\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'code-intel-csv-'));\n\n try {\n // ── Write CSVs (synchronous) ────────────────────────────────────────────\n const nodeTableFiles = writeNodeCSVs(graph, tmpDir);\n const edgeGroups = writeEdgeCSV(graph, tmpDir);\n\n // Pre-compute per-table node counts and per-group edge counts from the in-memory graph.\n const tableNodeCounts = new Map<string, number>();\n for (const node of graph.allNodes()) {\n const t = NODE_TABLE_MAP[node.kind];\n tableNodeCounts.set(t, (tableNodeCounts.get(t) ?? 0) + 1);\n }\n const edgeGroupCounts = new Map<string, number>();\n for (const edge of graph.allEdges()) {\n const src = graph.getNode(edge.source);\n const tgt = graph.getNode(edge.target);\n if (!src || !tgt) continue;\n const key = `${NODE_TABLE_MAP[src.kind]}->${NODE_TABLE_MAP[tgt.kind]}`;\n edgeGroupCounts.set(key, (edgeGroupCounts.get(key) ?? 0) + 1);\n }\n\n // ── COPY nodes ──────────────────────────────────────────────────────────\n // PARALLEL=FALSE is required because node `content` fields contain real source\n // code with embedded newlines, which the parallel CSV reader does not support.\n // Newlines are escaped to \\n literals in the CSV (see csv-writer.ts) to prevent\n // LadybugDB's sequential reader from mis-parsing quoted multi-line fields.\n let nodeCount = 0;\n for (const [table, csvPath] of nodeTableFiles) {\n if (!fs.existsSync(csvPath)) continue;\n const stat = fs.statSync(csvPath);\n // Skip empty CSV files (only header line ≈ <50 bytes)\n if (stat.size < 50) continue;\n try {\n await dbManager.execute(\n `COPY ${table} FROM '${csvPath.replace(/\\\\/g, '/')}' (HEADER=TRUE, PARALLEL=FALSE)`,\n );\n nodeCount += tableNodeCounts.get(table) ?? 0;\n } catch {\n // Fall back to individual inserts for this table\n nodeCount += await loadTableFallback(graph, table, dbManager);\n }\n }\n\n // ── COPY edges ──────────────────────────────────────────────────────────\n let edgeCount = 0;\n for (const group of edgeGroups) {\n if (!fs.existsSync(group.filePath)) continue;\n const stat = fs.statSync(group.filePath);\n if (stat.size < 50) continue;\n try {\n await dbManager.execute(\n `COPY code_edges FROM '${group.filePath.replace(/\\\\/g, '/')}' (HEADER=TRUE, PARALLEL=FALSE, FROM='${group.fromTable}', TO='${group.toTable}')`,\n );\n edgeCount += edgeGroupCounts.get(`${group.fromTable}->${group.toTable}`) ?? 0;\n } catch {\n // Fall back to per-edge inserts for this group\n edgeCount += await loadEdgeGroupFallback(graph, group.fromTable, group.toTable, dbManager);\n }\n }\n\n return { nodeCount, edgeCount };\n } finally {\n try { fs.rmSync(tmpDir, { recursive: true, force: true }); } catch { /* ignore */ }\n }\n}\n\n// ─── Fallback helpers ─────────────────────────────────────────────────────────\n\nasync function loadTableFallback(\n graph: KnowledgeGraph,\n table: string,\n dbManager: DbManager,\n): Promise<number> {\n let count = 0;\n for (const node of graph.allNodes()) {\n if (NODE_TABLE_MAP[node.kind] !== table) continue;\n const props = buildNodeProps(node);\n try {\n await dbManager.execute(`CREATE (:${table} ${props})`);\n count++;\n } catch { /* skip duplicate */ }\n }\n return count;\n}\n\nasync function loadEdgeGroupFallback(\n graph: KnowledgeGraph,\n fromTable: string,\n toTable: string,\n dbManager: DbManager,\n): Promise<number> {\n let count = 0;\n for (const edge of graph.allEdges()) {\n const sourceNode = graph.getNode(edge.source);\n const targetNode = graph.getNode(edge.target);\n if (!sourceNode || !targetNode) continue;\n if (NODE_TABLE_MAP[sourceNode.kind] !== fromTable) continue;\n if (NODE_TABLE_MAP[targetNode.kind] !== toTable) continue;\n try {\n await dbManager.execute(\n `MATCH (a:${fromTable} {id: '${escCypher(edge.source)}'}), (b:${toTable} {id: '${escCypher(edge.target)}'}) ` +\n `CREATE (a)-[:code_edges {kind: '${edge.kind}', weight: ${edge.weight ?? 1.0}, label: '${escCypher(edge.label ?? '')}'}]->(b)`,\n );\n count++;\n } catch { /* skip */ }\n }\n return count;\n}\n\n// ─── Upsert helpers (incremental indexing) ────────────────────────────────────\n\n/**\n * Upsert a single node: DELETE existing node with same id then re-CREATE.\n * KùzuDB does not have MERGE, so we simulate it with DELETE + CREATE.\n */\nexport async function upsertNode(node: CodeNode, dbManager: DbManager): Promise<void> {\n const table = NODE_TABLE_MAP[node.kind];\n const props = buildNodeProps(node);\n try {\n await dbManager.execute(`MATCH (n:${table} {id: '${escCypher(node.id)}'}) DELETE n`);\n } catch { /* Node may not exist — ignore */ }\n try {\n await dbManager.execute(`CREATE (:${table} ${props})`);\n } catch { /* Skip on error */ }\n}\n\n/**\n * Upsert a batch of nodes (max 100 per transaction for performance).\n */\nexport async function upsertNodes(nodes: CodeNode[], dbManager: DbManager): Promise<number> {\n let count = 0;\n const BATCH = 100;\n for (let i = 0; i < nodes.length; i += BATCH) {\n const batch = nodes.slice(i, i + BATCH);\n await Promise.all(batch.map((n) => upsertNode(n, dbManager)));\n count += batch.length;\n }\n return count;\n}\n\n/**\n * Remove all nodes (and their edges) for a given file path.\n */\nexport async function removeNodesForFile(filePath: string, dbManager: DbManager): Promise<void> {\n const escaped = escCypher(filePath);\n for (const table of ALL_NODE_TABLES) {\n try {\n await dbManager.execute(\n `MATCH (n:${table}) WHERE n.file_path = '${escaped}' DETACH DELETE n`,\n );\n } catch { /* Table may not exist — ignore */ }\n }\n}\n\n/**\n * Remove all edges whose source or target node has the given file_path.\n */\nexport async function removeEdgesForFile(filePath: string, dbManager: DbManager): Promise<void> {\n const escaped = escCypher(filePath);\n try {\n await dbManager.execute(\n `MATCH (a)-[e:code_edges]->(b) WHERE a.file_path = '${escaped}' OR b.file_path = '${escaped}' DELETE e`,\n );\n } catch { /* Edges table may not exist — ignore */ }\n}\n\n// ─── Private helpers ──────────────────────────────────────────────────────────\n\nfunction buildNodeProps(node: CodeNode): string {\n const parts: string[] = [\n `id: '${escCypher(node.id)}'`,\n `name: '${escCypher(node.name)}'`,\n `file_path: '${escCypher(node.filePath)}'`,\n ];\n if (node.startLine !== undefined) parts.push(`start_line: ${node.startLine}`);\n if (node.endLine !== undefined) parts.push(`end_line: ${node.endLine}`);\n if (node.exported !== undefined) parts.push(`exported: ${node.exported}`);\n if (node.content) parts.push(`content: '${escCypher(node.content.slice(0, 500))}'`);\n if (node.metadata) parts.push(`metadata: '${escCypher(JSON.stringify(node.metadata))}'`);\n return `{${parts.join(', ')}}`;\n}\n\nfunction escCypher(s: string): string {\n return s.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\").replace(/\\n/g, '\\\\n').replace(/\\r/g, '');\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\n\nexport interface RepoEntry {\n name: string;\n path: string;\n indexedAt: string;\n stats: { nodes: number; edges: number; files: number };\n}\n\nconst GLOBAL_DIR = path.join(os.homedir(), '.code-intel');\nconst REPOS_FILE = path.join(GLOBAL_DIR, 'repos.json');\n\nexport function loadRegistry(): RepoEntry[] {\n try {\n const data = fs.readFileSync(REPOS_FILE, 'utf-8');\n return JSON.parse(data);\n } catch {\n return [];\n }\n}\n\nexport function saveRegistry(entries: RepoEntry[]): void {\n fs.mkdirSync(GLOBAL_DIR, { recursive: true });\n fs.writeFileSync(REPOS_FILE, JSON.stringify(entries, null, 2));\n}\n\nexport function upsertRepo(entry: RepoEntry): void {\n const entries = loadRegistry();\n const idx = entries.findIndex((e) => e.path === entry.path);\n if (idx >= 0) {\n entries[idx] = entry;\n } else {\n entries.push(entry);\n }\n saveRegistry(entries);\n}\n\nexport function removeRepo(repoPath: string): void {\n const entries = loadRegistry().filter((e) => e.path !== repoPath);\n saveRegistry(entries);\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nexport interface IndexMetadata {\n indexedAt: string;\n indexVersion?: string; // UUID, bumped on every successful analysis\n commitHash?: string;\n /** Parser used during analysis: 'tree-sitter' | 'regex' */\n parser?: 'tree-sitter' | 'regex';\n /** mtime (ms since epoch) for each indexed file path (relative to workspace root) */\n lastAnalyzedMtimes?: Record<string, number>;\n stats: {\n nodes: number;\n edges: number;\n files: number;\n duration: number;\n };\n}\n\nexport function saveMetadata(repoDir: string, metadata: IndexMetadata): void {\n const metaDir = path.join(repoDir, '.code-intel');\n fs.mkdirSync(metaDir, { recursive: true });\n fs.writeFileSync(path.join(metaDir, 'meta.json'), JSON.stringify(metadata, null, 2));\n}\n\nexport function loadMetadata(repoDir: string): IndexMetadata | null {\n try {\n const data = fs.readFileSync(path.join(repoDir, '.code-intel', 'meta.json'), 'utf-8');\n return JSON.parse(data);\n } catch {\n return null;\n }\n}\n\nexport function getDbPath(repoDir: string): string {\n return path.join(repoDir, '.code-intel', 'graph.db');\n}\n\nexport function getVectorDbPath(repoDir: string): string {\n return path.join(repoDir, '.code-intel', 'vector.db');\n}\n","import { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n ListResourcesRequestSchema,\n ReadResourceRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js';\nimport type { KnowledgeGraph } from '../graph/knowledge-graph.js';\nimport { textSearch } from '../search/text-search.js';\nimport { hybridSearch } from '../search/hybrid-search.js';\nimport { getVectorDbPath } from '../storage/index.js';\nimport { loadRegistry } from '../storage/repo-registry.js';\nimport { loadMetadata } from '../storage/metadata.js';\nimport {\n listGroups,\n loadGroup,\n saveGroup,\n loadSyncResult,\n saveSyncResult,\n} from '../multi-repo/group-registry.js';\nimport { syncGroup } from '../multi-repo/group-sync.js';\nimport { queryGroup } from '../multi-repo/group-query.js';\nimport { execSync } from 'node:child_process';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { withSpan, isTracingEnabled, sanitizeAttrs } from '../observability/tracing.js';\nimport { mcpToolCallsTotal, mcpToolDurationSeconds } from '../observability/metrics.js';\n\nexport function createMcpServer(graph: KnowledgeGraph, repoName: string, workspaceRoot?: string): Server {\n const server = new Server(\n { name: 'code-intel', version: '0.1.0' },\n { capabilities: { tools: {}, resources: {} } },\n );\n\n // ─── Tool Definitions ──────────────────────────────────────────────────────\n\n // ── Shared _token property injected into every tool schema ─────────────────\n const _tokenProp = {\n _token: { type: 'string' as const, description: 'Required if CODE_INTEL_TOKEN is configured' },\n };\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [\n // ── Core repo tools ──────────────────────────────────────────────────\n {\n name: 'repos',\n description: 'List all indexed repositories with node and edge counts',\n inputSchema: { type: 'object' as const, properties: { ..._tokenProp } },\n },\n {\n name: 'overview',\n description: 'Repository summary: total nodes/edges and a full breakdown of node and edge counts by kind. Use this first to understand the shape of the codebase.',\n inputSchema: { type: 'object' as const, properties: { ..._tokenProp } },\n },\n\n // ── Search & inspect ─────────────────────────────────────────────────\n {\n name: 'search',\n description: 'BM25 keyword search across all indexed symbols — functions, classes, files, routes, etc.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n query: { type: 'string', description: 'Search query (symbol name, keyword, or partial match)' },\n limit: { type: 'number', description: 'Max results to return (default: 20)' },\n ..._tokenProp,\n },\n required: ['query'],\n },\n },\n {\n name: 'inspect',\n description: '360° view of a symbol: definition location, callers, callees, heritage (extends/implements), members, cluster, and source preview (first 500 chars)',\n inputSchema: {\n type: 'object' as const,\n properties: {\n symbol_name: { type: 'string', description: 'Exact symbol name to inspect' },\n ..._tokenProp,\n },\n required: ['symbol_name'],\n },\n },\n {\n name: 'blast_radius',\n description: 'Impact analysis: traverse the call/import graph to find all symbols that depend on or are affected by a given symbol. Returns risk level (LOW / MEDIUM / HIGH).',\n inputSchema: {\n type: 'object' as const,\n properties: {\n target: { type: 'string', description: 'Target symbol name' },\n direction: {\n type: 'string',\n enum: ['callers', 'callees', 'both'],\n description: 'Which direction to trace — callers (who depends on it), callees (what it depends on), or both (default: both)',\n },\n max_hops: { type: 'number', description: 'Maximum traversal depth (default: 5)' },\n ..._tokenProp,\n },\n required: ['target'],\n },\n },\n {\n name: 'file_symbols',\n description: 'List all symbols defined in a specific file — useful to understand what a file exports or contains without reading raw source.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n file_path: { type: 'string', description: 'File path (partial match is supported, e.g. \"auth/login.ts\")' },\n ..._tokenProp,\n },\n required: ['file_path'],\n },\n },\n {\n name: 'find_path',\n description: 'Find the shortest call/import path between two symbols. Useful for tracing how one module reaches another.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n from: { type: 'string', description: 'Source symbol name' },\n to: { type: 'string', description: 'Target symbol name' },\n max_hops: { type: 'number', description: 'Maximum path length to search (default: 8)' },\n ..._tokenProp,\n },\n required: ['from', 'to'],\n },\n },\n {\n name: 'list_exports',\n description: 'List all exported symbols in the repository. Helps AI understand the public API surface of the codebase.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n kind: {\n type: 'string',\n description: 'Filter by node kind: function | class | interface | method | type_alias | constant | enum (optional)',\n },\n limit: { type: 'number', description: 'Max results (default: 100)' },\n ..._tokenProp,\n },\n },\n },\n\n // ── Routes, clusters, flows ──────────────────────────────────────────\n {\n name: 'routes',\n description: 'List all HTTP route handler mappings detected in the codebase (kind=route or route/handler/controller files)',\n inputSchema: { type: 'object' as const, properties: { ..._tokenProp } },\n },\n {\n name: 'clusters',\n description: 'List detected code clusters (directory-based communities) with member counts and top 10 symbols each. Useful for understanding code organisation.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n limit: { type: 'number', description: 'Max clusters to return (default: 50)' },\n ..._tokenProp,\n },\n },\n },\n {\n name: 'flows',\n description: 'List all detected execution flows — entry points traced through the call graph. Each flow has a name, entry point, and ordered steps.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n limit: { type: 'number', description: 'Max flows to return (default: 50)' },\n ..._tokenProp,\n },\n },\n },\n\n // ── Git change impact ─────────────────────────────────────────────────\n {\n name: 'detect_changes',\n description: 'Git-diff impact analysis: detects which source files and line ranges changed (HEAD vs working tree or a custom diff), maps them to graph symbols, and computes the combined blast radius. Ideal for PR review or pre-commit analysis.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n base_ref: {\n type: 'string',\n description: 'Git ref to diff against (default: HEAD). Examples: \"HEAD~1\", \"main\", a commit SHA.',\n },\n diff_text: {\n type: 'string',\n description: 'Raw unified diff text. If provided, base_ref is ignored and this diff is parsed directly.',\n },\n ..._tokenProp,\n },\n },\n },\n\n // ── Raw query ─────────────────────────────────────────────────────────\n {\n name: 'raw_query',\n description: 'Execute a simplified Cypher-like graph query. Supports: name=\\'X\\' (exact name match) or :kind (list nodes of a kind, max 50)',\n inputSchema: {\n type: 'object' as const,\n properties: {\n cypher: { type: 'string', description: \"Query string — e.g. name='runPipeline' or :function\" },\n ..._tokenProp,\n },\n required: ['cypher'],\n },\n },\n\n // ── Group / multi-repo tools ──────────────────────────────────────────\n {\n name: 'group_list',\n description: 'List all configured repository groups, or show the full membership of one group. Repository groups track multiple repos as a logical system.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n name: { type: 'string', description: 'Group name to inspect (optional — omit to list all groups)' },\n ..._tokenProp,\n },\n },\n },\n {\n name: 'group_sync',\n description: 'Extract cross-repo contracts (exports, routes, schemas, events) from every member repo in a group and detect provider→consumer links via name matching and RRF scoring.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n name: { type: 'string', description: 'Group name to sync' },\n ..._tokenProp,\n },\n required: ['name'],\n },\n },\n {\n name: 'group_contracts',\n description: 'Inspect extracted contracts and confidence-ranked cross-repo links from the last group sync. Supports filtering by kind, repo, and minimum confidence.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n name: { type: 'string', description: 'Group name' },\n kind: {\n type: 'string',\n enum: ['export', 'route', 'schema', 'event'],\n description: 'Filter by contract kind (optional)',\n },\n repo: { type: 'string', description: 'Filter by registry name (optional)' },\n min_confidence: { type: 'number', description: 'Minimum link confidence 0–1 (default: 0)' },\n ..._tokenProp,\n },\n required: ['name'],\n },\n },\n {\n name: 'group_query',\n description: 'BM25 search across all repos in a group, merged via Reciprocal Rank Fusion (RRF). Returns a unified ranked list plus per-repo breakdown.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n name: { type: 'string', description: 'Group name' },\n query: { type: 'string', description: 'Search query' },\n limit: { type: 'number', description: 'Max results per repo (default: 10)' },\n ..._tokenProp,\n },\n required: ['name', 'query'],\n },\n },\n {\n name: 'group_status',\n description: 'Check index freshness and sync staleness for all repos in a group. Flags repos that have not been indexed or are stale (>24h).',\n inputSchema: {\n type: 'object' as const,\n properties: {\n name: { type: 'string', description: 'Group name' },\n ..._tokenProp,\n },\n required: ['name'],\n },\n },\n ],\n }));\n\n // ─── Tool Handlers ─────────────────────────────────────────────────────────\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n const a = (args ?? {}) as Record<string, unknown>;\n\n // ── Token authentication ───────────────────────────────────────────────\n const expectedToken = process.env['CODE_INTEL_TOKEN'];\n if (expectedToken) {\n const providedToken = a._token;\n if (providedToken !== expectedToken) {\n return {\n content: [{ type: 'text', text: JSON.stringify({ error: 'Unauthorized: invalid or missing CODE_INTEL_TOKEN' }) }],\n isError: true,\n };\n }\n }\n\n // ── OTel span + Prometheus metrics wrapper ─────────────────────────────\n const startMs = Date.now();\n const dispatch = () => dispatchTool(name, a, graph, repoName, workspaceRoot);\n\n let result: Awaited<ReturnType<typeof dispatchTool>>;\n let status = 'success';\n try {\n if (isTracingEnabled()) {\n result = await withSpan(\n `mcp.tool.${name}`,\n sanitizeAttrs({ 'mcp.tool': name, 'mcp.repo': repoName }),\n dispatch,\n );\n } else {\n result = await dispatch();\n }\n if (result.isError) status = 'error';\n } catch (err) {\n status = 'error';\n mcpToolCallsTotal.inc({ tool: name, status });\n mcpToolDurationSeconds.observe({ tool: name }, (Date.now() - startMs) / 1000);\n throw err;\n }\n mcpToolCallsTotal.inc({ tool: name, status });\n mcpToolDurationSeconds.observe({ tool: name }, (Date.now() - startMs) / 1000);\n return result;\n });\n\n // ─── Resources ───────────────────────────────────────────────────────────────\n registerResources(server, graph, repoName);\n\n return server;\n}\n// ─── Tool dispatch (extracted for testability + OTel wrapping) ───────────────\n\ntype ToolResult = { content: { type: string; text: string }[]; isError?: boolean };\n\nasync function dispatchTool(\n name: string,\n a: Record<string, unknown>,\n graph: KnowledgeGraph,\n repoName: string,\n workspaceRoot: string | undefined,\n): Promise<ToolResult> {\n switch (name) {\n\n // ── repos ──────────────────────────────────────────────────────────────\n case 'repos': {\n const registry = loadRegistry();\n return {\n content: [{\n type: 'text',\n text: JSON.stringify(\n registry.map((r) => ({ name: r.name, path: r.path, indexedAt: r.indexedAt, stats: r.stats })),\n null, 2,\n ),\n }],\n };\n }\n\n // ── overview ───────────────────────────────────────────────────────────\n case 'overview': {\n const kindCounts: Record<string, number> = {};\n for (const node of graph.allNodes()) {\n kindCounts[node.kind] = (kindCounts[node.kind] ?? 0) + 1;\n }\n const edgeCounts: Record<string, number> = {};\n for (const edge of graph.allEdges()) {\n edgeCounts[edge.kind] = (edgeCounts[edge.kind] ?? 0) + 1;\n }\n\n // Compute health summary\n const { computeHealthReport } = await import('../health/health-score.js');\n const healthReport = computeHealthReport(graph);\n const health = {\n score: Math.round(healthReport.score),\n grade: healthReport.grade,\n deadCode: healthReport.deadCode.length,\n cycles: healthReport.cycles.length,\n godNodes: healthReport.godNodes.length,\n orphanFiles: healthReport.orphanFiles.length,\n };\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n repo: repoName,\n stats: graph.size,\n nodeCounts: kindCounts,\n edgeCounts,\n health,\n }, null, 2),\n }],\n };\n }\n\n // ── search ─────────────────────────────────────────────────────────────\n case 'search': {\n const query = a.query as string;\n const limit = (a.limit as number) ?? 20;\n const vdbPath = workspaceRoot ? getVectorDbPath(workspaceRoot) : undefined;\n const { results, searchMode } = await hybridSearch(graph, query, limit, { vectorDbPath: vdbPath });\n return { content: [{ type: 'text', text: JSON.stringify({ results, searchMode }, null, 2) }] };\n }\n\n // ── inspect ────────────────────────────────────────────────────────────\n case 'inspect': {\n const symbolName = a.symbol_name as string;\n const node = findNodeByName(graph, symbolName);\n if (!node) return { content: [{ type: 'text', text: `Symbol \"${symbolName}\" not found. Try search first.` }] };\n\n const incoming = [...graph.findEdgesTo(node.id)];\n const outgoing = [...graph.findEdgesFrom(node.id)];\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n node: {\n id: node.id,\n kind: node.kind,\n name: node.name,\n filePath: node.filePath,\n startLine: node.startLine,\n endLine: node.endLine,\n exported: node.exported,\n },\n callers: incoming.filter((e) => e.kind === 'calls').map((e) => ({\n id: e.source, name: graph.getNode(e.source)?.name, file: graph.getNode(e.source)?.filePath,\n })),\n callees: outgoing.filter((e) => e.kind === 'calls').map((e) => ({\n id: e.target, name: graph.getNode(e.target)?.name, file: graph.getNode(e.target)?.filePath,\n })),\n imports: incoming.filter((e) => e.kind === 'imports').map((e) => graph.getNode(e.source)?.name),\n importedBy: outgoing.filter((e) => e.kind === 'imports').map((e) => graph.getNode(e.target)?.name),\n extends: outgoing.filter((e) => e.kind === 'extends').map((e) => graph.getNode(e.target)?.name),\n implements: outgoing.filter((e) => e.kind === 'implements').map((e) => graph.getNode(e.target)?.name),\n members: outgoing.filter((e) => e.kind === 'has_member').map((e) => ({\n name: graph.getNode(e.target)?.name, kind: graph.getNode(e.target)?.kind,\n })),\n cluster: incoming.filter((e) => e.kind === 'belongs_to').map((e) => graph.getNode(e.target)?.name)[0],\n content: node.content?.slice(0, 500),\n }, null, 2),\n }],\n };\n }\n\n // ── blast_radius ───────────────────────────────────────────────────────\n case 'blast_radius': {\n const target = a.target as string;\n const direction = (a.direction as string) ?? 'both';\n const maxHops = (a.max_hops as number) ?? 5;\n const node = findNodeByName(graph, target);\n if (!node) return { content: [{ type: 'text', text: `Symbol \"${target}\" not found.` }] };\n\n const affected = new Set<string>();\n const queue: { id: string; depth: number }[] = [{ id: node.id, depth: 0 }];\n const visited = new Set<string>();\n\n while (queue.length > 0) {\n const { id, depth } = queue.shift()!;\n if (visited.has(id) || depth > maxHops) continue;\n visited.add(id);\n affected.add(id);\n\n if (direction === 'callers' || direction === 'both') {\n for (const edge of graph.findEdgesTo(id)) {\n if (edge.kind === 'calls' || edge.kind === 'imports') queue.push({ id: edge.source, depth: depth + 1 });\n }\n }\n if (direction === 'callees' || direction === 'both') {\n for (const edge of graph.findEdgesFrom(id)) {\n if (edge.kind === 'calls' || edge.kind === 'imports') queue.push({ id: edge.target, depth: depth + 1 });\n }\n }\n }\n\n const affectedDetails = [...affected].map((id) => {\n const n = graph.getNode(id);\n return n ? { id, name: n.name, kind: n.kind, filePath: n.filePath } : { id };\n });\n\n const risk = affected.size > 10 ? 'HIGH' : affected.size > 5 ? 'MEDIUM' : 'LOW';\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n target: node.name,\n affectedCount: affected.size,\n riskLevel: risk,\n affected: affectedDetails,\n }, null, 2),\n }],\n };\n }\n\n // ── file_symbols ───────────────────────────────────────────────────────\n case 'file_symbols': {\n const filePath = a.file_path as string;\n const matches: { kind: string; name: string; startLine: number | undefined; exported: boolean | undefined }[] = [];\n for (const node of graph.allNodes()) {\n if (node.filePath && node.filePath.includes(filePath)) {\n matches.push({ kind: node.kind, name: node.name, startLine: node.startLine, exported: node.exported });\n }\n }\n if (matches.length === 0) {\n return { content: [{ type: 'text', text: `No symbols found for file path matching \"${filePath}\".` }] };\n }\n matches.sort((a, b) => (a.startLine ?? 0) - (b.startLine ?? 0));\n return { content: [{ type: 'text', text: JSON.stringify(matches, null, 2) }] };\n }\n\n // ── find_path ──────────────────────────────────────────────────────────\n case 'find_path': {\n const fromName = a.from as string;\n const toName = a.to as string;\n const maxHops = (a.max_hops as number) ?? 8;\n\n const fromNode = findNodeByName(graph, fromName);\n const toNode = findNodeByName(graph, toName);\n\n if (!fromNode) return { content: [{ type: 'text', text: `Source symbol \"${fromName}\" not found.` }] };\n if (!toNode) return { content: [{ type: 'text', text: `Target symbol \"${toName}\" not found.` }] };\n\n // BFS for shortest path\n type PathNode = { id: string; path: string[] };\n const queue: PathNode[] = [{ id: fromNode.id, path: [fromNode.id] }];\n const visited = new Set<string>();\n\n let foundPath: string[] | null = null;\n while (queue.length > 0) {\n const { id, path: currentPath } = queue.shift()!;\n if (visited.has(id)) continue;\n visited.add(id);\n\n if (id === toNode.id) { foundPath = currentPath; break; }\n if (currentPath.length > maxHops) continue;\n\n for (const edge of graph.findEdgesFrom(id)) {\n if ((edge.kind === 'calls' || edge.kind === 'imports') && !visited.has(edge.target)) {\n queue.push({ id: edge.target, path: [...currentPath, edge.target] });\n }\n }\n }\n\n if (!foundPath) {\n return { content: [{ type: 'text', text: `No path found from \"${fromName}\" to \"${toName}\" within ${maxHops} hops.` }] };\n }\n\n const pathDetails = foundPath.map((id) => {\n const n = graph.getNode(id);\n return n ? { id, name: n.name, kind: n.kind, filePath: n.filePath } : { id };\n });\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({ from: fromName, to: toName, hops: foundPath.length - 1, path: pathDetails }, null, 2),\n }],\n };\n }\n\n // ── list_exports ───────────────────────────────────────────────────────\n case 'list_exports': {\n const kindFilter = a.kind as string | undefined;\n const limit = (a.limit as number) ?? 100;\n const exports: { kind: string; name: string; filePath: string; startLine: number | undefined }[] = [];\n\n for (const node of graph.allNodes()) {\n if (!node.exported) continue;\n if (kindFilter && node.kind !== kindFilter) continue;\n exports.push({ kind: node.kind, name: node.name, filePath: node.filePath, startLine: node.startLine });\n if (exports.length >= limit) break;\n }\n\n return { content: [{ type: 'text', text: JSON.stringify({ total: exports.length, exports }, null, 2) }] };\n }\n\n // ── routes ─────────────────────────────────────────────────────────────\n case 'routes': {\n const routes: { name: string; filePath: string; startLine: number | undefined }[] = [];\n for (const node of graph.allNodes()) {\n if (node.kind === 'route' || (node.kind === 'function' && /route|handler|controller/i.test(node.filePath))) {\n routes.push({ name: node.name, filePath: node.filePath, startLine: node.startLine });\n }\n }\n return { content: [{ type: 'text', text: JSON.stringify(routes, null, 2) }] };\n }\n\n // ── clusters ───────────────────────────────────────────────────────────\n case 'clusters': {\n const limit = (a.limit as number) ?? 50;\n const clusters: {\n id: string;\n name: string;\n memberCount: number;\n topSymbols: { name: string; kind: string }[];\n }[] = [];\n\n for (const node of graph.allNodes()) {\n if (node.kind === 'cluster') {\n const members: { name: string; kind: string }[] = [];\n for (const edge of graph.findEdgesTo(node.id)) {\n if (edge.kind === 'belongs_to') {\n const member = graph.getNode(edge.source);\n if (member && member.kind !== 'cluster') {\n members.push({ name: member.name, kind: member.kind });\n }\n }\n }\n clusters.push({\n id: node.id,\n name: node.name,\n memberCount: (node.metadata?.memberCount as number | undefined) ?? members.length,\n topSymbols: members.slice(0, 10),\n });\n if (clusters.length >= limit) break;\n }\n }\n return { content: [{ type: 'text', text: JSON.stringify(clusters, null, 2) }] };\n }\n\n // ── flows ──────────────────────────────────────────────────────────────\n case 'flows': {\n const limit = (a.limit as number) ?? 50;\n const flows: {\n id: string;\n name: string;\n entryPoint: string | undefined;\n steps: unknown;\n stepCount: number;\n }[] = [];\n\n for (const node of graph.allNodes()) {\n if (node.kind === 'flow') {\n const steps = node.metadata?.steps as unknown[] | undefined;\n flows.push({\n id: node.id,\n name: node.name,\n entryPoint: node.metadata?.entryPoint as string | undefined,\n steps: steps ?? [],\n stepCount: Array.isArray(steps) ? steps.length : 0,\n });\n if (flows.length >= limit) break;\n }\n }\n return { content: [{ type: 'text', text: JSON.stringify(flows, null, 2) }] };\n }\n\n // ── detect_changes ─────────────────────────────────────────────────────\n case 'detect_changes': {\n const baseRef = (a.base_ref as string) ?? 'HEAD';\n const diffTextInput = a.diff_text as string | undefined;\n\n let diffText: string;\n const repoRoot = workspaceRoot ?? process.cwd();\n\n if (diffTextInput) {\n diffText = diffTextInput;\n } else {\n try {\n diffText = execSync(`git diff ${baseRef}`, { cwd: repoRoot, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] });\n if (!diffText.trim()) {\n // Fall back to staged + unstaged\n diffText = execSync(`git diff HEAD`, { cwd: repoRoot, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] });\n }\n } catch {\n return { content: [{ type: 'text', text: `Could not run git diff in ${repoRoot}. Ensure the path is a Git repository.` }] };\n }\n }\n\n if (!diffText.trim()) {\n return { content: [{ type: 'text', text: 'No changes detected in git diff.' }] };\n }\n\n // Parse unified diff → { filePath, changedLines: number[] }\n const changedFiles = parseDiff(diffText);\n\n // Map changed lines to graph nodes\n const hitNodes = new Set<string>();\n for (const { filePath: changedFile, changedLines } of changedFiles) {\n for (const node of graph.allNodes()) {\n if (!node.filePath) continue;\n // Normalize path comparison (strip repo root prefix)\n const normNode = node.filePath.replace(repoRoot + '/', '').replace(repoRoot + path.sep, '');\n const normChanged = changedFile.replace(/^a\\/|^b\\//, '');\n if (!normNode.endsWith(normChanged) && !normChanged.endsWith(normNode)) continue;\n\n if (node.startLine !== undefined && node.endLine !== undefined) {\n const overlaps = changedLines.some((l) => l >= node.startLine! && l <= node.endLine!);\n if (overlaps) hitNodes.add(node.id);\n } else if (node.startLine !== undefined) {\n const overlaps = changedLines.some((l) => Math.abs(l - node.startLine!) <= 3);\n if (overlaps) hitNodes.add(node.id);\n }\n }\n }\n\n // Compute combined blast radius from all hit nodes\n const allAffected = new Set<string>();\n for (const startId of hitNodes) {\n const queue: { id: string; depth: number }[] = [{ id: startId, depth: 0 }];\n const visited = new Set<string>();\n while (queue.length > 0) {\n const { id, depth } = queue.shift()!;\n if (visited.has(id) || depth > 5) continue;\n visited.add(id);\n allAffected.add(id);\n for (const edge of graph.findEdgesTo(id)) {\n if (edge.kind === 'calls' || edge.kind === 'imports') queue.push({ id: edge.source, depth: depth + 1 });\n }\n }\n }\n\n const changedSymbols = [...hitNodes].map((id) => {\n const n = graph.getNode(id);\n return n ? { id, name: n.name, kind: n.kind, filePath: n.filePath } : { id };\n });\n\n const affectedSymbols = [...allAffected]\n .filter((id) => !hitNodes.has(id))\n .map((id) => {\n const n = graph.getNode(id);\n return n ? { id, name: n.name, kind: n.kind, filePath: n.filePath } : { id };\n });\n\n const risk = allAffected.size > 10 ? 'HIGH' : allAffected.size > 4 ? 'MEDIUM' : 'LOW';\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n baseRef,\n changedFiles: changedFiles.map((f) => f.filePath),\n directlyChangedSymbols: changedSymbols,\n transitivelyAffectedSymbols: affectedSymbols,\n totalAffected: allAffected.size,\n riskLevel: risk,\n }, null, 2),\n }],\n };\n }\n\n // ── raw_query ──────────────────────────────────────────────────────────\n case 'raw_query': {\n const q = a.cypher as string;\n const nameMatch = q?.match(/name\\s*=\\s*['\"]([^'\"]+)['\"]/i);\n if (nameMatch) {\n const results = [];\n for (const node of graph.allNodes()) {\n if (node.name === nameMatch[1]) results.push(node);\n }\n return { content: [{ type: 'text', text: JSON.stringify(results, null, 2) }] };\n }\n const kindMatch = q?.match(/:\\s*(\\w+)/);\n if (kindMatch) {\n const results = [];\n for (const node of graph.allNodes()) {\n if (node.kind === kindMatch[1]) results.push(node);\n if (results.length >= 50) break;\n }\n return { content: [{ type: 'text', text: JSON.stringify(results, null, 2) }] };\n }\n return { content: [{ type: 'text', text: 'Query not recognized. Use name=\\'X\\' or :kind syntax.' }] };\n }\n\n // ── group_list ─────────────────────────────────────────────────────────\n case 'group_list': {\n const groupName = a.name as string | undefined;\n if (groupName) {\n const group = loadGroup(groupName);\n if (!group) return { content: [{ type: 'text', text: `Group \"${groupName}\" not found.` }] };\n return { content: [{ type: 'text', text: JSON.stringify(group, null, 2) }] };\n }\n const groups = listGroups();\n return {\n content: [{\n type: 'text',\n text: JSON.stringify(\n groups.map((g) => ({ name: g.name, createdAt: g.createdAt, lastSync: g.lastSync, memberCount: g.members.length, members: g.members })),\n null, 2,\n ),\n }],\n };\n }\n\n // ── group_sync ─────────────────────────────────────────────────────────\n case 'group_sync': {\n const groupName = a.name as string;\n const group = loadGroup(groupName);\n if (!group) return { content: [{ type: 'text', text: `Group \"${groupName}\" not found.` }] };\n if (group.members.length === 0) return { content: [{ type: 'text', text: `Group \"${groupName}\" has no members.` }] };\n\n const result = await syncGroup(group);\n saveSyncResult(result);\n group.lastSync = result.syncedAt;\n saveGroup(group);\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n groupName: result.groupName,\n syncedAt: result.syncedAt,\n memberCount: result.memberCount,\n contractCount: result.contracts.length,\n linkCount: result.links.length,\n topLinks: result.links.slice(0, 20),\n }, null, 2),\n }],\n };\n }\n\n // ── group_contracts ────────────────────────────────────────────────────\n case 'group_contracts': {\n const groupName = a.name as string;\n const kindFilter = a.kind as string | undefined;\n const repoFilter = a.repo as string | undefined;\n const minConf = (a.min_confidence as number) ?? 0;\n\n const result = loadSyncResult(groupName);\n if (!result) return { content: [{ type: 'text', text: `No sync data for group \"${groupName}\". Run group_sync first.` }] };\n\n let contracts = result.contracts;\n if (kindFilter) contracts = contracts.filter((c) => c.kind === kindFilter);\n if (repoFilter) contracts = contracts.filter((c) => c.repoName === repoFilter);\n\n let links = result.links.filter((l) => l.confidence >= minConf);\n if (repoFilter) links = links.filter((l) => l.providerRepo === repoFilter || l.consumerRepo === repoFilter);\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({ syncedAt: result.syncedAt, contracts, links }, null, 2),\n }],\n };\n }\n\n // ── group_query ────────────────────────────────────────────────────────\n case 'group_query': {\n const groupName = a.name as string;\n const query = a.query as string;\n const limit = (a.limit as number) ?? 10;\n\n const group = loadGroup(groupName);\n if (!group) return { content: [{ type: 'text', text: `Group \"${groupName}\" not found.` }] };\n\n const { perRepo, merged } = await queryGroup(group, query, limit);\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({ query, merged, perRepo }, null, 2),\n }],\n };\n }\n\n // ── group_status ───────────────────────────────────────────────────────\n case 'group_status': {\n const groupName = a.name as string;\n const group = loadGroup(groupName);\n if (!group) return { content: [{ type: 'text', text: `Group \"${groupName}\" not found.` }] };\n\n const registry = loadRegistry();\n const now = Date.now();\n\n const memberStatus = group.members.map((m) => {\n const regEntry = registry.find((r) => r.name === m.registryName);\n if (!regEntry) return { groupPath: m.groupPath, registryName: m.registryName, status: 'NOT_IN_REGISTRY' };\n\n const meta = loadMetadata(regEntry.path);\n if (!meta) return { groupPath: m.groupPath, registryName: m.registryName, repoPath: regEntry.path, status: 'NOT_INDEXED' };\n\n const ageMin = Math.round((now - new Date(meta.indexedAt).getTime()) / 60000);\n const stale = ageMin > 1440;\n return {\n groupPath: m.groupPath,\n registryName: m.registryName,\n repoPath: regEntry.path,\n indexedAt: meta.indexedAt,\n ageMinutes: ageMin,\n status: stale ? 'STALE' : 'OK',\n stats: meta.stats,\n };\n });\n\n const syncAge = group.lastSync\n ? Math.round((now - new Date(group.lastSync).getTime()) / 60000)\n : null;\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n group: groupName,\n lastSync: group.lastSync ?? null,\n syncAgeMinutes: syncAge,\n members: memberStatus,\n }, null, 2),\n }],\n };\n }\n\n default:\n return { content: [{ type: 'text', text: `Unknown tool: ${name}` }] };\n }\n}\n\n// ─── Resources section returns to createMcpServer via separate call ──────────\n// The Resources handlers need to be registered inside createMcpServer.\n// (See below where we call registerResources(server, graph, repoName).)\n\nfunction registerResources(server: Server, graph: KnowledgeGraph, repoName: string): void {\n server.setRequestHandler(ListResourcesRequestSchema, async () => ({\n resources: [\n { uri: `codeintel://repo/${repoName}/overview`, name: `${repoName} Overview`, mimeType: 'application/json' },\n { uri: `codeintel://repo/${repoName}/clusters`, name: `${repoName} Clusters`, mimeType: 'application/json' },\n { uri: `codeintel://repo/${repoName}/flows`, name: `${repoName} Flows`, mimeType: 'application/json' },\n ],\n }));\n\n server.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n const { uri } = request.params;\n\n if (uri.endsWith('/overview')) {\n const kindCounts: Record<string, number> = {};\n for (const node of graph.allNodes()) {\n kindCounts[node.kind] = (kindCounts[node.kind] ?? 0) + 1;\n }\n return { contents: [{ uri, mimeType: 'application/json', text: JSON.stringify({ repo: repoName, stats: graph.size, nodeCounts: kindCounts }) }] };\n }\n\n if (uri.endsWith('/clusters')) {\n const clusters = [];\n for (const node of graph.allNodes()) {\n if (node.kind === 'cluster') clusters.push({ id: node.id, name: node.name, memberCount: node.metadata?.memberCount });\n }\n return { contents: [{ uri, mimeType: 'application/json', text: JSON.stringify(clusters) }] };\n }\n\n if (uri.endsWith('/flows')) {\n const flows = [];\n for (const node of graph.allNodes()) {\n if (node.kind === 'flow') flows.push({ id: node.id, name: node.name, steps: node.metadata?.steps, entryPoint: node.metadata?.entryPoint });\n }\n return { contents: [{ uri, mimeType: 'application/json', text: JSON.stringify(flows) }] };\n }\n\n throw new Error(`Unknown resource: ${uri}`);\n });\n}\n\nexport async function startMcpStdio(graph: KnowledgeGraph, repoName: string, workspaceRoot?: string): Promise<void> {\n if (process.env['CODE_INTEL_TOKEN']) {\n process.stderr.write('[code-intel] CODE_INTEL_TOKEN is configured — all tool calls must include { \"_token\": \"<value>\" } in their arguments.\\n');\n }\n const server = createMcpServer(graph, repoName, workspaceRoot);\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n\n// ─── Helpers ───────────────────────────────────────────────────────────────────\n\nfunction findNodeByName(graph: KnowledgeGraph, name: string) {\n for (const node of graph.allNodes()) {\n if (node.name === name) return node;\n }\n return undefined;\n}\n\n/**\n * Parse a unified diff text and return a list of changed files with their\n * changed line numbers (new-file side, i.e. \"+\" lines).\n */\nfunction parseDiff(diffText: string): { filePath: string; changedLines: number[] }[] {\n const result: { filePath: string; changedLines: number[] }[] = [];\n let currentFile: string | null = null;\n let currentNewLine = 0;\n const changedLinesMap = new Map<string, number[]>();\n\n for (const raw of diffText.split('\\n')) {\n // diff --git a/src/foo.ts b/src/foo.ts OR +++ b/src/foo.ts\n const fileMatch = raw.match(/^\\+\\+\\+ b\\/(.+)/);\n if (fileMatch) {\n currentFile = fileMatch[1];\n if (!changedLinesMap.has(currentFile)) changedLinesMap.set(currentFile, []);\n continue;\n }\n\n // @@ -oldStart,oldLen +newStart,newLen @@\n const hunkMatch = raw.match(/^@@ -\\d+(?:,\\d+)? \\+(\\d+)(?:,\\d+)? @@/);\n if (hunkMatch) {\n currentNewLine = parseInt(hunkMatch[1], 10);\n continue;\n }\n\n if (!currentFile) continue;\n\n if (raw.startsWith('+') && !raw.startsWith('+++')) {\n changedLinesMap.get(currentFile)!.push(currentNewLine);\n currentNewLine++;\n } else if (raw.startsWith('-') && !raw.startsWith('---')) {\n // deleted line: don't advance new-side line counter\n } else if (!raw.startsWith('\\\\')) {\n currentNewLine++;\n }\n }\n\n for (const [filePath, changedLines] of changedLinesMap) {\n result.push({ filePath, changedLines });\n }\n return result;\n}\n","/**\n * graph-from-db.ts\n * Loads a KnowledgeGraph from a persisted LadybugDB graph.db.\n * Used by group-sync to read each repo's index without re-analyzing.\n */\nimport type { KnowledgeGraph } from '../graph/knowledge-graph.js';\nimport { DbManager } from '../storage/db-manager.js';\nimport { ALL_NODE_TABLES, NODE_TABLE_MAP } from '../storage/schema.js';\nimport type { CodeNode, CodeEdge, NodeKind, EdgeKind } from '../shared/index.js';\n\n// Reverse map: tableName → NodeKind\nconst TABLE_TO_KIND: Record<string, NodeKind> = Object.fromEntries(\n Object.entries(NODE_TABLE_MAP).map(([kind, table]) => [table, kind as NodeKind]),\n);\n\nfunction parseRow(row: Record<string, unknown>, kind: NodeKind): CodeNode {\n return {\n id: String(row['id'] ?? ''),\n kind,\n name: String(row['name'] ?? ''),\n filePath: String(row['file_path'] ?? ''),\n startLine: row['start_line'] != null ? Number(row['start_line']) : undefined,\n endLine: row['end_line'] != null ? Number(row['end_line']) : undefined,\n exported: row['exported'] != null ? Boolean(row['exported']) : undefined,\n content: row['content'] ? String(row['content']) : undefined,\n metadata: row['metadata'] ? (() => {\n try { return JSON.parse(String(row['metadata'])) as Record<string, unknown>; } catch { return undefined; }\n })() : undefined,\n };\n}\n\nexport async function loadGraphFromDB(\n graph: KnowledgeGraph,\n db: DbManager,\n): Promise<void> {\n // Load all node tables\n for (const table of ALL_NODE_TABLES) {\n const kind = TABLE_TO_KIND[table];\n if (!kind) continue;\n let rows: Record<string, unknown>[] = [];\n try {\n rows = await db.query(`MATCH (n:${table}) RETURN n.id, n.name, n.file_path, n.start_line, n.end_line, n.exported, n.content, n.metadata`);\n } catch {\n // table may not exist in older DBs\n continue;\n }\n for (const row of rows) {\n // kuzu returns column names as aliases\n const node = parseRow({\n id: row['n.id'],\n name: row['n.name'],\n file_path: row['n.file_path'],\n start_line: row['n.start_line'],\n end_line: row['n.end_line'],\n exported: row['n.exported'],\n content: row['n.content'],\n metadata: row['n.metadata'],\n }, kind);\n if (node.id && node.name) graph.addNode(node);\n }\n }\n\n // Load edges\n try {\n const edgeRows = await db.query(\n `MATCH (a)-[e:code_edges]->(b) RETURN a.id, b.id, e.kind, e.weight, e.label`,\n );\n for (const row of edgeRows) {\n const sourceId = String(row['a.id'] ?? '');\n const targetId = String(row['b.id'] ?? '');\n const kind = String(row['e.kind'] ?? '') as EdgeKind;\n if (!sourceId || !targetId || !kind) continue;\n const edge: CodeEdge = {\n id: `${sourceId}::${kind}::${targetId}`,\n source: sourceId,\n target: targetId,\n kind,\n weight: row['e.weight'] != null ? Number(row['e.weight']) : undefined,\n label: row['e.label'] ? String(row['e.label']) : undefined,\n };\n graph.addEdge(edge);\n }\n } catch {\n // edges table may not exist in older DBs\n }\n}\n","/**\n * group-sync.ts\n * Loads each member repo's knowledge graph from its .code-intel/graph.db,\n * extracts contracts (exports, routes, events, schemas), and matches them\n * across repos to produce ContractLinks.\n */\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport type { RepoGroup, Contract, ContractLink, GroupSyncResult } from './types.js';\nimport { loadRegistry } from '../storage/repo-registry.js';\nimport { DbManager } from '../storage/db-manager.js';\nimport { createKnowledgeGraph, type KnowledgeGraph } from '../graph/knowledge-graph.js';\nimport { loadGraphFromDB } from './graph-from-db.js';\nimport Logger from '../shared/logger.js';\n\n// ─── Extract contracts from a single repo's graph ────────────────────────────\n\nfunction extractContracts(\n graph: KnowledgeGraph,\n repoName: string,\n repoPath: string,\n): Contract[] {\n const contracts: Contract[] = [];\n\n for (const node of graph.allNodes()) {\n // exported symbols → 'export' contracts\n if (\n node.exported === true &&\n ['function', 'class', 'interface', 'method', 'type_alias', 'constant', 'enum', 'struct', 'trait'].includes(node.kind)\n ) {\n contracts.push({\n repoName,\n repoPath,\n kind: 'export',\n name: node.name,\n nodeId: node.id,\n nodeKind: node.kind,\n filePath: node.filePath,\n signature: node.content?.split('\\n')[0]?.trim(),\n });\n }\n\n // route nodes → 'route' contracts\n if (node.kind === 'route') {\n contracts.push({\n repoName,\n repoPath,\n kind: 'route',\n name: node.name,\n nodeId: node.id,\n nodeKind: node.kind,\n filePath: node.filePath,\n signature: node.content?.split('\\n')[0]?.trim(),\n });\n }\n\n // interfaces / type aliases with \"event\" or \"schema\" in name → schema/event contracts\n if (['interface', 'type_alias'].includes(node.kind)) {\n const nameLower = node.name.toLowerCase();\n if (nameLower.includes('event') || nameLower.includes('message')) {\n contracts.push({\n repoName,\n repoPath,\n kind: 'event',\n name: node.name,\n nodeId: node.id,\n nodeKind: node.kind,\n filePath: node.filePath,\n });\n } else if (nameLower.includes('schema') || nameLower.includes('dto') || nameLower.includes('request') || nameLower.includes('response')) {\n contracts.push({\n repoName,\n repoPath,\n kind: 'schema',\n name: node.name,\n nodeId: node.id,\n nodeKind: node.kind,\n filePath: node.filePath,\n });\n }\n }\n }\n\n return contracts;\n}\n\n// ─── Match contracts across repos ────────────────────────────────────────────\n\nfunction matchContracts(allContracts: Contract[]): ContractLink[] {\n const links: ContractLink[] = [];\n\n // Group contracts by repo\n const byRepo = new Map<string, Contract[]>();\n for (const c of allContracts) {\n const arr = byRepo.get(c.repoName) ?? [];\n arr.push(c);\n byRepo.set(c.repoName, arr);\n }\n\n const repoNames = [...byRepo.keys()];\n\n for (let i = 0; i < repoNames.length; i++) {\n for (let j = 0; j < repoNames.length; j++) {\n if (i === j) continue;\n const providerContracts = byRepo.get(repoNames[i])!;\n const consumerContracts = byRepo.get(repoNames[j])!;\n\n // Build a name map for the consumer\n const consumerByName = new Map<string, Contract>();\n for (const c of consumerContracts) consumerByName.set(c.name, c);\n\n for (const provider of providerContracts) {\n const consumer = consumerByName.get(provider.name);\n if (consumer) {\n // same-kind matches are more confident\n const sameKind = provider.kind === consumer.kind;\n links.push({\n providerRepo: provider.repoName,\n providerContract: provider.name,\n consumerRepo: consumer.repoName,\n consumerContract: consumer.name,\n matchKind: provider.kind === 'route' ? 'route-match' : 'name-match',\n confidence: sameKind ? 0.9 : 0.6,\n });\n } else {\n // partial-name match (camelCase contained)\n const providerLC = provider.name.toLowerCase();\n for (const c of consumerContracts) {\n if (c.name.toLowerCase().includes(providerLC) || providerLC.includes(c.name.toLowerCase())) {\n if (c.name.length >= 4 && provider.name.length >= 4) {\n links.push({\n providerRepo: provider.repoName,\n providerContract: provider.name,\n consumerRepo: c.repoName,\n consumerContract: c.name,\n matchKind: 'name-match',\n confidence: 0.4,\n });\n }\n }\n }\n }\n }\n }\n }\n\n // Deduplicate: keep highest-confidence for a given (pRepo, pContract, cRepo) triple\n const seen = new Map<string, ContractLink>();\n for (const link of links) {\n const key = `${link.providerRepo}:${link.providerContract}:${link.consumerRepo}:${link.consumerContract}`;\n const existing = seen.get(key);\n if (!existing || link.confidence > existing.confidence) {\n seen.set(key, link);\n }\n }\n\n return [...seen.values()].sort((a, b) => b.confidence - a.confidence);\n}\n\n// ─── Main sync function ───────────────────────────────────────────────────────\n\nexport async function syncGroup(group: RepoGroup): Promise<GroupSyncResult> {\n const registry = loadRegistry();\n const allContracts: Contract[] = [];\n\n for (const member of group.members) {\n // Resolve the actual repo path from the registry\n const regEntry = registry.find((r) => r.name === member.registryName);\n if (!regEntry) {\n Logger.warn(` ⚠ Registry entry \"${member.registryName}\" not found — skipping ${member.groupPath}`);\n continue;\n }\n\n const dbPath = path.join(regEntry.path, '.code-intel', 'graph.db');\n if (!fs.existsSync(dbPath)) {\n Logger.warn(` ⚠ No index at ${dbPath} — run \\`code-intel analyze ${regEntry.path}\\` first`);\n continue;\n }\n\n const graph = createKnowledgeGraph();\n const db = new DbManager(dbPath);\n try {\n await db.init();\n await loadGraphFromDB(graph, db);\n db.close();\n } catch (err) {\n db.close();\n Logger.warn(` ⚠ Could not load graph for \"${member.registryName}\": ${err instanceof Error ? err.message : err}`);\n continue;\n }\n\n const contracts = extractContracts(graph, member.registryName, regEntry.path);\n Logger.info(` ✓ ${member.registryName} (${member.groupPath}): ${contracts.length} contracts`);\n allContracts.push(...contracts);\n }\n\n const links = matchContracts(allContracts);\n\n return {\n groupName: group.name,\n syncedAt: new Date().toISOString(),\n memberCount: group.members.length,\n contracts: allContracts,\n links,\n };\n}\n","/**\n * group-query.ts\n * Search execution flows across all repos in a group.\n * Loads each repo's graph, runs text search, and merges via RRF.\n */\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport type { RepoGroup } from './types.js';\nimport type { SearchResult } from '../search/text-search.js';\nimport { textSearch, reciprocalRankFusion } from '../search/text-search.js';\nimport { loadRegistry } from '../storage/repo-registry.js';\nimport { DbManager } from '../storage/db-manager.js';\nimport { createKnowledgeGraph } from '../graph/knowledge-graph.js';\nimport { loadGraphFromDB } from './graph-from-db.js';\n\nexport interface GroupQueryResult {\n repoName: string;\n repoPath: string;\n groupPath: string;\n results: SearchResult[];\n}\n\nexport async function queryGroup(\n group: RepoGroup,\n query: string,\n limit = 20,\n): Promise<{ perRepo: GroupQueryResult[]; merged: SearchResult[] }> {\n const registry = loadRegistry();\n const perRepo: GroupQueryResult[] = [];\n const allRankings: SearchResult[][] = [];\n\n for (const member of group.members) {\n const regEntry = registry.find((r) => r.name === member.registryName);\n if (!regEntry) continue;\n\n const dbPath = path.join(regEntry.path, '.code-intel', 'graph.db');\n if (!fs.existsSync(dbPath)) continue;\n\n const graph = createKnowledgeGraph();\n const db = new DbManager(dbPath);\n try {\n await db.init();\n await loadGraphFromDB(graph, db);\n db.close();\n } catch {\n db.close();\n continue;\n }\n\n const results = textSearch(graph, query, limit);\n // Tag each result with repo info via snippet prefix\n const taggedResults: SearchResult[] = results.map((r) => ({\n ...r,\n snippet: `[${member.registryName}] ${r.snippet ?? ''}`.trim(),\n }));\n\n perRepo.push({\n repoName: member.registryName,\n repoPath: regEntry.path,\n groupPath: member.groupPath,\n results: taggedResults,\n });\n allRankings.push(taggedResults);\n }\n\n const merged = reciprocalRankFusion(...allRankings).slice(0, limit);\n return { perRepo, merged };\n}\n","import express from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport cors from 'cors';\nimport helmet from 'helmet';\nimport cookieParser from 'cookie-parser';\nimport { doubleCsrf } from 'csrf-csrf';\nimport { rateLimit } from 'express-rate-limit';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { KnowledgeGraph } from '../graph/knowledge-graph.js';\nimport { textSearch } from '../search/text-search.js';\nimport { hybridSearch } from '../search/hybrid-search.js';\nimport { DbManager, getDbPath, getVectorDbPath } from '../storage/index.js';\nimport { loadMetadata } from '../storage/metadata.js';\nimport { VectorIndex } from '../search/vector-index.js';\n// VectorIndex now uses better-sqlite3 directly (no DbManager needed)\nimport fs from 'node:fs';\nimport { listGroups, loadGroup, loadSyncResult, saveSyncResult } from '../multi-repo/group-registry.js';\nimport { syncGroup } from '../multi-repo/group-sync.js';\nimport { queryGroup } from '../multi-repo/group-query.js';\nimport { createKnowledgeGraph } from '../graph/knowledge-graph.js';\nimport { loadGraphFromDB } from '../multi-repo/graph-from-db.js';\nimport { loadRegistry } from '../storage/repo-registry.js';\nimport Logger from '../shared/logger.js';\nimport { AppError, ErrorCodes } from '../errors/codes.js';\nimport {\n requestIdMiddleware,\n authMiddleware,\n requireAuth,\n requireRole,\n requireRepoAccess,\n requireToolScope,\n buildSessionCookie,\n clearSessionCookie,\n createSession,\n verifyPassword,\n sessionStore,\n} from '../auth/middleware.js';\nimport { getOrCreateUsersDB } from '../auth/users-db.js';\nimport type { Role } from '../auth/users-db.js';\nimport { getOrCreateJobsDB } from '../jobs/jobs-db.js';\nimport type { JobStatus } from '../jobs/jobs-db.js';\nimport { governanceLogger } from '../governance/llm-governance.js';\nimport { createBackupScheduler } from '../backup/backup-scheduler.js';\nimport {\n isOIDCConfigured,\n getOIDCConfig,\n getDiscoveredConfig,\n buildOIDCLoginUrl,\n handleOIDCCallback,\n deriveUsername,\n initiateDeviceFlow,\n pollDeviceFlow,\n refreshOIDCToken,\n} from '../auth/oidc.js';\nimport {\n metricsRegistry,\n httpRequestsTotal,\n httpRequestDurationSeconds,\n pipelineNodesTotal,\n pipelineEdgesTotal,\n activeSessionsTotal,\n authAttemptsTotal,\n} from '../observability/metrics.js';\nimport { withSpan, isTracingEnabled } from '../observability/tracing.js';\nimport { openApiSpec } from './openapi.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n// Web UI is bundled into dist/web/ at publish time.\n// Fallback to the monorepo sibling path for local dev.\nconst WEB_DIST = (() => {\n // dist/cli/main.js → ../web = dist/web/ (global install & npm pack)\n const bundled = path.resolve(__dirname, '..', 'web');\n if (fs.existsSync(bundled)) return bundled;\n // Monorepo dev: dist/cli/ → ../../../web/dist = code-intel/web/dist\n return path.resolve(__dirname, '..', '..', '..', 'web', 'dist');\n})();\n\n// ── CORS allowed origins ──────────────────────────────────────────────────────\n\nfunction getAllowedOrigins(): string[] {\n const env = process.env['CODE_INTEL_CORS_ORIGINS'];\n if (env) return env.split(',').map((s) => s.trim());\n return ['http://localhost:3000', 'http://localhost:4747', 'http://localhost:4748'];\n}\n\n// ── Rate limiters ─────────────────────────────────────────────────────────────\n\nfunction createDefaultLimiter() {\n const max = parseInt(process.env['CODE_INTEL_RATE_LIMIT_MAX'] ?? '100', 10);\n const windowMs =\n parseInt(process.env['CODE_INTEL_RATE_LIMIT_WINDOW_MS'] ?? `${15 * 60 * 1000}`, 10);\n return rateLimit({\n windowMs,\n max,\n standardHeaders: true,\n legacyHeaders: false,\n skip: (req) => req.path.startsWith('/health') || req.path === '/metrics',\n message: {\n error: {\n code: ErrorCodes.RATE_LIMIT_EXCEEDED,\n message: 'Too many requests',\n hint: 'Slow down — you are sending requests too fast. Try again later.',\n },\n },\n });\n}\n\n// ── App factory ───────────────────────────────────────────────────────────────\n\nexport function createApp(graph: KnowledgeGraph, repoName: string, workspaceRoot?: string, watcherState?: { watching: boolean; lastEventAt: number | null }): express.Application {\n const app = express();\n\n // Trust proxy (for correct IP detection behind nginx/caddy)\n app.set('trust proxy', 1);\n\n // ── Security middleware ─────────────────────────────────────────────────────\n app.use(\n helmet({\n contentSecurityPolicy: false, // disabled to allow Web UI to load scripts\n }),\n );\n // CORS: actively reject non-allowlisted Origins (no `*` in production).\n // Requests without an Origin header (e.g. server-side, curl) are allowed\n // through; the browser is the entity enforcing CORS, so this only matters\n // for cross-origin browser requests.\n const allowedOrigins = getAllowedOrigins();\n app.use(\n cors({\n origin: (origin, callback) => {\n if (!origin) { callback(null, true); return; }\n if (allowedOrigins.includes(origin)) { callback(null, true); return; }\n // Non-allowlisted origin: do not echo Access-Control-Allow-Origin\n // (browser will block the response). Server-side request still\n // proceeds so we can return a normal 403/401 from downstream handlers.\n callback(null, false);\n },\n credentials: true,\n }),\n );\n app.use(cookieParser());\n app.use(express.json({ limit: '1mb' }));\n app.use(createDefaultLimiter());\n\n // ── CSRF protection setup ───────────────────────────────────────────────────\n const { generateCsrfToken, doubleCsrfProtection } = doubleCsrf({\n getSecret: () => process.env['CODE_INTEL_CSRF_SECRET'] ?? 'csrf-secret-change-in-production',\n getSessionIdentifier: (req) => {\n // Use the session cookie value or IP as the session identifier\n const cookieHeader = req.headers['cookie'] ?? '';\n const match = cookieHeader.match(/code_intel_session=([^;]+)/);\n return match ? decodeURIComponent(match[1] ?? '') : (req.ip ?? 'anonymous');\n },\n cookieName: process.env['NODE_ENV'] === 'production' ? '__Host-csrf-token' : 'csrf-token',\n cookieOptions: {\n sameSite: 'strict',\n path: '/',\n secure: process.env['NODE_ENV'] === 'production',\n httpOnly: true,\n },\n size: 64,\n getCsrfTokenFromRequest: (req) => req.headers['x-csrf-token'],\n });\n\n // ── Request ID + Auth middleware ────────────────────────────────────────────\n app.use(requestIdMiddleware);\n app.use(authMiddleware);\n\n // ── X-Index-Version header on every response ─────────────────────────────\n app.use((_req: Request, res: Response, next: NextFunction): void => {\n if (workspaceRoot) {\n try {\n const meta = loadMetadata(workspaceRoot);\n if (meta?.indexVersion) res.setHeader('X-Index-Version', meta.indexVersion);\n } catch { /* non-fatal */ }\n }\n next();\n });\n\n // ── Audit log: every authenticated request ──────────────────────────────────\n // Writes an entry to the audit_log table on response finish.\n // Skips /health/* and /metrics (high-frequency, unauthenticated).\n app.use((req: Request, res: Response, next: NextFunction): void => {\n res.on('finish', () => {\n if (!req.user) return; // unauthenticated requests are not audited here\n if (req.path.startsWith('/health') || req.path === '/metrics') return;\n const outcome: 'allow' | 'deny' = res.statusCode < 400 ? 'allow' : 'deny';\n try {\n const db = getOrCreateUsersDB();\n db.logAccess(req.user.id, req.path, req.method, outcome, req.ip ?? 'unknown');\n } catch { /* never throw from audit — it must not affect the response */ }\n });\n next();\n });\n\n // ── HTTP metrics + OTel span per request ────────────────────────────────────\n app.use((req: Request, res: Response, next: NextFunction): void => {\n const start = Date.now();\n if (isTracingEnabled()) {\n // Import is already cached after the first call\n void import('../observability/tracing.js').then(({ getTracer, sanitizeAttrs: sa }) => {\n const span = getTracer().startSpan(`HTTP ${req.method} ${req.path}`, {\n attributes: sa({\n 'http.method': req.method,\n 'http.url': req.path,\n 'http.request_id': req.requestId ?? '',\n }),\n });\n res.on('finish', () => {\n const route = req.route?.path ?? req.path ?? 'unknown';\n const method = req.method;\n const statusCode = String(res.statusCode);\n const durationSec = (Date.now() - start) / 1000;\n httpRequestsTotal.inc({ method, route, status_code: statusCode });\n httpRequestDurationSeconds.observe({ method, route, status_code: statusCode }, durationSec);\n span.setAttribute('http.status_code', res.statusCode);\n span.setAttribute('http.route', route);\n span.end();\n });\n });\n } else {\n res.on('finish', () => {\n const route = req.route?.path ?? req.path ?? 'unknown';\n const method = req.method;\n const statusCode = String(res.statusCode);\n const durationSec = (Date.now() - start) / 1000;\n httpRequestsTotal.inc({ method, route, status_code: statusCode });\n httpRequestDurationSeconds.observe({ method, route, status_code: statusCode }, durationSec);\n });\n }\n next();\n });\n\n // ── Lazy-init vector index ──────────────────────────────────────────────────\n let vectorIndex: VectorIndex | null = null;\n let vectorIndexBuilding = false;\n let vectorIndexReady = false;\n\n async function ensureVectorIndex(): Promise<VectorIndex | null> {\n if (vectorIndexReady && vectorIndex) return vectorIndex;\n if (!workspaceRoot || vectorIndexBuilding) return null;\n vectorIndexBuilding = true;\n try {\n const { embedNodes } = await import('../search/embedder.js');\n const vdbPath = getVectorDbPath(workspaceRoot);\n const idx = new VectorIndex(vdbPath);\n await idx.init();\n const alreadyBuilt = await idx.isBuilt();\n if (!alreadyBuilt) {\n Logger.info(' [vector] Building embeddings…');\n const nodes = await embedNodes(graph, {\n onProgress: (done, total) => {\n if (done % 50 === 0 || done === total) process.stdout.write(`\\r [vector] ${done}/${total}`);\n },\n });\n Logger.info('');\n await idx.buildIndex(nodes);\n Logger.info(` [vector] Index built: ${nodes.length} embeddings`);\n } else {\n Logger.info(' [vector] Index already exists, skipping rebuild.');\n }\n vectorIndex = idx;\n vectorIndexReady = true;\n return idx;\n } catch (err) {\n Logger.warn(' [vector] Index build failed:', err instanceof Error ? err.message : err);\n return null;\n } finally {\n vectorIndexBuilding = false;\n }\n }\n\n if (workspaceRoot && process.env['NODE_ENV'] !== 'test') {\n setImmediate(() => ensureVectorIndex().catch(() => {}));\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // PUBLIC routes (no auth required)\n // ═══════════════════════════════════════════════════════════════════════════\n\n // ── Prometheus metrics ──────────────────────────────────────────────────────\n\n app.get('/metrics', async (_req, res) => {\n try {\n // Update live gauges before scrape\n pipelineNodesTotal.set({ repo: repoName }, graph.size.nodes);\n pipelineEdgesTotal.set({ repo: repoName }, graph.size.edges);\n activeSessionsTotal.set(sessionStore.size);\n const output = await metricsRegistry.metrics();\n res.set('Content-Type', metricsRegistry.contentType);\n res.end(output);\n } catch (err) {\n res.status(500).end(String(err));\n }\n });\n\n // ── Health checks ───────────────────────────────────────────────────────────\n\n app.get('/health/live', (_req, res) => {\n res.json({ status: 'ok', timestamp: new Date().toISOString() });\n });\n\n app.get('/health/ready', (_req, res) => {\n if (graph.size.nodes === 0 && workspaceRoot) {\n res.status(503).json({ status: 'error', reason: 'Index not loaded yet' });\n return;\n }\n res.json({\n status: 'ok',\n nodes: graph.size.nodes,\n edges: graph.size.edges,\n timestamp: new Date().toISOString(),\n });\n });\n\n app.get('/health/startup', (_req, res) => {\n res.json({ status: 'ok', timestamp: new Date().toISOString() });\n });\n\n // ── Auth routes ─────────────────────────────────────────────────────────────\n\n // Public CSRF token endpoint — clients must call this first\n app.get('/auth/csrf-token', (req, res) => {\n const token = generateCsrfToken(req, res);\n res.json({ csrfToken: token });\n });\n\n // Bootstrap status — tells UI whether first-run setup is needed\n app.get('/auth/bootstrap-status', (_req, res) => {\n const db = getOrCreateUsersDB();\n res.json({ needsBootstrap: !db.hasAnyUser() });\n });\n\n // Apply CSRF protection to all state-changing routes\n app.use(doubleCsrfProtection);\n\n // Bootstrap — create first admin (only works when no users exist)\n app.post('/auth/bootstrap', async (req: Request, res: Response) => {\n const db = getOrCreateUsersDB();\n if (db.hasAnyUser()) {\n res.status(400).json({\n error: {\n code: 'CI-1004',\n message: 'Bootstrap already completed',\n hint: 'An admin account already exists. Use /auth/login instead.',\n requestId: req.requestId,\n timestamp: new Date().toISOString(),\n },\n });\n return;\n }\n const { username, password } = req.body as { username?: string; password?: string };\n if (!username || !password || password.length < 8) {\n res.status(400).json({\n error: {\n code: ErrorCodes.INVALID_REQUEST,\n message: 'username and password (min 8 chars) are required',\n requestId: req.requestId,\n timestamp: new Date().toISOString(),\n },\n });\n return;\n }\n const user = db.createUser(username, password, 'admin');\n const sessionId = createSession({ id: user.id, username: user.username, role: user.role });\n res.setHeader('Set-Cookie', buildSessionCookie(sessionId));\n res.status(201).json({ user: { id: user.id, username: user.username, role: user.role } });\n });\n\n app.post('/auth/login', async (req: Request, res: Response) => {\n const { username, password } = req.body as { username?: string; password?: string };\n if (!username || !password) {\n res.status(400).json({\n error: {\n code: ErrorCodes.INVALID_REQUEST,\n message: 'username and password are required',\n hint: 'Provide { \"username\": \"...\", \"password\": \"...\" } in request body',\n requestId: req.requestId,\n timestamp: new Date().toISOString(),\n },\n });\n return;\n }\n\n const db = getOrCreateUsersDB();\n const user = db.findUserByUsername(username);\n\n if (!user) {\n db.logAccess('unknown', `/auth/login`, 'login', 'deny', req.ip ?? 'unknown');\n authAttemptsTotal.inc({ method: 'local', outcome: 'failure' });\n res.status(401).json({\n error: {\n code: ErrorCodes.UNAUTHORIZED,\n message: 'Invalid username or password',\n hint: 'Check your credentials and try again',\n requestId: req.requestId,\n timestamp: new Date().toISOString(),\n },\n });\n return;\n }\n\n const valid = await verifyPassword(password, user.passwordHash);\n if (!valid) {\n db.logAccess(user.id, `/auth/login`, 'login', 'deny', req.ip ?? 'unknown');\n authAttemptsTotal.inc({ method: 'local', outcome: 'failure' });\n res.status(401).json({\n error: {\n code: ErrorCodes.UNAUTHORIZED,\n message: 'Invalid username or password',\n hint: 'Check your credentials and try again',\n requestId: req.requestId,\n timestamp: new Date().toISOString(),\n },\n });\n return;\n }\n\n const sessionId = createSession({ id: user.id, username: user.username, role: user.role });\n db.logAccess(user.id, '/auth/login', 'login', 'allow', req.ip ?? 'unknown');\n authAttemptsTotal.inc({ method: 'local', outcome: 'success' });\n res.setHeader('Set-Cookie', buildSessionCookie(sessionId));\n res.json({ user: { id: user.id, username: user.username, role: user.role } });\n });\n\n app.post('/auth/logout', (req: Request, res: Response) => {\n res.setHeader('Set-Cookie', clearSessionCookie());\n res.json({ message: 'Logged out successfully' });\n });\n\n app.get('/auth/status', (req: Request, res: Response) => {\n if (!req.user) {\n res.status(401).json({ authenticated: false });\n return;\n }\n res.json({\n authenticated: true,\n user: { id: req.user.id, username: req.user.username, role: req.user.role },\n authMethod: req.user.authMethod,\n });\n });\n\n // ── OIDC / OAuth2 routes (1.3) ──────────────────────────────────────────────\n\n // Probe: is OIDC configured?\n app.get('/auth/oidc/status', async (_req, res) => {\n if (!isOIDCConfigured()) {\n res.json({ enabled: false });\n return;\n }\n const cfg = getOIDCConfig()!;\n // Attempt discovery to confirm provider is reachable\n const discovered = await getDiscoveredConfig();\n res.json({\n enabled: true,\n issuer: cfg.issuer,\n reachable: discovered !== null,\n });\n });\n\n // Step 1: redirect to provider\n app.get('/auth/oidc/login', async (req: Request, res: Response) => {\n if (!isOIDCConfigured()) {\n res.status(503).json({\n error: {\n code: 'CI-1005',\n message: 'OIDC is not configured',\n hint: 'Set CODE_INTEL_OIDC_ISSUER, CODE_INTEL_OIDC_CLIENT_ID, CODE_INTEL_OIDC_CLIENT_SECRET env vars',\n requestId: req.requestId,\n timestamp: new Date().toISOString(),\n },\n });\n return;\n }\n\n try {\n const result = await buildOIDCLoginUrl();\n if (!result) {\n res.status(503).json({\n error: {\n code: 'CI-1005',\n message: 'OIDC provider unreachable',\n hint: 'The OIDC issuer could not be reached. Check CODE_INTEL_OIDC_ISSUER and network connectivity.',\n requestId: req.requestId,\n timestamp: new Date().toISOString(),\n },\n });\n return;\n }\n res.redirect(302, result.redirectUrl);\n } catch (err) {\n Logger.warn('[oidc] Login redirect failed:', err instanceof Error ? err.message : err);\n res.status(500).json({\n error: {\n code: 'CI-5000',\n message: 'OIDC login initiation failed',\n hint: err instanceof Error ? err.message : 'Unknown error',\n requestId: req.requestId,\n timestamp: new Date().toISOString(),\n },\n });\n }\n });\n\n // Step 2: provider redirects back here with code + state\n app.get('/auth/callback', async (req: Request, res: Response) => {\n const { state, error, error_description } = req.query as Record<string, string | undefined>;\n\n // Provider error (e.g. user denied)\n if (error) {\n Logger.warn('[oidc] Provider returned error:', error, error_description);\n res.redirect(302, `/?oidc_error=${encodeURIComponent(error_description ?? error)}`);\n return;\n }\n\n if (!state) {\n res.status(400).json({\n error: {\n code: 'CI-1200',\n message: 'Missing state parameter in OIDC callback',\n requestId: req.requestId,\n timestamp: new Date().toISOString(),\n },\n });\n return;\n }\n\n try {\n const currentUrl = new URL(\n req.originalUrl,\n getOIDCConfig()?.redirectUri ?? `http://localhost:4747`,\n );\n const { userInfo } = await handleOIDCCallback(currentUrl, state);\n\n // Determine provider from issuer\n const cfg = getOIDCConfig()!;\n const provider = cfg.issuer;\n\n const db = getOrCreateUsersDB();\n\n // Find or provision user\n let user = db.findUserByOIDC(provider, userInfo.sub);\n if (user) {\n // Existing user — update last login\n db.touchOIDCIdentity(provider, userInfo.sub);\n authAttemptsTotal.inc({ method: 'oidc', outcome: 'success' });\n } else {\n // New user — auto-provision with default role\n const username = deriveUsername(userInfo);\n // Ensure username uniqueness by appending a suffix if needed\n let finalUsername = username;\n let suffix = 1;\n while (db.findUserByUsername(finalUsername)) {\n finalUsername = `${username}_${suffix++}`;\n }\n const { user: newUser } = db.provisionOIDCUser(\n finalUsername,\n cfg.defaultRole,\n provider,\n userInfo.sub,\n userInfo.email,\n userInfo.name,\n );\n user = { ...newUser, oidcIdentityId: '' };\n authAttemptsTotal.inc({ method: 'oidc', outcome: 'success' });\n Logger.info(`[oidc] Auto-provisioned new user: ${finalUsername} (${cfg.defaultRole})`);\n }\n\n const sessionId = createSession({ id: user.id, username: user.username, role: user.role });\n db.logAccess(user.id, '/auth/callback', 'oidc-login', 'allow', req.ip ?? 'unknown');\n res.setHeader('Set-Cookie', buildSessionCookie(sessionId));\n // Redirect back to the web UI\n res.redirect(302, '/');\n } catch (err) {\n Logger.warn('[oidc] Callback failed:', err instanceof Error ? err.message : err);\n authAttemptsTotal.inc({ method: 'oidc', outcome: 'failure' });\n const msg = err instanceof Error ? err.message : 'OIDC callback failed';\n res.redirect(302, `/?oidc_error=${encodeURIComponent(msg)}`);\n }\n });\n\n // OIDC refresh — called by clients with a stored OIDC refresh token\n app.post('/auth/oidc/refresh', async (req: Request, res: Response) => {\n const { refresh_token } = req.body as { refresh_token?: string };\n if (!refresh_token) {\n res.status(400).json({\n error: {\n code: 'CI-1200',\n message: 'refresh_token required',\n requestId: req.requestId,\n timestamp: new Date().toISOString(),\n },\n });\n return;\n }\n const result = await refreshOIDCToken(refresh_token);\n if (!result) {\n res.status(401).json({\n error: {\n code: 'CI-1000',\n message: 'Refresh token invalid or OIDC provider unreachable',\n hint: 'Re-login via /auth/oidc/login',\n requestId: req.requestId,\n timestamp: new Date().toISOString(),\n },\n });\n return;\n }\n res.json(result);\n });\n\n // Fallback: OIDC unavailable → redirect to local login\n app.get('/auth/oidc/fallback', (_req, res) => {\n res.redirect(302, '/login');\n });\n\n // ═══════════════════════════════════════════════════════════════════════════\n // PROTECTED routes — require authentication\n // ═══════════════════════════════════════════════════════════════════════════\n\n app.use('/api/v1', requireAuth);\n\n // ── Legacy /api/* → redirect to /api/v1/* ──────────────────────────────────\n app.use('/api', (req: Request, res: Response, next: NextFunction) => {\n if (!req.path.startsWith('/v1')) {\n res.redirect(301, `/api/v1${req.path}`);\n return;\n }\n next();\n });\n\n // ── OpenAPI spec + Swagger UI (dev only) ────────────────────────────────────\n app.get('/api/v1/openapi.json', (_req, res) => {\n res.json(openApiSpec);\n });\n\n if (process.env['NODE_ENV'] !== 'production') {\n app.get('/api/v1/docs', (_req, res) => {\n res.setHeader('Content-Type', 'text/html');\n res.end(`<!DOCTYPE html>\n<html>\n<head>\n <title>Code Intel API Docs</title>\n <meta charset=\"utf-8\"/>\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <link rel=\"stylesheet\" type=\"text/css\" href=\"https://unpkg.com/swagger-ui-dist@5/swagger-ui.css\" >\n</head>\n<body>\n <div id=\"swagger-ui\"></div>\n <script src=\"https://unpkg.com/swagger-ui-dist@5/swagger-ui-bundle.js\"> </script>\n <script>\n SwaggerUIBundle({\n url: \"/api/v1/openapi.json\",\n dom_id: '#swagger-ui',\n presets: [SwaggerUIBundle.presets.apis, SwaggerUIBundle.SwaggerUIStandalonePreset],\n layout: \"BaseLayout\"\n })\n </script>\n</body>\n</html>`);\n });\n }\n\n // ── Health (detailed) ───────────────────────────────────────────────────────\n app.get('/api/v1/health', (req: Request, res: Response) => {\n const db = getOrCreateUsersDB();\n const memUsage = process.memoryUsage();\n res.json({\n status: 'ok',\n nodes: graph.size.nodes,\n edges: graph.size.edges,\n users: db.hasAnyUser(),\n workspaceRoot,\n watching: watcherState?.watching ?? false,\n lastWatchEvent: watcherState?.lastEventAt\n ? new Date(watcherState.lastEventAt).toISOString()\n : null,\n memory: {\n heapUsedMb: Math.round(memUsage.heapUsed / 1024 / 1024),\n heapTotalMb: Math.round(memUsage.heapTotal / 1024 / 1024),\n rssMb: Math.round(memUsage.rss / 1024 / 1024),\n },\n timestamp: new Date().toISOString(),\n requestId: req.requestId,\n });\n });\n\n // ── Repos ───────────────────────────────────────────────────────────────────\n app.get('/api/v1/repos', (_req, res) => {\n const registry = loadRegistry();\n if (registry.length === 0) {\n res.json([{ name: repoName, path: workspaceRoot ?? '', nodes: graph.size.nodes, edges: graph.size.edges, indexedAt: null }]);\n return;\n }\n res.json(registry.map((r) => ({\n name: r.name,\n path: r.path,\n nodes: r.stats.nodes,\n edges: r.stats.edges,\n indexedAt: r.indexedAt,\n active: r.path === workspaceRoot,\n })));\n });\n\n // ── Graph helpers ───────────────────────────────────────────────────────────\n async function loadRepoGraph(requestedRepo: string): Promise<KnowledgeGraph | null> {\n if (requestedRepo === repoName) return graph;\n const registry = loadRegistry();\n const entry = registry.find((r) => r.name === requestedRepo || r.path === requestedRepo);\n if (!entry) return null;\n const dbPath = path.join(entry.path, '.code-intel', 'graph.db');\n if (!fs.existsSync(dbPath)) return null;\n const repoGraph = createKnowledgeGraph();\n const db = new DbManager(dbPath);\n try {\n await db.init();\n await loadGraphFromDB(repoGraph, db);\n db.close();\n return repoGraph;\n } catch {\n db.close();\n return null;\n }\n }\n\n async function getGraphForRepo(requestedRepo: string | undefined): Promise<KnowledgeGraph> {\n if (!requestedRepo || requestedRepo === repoName) return graph;\n const g = await loadRepoGraph(requestedRepo);\n return g ?? graph;\n }\n\n // ── Graph download ──────────────────────────────────────────────────────────\n app.get('/api/v1/graph/:repo', requireRepoAccess((req) => {\n const p = req.params['repo'];\n const repo = Array.isArray(p) ? p[0] : p;\n return repo ? decodeURIComponent(repo) : undefined;\n }), async (req, res) => {\n const rawRepo = req.params['repo'];\n const requestedRepo = decodeURIComponent(Array.isArray(rawRepo) ? (rawRepo[0] ?? '') : (rawRepo ?? ''));\n const g = await loadRepoGraph(requestedRepo);\n if (!g) {\n res.status(404).json({\n error: {\n code: ErrorCodes.NOT_FOUND,\n message: `Repo \"${requestedRepo}\" not found or not indexed`,\n hint: `Run: code-intel analyze <path>`,\n requestId: req.requestId,\n timestamp: new Date().toISOString(),\n },\n });\n return;\n }\n res.json({ nodes: [...g.allNodes()], edges: [...g.allEdges()] });\n });\n\n // ── Search ──────────────────────────────────────────────────────────────────\n app.post('/api/v1/search', requireToolScope('search'), async (req, res) => {\n const { query, limit, repo } = req.body as { query?: string; limit?: number; repo?: string };\n const g = await getGraphForRepo(repo);\n const vdbPath = workspaceRoot ? getVectorDbPath(workspaceRoot) : undefined;\n const { results, searchMode } = await hybridSearch(g, query ?? '', limit ?? 20, { vectorDbPath: vdbPath });\n res.json({ results, searchMode });\n });\n\n // ── Vector search ───────────────────────────────────────────────────────────\n app.post('/api/v1/vector-search', async (req, res) => {\n const { query, limit = 10 } = req.body as { query?: string; limit?: number };\n if (!query) { res.status(400).json({ error: { code: ErrorCodes.INVALID_REQUEST, message: 'Missing query', hint: 'Provide { \"query\": \"...\" } in request body' } }); return; }\n const idx = await ensureVectorIndex();\n if (!idx) {\n const results = textSearch(graph, query, limit);\n res.json({ results, source: 'text-fallback', vectorReady: false });\n return;\n }\n try {\n const { pipeline } = await import('@huggingface/transformers');\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const embedder = (await pipeline('feature-extraction', 'Xenova/all-MiniLM-L6-v2')) as unknown as (text: string, opts: Record<string, unknown>) => Promise<{ data: Float32Array }>;\n const out = await embedder(query, { pooling: 'mean', normalize: true });\n const queryEmbedding = Array.from(out.data);\n const hits = await idx.search(queryEmbedding, limit);\n res.json({ results: hits.map((h) => ({ nodeId: h.nodeId, name: h.name, kind: h.kind, filePath: h.filePath, score: h.score })), source: 'vector', vectorReady: true });\n } catch (err) {\n const results = textSearch(graph, query, limit);\n res.json({ results, source: 'text-fallback', vectorReady: false, error: err instanceof Error ? err.message : String(err) });\n }\n });\n\n // ── Vector status ───────────────────────────────────────────────────────────\n app.get('/api/v1/vector-status', (_req, res) => {\n res.json({ ready: vectorIndexReady, building: vectorIndexBuilding });\n });\n\n // ── File read ───────────────────────────────────────────────────────────────\n app.post('/api/v1/files/read', requireToolScope('read_file'), (req, res) => {\n const { file_path } = req.body as { file_path?: string };\n if (!file_path) { res.status(400).json({ error: { code: ErrorCodes.INVALID_REQUEST, message: 'Missing file_path' } }); return; }\n // Security: must be within a known repo path\n const registry = loadRegistry();\n const isAllowed = workspaceRoot\n ? file_path.startsWith(workspaceRoot)\n : registry.some((r) => file_path.startsWith(r.path));\n if (!isAllowed) {\n res.status(403).json({ error: { code: ErrorCodes.FORBIDDEN, message: 'Access denied', hint: 'File path must be within an indexed repository' } });\n return;\n }\n try {\n const content = fs.readFileSync(file_path, 'utf-8');\n res.json({ content });\n } catch {\n res.status(404).json({ error: { code: ErrorCodes.NOT_FOUND, message: 'File not found' } });\n }\n });\n\n // ── Grep ────────────────────────────────────────────────────────────────────\n app.post('/api/v1/grep', requireToolScope('grep'), (req, res) => {\n const { pattern, file_paths } = req.body as { pattern?: string; file_paths?: string[] };\n const results: { file: string; line: number; text: string }[] = [];\n try {\n const regex = new RegExp(pattern ?? '', 'gi');\n const paths: string[] = file_paths ?? [];\n if (paths.length === 0) {\n for (const node of graph.allNodes()) {\n if (node.kind === 'file' && node.content) {\n const lines = node.content.split('\\n');\n for (let i = 0; i < lines.length; i++) {\n if (regex.test(lines[i]!)) results.push({ file: node.filePath, line: i + 1, text: lines[i]!.trim() });\n regex.lastIndex = 0;\n }\n }\n }\n }\n res.json({ results: results.slice(0, 100) });\n } catch {\n res.status(400).json({ error: { code: ErrorCodes.INVALID_REQUEST, message: 'Invalid regex pattern' } });\n }\n });\n\n // ── Cypher query ────────────────────────────────────────────────────────────\n app.post('/api/v1/cypher', async (req, res) => {\n const { query: q } = req.body as { query?: string };\n if (!q) { res.status(400).json({ error: { code: ErrorCodes.INVALID_REQUEST, message: 'Missing query' } }); return; }\n if (workspaceRoot) {\n try {\n const dbPath = getDbPath(workspaceRoot);\n const dbm = new DbManager(dbPath);\n await dbm.init();\n const rows = await dbm.query(q);\n dbm.close();\n res.json({ results: rows });\n return;\n } catch { /* fall through */ }\n }\n try {\n const nameMatch = q.match(/name\\s*=\\s*['\"]([^'\"]+)['\"]/i);\n if (nameMatch) {\n const name = nameMatch[1];\n const results = [];\n for (const node of graph.allNodes()) {\n if (node.name === name) {\n results.push({ node, incoming: [...graph.findEdgesTo(node.id)].length, outgoing: [...graph.findEdgesFrom(node.id)].length });\n }\n }\n res.json({ results });\n return;\n }\n const kindMatch = q.match(/:\\s*(\\w+)/);\n if (kindMatch) {\n const kind = kindMatch[1];\n const results = [];\n for (const node of graph.allNodes()) {\n if (node.kind === kind) results.push(node);\n if (results.length >= 50) break;\n }\n res.json({ results });\n return;\n }\n res.json({ results: [], message: 'Query not recognized.' });\n } catch {\n res.status(400).json({ error: { code: ErrorCodes.INVALID_REQUEST, message: 'Invalid query' } });\n }\n });\n\n // ── Node detail ─────────────────────────────────────────────────────────────\n app.get('/api/v1/nodes/:id', async (req, res) => {\n const nodeId = decodeURIComponent(req.params.id);\n const g = await getGraphForRepo(req.query['repo'] as string | undefined);\n const node = g.getNode(nodeId);\n if (!node) {\n res.status(404).json({ error: { code: ErrorCodes.NOT_FOUND, message: 'Node not found', requestId: req.requestId } });\n return;\n }\n const incoming = [...g.findEdgesTo(nodeId)];\n const outgoing = [...g.findEdgesFrom(nodeId)];\n res.json({\n node,\n callers: incoming.filter((e) => e.kind === 'calls').map((e) => ({ id: e.source, name: g.getNode(e.source)?.name, weight: e.weight })),\n callees: outgoing.filter((e) => e.kind === 'calls').map((e) => ({ id: e.target, name: g.getNode(e.target)?.name, weight: e.weight })),\n imports: outgoing.filter((e) => e.kind === 'imports').map((e) => ({ id: e.target, name: g.getNode(e.target)?.name })),\n importedBy: incoming.filter((e) => e.kind === 'imports').map((e) => ({ id: e.source, name: g.getNode(e.source)?.name })),\n extends: outgoing.filter((e) => e.kind === 'extends').map((e) => ({ id: e.target, name: g.getNode(e.target)?.name })),\n implementsEdges: outgoing.filter((e) => e.kind === 'implements').map((e) => ({ id: e.target, name: g.getNode(e.target)?.name })),\n members: outgoing.filter((e) => e.kind === 'has_member').map((e) => ({ id: e.target, name: g.getNode(e.target)?.name, kind: g.getNode(e.target)?.kind })),\n cluster: incoming.filter((e) => e.kind === 'belongs_to').map((e) => g.getNode(e.target)?.name)[0],\n });\n });\n\n // ── Blast radius ────────────────────────────────────────────────────────────\n app.post('/api/v1/blast-radius', async (req, res) => {\n const { target, direction = 'both', max_hops = 5, repo } = req.body as { target?: string; direction?: string; max_hops?: number; repo?: string };\n const g = await getGraphForRepo(repo);\n let targetNode = null;\n for (const node of g.allNodes()) {\n if (node.name === target || node.id === target) { targetNode = node; break; }\n }\n if (!targetNode) {\n res.status(404).json({ error: { code: ErrorCodes.NOT_FOUND, message: `Symbol \"${target}\" not found`, requestId: req.requestId } });\n return;\n }\n const affected = new Map<string, { name: string; kind: string; depth: number }>();\n const queue: { id: string; depth: number }[] = [{ id: targetNode.id, depth: 0 }];\n const visited = new Set<string>();\n while (queue.length > 0) {\n const { id, depth } = queue.shift()!;\n if (visited.has(id) || depth > max_hops) continue;\n visited.add(id);\n const node = g.getNode(id);\n if (node) affected.set(id, { name: node.name, kind: node.kind, depth });\n if (direction === 'callers' || direction === 'both') {\n for (const edge of g.findEdgesTo(id)) {\n if (edge.kind === 'calls' || edge.kind === 'imports') queue.push({ id: edge.source, depth: depth + 1 });\n }\n }\n if (direction === 'callees' || direction === 'both') {\n for (const edge of g.findEdgesFrom(id)) {\n if (edge.kind === 'calls' || edge.kind === 'imports') queue.push({ id: edge.target, depth: depth + 1 });\n }\n }\n }\n res.json({\n target: targetNode.name,\n affectedCount: [...affected.values()].filter((a) => a.depth > 0).length,\n affected: [...affected.entries()].map(([id, info]) => ({ id, ...info })).filter((a) => a.depth > 0),\n });\n });\n\n // ── Flows ───────────────────────────────────────────────────────────────────\n app.get('/api/v1/flows', async (req, res) => {\n const g = await getGraphForRepo(req.query['repo'] as string | undefined);\n const flows: { id: string; name: string; steps: unknown }[] = [];\n for (const node of g.allNodes()) {\n if (node.kind === 'flow') flows.push({ id: node.id, name: node.name, steps: node.metadata?.steps });\n }\n res.json({ flows });\n });\n\n // ── Clusters ────────────────────────────────────────────────────────────────\n app.get('/api/v1/clusters', async (req, res) => {\n const g = await getGraphForRepo(req.query['repo'] as string | undefined);\n const clusters: { id: string; name: string; memberCount: number }[] = [];\n for (const node of g.allNodes()) {\n if (node.kind === 'cluster') clusters.push({ id: node.id, name: node.name, memberCount: (node.metadata?.memberCount as number) ?? 0 });\n }\n res.json({ clusters });\n });\n\n // ── Jobs ────────────────────────────────────────────────────────────────────\n app.get('/api/v1/jobs', (req: Request, res: Response) => {\n const { status, repo } = req.query as { status?: string; repo?: string };\n const jobsDB = getOrCreateJobsDB();\n const filters: { status?: JobStatus; repoPath?: string } = {};\n if (status) filters.status = status as JobStatus;\n if (repo) filters.repoPath = repo;\n const jobs = jobsDB.listJobs(filters);\n res.json({ jobs });\n });\n\n app.delete('/api/v1/jobs/:id', (req: Request, res: Response) => {\n const jobsDB = getOrCreateJobsDB();\n const { id } = req.params;\n const job = jobsDB.getJob(id as string);\n if (!job) {\n res.status(404).json({\n error: {\n code: ErrorCodes.NOT_FOUND,\n message: `Job \"${id}\" not found`,\n requestId: req.requestId,\n timestamp: new Date().toISOString(),\n },\n });\n return;\n }\n const cancelled = jobsDB.cancel(id as string);\n if (cancelled) {\n res.json({ message: `Job \"${id}\" cancelled`, id });\n } else {\n res.status(409).json({\n error: {\n code: ErrorCodes.INVALID_REQUEST,\n message: `Job \"${id}\" cannot be cancelled (status: ${job.status})`,\n hint: 'Only pending or running jobs can be cancelled',\n requestId: req.requestId,\n timestamp: new Date().toISOString(),\n },\n });\n }\n });\n\n // ── Groups ──────────────────────────────────────────────────────────────────\n app.get('/api/v1/groups', (_req, res) => {\n const groups = listGroups();\n res.json(groups.map((g) => ({ name: g.name, memberCount: g.members.length, lastSync: g.lastSync ?? null, createdAt: g.createdAt })));\n });\n\n app.get('/api/v1/groups/:name', (req, res) => {\n const group = loadGroup(req.params.name);\n if (!group) { res.status(404).json({ error: { code: ErrorCodes.NOT_FOUND, message: 'Group not found' } }); return; }\n res.json(group);\n });\n\n app.get('/api/v1/groups/:name/contracts', (req, res) => {\n const result = loadSyncResult(req.params.name);\n if (!result) { res.status(404).json({ error: { code: ErrorCodes.NOT_FOUND, message: 'No sync result. Run sync first.' } }); return; }\n res.json(result);\n });\n\n app.post('/api/v1/groups/:name/sync', async (req, res) => {\n const group = loadGroup(req.params.name);\n if (!group) { res.status(404).json({ error: { code: ErrorCodes.NOT_FOUND, message: 'Group not found' } }); return; }\n try {\n const result = await syncGroup(group);\n saveSyncResult(result);\n group.lastSync = result.syncedAt;\n const { saveGroup } = await import('../multi-repo/group-registry.js');\n saveGroup(group);\n res.json(result);\n } catch (err) {\n res.status(500).json({ error: { code: ErrorCodes.INTERNAL_ERROR, message: err instanceof Error ? err.message : String(err) } });\n }\n });\n\n app.post('/api/v1/groups/:name/search', async (req, res) => {\n const group = loadGroup(req.params.name);\n if (!group) { res.status(404).json({ error: { code: ErrorCodes.NOT_FOUND, message: 'Group not found' } }); return; }\n const { q, limit = 20 } = req.body as { q?: string; limit?: number };\n if (!q) { res.status(400).json({ error: { code: ErrorCodes.INVALID_REQUEST, message: 'Missing query q' } }); return; }\n try {\n const { perRepo, merged } = await queryGroup(group, q, limit);\n res.json({ perRepo, merged });\n } catch (err) {\n res.status(500).json({ error: { code: ErrorCodes.INTERNAL_ERROR, message: err instanceof Error ? err.message : String(err) } });\n }\n });\n\n app.get('/api/v1/groups/:name/graph', async (req, res) => {\n const group = loadGroup(req.params.name);\n if (!group) { res.status(404).json({ error: { code: ErrorCodes.NOT_FOUND, message: 'Group not found' } }); return; }\n const registry = loadRegistry();\n const mergedGraph = createKnowledgeGraph();\n for (const member of group.members) {\n const regEntry = registry.find((r) => r.name === member.registryName);\n if (!regEntry) continue;\n const dbPath = path.join(regEntry.path, '.code-intel', 'graph.db');\n if (!fs.existsSync(dbPath)) continue;\n const db = new DbManager(dbPath);\n try {\n await db.init();\n await loadGraphFromDB(mergedGraph, db);\n db.close();\n } catch { db.close(); }\n }\n res.json({ nodes: [...mergedGraph.allNodes()], edges: [...mergedGraph.allEdges()] });\n });\n\n // ── Web UI static files ─────────────────────────────────────────────────────\n if (fs.existsSync(WEB_DIST)) {\n app.use(express.static(WEB_DIST));\n app.get('/{*path}', (_req, res) => {\n res.sendFile(path.join(WEB_DIST, 'index.html'));\n });\n }\n\n // ── Admin API — requires admin role ──────────────────────────────────────────\n app.use('/admin', requireRole('admin'));\n\n // List users\n app.get('/admin/users', (_req, res) => {\n const db = getOrCreateUsersDB();\n res.json({ users: db.listUsers() });\n });\n\n // Create user\n app.post('/admin/users', async (req: Request, res: Response) => {\n const { username, password, role } = req.body as { username?: string; password?: string; role?: string };\n if (!username || !password || !role) {\n res.status(400).json({ error: { code: ErrorCodes.INVALID_REQUEST, message: 'username, password, role required', requestId: req.requestId, timestamp: new Date().toISOString() } });\n return;\n }\n const validRoles: Role[] = ['admin', 'analyst', 'viewer', 'repo-owner'];\n if (!validRoles.includes(role as Role)) {\n res.status(400).json({ error: { code: ErrorCodes.INVALID_REQUEST, message: `role must be one of: ${validRoles.join(', ')}`, requestId: req.requestId, timestamp: new Date().toISOString() } });\n return;\n }\n const db = getOrCreateUsersDB();\n const user = db.createUser(username, password, role as Role);\n res.status(201).json({ user });\n });\n\n // Delete user\n app.delete('/admin/users/:username', (req: Request, res: Response) => {\n const { username } = req.params;\n const db = getOrCreateUsersDB();\n db.deleteUser(username as string);\n res.json({ message: `User ${username} deleted` });\n });\n\n // Set user role\n app.patch('/admin/users/:username/role', (req: Request, res: Response) => {\n const { username } = req.params;\n const { role } = req.body as { role?: string };\n const validRoles: Role[] = ['admin', 'analyst', 'viewer', 'repo-owner'];\n if (!role || !validRoles.includes(role as Role)) {\n res.status(400).json({ error: { code: ErrorCodes.INVALID_REQUEST, message: 'valid role required', requestId: req.requestId, timestamp: new Date().toISOString() } });\n return;\n }\n const db = getOrCreateUsersDB();\n db.setRole(username as string, role as Role);\n res.json({ message: `Role updated` });\n });\n\n // List tokens\n app.get('/admin/tokens', (_req, res) => {\n const db = getOrCreateUsersDB();\n res.json({ tokens: db.listTokens() });\n });\n\n // Revoke token\n app.delete('/admin/tokens/:id', (req: Request, res: Response) => {\n const db = getOrCreateUsersDB();\n db.revokeToken(req.params.id as string);\n res.json({ message: 'Token revoked' });\n });\n\n // Governance log\n app.get('/admin/governance/log', (req: Request, res: Response) => {\n const limit = Math.min(parseInt((req.query['limit'] as string | undefined) ?? '100', 10), 1000);\n const entries = governanceLogger.readLog(limit);\n res.json({ entries, count: entries.length, enabled: governanceLogger.isEnabled() });\n });\n\n // ── CSRF error handler ──────────────────────────────────────────────────────\n app.use((err: unknown, req: Request, res: Response, next: NextFunction): void => {\n if (err && typeof err === 'object' && 'code' in err && (err as { code: string }).code === 'EBADCSRFTOKEN') {\n res.status(403).json({\n error: {\n code: 'CI-1003',\n message: 'Invalid CSRF token',\n hint: 'Fetch a fresh CSRF token from GET /auth/csrf-token and include it as X-CSRF-Token header',\n requestId: (req as Request & { requestId?: string }).requestId,\n timestamp: new Date().toISOString(),\n },\n });\n return;\n }\n next(err);\n });\n\n // ── Global error handler ────────────────────────────────────────────────────\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n app.use((err: Error, req: Request, res: Response, _next: NextFunction) => {\n const e = err as Error & { status?: number; statusCode?: number; type?: string };\n const statusCode = e.status ?? e.statusCode;\n // Express 5 throws a 404 Not Found for unmatched routes — handle silently\n if (statusCode === 404) {\n res.status(404).json({\n error: {\n code: ErrorCodes.NOT_FOUND,\n message: 'Not found',\n requestId: req.requestId,\n timestamp: new Date().toISOString(),\n },\n });\n return;\n }\n Logger.error('Unhandled error:', err.message);\n if (err instanceof AppError) {\n res.status(err.statusCode).json({\n error: {\n code: err.code,\n message: err.message,\n hint: err.hint,\n requestId: req.requestId,\n timestamp: new Date().toISOString(),\n },\n });\n return;\n }\n // body-parser errors carry a `status`/`statusCode` and a `type`.\n // Honor them so payload-too-large (413), bad JSON (400), etc. surface\n // with the correct HTTP status.\n const bodyParserStatus = statusCode;\n if (\n typeof bodyParserStatus === 'number' &&\n bodyParserStatus >= 400 &&\n bodyParserStatus < 500\n ) {\n const code =\n e.type === 'entity.too.large'\n ? ErrorCodes.PAYLOAD_TOO_LARGE\n : ErrorCodes.INVALID_REQUEST;\n const message =\n e.type === 'entity.too.large'\n ? 'Request payload too large (max 1MB)'\n : err.message;\n res.status(bodyParserStatus).json({\n error: {\n code,\n message,\n hint:\n e.type === 'entity.too.large'\n ? 'Reduce the request body size to under 1MB.'\n : undefined,\n requestId: req.requestId,\n timestamp: new Date().toISOString(),\n },\n });\n return;\n }\n res.status(500).json({\n error: {\n code: ErrorCodes.INTERNAL_ERROR,\n message: 'Internal server error',\n hint: 'Check server logs for details',\n requestId: req.requestId,\n timestamp: new Date().toISOString(),\n },\n });\n });\n\n return app;\n}\n\nexport interface HttpServerInstance {\n wsServer: import('./websocket-server.js').WsServer | null;\n}\n\nexport async function startHttpServer(\n graph: KnowledgeGraph,\n repoName: string,\n port = 4747,\n workspaceRoot?: string,\n watcherState?: { watching: boolean; lastEventAt: number | null },\n): Promise<HttpServerInstance> {\n // Bootstrap check\n const db = getOrCreateUsersDB();\n if (!db.hasAnyUser()) {\n console.log('\\n ⚠ No admin account found.');\n console.log(' Run: code-intel user create admin --role admin\\n');\n }\n\n const app = createApp(graph, repoName, workspaceRoot, watcherState);\n\n return new Promise((resolve) => {\n const httpServer = app.listen(port, () => {\n Logger.info(`Code Intelligence server running at http://localhost:${port}`);\n Logger.info(` Graph: ${graph.size.nodes} nodes, ${graph.size.edges} edges`);\n Logger.info(` Auth: login at http://localhost:${port}/auth/login`);\n if (watcherState?.watching) {\n Logger.info(` WebSocket: ws://localhost:${port}/ws (graph:updated push enabled)`);\n }\n\n // Start automated backup scheduler if enabled\n const scheduler = createBackupScheduler();\n scheduler.start(workspaceRoot);\n\n // Attach WebSocket server\n let wsServer: import('./websocket-server.js').WsServer | null = null;\n try {\n const { WsServer } = require('./websocket-server.js') as typeof import('./websocket-server.js');\n wsServer = new WsServer(httpServer as import('node:http').Server);\n } catch { /* ws not available in test env */ }\n\n resolve({ wsServer });\n }) as import('node:http').Server;\n });\n}\n","/**\n * Durable Job Model — jobs.db\n *\n * State machine: pending → running → success | failed | cancelled\n * - Jobs survive process restart\n * - Retry with exponential backoff (3 attempts: 5s, 30s, 120s)\n * - Dead-letter queue for exhausted retries\n * - Idempotent job submission\n */\nimport Database from 'better-sqlite3';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\nimport { v4 as uuidv4 } from 'uuid';\n\nexport type JobStatus = 'pending' | 'running' | 'success' | 'failed' | 'cancelled' | 'dead';\nexport type JobKind = 'analyze' | 'backup' | 'sync' | 'embed';\n\nexport interface Job {\n id: string;\n kind: JobKind;\n status: JobStatus;\n repoPath: string;\n params: string; // JSON string\n attempts: number;\n maxAttempts: number;\n createdAt: string;\n startedAt?: string;\n finishedAt?: string;\n error?: string;\n result?: string; // JSON string\n}\n\nconst RETRY_DELAYS_SECONDS = [5, 30, 120];\nconst MAX_ATTEMPTS = 3;\nconst STUCK_THRESHOLD_MINUTES = 30;\n\nexport class JobsDB {\n private db: Database.Database;\n\n constructor(dbPath: string) {\n fs.mkdirSync(path.dirname(dbPath), { recursive: true });\n this.db = new Database(dbPath);\n this.db.pragma('journal_mode = WAL');\n this.db.pragma('foreign_keys = ON');\n this.createTables();\n // On startup, recover any jobs that were 'running' when the process died\n this.recoverStuckJobs();\n }\n\n private createTables(): void {\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS jobs (\n id TEXT PRIMARY KEY,\n kind TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'pending',\n repoPath TEXT NOT NULL,\n params TEXT NOT NULL DEFAULT '{}',\n attempts INTEGER NOT NULL DEFAULT 0,\n maxAttempts INTEGER NOT NULL DEFAULT ${MAX_ATTEMPTS},\n createdAt TEXT NOT NULL,\n startedAt TEXT NULL,\n finishedAt TEXT NULL,\n error TEXT NULL,\n result TEXT NULL,\n nextRetryAt TEXT NULL,\n idempotencyKey TEXT UNIQUE NULL\n );\n CREATE INDEX IF NOT EXISTS jobs_status ON jobs(status);\n CREATE INDEX IF NOT EXISTS jobs_repoPath ON jobs(repoPath);\n `);\n }\n\n /**\n * Submit a job. Idempotent: same idempotencyKey returns the existing job.\n */\n submit(kind: JobKind, repoPath: string, params: Record<string, unknown> = {}, idempotencyKey?: string): Job {\n // Check idempotency\n if (idempotencyKey) {\n const existing = this.db\n .prepare('SELECT * FROM jobs WHERE idempotencyKey = ?')\n .get(idempotencyKey) as Record<string, unknown> | undefined;\n if (existing) return this._mapRow(existing);\n }\n\n const id = uuidv4();\n const createdAt = new Date().toISOString();\n this.db\n .prepare(\n `INSERT INTO jobs (id, kind, status, repoPath, params, attempts, maxAttempts, createdAt, idempotencyKey)\n VALUES (?, ?, 'pending', ?, ?, 0, ?, ?, ?)`,\n )\n .run(id, kind, repoPath, JSON.stringify(params), MAX_ATTEMPTS, createdAt, idempotencyKey ?? null);\n\n return this.getJob(id)!;\n }\n\n getJob(id: string): Job | null {\n const row = this.db.prepare('SELECT * FROM jobs WHERE id = ?').get(id);\n if (!row) return null;\n return this._mapRow(row as Record<string, unknown>);\n }\n\n listJobs(filters: { status?: JobStatus; repoPath?: string } = {}): Job[] {\n let sql = 'SELECT * FROM jobs WHERE 1=1';\n const params: unknown[] = [];\n if (filters.status) { sql += ' AND status = ?'; params.push(filters.status); }\n if (filters.repoPath) { sql += ' AND repoPath = ?'; params.push(filters.repoPath); }\n sql += ' ORDER BY createdAt DESC LIMIT 100';\n const rows = this.db.prepare(sql).all(...params) as Record<string, unknown>[];\n return rows.map((r) => this._mapRow(r));\n }\n\n /**\n * Mark a job as running (transitions from pending).\n */\n markRunning(id: string): void {\n this.db\n .prepare(`UPDATE jobs SET status = 'running', startedAt = ?, attempts = attempts + 1 WHERE id = ? AND status IN ('pending', 'failed')`)\n .run(new Date().toISOString(), id);\n }\n\n /**\n * Mark a job as succeeded.\n */\n markSuccess(id: string, result?: Record<string, unknown>): void {\n this.db\n .prepare(`UPDATE jobs SET status = 'success', finishedAt = ?, result = ? WHERE id = ?`)\n .run(new Date().toISOString(), result ? JSON.stringify(result) : null, id);\n }\n\n /**\n * Mark a job as failed. If max attempts reached, move to 'dead'. Otherwise schedule retry.\n */\n markFailed(id: string, error: string): void {\n const job = this.getJob(id);\n if (!job) return;\n\n if (job.attempts >= job.maxAttempts) {\n this.db\n .prepare(`UPDATE jobs SET status = 'dead', finishedAt = ?, error = ? WHERE id = ?`)\n .run(new Date().toISOString(), error, id);\n } else {\n const delaySeconds = RETRY_DELAYS_SECONDS[job.attempts] ?? 120;\n const nextRetryAt = new Date(Date.now() + delaySeconds * 1000).toISOString();\n this.db\n .prepare(`UPDATE jobs SET status = 'failed', finishedAt = ?, error = ?, nextRetryAt = ? WHERE id = ?`)\n .run(new Date().toISOString(), error, nextRetryAt, id);\n }\n }\n\n /**\n * Cancel a pending or running job.\n */\n cancel(id: string): boolean {\n const info = this.db\n .prepare(`UPDATE jobs SET status = 'cancelled', finishedAt = ? WHERE id = ? AND status IN ('pending', 'running')`)\n .run(new Date().toISOString(), id);\n return (info.changes ?? 0) > 0;\n }\n\n /**\n * Get jobs ready to retry (failed with nextRetryAt in the past).\n */\n getPendingRetries(): Job[] {\n const now = new Date().toISOString();\n const rows = this.db\n .prepare(`SELECT * FROM jobs WHERE status = 'failed' AND nextRetryAt <= ? AND attempts < maxAttempts`)\n .all(now) as Record<string, unknown>[];\n return rows.map((r) => this._mapRow(r));\n }\n\n /**\n * Recover jobs stuck in 'running' state (process crash recovery).\n */\n private recoverStuckJobs(): void {\n const cutoff = new Date(Date.now() - STUCK_THRESHOLD_MINUTES * 60 * 1000).toISOString();\n // Jobs stuck running for > 30min → re-queue as failed for retry\n this.db\n .prepare(`UPDATE jobs SET status = 'failed', error = 'Process crash or stuck job — recovered on restart', nextRetryAt = datetime('now') WHERE status = 'running' AND startedAt < ?`)\n .run(cutoff);\n }\n\n /**\n * Detect jobs stuck for > 30 min (running but not completed).\n */\n detectStuckJobs(): Job[] {\n const cutoff = new Date(Date.now() - STUCK_THRESHOLD_MINUTES * 60 * 1000).toISOString();\n const rows = this.db\n .prepare(`SELECT * FROM jobs WHERE status = 'running' AND startedAt < ?`)\n .all(cutoff) as Record<string, unknown>[];\n return rows.map((r) => this._mapRow(r));\n }\n\n close(): void {\n this.db.close();\n }\n\n private _mapRow(row: Record<string, unknown>): Job {\n return {\n id: row['id'] as string,\n kind: row['kind'] as JobKind,\n status: row['status'] as JobStatus,\n repoPath: row['repoPath'] as string,\n params: row['params'] as string,\n attempts: row['attempts'] as number,\n maxAttempts: row['maxAttempts'] as number,\n createdAt: row['createdAt'] as string,\n startedAt: (row['startedAt'] as string | null) ?? undefined,\n finishedAt: (row['finishedAt'] as string | null) ?? undefined,\n error: (row['error'] as string | null) ?? undefined,\n result: (row['result'] as string | null) ?? undefined,\n };\n }\n}\n\nexport function getJobsDBPath(): string {\n return path.join(os.homedir(), '.code-intel', 'jobs.db');\n}\n\nlet _jobsDB: JobsDB | null = null;\nexport function getOrCreateJobsDB(): JobsDB {\n if (!_jobsDB) _jobsDB = new JobsDB(getJobsDBPath());\n return _jobsDB;\n}\n","/**\n * BackupService — creates AES-256-GCM encrypted backups of all code-intel data.\n *\n * Archives: graph.db, vector.db, meta.json, registry, config\n * Encryption: AES-256-GCM with a per-backup random IV\n * Manifest: SHA-256 hash of each file\n * Optional S3 upload: set CODE_INTEL_BACKUP_S3_BUCKET + credentials\n */\nimport crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport https from 'node:https';\nimport path from 'node:path';\nimport os from 'node:os';\nimport { v4 as uuidv4 } from 'uuid';\n\n// ── S3 configuration ──────────────────────────────────────────────────────────\n\nexport interface S3Config {\n bucket: string;\n region: string;\n accessKeyId: string;\n secretAccessKey: string;\n prefix: string;\n}\n\nexport function getS3Config(): S3Config | null {\n const bucket = process.env['CODE_INTEL_BACKUP_S3_BUCKET'];\n const accessKeyId = process.env['CODE_INTEL_BACKUP_S3_ACCESS_KEY_ID'];\n const secretAccessKey = process.env['CODE_INTEL_BACKUP_S3_SECRET_ACCESS_KEY'];\n if (!bucket || !accessKeyId || !secretAccessKey) return null;\n return {\n bucket,\n region: process.env['CODE_INTEL_BACKUP_S3_REGION'] ?? 'us-east-1',\n accessKeyId,\n secretAccessKey,\n prefix: process.env['CODE_INTEL_BACKUP_S3_PREFIX'] ?? 'code-intel-backups/',\n };\n}\n\n// ── AWS SigV4 signing (pure Node.js, no extra deps) ───────────────────────────\n\nfunction hmac(key: Buffer | string, data: string): Buffer {\n return crypto.createHmac('sha256', key).update(data, 'utf-8').digest();\n}\n\nfunction sha256hex(data: Buffer | string): string {\n return crypto.createHash('sha256').update(data).digest('hex');\n}\n\nfunction sigV4SigningKey(secret: string, date: string, region: string, service: string): Buffer {\n const kDate = hmac(`AWS4${secret}`, date);\n const kRegion = hmac(kDate, region);\n const kService = hmac(kRegion, service);\n return hmac(kService, 'aws4_request');\n}\n\ninterface S3RequestOptions {\n method: string;\n cfg: S3Config;\n key: string; // S3 object key (without leading /)\n body?: Buffer;\n query?: Record<string, string>;\n}\n\nfunction s3Request(opts: S3RequestOptions): Promise<{ statusCode: number; body: string }> {\n return new Promise((resolve, reject) => {\n const { method, cfg, key, body, query } = opts;\n const host = `${cfg.bucket}.s3.${cfg.region}.amazonaws.com`;\n const now = new Date();\n const amzDate = now.toISOString().replace(/[:\\-]|\\.\\d{3}/g, '').slice(0, 15) + 'Z'; // YYYYMMDDTHHMMSSz\n const dateStamp = amzDate.slice(0, 8); // YYYYMMDD\n\n const payloadHash = body ? sha256hex(body) : sha256hex(Buffer.alloc(0));\n const encodedPath = `/${key.split('/').map(encodeURIComponent).join('/')}`;\n\n const queryStr = query\n ? Object.keys(query).sort().map((k) => `${encodeURIComponent(k)}=${encodeURIComponent(query[k]!)}`).join('&')\n : '';\n\n const canonicalHeaders =\n `host:${host}\\n` +\n `x-amz-content-sha256:${payloadHash}\\n` +\n `x-amz-date:${amzDate}\\n`;\n const signedHeaders = 'host;x-amz-content-sha256;x-amz-date';\n\n const canonicalRequest = [\n method,\n encodedPath,\n queryStr,\n canonicalHeaders,\n signedHeaders,\n payloadHash,\n ].join('\\n');\n\n const credentialScope = `${dateStamp}/${cfg.region}/s3/aws4_request`;\n const stringToSign = [\n 'AWS4-HMAC-SHA256',\n amzDate,\n credentialScope,\n sha256hex(Buffer.from(canonicalRequest, 'utf-8')),\n ].join('\\n');\n\n const signingKey = sigV4SigningKey(cfg.secretAccessKey, dateStamp, cfg.region, 's3');\n const signature = hmac(signingKey, stringToSign).toString('hex');\n\n const authorization =\n `AWS4-HMAC-SHA256 Credential=${cfg.accessKeyId}/${credentialScope}, ` +\n `SignedHeaders=${signedHeaders}, Signature=${signature}`;\n\n const reqPath = encodedPath + (queryStr ? `?${queryStr}` : '');\n\n const reqOptions: https.RequestOptions = {\n hostname: host,\n path: reqPath,\n method,\n headers: {\n 'Host': host,\n 'X-Amz-Date': amzDate,\n 'X-Amz-Content-Sha256': payloadHash,\n 'Authorization': authorization,\n ...(body ? { 'Content-Length': String(body.length) } : {}),\n },\n };\n\n const req = https.request(reqOptions, (res) => {\n const chunks: Buffer[] = [];\n res.on('data', (c: Buffer) => chunks.push(c));\n res.on('end', () => resolve({ statusCode: res.statusCode ?? 0, body: Buffer.concat(chunks).toString('utf-8') }));\n });\n req.on('error', reject);\n if (body) req.write(body);\n req.end();\n });\n}\n\nexport interface BackupManifest {\n id: string;\n createdAt: string;\n files: Array<{ name: string; sha256: string; size: number }>;\n version: string;\n}\n\nexport interface BackupEntry {\n id: string;\n createdAt: string;\n path: string;\n size: number;\n repoPath: string;\n}\n\nconst BACKUP_VERSION = '1.0';\nconst ALGORITHM = 'aes-256-gcm';\nconst KEY_LENGTH = 32; // 256 bits\nconst IV_LENGTH = 16;\n\nexport function getBackupDir(): string {\n return path.join(os.homedir(), '.code-intel', 'backups');\n}\n\nexport function getBackupKey(): Buffer {\n const keyHex = process.env['CODE_INTEL_BACKUP_KEY'];\n if (keyHex && keyHex.length >= 64) {\n return Buffer.from(keyHex.slice(0, 64), 'hex');\n }\n // Derive a stable key from machine-specific data (for dev convenience)\n const seed = `code-intel-backup-${os.hostname()}-${os.homedir()}`;\n return crypto.createHash('sha256').update(seed).digest();\n}\n\nfunction sha256File(filePath: string): string {\n const data = fs.readFileSync(filePath);\n return crypto.createHash('sha256').update(data).digest('hex');\n}\n\nfunction encryptBuffer(data: Buffer, key: Buffer): Buffer {\n const iv = crypto.randomBytes(IV_LENGTH);\n const cipher = crypto.createCipheriv(ALGORITHM, key, iv);\n const encrypted = Buffer.concat([cipher.update(data), cipher.final()]);\n const authTag = cipher.getAuthTag();\n // Format: [IV (16)] [authTag (16)] [ciphertext]\n return Buffer.concat([iv, authTag, encrypted]);\n}\n\nfunction decryptBuffer(data: Buffer, key: Buffer): Buffer {\n const iv = data.subarray(0, IV_LENGTH);\n const authTag = data.subarray(IV_LENGTH, IV_LENGTH + 16);\n const ciphertext = data.subarray(IV_LENGTH + 16);\n const decipher = crypto.createDecipheriv(ALGORITHM, key, iv);\n decipher.setAuthTag(authTag);\n return Buffer.concat([decipher.update(ciphertext), decipher.final()]);\n}\n\nexport class BackupService {\n private backupDir: string;\n private key: Buffer;\n\n constructor(backupDir?: string) {\n this.backupDir = backupDir ?? getBackupDir();\n this.key = getBackupKey();\n fs.mkdirSync(this.backupDir, { recursive: true });\n }\n\n /**\n * Create a backup for a repository.\n * Returns the backup entry.\n */\n createBackup(repoPath: string): BackupEntry {\n const codeIntelDir = path.join(repoPath, '.code-intel');\n const id = uuidv4();\n const createdAt = new Date().toISOString();\n\n // Collect files to backup\n const filesToBackup: Array<{ name: string; localPath: string }> = [];\n const candidates = ['graph.db', 'vector.db', 'meta.json'];\n for (const f of candidates) {\n const fp = path.join(codeIntelDir, f);\n if (fs.existsSync(fp)) {\n filesToBackup.push({ name: f, localPath: fp });\n }\n }\n\n // Also backup registry + users DB\n const registryPath = path.join(os.homedir(), '.code-intel', 'registry.json');\n if (fs.existsSync(registryPath)) {\n filesToBackup.push({ name: 'registry.json', localPath: registryPath });\n }\n const usersDbPath = path.join(os.homedir(), '.code-intel', 'users.db');\n if (fs.existsSync(usersDbPath)) {\n filesToBackup.push({ name: 'users.db', localPath: usersDbPath });\n }\n\n if (filesToBackup.length === 0) {\n throw new Error(`No backup files found in ${codeIntelDir}. Run \\`code-intel analyze\\` first.`);\n }\n\n // Build manifest\n const manifest: BackupManifest = {\n id,\n createdAt,\n version: BACKUP_VERSION,\n files: filesToBackup.map((f) => {\n const data = fs.readFileSync(f.localPath);\n return {\n name: f.name,\n sha256: crypto.createHash('sha256').update(data).digest('hex'),\n size: data.length,\n };\n }),\n };\n\n // Pack all into a single encrypted archive (NDJSON-style sections)\n // Format: JSON-header-line\\n[file-chunk-1][file-chunk-2]...\n // Each file chunk: [name-len (4 bytes BE)] [name] [data-len (8 bytes BE)] [data]\n const parts: Buffer[] = [];\n\n // Manifest header\n const manifestBuf = Buffer.from(JSON.stringify(manifest), 'utf-8');\n const manifestLenBuf = Buffer.alloc(4);\n manifestLenBuf.writeUInt32BE(manifestBuf.length, 0);\n parts.push(manifestLenBuf, manifestBuf);\n\n // File sections\n for (const f of filesToBackup) {\n const data = fs.readFileSync(f.localPath);\n const nameBuf = Buffer.from(f.name, 'utf-8');\n const nameLenBuf = Buffer.alloc(2);\n nameLenBuf.writeUInt16BE(nameBuf.length, 0);\n const dataLenBuf = Buffer.alloc(8);\n dataLenBuf.writeBigUInt64BE(BigInt(data.length), 0);\n parts.push(nameLenBuf, nameBuf, dataLenBuf, data);\n }\n\n const plaintext = Buffer.concat(parts);\n const encrypted = encryptBuffer(plaintext, this.key);\n\n const backupFileName = `backup-${id}.cib`;\n const backupPath = path.join(this.backupDir, backupFileName);\n fs.writeFileSync(backupPath, encrypted);\n\n // Write index entry\n const entry: BackupEntry = {\n id,\n createdAt,\n path: backupPath,\n size: encrypted.length,\n repoPath,\n };\n this._appendIndex(entry);\n\n // Auto-upload to S3 if configured\n if (process.env['CODE_INTEL_BACKUP_S3_AUTO_UPLOAD'] === 'true') {\n this.uploadToS3(entry).catch(() => { /* non-fatal */ });\n }\n\n return entry;\n }\n\n // ── S3 methods ─────────────────────────────────────────────────────────────\n\n /** Returns the parsed S3 config or null if not configured. */\n getS3Config(): S3Config | null {\n return getS3Config();\n }\n\n /**\n * Upload a local backup file to S3.\n * Returns the S3 object key.\n */\n async uploadToS3(entry: BackupEntry): Promise<string> {\n const cfg = getS3Config();\n if (!cfg) throw new Error('S3 not configured. Set CODE_INTEL_BACKUP_S3_BUCKET, CODE_INTEL_BACKUP_S3_ACCESS_KEY_ID, CODE_INTEL_BACKUP_S3_SECRET_ACCESS_KEY.');\n\n const fileName = path.basename(entry.path);\n const s3Key = `${cfg.prefix}${fileName}`;\n const body = fs.readFileSync(entry.path);\n\n const result = await s3Request({ method: 'PUT', cfg, key: s3Key, body });\n if (result.statusCode < 200 || result.statusCode >= 300) {\n throw new Error(`S3 upload failed (HTTP ${result.statusCode}): ${result.body.slice(0, 200)}`);\n }\n return s3Key;\n }\n\n /**\n * Download a backup from S3 and save to destPath.\n */\n async downloadFromS3(s3Key: string, destPath: string): Promise<void> {\n const cfg = getS3Config();\n if (!cfg) throw new Error('S3 not configured.');\n\n const result = await s3Request({ method: 'GET', cfg, key: s3Key });\n if (result.statusCode < 200 || result.statusCode >= 300) {\n throw new Error(`S3 download failed (HTTP ${result.statusCode}): ${result.body.slice(0, 200)}`);\n }\n fs.mkdirSync(path.dirname(destPath), { recursive: true });\n fs.writeFileSync(destPath, Buffer.from(result.body, 'binary'));\n }\n\n /**\n * List backup objects in S3 with the configured prefix.\n */\n async listS3Backups(): Promise<Array<{ key: string; size: number; lastModified: string }>> {\n const cfg = getS3Config();\n if (!cfg) throw new Error('S3 not configured.');\n\n const result = await s3Request({\n method: 'GET',\n cfg,\n key: '',\n query: { 'list-type': '2', prefix: cfg.prefix },\n });\n if (result.statusCode < 200 || result.statusCode >= 300) {\n throw new Error(`S3 list failed (HTTP ${result.statusCode}): ${result.body.slice(0, 200)}`);\n }\n\n // Parse S3 LIST XML response (simple regex approach — no xml parser needed)\n const entries: Array<{ key: string; size: number; lastModified: string }> = [];\n const contentsRegex = /<Contents>([\\s\\S]*?)<\\/Contents>/g;\n let match: RegExpExecArray | null;\n while ((match = contentsRegex.exec(result.body)) !== null) {\n const block = match[1]!;\n const keyM = /<Key>(.*?)<\\/Key>/.exec(block);\n const sizeM = /<Size>(\\d+)<\\/Size>/.exec(block);\n const lmM = /<LastModified>(.*?)<\\/LastModified>/.exec(block);\n if (keyM && sizeM && lmM) {\n entries.push({ key: keyM[1]!, size: parseInt(sizeM[1]!, 10), lastModified: lmM[1]! });\n }\n }\n return entries;\n }\n\n /**\n * List all backup entries.\n */\n listBackups(): BackupEntry[] {\n return this._loadIndex();\n }\n\n /**\n * Restore a backup by ID to the target repo path.\n */\n restoreBackup(backupId: string, targetRepoPath?: string): void {\n const entries = this._loadIndex();\n const entry = entries.find((e) => e.id === backupId);\n if (!entry) {\n throw new Error(`Backup \"${backupId}\" not found.`);\n }\n if (!fs.existsSync(entry.path)) {\n throw new Error(`Backup file not found at: ${entry.path}`);\n }\n\n const encrypted = fs.readFileSync(entry.path);\n let plaintext: Buffer;\n try {\n plaintext = decryptBuffer(encrypted, this.key);\n } catch {\n throw new Error(`Backup decryption failed — invalid key or corrupted backup.`);\n }\n\n // Parse manifest\n let offset = 0;\n const manifestLen = plaintext.readUInt32BE(offset);\n offset += 4;\n const manifestStr = plaintext.subarray(offset, offset + manifestLen).toString('utf-8');\n offset += manifestLen;\n const manifest: BackupManifest = JSON.parse(manifestStr);\n\n const restoreBase = targetRepoPath ?? entry.repoPath;\n const codeIntelDir = path.join(restoreBase, '.code-intel');\n fs.mkdirSync(codeIntelDir, { recursive: true });\n\n // Restore files\n for (const fileEntry of manifest.files) {\n const nameLen = plaintext.readUInt16BE(offset);\n offset += 2;\n const name = plaintext.subarray(offset, offset + nameLen).toString('utf-8');\n offset += nameLen;\n const dataLen = Number(plaintext.readBigUInt64BE(offset));\n offset += 8;\n const data = plaintext.subarray(offset, offset + dataLen);\n offset += dataLen;\n\n // Verify SHA-256\n const expectedHash = fileEntry.sha256;\n const actualHash = crypto.createHash('sha256').update(data).digest('hex');\n if (actualHash !== expectedHash) {\n throw new Error(`SHA-256 mismatch for \"${name}\". Backup may be corrupted.`);\n }\n\n // Restore global files to ~/.code-intel/\n let destPath: string;\n if (name === 'registry.json' || name === 'users.db') {\n destPath = path.join(os.homedir(), '.code-intel', name);\n } else {\n destPath = path.join(codeIntelDir, name);\n }\n fs.writeFileSync(destPath, data);\n }\n }\n\n /**\n * Apply retention policy: keep N daily, M weekly, L monthly backups.\n */\n applyRetention(options = { daily: 7, weekly: 4, monthly: 12 }): number {\n const entries = this._loadIndex()\n .filter((e) => fs.existsSync(e.path))\n .sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());\n\n const keep = new Set<string>();\n const now = new Date();\n\n // Keep daily (last N days)\n const dailyCutoff = new Date(now);\n dailyCutoff.setDate(dailyCutoff.getDate() - options.daily);\n for (const e of entries) {\n if (new Date(e.createdAt) >= dailyCutoff) keep.add(e.id);\n }\n\n // Keep weekly (1 per week for last M weeks)\n const weekSeen = new Set<string>();\n for (const e of entries) {\n const d = new Date(e.createdAt);\n const weekKey = `${d.getFullYear()}-W${Math.floor(d.getDate() / 7)}`;\n if (!weekSeen.has(weekKey) && weekSeen.size < options.weekly) {\n weekSeen.add(weekKey);\n keep.add(e.id);\n }\n }\n\n // Keep monthly (1 per month for last L months)\n const monthSeen = new Set<string>();\n for (const e of entries) {\n const d = new Date(e.createdAt);\n const monthKey = `${d.getFullYear()}-${d.getMonth()}`;\n if (!monthSeen.has(monthKey) && monthSeen.size < options.monthly) {\n monthSeen.add(monthKey);\n keep.add(e.id);\n }\n }\n\n // Delete backups not in keep set\n let deleted = 0;\n for (const e of entries) {\n if (!keep.has(e.id)) {\n try {\n fs.unlinkSync(e.path);\n deleted++;\n } catch { /* already gone */ }\n }\n }\n\n // Re-write index with only kept entries\n const kept = entries.filter((e) => keep.has(e.id));\n this._saveIndex(kept);\n return deleted;\n }\n\n // ── Index helpers ──────────────────────────────────────────────────────────\n\n private _indexPath(): string {\n return path.join(this.backupDir, 'index.json');\n }\n\n private _loadIndex(): BackupEntry[] {\n try {\n return JSON.parse(fs.readFileSync(this._indexPath(), 'utf-8')) as BackupEntry[];\n } catch {\n return [];\n }\n }\n\n private _saveIndex(entries: BackupEntry[]): void {\n fs.writeFileSync(this._indexPath(), JSON.stringify(entries, null, 2));\n }\n\n private _appendIndex(entry: BackupEntry): void {\n const entries = this._loadIndex();\n entries.push(entry);\n this._saveIndex(entries);\n }\n}\n","/**\n * BackupScheduler — runs automated backups on a configurable daily schedule.\n *\n * Config via env vars:\n * CODE_INTEL_BACKUP_SCHEDULE_ENABLED Set to 'true' to enable (disabled by default)\n * CODE_INTEL_BACKUP_SCHEDULE_HOUR Hour of day (0-23) to run daily backup (default: 2)\n * CODE_INTEL_BACKUP_SCHEDULE_REPOS Comma-separated repo paths to back up.\n * Falls back to workspaceRoot passed to start().\n */\nimport { BackupService } from './backup-service.js';\nimport Logger from '../shared/logger.js';\n\nexport class BackupScheduler {\n private timer: ReturnType<typeof setTimeout> | null = null;\n private interval: ReturnType<typeof setInterval> | null = null;\n private svc: BackupService;\n\n constructor(backupDir?: string) {\n this.svc = new BackupService(backupDir);\n }\n\n /** Is the scheduler enabled via environment? */\n isEnabled(): boolean {\n return process.env['CODE_INTEL_BACKUP_SCHEDULE_ENABLED'] === 'true';\n }\n\n /**\n * Start the scheduler. The first backup fires at the next occurrence of\n * CODE_INTEL_BACKUP_SCHEDULE_HOUR (default: 2am), then every 24 hours.\n */\n start(workspaceRoot?: string): void {\n if (!this.isEnabled()) return;\n\n const hour = parseInt(process.env['CODE_INTEL_BACKUP_SCHEDULE_HOUR'] ?? '2', 10);\n const repoPaths = this._resolveRepoPaths(workspaceRoot);\n\n if (repoPaths.length === 0) {\n Logger.warn('[backup-scheduler] No repo paths configured — scheduler idle.');\n return;\n }\n\n const msUntilNext = this._msUntilNextHour(hour);\n Logger.info(\n `[backup-scheduler] Scheduled daily backups at ${hour}:00. ` +\n `Next run in ${Math.round(msUntilNext / 1000 / 60)} min for: ${repoPaths.join(', ')}`,\n );\n\n this.timer = setTimeout(() => {\n void this._runBackups(repoPaths);\n // After the first run, fire every 24 hours\n this.interval = setInterval(() => {\n void this._runBackups(repoPaths);\n }, 24 * 60 * 60 * 1000);\n }, msUntilNext);\n }\n\n /** Stop the scheduler. */\n stop(): void {\n if (this.timer) { clearTimeout(this.timer); this.timer = null; }\n if (this.interval) { clearInterval(this.interval); this.interval = null; }\n }\n\n // ── Private helpers ────────────────────────────────────────────────────────\n\n private async _runBackups(repoPaths: string[]): Promise<void> {\n for (const repoPath of repoPaths) {\n try {\n const entry = this.svc.createBackup(repoPath);\n Logger.info(`[backup-scheduler] ✓ Backup created for ${repoPath} → ${entry.id} (${(entry.size / 1024).toFixed(1)} KB)`);\n\n // Apply retention policy after each backup\n const deleted = this.svc.applyRetention();\n if (deleted > 0) {\n Logger.info(`[backup-scheduler] Retention: removed ${deleted} old backup(s).`);\n }\n } catch (err) {\n Logger.warn(`[backup-scheduler] ✗ Backup failed for ${repoPath}: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n }\n\n private _resolveRepoPaths(workspaceRoot?: string): string[] {\n const env = process.env['CODE_INTEL_BACKUP_SCHEDULE_REPOS'];\n if (env) {\n return env.split(',').map((r) => r.trim()).filter(Boolean);\n }\n return workspaceRoot ? [workspaceRoot] : [];\n }\n\n /** Milliseconds until the next occurrence of the given hour (0-23). */\n private _msUntilNextHour(hour: number): number {\n const now = new Date();\n const next = new Date(now);\n next.setHours(hour, 0, 0, 0);\n if (next <= now) {\n // Already passed today — schedule for tomorrow\n next.setDate(next.getDate() + 1);\n }\n return next.getTime() - now.getTime();\n }\n}\n\nexport function createBackupScheduler(backupDir?: string): BackupScheduler {\n return new BackupScheduler(backupDir);\n}\n","/**\n * OIDC / OAuth2 Integration — 1.3\n *\n * Supports: GitHub, GitLab, Google, Okta, Azure AD, and any standards-compliant\n * OpenID Connect provider via issuer URL discovery.\n *\n * Configuration is driven by environment variables:\n * CODE_INTEL_OIDC_ISSUER – issuer URL (e.g. https://accounts.google.com)\n * CODE_INTEL_OIDC_CLIENT_ID – client_id\n * CODE_INTEL_OIDC_CLIENT_SECRET – client_secret\n * CODE_INTEL_OIDC_REDIRECT_URI – callback URL (e.g. http://localhost:4747/auth/callback)\n * CODE_INTEL_OIDC_SCOPES – space-separated, default: \"openid email profile\"\n * CODE_INTEL_OIDC_DEFAULT_ROLE – role assigned on first login, default: \"viewer\"\n * CODE_INTEL_BASE_URL – base URL of this server (used to build redirect_uri when REDIRECT_URI unset)\n */\n\nimport * as oidcClient from 'openid-client';\nimport crypto from 'node:crypto';\nimport type { Role } from './users-db.js';\nimport Logger from '../shared/logger.js';\n\n// ── Known-provider helper configs ────────────────────────────────────────────\n\nexport type OIDCProvider =\n | 'github'\n | 'gitlab'\n | 'google'\n | 'okta'\n | 'azure'\n | 'custom';\n\nconst PROVIDER_ISSUERS: Record<string, string> = {\n github: 'https://token.actions.githubusercontent.com', // GitHub OIDC\n google: 'https://accounts.google.com',\n // gitlab & okta require a tenant URL — must be passed via CODE_INTEL_OIDC_ISSUER\n};\n\n// ── PKCE / state in-memory store (server-side, short-lived) ──────────────────\n//\n// Maps state → { codeVerifier, nonce, createdAt }\n// Entries are cleaned up after 10 minutes (standard auth-flow timeout).\n\ninterface OIDCPendingFlow {\n codeVerifier: string;\n nonce: string;\n createdAt: number;\n}\n\nexport const oidcPendingFlows = new Map<string, OIDCPendingFlow>();\n\nconst FLOW_TTL_MS = 10 * 60 * 1000; // 10 minutes\n\nexport function cleanExpiredFlows(): void {\n const now = Date.now();\n for (const [state, flow] of oidcPendingFlows.entries()) {\n if (now - flow.createdAt > FLOW_TTL_MS) {\n oidcPendingFlows.delete(state);\n }\n }\n}\n\n// Clean every 5 minutes\nsetInterval(cleanExpiredFlows, 5 * 60 * 1000).unref();\n\n// ── OIDCConfig — parsed from env ──────────────────────────────────────────────\n\nexport interface OIDCConfig {\n issuer: string;\n clientId: string;\n clientSecret: string;\n redirectUri: string;\n scopes: string;\n defaultRole: Role;\n}\n\nexport function getOIDCConfig(): OIDCConfig | null {\n const issuer =\n process.env['CODE_INTEL_OIDC_ISSUER'] ?? '';\n const clientId =\n process.env['CODE_INTEL_OIDC_CLIENT_ID'] ?? '';\n const clientSecret =\n process.env['CODE_INTEL_OIDC_CLIENT_SECRET'] ?? '';\n\n if (!issuer || !clientId || !clientSecret) {\n return null; // OIDC not configured\n }\n\n const base =\n process.env['CODE_INTEL_BASE_URL'] ?? 'http://localhost:4747';\n const redirectUri =\n process.env['CODE_INTEL_OIDC_REDIRECT_URI'] ??\n `${base}/auth/callback`;\n\n const scopes =\n process.env['CODE_INTEL_OIDC_SCOPES'] ?? 'openid email profile';\n\n const rawRole =\n process.env['CODE_INTEL_OIDC_DEFAULT_ROLE'] ?? 'viewer';\n const validRoles: Role[] = ['admin', 'analyst', 'viewer', 'repo-owner'];\n const defaultRole: Role = validRoles.includes(rawRole as Role)\n ? (rawRole as Role)\n : 'viewer';\n\n return { issuer, clientId, clientSecret, redirectUri, scopes, defaultRole };\n}\n\n// ── Cached discovered configuration ──────────────────────────────────────────\n\nlet _cachedConfig: oidcClient.Configuration | null = null;\nlet _cachedIssuer = '';\n\nexport async function getDiscoveredConfig(): Promise<oidcClient.Configuration | null> {\n const cfg = getOIDCConfig();\n if (!cfg) return null;\n\n // Re-discover if issuer changed (e.g. config hot-reload)\n if (_cachedConfig && _cachedIssuer === cfg.issuer) {\n return _cachedConfig;\n }\n\n try {\n Logger.info(`[oidc] Discovering OIDC config from: ${cfg.issuer}`);\n const config = await oidcClient.discovery(\n new URL(cfg.issuer),\n cfg.clientId,\n cfg.clientSecret,\n );\n _cachedConfig = config;\n _cachedIssuer = cfg.issuer;\n Logger.info('[oidc] Discovery succeeded');\n return config;\n } catch (err) {\n Logger.warn(\n '[oidc] Discovery failed:',\n err instanceof Error ? err.message : err,\n );\n return null;\n }\n}\n\n// Force a fresh discovery (useful in tests / config changes)\nexport function resetOIDCConfig(): void {\n _cachedConfig = null;\n _cachedIssuer = '';\n}\n\n// ── Step 1: Build authorization redirect URL (server-side) ───────────────────\n\nexport interface OIDCLoginInit {\n redirectUrl: string;\n state: string;\n}\n\nexport async function buildOIDCLoginUrl(): Promise<OIDCLoginInit | null> {\n const cfg = getOIDCConfig();\n if (!cfg) return null;\n\n const config = await getDiscoveredConfig();\n if (!config) return null;\n\n const codeVerifier = oidcClient.randomPKCECodeVerifier();\n const codeChallenge = await oidcClient.calculatePKCECodeChallenge(codeVerifier);\n const state = oidcClient.randomState();\n const nonce = oidcClient.randomNonce();\n\n const params: Record<string, string> = {\n redirect_uri: cfg.redirectUri,\n scope: cfg.scopes,\n code_challenge: codeChallenge,\n code_challenge_method: 'S256',\n state,\n nonce,\n };\n\n const redirectUrl = oidcClient.buildAuthorizationUrl(config, params);\n\n oidcPendingFlows.set(state, {\n codeVerifier,\n nonce,\n createdAt: Date.now(),\n });\n\n return { redirectUrl: redirectUrl.href, state };\n}\n\n// ── Step 2: Handle callback — exchange code for tokens + get user info ────────\n\nexport interface OIDCUserInfo {\n sub: string; // Provider user ID\n email?: string;\n name?: string;\n preferred_username?: string;\n}\n\nexport interface OIDCCallbackResult {\n userInfo: OIDCUserInfo;\n accessToken: string;\n refreshToken?: string;\n idTokenClaims: Record<string, unknown>;\n}\n\nexport async function handleOIDCCallback(\n currentUrl: URL,\n state: string,\n): Promise<OIDCCallbackResult> {\n const cfg = getOIDCConfig();\n if (!cfg) throw new Error('OIDC is not configured');\n\n // Validate state FIRST — before any network calls so the error is deterministic\n const flow = oidcPendingFlows.get(state);\n if (!flow) {\n throw new Error('Invalid or expired OIDC state. Please start the login again.');\n }\n\n // Check TTL expiry before consuming the entry\n if (Date.now() - flow.createdAt > FLOW_TTL_MS) {\n oidcPendingFlows.delete(state);\n throw new Error('OIDC flow expired. Please start the login again.');\n }\n\n // Consume the state entry\n oidcPendingFlows.delete(state);\n\n // Now attempt discovery — only after state has been validated\n const config = await getDiscoveredConfig();\n if (!config) throw new Error('OIDC provider unreachable');\n\n // Exchange authorization code for tokens\n const tokens = await oidcClient.authorizationCodeGrant(config, currentUrl, {\n pkceCodeVerifier: flow.codeVerifier,\n expectedState: state,\n expectedNonce: flow.nonce,\n });\n\n // Extract ID token claims — cast to indexable map\n const idTokenClaims: Record<string, unknown> =\n (tokens.claims() as Record<string, unknown> | undefined) ?? {};\n\n // Fetch userinfo\n let userInfo: OIDCUserInfo;\n try {\n const raw = (await oidcClient.fetchUserInfo(\n config,\n tokens.access_token,\n idTokenClaims['sub'] as string,\n )) as Record<string, unknown>;\n userInfo = {\n sub: (raw['sub'] as string | undefined) ?? (idTokenClaims['sub'] as string),\n email:\n (raw['email'] as string | undefined) ??\n (idTokenClaims['email'] as string | undefined),\n name:\n (raw['name'] as string | undefined) ??\n (idTokenClaims['name'] as string | undefined),\n preferred_username:\n (raw['preferred_username'] as string | undefined) ??\n (idTokenClaims['preferred_username'] as string | undefined),\n };\n } catch {\n // Fallback: use claims from the ID token directly\n userInfo = {\n sub: idTokenClaims['sub'] as string,\n email: idTokenClaims['email'] as string | undefined,\n name: idTokenClaims['name'] as string | undefined,\n preferred_username: idTokenClaims['preferred_username'] as string | undefined,\n };\n }\n\n return {\n userInfo,\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token,\n idTokenClaims,\n };\n}\n\n// ── Device Authorization Flow (CLI: `code-intel auth login`) ─────────────────\n//\n// Used when the CLI needs to authenticate without a browser redirect URI\n// pointing back to localhost.\n\nexport interface DeviceFlowInit {\n userCode: string;\n verificationUri: string;\n verificationUriComplete: string;\n expiresIn: number;\n}\n\nexport async function initiateDeviceFlow(): Promise<{\n deviceResponse: oidcClient.DeviceAuthorizationResponse & { device_code: string };\n config: oidcClient.Configuration;\n} | null> {\n const cfg = getOIDCConfig();\n if (!cfg) return null;\n\n const config = await getDiscoveredConfig();\n if (!config) return null;\n\n const deviceResponse = await oidcClient.initiateDeviceAuthorization(config, {\n scope: cfg.scopes,\n });\n\n return { deviceResponse: deviceResponse as typeof deviceResponse & { device_code: string }, config };\n}\n\nexport async function pollDeviceFlow(\n config: oidcClient.Configuration,\n deviceResponse: oidcClient.DeviceAuthorizationResponse,\n): Promise<OIDCCallbackResult> {\n const tokens = await oidcClient.pollDeviceAuthorizationGrant(\n config,\n deviceResponse,\n );\n\n const idTokenClaims: Record<string, unknown> =\n (tokens.claims() as Record<string, unknown> | undefined) ?? {};\n\n const userInfo: OIDCUserInfo = {\n sub: idTokenClaims['sub'] as string,\n email: idTokenClaims['email'] as string | undefined,\n name: idTokenClaims['name'] as string | undefined,\n preferred_username: idTokenClaims['preferred_username'] as string | undefined,\n };\n\n return {\n userInfo,\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token,\n idTokenClaims,\n };\n}\n\n// ── Refresh token rotation ────────────────────────────────────────────────────\n\nexport async function refreshOIDCToken(\n refreshToken: string,\n): Promise<{ accessToken: string; refreshToken?: string } | null> {\n const config = await getDiscoveredConfig();\n if (!config) return null;\n\n try {\n const tokens = await oidcClient.refreshTokenGrant(config, refreshToken);\n return {\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token,\n };\n } catch (err) {\n Logger.warn('[oidc] Refresh token rotation failed:', err instanceof Error ? err.message : err);\n return null;\n }\n}\n\n// ── Derive a local username from OIDC user info ───────────────────────────────\n\nexport function deriveUsername(userInfo: OIDCUserInfo): string {\n // Prefer preferred_username → email prefix → sub hash\n if (userInfo.preferred_username) return userInfo.preferred_username;\n if (userInfo.email) {\n const [prefix] = userInfo.email.split('@');\n if (prefix && prefix.length > 0) return prefix;\n }\n // Fallback: first 12 chars of SHA-256(sub)\n return 'oidc_' + crypto.createHash('sha256').update(userInfo.sub).digest('hex').slice(0, 12);\n}\n\n// ── OIDC availability check ───────────────────────────────────────────────────\n\nexport function isOIDCConfigured(): boolean {\n return getOIDCConfig() !== null;\n}\n","/**\n * OpenAPI 3.1 specification for code-intel HTTP API v1.\n */\nexport const openApiSpec = {\n openapi: '3.1.0',\n info: {\n title: 'Code Intelligence Platform API',\n version: '1.0.0',\n description: 'HTTP API for the Code Intelligence Platform — explore knowledge graphs, search symbols, run blast-radius analysis, and manage repositories.',\n license: { name: 'MIT' },\n contact: { name: 'vohongtho', url: 'https://github.com/vohongtho/code-intel-platform' },\n },\n servers: [\n { url: '/api/v1', description: 'Current API version' },\n ],\n components: {\n securitySchemes: {\n BearerAuth: {\n type: 'http',\n scheme: 'bearer',\n description: 'API token created with `code-intel token create`',\n },\n SessionCookie: {\n type: 'apiKey',\n in: 'cookie',\n name: 'code_intel_session',\n description: 'Session cookie obtained from POST /auth/login',\n },\n },\n schemas: {\n ErrorResponse: {\n type: 'object',\n properties: {\n error: {\n type: 'object',\n properties: {\n code: { type: 'string', example: 'CI-1000' },\n message: { type: 'string' },\n hint: { type: 'string' },\n requestId: { type: 'string' },\n timestamp: { type: 'string', format: 'date-time' },\n },\n required: ['code', 'message'],\n },\n },\n },\n CodeNode: {\n type: 'object',\n properties: {\n id: { type: 'string' },\n name: { type: 'string' },\n kind: { type: 'string', enum: ['function', 'class', 'interface', 'method', 'variable', 'file', 'module', 'type', 'enum', 'cluster', 'flow'] },\n filePath: { type: 'string' },\n startLine: { type: 'integer' },\n endLine: { type: 'integer' },\n exported: { type: 'boolean' },\n language: { type: 'string' },\n },\n required: ['id', 'name', 'kind', 'filePath'],\n },\n HealthResponse: {\n type: 'object',\n properties: {\n status: { type: 'string', enum: ['ok', 'error'] },\n timestamp: { type: 'string', format: 'date-time' },\n },\n },\n },\n },\n security: [{ BearerAuth: [] }, { SessionCookie: [] }],\n paths: {\n '/health': {\n get: {\n tags: ['Health'],\n summary: 'Detailed health status',\n security: [{ BearerAuth: [] }],\n responses: {\n '200': { description: 'Health details', content: { 'application/json': { schema: { '$ref': '#/components/schemas/HealthResponse' } } } },\n '401': { description: 'Unauthorized', content: { 'application/json': { schema: { '$ref': '#/components/schemas/ErrorResponse' } } } },\n },\n },\n },\n '/repos': {\n get: {\n tags: ['Repositories'],\n summary: 'List indexed repositories',\n responses: {\n '200': { description: 'List of repos', content: { 'application/json': { schema: { type: 'array', items: { type: 'object' } } } } },\n '401': { description: 'Unauthorized', content: { 'application/json': { schema: { '$ref': '#/components/schemas/ErrorResponse' } } } },\n },\n },\n },\n '/graph/{repo}': {\n get: {\n tags: ['Graph'],\n summary: 'Download full graph for a repository',\n parameters: [{ name: 'repo', in: 'path', required: true, schema: { type: 'string' } }],\n responses: {\n '200': { description: 'Graph nodes and edges', content: { 'application/json': { schema: { type: 'object', properties: { nodes: { type: 'array' }, edges: { type: 'array' } } } } } },\n '404': { description: 'Repo not found', content: { 'application/json': { schema: { '$ref': '#/components/schemas/ErrorResponse' } } } },\n },\n },\n },\n '/search': {\n post: {\n tags: ['Search'],\n summary: 'BM25 text search across all symbols',\n requestBody: {\n required: true,\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'Search query' },\n limit: { type: 'integer', default: 20 },\n repo: { type: 'string', description: 'Optional repo filter' },\n },\n required: ['query'],\n },\n },\n },\n },\n responses: {\n '200': { description: 'Search results', content: { 'application/json': { schema: { type: 'object', properties: { results: { type: 'array', items: { '$ref': '#/components/schemas/CodeNode' } } } } } } },\n },\n },\n },\n '/vector-search': {\n post: {\n tags: ['Search'],\n summary: 'Semantic vector search using embeddings',\n requestBody: {\n required: true,\n content: { 'application/json': { schema: { type: 'object', properties: { query: { type: 'string' }, limit: { type: 'integer', default: 10 } }, required: ['query'] } } },\n },\n responses: {\n '200': { description: 'Vector search results', content: { 'application/json': { schema: { type: 'object' } } } },\n },\n },\n },\n '/nodes/{id}': {\n get: {\n tags: ['Nodes'],\n summary: 'Get detailed information about a symbol node',\n parameters: [{ name: 'id', in: 'path', required: true, schema: { type: 'string' } }],\n responses: {\n '200': { description: 'Node detail', content: { 'application/json': { schema: { type: 'object' } } } },\n '404': { description: 'Node not found', content: { 'application/json': { schema: { '$ref': '#/components/schemas/ErrorResponse' } } } },\n },\n },\n },\n '/blast-radius': {\n post: {\n tags: ['Analysis'],\n summary: 'Compute blast radius (impact) of a symbol change',\n requestBody: {\n required: true,\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n target: { type: 'string', description: 'Symbol name or node ID' },\n direction: { type: 'string', enum: ['callers', 'callees', 'both'], default: 'both' },\n max_hops: { type: 'integer', default: 5 },\n repo: { type: 'string' },\n },\n required: ['target'],\n },\n },\n },\n },\n responses: {\n '200': { description: 'Blast radius result', content: { 'application/json': { schema: { type: 'object' } } } },\n '404': { description: 'Symbol not found', content: { 'application/json': { schema: { '$ref': '#/components/schemas/ErrorResponse' } } } },\n },\n },\n },\n '/flows': {\n get: {\n tags: ['Graph'],\n summary: 'List execution flows detected in the graph',\n parameters: [{ name: 'repo', in: 'query', schema: { type: 'string' } }],\n responses: {\n '200': { description: 'List of flows', content: { 'application/json': { schema: { type: 'object' } } } },\n },\n },\n },\n '/clusters': {\n get: {\n tags: ['Graph'],\n summary: 'List community clusters detected in the graph',\n parameters: [{ name: 'repo', in: 'query', schema: { type: 'string' } }],\n responses: {\n '200': { description: 'List of clusters', content: { 'application/json': { schema: { type: 'object' } } } },\n },\n },\n },\n '/groups': {\n get: {\n tags: ['Groups'],\n summary: 'List all multi-repo groups',\n responses: {\n '200': { description: 'List of groups', content: { 'application/json': { schema: { type: 'array' } } } },\n },\n },\n },\n '/groups/{name}': {\n get: {\n tags: ['Groups'],\n summary: 'Get group configuration',\n parameters: [{ name: 'name', in: 'path', required: true, schema: { type: 'string' } }],\n responses: {\n '200': { description: 'Group config', content: { 'application/json': { schema: { type: 'object' } } } },\n '404': { description: 'Group not found', content: { 'application/json': { schema: { '$ref': '#/components/schemas/ErrorResponse' } } } },\n },\n },\n },\n '/files/read': {\n post: {\n tags: ['Files'],\n summary: 'Read a source file from an indexed repository',\n requestBody: {\n required: true,\n content: { 'application/json': { schema: { type: 'object', properties: { file_path: { type: 'string' } }, required: ['file_path'] } } },\n },\n responses: {\n '200': { description: 'File content', content: { 'application/json': { schema: { type: 'object', properties: { content: { type: 'string' } } } } } },\n '403': { description: 'Forbidden', content: { 'application/json': { schema: { '$ref': '#/components/schemas/ErrorResponse' } } } },\n '404': { description: 'Not found', content: { 'application/json': { schema: { '$ref': '#/components/schemas/ErrorResponse' } } } },\n },\n },\n },\n '/vector-status': {\n get: {\n tags: ['Search'],\n summary: 'Check whether the vector index is ready',\n responses: {\n '200': { description: 'Vector index status', content: { 'application/json': { schema: { type: 'object', properties: { ready: { type: 'boolean' }, building: { type: 'boolean' } }, required: ['ready', 'building'] } } } },\n },\n },\n },\n '/grep': {\n post: {\n tags: ['Files'],\n summary: 'Grep for a regex pattern across indexed file nodes',\n requestBody: {\n required: true,\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n pattern: { type: 'string', description: 'Regular expression pattern' },\n file_paths: { type: 'array', items: { type: 'string' }, description: 'Optional list of file paths to search' },\n },\n required: ['pattern'],\n },\n },\n },\n },\n responses: {\n '200': { description: 'Grep results', content: { 'application/json': { schema: { type: 'object', properties: { results: { type: 'array', items: { type: 'object', properties: { file: { type: 'string' }, line: { type: 'integer' }, text: { type: 'string' } } } } } } } } },\n '400': { description: 'Bad request', content: { 'application/json': { schema: { '$ref': '#/components/schemas/ErrorResponse' } } } },\n },\n },\n },\n '/cypher': {\n post: {\n tags: ['Graph'],\n summary: 'Run a Cypher-like query against the knowledge graph',\n requestBody: {\n required: true,\n content: { 'application/json': { schema: { type: 'object', properties: { query: { type: 'string' } }, required: ['query'] } } },\n },\n responses: {\n '200': { description: 'Query results', content: { 'application/json': { schema: { type: 'object', properties: { results: { type: 'array' } } } } } },\n '400': { description: 'Bad request', content: { 'application/json': { schema: { '$ref': '#/components/schemas/ErrorResponse' } } } },\n },\n },\n },\n '/jobs': {\n get: {\n tags: ['Jobs'],\n summary: 'List analysis jobs with optional status/repo filters',\n parameters: [\n { name: 'status', in: 'query', schema: { type: 'string', enum: ['pending', 'running', 'success', 'failed', 'cancelled', 'dead'] } },\n { name: 'repo', in: 'query', schema: { type: 'string' } },\n ],\n responses: {\n '200': { description: 'List of jobs', content: { 'application/json': { schema: { type: 'object', properties: { jobs: { type: 'array', items: { type: 'object' } } } } } } },\n '401': { description: 'Unauthorized', content: { 'application/json': { schema: { '$ref': '#/components/schemas/ErrorResponse' } } } },\n },\n },\n },\n '/jobs/{id}': {\n delete: {\n tags: ['Jobs'],\n summary: 'Cancel an analysis job',\n parameters: [{ name: 'id', in: 'path', required: true, schema: { type: 'string' } }],\n responses: {\n '200': { description: 'Job cancelled', content: { 'application/json': { schema: { type: 'object', properties: { message: { type: 'string' }, id: { type: 'string' } } } } } },\n '404': { description: 'Job not found', content: { 'application/json': { schema: { '$ref': '#/components/schemas/ErrorResponse' } } } },\n '409': { description: 'Job cannot be cancelled', content: { 'application/json': { schema: { '$ref': '#/components/schemas/ErrorResponse' } } } },\n },\n },\n },\n '/groups/{name}/contracts': {\n get: {\n tags: ['Groups'],\n summary: 'Get the last sync result / contracts for a group',\n parameters: [{ name: 'name', in: 'path', required: true, schema: { type: 'string' } }],\n responses: {\n '200': { description: 'Sync result', content: { 'application/json': { schema: { type: 'object' } } } },\n '404': { description: 'Not found', content: { 'application/json': { schema: { '$ref': '#/components/schemas/ErrorResponse' } } } },\n },\n },\n },\n '/groups/{name}/sync': {\n post: {\n tags: ['Groups'],\n summary: 'Sync all members of a group and compute cross-repo contracts',\n parameters: [{ name: 'name', in: 'path', required: true, schema: { type: 'string' } }],\n responses: {\n '200': { description: 'Sync result', content: { 'application/json': { schema: { type: 'object' } } } },\n '404': { description: 'Group not found', content: { 'application/json': { schema: { '$ref': '#/components/schemas/ErrorResponse' } } } },\n },\n },\n },\n '/groups/{name}/search': {\n post: {\n tags: ['Groups'],\n summary: 'Search across all repos in a group',\n parameters: [{ name: 'name', in: 'path', required: true, schema: { type: 'string' } }],\n requestBody: {\n required: true,\n content: { 'application/json': { schema: { type: 'object', properties: { q: { type: 'string' }, limit: { type: 'integer', default: 20 } }, required: ['q'] } } },\n },\n responses: {\n '200': { description: 'Search results per repo and merged', content: { 'application/json': { schema: { type: 'object', properties: { perRepo: { type: 'object' }, merged: { type: 'array' } } } } } },\n '400': { description: 'Bad request', content: { 'application/json': { schema: { '$ref': '#/components/schemas/ErrorResponse' } } } },\n '404': { description: 'Group not found', content: { 'application/json': { schema: { '$ref': '#/components/schemas/ErrorResponse' } } } },\n },\n },\n },\n '/groups/{name}/graph': {\n get: {\n tags: ['Groups'],\n summary: 'Retrieve the merged knowledge graph for all repos in a group',\n parameters: [{ name: 'name', in: 'path', required: true, schema: { type: 'string' } }],\n responses: {\n '200': { description: 'Merged graph nodes and edges', content: { 'application/json': { schema: { type: 'object', properties: { nodes: { type: 'array' }, edges: { type: 'array' } } } } } },\n '404': { description: 'Group not found', content: { 'application/json': { schema: { '$ref': '#/components/schemas/ErrorResponse' } } } },\n },\n },\n },\n },\n};\n","export type { RepoGroup, GroupMember, Contract, ContractLink, ContractKind, GroupSyncResult, LinkKind } from './types.js';\nexport { loadGroup, saveGroup, listGroups, deleteGroup, groupExists, addMember, removeMember, saveSyncResult, loadSyncResult } from './group-registry.js';\nexport { syncGroup } from './group-sync.js';\nexport { queryGroup } from './group-query.js';\nexport type { GroupQueryResult } from './group-query.js';\nexport { loadGraphFromDB } from './graph-from-db.js';\n\n// Legacy export kept for backwards compatibility\nexport { mergeSearchResults } from './cross-repo-search.js';\n","import type { SearchResult } from '../search/text-search.js';\nimport { reciprocalRankFusion } from '../search/text-search.js';\n\nexport function mergeSearchResults(...perRepoResults: SearchResult[][]): SearchResult[] {\n return reciprocalRankFusion(...perRepoResults);\n}\n"]}
|