code-graph-rag 0.0.770__tar.gz → 0.0.820__tar.gz

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.
Files changed (342) hide show
  1. {code_graph_rag-0.0.770/code_graph_rag.egg-info → code_graph_rag-0.0.820}/PKG-INFO +1 -1
  2. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820/code_graph_rag.egg-info}/PKG-INFO +1 -1
  3. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/code_graph_rag.egg-info/SOURCES.txt +9 -0
  4. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/cli.py +13 -0
  5. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/cli_help.py +22 -0
  6. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/config.py +24 -0
  7. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/constants/ast_scala.py +14 -0
  8. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/constants/cli.py +41 -0
  9. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/constants/core.py +35 -0
  10. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/constants/duplicates.py +5 -0
  11. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/constants/graph.py +74 -4
  12. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/constants/lang_tooling.py +12 -0
  13. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/constants/mcp.py +14 -0
  14. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/constants/providers.py +46 -0
  15. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/constants/security.py +63 -0
  16. code_graph_rag-0.0.820/codebase_rag/context_pruning.py +173 -0
  17. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/crash_correlation.py +287 -0
  18. code_graph_rag-0.0.820/codebase_rag/editing/__init__.py +50 -0
  19. code_graph_rag-0.0.820/codebase_rag/editing/cli.py +118 -0
  20. code_graph_rag-0.0.820/codebase_rag/editing/imports.py +470 -0
  21. code_graph_rag-0.0.820/codebase_rag/editing/patcher.py +348 -0
  22. code_graph_rag-0.0.820/codebase_rag/editing/transaction.py +644 -0
  23. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/exceptions.py +4 -0
  24. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/graph_updater.py +55 -40
  25. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/language_spec.py +31 -57
  26. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/logs.py +8 -0
  27. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/main.py +149 -7
  28. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/mcp/tools.py +235 -29
  29. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/models.py +5 -0
  30. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parser_loader.py +1 -0
  31. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/build_lock.py +66 -0
  32. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/call_processor.py +173 -50
  33. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/call_resolver.py +208 -10
  34. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/class_ingest/parent_extraction.py +103 -0
  35. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/cpp_frontend/qn.py +13 -49
  36. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/csharp_frontend/frontend.py +21 -26
  37. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/dart/utils.py +9 -7
  38. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/definition_processor.py +6 -8
  39. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/document_tier.py +199 -2
  40. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/flat_module.py +14 -9
  41. code_graph_rag-0.0.820/codebase_rag/parsers/frontend_mode.py +38 -0
  42. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/function_ingest.py +10 -1
  43. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/go_frontend/frontend.py +20 -25
  44. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/import_processor.py +398 -31
  45. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/java/variable_analyzer.py +37 -30
  46. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/java_frontend/frontend.py +17 -40
  47. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/java_lombok.py +1 -0
  48. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/py_frontend/frontend.py +9 -8
  49. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/stdlib_extractor.py +4 -0
  50. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/utils.py +64 -31
  51. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/providers/base.py +166 -23
  52. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/schema_builder.py +22 -1
  53. code_graph_rag-0.0.820/codebase_rag/schema_parse.py +129 -0
  54. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/schemas.py +4 -0
  55. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/services/anthropic_token_counter.py +26 -0
  56. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/services/graph_diff.py +20 -1
  57. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/services/protobuf_service.py +45 -36
  58. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/services/provenance.py +1 -0
  59. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/stack/manager.py +5 -0
  60. code_graph_rag-0.0.820/codebase_rag/tools/codebase_query.py +771 -0
  61. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/tools/duplicate_detection.py +1 -1
  62. code_graph_rag-0.0.820/codebase_rag/tools/graph_rerank.py +196 -0
  63. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/tools/health_checker.py +2 -0
  64. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/tools/language.py +4 -0
  65. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/tools/tool_descriptions.py +31 -2
  66. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/trace/cli.py +3 -0
  67. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/trace/instrumented.py +14 -2
  68. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/types_defs.py +40 -5
  69. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/utils/path_utils.py +99 -4
  70. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/vector_store.py +59 -59
  71. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codec/schema_pb2.py +36 -36
  72. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codec/schema_pb2.pyi +4 -2
  73. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/pyproject.toml +1 -1
  74. code_graph_rag-0.0.770/codebase_rag/tools/codebase_query.py +0 -132
  75. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/LICENSE +0 -0
  76. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/PYPI_README.md +0 -0
  77. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/README.md +0 -0
  78. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/cgr/__init__.py +0 -0
  79. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/code_graph_rag.egg-info/dependency_links.txt +0 -0
  80. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/code_graph_rag.egg-info/entry_points.txt +0 -0
  81. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/code_graph_rag.egg-info/requires.txt +0 -0
  82. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/code_graph_rag.egg-info/top_level.txt +0 -0
  83. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/__init__.py +0 -0
  84. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/analyzers/__init__.py +0 -0
  85. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/analyzers/ast_grep_analyzer.py +0 -0
  86. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/analyzers/ast_grep_rules/patterns/c.yaml +0 -0
  87. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/analyzers/ast_grep_rules/patterns/cpp.yaml +0 -0
  88. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/analyzers/ast_grep_rules/patterns/csharp.yaml +0 -0
  89. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/analyzers/ast_grep_rules/patterns/dart.yaml +0 -0
  90. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/analyzers/ast_grep_rules/patterns/go.yaml +0 -0
  91. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/analyzers/ast_grep_rules/patterns/java.yaml +0 -0
  92. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/analyzers/ast_grep_rules/patterns/javascript.yaml +0 -0
  93. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/analyzers/ast_grep_rules/patterns/lua.yaml +0 -0
  94. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/analyzers/ast_grep_rules/patterns/php.yaml +0 -0
  95. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/analyzers/ast_grep_rules/patterns/python.yaml +0 -0
  96. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/analyzers/ast_grep_rules/patterns/ruby.yaml +0 -0
  97. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/analyzers/ast_grep_rules/patterns/rust.yaml +0 -0
  98. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/analyzers/ast_grep_rules/patterns/scala.yaml +0 -0
  99. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/analyzers/ast_grep_rules/patterns/tsx.yaml +0 -0
  100. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/analyzers/ast_grep_rules/patterns/typescript.yaml +0 -0
  101. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/analyzers/ast_grep_rules/security/c.yaml +0 -0
  102. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/analyzers/ast_grep_rules/security/cpp.yaml +0 -0
  103. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/analyzers/ast_grep_rules/security/csharp.yaml +0 -0
  104. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/analyzers/ast_grep_rules/security/dart.yaml +0 -0
  105. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/analyzers/ast_grep_rules/security/go.yaml +0 -0
  106. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/analyzers/ast_grep_rules/security/java.yaml +0 -0
  107. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/analyzers/ast_grep_rules/security/javascript.yaml +0 -0
  108. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/analyzers/ast_grep_rules/security/lua.yaml +0 -0
  109. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/analyzers/ast_grep_rules/security/php.yaml +0 -0
  110. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/analyzers/ast_grep_rules/security/python.yaml +0 -0
  111. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/analyzers/ast_grep_rules/security/ruby.yaml +0 -0
  112. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/analyzers/ast_grep_rules/security/rust.yaml +0 -0
  113. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/analyzers/ast_grep_rules/security/scala.yaml +0 -0
  114. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/analyzers/ast_grep_rules/security/tsx.yaml +0 -0
  115. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/analyzers/ast_grep_rules/security/typescript.yaml +0 -0
  116. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/analyzers/ast_grep_rules/smells/c.yaml +0 -0
  117. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/analyzers/ast_grep_rules/smells/cpp.yaml +0 -0
  118. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/analyzers/ast_grep_rules/smells/csharp.yaml +0 -0
  119. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/analyzers/ast_grep_rules/smells/dart.yaml +0 -0
  120. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/analyzers/ast_grep_rules/smells/go.yaml +0 -0
  121. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/analyzers/ast_grep_rules/smells/java.yaml +0 -0
  122. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/analyzers/ast_grep_rules/smells/javascript.yaml +0 -0
  123. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/analyzers/ast_grep_rules/smells/lua.yaml +0 -0
  124. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/analyzers/ast_grep_rules/smells/php.yaml +0 -0
  125. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/analyzers/ast_grep_rules/smells/python.yaml +0 -0
  126. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/analyzers/ast_grep_rules/smells/ruby.yaml +0 -0
  127. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/analyzers/ast_grep_rules/smells/rust.yaml +0 -0
  128. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/analyzers/ast_grep_rules/smells/scala.yaml +0 -0
  129. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/analyzers/ast_grep_rules/smells/tsx.yaml +0 -0
  130. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/analyzers/ast_grep_rules/smells/typescript.yaml +0 -0
  131. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/ast_cache.py +0 -0
  132. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/capture.py +0 -0
  133. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/cgr_state.py +0 -0
  134. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/constants/__init__.py +0 -0
  135. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/constants/ast_cpp.py +0 -0
  136. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/constants/ast_csharp.py +0 -0
  137. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/constants/ast_dart.py +0 -0
  138. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/constants/ast_go.py +0 -0
  139. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/constants/ast_java.py +0 -0
  140. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/constants/ast_js.py +0 -0
  141. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/constants/ast_lua.py +0 -0
  142. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/constants/ast_nodes.py +0 -0
  143. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/constants/ast_php.py +0 -0
  144. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/constants/ast_python.py +0 -0
  145. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/constants/ast_rust.py +0 -0
  146. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/constants/ast_sql.py +0 -0
  147. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/constants/build.py +0 -0
  148. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/constants/deadcode_roots.py +0 -0
  149. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/constants/deps.py +0 -0
  150. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/constants/fqn_specs.py +0 -0
  151. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/constants/health.py +0 -0
  152. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/constants/languages.py +0 -0
  153. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/constants/stdlib_types.py +0 -0
  154. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/constants/structural.py +0 -0
  155. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/constants/trace.py +0 -0
  156. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/cypher_queries.py +0 -0
  157. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/dead_code.py +0 -0
  158. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/decorators.py +0 -0
  159. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/docker-compose.yaml +0 -0
  160. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/duplicates.py +0 -0
  161. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/editor_links.py +0 -0
  162. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/embedder.py +0 -0
  163. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/flow_verdict.py +0 -0
  164. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/function_registry.py +0 -0
  165. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/graph_audit.py +0 -0
  166. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/graph_loader.py +0 -0
  167. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/mcp/__init__.py +0 -0
  168. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/mcp/client.py +0 -0
  169. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/mcp/server.py +0 -0
  170. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parser_fingerprint.py +0 -0
  171. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/__init__.py +0 -0
  172. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/ast_fingerprint.py +0 -0
  173. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/ast_grep_patterns/bash.yaml +0 -0
  174. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/ast_grep_patterns/elixir.yaml +0 -0
  175. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/ast_grep_patterns/haskell.yaml +0 -0
  176. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/ast_grep_patterns/kotlin.yaml +0 -0
  177. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/ast_grep_patterns/nix.yaml +0 -0
  178. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/ast_grep_patterns/ruby.yaml +0 -0
  179. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/ast_grep_patterns/solidity.yaml +0 -0
  180. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/ast_grep_patterns/swift.yaml +0 -0
  181. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/ast_grep_tier.py +0 -0
  182. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/class_ingest/__init__.py +0 -0
  183. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/class_ingest/cpp_modules.py +0 -0
  184. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/class_ingest/identity.py +0 -0
  185. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/class_ingest/method_override.py +0 -0
  186. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/class_ingest/mixin.py +0 -0
  187. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/class_ingest/node_type.py +0 -0
  188. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/class_ingest/relationships.py +0 -0
  189. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/class_ingest/utils.py +0 -0
  190. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/contract_linking.py +0 -0
  191. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/contracts.py +0 -0
  192. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/cpp/__init__.py +0 -0
  193. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/cpp/preproc_recovery.py +0 -0
  194. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/cpp/type_inference.py +0 -0
  195. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/cpp/utils.py +0 -0
  196. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/cpp_frontend/__init__.py +0 -0
  197. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/cpp_frontend/constants.py +0 -0
  198. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/cpp_frontend/frontend.py +0 -0
  199. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/csharp/__init__.py +0 -0
  200. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/csharp/type_inference.py +0 -0
  201. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/csharp/utils.py +0 -0
  202. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/csharp_frontend/__init__.py +0 -0
  203. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/csharp_frontend/roslyn/Frontend.cs +0 -0
  204. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/csharp_frontend/roslyn/Frontend.csproj +0 -0
  205. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/csharp_frontend/roslyn/Program.cs +0 -0
  206. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/dart/__init__.py +0 -0
  207. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/dart/type_inference.py +0 -0
  208. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/dependency_parser.py +0 -0
  209. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/dispatch_registry.py +0 -0
  210. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/endpoint_prefixes.py +0 -0
  211. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/endpoint_routes.py +0 -0
  212. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/endpoints.py +0 -0
  213. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/export_detection.py +0 -0
  214. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/factory.py +0 -0
  215. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/flow_access/__init__.py +0 -0
  216. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/flow_access/constants.py +0 -0
  217. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/flow_access/processor.py +0 -0
  218. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/frontends/__init__.py +0 -0
  219. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/frontends/cpp.py +0 -0
  220. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/frontends/csharp.py +0 -0
  221. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/frontends/go.py +0 -0
  222. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/frontends/java.py +0 -0
  223. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/frontends/protocol.py +0 -0
  224. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/frontends/python.py +0 -0
  225. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/frontends/registry.py +0 -0
  226. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/go/__init__.py +0 -0
  227. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/go/module_paths.py +0 -0
  228. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/go/type_inference.py +0 -0
  229. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/go/utils.py +0 -0
  230. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/go_frontend/__init__.py +0 -0
  231. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/go_frontend/gotypes/go.mod +0 -0
  232. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/go_frontend/gotypes/go.sum +0 -0
  233. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/go_frontend/gotypes/main.go +0 -0
  234. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/handlers/__init__.py +0 -0
  235. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/handlers/base.py +0 -0
  236. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/handlers/cpp.py +0 -0
  237. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/handlers/java.py +0 -0
  238. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/handlers/js_ts.py +0 -0
  239. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/handlers/lua.py +0 -0
  240. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/handlers/php.py +0 -0
  241. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/handlers/protocol.py +0 -0
  242. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/handlers/python.py +0 -0
  243. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/handlers/registry.py +0 -0
  244. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/handlers/rust.py +0 -0
  245. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/io_access/__init__.py +0 -0
  246. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/io_access/constants.py +0 -0
  247. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/io_access/descriptor.py +0 -0
  248. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/io_access/extract.py +0 -0
  249. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/io_access/models.py +0 -0
  250. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/io_access/processor.py +0 -0
  251. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/io_access/registry.py +0 -0
  252. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/java/__init__.py +0 -0
  253. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/java/method_resolver.py +0 -0
  254. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/java/type_inference.py +0 -0
  255. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/java/type_resolver.py +0 -0
  256. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/java/utils.py +0 -0
  257. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/java_frontend/__init__.py +0 -0
  258. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/java_frontend/javac/cgr/Frontend.java +0 -0
  259. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/java_generated.py +0 -0
  260. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/js_ts/__init__.py +0 -0
  261. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/js_ts/ingest.py +0 -0
  262. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/js_ts/module_paths.py +0 -0
  263. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/js_ts/module_system.py +0 -0
  264. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/js_ts/type_inference.py +0 -0
  265. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/js_ts/utils.py +0 -0
  266. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/lua/__init__.py +0 -0
  267. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/lua/type_inference.py +0 -0
  268. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/lua/utils.py +0 -0
  269. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/py/__init__.py +0 -0
  270. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/py/ast_analyzer.py +0 -0
  271. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/py/expression_analyzer.py +0 -0
  272. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/py/type_inference.py +0 -0
  273. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/py/utils.py +0 -0
  274. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/py/variable_analyzer.py +0 -0
  275. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/py_frontend/__init__.py +0 -0
  276. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/python_source_roots.py +0 -0
  277. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/rpc_exposure.py +0 -0
  278. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/rs/__init__.py +0 -0
  279. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/rs/type_inference.py +0 -0
  280. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/rs/utils.py +0 -0
  281. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/semantic_call_join.py +0 -0
  282. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/string_call.py +0 -0
  283. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/structure_processor.py +0 -0
  284. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/parsers/type_inference.py +0 -0
  285. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/path_filters.py +0 -0
  286. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/prompts.py +0 -0
  287. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/providers/__init__.py +0 -0
  288. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/providers/litellm.py +0 -0
  289. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/readme_sections.py +0 -0
  290. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/services/__init__.py +0 -0
  291. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/services/filtering.py +0 -0
  292. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/services/graph_service.py +0 -0
  293. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/services/llm.py +0 -0
  294. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/services/resource_cleanup.py +0 -0
  295. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/services/usage_cost.py +0 -0
  296. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/sql_names.py +0 -0
  297. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/stack/__init__.py +0 -0
  298. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/stack/cli.py +0 -0
  299. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/stack/constants.py +0 -0
  300. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/stack/health.py +0 -0
  301. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/taint.py +0 -0
  302. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/tool_errors.py +0 -0
  303. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/tools/__init__.py +0 -0
  304. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/tools/ast_grep_service.py +0 -0
  305. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/tools/code_retrieval.py +0 -0
  306. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/tools/directory_lister.py +0 -0
  307. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/tools/file_editor.py +0 -0
  308. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/tools/file_reader.py +0 -0
  309. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/tools/file_writer.py +0 -0
  310. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/tools/research.py +0 -0
  311. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/tools/semantic_search.py +0 -0
  312. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/tools/shell_command.py +0 -0
  313. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/tools/structural_editor.py +0 -0
  314. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/tools/structural_search.py +0 -0
  315. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/tools/web_search.py +0 -0
  316. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/trace/__init__.py +0 -0
  317. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/trace/cpuprofile.py +0 -0
  318. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/trace/ebpf_pprof.py +0 -0
  319. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/trace/ingest.py +0 -0
  320. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/trace/pprof.py +0 -0
  321. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/trace/pytest_plugin.py +0 -0
  322. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/trace/records.py +0 -0
  323. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/trace/resolution.py +0 -0
  324. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/trace/rust_pprof.py +0 -0
  325. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/trace/sourcemap.py +0 -0
  326. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/trace/speedscope.py +0 -0
  327. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/trace/tracer.py +0 -0
  328. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/trace/xdebug.py +0 -0
  329. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/unixcoder.py +0 -0
  330. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/utils/__init__.py +0 -0
  331. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/utils/dependencies.py +0 -0
  332. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/utils/fqn_resolver.py +0 -0
  333. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/utils/rich_markdown.py +0 -0
  334. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/utils/source_extraction.py +0 -0
  335. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/utils/token_utils.py +0 -0
  336. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/workspaces/__init__.py +0 -0
  337. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/workspaces/cli.py +0 -0
  338. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/workspaces/constants.py +0 -0
  339. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/workspaces/models.py +0 -0
  340. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codebase_rag/workspaces/storage.py +0 -0
  341. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/codec/__init__.py +0 -0
  342. {code_graph_rag-0.0.770 → code_graph_rag-0.0.820}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-graph-rag
