docuvia 1.0.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/dist/ast-worker.js +3 -0
- package/dist/ast-worker.js.map +1 -0
- package/dist/chunk-HBKQ5KVB.js +62 -0
- package/dist/chunk-HBKQ5KVB.js.map +1 -0
- package/dist/chunk-KVOCOCYJ.js +3 -0
- package/dist/chunk-KVOCOCYJ.js.map +1 -0
- package/dist/chunk-OK2R2ETM.js +6 -0
- package/dist/chunk-OK2R2ETM.js.map +1 -0
- package/dist/chunk-QD6NQB77.js +87 -0
- package/dist/chunk-QD6NQB77.js.map +1 -0
- package/dist/chunk-W6H4BYG4.js +82 -0
- package/dist/chunk-W6H4BYG4.js.map +1 -0
- package/dist/cli.js +237 -0
- package/dist/cli.js.map +1 -0
- package/dist/fs-utils-7IBL2MS4.js +3 -0
- package/dist/fs-utils-7IBL2MS4.js.map +1 -0
- package/dist/init-templates-XIJBJEVL.js +3 -0
- package/dist/init-templates-XIJBJEVL.js.map +1 -0
- package/dist/js-yaml-LVDERDC6.js +52 -0
- package/dist/js-yaml-LVDERDC6.js.map +1 -0
- package/dist/migrations/0001_init.sql +155 -0
- package/dist/migrations/0002_l2_node_key.sql +9 -0
- package/dist/migrations/0003_docuvia_meta.sql +10 -0
- package/dist/migrations/0004_l3_provenance.sql +11 -0
- package/dist/migrations/0005_l3_initial_source_commits.sql +10 -0
- package/dist/migrations/0006_tier_b_file_status.sql +10 -0
- package/dist/migrations/0007_fts_porter_stemming.sql +33 -0
- package/dist/migrations/0008_ast_call_sites.sql +18 -0
- package/dist/migrations/0009_l2_node_key_lookup_index.sql +12 -0
- package/dist/tree-sitter.wasm +0 -0
- package/package.json +62 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../lib/core/src/constants/symbols.ts","../../../lib/core/src/ast/ast-constants.ts","../../../lib/ast-core/dist/constants/ast-event-constants.js","../../../lib/ast-core/dist/constants/tree-sitter-node-types.js","../../../lib/ast-core/dist/core/edge-computer.js","../../../node_modules/.pnpm/smol-toml@1.7.0/node_modules/smol-toml/src/date.ts","../../../node_modules/.pnpm/smol-toml@1.7.0/node_modules/smol-toml/src/error.ts","../../../node_modules/.pnpm/smol-toml@1.7.0/node_modules/smol-toml/src/primitive.ts","../../../node_modules/.pnpm/smol-toml@1.7.0/node_modules/smol-toml/src/util.ts","../../../node_modules/.pnpm/smol-toml@1.7.0/node_modules/smol-toml/src/extract.ts","../../../node_modules/.pnpm/smol-toml@1.7.0/node_modules/smol-toml/src/struct.ts","../../../node_modules/.pnpm/smol-toml@1.7.0/node_modules/smol-toml/src/parse.ts","../../../lib/ast-core/dist/language-provider.js","../../../lib/ast-core/dist/language-registry.js","../../../lib/ast-core/dist/constants/query-capture-names.js","../../../lib/ast-core/dist/constants/language-node-types.js","../../../lib/ast-core/dist/languages/typescript.js","../../../lib/ast-core/dist/languages/javascript.js","../../../lib/ast-core/dist/languages/python.js","../../../lib/ast-core/dist/languages/rust.js","../../../lib/ast-core/dist/languages/go.js","../../../lib/ast-core/dist/languages/java.js","../../../lib/ast-core/dist/languages/c.js","../../../lib/ast-core/dist/languages/cpp.js","../../../lib/ast-core/dist/languages/ruby.js","../../../lib/ast-core/dist/languages/php.js","../../../lib/ast-core/dist/languages/csharp.js","../../../lib/ast-core/dist/language-registry-defaults.js","../../../lib/ast-core/dist/parser-core.js","../../../lib/ast-core/dist/detector/semantic-diff.js","../../../lib/core/src/ast/resolve-wasm-path.ts"],"sourcesContent":["/**\n * Fallback symbol name `ast-worker.ts`'s `resolveCallableName`/`getNodeName`/\n * `findEnclosingContainerName` return for genuinely unbound/unnamed AST nodes (IIFEs, bare\n * callback arguments, top-level call sites). `persist-ast-graph.ts` checks against the same\n * sentinel to decide whether a call site has a real containing symbol to link from.\n */\nexport const ANONYMOUS_SYMBOL_NAME = \"anonymous\";\n","import { ANONYMOUS_SYMBOL_NAME } from \"../constants/symbols.js\";\n\n/** `Error.name` for `AstWorkerCrashError` — see `docuvia-error.ts`'s `DOCUVIA_ERROR_NAME` for the same convention. */\nexport const AST_WORKER_CRASH_ERROR_NAME = \"AstWorkerCrashError\" as const;\n\n/** Tree-sitter node `.type` discriminants `ast-worker.ts`'s `resolveCallableName()`/container-resolution helpers check against — grammar-level values, not ours to rename. */\nexport const AstNodeTypes = {\n ARGUMENTS: \"arguments\",\n VARIABLE_DECLARATOR: \"variable_declarator\", // const foo = () => {}\n ASSIGNMENT_EXPRESSION: \"assignment_expression\", // foo = () => {}\n PAIR: \"pair\", // { foo: () => {} } (object literal property)\n PUBLIC_FIELD_DEFINITION: \"public_field_definition\", // class { foo = () => {} }\n // GRPH-006 follow-up (Rust/Go/C++ containment):\n IMPL_ITEM: \"impl_item\", // Rust: impl Struct { fn method() {} }\n TYPE_IDENTIFIER: \"type_identifier\", // Rust impl's `type` field / Go receiver's `type` field\n POINTER_TYPE: \"pointer_type\", // Go pointer receiver: func (r *Receiver) Method() {}\n QUALIFIED_IDENTIFIER: \"qualified_identifier\", // C++ out-of-line: Ret Class::method(){}\n} as const;\n\n/** Log/error messages and shared literals for the AST parsing pipeline (worker pool + worker + processing service). */\nexport const AstMessages = {\n PARSE_FAILURE_NO_DETAIL: \"parse returned success=false with no error detail\",\n PARSE_FAILURE_RESULT: \"AST parse returned failure result\",\n PARSE_THREW: \"AST parse threw (worker crash or rejection)\",\n WORKER_UNCAUGHT_EXCEPTION: \"AST worker uncaughtException\",\n WORKER_UNHANDLED_REJECTION: \"AST worker unhandledRejection\",\n WORKER_EXITED_DURING_SHUTDOWN:\n \"AST worker exited during pool shutdown (expected)\",\n WORKER_CRASHED_EXITED: \"AST worker crashed/exited\",\n WORKER_EXITED_UNEXPECTEDLY: \"Worker exited unexpectedly\",\n UNKNOWN_FILE: \"(unknown file)\",\n PARSE_CACHE_HIT: \"AST parse cache hit\",\n CACHE_METRICS_AND_QUEUE_PERFORMANCE:\n \"AST cache metrics and queue performance\",\n TASK_TIMED_OUT_TERMINATING:\n \"AST worker task timed out — terminating stuck worker\",\n WORKER_TERMINATE_FAILED:\n \"AST worker terminate() rejected — forced termination did not complete\",\n QUERIED_VIA_LANGUAGE_PROVIDER:\n \"Queried nodes using @workspace/ast-core LanguageProvider\",\n ANONYMOUS_NAME: ANONYMOUS_SYMBOL_NAME,\n workerCrashWhileParsing: (filePath: string) =>\n `AST worker crashed while parsing ${filePath}: `,\n taskTimedOutAfterMs: (taskId: string, ms: number) =>\n `AST worker task ${taskId} timed out after ${ms}ms`,\n workerExitedWithCode: (code: number) => `Worker exited with code ${code}`,\n noLanguageProviderForExtension: (ext: string) =>\n `No language provider registered for extension ${ext}`,\n wasmNotFound: (language: string, triedPaths: string) =>\n `WASM not found for ${language}, AST parsing skipped (Regex fallback used). ` +\n `Tried paths: ${triedPaths}`,\n parsedViaTreeSitter: (nodeCount: number) =>\n `Parsed via web-tree-sitter (nodes: ${nodeCount})`,\n providerQueryFailed: (errMessage: string) =>\n `ast-core provider query failed: ${errMessage}`,\n} as const;\n","/**\n * AstEvent.type discriminant values emitted by parser-core, ast-traverser,\n * edge-computer, and bridge-provider to classify AST/graph events flowing\n * through the ingestion pipeline.\n */\nexport const AstEventType = {\n FILE: \"file\",\n CLASS: \"class\",\n FUNCTION: \"function\",\n CALL: \"call\",\n METHOD_CALL: \"method_call\",\n IMPORT: \"import\",\n API_CONTRACT: \"api_contract\",\n};\n","/**\n * Tree-sitter node `.type` discriminants compared/dispatched on across ast-core's\n * cross-language parsing (edge-computer.ts, semantic-diff.ts) — grammar-level\n * values, not ours to rename. See `lib/core`'s `AstNodeTypes` (`ast-constants.ts`)\n * for the same convention.\n */\nexport const TreeSitterNodeTypes = {\n IDENTIFIER: \"identifier\",\n SCOPED_IDENTIFIER: \"scoped_identifier\",\n QUALIFIED_IDENTIFIER: \"qualified_identifier\",\n DOTTED_NAME: \"dotted_name\",\n ALIASED_IMPORT: \"aliased_import\",\n USE_AS_CLAUSE: \"use_as_clause\",\n USE_WILDCARD: \"use_wildcard\",\n SCOPED_USE_LIST: \"scoped_use_list\",\n USE_LIST: \"use_list\",\n DOT: \"dot\",\n BLANK_IDENTIFIER: \"blank_identifier\",\n NAMESPACE_USE_DECLARATION: \"namespace_use_declaration\",\n INCLUDE_EXPRESSION: \"include_expression\",\n INCLUDE_ONCE_EXPRESSION: \"include_once_expression\",\n REQUIRE_EXPRESSION: \"require_expression\",\n REQUIRE_ONCE_EXPRESSION: \"require_once_expression\",\n IMPORT_STATEMENT: \"import_statement\",\n IMPORT_FROM_STATEMENT: \"import_from_statement\",\n USE_DECLARATION: \"use_declaration\",\n IMPORT_DECLARATION: \"import_declaration\",\n PREPROC_INCLUDE: \"preproc_include\",\n USING_DECLARATION: \"using_declaration\",\n CALL: \"call\",\n USING_DIRECTIVE: \"using_directive\",\n CALL_EXPRESSION: \"call_expression\",\n METHOD_INVOCATION: \"method_invocation\",\n EXPLICIT_CONSTRUCTOR_INVOCATION: \"explicit_constructor_invocation\",\n COMMAND_CALL: \"command_call\",\n FUNCTION_CALL_EXPRESSION: \"function_call_expression\",\n MEMBER_CALL_EXPRESSION: \"member_call_expression\",\n SCOPED_CALL_EXPRESSION: \"scoped_call_expression\",\n INVOCATION_EXPRESSION: \"invocation_expression\",\n OBJECT_CREATION_EXPRESSION: \"object_creation_expression\",\n MEMBER_EXPRESSION: \"member_expression\",\n ATTRIBUTE: \"attribute\",\n MEMBER_ACCESS_EXPRESSION: \"member_access_expression\",\n VARIABLE_DECLARATION: \"variable_declaration\",\n LEXICAL_DECLARATION: \"lexical_declaration\",\n VARIABLE_DECLARATOR: \"variable_declarator\",\n ARROW_FUNCTION: \"arrow_function\",\n FUNCTION_DECLARATION: \"function_declaration\",\n METHOD_DEFINITION: \"method_definition\",\n CLASS_DECLARATION: \"class_declaration\",\n INTERFACE_DECLARATION: \"interface_declaration\",\n TYPE_ALIAS_DECLARATION: \"type_alias_declaration\",\n EXPORT_STATEMENT: \"export_statement\",\n};\n","import { AstEventType } from \"../constants/ast-event-constants.js\";\nimport { TreeSitterNodeTypes } from \"../constants/tree-sitter-node-types.js\";\n/**\n * Marks namespace/default/whole-module import bindings that don't resolve to a\n * single named symbol (e.g. `import * as X`, Python dotted `import a.b.c`, C's\n * `#include`) — see {@link parseImportDescriptors} JSDoc above for the full contract.\n */\nconst WILDCARD_IMPORT_MARKER = \"*\";\n/** Ruby stdlib call names that behave like import statements. */\nconst RUBY_IMPORT_METHOD_NAMES = [\n \"require\",\n \"require_relative\",\n \"load\",\n];\n/** Sentinel used when a call resolves to the enclosing constructor/self reference. */\nconst SELF_REFERENCE_KEYWORD = \"this\";\n/** Synthetic method name assigned to constructor-invocation call edges. */\nconst CONSTRUCTOR_CALL_METHOD_NAME = \"new\";\n/**\n * Parses import/use/require statements into structured {localName, originalName, modulePath}\n * descriptors, one per language-specific binding. This is the single source of truth for\n * import parsing across languages — buildScopeMap() is a thin wrapper over this that encodes\n * the same data into the opaque `${modulePath}::${originalName}` string format EdgeComputer\n * expects (kept only for that consumer's backward compatibility).\n *\n * `originalName: \"*\"` marks namespace/default/whole-module bindings that don't resolve to a\n * single named symbol (e.g. `import * as X`, Python dotted `import a.b.c`, C's `#include`) —\n * callers (ScopeResolver.resolveCall) treat \"*\" as \"fall back to the call name itself\".\n */\nexport function parseImportDescriptors(importStatements) {\n const descriptors = [];\n // NOTE: the original hand-written chain of `if (stmtType === \"...\")` checks had two\n // provably unreachable branches, preserved here only in this comment for the record:\n // - a Python \"dotted import\" check gated on `stmtType === \"import_statement\"` — dead,\n // because the TS/JS `import_statement` branch above it always hit `continue`.\n // - a Java `import_declaration` check — dead, because the Go `import_declaration`\n // branch above it always hit `continue`.\n // Both were unreachable for every input, so omitting them here changes no behavior.\n for (const stmt of importStatements) {\n const stmtType = stmt.type;\n const handler = SINGLE_TYPE_IMPORT_HANDLERS[stmtType];\n if (handler) {\n handler(stmt, descriptors);\n continue;\n }\n if (isPhpImportStatement(stmtType)) {\n collectPhpImportDescriptors(stmt, stmtType, descriptors);\n continue;\n }\n collectFallbackImportDescriptors(stmt, descriptors);\n }\n return descriptors;\n}\n/**\n * Dispatch table for import statement types that resolve unambiguously to a single\n * per-language collector. Mirrors the exact set of standalone `stmtType === \"...\"`\n * checks from the original hand-written implementation (PHP and the generic fallback\n * are handled separately below since they aren't single-type equality checks).\n */\nconst SINGLE_TYPE_IMPORT_HANDLERS = {\n [TreeSitterNodeTypes.IMPORT_STATEMENT]: collectTsJsImportDescriptors,\n [TreeSitterNodeTypes.IMPORT_FROM_STATEMENT]: collectPythonFromStatementDescriptors,\n [TreeSitterNodeTypes.USE_DECLARATION]: collectRustUseDescriptors,\n [TreeSitterNodeTypes.IMPORT_DECLARATION]: collectGoImportDescriptors,\n [TreeSitterNodeTypes.PREPROC_INCLUDE]: collectCIncludeDescriptors,\n [TreeSitterNodeTypes.USING_DECLARATION]: collectCppUsingDeclarationDescriptors,\n [TreeSitterNodeTypes.CALL]: collectRubyRequireDescriptors,\n [TreeSitterNodeTypes.USING_DIRECTIVE]: collectCSharpUsingDescriptors,\n};\n// ── TypeScript / JavaScript ────────────────────────────────────────────\nfunction collectTsJsImportDescriptors(stmt, descriptors) {\n const sourceNode = stmt.descendantsOfType(\"string\").pop();\n if (!sourceNode)\n return;\n const srcText = sourceNode.text.replace(/['\"]/g, \"\");\n const namespaceImport = stmt.descendantsOfType(\"namespace_import\")[0];\n if (namespaceImport) {\n const nsId = namespaceImport.descendantsOfType(\"identifier\")[0];\n if (nsId) {\n descriptors.push({\n localName: nsId.text,\n originalName: WILDCARD_IMPORT_MARKER,\n modulePath: srcText,\n });\n }\n return;\n }\n const namedImports = stmt.descendantsOfType(\"named_imports\")[0];\n if (namedImports) {\n const specifiers = namedImports.descendantsOfType(\"import_specifier\");\n for (const spec of specifiers) {\n if (!spec)\n continue;\n const nameNode = spec.childForFieldName(\"name\");\n const aliasNode = spec.childForFieldName(\"alias\");\n if (nameNode) {\n const importedName = nameNode.text;\n const localName = aliasNode ? aliasNode.text : importedName;\n descriptors.push({\n localName,\n originalName: importedName,\n modulePath: srcText,\n });\n }\n }\n return;\n }\n const defaultId = stmt.descendantsOfType(\"identifier\")[0];\n if (defaultId) {\n descriptors.push({\n localName: defaultId.text,\n originalName: WILDCARD_IMPORT_MARKER,\n modulePath: srcText,\n });\n }\n}\n// ── Python ────────────────────────────────────────────────────────────\nfunction collectPythonFromStatementDescriptors(stmt, descriptors) {\n const moduleName = stmt.childForFieldName(\"module_name\");\n if (!moduleName)\n return;\n const sourceStr = moduleName.text;\n const wildcard = stmt.descendantsOfType(\"wildcard_import\")[0];\n if (wildcard)\n return;\n const names = stmt.childForFieldName(\"name\");\n if (names) {\n collectPythonFromImportDescriptors(stmt, sourceStr, descriptors);\n }\n}\n// ── Rust ──────────────────────────────────────────────────────────────\nfunction collectRustUseAsClauseDescriptor(arg, descriptors) {\n const pathNode = arg.childForFieldName(\"path\");\n const aliasNode = arg.childForFieldName(\"alias\");\n if (pathNode && aliasNode) {\n descriptors.push({\n localName: aliasNode.text,\n originalName: WILDCARD_IMPORT_MARKER,\n modulePath: pathNode.text,\n });\n }\n}\nfunction collectRustScopedUseListAsClauseDescriptor(child, prefix, descriptors) {\n const p = child.childForFieldName(\"path\");\n const a = child.childForFieldName(\"alias\");\n if (p && a) {\n descriptors.push({\n localName: a.text,\n originalName: WILDCARD_IMPORT_MARKER,\n modulePath: `${prefix}::${p.text}`,\n });\n }\n}\nfunction collectRustScopedUseListScopedIdentifierDescriptor(child, prefix, descriptors) {\n const lastPart = child.descendantsOfType(\"identifier\").pop();\n if (lastPart) {\n descriptors.push({\n localName: lastPart.text,\n originalName: WILDCARD_IMPORT_MARKER,\n modulePath: `${prefix}::${child.text}`,\n });\n }\n}\nfunction collectRustScopedUseListChildDescriptor(child, prefix, descriptors) {\n if (child.type === TreeSitterNodeTypes.USE_AS_CLAUSE) {\n collectRustScopedUseListAsClauseDescriptor(child, prefix, descriptors);\n return;\n }\n if (child.type === TreeSitterNodeTypes.IDENTIFIER) {\n descriptors.push({\n localName: child.text,\n originalName: WILDCARD_IMPORT_MARKER,\n modulePath: `${prefix}::${child.text}`,\n });\n return;\n }\n if (child.type === TreeSitterNodeTypes.SCOPED_IDENTIFIER) {\n collectRustScopedUseListScopedIdentifierDescriptor(child, prefix, descriptors);\n }\n}\nfunction collectRustScopedUseListDescriptors(arg, descriptors) {\n const pathNode = arg.childForFieldName(\"path\");\n const listNode = arg.childForFieldName(\"list\");\n if (!pathNode || !listNode)\n return;\n const prefix = pathNode.text;\n for (const child of listNode.namedChildren) {\n if (!child)\n continue;\n collectRustScopedUseListChildDescriptor(child, prefix, descriptors);\n }\n}\nfunction collectRustScopedOrPlainIdentifierDescriptor(arg, descriptors) {\n const ids = arg.descendantsOfType(\"identifier\");\n const lastId = ids[ids.length - 1];\n if (lastId) {\n descriptors.push({\n localName: lastId.text,\n originalName: WILDCARD_IMPORT_MARKER,\n modulePath: arg.text,\n });\n }\n}\nfunction collectRustUseListDescriptors(arg, descriptors) {\n for (const child of arg.namedChildren) {\n if (!child)\n continue;\n if (child.type === TreeSitterNodeTypes.IDENTIFIER) {\n descriptors.push({\n localName: child.text,\n originalName: WILDCARD_IMPORT_MARKER,\n modulePath: child.text,\n });\n }\n }\n}\nfunction collectRustUseDescriptors(stmt, descriptors) {\n const arg = stmt.childForFieldName(\"argument\");\n if (!arg)\n return;\n if (arg.type === TreeSitterNodeTypes.USE_AS_CLAUSE) {\n collectRustUseAsClauseDescriptor(arg, descriptors);\n return;\n }\n if (arg.type === TreeSitterNodeTypes.USE_WILDCARD)\n return;\n if (arg.type === TreeSitterNodeTypes.SCOPED_USE_LIST) {\n collectRustScopedUseListDescriptors(arg, descriptors);\n return;\n }\n if (arg.type === TreeSitterNodeTypes.SCOPED_IDENTIFIER ||\n arg.type === TreeSitterNodeTypes.IDENTIFIER) {\n collectRustScopedOrPlainIdentifierDescriptor(arg, descriptors);\n return;\n }\n if (arg.type === TreeSitterNodeTypes.USE_LIST) {\n collectRustUseListDescriptors(arg, descriptors);\n }\n}\n// ── Go ────────────────────────────────────────────────────────────────\nfunction collectGoImportSpecDescriptor(spec, descriptors) {\n const pathNode = spec.childForFieldName(\"path\");\n if (!pathNode)\n return;\n const pkgPath = pathNode.text.replace(/['\"]/g, \"\");\n const nameNode = spec.childForFieldName(\"name\");\n if (nameNode) {\n if (nameNode.type === TreeSitterNodeTypes.DOT)\n return;\n if (nameNode.type === TreeSitterNodeTypes.BLANK_IDENTIFIER)\n return;\n descriptors.push({\n localName: nameNode.text,\n originalName: WILDCARD_IMPORT_MARKER,\n modulePath: pkgPath,\n });\n }\n else {\n const segments = pkgPath.split(\"/\");\n const pkgName = segments[segments.length - 1];\n descriptors.push({\n localName: pkgName,\n originalName: WILDCARD_IMPORT_MARKER,\n modulePath: pkgPath,\n });\n }\n}\nfunction collectGoImportDescriptors(stmt, descriptors) {\n const specList = stmt.descendantsOfType(\"import_spec_list\")[0];\n if (!specList)\n return;\n const specs = specList.descendantsOfType(\"import_spec\");\n for (const spec of specs) {\n if (!spec)\n continue;\n collectGoImportSpecDescriptor(spec, descriptors);\n }\n}\n// ── C / C++ ───────────────────────────────────────────────────────────\nfunction collectCIncludeDescriptors(stmt, descriptors) {\n const pathNode = stmt.childForFieldName(\"path\");\n if (pathNode) {\n const includePath = pathNode.text.replace(/[<>\"']/g, \"\");\n descriptors.push({\n localName: includePath,\n originalName: WILDCARD_IMPORT_MARKER,\n modulePath: includePath,\n });\n }\n}\nfunction collectCppUsingDeclarationDescriptors(stmt, descriptors) {\n const children = stmt.namedChildren;\n for (const child of children) {\n if (!child)\n continue;\n if (child.type === TreeSitterNodeTypes.QUALIFIED_IDENTIFIER) {\n const ids = child.descendantsOfType(\"identifier\");\n const lastId = ids[ids.length - 1];\n if (lastId) {\n descriptors.push({\n localName: lastId.text,\n originalName: WILDCARD_IMPORT_MARKER,\n modulePath: child.text,\n });\n }\n }\n else if (child.type === TreeSitterNodeTypes.IDENTIFIER) {\n descriptors.push({\n localName: child.text,\n originalName: WILDCARD_IMPORT_MARKER,\n modulePath: child.text,\n });\n }\n }\n}\n// ── Ruby ──────────────────────────────────────────────────────────────\nfunction collectRubyRequireDescriptors(stmt, descriptors) {\n const methodNode = stmt.childForFieldName(\"method\");\n if (!methodNode)\n return;\n const methodName = methodNode.text;\n if (!RUBY_IMPORT_METHOD_NAMES.includes(methodName)) {\n return;\n }\n const args = stmt.childForFieldName(\"arguments\");\n if (!args)\n return;\n const strNode = args.descendantsOfType(\"string_content\")[0] ||\n args.descendantsOfType(\"string\")[0];\n if (!strNode)\n return;\n const libName = strNode.text.replace(/['\"]/g, \"\");\n const shortName = libName.replace(/\\.rb$/, \"\");\n descriptors.push({\n localName: shortName,\n originalName: WILDCARD_IMPORT_MARKER,\n modulePath: libName,\n });\n}\n// ── PHP ───────────────────────────────────────────────────────────────\nfunction isPhpImportStatement(stmtType) {\n return (stmtType === TreeSitterNodeTypes.NAMESPACE_USE_DECLARATION ||\n stmtType === TreeSitterNodeTypes.INCLUDE_EXPRESSION ||\n stmtType === TreeSitterNodeTypes.INCLUDE_ONCE_EXPRESSION ||\n stmtType === TreeSitterNodeTypes.REQUIRE_EXPRESSION ||\n stmtType === TreeSitterNodeTypes.REQUIRE_ONCE_EXPRESSION);\n}\nfunction collectPhpNamespaceUseDescriptor(stmt, descriptors) {\n const nameNode = stmt.descendantsOfType(\"qualified_name\")[0] ||\n stmt.descendantsOfType(\"name\")[0];\n if (nameNode) {\n const fullName = nameNode.text;\n const parts = fullName.split(\"\\\\\");\n const shortName = parts[parts.length - 1];\n descriptors.push({\n localName: shortName,\n originalName: WILDCARD_IMPORT_MARKER,\n modulePath: fullName,\n });\n }\n}\nfunction collectPhpIncludeOrRequireDescriptor(stmt, descriptors) {\n const argNode = stmt.descendantsOfType(\"string\")[0] ||\n stmt.descendantsOfType(\"string_content\")[0];\n if (argNode) {\n const path = argNode.text.replace(/['\"]/g, \"\");\n descriptors.push({\n localName: path,\n originalName: WILDCARD_IMPORT_MARKER,\n modulePath: path,\n });\n }\n}\nfunction collectPhpImportDescriptors(stmt, stmtType, descriptors) {\n if (stmtType === TreeSitterNodeTypes.NAMESPACE_USE_DECLARATION) {\n collectPhpNamespaceUseDescriptor(stmt, descriptors);\n }\n else {\n collectPhpIncludeOrRequireDescriptor(stmt, descriptors);\n }\n}\n// ── C# ────────────────────────────────────────────────────────────────\nfunction collectCSharpUsingDescriptors(stmt, descriptors) {\n const nameNode = stmt.descendantsOfType(\"qualified_name\")[0] ||\n stmt.descendantsOfType(\"identifier\")[0];\n if (nameNode) {\n const fullName = nameNode.text;\n const parts = fullName.split(\".\");\n const shortName = parts[parts.length - 1];\n descriptors.push({\n localName: shortName,\n originalName: WILDCARD_IMPORT_MARKER,\n modulePath: fullName,\n });\n }\n}\n// ── Fallback: generic identifier extraction ──────────────────────────\nfunction collectFallbackImportDescriptors(stmt, descriptors) {\n const sourceNode = stmt.descendantsOfType(\"string\").pop();\n if (!sourceNode)\n return;\n const fallbackSrcText = sourceNode.text.replace(/['\"]/g, \"\");\n const identifiers = stmt.descendantsOfType(\"identifier\");\n for (const idNode of identifiers) {\n if (!idNode)\n continue;\n // Mirrors the original `if (!scopeMap.has(idNode.text))` guard: skip if a descriptor\n // for this localName was already collected (from this or an earlier statement).\n if (!descriptors.some((d) => d.localName === idNode.text)) {\n descriptors.push({\n localName: idNode.text,\n originalName: idNode.text,\n modulePath: fallbackSrcText,\n });\n }\n }\n}\n/**\n * Thin wrapper over parseImportDescriptors() that encodes descriptors into the opaque\n * `${modulePath}::${originalName}` string format EdgeComputer.computeCallEdges consumes.\n * Preserved for backward compatibility (AstTraverser / headless-lsp) — reproduces the exact\n * same Map<localName, encodedValue> output the original hand-written implementation produced.\n */\nexport function buildScopeMap(importStatements, sourceText) {\n const scopeMap = new Map();\n for (const d of parseImportDescriptors(importStatements)) {\n scopeMap.set(d.localName, d.originalName === WILDCARD_IMPORT_MARKER\n ? d.modulePath\n : `${d.modulePath}::${d.originalName}`);\n }\n return scopeMap;\n}\nfunction collectPythonFromImportDescriptors(stmt, sourceStr, descriptors) {\n const namesNode = stmt.childForFieldName(\"name\");\n if (!namesNode)\n return;\n for (const child of stmt.namedChildren) {\n if (!child)\n continue;\n if (child.type === TreeSitterNodeTypes.ALIASED_IMPORT) {\n const nameNode = child.childForFieldName(\"name\");\n const aliasNode = child.childForFieldName(\"alias\");\n if (nameNode && aliasNode) {\n descriptors.push({\n localName: aliasNode.text,\n originalName: nameNode.text,\n modulePath: sourceStr,\n });\n }\n }\n else if (child.type === TreeSitterNodeTypes.DOTTED_NAME) {\n const ids = child.descendantsOfType(\"identifier\");\n const lastId = ids[ids.length - 1];\n if (lastId) {\n descriptors.push({\n localName: lastId.text,\n originalName: child.text,\n modulePath: sourceStr,\n });\n }\n }\n else if (child.type === TreeSitterNodeTypes.IDENTIFIER) {\n descriptors.push({\n localName: child.text,\n originalName: child.text,\n modulePath: sourceStr,\n });\n }\n }\n}\n// ── TypeScript / JavaScript ────────────────────────────────────────────\nfunction classifyTsJsCall(callNode) {\n const fnNode = callNode.childForFieldName(\"function\");\n if (!fnNode)\n return { isMethodCall: false, methodName: \"\" };\n if (fnNode.type === TreeSitterNodeTypes.MEMBER_EXPRESSION) {\n const propNode = fnNode.childForFieldName(\"property\");\n const objNode = fnNode.childForFieldName(\"object\");\n if (propNode) {\n return {\n isMethodCall: true,\n methodName: propNode.text,\n objectName: objNode?.text,\n };\n }\n }\n return { isMethodCall: false, methodName: fnNode.text };\n}\n// ── Python ────────────────────────────────────────────────────────────\nfunction classifyPythonCall(callNode) {\n const fnNode = callNode.childForFieldName(\"function\");\n if (!fnNode)\n return { isMethodCall: false, methodName: \"\" };\n if (fnNode.type === TreeSitterNodeTypes.ATTRIBUTE) {\n const attrNode = fnNode.childForFieldName(\"attribute\");\n const objNode = fnNode.childForFieldName(\"object\");\n if (attrNode) {\n return {\n isMethodCall: true,\n methodName: attrNode.text,\n objectName: objNode?.text,\n };\n }\n }\n return { isMethodCall: false, methodName: fnNode.text };\n}\n// ── Java ──────────────────────────────────────────────────────────────\nfunction classifyJavaMethodInvocation(callNode) {\n const nameNode = callNode.childForFieldName(\"name\");\n const objNode = callNode.childForFieldName(\"object\");\n if (nameNode) {\n return {\n isMethodCall: true,\n methodName: nameNode.text,\n objectName: objNode?.text,\n };\n }\n return undefined;\n}\nfunction classifyJavaConstructorInvocation(callNode) {\n const objNode = callNode.childForFieldName(\"constructor\");\n return {\n isMethodCall: true,\n methodName: objNode?.text || SELF_REFERENCE_KEYWORD,\n objectName: SELF_REFERENCE_KEYWORD,\n };\n}\n// ── Ruby ──────────────────────────────────────────────────────────────\nfunction classifyRubyCommandCall(callNode) {\n const methodNode = callNode.childForFieldName(\"method\");\n if (!methodNode)\n return undefined;\n const objNode = callNode.childForFieldName(\"receiver\");\n if (objNode) {\n return {\n isMethodCall: true,\n methodName: methodNode.text,\n objectName: objNode.text,\n };\n }\n return { isMethodCall: false, methodName: methodNode.text };\n}\n// ── PHP ───────────────────────────────────────────────────────────────\nfunction classifyPhpCall(callNode) {\n const callType = callNode.type;\n const nameNode = callNode.childForFieldName(\"name\");\n const methodName = nameNode?.text || \"\";\n if (callType === TreeSitterNodeTypes.MEMBER_CALL_EXPRESSION) {\n const objNode = callNode.childForFieldName(\"object\");\n return {\n isMethodCall: true,\n methodName,\n objectName: objNode?.text,\n };\n }\n if (callType === TreeSitterNodeTypes.SCOPED_CALL_EXPRESSION) {\n const classNode = callNode.childForFieldName(\"scope\");\n return {\n isMethodCall: true,\n methodName,\n objectName: classNode?.text,\n };\n }\n return { isMethodCall: false, methodName };\n}\n// ── C# ────────────────────────────────────────────────────────────────\nfunction classifyCSharpInvocation(callNode) {\n const exprNode = callNode.childForFieldName(\"function\") || callNode.namedChildren[0];\n if (exprNode &&\n exprNode.type === TreeSitterNodeTypes.MEMBER_ACCESS_EXPRESSION) {\n const nameNode = exprNode.childForFieldName(\"name\");\n const objNode = exprNode.childForFieldName(\"expression\");\n if (nameNode) {\n return {\n isMethodCall: true,\n methodName: nameNode.text,\n objectName: objNode?.text,\n };\n }\n }\n if (exprNode) {\n return { isMethodCall: false, methodName: exprNode.text };\n }\n return undefined;\n}\nfunction classifyCSharpObjectCreation(callNode) {\n const typeNode = callNode.childForFieldName(\"type\");\n return {\n isMethodCall: true,\n methodName: CONSTRUCTOR_CALL_METHOD_NAME,\n objectName: typeNode?.text,\n };\n}\n// ── Fallback ──────────────────────────────────────────────────────────\nfunction classifyFallbackCall(callNode) {\n const fnNode = callNode.childForFieldName(\"function\") ||\n callNode.descendantsOfType(\"identifier\")[0];\n return { isMethodCall: false, methodName: fnNode?.text || \"\" };\n}\n/**\n * Dispatch table for call-node types that resolve unambiguously to a single per-language\n * classifier. Mirrors the exact reachable set of standalone `callType === \"...\"` checks from\n * the original hand-written implementation: several languages (Rust, Go, C/C++) share the\n * tree-sitter node type \"call_expression\" with TypeScript/JavaScript, and Ruby's \"call\" type\n * is shared with Python — in the original, whichever language-specific check appeared first\n * always returned, making the later same-type checks unreachable. Only the first (reachable)\n * handler for each type is registered here, which reproduces that behavior exactly.\n */\nconst CALL_CLASSIFIERS = {\n [TreeSitterNodeTypes.CALL_EXPRESSION]: classifyTsJsCall,\n [TreeSitterNodeTypes.CALL]: classifyPythonCall,\n [TreeSitterNodeTypes.METHOD_INVOCATION]: classifyJavaMethodInvocation,\n [TreeSitterNodeTypes.EXPLICIT_CONSTRUCTOR_INVOCATION]: classifyJavaConstructorInvocation,\n [TreeSitterNodeTypes.COMMAND_CALL]: classifyRubyCommandCall,\n [TreeSitterNodeTypes.FUNCTION_CALL_EXPRESSION]: classifyPhpCall,\n [TreeSitterNodeTypes.MEMBER_CALL_EXPRESSION]: classifyPhpCall,\n [TreeSitterNodeTypes.SCOPED_CALL_EXPRESSION]: classifyPhpCall,\n [TreeSitterNodeTypes.INVOCATION_EXPRESSION]: classifyCSharpInvocation,\n [TreeSitterNodeTypes.OBJECT_CREATION_EXPRESSION]: classifyCSharpObjectCreation,\n};\nexport function classifyCall(callNode) {\n const handler = CALL_CLASSIFIERS[callNode.type];\n if (handler) {\n const classification = handler(callNode);\n if (classification)\n return classification;\n }\n return classifyFallbackCall(callNode);\n}\nexport class EdgeComputer {\n scopeMap;\n baseName;\n constructor(importStatements, sourceText, filePath) {\n this.scopeMap = buildScopeMap(importStatements, sourceText);\n this.baseName = filePath.split(/[/\\\\]/).pop() || \"\";\n }\n computeCallEdges(callExprs) {\n const events = [];\n for (const call of callExprs) {\n const classification = classifyCall(call);\n if (!classification.methodName)\n continue;\n const fnName = classification.methodName;\n const fqn = this.scopeMap.has(fnName)\n ? this.scopeMap.get(fnName)\n : `${this.baseName}::${fnName}`;\n if (classification.isMethodCall) {\n events.push({\n type: AstEventType.METHOD_CALL,\n name: fqn,\n method: classification.methodName,\n object: classification.objectName,\n });\n }\n else {\n events.push({ type: AstEventType.CALL, name: fqn });\n }\n }\n return events;\n }\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n// Hopefully this class will disappear once Temporal lands in JS\n// But for now we have to reinvent the wheel once more!\n\ntype Offset = string | null\n\nlet DATE_TIME_RE = /^(\\d{4}-\\d{2}-\\d{2})?[T ]?(?:(\\d{2}):\\d{2}(?::\\d{2}(?:\\.\\d+)?)?)?(Z|[-+]\\d{2}:\\d{2})?$/i\n\nexport class TomlDate extends Date {\n\t#hasDate = false\n\t#hasTime = false\n\t#offset: Offset = null\n\n\tconstructor(date: string | Date) {\n\t\tlet hasDate = true\n\t\tlet hasTime = true\n\t\tlet offset: Offset = 'Z'\n\n\t\tif (typeof date === 'string') {\n\t\t\tlet match = date.match(DATE_TIME_RE)\n\t\t\tif (match) {\n\t\t\t\tif (!match[1]) {\n\t\t\t\t\thasDate = false\n\t\t\t\t\tdate = `0000-01-01T${date}`\n\t\t\t\t}\n\n\t\t\t\thasTime = !!match[2]\n\t\t\t\t// Make sure to use T instead of a space. Breaks in case of extreme values otherwise.\n\t\t\t\thasTime && date[10] === ' ' && (date = date.replace(' ', 'T'))\n\t\t\t\t// Do not allow rollover hours.\n\t\t\t\tif (match[2] && +match[2] > 23) {\n\t\t\t\t\tdate = ''\n\t\t\t\t} else {\n\t\t\t\t\toffset = match[3] || null\n\t\t\t\t\tdate = date.toUpperCase()\n\t\t\t\t\tif (!offset && hasTime) date += 'Z'\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdate = ''\n\t\t\t}\n\t\t}\n\n\t\tsuper(date)\n\t\tif (!isNaN(this.getTime())) {\n\t\t\tthis.#hasDate = hasDate\n\t\t\tthis.#hasTime = hasTime\n\t\t\tthis.#offset = offset\n\t\t}\n\t}\n\n\tisDateTime() {\n\t\treturn this.#hasDate && this.#hasTime\n\t}\n\n\tisLocal() {\n\t\treturn !this.#hasDate || !this.#hasTime || !this.#offset\n\t}\n\n\tisDate() {\n\t\treturn this.#hasDate && !this.#hasTime\n\t}\n\n\tisTime() {\n\t\treturn this.#hasTime && !this.#hasDate\n\t}\n\n\tisValid() {\n\t\treturn this.#hasDate || this.#hasTime\n\t}\n\n\toverride toISOString() {\n\t\tlet iso = super.toISOString()\n\n\t\t// Local Date\n\t\tif (this.isDate())\n\t\t\treturn iso.slice(0, 10)\n\n\t\t// Local Time\n\t\tif (this.isTime())\n\t\t\treturn iso.slice(11, 23)\n\n\t\t// Local DateTime\n\t\tif (this.#offset === null)\n\t\t\treturn iso.slice(0, -1)\n\n\t\t// Offset DateTime\n\t\tif (this.#offset === 'Z')\n\t\t\treturn iso\n\n\t\t// This part is quite annoying: JS strips the original timezone from the ISO string representation\n\t\t// Instead of using a \"modified\" date and \"Z\", we restore the representation \"as authored\"\n\n\t\tlet offset = (+(this.#offset.slice(1, 3)) * 60) + +(this.#offset.slice(4, 6))\n\t\toffset = this.#offset[0] === '-' ? offset : -offset\n\n\t\tlet offsetDate = new Date(this.getTime() - (offset * 60e3))\n\t\treturn offsetDate.toISOString().slice(0, -1) + this.#offset\n\t}\n\n\tstatic wrapAsOffsetDateTime(jsDate: Date, offset = 'Z') {\n\t\tlet date = new TomlDate(jsDate)\n\t\tdate.#offset = offset\n\t\treturn date\n\t}\n\n\tstatic wrapAsLocalDateTime(jsDate: Date) {\n\t\tlet date = new TomlDate(jsDate)\n\t\tdate.#offset = null\n\t\treturn date\n\t}\n\n\tstatic wrapAsLocalDate(jsDate: Date) {\n\t\tlet date = new TomlDate(jsDate)\n\t\tdate.#hasTime = false\n\t\tdate.#offset = null\n\t\treturn date\n\t}\n\n\tstatic wrapAsLocalTime(jsDate: Date) {\n\t\tlet date = new TomlDate(jsDate)\n\t\tdate.#hasDate = false\n\t\tdate.#offset = null\n\t\treturn date\n\t}\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\ntype TomlErrorOptions = ErrorOptions & {\n\ttoml: string\n\tptr: number\n}\n\nfunction getLineColFromPtr(string: string, ptr: number): [number, number] {\n\tlet lines = string.slice(0, ptr).split(/\\r\\n|\\n|\\r/g)\n\treturn [lines.length, lines.pop()!.length + 1]\n}\n\nfunction makeCodeBlock(string: string, line: number, column: number) {\n\tlet lines = string.split(/\\r\\n|\\n|\\r/g)\n\tlet codeblock = ''\n\n\tlet numberLen = (Math.log10(line + 1) | 0) + 1\n\n\tfor (let i = line - 1; i <= line + 1; i++) {\n\t\tlet l = lines[i - 1]\n\t\tif (!l) continue\n\n\t\tcodeblock += i.toString().padEnd(numberLen, ' ')\n\t\tcodeblock += ': '\n\t\tcodeblock += l\n\t\tcodeblock += '\\n'\n\n\t\tif (i === line) {\n\t\t\tcodeblock += ' '.repeat(numberLen + column + 2)\n\t\t\tcodeblock += '^\\n'\n\t\t}\n\t}\n\n\treturn codeblock\n}\n\nexport class TomlError extends Error {\n\tline: number\n\tcolumn: number\n\tcodeblock: string\n\n\tconstructor(message: string, options: TomlErrorOptions) {\n\t\tconst [line, column] = getLineColFromPtr(options.toml, options.ptr)\n\t\tconst codeblock = makeCodeBlock(options.toml, line, column)\n\n\t\tsuper(`Invalid TOML document: ${message}\\n\\n${codeblock}`, options)\n\t\tthis.line = line\n\t\tthis.column = column\n\t\tthis.codeblock = codeblock\n\t}\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport { TomlDate } from './date.js'\nimport { TomlError } from './error.js'\n\n// let CTRL_REGEX = /[\\x00-\\x08\\x0f-\\x1f\\x7f]/\nlet INT_REGEX = /^((0x[0-9a-fA-F](_?[0-9a-fA-F])*)|(([+-]|0[ob])?\\d(_?\\d)*))$/\nlet FLOAT_REGEX = /^[+-]?\\d(_?\\d)*(\\.\\d(_?\\d)*)?([eE][+-]?\\d(_?\\d)*)?$/\nlet LEADING_ZERO = /^[+-]?0[0-9_]/\n\nexport function parseString(str: string, ptr: number): [string, number] {\n\tlet c = str[ptr++]!\n\tlet first = c\n\tlet isLiteral = c === \"'\"\n\tlet isMultiline = c === str[ptr] && c === str[ptr + 1]\n\tif (isMultiline) {\n\t\t// Trim initial newline\n\t\tif (str[ptr += 2] === '\\n') ptr++\n\t\telse if (str[ptr] === '\\r' && str[ptr + 1] === '\\n') ptr += 2\n\t}\n\n\t/*\n\tThe fast path does not seem to bring significant performance gains, so it's commented out.\n\tKept for reference and/or future fafoing.\n\n\tWithout: spec 5.08 µs/iter 3.88 ipc (99.44% cache) 23.90 branch misses 28.61k cycles 111.01k instructions\n\t 5MB 115.73 ms/iter 2.51 ipc (98.36% cache) 3.12M branch misses 619.30M cycles 1.56G instructions\n\n\tWith: spec 5.09 µs/iter 3.90 ipc (99.46% cache) 24.42 branch misses 28.57k cycles 111.49k instructions\n\t 5MB 113.89 ms/iter 2.47 ipc (98.38% cache) 3.12M branch misses 611.94M cycles 1.51G instructions\n\n\tif (c === \"'\") {\n\t\t// Literal strings fast path - no transform needs to occur; just grab the str and that's it\n\t\tlet endPtr = str.indexOf(isMultiline ? \"'''\" : \"'\", ptr)\n\t\tif (endPtr < 0) {\n\t\t\tthrow new TomlError(\"unfinished string literal\", { toml: str, ptr })\n\t\t}\n\n\t\tif (isMultiline) {\n\t\t\t// If the string ends with 4-5 quotes, then the first 1-2 are part of the string\n\t\t\tif (str[endPtr + 3] === \"'\") endPtr++\n\t\t\tif (str[endPtr + 3] === \"'\") endPtr++\n\t\t}\n\n\t\tlet string = str.slice(ptr, endPtr)\n\t\tif (CTRL_REGEX.test(string)) {\n\t\t\tlet match = string.match(CTRL_REGEX)!\n\t\t\tthrow new TomlError('control characters are not allowed in strings', { toml: str, ptr: ptr + (match.index ?? 0) })\n\t\t}\n\t\treturn [string, endPtr + (isMultiline ? 3 : 1)]\n\t}\n\t*/\n\n\tlet parsed = ''\n\tlet sliceStart = ptr\n\n\t// states:\n\t// 0 - decoding\n\t// 1 - decoding escape\n\t// 2 - whitespace escape (no newline encountered yet, must fail on non-whitespace)\n\t// 3 - whitespace escape (newline encountered, allowed to transition back to normal decode)\n\tlet state = 0\n\tfor (let i = ptr; i < str.length; i++) {\n\t\tc = str[i]!\n\n\t\t// Deal with newlines first, since that simplifies control character checking and handling across all states\n\t\tif (isMultiline && (c === '\\n' || (c === '\\r' && str[i + 1] === '\\n'))) {\n\t\t\tstate = state && 3\n\t\t}\n\n\t\t// Control characters are banned in TOML, so we throw an error if we encounter them\n\t\telse if ((c < '\\x20' && c !== '\\t') || c === '\\x7f') {\n\t\t\tthrow new TomlError('control characters are not allowed in strings', {\n\t\t\t\ttoml: str,\n\t\t\t\tptr: i,\n\t\t\t})\n\t\t}\n\n\t\t// The string might terminate while we're parsing through a newline escape.\n\t\t// It must have encountered a newline; otherwise, it'll simply fail in another branch.\n\t\telse if ((!state || state === 3) && c === first && (!isMultiline || (str[i + 1] === first && str[i + 2] === first))) {\n\t\t\tif (isMultiline) {\n\t\t\t\t// If the string ends with 4-5 quotes, then the first 1-2 are part of the string\n\t\t\t\tif (str[i + 3] === first) i++\n\t\t\t\tif (str[i + 3] === first) i++\n\t\t\t}\n\n\t\t\treturn [\n\t\t\t\t// If we're in a newline escape still, then there's nothing to add.\n\t\t\t\t// Also try to avoid concat if there's nothing to add to parsed, or nothing has been added to parsed.\n\t\t\t\tstate ? parsed : parsed + str.slice(sliceStart, i),\n\t\t\t\ti + (isMultiline ? 3 : 1),\n\t\t\t]\n\t\t}\n\n\t\telse if (!state) {\n\t\t\tif (!isLiteral && c === '\\\\') {\n\t\t\t\tparsed += str.slice(sliceStart, (sliceStart = i))\n\t\t\t\tstate = 1\n\t\t\t}\n\t\t}\n\n\t\telse if (state === 1) {\n\t\t\tif (c === 'x' || c === 'u' || c === 'U') { // Unicode escape\n\t\t\t\tlet value = 0\n\t\t\t\tlet len = c === 'x' ? 2 : c === 'u' ? 4 : 8\n\t\t\t\tfor (let j = 0; j < len; j++, i++) {\n\t\t\t\t\tlet hex = str.charCodeAt(i + 1)\n\t\t\t\t\tlet digit =\n\t\t\t\t\t\t/* 0-9 */ hex >= 0x30 && hex <= 0x39 ? hex - 0x30 :\n\t\t\t\t\t\t/* A-F */ hex >= 0x41 && hex <= 0x46 ? hex - 0x41 + 10 :\n\t\t\t\t\t\t/* a-f */ hex >= 0x61 && hex <= 0x66 ? hex - 0x61 + 10 : -1\n\n\t\t\t\t\tif (digit < 0) throw new TomlError('invalid non-hex character in unicode escape', { toml: str, ptr: i + 1 })\n\t\t\t\t\tvalue = (value << 4) | digit\n\t\t\t\t}\n\n\t\t\t\t// Because JS does bitwise on signed 32bit integers, all 0xfzzzzzzz values are actually seen as negative\n\t\t\t\tif (value < 0 || value > 0x10ffff || (value >= 0xd800 && value <= 0xdfff)) {\n\t\t\t\t\tthrow new TomlError('invalid unicode escape', { toml: str, ptr: i })\n\t\t\t\t}\n\n\t\t\t\tparsed += String.fromCodePoint(value)\n\t\t\t\tsliceStart = i + 1\n\t\t\t\tstate = 0\n\t\t\t}\n\n\t\t\telse if (c === ' ' || c === '\\t') { // If it was a newline, it'd have been handled earlier\n\t\t\t\tstate = 2\n\t\t\t}\n\n\t\t\telse {\n\t\t\t\tif (c === 'b') parsed += '\\b'\n\t\t\t\telse if (c === 't') parsed += '\\t'\n\t\t\t\telse if (c === 'n') parsed += '\\n'\n\t\t\t\telse if (c === 'f') parsed += '\\f'\n\t\t\t\telse if (c === 'r') parsed += '\\r'\n\t\t\t\telse if (c === 'e') parsed += '\\x1b'\n\t\t\t\telse if (c === '\"') parsed += '\"'\n\t\t\t\telse if (c === '\\\\') parsed += '\\\\'\n\t\t\t\telse throw new TomlError('unrecognized escape sequence', { toml: str, ptr: i })\n\t\t\t\tsliceStart = i + 1\n\t\t\t\tstate = 0\n\t\t\t}\n\t\t}\n\n\t\telse if (c !== ' ' && c !== '\\t') {\n\t\t\tif (state === 2) {\n\t\t\t\tthrow new TomlError('invalid escape: only line-ending whitespace may be escaped', {\n\t\t\t\t\ttoml: str,\n\t\t\t\t\tptr: sliceStart,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\t// State cannot be zero, or we'd have branched earlier already.\n\t\t\t// If it's a backslash, immediately transition to the escape state so it can be processed.\n\t\t\tstate = !isLiteral && c === '\\\\' ? 1 : 0\n\t\t\tsliceStart = i\n\t\t}\n\t}\n\n\tthrow new TomlError('unfinished string', { toml: str, ptr })\n}\n\nexport type IntegersAsBigInt = undefined | boolean | 'asNeeded'\n\nexport function parseValue(value: string, toml: string, ptr: number, integersAsBigInt: IntegersAsBigInt): boolean | number | bigint | TomlDate {\n\t// Constant values\n\tif (value === 'true') return true\n\tif (value === 'false') return false\n\tif (value === '-inf') return -Infinity\n\tif (value === 'inf' || value === '+inf') return Infinity\n\tif (value === 'nan' || value === '+nan' || value === '-nan') return NaN\n\n\t// Avoid FP representation of -0\n\tif (value === '-0') return integersAsBigInt ? 0n : 0\n\n\t// Numbers\n\tlet isInt = INT_REGEX.test(value)\n\tif (isInt || FLOAT_REGEX.test(value)) {\n\t\tif (LEADING_ZERO.test(value)) {\n\t\t\tthrow new TomlError('leading zeroes are not allowed', {\n\t\t\t\ttoml: toml,\n\t\t\t\tptr: ptr,\n\t\t\t})\n\t\t}\n\n\t\tvalue = value.replace(/_/g, '')\n\t\tlet numeric: number | bigint = +value\n\n\t\tif (isNaN(numeric)) {\n\t\t\tthrow new TomlError('invalid number', {\n\t\t\t\ttoml: toml,\n\t\t\t\tptr: ptr,\n\t\t\t})\n\t\t}\n\n\t\tif (isInt) {\n\t\t\tif ((isInt = !Number.isSafeInteger(numeric)) && !integersAsBigInt) {\n\t\t\t\tthrow new TomlError('integer value cannot be represented losslessly', {\n\t\t\t\t\ttoml: toml,\n\t\t\t\t\tptr: ptr,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tif (isInt || integersAsBigInt === true) numeric = BigInt(value)\n\t\t}\n\n\t\treturn numeric\n\t}\n\n\tconst date = new TomlDate(value)\n\tif (!date.isValid()) {\n\t\tthrow new TomlError('invalid value', {\n\t\t\ttoml: toml,\n\t\t\tptr: ptr,\n\t\t})\n\t}\n\n\treturn date\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport type { TomlDate } from './date.js'\nimport { TomlError } from './error.js'\n\nexport type TomlPrimitive = string | number | bigint | boolean | TomlDate\nexport type TomlTable = { [key: string]: TomlValue }\nexport type TomlValue = TomlPrimitive | TomlValue[] | TomlTable\n\nexport type TomlTableWithoutBigInt = { [key: string]: TomlValueWithoutBigInt }\nexport type TomlValueWithoutBigInt = Exclude<TomlPrimitive, bigint> | TomlValueWithoutBigInt[] | TomlTableWithoutBigInt\n\nexport function indexOfNewline(str: string, start = 0, end = str.length) {\n\tlet idx = str.indexOf('\\n', start)\n\tif (str[idx - 1] === '\\r') idx--\n\treturn idx <= end ? idx : -1\n}\n\nexport function skipComment(str: string, ptr: number) {\n\tfor (let i = ptr; i < str.length; i++) {\n\t\tlet c = str[i]!\n\t\tif (c === '\\n')\n\t\t\treturn i\n\n\t\tif (c === '\\r' && str[i + 1] === '\\n')\n\t\t\treturn i + 1\n\n\t\tif ((c < '\\x20' && c !== '\\t') || c === '\\x7f') {\n\t\t\tthrow new TomlError('control characters are not allowed in comments', {\n\t\t\t\ttoml: str,\n\t\t\t\tptr: ptr,\n\t\t\t})\n\t\t}\n\t}\n\n\treturn str.length\n}\n\nexport function skipVoid(str: string, ptr: number, banNewLines?: boolean, banComments?: boolean): number {\n\tlet c\n\twhile (1) {\n\t\twhile ((c = str[ptr]) === ' ' || c === '\\t' || (!banNewLines && (c === '\\n' || (c === '\\r' && str[ptr + 1] === '\\n')))) ptr++\n\n\t\t// Tucking the return statement here would save 5 characters >:)\n\t\t// But TypeScript fails to detect there is no way to exit the loop so it complains about the lack of final return\n\t\tif (banComments || c !== '#') break\n\n\t\tptr = skipComment(str, ptr)\n\t}\n\n\treturn ptr\n}\n\nexport function skipUntil(str: string, ptr: number, sep: string, end?: string, banNewLines: boolean = false) {\n\tif (!end) {\n\t\tptr = indexOfNewline(str, ptr)\n\t\treturn ptr < 0 ? str.length : ptr\n\t}\n\n\tfor (let i = ptr; i < str.length; i++) {\n\t\tlet c = str[i]\n\t\tif (c === '#') {\n\t\t\ti = indexOfNewline(str, i)\n\t\t} else if (c === sep) {\n\t\t\treturn i + 1\n\t\t} else if (c === end || (banNewLines && (c === '\\n' || (c === '\\r' && str[i + 1] === '\\n')))) {\n\t\t\treturn i\n\t\t}\n\t}\n\n\tthrow new TomlError('cannot find end of structure', {\n\t\ttoml: str,\n\t\tptr: ptr,\n\t})\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport { type IntegersAsBigInt, parseString, parseValue } from './primitive.js'\nimport { parseArray, parseInlineTable } from './struct.js'\nimport { skipVoid, skipUntil, skipComment, type TomlValue } from './util.js'\nimport { TomlError } from './error.js'\n\nfunction sliceAndTrimEndOf(str: string, startPtr: number, endPtr: number): [string, number] {\n\tlet value = str.slice(startPtr, endPtr)\n\n\tlet commentIdx = value.indexOf('#')\n\tif (commentIdx > -1) {\n\t\t// The call to skipComment allows to \"validate\" the comment\n\t\t// (absence of control characters)\n\t\tskipComment(str, commentIdx)\n\t\tvalue = value.slice(0, commentIdx)\n\t}\n\n\treturn [value.trimEnd(), commentIdx]\n}\n\nexport function extractValue(str: string, ptr: number, end: string | undefined, depth: number, integersAsBigInt: IntegersAsBigInt): [TomlValue, number] {\n\tif (depth === 0) {\n\t\tthrow new TomlError('document contains excessively nested structures. aborting.', {\n\t\t\ttoml: str,\n\t\t\tptr: ptr,\n\t\t})\n\t}\n\n\tlet c = str[ptr]\n\tif (c === '[' || c === '{') {\n\t\tlet [value, endPtr] = c === '['\n\t\t\t? parseArray(str, ptr, depth, integersAsBigInt)\n\t\t\t: parseInlineTable(str, ptr, depth, integersAsBigInt)\n\n\t\tif (end) {\n\t\t\tendPtr = skipVoid(str, endPtr)\n\t\t\tif (str[endPtr] === ',') endPtr++\n\t\t\telse if (str[endPtr] !== end) {\n\t\t\t\tthrow new TomlError('expected comma or end of structure', {\n\t\t\t\t\ttoml: str,\n\t\t\t\t\tptr: endPtr,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\treturn [value, endPtr]\n\t}\n\n\tif (c === '\"' || c === \"'\") {\n\t\tlet [parsed, endPtr] = parseString(str, ptr)\n\t\tif (end) {\n\t\t\tendPtr = skipVoid(str, endPtr)\n\n\t\t\tif (str[endPtr] && str[endPtr] !== ',' && str[endPtr] !== end && str[endPtr] !== '\\n' && str[endPtr] !== '\\r') {\n\t\t\t\tthrow new TomlError('unexpected character encountered', {\n\t\t\t\t\ttoml: str,\n\t\t\t\t\tptr: endPtr,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tif (str[endPtr] === ',') endPtr++\n\t\t}\n\n\t\treturn [parsed, endPtr]\n\t}\n\n\tlet endPtr = skipUntil(str, ptr, ',', end)\n\tlet slice = sliceAndTrimEndOf(str, ptr, endPtr - (str[endPtr - 1] === ',' ? 1 : 0))\n\tif (!slice[0]) {\n\t\tthrow new TomlError('incomplete key-value declaration: no value specified', {\n\t\t\ttoml: str,\n\t\t\tptr: ptr,\n\t\t})\n\t}\n\n\tif (end && slice[1] > -1) {\n\t\tendPtr = skipVoid(str, ptr + slice[1])\n\t\tif (str[endPtr] === ',') endPtr++\n\t}\n\n\treturn [\n\t\tparseValue(slice[0], str, ptr, integersAsBigInt),\n\t\tendPtr,\n\t]\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport { type IntegersAsBigInt, parseString } from './primitive.js'\nimport { extractValue } from './extract.js'\nimport { indexOfNewline, skipComment, skipVoid, type TomlTable, type TomlValue } from './util.js'\nimport { TomlError } from './error.js'\n\nlet KEY_PART_RE = /^[a-zA-Z0-9-_]+[ \\t]*$/\n\nexport function parseKey(str: string, ptr: number, end = '='): [string[], number] {\n\tlet dot = ptr - 1\n\tlet parsed = []\n\n\tlet endPtr = str.indexOf(end, ptr)\n\tif (endPtr < 0) {\n\t\tthrow new TomlError('incomplete key-value: cannot find end of key', {\n\t\t\ttoml: str,\n\t\t\tptr: ptr,\n\t\t})\n\t}\n\n\tdo {\n\t\tlet c = str[(ptr = ++dot)]\n\n\t\t// If it's whitespace, ignore\n\t\tif (c !== ' ' && c !== '\\t') {\n\t\t\t// If it's a string\n\t\t\tif (c === '\"' || c === \"'\") {\n\t\t\t\tif (c === str[ptr + 1] && c === str[ptr + 2]) {\n\t\t\t\t\tthrow new TomlError('multiline strings are not allowed in keys', {\n\t\t\t\t\t\ttoml: str,\n\t\t\t\t\t\tptr: ptr,\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tlet [part, eos] = parseString(str, ptr)\n\t\t\t\tdot = str.indexOf('.', eos)\n\n\t\t\t\tlet strEnd = str.slice(eos, dot < 0 || dot > endPtr ? endPtr : dot)\n\t\t\t\tlet newLine = indexOfNewline(strEnd)\n\t\t\t\tif (newLine > -1) {\n\t\t\t\t\tthrow new TomlError('newlines are not allowed in keys', {\n\t\t\t\t\t\ttoml: str,\n\t\t\t\t\t\tptr: ptr + dot + newLine,\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tif (strEnd.trimStart()) {\n\t\t\t\t\tthrow new TomlError('found extra tokens after the string part', {\n\t\t\t\t\t\ttoml: str,\n\t\t\t\t\t\tptr: eos,\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tif (endPtr < eos) {\n\t\t\t\t\tendPtr = str.indexOf(end, eos)\n\t\t\t\t\tif (endPtr < 0) {\n\t\t\t\t\t\tthrow new TomlError('incomplete key-value: cannot find end of key', {\n\t\t\t\t\t\t\ttoml: str,\n\t\t\t\t\t\t\tptr: ptr,\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tparsed.push(part)\n\t\t\t} else {\n\t\t\t\t// Normal raw key part consumption and validation\n\t\t\t\tdot = str.indexOf('.', ptr)\n\t\t\t\tlet part = str.slice(ptr, dot < 0 || dot > endPtr ? endPtr : dot)\n\t\t\t\tif (!KEY_PART_RE.test(part)) {\n\t\t\t\t\tthrow new TomlError('only letter, numbers, dashes and underscores are allowed in keys', {\n\t\t\t\t\t\ttoml: str,\n\t\t\t\t\t\tptr: ptr,\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tparsed.push(part.trimEnd())\n\t\t\t}\n\t\t}\n\t\t// Until there's no more dot\n\t} while (dot + 1 && dot < endPtr)\n\n\treturn [parsed, skipVoid(str, endPtr + 1, true, true)]\n}\n\nexport function parseInlineTable(str: string, ptr: number, depth: number, integersAsBigInt: IntegersAsBigInt): [TomlTable, number] {\n\tlet res: TomlTable = {}\n\tlet seen = new Set()\n\tlet c: string\n\n\tptr++\n\twhile ((c = str[ptr++]!) !== '}' && c) {\n\t\tif (c === ',') {\n\t\t\tthrow new TomlError('expected value, found comma', {\n\t\t\t\ttoml: str,\n\t\t\t\tptr: ptr - 1,\n\t\t\t})\n\t\t} else if (c === '#') ptr = skipComment(str, ptr)\n\t\telse if (c !== ' ' && c !== '\\t' && c !== '\\n' && c !== '\\r') {\n\t\t\tlet k: string\n\t\t\tlet t: any = res\n\t\t\tlet hasOwn = false\n\n\t\t\tlet [key, keyEndPtr] = parseKey(str, ptr - 1)\n\t\t\tfor (let i = 0; i < key.length; i++) {\n\t\t\t\tif (i) t = hasOwn! ? t[k!] : (t[k!] = {})\n\n\t\t\t\tk = key[i]!\n\t\t\t\tif ((hasOwn = Object.hasOwn(t, k)) && (typeof t[k] !== 'object' || seen.has(t[k]))) {\n\t\t\t\t\tthrow new TomlError('trying to redefine an already defined value', {\n\t\t\t\t\t\ttoml: str,\n\t\t\t\t\t\tptr: ptr,\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tif (!hasOwn && k === '__proto__') {\n\t\t\t\t\tObject.defineProperty(t, k, { enumerable: true, configurable: true, writable: true })\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (hasOwn) {\n\t\t\t\tthrow new TomlError('trying to redefine an already defined value', {\n\t\t\t\t\ttoml: str,\n\t\t\t\t\tptr: ptr,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tlet [value, valueEndPtr] = extractValue(str, keyEndPtr, '}', depth - 1, integersAsBigInt)\n\t\t\tseen.add(value)\n\n\t\t\tt[k!] = value\n\t\t\tptr = valueEndPtr\n\t\t}\n\t}\n\n\tif (!c) {\n\t\tthrow new TomlError('unfinished table encountered', {\n\t\t\ttoml: str,\n\t\t\tptr: ptr,\n\t\t})\n\t}\n\n\treturn [res, ptr]\n}\n\nexport function parseArray(str: string, ptr: number, depth: number, integersAsBigInt: IntegersAsBigInt): [TomlValue[], number] {\n\tlet res: TomlValue[] = []\n\tlet c\n\n\tptr++\n\twhile ((c = str[ptr++]) !== ']' && c) {\n\t\tif (c === ',') {\n\t\t\tthrow new TomlError('expected value, found comma', {\n\t\t\t\ttoml: str,\n\t\t\t\tptr: ptr - 1,\n\t\t\t})\n\t\t} else if (c === '#') ptr = skipComment(str, ptr)\n\t\telse if (c !== ' ' && c !== '\\t' && c !== '\\n' && c !== '\\r') {\n\t\t\tlet e = extractValue(str, ptr - 1, ']', depth - 1, integersAsBigInt)\n\t\t\tres.push(e[0])\n\t\t\tptr = e[1]\n\t\t}\n\t}\n\n\tif (!c) {\n\t\tthrow new TomlError('unfinished array encountered', {\n\t\t\ttoml: str,\n\t\t\tptr: ptr,\n\t\t})\n\t}\n\n\treturn [res, ptr]\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport type { IntegersAsBigInt } from './primitive.js'\nimport { parseKey } from './struct.js'\nimport { extractValue } from './extract.js'\nimport { skipVoid, type TomlTable, type TomlTableWithoutBigInt } from './util.js'\nimport { TomlError } from './error.js'\n\nconst enum Type { DOTTED, EXPLICIT, ARRAY, ARRAY_DOTTED }\n\ntype MetaState = { t: Type; d: boolean; i: number; c: MetaRecord }\ntype MetaRecord = { [k: string]: MetaState }\ntype PeekResult = [string, TomlTable, MetaRecord] | null\n\nfunction peekTable(key: string[], table: TomlTable, meta: MetaRecord, type: Type): PeekResult {\n\tlet t: any = table\n\tlet m = meta\n\tlet k: string\n\tlet hasOwn = false\n\tlet state: MetaState\n\n\tfor (let i = 0; i < key.length; i++) {\n\t\tif (i) {\n\t\t\tt = hasOwn! ? t[k!] : (t[k!] = {})\n\t\t\tm = (state = m[k!]!).c\n\n\t\t\tif (type === Type.DOTTED && (state.t === Type.EXPLICIT || state.t === Type.ARRAY)) {\n\t\t\t\treturn null\n\t\t\t}\n\n\t\t\tif (state.t === Type.ARRAY) {\n\t\t\t\tlet l = t.length - 1\n\t\t\t\tt = t[l]\n\t\t\t\tm = m[l]!.c\n\t\t\t}\n\t\t}\n\n\t\tk = key[i]!\n\t\tif ((hasOwn = Object.hasOwn(t, k)) && m[k]?.t === Type.DOTTED && m[k]?.d) {\n\t\t\treturn null\n\t\t}\n\n\t\tif (!hasOwn) {\n\t\t\tif (k === '__proto__') {\n\t\t\t\tObject.defineProperty(t, k, { enumerable: true, configurable: true, writable: true })\n\t\t\t\tObject.defineProperty(m, k, { enumerable: true, configurable: true, writable: true })\n\t\t\t}\n\n\t\t\tm[k] = {\n\t\t\t\tt: i < key.length - 1 && type === Type.ARRAY\n\t\t\t\t\t? Type.ARRAY_DOTTED\n\t\t\t\t\t: type,\n\t\t\t\td: false,\n\t\t\t\ti: 0,\n\t\t\t\tc: {},\n\t\t\t}\n\t\t}\n\t}\n\n\tstate = m[k!]!\n\tif (state.t !== type && !(type === Type.EXPLICIT && state.t === Type.ARRAY_DOTTED)) {\n\t\t// Bad key type!\n\t\treturn null\n\t}\n\n\tif (type === Type.ARRAY) {\n\t\tif (!state.d) {\n\t\t\tstate.d = true\n\t\t\tt[k!] = []\n\t\t}\n\n\t\tt[k!].push(t = {})\n\t\tstate.c[state.i++] = (state = { t: Type.EXPLICIT, d: false, i: 0, c: {} })\n\t}\n\n\tif (state.d) {\n\t\t// Redefining a table!\n\t\treturn null\n\t}\n\n\tstate.d = true\n\tif (type === Type.EXPLICIT) {\n\t\tt = hasOwn ? t[k!] : (t[k!] = {})\n\t} else if (type === Type.DOTTED && hasOwn) {\n\t\treturn null\n\t}\n\n\treturn [k!, t, state.c]\n}\n\nexport interface ParseOptions {\n\tmaxDepth?: number\n\tintegersAsBigInt?: IntegersAsBigInt\n}\n\nexport function parse(toml: string, options?: ParseOptions & { integersAsBigInt: Exclude<IntegersAsBigInt, undefined | false> }): TomlTable\nexport function parse(toml: string, options?: ParseOptions): TomlTableWithoutBigInt\nexport function parse(toml: string, { maxDepth = 1000, integersAsBigInt }: ParseOptions = {}): TomlTable {\n\tlet res = {}\n\tlet meta = {}\n\n\tlet tbl = res\n\tlet m = meta\n\n\tfor (let ptr = skipVoid(toml, 0); ptr < toml.length;) {\n\t\tif (toml[ptr] === '[') {\n\t\t\tlet isTableArray = toml[++ptr] === '['\n\t\t\tlet k = parseKey(toml, (ptr += +isTableArray), ']')\n\n\t\t\tif (isTableArray) {\n\t\t\t\tif (toml[k[1] - 1] !== ']') {\n\t\t\t\t\tthrow new TomlError('expected end of table declaration', {\n\t\t\t\t\t\ttoml: toml,\n\t\t\t\t\t\tptr: k[1] - 1,\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tk[1]++\n\t\t\t}\n\n\t\t\tlet p = peekTable(k[0], res, meta, isTableArray ? Type.ARRAY : Type.EXPLICIT)\n\t\t\tif (!p) {\n\t\t\t\tthrow new TomlError('trying to redefine an already defined table or value', {\n\t\t\t\t\ttoml: toml,\n\t\t\t\t\tptr: ptr,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tm = p[2]\n\t\t\ttbl = p[1]\n\t\t\tptr = k[1]\n\t\t} else {\n\t\t\tlet k = parseKey(toml, ptr)\n\t\t\tlet p = peekTable(k[0], tbl, m, Type.DOTTED)\n\t\t\tif (!p) {\n\t\t\t\tthrow new TomlError('trying to redefine an already defined table or value', {\n\t\t\t\t\ttoml: toml,\n\t\t\t\t\tptr: ptr,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tlet v = extractValue(toml, k[1], void 0, maxDepth, integersAsBigInt)\n\t\t\tp[1][p[0]] = v[0]\n\t\t\tptr = v[1]\n\t\t}\n\n\t\tptr = skipVoid(toml, ptr, true)\n\t\tif (toml[ptr] && toml[ptr] !== '\\n' && toml[ptr] !== '\\r') {\n\t\t\tthrow new TomlError('each key-value declaration must be followed by an end-of-line', {\n\t\t\t\ttoml: toml,\n\t\t\t\tptr: ptr,\n\t\t\t})\n\t\t}\n\t\tptr = skipVoid(toml, ptr)\n\t}\n\n\treturn res\n}\n","import { Query } from \"web-tree-sitter\";\nimport { AstEventType } from \"./constants/ast-event-constants.js\";\n/** Query capture group names for relationships without an AstEvent.type counterpart. */\nconst QueryCaptureName = {\n IMPLEMENTS: \"implements\",\n EXTENDS: \"extends\",\n};\nexport class DefaultProvider {\n buildScopeMap(importStatements) {\n if (this.config.buildScopeMap)\n return this.config.buildScopeMap(importStatements);\n return new Map();\n }\n classifyCall(callNode) {\n if (this.config.classifyCall)\n return this.config.classifyCall(callNode);\n return { isMethodCall: false, methodName: callNode.text };\n }\n wasm_file;\n config;\n compiledQueries = null;\n constructor(config) {\n this.config = config;\n this.wasm_file = config.wasm_file;\n }\n /**\n * Compiles each query field independently: one field's pattern failing to compile against the\n * installed grammar (a real, observed failure mode across grammar-version bumps — see IMPT-001)\n * degrades only that field to its `descendantsOfType` fallback rather than silently discarding\n * every other field's precision for the whole language.\n */\n initQueries(language) {\n if (this.compiledQueries || !this.config.queries)\n return;\n const q = this.config.queries;\n this.compiledQueries = {\n classes: this.compileQuery(language, q.classes),\n functions: this.compileQuery(language, q.functions),\n imports: this.compileQuery(language, q.imports),\n calls: this.compileQuery(language, q.calls),\n implements: this.compileQuery(language, q.implements),\n extends: this.compileQuery(language, q.extends),\n };\n }\n compileQuery(language, pattern) {\n if (!pattern)\n return undefined;\n try {\n return new Query(language, pattern);\n }\n catch {\n return undefined;\n }\n }\n deleteQueries() {\n if (!this.compiledQueries)\n return;\n this.compiledQueries.classes?.delete();\n this.compiledQueries.functions?.delete();\n this.compiledQueries.imports?.delete();\n this.compiledQueries.calls?.delete();\n this.compiledQueries.implements?.delete();\n this.compiledQueries.extends?.delete();\n this.compiledQueries = null;\n }\n captureNodes(rootNode, captureNames, query) {\n if (!query)\n return [];\n const captures = query.captures(rootNode);\n const nodes = [];\n for (const c of captures) {\n if (captureNames.length === 0 || captureNames.includes(c.name)) {\n nodes.push(c.node);\n }\n }\n return nodes;\n }\n extractClasses(rootNode) {\n return this.extractNodes(rootNode, this.compiledQueries?.classes, [AstEventType.CLASS], this.config.classes);\n }\n extractFunctions(rootNode) {\n return this.extractNodes(rootNode, this.compiledQueries?.functions, [AstEventType.FUNCTION], this.config.functions);\n }\n extractImports(rootNode) {\n return this.extractNodes(rootNode, this.compiledQueries?.imports, [AstEventType.IMPORT], this.config.imports);\n }\n extractCalls(rootNode) {\n return this.extractNodes(rootNode, this.compiledQueries?.calls, [AstEventType.CALL], this.config.calls);\n }\n extractImplements(rootNode) {\n return this.extractNodes(rootNode, this.compiledQueries?.implements, [QueryCaptureName.IMPLEMENTS], this.config.implements || []);\n }\n extractExtends(rootNode) {\n return this.extractNodes(rootNode, this.compiledQueries?.extends, [QueryCaptureName.EXTENDS], this.config.extends || []);\n }\n extractNodes(rootNode, query, captureNames, fallbackTypes) {\n if (query) {\n return this.captureNodes(rootNode, captureNames, query);\n }\n const nodes = [];\n for (const nodeType of fallbackTypes) {\n nodes.push(...rootNode.descendantsOfType(nodeType).filter(Boolean));\n }\n return nodes;\n }\n}\n","import { parse } from \"smol-toml\";\nimport { UTF8_ENCODING } from \"@workspace/contracts\";\nimport { DefaultProvider, } from \"./language-provider.js\";\nconst DEFAULT_LANGUAGES_CONFIG_FILENAME = \"languages.toml\";\n/** True when `val` is an array whose every element is a string. */\nfunction isStringArray(val) {\n return Array.isArray(val) && val.every((v) => typeof v === \"string\");\n}\nconst REQUIRED_ARRAY_FIELDS = [\n \"extensions\",\n \"imports\",\n \"classes\",\n \"functions\",\n \"calls\",\n];\nconst OPTIONAL_ARRAY_FIELDS = [\"implements\", \"extends\"];\n/**\n * Validates a single `[languages.<name>]` TOML table against the expected LanguageConfig\n * shape: a required `wasm_file` string plus array-of-strings fields (required ones must\n * be present; optional ones may be absent but must be string arrays when present).\n */\nfunction isValidLanguageEntry(entry) {\n if (!entry || typeof entry !== \"object\")\n return false;\n const lang = entry;\n if (typeof lang.wasm_file !== \"string\")\n return false;\n return (REQUIRED_ARRAY_FIELDS.every((field) => isStringArray(lang[field])) &&\n OPTIONAL_ARRAY_FIELDS.every((field) => {\n const val = lang[field];\n return val === undefined || val === null || isStringArray(val);\n }));\n}\n/**\n * Validates that a parsed TOML object conforms to the expected LanguageRegistryData\n * structure, rejecting any input that doesn't match the required schema.\n * This prevents prototype pollution or logic bypass from a malicious languages.toml.\n */\nfunction validateLanguageRegistryData(parsed) {\n if (!parsed || typeof parsed !== \"object\")\n return false;\n const obj = parsed;\n if (!obj.languages || typeof obj.languages !== \"object\")\n return false;\n if (!Object.values(obj.languages).every(isValidLanguageEntry))\n return false;\n return true;\n}\nexport class LanguageRegistry {\n config;\n extToProviderMap;\n constructor(config) {\n this.config = config || { languages: {} };\n this.extToProviderMap = new Map();\n this.buildCache();\n }\n buildCache() {\n this.extToProviderMap.clear();\n for (const [_, langConfig] of Object.entries(this.config.languages)) {\n const provider = new DefaultProvider(langConfig);\n for (const ext of langConfig.extensions) {\n this.extToProviderMap.set(ext, provider);\n }\n }\n }\n static loadFromString(tomlContent, baseConfig) {\n const base = baseConfig || { languages: {} };\n if (!tomlContent) {\n return new LanguageRegistry(base);\n }\n try {\n const parsed = parse(tomlContent);\n if (validateLanguageRegistryData(parsed)) {\n const mergedLanguages = { ...base.languages, ...parsed.languages };\n return new LanguageRegistry({ languages: mergedLanguages });\n }\n }\n catch (err) {\n // Gracefully fall back to defaults silently on parse errors\n }\n return new LanguageRegistry(base);\n }\n static async load(projectRoot, baseConfig) {\n const base = baseConfig || { languages: {} };\n try {\n const _process = typeof globalThis !== \"undefined\"\n ? globalThis.process\n : undefined;\n if (_process && _process.versions && _process.versions.node) {\n // @ts-ignore\n const fs = await import(\"fs/promises\");\n // @ts-ignore\n const path = await import(\"path\");\n const targetPath = projectRoot\n ? path.resolve(projectRoot, DEFAULT_LANGUAGES_CONFIG_FILENAME)\n : path.resolve(_process.cwd(), DEFAULT_LANGUAGES_CONFIG_FILENAME);\n try {\n await fs.access(targetPath);\n const content = await fs.readFile(targetPath, UTF8_ENCODING);\n return LanguageRegistry.loadFromString(content, base);\n }\n catch (fileErr) {\n // Gracefully fall back to defaults if file is not accessible\n }\n }\n }\n catch (err) {\n // Gracefully fall back to defaults on loading errors\n }\n return new LanguageRegistry(base);\n }\n getProviderForExtension(ext) {\n return this.extToProviderMap.get(ext);\n }\n registerProvider(extensions, provider) {\n for (const ext of extensions) {\n this.extToProviderMap.set(ext, provider);\n }\n }\n getConfig() {\n return this.config;\n }\n}\n","/**\n * Tree-sitter query capture-group names (`@name`) used across every language\n * config's `queries` patterns. Unlike grammar-dictated node-type/field-name\n * strings (e.g. `class_declaration`, `name:`), these capture names are a\n * Docuvia-defined convention layered on top of the grammar — they line up\n * with `AstEventType` (see `./ast-event-constants.js`) — so they are not\n * exempt pass-through vocabulary and must be centralized here.\n */\nexport const QueryCaptureName = {\n CLASS: \"class\",\n FUNCTION: \"function\",\n IMPORT: \"import\",\n CALL: \"call\",\n IMPLEMENTS: \"implements\",\n EXTENDS: \"extends\",\n};\n","/**\n * Tree-sitter node `.type` discriminants used by this package's per-language\n * `LanguageConfig` definitions (`imports`/`classes`/`functions`/`calls`/etc.\n * arrays and their paired query patterns) — grammar-level values, not ours to\n * rename. Kept separate from `tree-sitter-node-types.ts` (`TreeSitterNodeTypes`,\n * consumed by the cross-language traversal/edge-computation code) because the\n * two sets cover different node kinds; both live in ast-core so the language\n * configs and the registry they feed can be imported statically by consumers\n * like the AST worker thread (issue #117/#118).\n */\nexport const LanguageNodeTypes = {\n // Shared across languages\n IDENTIFIER: \"identifier\",\n TYPE_IDENTIFIER: \"type_identifier\",\n CALL: \"call\",\n CALL_EXPRESSION: \"call_expression\",\n CLASS_DECLARATION: \"class_declaration\",\n ABSTRACT_CLASS_DECLARATION: \"abstract_class_declaration\",\n INTERFACE_DECLARATION: \"interface_declaration\",\n ENUM_DECLARATION: \"enum_declaration\",\n METHOD_DECLARATION: \"method_declaration\",\n METHOD_DEFINITION: \"method_definition\",\n FUNCTION_DECLARATION: \"function_declaration\",\n FUNCTION_DEFINITION: \"function_definition\",\n ARROW_FUNCTION: \"arrow_function\",\n MEMBER_EXPRESSION: \"member_expression\",\n IMPORT_STATEMENT: \"import_statement\",\n IMPORT_DECLARATION: \"import_declaration\",\n USE_DECLARATION: \"use_declaration\",\n ATTRIBUTE: \"attribute\",\n // C / C++\n STRUCT_SPECIFIER: \"struct_specifier\",\n ENUM_SPECIFIER: \"enum_specifier\",\n UNION_SPECIFIER: \"union_specifier\",\n TYPE_DEFINITION: \"type_definition\",\n FUNCTION_DECLARATOR: \"function_declarator\",\n CLASS_SPECIFIER: \"class_specifier\",\n FIELD_EXPRESSION: \"field_expression\",\n PREPROC_INCLUDE: \"preproc_include\",\n USING_DECLARATION: \"using_declaration\",\n // C#\n STRUCT_DECLARATION: \"struct_declaration\",\n RECORD_DECLARATION: \"record_declaration\",\n CONSTRUCTOR_DECLARATION: \"constructor_declaration\",\n DESTRUCTOR_DECLARATION: \"destructor_declaration\",\n CONVERSION_OPERATOR_DECLARATION: \"conversion_operator_declaration\",\n OPERATOR_DECLARATION: \"operator_declaration\",\n LOCAL_FUNCTION_STATEMENT: \"local_function_statement\",\n USING_DIRECTIVE: \"using_directive\",\n INVOCATION_EXPRESSION: \"invocation_expression\",\n OBJECT_CREATION_EXPRESSION: \"object_creation_expression\",\n BASE_LIST: \"base_list\",\n // Go\n TYPE_DECLARATION: \"type_declaration\",\n TYPE_SPEC: \"type_spec\",\n FIELD_IDENTIFIER: \"field_identifier\",\n SELECTOR_EXPRESSION: \"selector_expression\",\n // Java\n ANNOTATION_TYPE_DECLARATION: \"annotation_type_declaration\",\n COMPACT_CONSTRUCTOR_DECLARATION: \"compact_constructor_declaration\",\n METHOD_INVOCATION: \"method_invocation\",\n EXPLICIT_CONSTRUCTOR_INVOCATION: \"explicit_constructor_invocation\",\n SUPERCLASS: \"superclass\",\n SUPER_INTERFACES: \"super_interfaces\",\n TYPE_LIST: \"type_list\",\n // JavaScript / TypeScript\n GENERATOR_FUNCTION_DECLARATION: \"generator_function_declaration\",\n GENERATOR_FUNCTION: \"generator_function\",\n FUNCTION_EXPRESSION: \"function_expression\",\n PROPERTY_IDENTIFIER: \"property_identifier\",\n IMPLEMENTS_CLAUSE: \"implements_clause\",\n EXTENDS_CLAUSE: \"extends_clause\",\n TYPE_ALIAS_DECLARATION: \"type_alias_declaration\",\n CLASS_HERITAGE: \"class_heritage\",\n // PHP\n NAMESPACE_USE_DECLARATION: \"namespace_use_declaration\",\n INCLUDE_EXPRESSION: \"include_expression\",\n INCLUDE_ONCE_EXPRESSION: \"include_once_expression\",\n REQUIRE_EXPRESSION: \"require_expression\",\n REQUIRE_ONCE_EXPRESSION: \"require_once_expression\",\n TRAIT_DECLARATION: \"trait_declaration\",\n FUNCTION_CALL_EXPRESSION: \"function_call_expression\",\n MEMBER_CALL_EXPRESSION: \"member_call_expression\",\n SCOPED_CALL_EXPRESSION: \"scoped_call_expression\",\n NAME: \"name\",\n BASE_CLAUSE: \"base_clause\",\n CLASS_INTERFACE_CLAUSE: \"class_interface_clause\",\n // Python\n IMPORT_FROM_STATEMENT: \"import_from_statement\",\n CLASS_DEFINITION: \"class_definition\",\n ARGUMENT_LIST: \"argument_list\",\n // Ruby\n CLASS: \"class\",\n MODULE: \"module\",\n SINGLETON_CLASS: \"singleton_class\",\n METHOD: \"method\",\n SINGLETON_METHOD: \"singleton_method\",\n CONSTANT: \"constant\",\n SCOPE_RESOLUTION: \"scope_resolution\",\n // C++\n BASE_CLASS_CLAUSE: \"base_class_clause\",\n QUALIFIED_IDENTIFIER: \"qualified_identifier\",\n // Rust\n STRUCT_ITEM: \"struct_item\",\n ENUM_ITEM: \"enum_item\",\n UNION_ITEM: \"union_item\",\n TRAIT_ITEM: \"trait_item\",\n FUNCTION_ITEM: \"function_item\",\n};\n","import { QueryCaptureName } from \"../constants/query-capture-names.js\";\nimport { LanguageNodeTypes } from \"../constants/language-node-types.js\";\nimport { TYPESCRIPT_EXTENSIONS } from \"@workspace/contracts\";\nconst TYPESCRIPT_WASM_FILE = \"tree-sitter-typescript.wasm\";\nexport const typescriptConfig = {\n extensions: TYPESCRIPT_EXTENSIONS,\n wasm_file: TYPESCRIPT_WASM_FILE,\n imports: [LanguageNodeTypes.IMPORT_STATEMENT],\n classes: [\n LanguageNodeTypes.CLASS_DECLARATION,\n LanguageNodeTypes.ABSTRACT_CLASS_DECLARATION,\n LanguageNodeTypes.INTERFACE_DECLARATION,\n LanguageNodeTypes.ENUM_DECLARATION,\n LanguageNodeTypes.TYPE_ALIAS_DECLARATION,\n ],\n functions: [\n LanguageNodeTypes.FUNCTION_DECLARATION,\n LanguageNodeTypes.METHOD_DEFINITION,\n LanguageNodeTypes.ARROW_FUNCTION,\n LanguageNodeTypes.FUNCTION_EXPRESSION,\n LanguageNodeTypes.GENERATOR_FUNCTION_DECLARATION,\n LanguageNodeTypes.GENERATOR_FUNCTION,\n ],\n calls: [LanguageNodeTypes.CALL_EXPRESSION],\n implements: [LanguageNodeTypes.IMPLEMENTS_CLAUSE],\n extends: [LanguageNodeTypes.EXTENDS_CLAUSE],\n queries: {\n // `class_declaration`'s name field is a `type_identifier` in this grammar (unlike plain\n // JS's `identifier`) — using `identifier` here made the whole pattern fail to compile.\n classes: `(${LanguageNodeTypes.CLASS_DECLARATION} name: (${LanguageNodeTypes.TYPE_IDENTIFIER})) @${QueryCaptureName.CLASS} (${LanguageNodeTypes.ABSTRACT_CLASS_DECLARATION} name: (${LanguageNodeTypes.TYPE_IDENTIFIER})) @${QueryCaptureName.CLASS} (${LanguageNodeTypes.INTERFACE_DECLARATION} name: (${LanguageNodeTypes.TYPE_IDENTIFIER})) @${QueryCaptureName.CLASS} (${LanguageNodeTypes.ENUM_DECLARATION} name: (${LanguageNodeTypes.IDENTIFIER})) @${QueryCaptureName.CLASS} (${LanguageNodeTypes.TYPE_ALIAS_DECLARATION} name: (${LanguageNodeTypes.TYPE_IDENTIFIER})) @${QueryCaptureName.CLASS}`,\n // Unlike `classes` above, none of these 6 alternatives require a `name:` field — arrow\n // functions and function expressions have no queryable name of their own, and their binding\n // name is resolved separately by resolveCallableName() walking up to an enclosing declarator\n // *after* extraction either way (ast-worker.ts), so a bare node-type capture loses nothing\n // versus the old per-type descendantsOfType fallback while replacing 6 full JS-side tree\n // walks with a single native query pass (docs/cli-test-analysis/typescript-cli-benchmark.md,\n // Open Findings §3).\n functions: `(${LanguageNodeTypes.FUNCTION_DECLARATION}) @${QueryCaptureName.FUNCTION} (${LanguageNodeTypes.METHOD_DEFINITION}) @${QueryCaptureName.FUNCTION} (${LanguageNodeTypes.ARROW_FUNCTION}) @${QueryCaptureName.FUNCTION} (${LanguageNodeTypes.FUNCTION_EXPRESSION}) @${QueryCaptureName.FUNCTION} (${LanguageNodeTypes.GENERATOR_FUNCTION_DECLARATION}) @${QueryCaptureName.FUNCTION} (${LanguageNodeTypes.GENERATOR_FUNCTION}) @${QueryCaptureName.FUNCTION}`,\n imports: `(${LanguageNodeTypes.IMPORT_STATEMENT}) @${QueryCaptureName.IMPORT}`,\n calls: `(${LanguageNodeTypes.CALL_EXPRESSION} function: [(${LanguageNodeTypes.IDENTIFIER}) (${LanguageNodeTypes.MEMBER_EXPRESSION})] @${QueryCaptureName.CALL})`,\n implements: `(${LanguageNodeTypes.IMPLEMENTS_CLAUSE} (_) @${QueryCaptureName.IMPLEMENTS})`,\n extends: `(${LanguageNodeTypes.EXTENDS_CLAUSE} value: (_) @${QueryCaptureName.EXTENDS})`,\n },\n};\n","import { QueryCaptureName } from \"../constants/query-capture-names.js\";\nimport { LanguageNodeTypes } from \"../constants/language-node-types.js\";\nimport { JAVASCRIPT_EXTENSIONS } from \"@workspace/contracts\";\nconst JAVASCRIPT_WASM_FILE = \"tree-sitter-javascript.wasm\";\nexport const javascriptConfig = {\n extensions: JAVASCRIPT_EXTENSIONS,\n wasm_file: JAVASCRIPT_WASM_FILE,\n imports: [LanguageNodeTypes.IMPORT_STATEMENT],\n classes: [LanguageNodeTypes.CLASS_DECLARATION],\n functions: [\n LanguageNodeTypes.FUNCTION_DECLARATION,\n LanguageNodeTypes.METHOD_DEFINITION,\n LanguageNodeTypes.ARROW_FUNCTION,\n LanguageNodeTypes.FUNCTION_EXPRESSION,\n LanguageNodeTypes.GENERATOR_FUNCTION_DECLARATION,\n LanguageNodeTypes.GENERATOR_FUNCTION,\n ],\n calls: [LanguageNodeTypes.CALL_EXPRESSION],\n // Plain JS's `class_heritage` has no intermediate `extends_clause` node (unlike TS's\n // grammar) — it directly wraps the anonymous \"extends\" token and the value expression.\n extends: [LanguageNodeTypes.CLASS_HERITAGE],\n queries: {\n classes: `(${LanguageNodeTypes.CLASS_DECLARATION} name: (${LanguageNodeTypes.IDENTIFIER})) @${QueryCaptureName.CLASS}`,\n // Same reasoning as typescript.ts: none of these 6 alternatives need a `name:` field (binding\n // names are resolved after extraction by resolveCallableName()), so a bare node-type capture\n // is equivalent to the old per-type descendantsOfType fallback while running one native query\n // pass instead of 6 JS-side tree walks.\n functions: `(${LanguageNodeTypes.FUNCTION_DECLARATION}) @${QueryCaptureName.FUNCTION} (${LanguageNodeTypes.METHOD_DEFINITION}) @${QueryCaptureName.FUNCTION} (${LanguageNodeTypes.ARROW_FUNCTION}) @${QueryCaptureName.FUNCTION} (${LanguageNodeTypes.FUNCTION_EXPRESSION}) @${QueryCaptureName.FUNCTION} (${LanguageNodeTypes.GENERATOR_FUNCTION_DECLARATION}) @${QueryCaptureName.FUNCTION} (${LanguageNodeTypes.GENERATOR_FUNCTION}) @${QueryCaptureName.FUNCTION}`,\n imports: `(${LanguageNodeTypes.IMPORT_STATEMENT}) @${QueryCaptureName.IMPORT}`,\n calls: `(${LanguageNodeTypes.CALL_EXPRESSION} function: [(${LanguageNodeTypes.IDENTIFIER}) (${LanguageNodeTypes.MEMBER_EXPRESSION})] @${QueryCaptureName.CALL})`,\n extends: `(${LanguageNodeTypes.CLASS_HERITAGE} \"extends\" (_) @${QueryCaptureName.EXTENDS})`,\n },\n};\n","import { QueryCaptureName } from \"../constants/query-capture-names.js\";\nimport { LanguageNodeTypes } from \"../constants/language-node-types.js\";\nimport { PYTHON_EXTENSIONS } from \"@workspace/contracts\";\nconst PYTHON_WASM_FILE = \"tree-sitter-python.wasm\";\nexport const pythonConfig = {\n extensions: PYTHON_EXTENSIONS,\n wasm_file: PYTHON_WASM_FILE,\n imports: [\n LanguageNodeTypes.IMPORT_STATEMENT,\n LanguageNodeTypes.IMPORT_FROM_STATEMENT,\n ],\n classes: [LanguageNodeTypes.CLASS_DEFINITION],\n functions: [LanguageNodeTypes.FUNCTION_DEFINITION],\n calls: [LanguageNodeTypes.CALL],\n // Python has no `implements` keyword — base classes and mixins share the same\n // parenthesized list (`class Derived(Base, Mixin):`), so both surface as `extends` edges.\n // `keyword_argument` entries (e.g. `metaclass=ABCMeta`) are excluded by only matching\n // bare identifiers/attributes, not the full argument_list.\n extends: [LanguageNodeTypes.CLASS_DEFINITION],\n queries: {\n classes: `(${LanguageNodeTypes.CLASS_DEFINITION} name: (${LanguageNodeTypes.IDENTIFIER})) @${QueryCaptureName.CLASS}`,\n functions: `(${LanguageNodeTypes.FUNCTION_DEFINITION} name: (${LanguageNodeTypes.IDENTIFIER})) @${QueryCaptureName.FUNCTION}`,\n imports: `(${LanguageNodeTypes.IMPORT_STATEMENT}) @${QueryCaptureName.IMPORT} (${LanguageNodeTypes.IMPORT_FROM_STATEMENT}) @${QueryCaptureName.IMPORT}`,\n calls: `(${LanguageNodeTypes.CALL} function: [(${LanguageNodeTypes.IDENTIFIER}) (${LanguageNodeTypes.ATTRIBUTE})] @${QueryCaptureName.CALL})`,\n extends: `(${LanguageNodeTypes.CLASS_DEFINITION} (${LanguageNodeTypes.ARGUMENT_LIST} [(${LanguageNodeTypes.IDENTIFIER}) (${LanguageNodeTypes.ATTRIBUTE})] @${QueryCaptureName.EXTENDS}))`,\n },\n};\n","import { QueryCaptureName } from \"../constants/query-capture-names.js\";\nimport { LanguageNodeTypes } from \"../constants/language-node-types.js\";\nimport { RUST_EXTENSIONS } from \"@workspace/contracts\";\nconst RUST_WASM_FILE = \"tree-sitter-rust.wasm\";\nexport const rustConfig = {\n extensions: RUST_EXTENSIONS,\n wasm_file: RUST_WASM_FILE,\n imports: [LanguageNodeTypes.USE_DECLARATION],\n classes: [\n LanguageNodeTypes.STRUCT_ITEM,\n LanguageNodeTypes.ENUM_ITEM,\n LanguageNodeTypes.UNION_ITEM,\n LanguageNodeTypes.TRAIT_ITEM,\n ],\n functions: [LanguageNodeTypes.FUNCTION_ITEM],\n calls: [LanguageNodeTypes.CALL_EXPRESSION],\n queries: {\n classes: `(${LanguageNodeTypes.STRUCT_ITEM} name: (${LanguageNodeTypes.TYPE_IDENTIFIER})) @${QueryCaptureName.CLASS} (${LanguageNodeTypes.ENUM_ITEM} name: (${LanguageNodeTypes.TYPE_IDENTIFIER})) @${QueryCaptureName.CLASS} (${LanguageNodeTypes.UNION_ITEM} name: (${LanguageNodeTypes.TYPE_IDENTIFIER})) @${QueryCaptureName.CLASS} (${LanguageNodeTypes.TRAIT_ITEM} name: (${LanguageNodeTypes.TYPE_IDENTIFIER})) @${QueryCaptureName.CLASS}`,\n functions: `(${LanguageNodeTypes.FUNCTION_ITEM} name: (${LanguageNodeTypes.IDENTIFIER})) @${QueryCaptureName.FUNCTION}`,\n imports: `(${LanguageNodeTypes.USE_DECLARATION}) @${QueryCaptureName.IMPORT}`,\n calls: `(${LanguageNodeTypes.CALL_EXPRESSION} function: [(${LanguageNodeTypes.IDENTIFIER}) (${LanguageNodeTypes.FIELD_EXPRESSION})] @${QueryCaptureName.CALL})`,\n },\n};\n","import { QueryCaptureName } from \"../constants/query-capture-names.js\";\nimport { LanguageNodeTypes } from \"../constants/language-node-types.js\";\nimport { GO_EXTENSIONS } from \"@workspace/contracts\";\nconst GO_WASM_FILE = \"tree-sitter-go.wasm\";\nexport const goConfig = {\n extensions: GO_EXTENSIONS,\n wasm_file: GO_WASM_FILE,\n imports: [LanguageNodeTypes.IMPORT_DECLARATION],\n classes: [LanguageNodeTypes.TYPE_DECLARATION],\n functions: [\n LanguageNodeTypes.FUNCTION_DECLARATION,\n LanguageNodeTypes.METHOD_DECLARATION,\n ],\n calls: [LanguageNodeTypes.CALL_EXPRESSION],\n queries: {\n // The name field lives on the nested `type_spec`, not `type_declaration` itself — the\n // latter has no `name:` field and made the whole pattern fail to compile.\n classes: `(${LanguageNodeTypes.TYPE_SPEC} name: (${LanguageNodeTypes.TYPE_IDENTIFIER})) @${QueryCaptureName.CLASS}`,\n functions: `(${LanguageNodeTypes.FUNCTION_DECLARATION} name: (${LanguageNodeTypes.IDENTIFIER})) @${QueryCaptureName.FUNCTION} (${LanguageNodeTypes.METHOD_DECLARATION} name: (${LanguageNodeTypes.FIELD_IDENTIFIER})) @${QueryCaptureName.FUNCTION}`,\n imports: `(${LanguageNodeTypes.IMPORT_DECLARATION}) @${QueryCaptureName.IMPORT}`,\n calls: `(${LanguageNodeTypes.CALL_EXPRESSION} function: [(${LanguageNodeTypes.IDENTIFIER}) (${LanguageNodeTypes.SELECTOR_EXPRESSION})] @${QueryCaptureName.CALL})`,\n },\n};\n","import { QueryCaptureName } from \"../constants/query-capture-names.js\";\nimport { LanguageNodeTypes } from \"../constants/language-node-types.js\";\nimport { JAVA_EXTENSIONS } from \"@workspace/contracts\";\nconst JAVA_WASM_FILE = \"tree-sitter-java.wasm\";\nexport const javaConfig = {\n extensions: JAVA_EXTENSIONS,\n wasm_file: JAVA_WASM_FILE,\n imports: [LanguageNodeTypes.IMPORT_DECLARATION],\n classes: [\n LanguageNodeTypes.CLASS_DECLARATION,\n LanguageNodeTypes.INTERFACE_DECLARATION,\n LanguageNodeTypes.ENUM_DECLARATION,\n LanguageNodeTypes.ANNOTATION_TYPE_DECLARATION,\n LanguageNodeTypes.RECORD_DECLARATION,\n ],\n functions: [\n LanguageNodeTypes.METHOD_DECLARATION,\n LanguageNodeTypes.CONSTRUCTOR_DECLARATION,\n LanguageNodeTypes.COMPACT_CONSTRUCTOR_DECLARATION,\n ],\n calls: [\n LanguageNodeTypes.METHOD_INVOCATION,\n LanguageNodeTypes.EXPLICIT_CONSTRUCTOR_INVOCATION,\n ],\n extends: [LanguageNodeTypes.SUPERCLASS],\n implements: [LanguageNodeTypes.SUPER_INTERFACES],\n queries: {\n classes: `(${LanguageNodeTypes.CLASS_DECLARATION} name: (${LanguageNodeTypes.IDENTIFIER})) @${QueryCaptureName.CLASS} (${LanguageNodeTypes.INTERFACE_DECLARATION} name: (${LanguageNodeTypes.IDENTIFIER})) @${QueryCaptureName.CLASS} (${LanguageNodeTypes.ENUM_DECLARATION} name: (${LanguageNodeTypes.IDENTIFIER})) @${QueryCaptureName.CLASS} (${LanguageNodeTypes.ANNOTATION_TYPE_DECLARATION} name: (${LanguageNodeTypes.IDENTIFIER})) @${QueryCaptureName.CLASS} (${LanguageNodeTypes.RECORD_DECLARATION} name: (${LanguageNodeTypes.IDENTIFIER})) @${QueryCaptureName.CLASS}`,\n functions: `(${LanguageNodeTypes.METHOD_DECLARATION} name: (${LanguageNodeTypes.IDENTIFIER})) @${QueryCaptureName.FUNCTION} (${LanguageNodeTypes.CONSTRUCTOR_DECLARATION} name: (${LanguageNodeTypes.IDENTIFIER})) @${QueryCaptureName.FUNCTION} (${LanguageNodeTypes.COMPACT_CONSTRUCTOR_DECLARATION} name: (${LanguageNodeTypes.IDENTIFIER})) @${QueryCaptureName.FUNCTION}`,\n imports: `(${LanguageNodeTypes.IMPORT_DECLARATION}) @${QueryCaptureName.IMPORT}`,\n calls: `(${LanguageNodeTypes.METHOD_INVOCATION} name: (${LanguageNodeTypes.IDENTIFIER}) @${QueryCaptureName.CALL}) (${LanguageNodeTypes.EXPLICIT_CONSTRUCTOR_INVOCATION}) @${QueryCaptureName.CALL}`,\n extends: `(${LanguageNodeTypes.SUPERCLASS} (${LanguageNodeTypes.TYPE_IDENTIFIER}) @${QueryCaptureName.EXTENDS})`,\n implements: `(${LanguageNodeTypes.SUPER_INTERFACES} (${LanguageNodeTypes.TYPE_LIST} (${LanguageNodeTypes.TYPE_IDENTIFIER}) @${QueryCaptureName.IMPLEMENTS}))`,\n },\n};\n","import { QueryCaptureName } from \"../constants/query-capture-names.js\";\nimport { LanguageNodeTypes } from \"../constants/language-node-types.js\";\nimport { C_EXTENSIONS } from \"@workspace/contracts\";\nconst C_WASM_FILE = \"tree-sitter-c.wasm\";\nexport const cConfig = {\n extensions: C_EXTENSIONS,\n wasm_file: C_WASM_FILE,\n imports: [LanguageNodeTypes.PREPROC_INCLUDE],\n classes: [\n LanguageNodeTypes.STRUCT_SPECIFIER,\n LanguageNodeTypes.ENUM_SPECIFIER,\n LanguageNodeTypes.UNION_SPECIFIER,\n LanguageNodeTypes.TYPE_DEFINITION,\n ],\n functions: [LanguageNodeTypes.FUNCTION_DEFINITION],\n calls: [LanguageNodeTypes.CALL_EXPRESSION],\n queries: {\n classes: `(${LanguageNodeTypes.STRUCT_SPECIFIER} name: (${LanguageNodeTypes.TYPE_IDENTIFIER})) @${QueryCaptureName.CLASS} (${LanguageNodeTypes.ENUM_SPECIFIER} name: (${LanguageNodeTypes.TYPE_IDENTIFIER})) @${QueryCaptureName.CLASS} (${LanguageNodeTypes.UNION_SPECIFIER} name: (${LanguageNodeTypes.TYPE_IDENTIFIER})) @${QueryCaptureName.CLASS} (${LanguageNodeTypes.TYPE_DEFINITION} name: (${LanguageNodeTypes.TYPE_IDENTIFIER})) @${QueryCaptureName.CLASS}`,\n functions: `(${LanguageNodeTypes.FUNCTION_DEFINITION} declarator: (${LanguageNodeTypes.FUNCTION_DECLARATOR} declarator: (${LanguageNodeTypes.IDENTIFIER}))) @${QueryCaptureName.FUNCTION}`,\n imports: `(${LanguageNodeTypes.PREPROC_INCLUDE}) @${QueryCaptureName.IMPORT}`,\n calls: `(${LanguageNodeTypes.CALL_EXPRESSION} function: (${LanguageNodeTypes.IDENTIFIER}) @${QueryCaptureName.CALL})`,\n },\n};\n","import { QueryCaptureName } from \"../constants/query-capture-names.js\";\nimport { LanguageNodeTypes } from \"../constants/language-node-types.js\";\nimport { CPP_EXTENSIONS } from \"@workspace/contracts\";\nconst CPP_WASM_FILE = \"tree-sitter-cpp.wasm\";\nexport const cppConfig = {\n extensions: CPP_EXTENSIONS,\n wasm_file: CPP_WASM_FILE,\n imports: [\n LanguageNodeTypes.PREPROC_INCLUDE,\n LanguageNodeTypes.USING_DECLARATION,\n ],\n classes: [\n LanguageNodeTypes.CLASS_SPECIFIER,\n LanguageNodeTypes.STRUCT_SPECIFIER,\n LanguageNodeTypes.ENUM_SPECIFIER,\n LanguageNodeTypes.UNION_SPECIFIER,\n LanguageNodeTypes.TYPE_DEFINITION,\n ],\n functions: [LanguageNodeTypes.FUNCTION_DEFINITION],\n calls: [LanguageNodeTypes.CALL_EXPRESSION],\n // C++ has no separate \"implements\" syntax — interfaces (abstract base classes) share the\n // same `base_class_clause` slot as concrete base classes, so both surface as `extends` edges.\n extends: [LanguageNodeTypes.BASE_CLASS_CLAUSE],\n queries: {\n classes: `(${LanguageNodeTypes.CLASS_SPECIFIER} name: (${LanguageNodeTypes.TYPE_IDENTIFIER})) @${QueryCaptureName.CLASS} (${LanguageNodeTypes.STRUCT_SPECIFIER} name: (${LanguageNodeTypes.TYPE_IDENTIFIER})) @${QueryCaptureName.CLASS} (${LanguageNodeTypes.ENUM_SPECIFIER} name: (${LanguageNodeTypes.TYPE_IDENTIFIER})) @${QueryCaptureName.CLASS} (${LanguageNodeTypes.UNION_SPECIFIER} name: (${LanguageNodeTypes.TYPE_IDENTIFIER})) @${QueryCaptureName.CLASS} (${LanguageNodeTypes.TYPE_DEFINITION} name: (${LanguageNodeTypes.TYPE_IDENTIFIER})) @${QueryCaptureName.CLASS}`,\n // declarator must accept `identifier` (free functions), `field_identifier` (inline class\n // methods), and `qualified_identifier` (out-of-line `Ret Class::method(){}` definitions) --\n // matching only `identifier` silently excluded every class method, inline or out-of-line\n // (GRPH-006 follow-up).\n functions: `(${LanguageNodeTypes.FUNCTION_DEFINITION} declarator: (${LanguageNodeTypes.FUNCTION_DECLARATOR} declarator: [(${LanguageNodeTypes.IDENTIFIER}) (${LanguageNodeTypes.FIELD_IDENTIFIER}) (${LanguageNodeTypes.QUALIFIED_IDENTIFIER})])) @${QueryCaptureName.FUNCTION}`,\n imports: `(${LanguageNodeTypes.PREPROC_INCLUDE}) @${QueryCaptureName.IMPORT} (${LanguageNodeTypes.USING_DECLARATION}) @${QueryCaptureName.IMPORT}`,\n calls: `(${LanguageNodeTypes.CALL_EXPRESSION} function: [(${LanguageNodeTypes.IDENTIFIER}) (${LanguageNodeTypes.FIELD_EXPRESSION})] @${QueryCaptureName.CALL})`,\n extends: `(${LanguageNodeTypes.BASE_CLASS_CLAUSE} (${LanguageNodeTypes.TYPE_IDENTIFIER}) @${QueryCaptureName.EXTENDS})`,\n },\n};\n","import { QueryCaptureName } from \"../constants/query-capture-names.js\";\nimport { LanguageNodeTypes } from \"../constants/language-node-types.js\";\nimport { RUBY_EXTENSIONS } from \"@workspace/contracts\";\nconst RUBY_WASM_FILE = \"tree-sitter-ruby.wasm\";\nexport const rubyConfig = {\n extensions: RUBY_EXTENSIONS,\n wasm_file: RUBY_WASM_FILE,\n imports: [LanguageNodeTypes.CALL], // Ruby has no import statements; require/load are method calls\n classes: [\n LanguageNodeTypes.CLASS,\n LanguageNodeTypes.MODULE,\n LanguageNodeTypes.SINGLETON_CLASS,\n ],\n functions: [LanguageNodeTypes.METHOD, LanguageNodeTypes.SINGLETON_METHOD],\n // This grammar has no separate \"command_call\" node — receiver-based unparenthesized calls\n // (`obj.method arg`) parse as plain `call` nodes too, same as `obj.method(arg)`.\n calls: [LanguageNodeTypes.CALL],\n // Only the `class Derived < Base` form is captured here — `include`/`extend`/`prepend`\n // mixins are plain method calls in this grammar, not a distinct node type, so they still\n // fall through as generic `calls` edges rather than `extends`.\n extends: [LanguageNodeTypes.SUPERCLASS],\n queries: {\n classes: `(${LanguageNodeTypes.CLASS} name: [(${LanguageNodeTypes.CONSTANT}) (${LanguageNodeTypes.SCOPE_RESOLUTION})]) @${QueryCaptureName.CLASS} (${LanguageNodeTypes.MODULE} name: (${LanguageNodeTypes.CONSTANT})) @${QueryCaptureName.CLASS} (${LanguageNodeTypes.SINGLETON_CLASS}) @${QueryCaptureName.CLASS}`,\n functions: `(${LanguageNodeTypes.METHOD} name: (${LanguageNodeTypes.IDENTIFIER})) @${QueryCaptureName.FUNCTION} (${LanguageNodeTypes.SINGLETON_METHOD} name: (${LanguageNodeTypes.IDENTIFIER})) @${QueryCaptureName.FUNCTION}`,\n // Predicates must live inside the same top-level pattern group as the capture they\n // filter (`(#match? @_method ...)` as a trailing sibling of the pattern, not a chained\n // JS-style method call) — the old `@_method.match?(...)` syntax was never valid tree-sitter\n // query syntax and made this pattern fail to compile.\n imports: `((${LanguageNodeTypes.CALL} method: (${LanguageNodeTypes.IDENTIFIER}) @_method) @${QueryCaptureName.IMPORT} (#match? @_method \"^(require|require_relative|load)$\"))`,\n calls: `(${LanguageNodeTypes.CALL} method: (${LanguageNodeTypes.IDENTIFIER}) @${QueryCaptureName.CALL})`,\n extends: `(${LanguageNodeTypes.SUPERCLASS} (_) @${QueryCaptureName.EXTENDS})`,\n },\n};\n","import { QueryCaptureName } from \"../constants/query-capture-names.js\";\nimport { LanguageNodeTypes } from \"../constants/language-node-types.js\";\nimport { PHP_EXTENSIONS } from \"@workspace/contracts\";\nconst PHP_WASM_FILE = \"tree-sitter-php.wasm\";\nexport const phpConfig = {\n extensions: PHP_EXTENSIONS,\n wasm_file: PHP_WASM_FILE,\n imports: [\n LanguageNodeTypes.NAMESPACE_USE_DECLARATION,\n LanguageNodeTypes.INCLUDE_EXPRESSION,\n LanguageNodeTypes.INCLUDE_ONCE_EXPRESSION,\n LanguageNodeTypes.REQUIRE_EXPRESSION,\n LanguageNodeTypes.REQUIRE_ONCE_EXPRESSION,\n ],\n classes: [\n LanguageNodeTypes.CLASS_DECLARATION,\n LanguageNodeTypes.INTERFACE_DECLARATION,\n LanguageNodeTypes.TRAIT_DECLARATION,\n LanguageNodeTypes.ENUM_DECLARATION,\n ],\n functions: [\n LanguageNodeTypes.FUNCTION_DEFINITION,\n LanguageNodeTypes.METHOD_DECLARATION,\n ],\n calls: [\n LanguageNodeTypes.FUNCTION_CALL_EXPRESSION,\n LanguageNodeTypes.MEMBER_CALL_EXPRESSION,\n LanguageNodeTypes.SCOPED_CALL_EXPRESSION,\n ],\n extends: [LanguageNodeTypes.BASE_CLAUSE],\n implements: [LanguageNodeTypes.CLASS_INTERFACE_CLAUSE],\n queries: {\n classes: `(${LanguageNodeTypes.CLASS_DECLARATION} name: (${LanguageNodeTypes.NAME})) @${QueryCaptureName.CLASS} (${LanguageNodeTypes.INTERFACE_DECLARATION} name: (${LanguageNodeTypes.NAME})) @${QueryCaptureName.CLASS} (${LanguageNodeTypes.TRAIT_DECLARATION} name: (${LanguageNodeTypes.NAME})) @${QueryCaptureName.CLASS} (${LanguageNodeTypes.ENUM_DECLARATION} name: (${LanguageNodeTypes.NAME})) @${QueryCaptureName.CLASS}`,\n functions: `(${LanguageNodeTypes.FUNCTION_DEFINITION} name: (${LanguageNodeTypes.NAME})) @${QueryCaptureName.FUNCTION} (${LanguageNodeTypes.METHOD_DECLARATION} name: (${LanguageNodeTypes.NAME})) @${QueryCaptureName.FUNCTION}`,\n imports: `(${LanguageNodeTypes.NAMESPACE_USE_DECLARATION}) @${QueryCaptureName.IMPORT} (${LanguageNodeTypes.INCLUDE_EXPRESSION}) @${QueryCaptureName.IMPORT} (${LanguageNodeTypes.INCLUDE_ONCE_EXPRESSION}) @${QueryCaptureName.IMPORT} (${LanguageNodeTypes.REQUIRE_EXPRESSION}) @${QueryCaptureName.IMPORT} (${LanguageNodeTypes.REQUIRE_ONCE_EXPRESSION}) @${QueryCaptureName.IMPORT}`,\n calls: `(${LanguageNodeTypes.FUNCTION_CALL_EXPRESSION} function: (${LanguageNodeTypes.NAME}) @${QueryCaptureName.CALL}) (${LanguageNodeTypes.MEMBER_CALL_EXPRESSION} name: (${LanguageNodeTypes.NAME}) @${QueryCaptureName.CALL}) (${LanguageNodeTypes.SCOPED_CALL_EXPRESSION} name: (${LanguageNodeTypes.NAME}) @${QueryCaptureName.CALL})`,\n extends: `(${LanguageNodeTypes.BASE_CLAUSE} (${LanguageNodeTypes.NAME}) @${QueryCaptureName.EXTENDS})`,\n implements: `(${LanguageNodeTypes.CLASS_INTERFACE_CLAUSE} (${LanguageNodeTypes.NAME}) @${QueryCaptureName.IMPLEMENTS})`,\n },\n};\n","import { QueryCaptureName } from \"../constants/query-capture-names.js\";\nimport { LanguageNodeTypes } from \"../constants/language-node-types.js\";\nimport { CSHARP_EXTENSIONS } from \"@workspace/contracts\";\nconst CSHARP_WASM_FILE = \"tree-sitter-c_sharp.wasm\";\nexport const csharpConfig = {\n extensions: CSHARP_EXTENSIONS,\n wasm_file: CSHARP_WASM_FILE,\n imports: [LanguageNodeTypes.USING_DIRECTIVE],\n classes: [\n LanguageNodeTypes.CLASS_DECLARATION,\n LanguageNodeTypes.STRUCT_DECLARATION,\n LanguageNodeTypes.INTERFACE_DECLARATION,\n LanguageNodeTypes.ENUM_DECLARATION,\n LanguageNodeTypes.RECORD_DECLARATION,\n ],\n functions: [\n LanguageNodeTypes.METHOD_DECLARATION,\n LanguageNodeTypes.CONSTRUCTOR_DECLARATION,\n LanguageNodeTypes.DESTRUCTOR_DECLARATION,\n LanguageNodeTypes.CONVERSION_OPERATOR_DECLARATION,\n LanguageNodeTypes.OPERATOR_DECLARATION,\n LanguageNodeTypes.LOCAL_FUNCTION_STATEMENT,\n ],\n calls: [\n LanguageNodeTypes.INVOCATION_EXPRESSION,\n LanguageNodeTypes.OBJECT_CREATION_EXPRESSION,\n ],\n // C# has no separate \"implements\" syntax — interfaces share the same `base_list` slot\n // as the base class (`class Derived : Base, IFoo`), so both surface as `extends` edges.\n extends: [LanguageNodeTypes.BASE_LIST],\n queries: {\n classes: `(${LanguageNodeTypes.CLASS_DECLARATION} name: (${LanguageNodeTypes.IDENTIFIER})) @${QueryCaptureName.CLASS} (${LanguageNodeTypes.STRUCT_DECLARATION} name: (${LanguageNodeTypes.IDENTIFIER})) @${QueryCaptureName.CLASS} (${LanguageNodeTypes.INTERFACE_DECLARATION} name: (${LanguageNodeTypes.IDENTIFIER})) @${QueryCaptureName.CLASS} (${LanguageNodeTypes.ENUM_DECLARATION} name: (${LanguageNodeTypes.IDENTIFIER})) @${QueryCaptureName.CLASS} (${LanguageNodeTypes.RECORD_DECLARATION} name: (${LanguageNodeTypes.IDENTIFIER})) @${QueryCaptureName.CLASS}`,\n functions: `(${LanguageNodeTypes.METHOD_DECLARATION} name: (${LanguageNodeTypes.IDENTIFIER})) @${QueryCaptureName.FUNCTION} (${LanguageNodeTypes.CONSTRUCTOR_DECLARATION} name: (${LanguageNodeTypes.IDENTIFIER})) @${QueryCaptureName.FUNCTION} (${LanguageNodeTypes.DESTRUCTOR_DECLARATION}) @${QueryCaptureName.FUNCTION} (${LanguageNodeTypes.CONVERSION_OPERATOR_DECLARATION}) @${QueryCaptureName.FUNCTION} (${LanguageNodeTypes.OPERATOR_DECLARATION}) @${QueryCaptureName.FUNCTION} (${LanguageNodeTypes.LOCAL_FUNCTION_STATEMENT}) @${QueryCaptureName.FUNCTION}`,\n imports: `(${LanguageNodeTypes.USING_DIRECTIVE}) @${QueryCaptureName.IMPORT}`,\n calls: `(${LanguageNodeTypes.INVOCATION_EXPRESSION}) @${QueryCaptureName.CALL} (${LanguageNodeTypes.OBJECT_CREATION_EXPRESSION}) @${QueryCaptureName.CALL}`,\n extends: `(${LanguageNodeTypes.BASE_LIST} (_) @${QueryCaptureName.EXTENDS})`,\n },\n};\n","import { LanguageRegistry, } from \"./language-registry.js\";\nimport { SUPPORTED_LANGUAGES } from \"./constants.js\";\nimport { typescriptConfig } from \"./languages/typescript.js\";\nimport { javascriptConfig } from \"./languages/javascript.js\";\nimport { pythonConfig } from \"./languages/python.js\";\nimport { rustConfig } from \"./languages/rust.js\";\nimport { goConfig } from \"./languages/go.js\";\nimport { javaConfig } from \"./languages/java.js\";\nimport { cConfig } from \"./languages/c.js\";\nimport { cppConfig } from \"./languages/cpp.js\";\nimport { rubyConfig } from \"./languages/ruby.js\";\nimport { phpConfig } from \"./languages/php.js\";\nimport { csharpConfig } from \"./languages/csharp.js\";\nexport const DEFAULT_REGISTRY = {\n languages: {\n [SUPPORTED_LANGUAGES.TYPESCRIPT]: typescriptConfig,\n [SUPPORTED_LANGUAGES.JAVASCRIPT]: javascriptConfig,\n [SUPPORTED_LANGUAGES.PYTHON]: pythonConfig,\n [SUPPORTED_LANGUAGES.RUST]: rustConfig,\n [SUPPORTED_LANGUAGES.GO]: goConfig,\n [SUPPORTED_LANGUAGES.JAVA]: javaConfig,\n [SUPPORTED_LANGUAGES.C]: cConfig,\n [SUPPORTED_LANGUAGES.CPP]: cppConfig,\n [SUPPORTED_LANGUAGES.RUBY]: rubyConfig,\n [SUPPORTED_LANGUAGES.PHP]: phpConfig,\n [SUPPORTED_LANGUAGES.CSHARP]: csharpConfig,\n },\n};\nexport async function loadDefaultRegistry(projectRoot) {\n return LanguageRegistry.load(projectRoot, DEFAULT_REGISTRY);\n}\nexport function loadDefaultRegistryFromString(tomlContent) {\n return LanguageRegistry.loadFromString(tomlContent, DEFAULT_REGISTRY);\n}\n","import { Parser, Language } from \"web-tree-sitter\";\nimport { UTF8_ENCODING } from \"@workspace/contracts\";\nimport { DefaultProvider } from \"./language-provider.js\";\nimport { AstTraverser } from \"./core/ast-traverser.js\";\nimport { EdgeComputer } from \"./core/edge-computer.js\";\nimport { AstEventType } from \"./constants/ast-event-constants.js\";\nconst ParserErrorMessages = {\n NO_LANGUAGE_PROVIDER: (ext) => `No language provider found for extension: ${ext}`,\n WASM_LOAD_FAILED: (wasmFileName, msg) => `Failed to load grammar WASM ${wasmFileName}: ${msg}`,\n PARSE_FAILED: \"Failed to parse file with tree-sitter\",\n};\nexport async function initParser(locateFile) {\n await Parser.init({ locateFile });\n}\nexport async function* generateAst(fileContent, filePath, ext, registry, loadWasm) {\n const provider = registry.getProviderForExtension(ext);\n if (!provider) {\n throw new Error(ParserErrorMessages.NO_LANGUAGE_PROVIDER(ext));\n }\n const wasmFileName = provider.wasm_file;\n let wasmBytesOrPath;\n try {\n wasmBytesOrPath = await loadWasm(wasmFileName);\n }\n catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n throw new Error(ParserErrorMessages.WASM_LOAD_FAILED(wasmFileName, msg));\n }\n // Handle both Uint8Array/ArrayBuffer and string paths\n const lang = typeof wasmBytesOrPath === \"string\"\n ? await Language.load(wasmBytesOrPath)\n : await Language.load(new Uint8Array(wasmBytesOrPath));\n const parser = new Parser();\n parser.setLanguage(lang);\n const textContent = typeof fileContent === \"string\"\n ? fileContent\n : new TextDecoder(UTF8_ENCODING).decode(fileContent);\n const tree = parser.parse(textContent);\n if (!tree) {\n parser.delete();\n throw new Error(ParserErrorMessages.PARSE_FAILED);\n }\n try {\n // Initialize Query-based extraction if queries are configured\n if (provider instanceof DefaultProvider) {\n provider.initQueries(lang);\n }\n const traverser = new AstTraverser(provider, tree.rootNode);\n const edgeComputer = new EdgeComputer(traverser.getImports(), textContent, filePath);\n yield { type: AstEventType.FILE, path: filePath };\n yield* traverser.extractClasses();\n yield* traverser.extractFunctions();\n yield* edgeComputer.computeCallEdges(traverser.getCalls());\n }\n finally {\n tree.delete();\n parser.delete();\n if (provider.deleteQueries) {\n provider.deleteQueries();\n }\n }\n}\n","import { TreeSitterNodeTypes } from \"../constants/tree-sitter-node-types.js\";\nexport var PruningLevel;\n(function (PruningLevel) {\n PruningLevel[PruningLevel[\"INTERNAL_LOGIC\"] = 0] = \"INTERNAL_LOGIC\";\n PruningLevel[PruningLevel[\"CONTRACT_CHANGED\"] = 1] = \"CONTRACT_CHANGED\";\n})(PruningLevel || (PruningLevel = {}));\nconst SEMANTIC_TYPES = new Set([\n TreeSitterNodeTypes.FUNCTION_DECLARATION,\n TreeSitterNodeTypes.METHOD_DEFINITION,\n TreeSitterNodeTypes.ARROW_FUNCTION,\n TreeSitterNodeTypes.CLASS_DECLARATION,\n TreeSitterNodeTypes.INTERFACE_DECLARATION,\n TreeSitterNodeTypes.TYPE_ALIAS_DECLARATION,\n TreeSitterNodeTypes.EXPORT_STATEMENT,\n TreeSitterNodeTypes.LEXICAL_DECLARATION,\n TreeSitterNodeTypes.VARIABLE_DECLARATION,\n]);\nexport class SemanticDiffDetector {\n parser;\n lang;\n constructor(parser, lang) {\n this.parser = parser;\n this.lang = lang;\n this.parser.setLanguage(this.lang);\n }\n analyze(oldSource, newSource, changedLineRanges) {\n const oldTree = this.parser.parse(oldSource);\n const newTree = this.parser.parse(newSource);\n if (!oldTree || !newTree) {\n if (oldTree)\n oldTree.delete();\n if (newTree)\n newTree.delete();\n return [];\n }\n const results = [];\n try {\n const oldNodeIndex = this.buildNodeIndex(oldTree.rootNode);\n const processedNodes = new Set();\n for (const range of changedLineRanges) {\n results.push(...this.processChangedRange(range, newTree.rootNode, oldNodeIndex, processedNodes));\n }\n }\n finally {\n if (oldTree)\n oldTree.delete();\n if (newTree)\n newTree.delete();\n }\n return results;\n }\n /**\n * Resolves a single changed line range against the new tree's smallest containing\n * semantic boundary and builds the corresponding {@link ModifiedNode}(s), deduped against\n * already-processed boundaries. Normally yields at most one result. Falls back to\n * {@link resolveSpanningBoundaries} (zero or more results) when the range straddles multiple\n * top-level siblings with no common semantic ancestor -- e.g. a new function's own leading\n * blank line/doc comment plus its declaration, which `getSmallestContainingNode` can only\n * match by bubbling all the way up to the un-typed tree root, where `findSemanticBoundary`\n * dead-ends. Without this fallback such a range is silently dropped: `contractChanged` would\n * come back `false` for essentially any documented new symbol (2026-07-29 finding).\n */\n processChangedRange(range, newRoot, oldNodeIndex, processedNodes) {\n const smallestNode = this.getSmallestContainingNode(newRoot, range);\n if (!smallestNode)\n return [];\n const semanticBoundary = this.findSemanticBoundary(smallestNode);\n if (!semanticBoundary) {\n return this.resolveSpanningBoundaries(smallestNode, range, oldNodeIndex, processedNodes);\n }\n const built = this.buildModifiedNode(semanticBoundary, oldNodeIndex, processedNodes);\n return built ? [built] : [];\n }\n /**\n * The straddling-siblings fallback (see {@link processChangedRange}'s doc comment): re-matches\n * each direct child of `deadEndNode` that overlaps `range` at all (not requiring full\n * containment, unlike the primary algorithm) against a sub-range clamped to that child's own\n * span, so `getSmallestContainingNode` can resolve a real semantic boundary from within just\n * that child instead of the whole un-typed span. Deliberately does not touch the primary\n * full-containment algorithm at all: a range that stays within one semantic container (e.g. two\n * statements inside the same function body) already bubbles up to that container correctly\n * today, and must keep doing so -- only a range that reaches a dead end (no semantic ancestor\n * anywhere above `deadEndNode`, in practice the un-typed `program` root) should ever reach here.\n */\n resolveSpanningBoundaries(deadEndNode, range, oldNodeIndex, processedNodes) {\n const results = [];\n for (const child of deadEndNode.children) {\n if (!child)\n continue;\n if (child.endPosition.row < range.startRow ||\n child.startPosition.row > range.endRow) {\n continue; // no overlap with the changed range at all\n }\n const clampedRange = {\n startRow: Math.max(range.startRow, child.startPosition.row),\n endRow: Math.min(range.endRow, child.endPosition.row),\n };\n const smallest = this.getSmallestContainingNode(child, clampedRange);\n if (!smallest)\n continue;\n const semanticBoundary = this.findSemanticBoundary(smallest);\n if (!semanticBoundary)\n continue; // e.g. a bare comment sibling -- nothing to report\n const built = this.buildModifiedNode(semanticBoundary, oldNodeIndex, processedNodes);\n if (built)\n results.push(built);\n }\n return results;\n }\n /** Dedupes `semanticBoundary` against `processedNodes` and builds its {@link ModifiedNode},\n * comparing old vs. new signatures via `resolvePruningLevel` -- shared by both the primary\n * match and the {@link resolveSpanningBoundaries} fallback so a boundary is never reported\n * twice regardless of which path found it. */\n buildModifiedNode(semanticBoundary, oldNodeIndex, processedNodes) {\n if (processedNodes.has(semanticBoundary.id)) {\n return null; // Already processed this boundary for another line range\n }\n processedNodes.add(semanticBoundary.id);\n const newName = this.getNodeName(semanticBoundary);\n const oldNode = newName\n ? oldNodeIndex.get(`${semanticBoundary.type}::${newName}`)\n : undefined;\n const pruningLevel = this.resolvePruningLevel(oldNode, semanticBoundary);\n return {\n nodeId: newName || semanticBoundary.id.toString(),\n nodeType: semanticBoundary.type,\n pruningLevel,\n newRange: {\n startRow: semanticBoundary.startPosition.row,\n endRow: semanticBoundary.endPosition.row,\n },\n };\n }\n /** Compares old vs. new signatures to decide whether a change is purely internal. */\n resolvePruningLevel(oldNode, semanticBoundary) {\n if (!oldNode)\n return PruningLevel.CONTRACT_CHANGED;\n const oldSig = this.getSignature(oldNode);\n const newSig = this.getSignature(semanticBoundary);\n return oldSig === newSig\n ? PruningLevel.INTERNAL_LOGIC\n : PruningLevel.CONTRACT_CHANGED;\n }\n /**\n * Indexes old-tree nodes by `${type}::${name}` so matching a changed\n * boundary against the old tree is an O(1) lookup instead of a full\n * tree search per changed range. Only semantic-boundary types are\n * indexed since that's the only kind of node ever looked up.\n */\n buildNodeIndex(root) {\n const index = new Map();\n const visit = (n) => {\n if (SEMANTIC_TYPES.has(n.type)) {\n const name = this.getNodeName(n);\n const key = name ? `${n.type}::${name}` : null;\n if (key && !index.has(key)) {\n index.set(key, n);\n }\n }\n for (const child of n.children) {\n if (child)\n visit(child);\n }\n };\n visit(root);\n return index;\n }\n getSmallestContainingNode(node, range) {\n if (node.startPosition.row > range.endRow ||\n node.endPosition.row < range.startRow) {\n return null;\n }\n if (node.startPosition.row <= range.startRow &&\n node.endPosition.row >= range.endRow) {\n for (const child of node.children) {\n if (!child)\n continue;\n const childResult = this.getSmallestContainingNode(child, range);\n if (childResult)\n return childResult;\n }\n return node;\n }\n return null;\n }\n findSemanticBoundary(node) {\n let current = node;\n while (current) {\n if (SEMANTIC_TYPES.has(current.type)) {\n return current;\n }\n current = current.parent;\n }\n return null;\n }\n getNodeName(node) {\n const nameNode = node.childForFieldName(\"name\");\n if (nameNode)\n return nameNode.text;\n // Handle variable declarations: variable_declaration -> variable_declarator -> name\n if (node.type === TreeSitterNodeTypes.VARIABLE_DECLARATION ||\n node.type === TreeSitterNodeTypes.LEXICAL_DECLARATION) {\n const decl = node.children.find((c) => c.type === TreeSitterNodeTypes.VARIABLE_DECLARATOR);\n if (decl) {\n const declName = decl.childForFieldName(\"name\");\n if (declName)\n return declName.text;\n }\n }\n return null;\n }\n getSignature(node) {\n const body = node.childForFieldName(\"body\") || node.childForFieldName(\"value\");\n // For variable_declarator, body could be the arrow function body or object value\n // In tree-sitter TS: variable_declarator has 'name' and 'value'\n // If it's a function declaration, it has 'body'\n // To be safe and generic, we just exclude the child that represents the block or the value\n // if the value is an arrow function, its body is 'body'.\n // If the node is a variable_declaration, we want the signature to ignore the arrow function body.\n if (node.type === TreeSitterNodeTypes.VARIABLE_DECLARATION ||\n node.type === TreeSitterNodeTypes.LEXICAL_DECLARATION) {\n const decl = node.children.find((c) => c.type === TreeSitterNodeTypes.VARIABLE_DECLARATOR);\n if (decl) {\n const value = decl.childForFieldName(\"value\");\n if (value && value.type === TreeSitterNodeTypes.ARROW_FUNCTION) {\n const arrowBody = value.childForFieldName(\"body\");\n if (arrowBody) {\n // Collect text of variable_declaration but omit the arrow function's body\n return this.getTextExcludingNode(node, arrowBody);\n }\n }\n }\n }\n if (body) {\n return this.getTextExcludingNode(node, body);\n }\n return node.text;\n }\n getTextExcludingNode(root, exclude) {\n const tokens = [];\n const traverse = (n) => {\n if (n.id === exclude.id)\n return;\n // If node has no children or it's just a text token, collect its text\n if (n.childCount === 0) {\n tokens.push(n.text);\n }\n else {\n for (const child of n.children) {\n if (!child)\n continue;\n traverse(child);\n }\n }\n };\n traverse(root);\n return tokens.join(\" \").trim().replace(/\\s+/g, \" \"); // Normalize whitespace\n }\n}\n","import * as path from \"path\";\nimport * as fs from \"fs\";\nimport { createRequire } from \"module\";\nimport { fileURLToPath } from \"url\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\nconst require = createRequire(import.meta.url);\n\n/**\n * Resolves the on-disk path of a tree-sitter grammar's .wasm file, trying\n * package.json resolution first (works whether tree-sitter-wasms is hoisted\n * or nested under .pnpm) and falling back to a handful of known workspace\n * layouts otherwise.\n *\n * Extracted out of `ast-worker.ts` (which re-exports it for backward compatibility) so it can be\n * imported from the main thread — `ast-worker.ts` itself registers `worker_threads`-only side\n * effects (`parentPort?.on(...)`, process-level `uncaughtException`/`unhandledRejection`\n * handlers) at module scope that must never run outside an actual Worker.\n * `SemanticDiffAnalyzerService` (Tier A's classification pass, phase1-decision-integration.md\n * §6b) is the reason this needed to become importable from the main thread.\n */\nexport function resolveWasmPath(wasmFile: string): {\n wasmPath: string;\n attemptedPaths: string[];\n} {\n const docuviaRoot = path.resolve(__dirname, \"../../../../\");\n const attemptedPaths: string[] = [];\n\n try {\n const packagePath = require.resolve(`tree-sitter-wasms/package.json`, {\n paths: [__dirname, docuviaRoot],\n });\n const wasmPath = path.join(path.dirname(packagePath), \"out\", wasmFile);\n attemptedPaths.push(wasmPath);\n if (fs.existsSync(wasmPath)) return { wasmPath, attemptedPaths };\n } catch {\n // fall through to explicit path candidates below\n }\n\n const candidates = [\n path.resolve(docuviaRoot, `node_modules/tree-sitter-wasms/out/${wasmFile}`),\n path.resolve(\n __dirname,\n `../../../node_modules/tree-sitter-wasms/out/${wasmFile}`,\n ),\n path.resolve(\n docuviaRoot,\n `node_modules/.pnpm/tree-sitter-wasms@0.1.13/node_modules/tree-sitter-wasms/out/${wasmFile}`,\n ),\n path.resolve(docuviaRoot, `artifacts/vscode-client/out/wasm/${wasmFile}`),\n ];\n\n for (const candidate of candidates) {\n attemptedPaths.push(candidate);\n if (fs.existsSync(candidate))\n return { wasmPath: candidate, attemptedPaths };\n }\n\n return { wasmPath: candidates[candidates.length - 1], attemptedPaths };\n}\n"],"mappings":"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","names":["ANONYMOUS_SYMBOL_NAME","AST_WORKER_CRASH_ERROR_NAME","AstNodeTypes","AstMessages","ANONYMOUS_SYMBOL_NAME","filePath","taskId","ms","code","ext","language","triedPaths","nodeCount","errMessage","AstEventType","TreeSitterNodeTypes","WILDCARD_IMPORT_MARKER","RUBY_IMPORT_METHOD_NAMES","SELF_REFERENCE_KEYWORD","CONSTRUCTOR_CALL_METHOD_NAME","parseImportDescriptors","importStatements","descriptors","stmt","stmtType","handler","SINGLE_TYPE_IMPORT_HANDLERS","isPhpImportStatement","collectPhpImportDescriptors","collectFallbackImportDescriptors","TreeSitterNodeTypes","collectTsJsImportDescriptors","collectPythonFromStatementDescriptors","collectRustUseDescriptors","collectGoImportDescriptors","collectCIncludeDescriptors","collectCppUsingDeclarationDescriptors","collectRubyRequireDescriptors","collectCSharpUsingDescriptors","sourceNode","srcText","namespaceImport","nsId","namedImports","specifiers","spec","nameNode","aliasNode","importedName","localName","defaultId","moduleName","sourceStr","collectPythonFromImportDescriptors","collectRustUseAsClauseDescriptor","arg","pathNode","collectRustScopedUseListAsClauseDescriptor","child","prefix","p","a","collectRustScopedUseListScopedIdentifierDescriptor","lastPart","collectRustScopedUseListChildDescriptor","collectRustScopedUseListDescriptors","listNode","collectRustScopedOrPlainIdentifierDescriptor","ids","lastId","collectRustUseListDescriptors","collectGoImportSpecDescriptor","pkgPath","segments","pkgName","specList","specs","includePath","children","methodNode","methodName","args","strNode","libName","shortName","collectPhpNamespaceUseDescriptor","fullName","parts","collectPhpIncludeOrRequireDescriptor","argNode","path","fallbackSrcText","identifiers","idNode","d","collectPythonFromImportDescriptors","stmt","sourceStr","descriptors","child","TreeSitterNodeTypes","nameNode","aliasNode","ids","lastId","classifyTsJsCall","callNode","fnNode","propNode","objNode","classifyPythonCall","attrNode","classifyJavaMethodInvocation","classifyJavaConstructorInvocation","SELF_REFERENCE_KEYWORD","classifyRubyCommandCall","methodNode","classifyPhpCall","callType","methodName","classNode","classifyCSharpInvocation","exprNode","classifyCSharpObjectCreation","typeNode","CONSTRUCTOR_CALL_METHOD_NAME","CALL_CLASSIFIERS","TreeSitterNodeTypes","classifyTsJsCall","classifyPythonCall","classifyJavaMethodInvocation","classifyJavaConstructorInvocation","classifyRubyCommandCall","classifyPhpCall","classifyCSharpInvocation","classifyCSharpObjectCreation","DATE_TIME_RE","TomlDate","_TomlDate","#hasDate","#hasTime","#offset","date","hasDate","hasTime","offset","match","iso","jsDate","getLineColFromPtr","string","ptr","lines","makeCodeBlock","line","column","codeblock","numberLen","i","TomlError","message","options","INT_REGEX","FLOAT_REGEX","LEADING_ZERO","parseString","str","ptr","c","first","isLiteral","isMultiline","parsed","sliceStart","state","i","TomlError","value","len","j","hex","digit","parseValue","toml","integersAsBigInt","isInt","numeric","date","TomlDate","indexOfNewline","str","start","end","idx","skipComment","ptr","i","c","TomlError","skipVoid","banNewLines","banComments","skipUntil","sep","sliceAndTrimEndOf","str","startPtr","endPtr","value","commentIdx","skipComment","extractValue","ptr","end","depth","integersAsBigInt","TomlError","c","parseArray","parseInlineTable","skipVoid","parsed","parseString","skipUntil","slice","parseValue","KEY_PART_RE","parseKey","str","ptr","end","dot","parsed","endPtr","TomlError","c","part","eos","parseString","strEnd","newLine","indexOfNewline","skipVoid","parseInlineTable","depth","integersAsBigInt","res","seen","skipComment","k","t","hasOwn","key","keyEndPtr","i","value","valueEndPtr","extractValue","parseArray","e","peekTable","key","table","meta","type","t","m","k","hasOwn","state","i","l","parse","toml","maxDepth","integersAsBigInt","res","tbl","ptr","skipVoid","isTableArray","parseKey","TomlError","p","v","extractValue","Query","QueryCaptureName","DefaultProvider","importStatements","callNode","config","language","q","pattern","Query","rootNode","captureNames","query","captures","nodes","c","AstEventType","fallbackTypes","nodeType","DEFAULT_LANGUAGES_CONFIG_FILENAME","isStringArray","val","v","REQUIRED_ARRAY_FIELDS","OPTIONAL_ARRAY_FIELDS","isValidLanguageEntry","entry","lang","field","validateLanguageRegistryData","parsed","obj","LanguageRegistry","_LanguageRegistry","config","_","langConfig","provider","DefaultProvider","ext","tomlContent","baseConfig","base","parse","mergedLanguages","projectRoot","_process","fs","path","targetPath","content","UTF8_ENCODING","extensions","QueryCaptureName","LanguageNodeTypes","TYPESCRIPT_WASM_FILE","typescriptConfig","TYPESCRIPT_EXTENSIONS","LanguageNodeTypes","QueryCaptureName","JAVASCRIPT_WASM_FILE","javascriptConfig","JAVASCRIPT_EXTENSIONS","LanguageNodeTypes","QueryCaptureName","PYTHON_WASM_FILE","pythonConfig","PYTHON_EXTENSIONS","LanguageNodeTypes","QueryCaptureName","RUST_WASM_FILE","rustConfig","RUST_EXTENSIONS","LanguageNodeTypes","QueryCaptureName","GO_WASM_FILE","goConfig","GO_EXTENSIONS","LanguageNodeTypes","QueryCaptureName","JAVA_WASM_FILE","javaConfig","JAVA_EXTENSIONS","LanguageNodeTypes","QueryCaptureName","C_WASM_FILE","cConfig","C_EXTENSIONS","LanguageNodeTypes","QueryCaptureName","CPP_WASM_FILE","cppConfig","CPP_EXTENSIONS","LanguageNodeTypes","QueryCaptureName","RUBY_WASM_FILE","rubyConfig","RUBY_EXTENSIONS","LanguageNodeTypes","QueryCaptureName","PHP_WASM_FILE","phpConfig","PHP_EXTENSIONS","LanguageNodeTypes","QueryCaptureName","CSHARP_WASM_FILE","csharpConfig","CSHARP_EXTENSIONS","LanguageNodeTypes","QueryCaptureName","DEFAULT_REGISTRY","SUPPORTED_LANGUAGES","typescriptConfig","javascriptConfig","pythonConfig","rustConfig","goConfig","javaConfig","cConfig","cppConfig","rubyConfig","phpConfig","csharpConfig","loadDefaultRegistry","projectRoot","LanguageRegistry","Parser","Language","PruningLevel","SEMANTIC_TYPES","TreeSitterNodeTypes","SemanticDiffDetector","parser","lang","oldSource","newSource","changedLineRanges","oldTree","newTree","results","oldNodeIndex","processedNodes","range","newRoot","smallestNode","semanticBoundary","built","deadEndNode","child","clampedRange","smallest","newName","oldNode","pruningLevel","oldSig","newSig","root","index","visit","n","name","key","node","childResult","current","nameNode","decl","c","declName","body","value","arrowBody","exclude","tokens","traverse","path","fs","createRequire","fileURLToPath","__filename","__dirname","require","resolveWasmPath","wasmFile","docuviaRoot","attemptedPaths","packagePath","wasmPath","candidates","candidate"]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
var g=Object.create;var f=Object.defineProperty;var h=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var j=Object.getPrototypeOf,k=Object.prototype.hasOwnProperty;var m=(a=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(a,{get:(b,c)=>(typeof require<"u"?require:b)[c]}):a)(function(a){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+a+'" is not supported')});var n=(a,b)=>()=>(b||a((b={exports:{}}).exports,b),b.exports);var l=(a,b,c,e)=>{if(b&&typeof b=="object"||typeof b=="function")for(let d of i(b))!k.call(a,d)&&d!==c&&f(a,d,{get:()=>b[d],enumerable:!(e=h(b,d))||e.enumerable});return a};var o=(a,b,c)=>(c=a!=null?g(j(a)):{},l(b||!a||!a.__esModule?f(c,"default",{value:a,enumerable:!0}):c,a));export{m as a,n as b,o as c};
|
|
3
|
+
//# sourceMappingURL=chunk-KVOCOCYJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{$ as c}from"./chunk-QD6NQB77.js";import*as _ from"fs/promises";import*as g from"path";import{select as f,confirm as P,input as b,checkbox as H}from"@inquirer/prompts";import Y from"picocolors";import F from"ora";var r={TOP_LEFT:"\u250C",TOP_RIGHT:"\u2510",BOTTOM_LEFT:"\u2514",BOTTOM_RIGHT:"\u2518",HORIZONTAL:"\u2500",VERTICAL:"\u2502",T_DOWN:"\u252C",T_UP:"\u2534",T_RIGHT:"\u251C",T_LEFT:"\u2524",CROSS:"\u253C"},w={PASS:"\u2713",FAIL:"\u2717"},N="\u25C6";var E={SPACE:" ",EMPTY:""};function u(e){return e.replace(/\s+/g,E.SPACE).trim()}function m(e,n){if(e.length<=n)return[e];let t=e.split(E.SPACE),i=[],o=E.EMPTY;for(let s of t){let A=o?`${o}${E.SPACE}${s}`:s;A.length>n&&o?(i.push(o),o=s):o=A}return o&&i.push(o),i}function h(e,n){return e+E.SPACE.repeat(Math.max(0,n-e.length))}function R(e,n,t,i){return n+e.map(o=>r.HORIZONTAL.repeat(o+2)).join(t)+i}function L(e,n){let t=e.map((i,o)=>h(i??E.EMPTY,n[o]));return`${r.VERTICAL} ${t.join(` ${r.VERTICAL} `)} ${r.VERTICAL}`}function U(e,n){return e.map((t,i)=>{let o=Math.max(t.header.length,...n.map(s=>(s[i]??E.EMPTY).length));return t.maxWidth?Math.min(o,t.maxWidth):o})}function C(e,n){let t=e.map(a=>u(a.header)),i=n.map(a=>a.map(d=>u(d??E.EMPTY))),o=U(e.map((a,d)=>({...a,header:t[d]})),i),s=i.map(a=>e.map((d,T)=>m(a[T]??E.EMPTY,o[T]))),A=[R(o,r.TOP_LEFT,r.T_DOWN,r.TOP_RIGHT),L(t,o),R(o,r.T_RIGHT,r.CROSS,r.T_LEFT)];for(let a of s){let d=Math.max(...a.map(T=>T.length));for(let T=0;T<d;T++)A.push(L(a.map(p=>p[T]??E.EMPTY),o))}return A.push(R(o,r.BOTTOM_LEFT,r.T_UP,r.BOTTOM_RIGHT)),A}function D(e){let n=r.HORIZONTAL.repeat(e.length+2);return[`${r.TOP_LEFT}${n}${r.TOP_RIGHT}`,`${r.VERTICAL} ${e} ${r.VERTICAL}`,`${r.BOTTOM_LEFT}${n}${r.BOTTOM_RIGHT}`]}var M="cyan",O={INFO:"\u2139",SUCCESS:"\u2714",WARN:"\u26A0",ERROR:"\u2716"},S=Y.createColors(!!process.stdout.isTTY&&!process.env.NO_COLOR),I={spinner:e=>F({text:e,color:M}),info:e=>console.log(S.cyan(`${O.INFO} ${e}`)),success:e=>console.log(S.green(`${O.SUCCESS} ${e}`)),warn:e=>console.warn(S.yellow(`${O.WARN} ${e}`)),error:e=>console.error(S.red(`${O.ERROR} ${e}`)),log:e=>console.log(e??""),header:e=>{console.log();for(let n of D(e))console.log(S.cyan(n));console.log()},section:e=>{console.log(),console.log(S.bold(S.cyan(`${N} ${e}`)))},table:(e,n)=>{for(let t of C(e,n))console.log(t)},askConfirm:async(e,n=!0)=>await P({message:e,default:n}),askSelect:async(e,n)=>await f({message:e,choices:n}),askCheckbox:async(e,n)=>await H({message:e,choices:n}),askInput:async(e,n)=>await b({message:e,default:n})};var l={CLI_HEADER:"Docuvia Knowledge Graph",CLI_PROMPT_ACTION:"What would you like to do?",CLI_UNKNOWN_COMMAND:"Unknown command: ",CLI_FATAL_ERROR:"Fatal error: ",CLI_INTERACTIVE_NO_TTY:"--interactive requires a real terminal and is disabled under CI -- cannot launch the wizard menu.",CLI_INTERACTIVE_UNAVAILABLE:"--interactive was requested, but this session has no usable TTY (or is running under CI) -- continuing non-interactively.",INIT_HEADER:"Initialize Docuvia",INIT_CONFIRM:"Initialize Docuvia in this workspace?",INIT_ABORTED:"Initialization aborted.",INIT_START:"Starting initialization...",INIT_FAILED:"Initialization failed: ",INIT_AGENT_HOOKS:"Initializing AI Agent integrations for Docuvia...",INIT_LOCK_WAITING:"Another `docuvia init` is already running in this workspace; waiting for it to finish...",INIT_HOOKS_CONFIG_MCP:"Configuring MCP Servers...",INIT_HOOKS_REGISTERED_MCP:"Registered MCP server in: ",INIT_HOOKS_FAIL_CURSOR_MCP:"Could not configure Cursor MCP: ",INIT_HOOKS_SUCCESS:"Docuvia Agent Integrations successfully installed!",INIT_HOOKS_SUPPORTED:"Supported platforms: Claude Code, Cursor, GitHub Copilot, Codex, Continue, Hermes Agent.",INIT_HOOKS_FAIL:"Failed to initialize agent integrations: ",INIT_HOOKS_SELECT:"Which AI Agent integrations would you like to install?",INIT_HOOKS_NONE_SELECTED:"No platforms selected. Skipping agent integrations.",INIT_CLAUDE_MCP_MANUAL_SNIPPET:"To use Docuvia from Claude Desktop, add this to your global MCP config",FS_APPENDED:"Appended instructions to: ",FS_ALREADY_EXISTS:"Instructions already exist in: ",FS_CREATED:"Created: ",FS_READ_ERROR:"Could not read ",FS_READ_ERROR_UNKNOWN_CODE:"unknown error",FS_BLOCK_REMOVED_PREFIX:"Removed block from ",FS_BLOCK_REMOVED_SUFFIX:" (backup created)",FS_UNEXPECTED_SHAPE:(e,n)=>`Unexpected shape for "${e}" in ${n} (expected an array); leaving it untouched`,CLEAN_HEADER:"Clean Docuvia Database",CLEAN_CONFIRM:"This will permanently delete the local Docuvia database. Continue?",CLEAN_ABORTED:"Clean aborted.",CLEAN_START:"Cleaning database...",CLEAN_SUCCESS:"Clean complete. ",CLEAN_FAIL:"Clean failed: ",STATUS_START:"Getting status...",STATUS_SUCCESS:"Status retrieved.",STATUS_FAIL:"Failed to get status: ",STATUS_HEADER:"Docuvia Status",STATUS_COL_METRIC:"Metric",STATUS_COL_VALUE:"Value",STATUS_METRIC_PROJECTS:"Projects",STATUS_METRIC_L2_NODES:"L2 Nodes",STATUS_METRIC_L3_DECISIONS:"L3 Decisions",STATUS_METRIC_TIER_B_COVERAGE:"Tier B Coverage",STATUS_METRIC_TIER_C_QUEUE:"Tier C Queue",PUBLISH_HEADER:"Publish to Docuvia",PUBLISH_MISSING_PROJECT_ID:"Project ID is required when not running interactively.",PUBLISH_NO_PROJECT_ID_PROVIDED:"No project ID provided.",PUBLISH_PROMPT_PROJECT_ID:"Enter the project ID to publish to: ",PUBLISH_PROJECT_ID_REQUIRED:"Project ID is required.",PUBLISH_MISSING_ENV:"DOCUVIA_API_URL and/or MCP_PAT are not set.",PUBLISH_SKIP:"Skipping publish.",PUBLISH_START:"Starting publish for project ",PUBLISH_SUCCESS:"Publish complete.",PUBLISH_FAIL:"Publish failed: ",ANALYZE_HEADER:"Analyze Project",ANALYZE_START:"Analyzing project...",ANALYZE_SUCCESS:"Analysis complete.",ANALYZE_FAIL:"Analysis failed: ",ANALYZE_PROJECT_TYPE:"Project Type: ",ANALYZE_SUGGESTED_TAGS:"Suggested Tags: ",ANALYZE_NONE:"none",ANALYZE_AUTO_FULL_SUCCESS:"Full ingestion complete.",ANALYZE_AUTO_FULL_SUMMARY:(e,n,t)=>`Parsed ${e}/${n} file(s) (${t} failed).`,ANALYZE_AUTO_DELTA_SUCCESS:"Delta ingestion complete.",ANALYZE_AUTO_DELTA_SUMMARY:(e,n,t)=>`Re-parsed ${e} file(s), dropped ${n} deleted file(s)`+(t>0?`, queued ${t} file(s) for Tier B.`:"."),ANALYZE_AUTO_NOOP_SUCCESS:"Already up to date.",ANALYZE_AUTO_NOOP_DIRTY_WORKTREE_SUCCESS:"Already up to date with HEAD -- uncommitted changes in the working tree were not analyzed (commit them, then re-run).",ANALYZE_LLM_MISSING_ENV:"AI_DOCUVIA_INTEGRATIONS_OPENAI_BASE_URL and a model (AI_DOCUVIA_MODEL or AI_DOCUVIA_FAST_MODEL) must be set to analyze a specific path.",ANALYZE_FOCUSED_HEADER:"Analyze Path",ANALYZE_FOCUSED_START:"Extracting decisions from ",ANALYZE_FOCUSED_SUCCESS:"Decision extraction complete.",ANALYZE_FOCUSED_FAIL:"Decision extraction failed: ",ANALYZE_FOCUSED_NONE:"No decision-worthy content found.",ANALYZE_FOCUSED_PERSISTED:(e,n)=>`${e} persisted, ${n} deduplicated`,ANALYZE_DECISION_LINE:(e,n,t)=>`${n} (${e}, confidence: ${t})`,ANALYZE_DECISION_CONTENT_PREFIX:" ",ANALYZE_TIER_B_HEADER:"Analyze -- Tier B (LSP escalation)",ANALYZE_TIER_B_START:"Running the Tier B LSP escalation batch...",ANALYZE_TIER_B_SUCCESS:"Tier B batch complete.",ANALYZE_TIER_B_FAIL:"Tier B batch failed: ",ANALYZE_TIER_B_SUMMARY:(e,n,t,i,o)=>`${e} file(s) processed, ${n} corrected edge(s) applied`+(t>0?`, ${t} file(s) left queued for the next batch`:"")+(i>0?`, ${i} file(s) permanently failed (not re-queued)`:"")+(o?", zero-progress watchdog tripped: no next-batch re-queue remains":"")+".",ANALYZE_TIER_B_DEGRADED:e=>`LSP unavailable -- AST-level edges left untouched (${e})`,ANALYZE_TIER_B_GATE_NOT_READY:e=>`LSP prerequisites are not ready: ${e}`,ANALYZE_TIER_B_GATE_PROMPT:"Continue with AST-only precision (skip the LSP-corrected cross-file edges this batch)?",ANALYZE_TIER_B_GATE_DECLINED:"Aborted -- install typescript-language-server as a project devDependency (or pass --fallback-ast) and try again.",ANALYZE_TIER_B_GATE_FAILED:e=>`LSP prerequisites are not ready: ${e}
|
|
3
|
+
Build/compile the target project (Docuvia's Tier B relies on a working language server), then run 'docuvia doctor' to confirm. Pass --fallback-ast to proceed with AST-only precision instead.`,ANALYZE_TIER_C_SUMMARY:(e,n,t)=>`Tier C: ${e} candidate(s) processed, ${n} decision(s) persisted`+(t>0?`, ${t} left queued for the next run.`:"."),ANALYZE_TIER_C_SKIPPED:e=>`Tier C: drain skipped this run (${e}).`,ANALYZE_AGENT_AUTHORED_MISSING_TARGET:"--agent-authored requires a target path, e.g. docuvia analyze <path> --agent-authored",ANALYZE_AGENT_AUTHORED_MISSING_PAYLOAD:"No decisions payload found -- pipe JSON via stdin or pass --decisions-file=<path>",ANALYZE_AGENT_AUTHORED_INVALID_JSON:e=>`--agent-authored payload is not valid JSON: ${e}`,ANALYZE_AGENT_AUTHORED_INVALID_SHAPE:e=>`--agent-authored payload does not match the expected shape: ${e}`,ANALYZE_LSP_ARGS_INVALID_JSON:e=>`DOCUVIA_LSP_ARGS starts with '[' but is not valid JSON -- use a JSON array of strings, or plain space-separated args: ${e}`,ANALYZE_LSP_ARGS_INVALID_SHAPE:"DOCUVIA_LSP_ARGS JSON array must contain only strings",ANALYZE_STAGE_HEADER:"Stage Decisions",ANALYZE_STAGE_START:"Staging decisions from ",ANALYZE_STAGE_SUCCESS:"Staged.",ANALYZE_STAGE_SUMMARY:e=>`${e} decision(s) staged -- flushed automatically on the next commit that touches this file.`,ANALYZE_FLUSH_STAGED_L3_HEADER:"Flush Staged L3 Decisions",ANALYZE_FLUSH_STAGED_L3_START:"Flushing staged L3 decisions...",ANALYZE_FLUSH_STAGED_L3_SUCCESS:"Flush complete.",ANALYZE_FLUSH_STAGED_L3_DISABLED_SUCCESS:"commit-l3-write is disabled -- nothing flushed.",ANALYZE_FLUSH_STAGED_L3_SUMMARY:(e,n,t)=>`${e} flushed, ${n} deduplicated`+(t>0?`, ${t} left staged for a future commit.`:"."),ANALYZE_FLUSH_STAGED_L3_NO_GRAPH_ADVICE:"Some staged decisions could not be attached: the knowledge graph is empty (or hasn't ingested this file yet). Run `docuvia init` first -- decisions need a graph to attach to. They stay staged and retry on the next flush.",REVIEW_HEADER:"Review Changes",REVIEW_START:"Analyzing changes...",REVIEW_SUCCESS:"Analysis complete.",REVIEW_AGAINST:" against ",REVIEW_FAIL:"Review failed: ",REVIEW_FILES_CHANGED:"Files changed: ",REVIEW_RISK_PREFIX:"Risk level: ",REVIEW_WHY_HEADER:"Why (L3 decisions/context)",REVIEW_WHY_PREFIX:"Decision: ",IMPACT_HEADER:"Impact Analysis",IMPACT_MISSING_TARGET:"A target symbol/module name is required.",IMPACT_START:"Resolving blast radius for ",IMPACT_SUCCESS:"Resolved blast radius for ",IMPACT_FAIL:"Impact analysis failed: ",IMPACT_NOT_FOUND:"No matching node found for ",IMPACT_BLAST_RADIUS_HEADER:"Blast Radius",IMPACT_NO_DEPENDENTS:"No dependents found.",IMPACT_RISK_PREFIX:"Risk level: ",IMPACT_WHY_PREFIX:"Decision: ",IMPACT_COL_NAME:"Name",IMPACT_COL_TYPE:"Type",IMPACT_ENTRY_WHY_LABEL:e=>`${e}:`,IMPACT_TIER_B_INCOMPLETE:(e,n)=>`${e} of ${n} tracked file(s) have never been Tier B-processed -- this may be incomplete, not confirmed zero. Run \`docuvia analyze --escalate-to-lsp --full\` to resync.`,UNINSTALL_HEADER:"Uninstall Docuvia2 Integrations",UNINSTALL_START:"Uninstalling Docuvia2 integrations...",UNINSTALL_SUCCESS_CLEAN:"Cleaned Docuvia: ",UNINSTALL_FAIL_CLEAN:"Failed to clean Docuvia directory: ",UNINSTALL_SUCCESS:"Docuvia2 uninstalled successfully. Backup files (.bak) were created for modified Markdown files.",UNINSTALL_FAIL:"Uninstall failed: ",UNINSTALL_HOOKS_SELECT:"Which AI Agent integrations would you like to uninstall?",UNINSTALL_KEEP_DB:"Skipping local database cleanup (--keep-db).",UNINSTALL_INVALID_WORKSPACE_ROOT:"Workspace root must not be empty.",UNINSTALL_PLATFORM_FAIL:"Failed to uninstall hooks for ",UNINSTALL_PLATFORM_FAIL_MID:": ",UNINSTALL_PARTIAL:"Uninstall completed with failures: ",UNINSTALL_DB_CLEANUP_FAILURE_NAME:"local database cleanup",UNINSTALL_HOOKS_FAIL_LOG:"uninstallHooks failed for platform ",UNINSTALL_DB_CLEANUP_FAIL_LOG:"uninstall's database cleanup failed",UNINSTALL_FAIL_LOG:"uninstall failed",UNINSTALL_REMOVED_FILE_PREFIX:"Removed ",UNINSTALL_REMOVED_MCP_SERVER_PREFIX:"Removed MCP server from ",UNINSTALL_REMOVED_HOOK_FROM_SETTINGS_PREFIX:"Removed the Docuvia hook entry from ",UNINSTALL_CLAUDE_MCP_MANUAL_REMINDER:"To finish uninstalling, manually remove the Docuvia MCP server entry from your global MCP config",UNINSTALL_GIT_HOOKS_SUCCESS:(e,n)=>`Removed git hooks (post-commit: ${e?"removed":"not present"}, pre-push: ${n?"removed":"not present"}).`,UNINSTALL_GIT_HOOKS_FAIL:"Failed to remove git hooks: ",UNINSTALL_GIT_HOOKS_FAIL_LOG:"uninstall's git hooks removal failed",UNINSTALL_GIT_HOOKS_FAILURE_NAME:"git hooks removal",UNINSTALL_KNOWLEDGE_BRANCH_DELETED:"Deleted the hidden docuvia-knowledge git branch.",UNINSTALL_DOCUVIA_DIR_REMOVED:"Removed the .docuvia/ directory.",UNINSTALL_DOCUVIA_DIR_FAIL:"Failed to remove the .docuvia/ directory: ",UNINSTALL_DOCUVIA_DIR_FAIL_LOG:"uninstall's .docuvia/ directory removal failed",UNINSTALL_DOCUVIA_DIR_FAILURE_NAME:".docuvia/ directory removal",DOCTOR_HEADER:"Docuvia Doctor Diagnostics",DOCTOR_START:"Running diagnostics...",DOCTOR_FAIL:"Doctor failed: ",DOCTOR_SUMMARY_PASSED:(e,n)=>`Summary: ${e}/${n} checks passed.`,DOCTOR_FIX_HINT:"Tip: run `docuvia doctor --fix` to attempt automatic repair.",DOCTOR_COL_CHECK:"Check",DOCTOR_COL_STATUS:"Status",DOCTOR_COL_MESSAGE:"Message",DOCTOR_COL_FIX:"Suggested Fix",DOCTOR_STATUS_PASS:"PASS",DOCTOR_STATUS_FAIL:"FAIL",DOCTOR_CATEGORY_DATABASE:"Database",DOCTOR_CATEGORY_GIT:"Git",DOCTOR_CATEGORY_GIT_HOOKS:"Git Hooks",DOCTOR_CATEGORY_LOGS:"Logs",DOCTOR_CATEGORY_TIER_B:"Tier B Batch",DOCTOR_CATEGORY_TIER_B_COVERAGE:"Tier B Coverage",DOCTOR_CATEGORY_LLM:"LLM Integration",DOCTOR_CATEGORY_LSP:"LSP Providers",DOCTOR_CATEGORY_AGENT_HOOKS:"AI Agent Hooks",DOCTOR_CATEGORY_AGENT_ADOPTION:"Docuvia-First Workflow",DOCTOR_CATEGORY_OTHER:"Other",QUERY_HEADER:"Query Knowledge Graph",QUERY_PROMPT_TARGET:"What would you like to query? ",QUERY_MISSING_TARGET:"A query target is required (pass it as an argument).",QUERY_MISSING_TARGET_NON_TTY:"A query target is required.",QUERY_START:"Querying local knowledge graph for ",QUERY_FOUND:"Query resolved for ",QUERY_FAIL:"Query failed: ",QUERY_CONTEXT_HEADER:"Query Results",QUERY_L2_PREFIX:"Module: ",QUERY_NO_L2:"No matching module found.",QUERY_L3_PREFIX:"Decision: ",QUERY_UNKNOWN_STATUS:"unknown",QUERY_INCOMING_HEADER:"Incoming (callers/dependents)",QUERY_OUTGOING_HEADER:"Outgoing (dependencies)",QUERY_COL_NAME:"Name",QUERY_COL_RELATION:"Relation",QUERY_INVALID_LIMIT:"Ignoring invalid --limit value (must be a positive integer): ",QUERY_TIER_B_INCOMING_UNPROCESSED:(e,n)=>`No callers found, but ${e} of ${n} tracked file(s) have never been Tier B-processed -- this may be incomplete, not confirmed zero. Run \`docuvia analyze --escalate-to-lsp --full\` to resync.`,QUERY_TIER_B_OUTGOING_UNPROCESSED:"No callees found, but this symbol's own file has never been Tier B-processed -- this may be incomplete, not confirmed zero. Run `docuvia analyze --escalate-to-lsp --full` to resync.",QUERY_MATCH_TYPE_EXACT:" (exact match)",QUERY_MATCH_TYPE_KEYWORD:" (keyword match -- verify with Grep/Glob if unsure)",QUERY_MATCH_TYPE_NEIGHBOR:" (neighbor match)",EXPORT_HEADER:"Export Topology",EXPORT_START:"Exporting topology...",EXPORT_SUCCESS:"Exported topology to ",EXPORT_FAIL:"Export failed: ",EXPORT_STATS_LINE:(e,n,t)=>`Nodes: ${e}, Links: ${n}, Groups: ${t}`,EXPORT_COLLAPSED_LINE:"Collapsed: yes (fewer nodes than the raw graph).",EXPORT_FOLDED_LINE:e=>`Folded links: ${e} more relationship(s) folded within files at this granularity; pass --collapse=symbol for the full symbol-level view.`,EXPORT_HTML_PATH_LINE:e=>`HTML viewer: ${e}`,SNAPSHOT_HEADER:"Snapshot Knowledge Graph",SNAPSHOT_START:"Packing knowledge graph snapshot...",SNAPSHOT_SUCCESS:"Snapshot packed onto the knowledge branch.",SNAPSHOT_FAIL:"Snapshot failed: ",SNAPSHOT_NODES_WRITTEN_LINE:e=>`Nodes written: ${e}`,SNAPSHOT_EDGES_WRITTEN_LINE:e=>`Edges written: ${e}`,SNAPSHOT_MARKDOWN_WRITTEN_LINE:e=>`Markdown files written: ${e}`,HYDRATE_HEADER:"Hydrate Local Database",HYDRATE_START:"Hydrating local database from the knowledge branch...",HYDRATE_SUCCESS:"Hydrated local database.",HYDRATE_NOTHING:'Nothing to hydrate from yet \u2014 run "docuvia init" first.',HYDRATE_FAIL:"Hydrate failed: ",HYDRATE_NODES_LOADED_LINE:e=>`Nodes loaded: ${e}`,HYDRATE_EDGES_LOADED_LINE:e=>`Edges loaded: ${e}`,HYDRATE_EDGES_DROPPED_LINE:e=>`Dangling edges dropped: ${e}`,HYDRATE_REFUSED:e=>`Refused to hydrate: ${e==="pending-local-write"?"a knowledge-branch write from this workspace hasn't been confirmed yet":"this would replace local.db's graph with a drastically smaller one"}. Local data was left untouched. Re-run with --force if you're sure.`,SYNC_KNOWLEDGE_HEADER:"Sync Knowledge Branch",SYNC_KNOWLEDGE_START:"Reconciling the knowledge branch with the remote...",SYNC_KNOWLEDGE_NO_REMOTE:"No remote reachable \u2014 nothing to reconcile (offline or no origin configured).",SYNC_KNOWLEDGE_UP_TO_DATE:"Knowledge branch is already up to date with the remote.",SYNC_KNOWLEDGE_FAST_FORWARDED:"Fast-forwarded the local knowledge branch to the remote.",SYNC_KNOWLEDGE_PUSHED:"Pushed the local knowledge branch to the remote.",SYNC_KNOWLEDGE_MERGED:"Merged the diverged knowledge branch and pushed the result.",SYNC_KNOWLEDGE_FAIL:"Knowledge branch sync failed: ",HOOKS_HEADER:"Docuvia Hooks",HOOKS_COL_NAME:"Hook",HOOKS_COL_STATUS:"Status",HOOKS_STATUS_ENABLED:"enabled",HOOKS_STATUS_DISABLED:"disabled",HOOKS_LIST_FAIL:"Failed to list hooks: ",HOOKS_SET_FAIL:"Failed to update hook: ",HOOKS_ENABLED:e=>`Enabled hook: ${e}`,HOOKS_DISABLED:e=>`Disabled hook: ${e}`,HOOKS_INVALID_NAME:(e,n)=>`Unknown hook '${e??""}' -- valid names: ${n.join(", ")}`,HOOKS_UNKNOWN_SUBCOMMAND:e=>`Unknown 'docuvia hooks' subcommand '${e??""}' -- expected list, enable, disable, or check`};var y="ENOENT";async function J(e,n,t){let i;try{i=await _.readFile(e,c)}catch(o){o.code!==y&&I.warn(`${l.FS_READ_ERROR}${e} (${o.code??l.FS_READ_ERROR_UNKNOWN_CODE}); creating a new file instead of appending`)}if(i===void 0){await _.mkdir(g.dirname(e),{recursive:!0}),await _.writeFile(e,n),I.success(l.FS_CREATED+e);return}i.includes(t)?I.info(l.FS_ALREADY_EXISTS+e):(await _.appendFile(e,`
|
|
4
|
+
${n}`),I.success(l.FS_APPENDED+e))}async function G(e){try{let n=await _.readFile(e,c),t=`${e}.bak`;return await _.writeFile(t,n,c),t}catch{return null}}async function j(e,n,t){try{let i=await _.readFile(e,c),o=i.indexOf(n);if(o===-1)return!1;let s=i.indexOf(t,o);if(s===-1)return!1;await G(e);let A=i.slice(0,o),a=i.slice(s+t.length);return await _.writeFile(e,(A+a).trim()+`
|
|
5
|
+
`,c),I.success(`${l.FS_BLOCK_REMOVED_PREFIX}${e}${l.FS_BLOCK_REMOVED_SUFFIX}`),!0}catch{return!1}}export{r as a,w as b,I as c,l as d,J as e,G as f,j as g};
|
|
6
|
+
//# sourceMappingURL=chunk-OK2R2ETM.js.map
|