java-codebase-rag 0.5.2__py3-none-any.whl → 0.6.0__py3-none-any.whl

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.
mcp_v2.py CHANGED
@@ -30,7 +30,7 @@ from sentence_transformers import SentenceTransformer
30
30
  from index_common import SBERT_MODEL
31
31
  from java_codebase_rag.config import resolved_sbert_model_for_process_env
32
32
  from java_ontology import EDGE_SCHEMA, ResolveReason
33
- from kuzu_queries import KuzuGraph, OVERRIDE_AXIS_COMPOSED_EDGE_TYPES
33
+ from ladybug_queries import LadybugGraph, OVERRIDE_AXIS_COMPOSED_EDGE_TYPES
34
34
  from mcp_hints import generate_hints, MCP_HINTS_STRUCTURED_FIELD_DESCRIPTION
35
35
  from search_lancedb import TABLES, run_search
36
36
 
@@ -604,7 +604,7 @@ def _node_kind_from_id(
604
604
 
605
605
 
606
606
  def _resolve_node_kind(
607
- graph: KuzuGraph,
607
+ graph: LadybugGraph,
608
608
  node_id: str,
609
609
  ) -> Literal["symbol", "route", "client", "producer", "unresolved_call_site"]:
610
610
  try:
@@ -733,7 +733,7 @@ def _node_ref_from_row(kind: Literal["symbol", "route", "client", "producer"], r
733
733
 
734
734
 
735
735
  def _load_node_record(
736
- graph: KuzuGraph, node_id: str, kind: Literal["symbol", "route", "client", "producer"],
736
+ graph: LadybugGraph, node_id: str, kind: Literal["symbol", "route", "client", "producer"],
737
737
  ) -> dict[str, Any] | None:
738
738
  if kind == "symbol":
739
739
  projection = (
@@ -807,7 +807,7 @@ def _merge_overrides_edge_summary(
807
807
 
808
808
 
809
809
  def _edge_summary_for_node(
810
- graph: KuzuGraph, node_id: str, *, kind: str, row: dict[str, Any]
810
+ graph: LadybugGraph, node_id: str, *, kind: str, row: dict[str, Any]
811
811
  ) -> dict[str, dict[str, int]]:
812
812
  summary = dict(graph.edge_counts_for(node_id))
813
813
  sym_kind = str(row.get("kind") or "")
@@ -887,7 +887,7 @@ def search_v2(
887
887
  offset: int = 0,
888
888
  path_contains: str | None = None,
889
889
  filter: NodeFilter | dict[str, Any] | str | None = None,
890
- graph: KuzuGraph | None = None,
890
+ graph: LadybugGraph | None = None,
891
891
  ) -> SearchOutput:
892
892
  try:
893
893
  raw_filter = _coerce_filter(filter)
@@ -967,10 +967,10 @@ def find_v2(
967
967
  filter: NodeFilter | dict[str, Any] | str,
968
968
  limit: int = 25,
969
969
  offset: int = 0,
970
- graph: KuzuGraph | None = None,
970
+ graph: LadybugGraph | None = None,
971
971
  ) -> FindOutput:
972
972
  try:
973
- g = graph or KuzuGraph.get()
973
+ g = graph or LadybugGraph.get()
974
974
  raw_filter = _coerce_filter(filter)
975
975
  if raw_filter is None:
976
976
  raw_filter = {}
@@ -1063,10 +1063,10 @@ _DESCRIBE_UCS_ID_MESSAGE = (
1063
1063
  def describe_v2(
1064
1064
  id: str | None = None,
1065
1065
  fqn: str | None = None,
1066
- graph: KuzuGraph | None = None,
1066
+ graph: LadybugGraph | None = None,
1067
1067
  ) -> DescribeOutput:
1068
1068
  try:
1069
- g = graph or KuzuGraph.get()
1069
+ g = graph or LadybugGraph.get()
1070
1070
  has_id = bool(id and str(id).strip())
1071
1071
  has_fqn = bool(fqn and str(fqn).strip())
1072
1072
  if not has_id and not has_fqn:
@@ -1171,7 +1171,7 @@ def _resolve_parse_microservice_route(identifier: str) -> tuple[str, str, str] |
1171
1171
 
1172
1172
 
1173
1173
  def _resolve_symbol_candidates(
1174
- g: KuzuGraph,
1174
+ g: LadybugGraph,
1175
1175
  identifier: str,
1176
1176
  ) -> list[tuple[NodeRef, ResolveReason, int]]:
1177
1177
  out: list[tuple[NodeRef, ResolveReason, int]] = []
@@ -1213,7 +1213,7 @@ def _resolve_symbol_candidates(
1213
1213
 
1214
1214
 
1215
1215
  def _resolve_route_candidates(
1216
- g: KuzuGraph,
1216
+ g: LadybugGraph,
1217
1217
  identifier: str,
1218
1218
  ) -> list[tuple[NodeRef, ResolveReason, int]]:
1219
1219
  out: list[tuple[NodeRef, ResolveReason, int]] = []
@@ -1265,7 +1265,7 @@ def _resolve_route_candidates(
1265
1265
 
1266
1266
 
1267
1267
  def _resolve_client_candidates(
1268
- g: KuzuGraph,
1268
+ g: LadybugGraph,
1269
1269
  identifier: str,
1270
1270
  ) -> list[tuple[NodeRef, ResolveReason, int]]:
1271
1271
  out: list[tuple[NodeRef, ResolveReason, int]] = []
@@ -1304,7 +1304,7 @@ def _resolve_client_candidates(
1304
1304
 
1305
1305
 
1306
1306
  def _resolve_producer_candidates(
1307
- g: KuzuGraph,
1307
+ g: LadybugGraph,
1308
1308
  identifier: str,
1309
1309
  ) -> list[tuple[NodeRef, ResolveReason, int]]:
1310
1310
  out: list[tuple[NodeRef, ResolveReason, int]] = []
@@ -1462,7 +1462,7 @@ def _resolve_finalize_success(
1462
1462
  def resolve_v2(
1463
1463
  identifier: str,
1464
1464
  hint_kind: Literal["symbol", "route", "client", "producer"] | None = None,
1465
- graph: KuzuGraph | None = None,
1465
+ graph: LadybugGraph | None = None,
1466
1466
  ) -> ResolveOutput:
1467
1467
  try:
1468
1468
  trimmed, err = _resolve_validate_identifier(identifier)
@@ -1481,7 +1481,7 @@ def resolve_v2(
1481
1481
  if "*" in trimmed or "?" in trimmed:
1482
1482
  return _resolve_finalize_success(trimmed, hint_kind, [])
1483
1483
 
1484
- g = graph or KuzuGraph.get()
1484
+ g = graph or LadybugGraph.get()
1485
1485
  raw: list[tuple[NodeRef, ResolveReason, int]] = []
1486
1486
  for kind in _resolve_kinds_to_search(hint_kind):
1487
1487
  if kind == "symbol":
@@ -1726,7 +1726,7 @@ def neighbors_v2(
1726
1726
  declares_composed = [k for k in composed_keys if k in _MEMBER_COMPOSED_EDGE_TYPES]
1727
1727
  override_composed = [k for k in composed_keys if k in _OVERRIDE_COMPOSED_EDGE_TYPES]
1728
1728
  ordered_composed = declares_composed + override_composed
1729
- g = graph or KuzuGraph.get()
1729
+ g = graph or LadybugGraph.get()
1730
1730
  try:
1731
1731
  raw_filter = _coerce_filter(filter)
1732
1732
  nf = (
pr_analysis.py CHANGED
@@ -12,7 +12,7 @@ from typing import Any
12
12
  from unidiff import PatchSet
13
13
  from unidiff.errors import UnidiffParseError
14
14
 
15
- from kuzu_queries import SymbolHit, find_symbols_in_file_range, _row_to_symbol
15
+ from ladybug_queries import SymbolHit, find_symbols_in_file_range, _row_to_symbol
16
16
 
17
17
 
18
18
  @dataclass
search_lancedb.py CHANGED
@@ -675,16 +675,16 @@ def _graph_expand_merge(
675
675
  limit: int,
676
676
  extra_predicates: list[str],
677
677
  expand_depth: int,
678
- kuzu_path: str | None,
678
+ ladybug_path: str | None,
679
679
  ) -> list[dict]:
680
680
  """Expand vector top-k through the Kuzu graph and fuse (RRF) with the original list."""
681
681
  # Lazy import so the module works without kuzu installed when graph_expand=False.
682
682
  try:
683
- from kuzu_queries import KuzuGraph
683
+ from ladybug_queries import LadybugGraph
684
684
  except Exception:
685
685
  return vector_rows
686
686
 
687
- if not KuzuGraph.exists(kuzu_path):
687
+ if not LadybugGraph.exists(ladybug_path):
688
688
  return vector_rows
689
689
 
690
690
  seed_fqns = sorted({r.get("primary_type_fqn") for r in vector_rows if r.get("primary_type_fqn")})
@@ -692,7 +692,7 @@ def _graph_expand_merge(
692
692
  return vector_rows
693
693
 
694
694
  try:
695
- graph = KuzuGraph.get(kuzu_path)
695
+ graph = LadybugGraph.get(ladybug_path)
696
696
  structural = graph.expand_fqns(seed_fqns, depth=expand_depth)
697
697
  method_pairs = graph.expand_methods(
698
698
  seed_fqns, depth=expand_depth, exclude_external=True,
@@ -804,7 +804,7 @@ def run_search(
804
804
  package_prefix: str | None = None,
805
805
  graph_expand: bool = False,
806
806
  expand_depth: int = 1,
807
- kuzu_path: str | None = None,
807
+ ladybug_path: str | None = None,
808
808
  context_neighbors: int = 0,
809
809
  role_in: list[str] | None = None,
810
810
  exclude_roles: list[str] | None = None,
@@ -890,7 +890,7 @@ def run_search(
890
890
  limit=need,
891
891
  extra_predicates=extra_java,
892
892
  expand_depth=expand_depth,
893
- kuzu_path=kuzu_path,
893
+ ladybug_path=ladybug_path,
894
894
  )
895
895
 
896
896
  window = rows[offset : offset + limit]
@@ -966,7 +966,7 @@ def main() -> None:
966
966
  parser.add_argument("--package-prefix", default=None)
967
967
  parser.add_argument("--graph-expand", action="store_true")
968
968
  parser.add_argument("--expand-depth", type=int, default=1)
969
- parser.add_argument("--kuzu-path", default=None)
969
+ parser.add_argument("--ladybug-path", default=None)
970
970
  parser.add_argument(
971
971
  "--context-neighbors", type=int, default=0,
972
972
  help="Attach N adjacent chunks per hit as surrounding context (Java only).",
@@ -1010,7 +1010,7 @@ def main() -> None:
1010
1010
  package_prefix=args.package_prefix,
1011
1011
  graph_expand=args.graph_expand,
1012
1012
  expand_depth=args.expand_depth,
1013
- kuzu_path=args.kuzu_path,
1013
+ ladybug_path=args.ladybug_path,
1014
1014
  context_neighbors=args.context_neighbors,
1015
1015
  )
1016
1016
  except Exception as e:
server.py CHANGED
@@ -16,23 +16,25 @@ from java_codebase_rag.cli_progress import (
16
16
  emit_vectors_finish,
17
17
  emit_vectors_start,
18
18
  )
19
+ from java_codebase_rag._fdlimit import raise_fd_limit
19
20
  from java_codebase_rag.config import (
21
+ cocoindex_subprocess_env_defaults,
20
22
  discover_project_root,
21
23
  emit_legacy_env_hints_if_present,
22
24
  resolved_sbert_model_for_process_env,
23
25
  resolve_operator_config,
24
26
  )
25
- from kuzu_queries import KuzuGraph, resolve_kuzu_path
27
+ from ladybug_queries import LadybugGraph, resolve_ladybug_path
26
28
  from mcp.server.fastmcp import FastMCP
27
29
  from pydantic import BaseModel, Field
28
30
  from search_lancedb import TABLES
29
31
 
30
32
  _COCOINDEX_TARGET = "java_index_flow_lancedb.py:JavaCodeIndexLance"
31
33
  _INSTRUCTIONS = (
32
- "Java codebase graph navigator (LanceDB + Kuzu). "
34
+ "Java codebase graph navigator (LanceDB + Ladybug). "
33
35
  "Tools: search (NL/code locate), find (structured NodeFilter), describe (one node + edge_summary: stored edge-label counts and optional composed keys for type Symbols and override-axis virtual keys for method Symbols), "
34
36
  "neighbors (one hop; you MUST pass direction in|out AND edge_types list — no defaults), "
35
- "resolve (identifier-shaped lookup for symbol/route/client/producer — three statuses one|many|none). "
37
+ "resolve (identifier-shaped lookup for symbol/route/client/producer — three statuses one|many/none). "
36
38
  "NodeFilter `filter` is a JSON object (preferred); a JSON-encoded string is also accepted as a fallback. "
37
39
  "Unknown filter keys and populated fields not applicable to the effective node kind fail with success=false and message. "
38
40
  "Edge labels: EXTENDS, IMPLEMENTS, INJECTS, OVERRIDES, DECLARES, DECLARES_CLIENT, DECLARES_PRODUCER, CALLS, EXPOSES, HTTP_CALLS, ASYNC_CALLS; "
@@ -85,6 +87,7 @@ class RefreshIndexOutput(BaseModel):
85
87
  graph_stdout: str = ""
86
88
  graph_stderr: str = ""
87
89
  phases_run: list[Literal["vectors", "graph"]] = Field(default_factory=list)
90
+ optimize_error: str | None = None
88
91
 
89
92
 
90
93
  class IndexInfoOutput(BaseModel):
@@ -162,36 +165,40 @@ def _cocoindex_subprocess_env(project_root: Path) -> dict[str, str]:
162
165
  idx = os.environ.get("JAVA_CODEBASE_RAG_INDEX_DIR", "").strip()
163
166
  if idx:
164
167
  sub_env["JAVA_CODEBASE_RAG_INDEX_DIR"] = str(Path(idx).expanduser().resolve())
168
+ # Cap CocoIndex concurrency to avoid EMFILE ("too many open files") under
169
+ # default OS fd limits. See: https://github.com/HumanBean17/java-codebase-rag/issues/306
170
+ for _k, _v in cocoindex_subprocess_env_defaults().items():
171
+ sub_env.setdefault(_k, _v)
165
172
  return sub_env
166
173
 
167
174
 
168
175
  def _graph_enabled() -> bool:
169
- return KuzuGraph.exists()
176
+ return LadybugGraph.exists()
170
177
 
171
178
 
172
179
  def _graph_meta_output() -> GraphMetaOutput:
173
- if not KuzuGraph.exists():
180
+ if not LadybugGraph.exists():
174
181
  return GraphMetaOutput(
175
182
  success=True,
176
183
  enabled=False,
177
- db_path=resolve_kuzu_path(),
178
- message="Kuzu graph not present; run java-codebase-rag reprocess or build_ast_graph.py",
184
+ db_path=resolve_ladybug_path(),
185
+ message="Ladybug graph not present; run java-codebase-rag reprocess or build_ast_graph.py",
179
186
  )
180
187
  try:
181
- graph = KuzuGraph.get()
188
+ graph = LadybugGraph.get()
182
189
  meta = graph.meta()
183
190
  except Exception as e:
184
191
  return GraphMetaOutput(
185
192
  success=False,
186
193
  enabled=_graph_enabled(),
187
- db_path=resolve_kuzu_path(),
188
- message=f"Kuzu open failed: {e}",
194
+ db_path=resolve_ladybug_path(),
195
+ message=f"Ladybug open failed: {e}",
189
196
  )
190
197
  if "error" in meta:
191
198
  return GraphMetaOutput(
192
199
  success=False,
193
200
  enabled=_graph_enabled(),
194
- db_path=meta.get("db_path", resolve_kuzu_path()),
201
+ db_path=meta.get("db_path", resolve_ladybug_path()),
195
202
  message=str(meta["error"]),
196
203
  )
197
204
  try:
@@ -209,7 +216,7 @@ def _graph_meta_output() -> GraphMetaOutput:
209
216
  return GraphMetaOutput(
210
217
  success=True,
211
218
  enabled=_graph_enabled(),
212
- db_path=meta.get("db_path", resolve_kuzu_path()),
219
+ db_path=meta.get("db_path", resolve_ladybug_path()),
213
220
  ontology_version=int(meta.get("ontology_version") or 0),
214
221
  built_at=int(meta.get("built_at") or 0),
215
222
  source_root=str(meta.get("source_root") or ""),
@@ -323,9 +330,29 @@ async def run_refresh_pipeline(*, quiet: bool = False, verbose: bool = True) ->
323
330
  graph_code: int | None = None
324
331
  graph_out = ""
325
332
  graph_err = ""
333
+ optimize_error: str | None = None
326
334
  if ok:
327
335
  if not quiet:
328
336
  print(file=sys.stderr, flush=True)
337
+ # Serialized post-flow Lance optimize: the flow disabled its background
338
+ # optimize, so with cocoindex returned exit 0 there are no concurrent
339
+ # writers — this is the safe window to compact. An optimize failure is
340
+ # surfaced via optimize_error / stderr and must NOT flip the success of
341
+ # a vectors phase that succeeded; the index is still searchable.
342
+ try:
343
+ from java_codebase_rag.lance_optimize import optimize_lance_tables
344
+
345
+ idx_raw = os.environ.get("JAVA_CODEBASE_RAG_INDEX_DIR", "").strip()
346
+ if idx_raw and not idx_raw.startswith(("s3://", "gs://", "az://")):
347
+ idx_dir = Path(idx_raw).expanduser().resolve()
348
+ elif idx_raw:
349
+ idx_dir = Path(idx_raw)
350
+ else:
351
+ idx_dir = (root / ".java-codebase-rag").resolve()
352
+ await optimize_lance_tables(idx_dir, quiet=quiet)
353
+ except Exception as exc:
354
+ optimize_error = f"lance optimize failed: {exc}"
355
+ print(f"java-codebase-rag: {optimize_error}", file=sys.stderr)
329
356
  builder = Path(__file__).resolve().parent / "build_ast_graph.py"
330
357
  if builder.is_file():
331
358
  try:
@@ -334,8 +361,8 @@ async def run_refresh_pipeline(*, quiet: bool = False, verbose: bool = True) ->
334
361
  str(builder),
335
362
  "--source-root",
336
363
  str(root),
337
- "--kuzu-path",
338
- resolve_kuzu_path(),
364
+ "--ladybug-path",
365
+ resolve_ladybug_path(),
339
366
  ]
340
367
  if not quiet:
341
368
  graph_args.append("--verbose")
@@ -362,6 +389,10 @@ async def run_refresh_pipeline(*, quiet: bool = False, verbose: bool = True) ->
362
389
  message = f"cocoindex exit {proc.returncode}"
363
390
  elif graph_code is not None and graph_code != 0:
364
391
  message = f"graph builder exit {graph_code}"
392
+ # Surface a post-flow optimize failure in the message too (success is not
393
+ # flipped — the vectors phase succeeded and the index is still usable).
394
+ if optimize_error is not None:
395
+ message = optimize_error if message is None else f"{message}; {optimize_error}"
365
396
  return RefreshIndexOutput(
366
397
  success=ok and (graph_code is None or graph_code == 0),
367
398
  exit_code=proc.returncode,
@@ -372,6 +403,7 @@ async def run_refresh_pipeline(*, quiet: bool = False, verbose: bool = True) ->
372
403
  graph_stdout=graph_out[-4000:] if len(graph_out) > 4000 else graph_out,
373
404
  graph_stderr=graph_err[-4000:] if len(graph_err) > 4000 else graph_err,
374
405
  phases_run=phases_run,
406
+ optimize_error=optimize_error,
375
407
  )
376
408
 
377
409
 
@@ -619,6 +651,7 @@ def create_mcp_server() -> FastMCP:
619
651
 
620
652
 
621
653
  def main() -> None:
654
+ raise_fd_limit()
622
655
  emit_legacy_env_hints_if_present()
623
656
 
624
657
  # Load YAML config and apply embedding settings to environment
@@ -1,31 +0,0 @@
1
- ast_java.py,sha256=OKoH7oX6L7AEEd6UY-spK8BPtWYY1T_4esrTC5VtoK8,98881
2
- brownfield_events.py,sha256=yxXkKDgMb3VPtaiakGzncHM_EGnda8xIue6w90yYp8s,2055
3
- build_ast_graph.py,sha256=1uqgFK2ebBdEc2QcAYK5vU4afOb95jU3zht5FracCkI,148683
4
- chunk_heuristics.py,sha256=aQk2NOKxzUdqoUAJUO3G3LE0MN_bYZWNLQ0tkmj5uts,1813
5
- graph_enrich.py,sha256=m3cksCHLqLHhA0Y-TLodbm09YfSJZjlTDN0Z51DiP2c,63317
6
- index_common.py,sha256=HT6FKHFJ084eFvd3fR1j8z8gf4eWoPHVW8GXLpw464I,285
7
- java_index_flow_lancedb.py,sha256=LMmfMSdE2d-ujxuJ2-hss7BhkrUMxHNyZuqsiGITuAI,12057
8
- java_index_v1_common.py,sha256=nF1KrSqboF_RRvWerG9knRRFmWwsrG_CvhgnsoZ8KqA,1154
9
- java_ontology.py,sha256=nM-oY8_91rmUudv9hAss1AMus9BFY9s5tTpAWjlCz00,16424
10
- kuzu_queries.py,sha256=9bQzrU311AOw_BcUp_KSGiZgPVSaLSU7y63XfcT_vqI,90137
11
- mcp_hints.py,sha256=3swh05LSiWur3tm3-yssndBsLxIxFhy501kBtJI8jJ0,42509
12
- mcp_v2.py,sha256=JFe62sYzJ2XiE6L3wAH8XG9_Ya2oOeJQ_hkiTmXFnSE,79065
13
- path_filtering.py,sha256=-oX16SYLWYwX9pcV1fu3vbVTIhY1GzFflT7J1E2tqPY,17122
14
- pr_analysis.py,sha256=Zaq90xYgMgrReV3vCGcFhOkK61gIRMAAIgs7ev-rJG4,18410
15
- search_lancedb.py,sha256=-XgtpbJ_3zDLiZ_vGKXjaLpl7RlvgyzUb7oAGoWkXO0,36754
16
- server.py,sha256=c4Bo0FXPoKP2AwIVP_wiv0XENkmKchLHf0QrQPUUgq4,28645
17
- java_codebase_rag/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
18
- java_codebase_rag/cli.py,sha256=WW-DsskSGr-d0JXBLkj4IdAa2OsAcLz5e54_DWvD9Sk,33872
19
- java_codebase_rag/cli_format.py,sha256=arU7P9W6Fvm7X_wzR1wJ8EfyxK1rDP_ESEhdA0ub4Mo,2579
20
- java_codebase_rag/cli_progress.py,sha256=9jCqEagYOXs32SYVA31_sOCrONvYy7cl1CrdBD2Pg44,3168
21
- java_codebase_rag/config.py,sha256=1BkRQsdY2ohZ8IWmbTG3WHgotVVUIrRTN537A1QAoCQ,15352
22
- java_codebase_rag/installer.py,sha256=flj330ZPSBrO2iw_yuNFBILHOTVbarMufYwqjZ8JzN0,42778
23
- java_codebase_rag/pipeline.py,sha256=nMXwX9r7HG9yPstrm7y_vfOMUZuDmw5_1lJTAfR-jwI,9488
24
- java_codebase_rag/install_data/agents/explorer-rag-enhanced.md,sha256=APl9d-No12qZNZLjU7mwNRwxHIgnT3ZtQZiD4clWlyU,14413
25
- java_codebase_rag/install_data/skills/explore-codebase/SKILL.md,sha256=pIM-Xdwq_fXkhhBJCdb-fA2nes5c_mMPcdUXb7Adyxo,12040
26
- java_codebase_rag-0.5.2.dist-info/licenses/LICENSE,sha256=gxvtiHtuviR_q8ZAjWw-QTcF3DyPzg6ZY-lQrr8OPpw,1068
27
- java_codebase_rag-0.5.2.dist-info/METADATA,sha256=LrlQYmOpTRNtx7q4-sr2yO8dCc5RHy4FgDY5GzvsoR8,16807
28
- java_codebase_rag-0.5.2.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
29
- java_codebase_rag-0.5.2.dist-info/entry_points.txt,sha256=mVVQJa0n73OWfhHXYCDoPRrWin_LJhH2Rn0CkJ2iax4,101
30
- java_codebase_rag-0.5.2.dist-info/top_level.txt,sha256=5aIYoMkvJvvfXvf4iHn2OeSIM7PZXP-0j94eNESnwMw,242
31
- java_codebase_rag-0.5.2.dist-info/RECORD,,