3
- Version: 0.0.770
3
+ Version: 0.0.820
4
4
  Summary: The ultimate RAG for your monorepo. Query, understand, and edit multi-language codebases with the power of AI and knowledge graphs
5
5
  License-Expression: MIT
6
6
  Keywords: rag,retrieval-augmented-generation,knowledge-graph,code-analysis,tree-sitter,mcp,mcp-server,llm,graph-database,semantic-search,codebase,memgraph,developer-tools,monorepo
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-graph-rag
3
- Version: 0.0.770
3
+ Version: 0.0.820
4
4
  Summary: The ultimate RAG for your monorepo. Query, understand, and edit multi-language codebases with the power of AI and knowledge graphs
5
5
  License-Expression: MIT
6
6
  Keywords: rag,retrieval-augmented-generation,knowledge-graph,code-analysis,tree-sitter,mcp,mcp-server,llm,graph-database,semantic-search,codebase,memgraph,developer-tools,monorepo
@@ -16,6 +16,7 @@ codebase_rag/cgr_state.py
16
16
  codebase_rag/cli.py
17
17
  codebase_rag/cli_help.py
18
18
  codebase_rag/config.py
19
+ codebase_rag/context_pruning.py
19
20
  codebase_rag/crash_correlation.py
20
21
  codebase_rag/cypher_queries.py
21
22
  codebase_rag/dead_code.py
@@ -40,6 +41,7 @@ codebase_rag/path_filters.py
40
41
  codebase_rag/prompts.py
41
42
  codebase_rag/readme_sections.py
42
43
  codebase_rag/schema_builder.py
44
+ codebase_rag/schema_parse.py
43
45
  codebase_rag/schemas.py
44
46
  codebase_rag/sql_names.py
45
47
  codebase_rag/taint.py
@@ -125,6 +127,11 @@ codebase_rag/constants/security.py
125
127
  codebase_rag/constants/stdlib_types.py
126
128
  codebase_rag/constants/structural.py
127
129
  codebase_rag/constants/trace.py
130
+ codebase_rag/editing/__init__.py
131
+ codebase_rag/editing/cli.py
132
+ codebase_rag/editing/imports.py
133
+ codebase_rag/editing/patcher.py
134
+ codebase_rag/editing/transaction.py
128
135
  codebase_rag/mcp/__init__.py
129
136
  codebase_rag/mcp/client.py
130
137
  codebase_rag/mcp/server.py
@@ -147,6 +154,7 @@ codebase_rag/parsers/endpoints.py
147
154
  codebase_rag/parsers/export_detection.py
148
155
  codebase_rag/parsers/factory.py
149
156
  codebase_rag/parsers/flat_module.py
157
+ codebase_rag/parsers/frontend_mode.py
150
158
  codebase_rag/parsers/function_ingest.py
151
159
  codebase_rag/parsers/import_processor.py
152
160
  codebase_rag/parsers/java_generated.py
@@ -289,6 +297,7 @@ codebase_rag/tools/duplicate_detection.py
289
297
  codebase_rag/tools/file_editor.py
290
298
  codebase_rag/tools/file_reader.py
291
299
  codebase_rag/tools/file_writer.py
300
+ codebase_rag/tools/graph_rerank.py
292
301
  codebase_rag/tools/health_checker.py
293
302
  codebase_rag/tools/language.py
294
303
  codebase_rag/tools/research.py
@@ -27,6 +27,7 @@ from . import cypher_queries as cq
27
27
  from . import logs as ls
28
28
  from .capture import CaptureSelection, resolve_capture, split_spec
29
29
  from .config import load_ignore_patterns, settings
30
+ from .editing.cli import cli as edits_cli
30
31
  from .editor_links import (
31
32
  EditorTemplateError,
32
33
  diff_command,
@@ -1076,6 +1077,18 @@ def trace_command(ctx: typer.Context) -> None:
1076
1077
  _run_delegated_group(trace_cli, ctx)
1077
1078
 
1078
1079
 
1080
+ @app.command(
1081
+ name=ch.CLICommandName.EDITS,
1082
+ help=ch.CMD_EDITS,
1083
+ short_help=ch.CMD_EDITS,
1084
+ add_help_option=False,
1085
+ context_settings=_DELEGATED_GROUP_CONTEXT,
1086
+ rich_help_panel=ch.PANEL_GRAPH,
1087
+ )
1088
+ def edits_command(ctx: typer.Context) -> None:
1089
+ _run_delegated_group(edits_cli, ctx)
1090
+
1091
+
1079
1092
  @app.command(
1080
1093
  name=ch.CLICommandName.HELP,
1081
1094
  help=ch.CMD_HELP,
@@ -17,6 +17,7 @@ class CLICommandName(StrEnum):
17
17
  DAEMON = "daemon"
18
18
  WORKSPACE = "workspace"
19
19
  TRACE = "trace"
20
+ EDITS = "edits"
20
21
  STOP = "stop"
21
22
  STATUS = "status"
22
23
  HELP = "help"
@@ -72,6 +73,26 @@ CMD_WORKSPACE_REMOVE_REPO = "Remove a repository from a workspace by path"
72
73
 
73
74
  CMD_TRACE = "Ingest runtime call traces as dynamic CALLS edges"
74
75
  CMD_TRACE_GROUP = CMD_TRACE
76
+ CMD_EDITS = (
77
+ "Show or undo recorded edit transactions (multi-file edits applied through cgr)."
78
+ )
79
+ CMD_EDITS_GROUP = CMD_EDITS
80
+ CMD_EDITS_SHOW = (
81
+ "List the last N recorded edit transactions, newest first, with their diffs."
82
+ )
83
+ CMD_EDITS_UNDO = "Reverse the last N recorded edit transactions, newest first; stops at the first file that changed since."
84
+ EPILOG_EDITS = "Run 'cgr help edits COMMAND' for command-specific help."
85
+ EXAMPLES_EDITS_SHOW = (
86
+ "Examples:\n cgr edits show\n cgr edits show -n 5 --repo-path ~/proj"
87
+ )
88
+ EXAMPLES_EDITS_UNDO = (
89
+ "Examples:\n cgr edits undo\n cgr edits undo -n 2 --repo-path ~/proj"
90
+ )
91
+ HELP_EDITS_COUNT = "How many transactions to show or undo."
92
+ HELP_EDITS_REPO_PATH = (
93
+ "Repository root holding .cgr-edit-history.json (default: current directory)."
94
+ )
95
+ HELP_EDITS_DIFF = "Print each transaction's unified diff."
75
96
  CMD_TRACE_INGEST = "Resolve a trace file against a project and write dynamic edges"
76
97
  CMD_TRACE_CONVERT = "Convert a V8 .cpuprofile (node --cpu-prof) to a trace file"
77
98
 
@@ -385,6 +406,7 @@ CLI_COMMANDS: dict[CLICommandName, str] = {
385
406
  CLICommandName.LANGUAGE: CMD_LANGUAGE,
386
407
  CLICommandName.DAEMON: CMD_DAEMON,
387
408
  CLICommandName.TRACE: CMD_TRACE,
409
+ CLICommandName.EDITS: CMD_EDITS,
388
410
  CLICommandName.WORKSPACE: CMD_WORKSPACE,
389
411
  CLICommandName.STOP: CMD_STOP,
390
412
  CLICommandName.STATUS: CMD_STATUS,
@@ -336,6 +336,30 @@ class AppConfig(BaseSettings):
336
336
  CACHE_MEMORY_THRESHOLD_RATIO: float = 0.8
337
337
 
338
338
  QUERY_RESULT_MAX_TOKENS: int = Field(default=16000, gt=0)
339
+ # The model's OUTPUT budget per request. Without it pydantic-ai falls back
340
+ # to the provider default, which on Anthropic is far below what current
341
+ # models support -- a long answer then fails with "Model token limit
342
+ # (provider default) exceeded before any response was generated" and the
343
+ # model never replies at all (issue #1498).
344
+ #
345
+ # Distinct from QUERY_RESULT_MAX_TOKENS above, which trims what goes IN.
346
+ # This bounds what comes back.
347
+ # 8192 rather than something larger: pydantic-ai forwards this value
348
+ # unchanged and exposes no per-model output cap to clamp against, so the
349
+ # default must fit the SMALLEST catalogued model or it breaks working
350
+ # configurations. `gemini-2.0-flash` caps output at 8192 and is
351
+ # selectable today; 16000 was rejected outright by it. This still fixes
352
+ # the reported crash, whose remedy is any value meaningfully above
353
+ # Anthropic's 4096 provider default.
354
+ #
355
+ # Raise it per-deployment when the chosen model allows more. A general
356
+ # clamping table over every model was rejected: it would need
357
+ # hand-maintaining and would silently go stale on every new release,
358
+ # capping a launch below what it supports. Retired snapshots are the
359
+ # exception -- their maxima are frozen -- so `LEGACY_MAX_OUTPUT_TOKENS`
360
+ # lowers this budget for those ids alone, leaving everything else at the
361
+ # configured value.
362
+ MODEL_MAX_TOKENS: int = Field(default=8192, gt=0)
339
363
  QUERY_RESULT_ROW_CAP: int = Field(default=500, gt=0)
340
364
  QUERY_MEMORY_LIMIT_MB: int = Field(default=4096, gt=0)
341
365
  QUERY_TIMEOUT_S: float = Field(default=60.0, gt=0)
@@ -15,6 +15,20 @@ TS_SCALA_GENERIC_FUNCTION = TS_GENERIC_FUNCTION
15
15
  TS_SCALA_FIELD_EXPRESSION = "field_expression"
16
16
  TS_SCALA_INFIX_EXPRESSION = "infix_expression"
17
17
  TS_SCALA_IMPORT_DECLARATION = "import_declaration"
18
+ # `import a.b.{C, D}` / `import a.b.{C => Alias}` / `import a.b._`
19
+ TS_SCALA_NAMESPACE_SELECTORS = "namespace_selectors"
20
+ TS_SCALA_ARROW_RENAMED_IDENTIFIER = "arrow_renamed_identifier"
21
+ TS_SCALA_NAMESPACE_WILDCARD = "namespace_wildcard"
22
+ # Scala 3 spells a rename `as`; Scala 2 spells it `=>`. Different node types.
23
+ TS_SCALA_AS_RENAMED_IDENTIFIER = "as_renamed_identifier"
24
+ TS_SCALA_IMPORT_KEYWORD = "import"
25
+
26
+ # Wrappers the grammar puts between an `extends` clause and the
27
+ # `type_identifier` naming the base. `type_arguments` is deliberately ABSENT:
28
+ # it also holds a type_identifier (the `Int` of `Service[Int]`), so descending
29
+ # into it would return the type ARGUMENT as the base class.
30
+ TS_SCALA_GENERIC_TYPE = "generic_type"
31
+ TS_SCALA_STABLE_TYPE_IDENTIFIER = "stable_type_identifier"
18
32
  TS_SCALA_STRING = "string"
19
33
  TS_SCALA_BLOCK = "block"
20
34
  TS_SCALA_TEMPLATE_BODY = "template_body"
@@ -18,6 +18,8 @@ class KeyBinding(StrEnum):
18
18
  ENTER = "enter"
19
19
  CTRL_C = "c-c"
20
20
  SHIFT_TAB = "s-tab"
21
+ UP = "up"
22
+ DOWN = "down"
21
23
 
22
24
 
23
25
  class PermissionMode(StrEnum):
@@ -478,6 +480,37 @@ INTERACTIVE_BFS_MAX_DEPTH = 10
478
480
  INTERACTIVE_DEFAULT_GROUP = "."
479
481
 
480
482
  MSG_SURGICAL_SUCCESS = "Successfully applied surgical code replacement in: {path}"
483
+ # Span-preserving patchers (issue #1529).
484
+ PATCH_BAD_POSITION = "No such position: line {line}, column {col}"
485
+ PATCH_BAD_OFFSET = "Byte offset {offset} is outside the file"
486
+ PATCH_BAD_SPAN = "Span ({start}, {end}) is outside the file or reversed"
487
+ PATCH_OVERLAP = "Edit ({start}, {end}) overlaps an earlier edit in the same file"
488
+ PATCH_OUTSIDE_ROOT = "Path is outside the repository: {path}"
489
+ PATCH_NO_FILE = "No such file to patch: {path}"
490
+ PATCH_IDENTIFIER_MISMATCH = (
491
+ "{path}:{line}:{col} holds {found!r}, not the identifier {expected!r}"
492
+ )
493
+ PATCH_NOT_AN_IDENTIFIER = "{path}:{line}:{col} is not a whole identifier"
494
+ PATCH_PARSE_FAILED = "{path} no longer parses after the patch"
495
+ PATCH_FORMAT_DRIFT = "{path} applied, but {tool} would reformat it"
496
+ PATCH_OK = "{path}: {count} edit(s) applied"
497
+ # Edit transactions (issue #1528).
498
+ EDIT_NOT_A_FILE = "Staged path is not a regular file: {path}"
499
+ EDIT_RESERVED_PATH = "Path is cgr state, not part of the tree: {path}"
500
+ EDIT_TRANSACTION_FINISHED = "This transaction has already been committed or rolled back"
501
+ EDIT_CONFLICT = "File changed since it was staged; transaction refused: {path}"
502
+ EDIT_NOTHING_STAGED = "Nothing staged; the working tree is untouched"
503
+ EDIT_VERIFICATION_FAILED = (
504
+ "Verification failed; the working tree is untouched: {reason}"
505
+ )
506
+ EDIT_VERIFIER_RAISED = "verifier raised {error!r}"
507
+ EDIT_VERIFIER_FALSE = "verifier returned False"
508
+ EDIT_APPLIED = "Applied {count} file(s)"
509
+ EDIT_UNDO_NONE = "No recorded edit transactions to undo"
510
+ EDIT_UNDO_DONE = "Undid transaction {tx} ({count} file(s))"
511
+ EDIT_UNDO_STOPPED = "Stopped at transaction {tx}: {reason}"
512
+ EDIT_SHOW_NONE = "No recorded edit transactions"
513
+ EDIT_SHOW_HEADER = "{tx} {at} {count} file(s) verification={ok}"
481
514
  MSG_SURGICAL_FAILED = (
482
515
  "Failed to apply surgical replacement in {path}. "
483
516
  "Target code not found or patches failed."
@@ -487,6 +520,7 @@ GREP_SUGGESTION = " Use 'rg' instead of 'grep' for text searching."
487
520
 
488
521
  QUERY_NOT_AVAILABLE = "N/A"
489
522
  DICT_KEY_RESULTS = "results"
523
+ DICT_KEY_QUERY_USED = "query_used"
490
524
  TIKTOKEN_ENCODING = "cl100k_base"
491
525
  QUERY_SUMMARY_SUCCESS = "Successfully retrieved {count} item(s) from the graph."
492
526
  QUERY_SUMMARY_TRUNCATED = (
@@ -497,6 +531,13 @@ QUERY_SUMMARY_TRANSLATION_FAILED = (
497
531
  "I couldn't translate your request into a database query. Error: {error}"
498
532
  )
499
533
  QUERY_SUMMARY_DB_ERROR = "There was an error querying the database: {error}"
534
+ # Refused rather than answered unscoped: rows with no qualified name cannot
535
+ # be attributed to a project, so the requested scope cannot be honoured.
536
+ QUERY_SUMMARY_UNSCOPEABLE = (
537
+ "This query cannot be scoped to project {project!r}: it returns no "
538
+ "qualified name, so results cannot be attributed to a project. Ask for "
539
+ "the qualified name in the query."
540
+ )
500
541
  QUERY_SUMMARY_TIMEOUT = (
501
542
  "Query exceeded the {timeout:.1f}s timeout and was cancelled. "
502
543
  "Avoid unbounded traversals; add depth bounds or use a graph-algorithm procedure."
@@ -18,6 +18,16 @@ ARG_DRY_RUN = "dry_run"
18
18
 
19
19
  SEPARATOR_DOT = "."
20
20
  SEPARATOR_SLASH = "/"
21
+ # Splits "provider:model" both in user-supplied settings and in the model
22
+ # names pydantic-ai enumerates.
23
+ MODEL_STRING_SEPARATOR = ":"
24
+ # `derive_project_name` builds "<name>__<8-hex-digest>", so this marker is
25
+ # what distinguishes a project-qualified name from free text that merely
26
+ # contains dots (a docstring, a file path).
27
+ PROJECT_NAME_DIGEST_MARKER = "__"
28
+ # Hex digits after the marker. Shared so `derive_project_name` and the
29
+ # scoping filter that recognises its output cannot drift apart.
30
+ PROJECT_NAME_DIGEST_LEN = 8
21
31
  # Disambiguates definitions that share one qualified name (if/else import
22
32
  # fallbacks, typing.overload, try/except fallbacks): "<qn>@<start_line>".
23
33
  DUP_QN_MARKER = "@"
@@ -119,14 +129,39 @@ HASH_CACHE_FILENAME = ".cgr-hash-cache.json"
119
129
  DIR_MTIMES_FILENAME = ".cgr-dir-mtimes.json"
120
130
  PARSER_FINGERPRINT_FILENAME = ".cgr-parser-fingerprint"
121
131
  DELOMBOK_STATE_FILENAME = ".cgr-delombok-state.json"
132
+ # Recorded edit transactions for `cgr edits show|undo` (issue #1528).
133
+ EDIT_HISTORY_FILENAME = ".cgr-edit-history.json"
134
+ EDIT_LOCK_FILENAME = ".cgr-edit-lock"
135
+ PLATFORM_WINDOWS = "win32"
136
+ # Permission bits copied onto a replacement file (rwx for u/g/o, setuid etc.).
137
+ EDIT_MODE_MASK = 0o7777
138
+ # Mode of the exclusively created temp sibling before the target's mode is
139
+ # copied onto it: owner-only, so nothing reads staged bytes mid-write.
140
+ EDIT_TEMP_FILE_MODE = 0o600
122
141
  CGR_STATE_FILENAMES: frozenset[str] = frozenset(
123
142
  {
124
143
  HASH_CACHE_FILENAME,
125
144
  DIR_MTIMES_FILENAME,
126
145
  PARSER_FINGERPRINT_FILENAME,
127
146
  DELOMBOK_STATE_FILENAME,
147
+ EDIT_HISTORY_FILENAME,
148
+ EDIT_LOCK_FILENAME,
128
149
  }
129
150
  )
151
+ # Edit transactions (issue #1528).
152
+ EDIT_HISTORY_LIMIT = 50
153
+ EDIT_TRANSACTION_ID_LENGTH = 12
154
+ EDIT_STAGING_PREFIX = "cgr-edit-"
155
+ DIFF_DEV_NULL = "/dev/null"
156
+ EDIT_KEY_ID = "id"
157
+ EDIT_KEY_AT = "at"
158
+ EDIT_KEY_FILES = "files"
159
+ EDIT_KEY_BEFORE = "before"
160
+ EDIT_KEY_AFTER = "after"
161
+ EDIT_KEY_VERIFICATION = "verification"
162
+ EDIT_KEY_OK = "ok"
163
+ EDIT_KEY_MESSAGE = "message"
164
+ EDIT_KEY_MODE = "mode"
130
165
 
131
166
  # Inputs to the parser fingerprint: everything that changes how source files
132
167
  # become graph nodes and edges, plus the installed grammar wheels. Paths are
@@ -90,6 +90,11 @@ AST_FP_DIGEST_SIZE = 8
90
90
  # Analysis defaults (CLI/tool overridable).
91
91
  DUPLICATES_DEFAULT_THRESHOLD = 0.8
92
92
  DUPLICATES_DEFAULT_MIN_NODES = 15
93
+ # Reported groups, largest first. Named rather than inlined because the CLI
94
+ # tool and the MCP tool must default alike: parity means the same call gives
95
+ # the same answer on both surfaces (issue #1342), which two literals agreeing
96
+ # today would not guarantee tomorrow.
97
+ DUPLICATES_DEFAULT_GROUP_LIMIT = 20
93
98
  # Candidate generation is exact prefix filtering (AllPairs/PPJoin): each
94
99
  # function is indexed only under its rarest prefix branches, sized so any
95
100
  # pair clearing the Jaccard threshold is guaranteed to co-occur in a posting
@@ -35,6 +35,29 @@ KEY_START_COL = "start_col"
35
35
  KEY_NAME_START_LINE = "name_start_line"
36
36
  KEY_NAME_START_COL = "name_start_col"
37
37
  KEY_END_LINE = "end_line"
38
+ # Edge-site location properties (issue #1522). Every CALLS / REFERENCES /
39
+ # INSTANTIATES edge records the span of the expression that produced it, and
40
+ # every IMPORTS edge the span of its import statement, so a consumer can jump
41
+ # to, verify, or rewrite the exact site. Lines are 1-based and columns 0-based,
42
+ # matching the node `start_line` / `start_col` convention. Sites are stored as
43
+ # ONE EDGE PER SITE: the site props join the MERGE key (see
44
+ # MERGE_KEY_PROPS_BY_REL), so a caller invoking one callee twice carries two
45
+ # parallel edges. Edges emitted without a site (libclang macro uses, Roslyn
46
+ # facts, dynamic-trace write-back, inferred C# namespace imports) carry none of
47
+ # these keys and keep collapsing on their endpoints.
48
+ KEY_LINE = "line"
49
+ KEY_COL = "col"
50
+ KEY_END_COL = "end_col"
51
+ KEY_ARG_COUNT = "arg_count"
52
+ KEY_KWARG_NAMES = "kwarg_names"
53
+ # IMPORTS only: the name the statement binds in the importing scope (the
54
+ # `as` name when renamed, else the imported/module name) and, for
55
+ # symbol-level imports (`from x import y`, `import { y }`, `use a::b::y`),
56
+ # the symbol's own name. A whole-module import has no `imported_name`.
57
+ KEY_ALIAS = "alias"
58
+ KEY_IMPORTED_NAME = "imported_name"
59
+ # `imported_name` of a wildcard import (`from x import *`, `export * from`).
60
+ IMPORTED_NAME_WILDCARD = "*"
38
61
  KEY_PATH = "path"
39
62
  KEY_ABSOLUTE_PATH = "absolute_path"
40
63
  # Whether flow analysis covered a Module: its language is in the source/sink
@@ -348,7 +371,19 @@ SCHEMA_OPTIONAL_SUFFIX = "?"
348
371
  NODE_PROJECT = NodeLabel.PROJECT
349
372
 
350
373
  KEY_PARAMETERS = "parameters"
374
+ # Declared Markdown front-matter, as sorted "key=value" entries (issue #1448).
375
+ KEY_FRONT_MATTER = "front_matter"
351
376
  KEY_DECORATORS = "decorators"
377
+ # Declared POSITIONAL parameter names of a Python function, receiver included,
378
+ # for arity-TypeError diagnosis (issue #227). Positional-only because CPython's
379
+ # "takes N positional arguments" counts nothing after `*`/`*args`, and
380
+ # receiver-inclusive because it counts the bound `self`.
381
+ #
382
+ # Absent on every other language rather than empty: absent means "kinds
383
+ # unknown", which `diagnose_arity` answers with "cannot corroborate", whereas
384
+ # an empty list would assert "declares zero positional parameters" and produce
385
+ # a false mismatch on correct code.
386
+ KEY_POSITIONAL_PARAMS = "positional_params"
352
387
  # Target-module qn candidates of `#[cfg(test)] mod NAME;` declarations in a
353
388
  # Rust file, stored on the DECLARING module's node (issue #1010). The
354
389
  # ungated counterpart lets a production target's declaration of the SAME
@@ -483,21 +518,48 @@ CYPHER_ALL_MODULE_QNS = (
483
518
  # Re-resolving the callers instead would diverge from a clean index, because
484
519
  # cgr's call resolution is context-sensitive (protocol vs concrete receiver,
485
520
  # import granularity); the original edges already match a clean re-index.
521
+ #
522
+ # The STRUCTURE of this query and of CYPHER_AFFECTED_CALLER_PATHS below is not
523
+ # covered by the unit suite, only their relation lists are. The eval emulator
524
+ # (evals/cgr_graph.py) matches these constants whole, in a `case` that compares
525
+ # the query by VALUE, and never parses the Cypher: it reimplements the
526
+ # semantics in Python over its own frozensets. So an edit to the text here is
527
+ # followed automatically by the `case` while the emulator's behaviour stays
528
+ # hardcoded, and a structural edit keeps every unit test green while breaking
529
+ # production. Measured 2026-08-30: flipping the arrow here to
530
+ # `(caller)<-[r:...]-(target)` left all of test_incremental_implements_edge.py
531
+ # passing (7 passed), and deleting the `caller.path` guard from
532
+ # CYPHER_AFFECTED_CALLER_PATHS left 16 passed across `pytest
533
+ # test_incremental_implements_edge.py test_graph_updater_incremental_rename.py
534
+ # test_cacheless_lookup_failure.py`. Both queries do reach a real backend,
535
+ # via `ingestor.fetch_all` in graph_updater.py (the affected-caller read and
536
+ # `_capture_inbound_edges`), so such an edit ships a broken incremental
537
+ # restore. Verify a change to the MATCH shape or the WHERE clauses against a
538
+ # real graph (the Docker-backed integration tier), not against a green unit
539
+ # run. Two edits the unit suite DOES catch: adding or removing a relation
540
+ # type, and renaming this query's `props` key (test_edge_site_properties.py).
541
+ # CYPHER_AFFECTED_CALLER_PATHS' `caller_path` projection IS pinned, expression
542
+ # and alias both, by test_incremental_implements_edge.py; its other RETURN
543
+ # aliases are not.
486
544
  CYPHER_INBOUND_EDGES = (
487
- "MATCH (caller)-[r:CALLS|REFERENCES|INSTANTIATES|IMPORTS|INHERITS|OVERRIDES]->(target) "
545
+ "MATCH (caller)-[r:CALLS|REFERENCES|INSTANTIATES|IMPORTS|INHERITS|IMPLEMENTS|OVERRIDES]->(target) "
488
546
  "WHERE target.path IN $paths AND caller.qualified_name IS NOT NULL "
489
547
  "AND (caller.path IS NULL OR NOT caller.path IN $paths) "
490
548
  "RETURN head(labels(caller)) AS caller_label, "
491
549
  "caller.qualified_name AS caller_qn, type(r) AS rel, "
492
- "head(labels(target)) AS target_label, target.qualified_name AS target_qn"
550
+ "head(labels(target)) AS target_label, target.qualified_name AS target_qn, "
551
+ "properties(r) AS props"
493
552
  )
494
553
  # Files whose code DEPENDS on a re-indexed file (issue #1229 phase 4): a
495
554
  # change there can rebind their calls (a new override shadowing an inherited
496
555
  # method), so restoring their old edges verbatim would freeze a stale
497
556
  # binding. They are re-parsed instead, one level deep: their own definitions
498
- # are unchanged, so their callers' bindings cannot move.
557
+ # are unchanged, so their callers' bindings cannot move. IMPLEMENTS counts
558
+ # like INHERITS: an implementor in the same package holds no import edge into
559
+ # its interface's file, and without this it was neither re-parsed nor
560
+ # restored when that file was re-indexed (issue #1565).
499
561
  CYPHER_AFFECTED_CALLER_PATHS = (
500
- "MATCH (caller)-[:CALLS|REFERENCES|INSTANTIATES|IMPORTS|INHERITS]->(target) "
562
+ "MATCH (caller)-[:CALLS|REFERENCES|INSTANTIATES|IMPORTS|INHERITS|IMPLEMENTS]->(target) "
501
563
  "WHERE target.path IN $paths AND caller.path IS NOT NULL "
502
564
  "AND NOT caller.path IN $paths "
503
565
  "AND caller.qualified_name STARTS WITH $project_prefix "
@@ -581,6 +643,14 @@ REL_TYPE_CALLS = "CALLS"
581
643
  # still dedups on endpoints.
582
644
  MERGE_KEY_PROPS_BY_REL: dict[str, tuple[str, ...]] = {
583
645
  RelationshipType.FLOWS_TO.value: ("via", "kind"),
646
+ # One edge per call/reference/instantiation site (issue #1522); a row
647
+ # without a site still merges on its endpoints alone.
648
+ RelationshipType.CALLS.value: (KEY_LINE, KEY_COL),
649
+ RelationshipType.REFERENCES.value: (KEY_LINE, KEY_COL),
650
+ RelationshipType.INSTANTIATES.value: (KEY_LINE, KEY_COL),
651
+ # One edge per bound name: `from x import a, b` shares a statement span
652
+ # but binds two names, each its own edge.
653
+ RelationshipType.IMPORTS.value: (KEY_LINE, KEY_COL, KEY_ALIAS),
584
654
  }
585
655
 
586
656
  NODE_UNIQUE_CONSTRAINTS: dict[str, str] = {
@@ -150,6 +150,18 @@ LANG_TABLE_PLACEHOLDER = "—"
150
150
 
151
151
  LANG_MSG_AVAILABLE_NODES = "Available nodes for mapping:"
152
152
  LANG_ELLIPSIS = "..."
153
+ # Span-preserving patchers (issue #1529): formatter checks and the identifier
154
+ # node types a rename may target beyond the shared `identifier` family.
155
+ PATCH_GOFMT = "gofmt"
156
+ PATCH_GOFMT_LIST_FLAG = "-l"
157
+ PATCH_RUSTFMT = "rustfmt"
158
+ PATCH_RUSTFMT_CHECK_FLAG = "--check"
159
+ PATCH_RUSTFMT_EDITION_FLAG = "--edition"
160
+ PATCH_RUSTFMT_EDITION = "2021"
161
+ PATCH_FORMATTER_TIMEOUT_S = 60
162
+ PATCH_TS_FIELD_IDENTIFIER = "field_identifier"
163
+ PATCH_TS_NAMESPACE_IDENTIFIER = "namespace_identifier"
164
+ PATCH_TS_STATEMENT_IDENTIFIER = "statement_identifier"
153
165
  LANG_GIT_SUFFIX = ".git"
154
166
  LANG_GITMODULES_FILE = ".gitmodules"
155
167
  LANG_CALL_KEYWORD_EXCLUDE = "call"
@@ -18,6 +18,8 @@ class MCPToolName(StrEnum):
18
18
  SEMANTIC_SEARCH = "semantic_search"
19
19
  STRUCTURAL_SEARCH = "structural_search"
20
20
  STRUCTURAL_REPLACE = "structural_replace"
21
+ FIND_DUPLICATE_CODE = "find_duplicate_code"
22
+ GET_FUNCTION_SOURCE = "get_function_source"
21
23
  ASK_AGENT = "ask_agent"
22
24
  FLOW_VERDICT = "flow_verdict"
23
25
  EXPLAIN_TRACEBACK = "explain_traceback"
@@ -39,6 +41,9 @@ class MCPSchemaType(StrEnum):
39
41
  OBJECT = "object"
40
42
  STRING = "string"
41
43
  INTEGER = "integer"
44
+ # JSON Schema spells a float 'number'; 'integer' would reject a 0.8
45
+ # similarity threshold at the client before the call is even made.
46
+ NUMBER = "number"
42
47
  BOOLEAN = "boolean"
43
48
 
44
49
 
@@ -52,6 +57,9 @@ class MCPSchemaField(StrEnum):
52
57
 
53
58
  class MCPParamName(StrEnum):
54
59
  PROJECT_NAME = "project_name"
60
+ # The per-request retrieval scope (issue #1494). Distinct from
61
+ # PROJECT_NAME, which names the target of delete_project.
62
+ PROJECT = "project"
55
63
  CONFIRM = "confirm"
56
64
  NATURAL_LANGUAGE_QUERY = "natural_language_query"
57
65
  QUALIFIED_NAME = "qualified_name"
@@ -71,6 +79,9 @@ class MCPParamName(StrEnum):
71
79
  SINK_QN = "sink_qualified_name"
72
80
  DRY_RUN = "dry_run"
73
81
  TRACEBACK_TEXT = "traceback_text"
82
+ NODE_ID = "node_id"
83
+ THRESHOLD = "threshold"
84
+ MIN_SIZE = "min_size"
74
85
 
75
86
 
76
87
  # MCP server constants
@@ -95,6 +106,9 @@ MCP_SEMANTIC_NOT_AVAILABLE_RESPONSE = (
95
106
  "Semantic search is not available. Install with: uv sync --extra semantic"
96
107
  )
97
108
  MCP_ASK_AGENT_ERROR = "Error running ask_agent: {error}"
109
+ # Refused rather than answered with zero rows: an empty result for a
110
+ # misspelled project name is indistinguishable from a genuine empty result.
111
+ MCP_UNKNOWN_PROJECT = "Unknown project {project!r}. Indexed projects: {known}"
98
112
  MCP_PROJECT_DELETED = "Successfully deleted project '{project_name}'."
99
113
  MCP_WIPE_CANCELLED = "Database wipe cancelled. Set confirm=true to proceed."
100
114
  MCP_WIPE_SUCCESS = "Database completely wiped. All projects have been removed."
@@ -46,6 +46,28 @@ OLLAMA_HEALTH_PATH = "/api/tags"
46
46
  GOOGLE_CLOUD_SCOPE = "https://www.googleapis.com/auth/cloud-platform"
47
47
  V1_PATH = "/v1"
48
48
 
49
+ # The endpoint each provider serves its own published catalogue from. A
50
+ # config pointing somewhere else (vLLM, an OpenAI-compatible proxy) serves
51
+ # whatever that host chooses, so model-id validation does not apply to it.
52
+ # Providers absent here have no single canonical endpoint and are never
53
+ # gated on model id.
54
+ PROVIDER_DEFAULT_ENDPOINTS: dict[str, str] = {
55
+ Provider.OPENAI: OPENAI_DEFAULT_ENDPOINT,
56
+ Provider.MINIMAX: MINIMAX_DEFAULT_ENDPOINT,
57
+ }
58
+
59
+ # Catalogue prefixes to consult per provider, where pydantic-ai splits one
60
+ # vendor across several. `openai-chat` carries five ids absent from
61
+ # `openai` (the search-preview variants and gpt-3.5-turbo-16k), so
62
+ # consulting only `openai:` would reject real models.
63
+ PROVIDER_CATALOGUE_PREFIXES: dict[str, tuple[str, ...]] = {
64
+ Provider.OPENAI: ("openai", "openai-chat"),
65
+ Provider.GOOGLE: ("google", "google-cloud"),
66
+ }
67
+
68
+ # How many model ids to list when nothing resembles what the user typed.
69
+ MODEL_ID_SUGGESTION_LIMIT = 20
70
+
49
71
  HTTP_OK = 200
50
72
 
51
73
  UNIXCODER_MODEL = "microsoft/unixcoder-base"
@@ -87,6 +109,10 @@ FIELD_ENDPOINT = "endpoint"
87
109
  ANTHROPIC_COUNT_TOKENS_URL = "https://api.anthropic.com/v1/messages/count_tokens"
88
110
  ANTHROPIC_API_VERSION = "2023-06-01"
89
111
  ANTHROPIC_HEADER_API_KEY = "x-api-key"
112
+
113
+ # HTTP statuses meaning the credential was REJECTED. Retrying cannot help,
114
+ # so these are reported differently from transient failures (issue #1493).
115
+ HTTP_AUTH_FAILURE_STATUSES: frozenset[int] = frozenset({401, 403})
90
116
  ANTHROPIC_HEADER_VERSION = "anthropic-version"
91
117
  HEADER_CONTENT_TYPE = "content-type"
92
118
  CONTENT_TYPE_JSON = "application/json"
@@ -111,6 +137,26 @@ MODEL_CONTEXT_WINDOWS: dict[str, int] = {
111
137
  "claude-haiku-4-0": 200_000,
112
138
  }
113
139
 
140
+ # Output ceilings for model snapshots that reject the configured budget
141
+ # outright (issue #1498).
142
+ #
143
+ # Deliberately NOT a general per-model table: a general one would have to
144
+ # list every current release and would go stale on each launch, silently
145
+ # capping a new model below what it supports. An id absent from here keeps
146
+ # the configured budget, which is the direction that stays safe as new
147
+ # models appear, and every current release accepts the 8192 default.
148
+ #
149
+ # An entry is added only where the rejection has been DEMONSTRATED against
150
+ # that id, never from recollection of a published limit. Anthropic's catalog
151
+ # stops publishing max-output once a model retires, so for exactly the old
152
+ # snapshots this table describes there is no longer an authoritative source
153
+ # to check a remembered number against -- and a wrong entry here truncates
154
+ # answers silently, which is the failure this issue exists to remove.
155
+ DEFAULT_MAX_OUTPUT_TOKENS = 4_096
156
+ LEGACY_MAX_OUTPUT_TOKENS: dict[str, int] = {
157
+ "claude-3-haiku-20240307": DEFAULT_MAX_OUTPUT_TOKENS,
158
+ }
159
+
114
160
  MODULE_TORCH = "torch"
115
161
  MODULE_TRANSFORMERS = "transformers"
116
162
  MODULE_QDRANT_CLIENT = "qdrant_client"
@@ -5,6 +5,69 @@ CYPHER_PREFIX = "cypher"
5
5
  CYPHER_SEMICOLON = ";"
6
6
  CYPHER_BACKTICK = "`"
7
7
  CYPHER_MATCH_KEYWORD = "MATCH"
8
+ # A scoped query must return something a project filter can judge. Matched
9
+ # against the UPPERCASED query, so these are upper case.
10
+ CYPHER_QUALIFIED_NAME_TOKEN = "QUALIFIED_NAME"
11
+ # Evidence must be in what the query RETURNS: a qualified name mentioned
12
+ # only in WHERE or ORDER BY does not make the returned rows attributable.
13
+ CYPHER_RETURN_KEYWORD = "RETURN "
14
+ # Only a predicate that narrows to a PREFIX restricts an aggregate to one
15
+ # project. `IS NOT NULL` / `<> ''` / `exists(...)` match every indexed node
16
+ # in every project, so a count over them spans them all.
17
+ CYPHER_PREFIX_PREDICATES = ("STARTS WITH", "=~", " = ")
18
+ # Named so the alias-binding check can exclude it: a regex operand cannot be
19
+ # shown limited to one project by inspection, whereas a literal can.
20
+ CYPHER_REGEX_PREDICATE = "=~"
21
+ # Stripped from a captured aggregate operand in code rather than matched in
22
+ # the pattern: matching it there placed two whitespace-consuming quantifiers
23
+ # side by side, which backtracks super-linearly.
24
+ CYPHER_DISTINCT_KEYWORD = "DISTINCT"
25
+ # Cypher literals that uppercase into something indistinguishable from an
26
+ # alias, so an aggregate over one would look bindable. Enumerating is sound
27
+ # here because the LANGUAGE defines exactly these three -- unlike a list of
28
+ # "constant spellings", which is open-ended and missed a quoted string.
29
+ CYPHER_LITERAL_OPERANDS = frozenset({"TRUE", "FALSE", "NULL"})
30
+ # The WHERE clause a scoped aggregate is allowed to have: a conjunction of
31
+ # plain `<entity>.<property> <op> <value>` comparisons, joined by AND.
32
+ #
33
+ # A WHITELIST, after a blacklist of `OR|NOT|XOR` proved to be the wrong
34
+ # shape. Those three widen or invert a predicate, but Cypher's boolean
35
+ # surface is larger -- `CASE WHEN <pred> THEN true ELSE true END` and
36
+ # `coalesce(<pred>, true)` contain none of them, evaluate true for every
37
+ # row, and were accepted. A blacklist tests for known-bad SPELLINGS; the
38
+ # contract is that the restriction BINDS, which is a property.
39
+ #
40
+ # Sound only because the input language is small: the Cypher is generated
41
+ # against a system prompt mandating plain MATCH/WHERE/RETURN/LIMIT, and
42
+ # anything outside that shape is refused rather than analysed -- the same
43
+ # default-deny `CYPHER_UNANALYSABLE_PATTERN` applies to query structure.
44
+ # If this ever accepts user-authored Cypher, this rule is what must be
45
+ # revisited first (issue #1494).
46
+ CYPHER_CONJUNCT_PATTERN = (
47
+ r"^\s*[A-Z_][A-Z0-9_]*\.[A-Z_][A-Z0-9_]*\s*"
48
+ r"(?:STARTS WITH|ENDS WITH|CONTAINS|=~|<>|=|<|>|<=|>=)\s*"
49
+ r"(?:'[^']*'|\"[^\"]*\"|[A-Z0-9_.$]+)\s*$"
50
+ )
51
+ CYPHER_CONJUNCTION_SEPARATOR = r"\bAND\b"
52
+ CYPHER_WHERE_KEYWORD = "WHERE"
53
+ # Constructs a SCOPED query may not use. Each defeats clause-level
54
+ # analysis: UNION means several RETURNs, CALL and WITH mean the projection
55
+ # is assembled elsewhere. The system prompt mandates plain
56
+ # MATCH/WHERE/RETURN/LIMIT, so refusing these costs nothing the model
57
+ # should be emitting, and it closes the bypass class instead of
58
+ # enumerating members of it.
59
+ #
60
+ # WITH is matched only as a standalone clause. A bare "WITH" also occurs
61
+ # inside "STARTS WITH" -- the predicate scoping requires -- and inside
62
+ # "ENDS WITH", which prompts.py line 64 recommends for matching a symbol
63
+ # by its short name. Both must survive.
64
+ CYPHER_UNANALYSABLE_PATTERN = r"\bUNION\b|\bCALL\b|(?<!STARTS )(?<!ENDS )\bWITH\b"
65
+ # Separates a projection term from its alias.
66
+ CYPHER_ALIAS_KEYWORD = " AS "
67
+ CYPHER_POST_RETURN_KEYWORDS = (" ORDER BY", " SKIP ", " LIMIT ", " UNION")
68
+ # An aggregate exposes no names, so a scoped request needs no evidence from
69
+ # it -- and refusing one would make scoping useless for counting queries.
70
+ CYPHER_AGGREGATE_TOKENS = ("COUNT(", "SUM(", "AVG(", "MIN(", "MAX(", "COLLECT(")
8
71
  CYPHER_DANGEROUS_KEYWORDS: frozenset[str] = frozenset(
9
72
  {
10
73
  "DELETE",