agent-codinglanguage-mapper 1.1.2__tar.gz → 1.1.4__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 (230) hide show
  1. {agent_codinglanguage_mapper-1.1.2/src/agent_codinglanguage_mapper.egg-info → agent_codinglanguage_mapper-1.1.4}/PKG-INFO +7 -1
  2. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/README.md +6 -0
  3. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/pyproject.toml +1 -1
  4. agent_codinglanguage_mapper-1.1.4/src/agent_codinglanguage_mapper/_version.py +1 -0
  5. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/src/agent_codinglanguage_mapper/indexer.py +86 -62
  6. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/src/agent_codinglanguage_mapper/mapper.py +33 -22
  7. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4/src/agent_codinglanguage_mapper.egg-info}/PKG-INFO +7 -1
  8. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/test_indexer.py +115 -137
  9. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/test_package_contract.py +8 -12
  10. agent_codinglanguage_mapper-1.1.2/src/agent_codinglanguage_mapper/_version.py +0 -1
  11. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/.github/workflows/ci.yml +0 -0
  12. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/LICENSE +0 -0
  13. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/MANIFEST.in +0 -0
  14. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/scripts/audit_language_matrix.py +0 -0
  15. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/scripts/benchmark_large_workspaces.py +0 -0
  16. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/scripts/build_github_performance_corpus.py +0 -0
  17. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/scripts/evaluate_external_corpora.py +0 -0
  18. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/scripts/generate_language_matrix.py +0 -0
  19. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/scripts/run_opencode_e2e.py +0 -0
  20. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/scripts/run_openrouter_e2e.py +0 -0
  21. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/setup.cfg +0 -0
  22. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/src/agent_codinglanguage_mapper/__init__.py +0 -0
  23. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/src/agent_codinglanguage_mapper/__main__.py +0 -0
  24. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/src/agent_codinglanguage_mapper/adapters/__init__.py +0 -0
  25. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/src/agent_codinglanguage_mapper/adapters/delphi.py +0 -0
  26. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/src/agent_codinglanguage_mapper/adapters/delphi_frontend/__init__.py +0 -0
  27. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/src/agent_codinglanguage_mapper/adapters/delphi_frontend/comment_builder.py +0 -0
  28. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/src/agent_codinglanguage_mapper/adapters/delphi_frontend/consts.py +0 -0
  29. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/src/agent_codinglanguage_mapper/adapters/delphi_frontend/grammar.py +0 -0
  30. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/src/agent_codinglanguage_mapper/adapters/delphi_frontend/lark_builder.py +0 -0
  31. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/src/agent_codinglanguage_mapper/adapters/delphi_frontend/lark_tokens.py +0 -0
  32. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/src/agent_codinglanguage_mapper/adapters/delphi_frontend/lsp_server.py +0 -0
  33. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/src/agent_codinglanguage_mapper/adapters/delphi_frontend/nodes.py +0 -0
  34. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/src/agent_codinglanguage_mapper/adapters/delphi_frontend/parser.py +0 -0
  35. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/src/agent_codinglanguage_mapper/adapters/delphi_frontend/preprocessor.py +0 -0
  36. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/src/agent_codinglanguage_mapper/adapters/delphi_frontend/project_discovery.py +0 -0
  37. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/src/agent_codinglanguage_mapper/adapters/delphi_frontend/project_indexer.py +0 -0
  38. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/src/agent_codinglanguage_mapper/adapters/delphi_frontend/semantic.py +0 -0
  39. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/src/agent_codinglanguage_mapper/adapters/delphi_frontend/semantic_builder.py +0 -0
  40. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/src/agent_codinglanguage_mapper/adapters/delphi_frontend/source_reader.py +0 -0
  41. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/src/agent_codinglanguage_mapper/adapters/delphi_frontend/workspace.py +0 -0
  42. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/src/agent_codinglanguage_mapper/adapters/tree_sitter.py +0 -0
  43. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/src/agent_codinglanguage_mapper/cli.py +0 -0
  44. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/src/agent_codinglanguage_mapper/discovery.py +0 -0
  45. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/src/agent_codinglanguage_mapper/formatting.py +0 -0
  46. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/src/agent_codinglanguage_mapper/guidelines.py +0 -0
  47. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/src/agent_codinglanguage_mapper/integration.py +0 -0
  48. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/src/agent_codinglanguage_mapper/lsp_server.py +0 -0
  49. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/src/agent_codinglanguage_mapper/lsp_service.py +0 -0
  50. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/src/agent_codinglanguage_mapper/models.py +0 -0
  51. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/src/agent_codinglanguage_mapper/protocol.py +0 -0
  52. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/src/agent_codinglanguage_mapper/rendering.py +0 -0
  53. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/src/agent_codinglanguage_mapper/templates/opencode/agents/agent-codinglanguage-mapper.md +0 -0
  54. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/src/agent_codinglanguage_mapper/templates/opencode/plugins/codebase_map.ts +0 -0
  55. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/src/agent_codinglanguage_mapper/templates/skill/SKILL.md +0 -0
  56. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/src/agent_codinglanguage_mapper/worker.py +0 -0
  57. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/src/agent_codinglanguage_mapper/workspace.py +0 -0
  58. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/src/agent_codinglanguage_mapper.egg-info/SOURCES.txt +0 -0
  59. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/src/agent_codinglanguage_mapper.egg-info/dependency_links.txt +0 -0
  60. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/src/agent_codinglanguage_mapper.egg-info/entry_points.txt +0 -0
  61. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/src/agent_codinglanguage_mapper.egg-info/requires.txt +0 -0
  62. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/src/agent_codinglanguage_mapper.egg-info/top_level.txt +0 -0
  63. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/corpora.lock.json +0 -0
  64. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/e2e/runtime.lock.json +0 -0
  65. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/e2e/scenarios/cpp/golden.json +0 -0
  66. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/e2e/scenarios/cpp/prompt.txt +0 -0
  67. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/e2e/scenarios/cpp/workspace/src/cache.cpp +0 -0
  68. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/e2e/scenarios/csharp/golden.json +0 -0
  69. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/e2e/scenarios/csharp/prompt.txt +0 -0
  70. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/e2e/scenarios/csharp/workspace/src/RateService.cs +0 -0
  71. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/e2e/scenarios/delphi/golden.json +0 -0
  72. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/e2e/scenarios/delphi/prompt.txt +0 -0
  73. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/e2e/scenarios/delphi/workspace/src/InventoryService.pas +0 -0
  74. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/e2e/scenarios/guidelines/golden.json +0 -0
  75. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/e2e/scenarios/guidelines/prompt.txt +0 -0
  76. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/e2e/scenarios/guidelines/workspace/.editorconfig +0 -0
  77. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/e2e/scenarios/guidelines/workspace/src/sample.py +0 -0
  78. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/e2e/scenarios/mixed-ffi/golden.json +0 -0
  79. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/e2e/scenarios/mixed-ffi/prompt.txt +0 -0
  80. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/e2e/scenarios/mixed-ffi/workspace/CMakeLists.txt +0 -0
  81. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/e2e/scenarios/mixed-ffi/workspace/native/metrics.cpp +0 -0
  82. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/e2e/scenarios/mixed-ffi/workspace/python/metrics_bridge.py +0 -0
  83. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/e2e/scenarios/python/golden.json +0 -0
  84. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/e2e/scenarios/python/prompt.txt +0 -0
  85. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/e2e/scenarios/python/workspace/src/billing.py +0 -0
  86. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/e2e/scenarios/rust/golden.json +0 -0
  87. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/e2e/scenarios/rust/prompt.txt +0 -0
  88. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/e2e/scenarios/rust/workspace/src/lib.rs +0 -0
  89. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/delphi/legacy_snippets/DeprecatedOnConst.pas +0 -0
  90. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/delphi/legacy_snippets/VariantRecordFieldAttributes.pas +0 -0
  91. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/delphi/legacy_snippets/alignedrecords.pas +0 -0
  92. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/delphi/legacy_snippets/constset.pas +0 -0
  93. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/delphi/legacy_snippets/deprecatedtype.pas +0 -0
  94. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/delphi/legacy_snippets/dottedtypes.pas +0 -0
  95. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/delphi/legacy_snippets/endtoken.pas +0 -0
  96. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/delphi/legacy_snippets/experimentals.pas +0 -0
  97. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/delphi/legacy_snippets/externalfunction.pas +0 -0
  98. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/delphi/legacy_snippets/finalizationinitializationexports.pas +0 -0
  99. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/delphi/legacy_snippets/forwardoverloaded.pas +0 -0
  100. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/delphi/legacy_snippets/forwardwithoutsemicolon.pas +0 -0
  101. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/delphi/legacy_snippets/genericconstraints.pas +0 -0
  102. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/delphi/legacy_snippets/genericinterfacemethoddelegation.pas +0 -0
  103. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/delphi/legacy_snippets/implementsgenerictype.pas +0 -0
  104. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/delphi/legacy_snippets/include file2.inc +0 -0
  105. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/delphi/legacy_snippets/includefile.inc +0 -0
  106. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/delphi/legacy_snippets/includefile.pas +0 -0
  107. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/delphi/legacy_snippets/managedrecords.pas +0 -0
  108. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/delphi/legacy_snippets/messagemethod.pas +0 -0
  109. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/delphi/legacy_snippets/multiline.pas +0 -0
  110. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/delphi/legacy_snippets/nonalignedrecords.pas +0 -0
  111. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/delphi/legacy_snippets/numbers.pas +0 -0
  112. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/delphi/legacy_snippets/pointerchars.pas +0 -0
  113. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/delphi/legacy_snippets/properties.pas +0 -0
  114. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/delphi/legacy_snippets/strictvisibility.pas +0 -0
  115. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/delphi/legacy_snippets/tryexcept.pas +0 -0
  116. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/delphi/legacy_snippets/umlauts.pas +0 -0
  117. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/delphi/legacy_snippets/whitespacearoundifdefcondition.pas +0 -0
  118. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/delphi/library_demo.dpr +0 -0
  119. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/delphi/package_demo.dpk +0 -0
  120. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/delphi/program_demo.dpr +0 -0
  121. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/delphi/unit_advanced.pas +0 -0
  122. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/delphi/unit_attributes.pas +0 -0
  123. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/delphi/unit_basic.pas +0 -0
  124. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/delphi/unit_consumer.pas +0 -0
  125. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/delphi/unit_generics.pas +0 -0
  126. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/delphi/unit_inheritance.pas +0 -0
  127. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/delphi/unit_math.pas +0 -0
  128. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/delphi/unit_properties.pas +0 -0
  129. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/delphi/unit_sections.pas +0 -0
  130. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/delphi/unit_statements.pas +0 -0
  131. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/delphi/unit_types.pas +0 -0
  132. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/delphi/unit_unresolved.pas +0 -0
  133. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/delphi/unit_with.pas +0 -0
  134. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/polyglot/Legacy.csx +0 -0
  135. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/polyglot/Modern.cs +0 -0
  136. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/polyglot/legacy.hpp +0 -0
  137. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/polyglot/legacy.py +0 -0
  138. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/polyglot/legacy.rs +0 -0
  139. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/polyglot/modern.cpp +0 -0
  140. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/polyglot/modern.py +0 -0
  141. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/fixtures/polyglot/modern.rs +0 -0
  142. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/cpp/cpp-03.cpp +0 -0
  143. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/cpp/cpp-11.cpp +0 -0
  144. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/cpp/cpp-14.cpp +0 -0
  145. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/cpp/cpp-17.cpp +0 -0
  146. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/cpp/cpp-20.cpp +0 -0
  147. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/cpp/cpp-23.cpp +0 -0
  148. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/cpp/cpp-98.cpp +0 -0
  149. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/cpp/cpp-gnu-stable.cpp +0 -0
  150. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/cpp/cpp-msvc-stable.cpp +0 -0
  151. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/csharp/csharp-1.cs +0 -0
  152. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/csharp/csharp-10.cs +0 -0
  153. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/csharp/csharp-11.cs +0 -0
  154. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/csharp/csharp-12.cs +0 -0
  155. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/csharp/csharp-13.cs +0 -0
  156. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/csharp/csharp-14.cs +0 -0
  157. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/csharp/csharp-2.cs +0 -0
  158. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/csharp/csharp-3.cs +0 -0
  159. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/csharp/csharp-4.cs +0 -0
  160. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/csharp/csharp-5.cs +0 -0
  161. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/csharp/csharp-6.cs +0 -0
  162. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/csharp/csharp-7.cs +0 -0
  163. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/csharp/csharp-8.cs +0 -0
  164. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/csharp/csharp-9.cs +0 -0
  165. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/delphi/delphi-10-2006.pas +0 -0
  166. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/delphi/delphi-11-2007.pas +0 -0
  167. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/delphi/delphi-12-2009.pas +0 -0
  168. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/delphi/delphi-13-2010.pas +0 -0
  169. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/delphi/delphi-14-xe-2011.pas +0 -0
  170. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/delphi/delphi-15-xe2-2012.pas +0 -0
  171. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/delphi/delphi-16-xe3-2013.pas +0 -0
  172. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/delphi/delphi-17-xe4-2013.pas +0 -0
  173. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/delphi/delphi-18-xe5-2013.pas +0 -0
  174. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/delphi/delphi-19-xe6-2014.pas +0 -0
  175. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/delphi/delphi-20-xe7-2014.pas +0 -0
  176. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/delphi/delphi-21-xe8-2015.pas +0 -0
  177. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/delphi/delphi-22-10-seattle-2015.pas +0 -0
  178. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/delphi/delphi-23-10-1-berlin-2016.pas +0 -0
  179. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/delphi/delphi-24-10-2-tokyo-2017.pas +0 -0
  180. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/delphi/delphi-25-10-3-rio-2018.pas +0 -0
  181. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/delphi/delphi-26-10-4-sydney-2020.pas +0 -0
  182. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/delphi/delphi-27-11-alexandria-2021.pas +0 -0
  183. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/delphi/delphi-28-12-athens-2023.pas +0 -0
  184. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/delphi/delphi-29-13-florence-2024.pas +0 -0
  185. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/delphi/delphi-7-7.pas +0 -0
  186. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/delphi/delphi-8-8.pas +0 -0
  187. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/delphi/delphi-9-2005.pas +0 -0
  188. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/delphi/delphi-directives.pas +0 -0
  189. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/python/python-2-7.py +0 -0
  190. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/python/python-3-0.py +0 -0
  191. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/python/python-3-1.py +0 -0
  192. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/python/python-3-10.py +0 -0
  193. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/python/python-3-11.py +0 -0
  194. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/python/python-3-12.py +0 -0
  195. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/python/python-3-13.py +0 -0
  196. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/python/python-3-14.py +0 -0
  197. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/python/python-3-2.py +0 -0
  198. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/python/python-3-3.py +0 -0
  199. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/python/python-3-4.py +0 -0
  200. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/python/python-3-5.py +0 -0
  201. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/python/python-3-6.py +0 -0
  202. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/python/python-3-7.py +0 -0
  203. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/python/python-3-8.py +0 -0
  204. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/python/python-3-9.py +0 -0
  205. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/rust/rust-2015.rs +0 -0
  206. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/rust/rust-2018.rs +0 -0
  207. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/rust/rust-2021.rs +0 -0
  208. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/fixtures/rust/rust-2024.rs +0 -0
  209. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/language_matrix/matrix.json +0 -0
  210. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/test_adapters.py +0 -0
  211. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/test_cli.py +0 -0
  212. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/test_delphi_adapter.py +0 -0
  213. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/test_discovery.py +0 -0
  214. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/test_ffi.py +0 -0
  215. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/test_github_performance_corpus.py +0 -0
  216. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/test_guideline_formatting.py +0 -0
  217. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/test_guidelines.py +0 -0
  218. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/test_integration_install.py +0 -0
  219. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/test_language_matrix.py +0 -0
  220. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/test_large_files.py +0 -0
  221. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/test_lsp_server.py +0 -0
  222. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/test_lsp_service.py +0 -0
  223. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/test_mapper_details.py +0 -0
  224. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/test_opencode_e2e_harness.py +0 -0
  225. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/test_openrouter_e2e_harness.py +0 -0
  226. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/test_performance_harness.py +0 -0
  227. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/test_protocol.py +0 -0
  228. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/test_rendering.py +0 -0
  229. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/test_worker.py +0 -0
  230. {agent_codinglanguage_mapper-1.1.2 → agent_codinglanguage_mapper-1.1.4}/tests/test_workspace.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agent-codinglanguage-mapper
3
- Version: 1.1.2
3
+ Version: 1.1.4
4
4
  Summary: Agent-focused semantic mapping and language services for mixed-language codebases.
5
5
  Author: Dark Light
6
6
  License-Expression: MPL-2.0
@@ -106,6 +106,12 @@ Parser-native nodes are intentionally private. Ranges are zero-based and half-op
106
106
 
107
107
  `CodebaseMapper.open()` creates an outline index first. `inspect`, `focus`, and outgoing `callees`/`uses` traces load detail only for the selected source file. Incoming `references`/`callers`/`used_by` traces load the remaining workspace detail because their evidence can originate in any indexed file. Parsed detail and focus remain resident for the mapper session. The same optimized path is used for small and large files.
108
108
 
109
+ Batch consumers that only need the complete outline should use
110
+ `snapshot = CodebaseMapper.index(".")`. This one-shot path returns the same deterministic
111
+ `WorkspaceSnapshot` without retaining source buffers, parser outlines, or the interactive refresh
112
+ cache after indexing. It is intended for inventory and documentation pipelines over very large
113
+ repositories.
114
+
109
115
  The private session index retains each parser-native outline tree, its source buffer, a source digest, and a lightweight file fingerprint. A detail upgrade therefore queries the existing tree instead of rereading or reparsing every indexed source. When an indexed source changes during a worker session, the mapper rebuilds the outline snapshot, updates `workspace_revision`, clears stale detail/focus state, and invalidates old cursors before answering the next request. Parser-native nodes never appear in the public result types.
110
116
 
111
117
  ## CLI
@@ -59,6 +59,12 @@ Parser-native nodes are intentionally private. Ranges are zero-based and half-op
59
59
 
60
60
  `CodebaseMapper.open()` creates an outline index first. `inspect`, `focus`, and outgoing `callees`/`uses` traces load detail only for the selected source file. Incoming `references`/`callers`/`used_by` traces load the remaining workspace detail because their evidence can originate in any indexed file. Parsed detail and focus remain resident for the mapper session. The same optimized path is used for small and large files.
61
61
 
62
+ Batch consumers that only need the complete outline should use
63
+ `snapshot = CodebaseMapper.index(".")`. This one-shot path returns the same deterministic
64
+ `WorkspaceSnapshot` without retaining source buffers, parser outlines, or the interactive refresh
65
+ cache after indexing. It is intended for inventory and documentation pipelines over very large
66
+ repositories.
67
+
62
68
  The private session index retains each parser-native outline tree, its source buffer, a source digest, and a lightweight file fingerprint. A detail upgrade therefore queries the existing tree instead of rereading or reparsing every indexed source. When an indexed source changes during a worker session, the mapper rebuilds the outline snapshot, updates `workspace_revision`, clears stale detail/focus state, and invalidates old cursors before answering the next request. Parser-native nodes never appear in the public result types.
63
69
 
64
70
  ## CLI
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "agent-codinglanguage-mapper"
7
- version = "1.1.2"
7
+ version = "1.1.4"
8
8
  description = "Agent-focused semantic mapping and language services for mixed-language codebases."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10,<3.15"
@@ -54,10 +54,7 @@ class WorkspaceIndexCache:
54
54
  directories: tuple[tuple[str, int], ...] = ()
55
55
 
56
56
  def sources_changed(self, root: Path) -> bool:
57
- if any(
58
- not _dependencies_unchanged(cached.dependency_stamps)
59
- for cached in self.entries.values()
60
- ):
57
+ if any(not _dependencies_unchanged(cached.dependency_stamps) for cached in self.entries.values()):
61
58
  return True
62
59
  for relative, cached in self.entries.items():
63
60
  path = root / relative
@@ -83,6 +80,67 @@ class WorkspaceIndexCache:
83
80
  return new_inventory != self.inventory
84
81
 
85
82
 
83
+ def _deduplicate_parser_symbols(items: tuple[Symbol, ...]) -> tuple[Symbol, ...]:
84
+ """Collapse identical symbols and C/C++ aliases for one concrete declaration."""
85
+
86
+ def declaration_key(item: Symbol) -> tuple[str, str, int, int]:
87
+ anchor = item.name_range or item.range
88
+ return (
89
+ item.qualified_name,
90
+ anchor.path,
91
+ anchor.start_line,
92
+ anchor.start_character,
93
+ )
94
+
95
+ groups: dict[tuple[str, str, int, int], list[Symbol]] = defaultdict(list)
96
+ for item in items:
97
+ groups[declaration_key(item)].append(item)
98
+ emitted: set[tuple[str, str, int, int]] = set()
99
+ selected: list[Symbol] = []
100
+ concrete_kinds = {"class", "enum", "struct", "union"}
101
+ for item in items:
102
+ key = declaration_key(item)
103
+ if key in emitted:
104
+ continue
105
+ emitted.add(key)
106
+ group: list[Symbol] = []
107
+ identities: set[tuple[object, ...]] = set()
108
+ for candidate in groups[key]:
109
+ identity = (
110
+ candidate.name,
111
+ candidate.qualified_name,
112
+ candidate.kind,
113
+ candidate.language,
114
+ candidate.range,
115
+ candidate.project_id,
116
+ candidate.file_id,
117
+ candidate.signature,
118
+ candidate.native_kind,
119
+ candidate.parent_id,
120
+ candidate.name_range,
121
+ candidate.role,
122
+ )
123
+ if identity in identities:
124
+ continue
125
+ identities.add(identity)
126
+ group.append(candidate)
127
+ if group and group[0].language is Language.DELPHI:
128
+ logical: dict[tuple[str, str, str], Symbol] = {}
129
+ for candidate in group:
130
+ logical.setdefault(
131
+ (candidate.kind, candidate.role, candidate.parent_id),
132
+ candidate,
133
+ )
134
+ group = list(logical.values())
135
+ concrete = [candidate for candidate in group if candidate.kind in concrete_kinds]
136
+ aliases = [candidate for candidate in group if candidate.kind == "type_alias"]
137
+ if len(concrete) == 1 and aliases:
138
+ selected.append(concrete[0])
139
+ else:
140
+ selected.extend(group)
141
+ return tuple(selected)
142
+
143
+
86
144
  def build_workspace_snapshot(
87
145
  root: str | Path,
88
146
  languages: Iterable[Language] | None = None,
@@ -108,9 +166,7 @@ def build_workspace_snapshot(
108
166
  selected_detail_files = None if detail_files is None else {Path(item).as_posix() for item in detail_files}
109
167
  incremental_detail = base_snapshot is not None and selected_detail_files is not None
110
168
  base_files_by_path = (
111
- {item.path: item for item in base_snapshot.files}
112
- if incremental_detail and base_snapshot is not None
113
- else {}
169
+ {item.path: item for item in base_snapshot.files} if incremental_detail and base_snapshot is not None else {}
114
170
  )
115
171
  base_references_by_path: dict[str, list[Reference]] = defaultdict(list)
116
172
  base_relations_by_path: dict[str, list[Relation]] = defaultdict(list)
@@ -137,9 +193,8 @@ def build_workspace_snapshot(
137
193
  for found in discovery.files:
138
194
  relative = found.path.relative_to(workspace).as_posix()
139
195
  include_detail = (
140
- (selected_detail_files is None or relative in selected_detail_files)
141
- and found.path.suffix.casefold() != ".inc"
142
- )
196
+ selected_detail_files is None or relative in selected_detail_files
197
+ ) and found.path.suffix.casefold() != ".inc"
143
198
  file_id = stable_id("file", found.project_id, relative)
144
199
  project = projects_by_id[found.project_id]
145
200
  delphi_config: DelphiProjectDiscovery | None = None
@@ -271,11 +326,7 @@ def build_workspace_snapshot(
271
326
  else:
272
327
  adapter = pooled_adapter
273
328
  outline = adapter.parse_outline(relative, source)
274
- result = (
275
- adapter.resolve(adapter.parse_detail(relative, source, outline))
276
- if include_detail
277
- else outline
278
- )
329
+ result = adapter.resolve(adapter.parse_detail(relative, source, outline)) if include_detail else outline
279
330
  if index_cache is not None:
280
331
  index_cache.entries[relative] = _CachedParse(
281
332
  found.project_id,
@@ -292,8 +343,9 @@ def build_workspace_snapshot(
292
343
  )
293
344
  active_cache_paths.add(relative)
294
345
  source_digests.append((relative, source_digest))
346
+ parsed_symbols = _deduplicate_parser_symbols(result.symbols)
295
347
  normalized_symbols_list: list[Symbol] = []
296
- for parsed_symbol in result.symbols:
348
+ for parsed_symbol in parsed_symbols:
297
349
  normalized_range = _workspace_required_range(
298
350
  workspace,
299
351
  parsed_symbol.range,
@@ -304,10 +356,7 @@ def build_workspace_snapshot(
304
356
  parsed_symbol.name_range,
305
357
  workspace_path_cache,
306
358
  )
307
- if (
308
- normalized_range is parsed_symbol.range
309
- and normalized_name_range is parsed_symbol.name_range
310
- ):
359
+ if normalized_range is parsed_symbol.range and normalized_name_range is parsed_symbol.name_range:
311
360
  normalized_symbols_list.append(parsed_symbol)
312
361
  else:
313
362
  normalized_symbols_list.append(
@@ -320,7 +369,7 @@ def build_workspace_snapshot(
320
369
  normalized_symbols = tuple(normalized_symbols_list)
321
370
  ids = {
322
371
  parsed_symbol.target_id: _workspace_symbol_id(found.project_id, file_id, normalized)
323
- for parsed_symbol, normalized in zip(result.symbols, normalized_symbols)
372
+ for parsed_symbol, normalized in zip(parsed_symbols, normalized_symbols)
324
373
  }
325
374
  symbols.extend(
326
375
  Symbol(
@@ -338,7 +387,7 @@ def build_workspace_snapshot(
338
387
  normalized.name_range,
339
388
  parsed_symbol.role,
340
389
  )
341
- for parsed_symbol, normalized in zip(result.symbols, normalized_symbols)
390
+ for parsed_symbol, normalized in zip(parsed_symbols, normalized_symbols)
342
391
  )
343
392
  for reference in result.references:
344
393
  source_id = ids.get(reference.source_id, "")
@@ -363,7 +412,7 @@ def build_workspace_snapshot(
363
412
  range=normalized_range,
364
413
  )
365
414
  )
366
- local_symbols_by_id = {parsed_symbol.target_id: parsed_symbol for parsed_symbol in result.symbols}
415
+ local_symbols_by_id = {parsed_symbol.target_id: parsed_symbol for parsed_symbol in parsed_symbols}
367
416
  for relation in result.relations:
368
417
  relation_library = relation.target_library
369
418
  relation_source = local_symbols_by_id.get(relation.source_id)
@@ -382,14 +431,12 @@ def build_workspace_snapshot(
382
431
  target_id=ids.get(relation.target_id, ""),
383
432
  target_library=relation_library,
384
433
  evidence=tuple(
385
- _workspace_required_range(workspace, value, workspace_path_cache)
386
- for value in relation.evidence
434
+ _workspace_required_range(workspace, value, workspace_path_cache) for value in relation.evidence
387
435
  ),
388
436
  )
389
437
  )
390
438
  problems.extend(
391
- _workspace_problem(workspace, problem, relative, workspace_path_cache)
392
- for problem in result.problems
439
+ _workspace_problem(workspace, problem, relative, workspace_path_cache) for problem in result.problems
393
440
  )
394
441
 
395
442
  inventory = workspace_inventory(workspace, scan=scan)
@@ -415,11 +462,7 @@ def build_workspace_snapshot(
415
462
  relations=resolved_relations,
416
463
  problems=tuple(problems),
417
464
  source_digests=tuple(source_digests),
418
- metadata_digests=tuple(
419
- (relative, digest)
420
- for relative, _modified, _size, digest in inventory
421
- if digest
422
- ),
465
+ metadata_digests=tuple((relative, digest) for relative, _modified, _size, digest in inventory if digest),
423
466
  )
424
467
 
425
468
 
@@ -554,24 +597,16 @@ def _discard_shadowed_fragment_results(
554
597
  and owner_path == anchor.path
555
598
  and (
556
599
  source_key(symbol) in contextual_keys
557
- or (
558
- symbol.language is Language.DELPHI
559
- and symbol.kind == "unit"
560
- and symbol.name_range is None
561
- )
600
+ or (symbol.language is Language.DELPHI and symbol.kind == "unit" and symbol.name_range is None)
562
601
  )
563
602
  ):
564
603
  discarded_ids.add(symbol.target_id)
565
604
  kept_symbols = [item for item in symbols if item.target_id not in discarded_ids]
566
605
  kept_references = [
567
- item
568
- for item in references
569
- if item.source_id not in discarded_ids and item.target_id not in discarded_ids
606
+ item for item in references if item.source_id not in discarded_ids and item.target_id not in discarded_ids
570
607
  ]
571
608
  kept_relations = [
572
- item
573
- for item in relations
574
- if item.source_id not in discarded_ids and item.target_id not in discarded_ids
609
+ item for item in relations if item.source_id not in discarded_ids and item.target_id not in discarded_ids
575
610
  ]
576
611
  return kept_symbols, kept_references, kept_relations
577
612
 
@@ -624,6 +659,7 @@ def _workspace_symbol_id(project_id: str, file_id: str, symbol: Symbol) -> str:
624
659
  "symbol",
625
660
  project_id,
626
661
  file_id,
662
+ anchor.path,
627
663
  symbol.qualified_name,
628
664
  str(anchor.start_line),
629
665
  str(anchor.start_character),
@@ -768,21 +804,15 @@ def _resolve_workspace(
768
804
  and _is_abi_export_symbol(source)
769
805
  and all(
770
806
  item.target_id != source.target_id
771
- for item in abi_exports[
772
- (_normalize_library(relation.target_library), relation.target_name)
773
- ]
807
+ for item in abi_exports[(_normalize_library(relation.target_library), relation.target_name)]
774
808
  )
775
809
  ):
776
810
  library = _normalize_library(relation.target_library)
777
811
  if library:
778
812
  abi_exports[(library, relation.target_name)].append(source)
779
813
 
780
- resolved_references = tuple(
781
- _resolve_reference(item, by_name, by_id, visibility) for item in references
782
- )
783
- resolved_relations = tuple(
784
- _resolve_relation(item, by_name, abi_exports, by_id, visibility) for item in relations
785
- )
814
+ resolved_references = tuple(_resolve_reference(item, by_name, by_id, visibility) for item in references)
815
+ resolved_relations = tuple(_resolve_relation(item, by_name, abi_exports, by_id, visibility) for item in relations)
786
816
  return resolved_references, resolved_relations
787
817
 
788
818
 
@@ -924,11 +954,7 @@ def _workspace_visibility(
924
954
  visibility: list[_ImportRule] = []
925
955
  for reference in references:
926
956
  owner = by_id.get(reference.source_id)
927
- if (
928
- owner is None
929
- or reference.reference_kind != "import"
930
- or owner.kind not in {"module", "namespace", "unit"}
931
- ):
957
+ if owner is None or reference.reference_kind != "import" or owner.kind not in {"module", "namespace", "unit"}:
932
958
  continue
933
959
  visibility.append(
934
960
  _ImportRule(
@@ -1009,7 +1035,7 @@ def _csharp_namespace(symbol: Symbol, by_id: dict[str, Symbol]) -> str:
1009
1035
  if current.kind == "namespace":
1010
1036
  qualified = current.qualified_name
1011
1037
  module_prefix = f"{PurePosixPath(current.range.path).stem}."
1012
- return qualified[len(module_prefix):] if qualified.startswith(module_prefix) else qualified
1038
+ return qualified[len(module_prefix) :] if qualified.startswith(module_prefix) else qualified
1013
1039
  current = by_id.get(current.parent_id)
1014
1040
  return ""
1015
1041
 
@@ -1053,7 +1079,7 @@ def _rule_exposes_candidate(
1053
1079
  qualifier_parts = normalized_qualifier.split(".")
1054
1080
  alias_parts = normalized_alias.split(".")
1055
1081
  if qualifier_parts[: len(alias_parts)] == alias_parts and module_matches:
1056
- remainder = ".".join(qualifier_parts[len(alias_parts):])
1082
+ remainder = ".".join(qualifier_parts[len(alias_parts) :])
1057
1083
  return not remainder or _candidate_parent_scope(candidate, by_id).endswith(remainder)
1058
1084
 
1059
1085
  if not rule.wildcard or not module_matches:
@@ -1065,9 +1091,7 @@ def _rule_exposes_candidate(
1065
1091
 
1066
1092
  candidate_parent = _candidate_parent_scope(candidate, by_id)
1067
1093
  if normalized_qualifier:
1068
- expected_parent = ".".join(
1069
- part for part in (rule.import_path, normalized_qualifier) if part
1070
- )
1094
+ expected_parent = ".".join(part for part in (rule.import_path, normalized_qualifier) if part)
1071
1095
  return candidate_parent == expected_parent
1072
1096
  if rule.module_alias:
1073
1097
  return candidate_parent == rule.import_path
@@ -141,7 +141,11 @@ class CodebaseMapper:
141
141
 
142
142
  @classmethod
143
143
  def open(cls, root: str | Path, languages: str | tuple[Language, ...] = "auto") -> "CodebaseMapper":
144
- selected = None if languages == "auto" else tuple(Language(item) if isinstance(item, str) else item for item in languages)
144
+ selected = (
145
+ None
146
+ if languages == "auto"
147
+ else tuple(Language(item) if isinstance(item, str) else item for item in languages)
148
+ )
145
149
  index_cache = WorkspaceIndexCache()
146
150
  return cls(
147
151
  root,
@@ -151,6 +155,26 @@ class CodebaseMapper:
151
155
  index_cache=index_cache,
152
156
  )
153
157
 
158
+ @classmethod
159
+ def index(
160
+ cls,
161
+ root: str | Path,
162
+ languages: str | tuple[Language, ...] = "auto",
163
+ ) -> WorkspaceSnapshot:
164
+ """Build a complete outline snapshot without retaining an interactive cache."""
165
+
166
+ selected = (
167
+ None
168
+ if languages == "auto"
169
+ else tuple(Language(item) if isinstance(item, str) else item for item in languages)
170
+ )
171
+ return build_workspace_snapshot(
172
+ root,
173
+ selected,
174
+ detail_files=(),
175
+ index_cache=None,
176
+ )
177
+
154
178
  def __enter__(self) -> "CodebaseMapper":
155
179
  return self
156
180
 
@@ -189,10 +213,7 @@ class CodebaseMapper:
189
213
  if (
190
214
  request.file_id
191
215
  and candidate.file_id != request.file_id
192
- and (
193
- requested_source is None
194
- or Path(candidate.range.path).as_posix() != requested_source.path
195
- )
216
+ and (requested_source is None or Path(candidate.range.path).as_posix() != requested_source.path)
196
217
  ):
197
218
  continue
198
219
  if request.languages and candidate.language not in request.languages:
@@ -273,11 +294,7 @@ class CodebaseMapper:
273
294
  )
274
295
 
275
296
  def _refresh_changed_sources(self) -> None:
276
- if (
277
- not self._lazy_details
278
- or self._index_cache is None
279
- or not self._index_cache.sources_changed(self.root)
280
- ):
297
+ if not self._lazy_details or self._index_cache is None or not self._index_cache.sources_changed(self.root):
281
298
  return
282
299
  self.snapshot = build_workspace_snapshot(
283
300
  self.root,
@@ -351,7 +368,7 @@ class CodebaseMapper:
351
368
  text_offset = self._decode_cursor(request)
352
369
  if text_offset > len(full_text) or (request.cursor and text_offset == len(full_text)):
353
370
  raise ProtocolError("cursor offset is invalid")
354
- item[text_key] = full_text[text_offset:text_offset + _SOURCE_CHUNK_CHARS]
371
+ item[text_key] = full_text[text_offset : text_offset + _SOURCE_CHUNK_CHARS]
355
372
  if text_key == "source":
356
373
  line_offset = full_text[:text_offset].count("\n")
357
374
  item["citation"] = f"{symbol.range.path}:{int(str(item['citation']).rsplit(':', 1)[1]) + line_offset}"
@@ -450,7 +467,7 @@ class CodebaseMapper:
450
467
  low = middle + 1
451
468
  else:
452
469
  high = middle - 1
453
- bounded[detail_key] = text[:max(0, high)]
470
+ bounded[detail_key] = text[: max(0, high)]
454
471
  return bounded
455
472
 
456
473
  for key in ("kind", "role", "project_id", "file_id", "qualified_name", "signature"):
@@ -487,9 +504,7 @@ class CodebaseMapper:
487
504
  selected = [item for item in references if item.target_id in request_target_id_set]
488
505
  return self._page_response(request, [_reference_mapping(item) for item in selected])
489
506
  if relation in {"callers", "used_by"}:
490
- target_ids = {
491
- item.source_id for item in references if item.target_id in request_target_id_set
492
- }
507
+ target_ids = {item.source_id for item in references if item.target_id in request_target_id_set}
493
508
  target_ids.update(
494
509
  item.source_id
495
510
  for item in self.snapshot.relations
@@ -501,16 +516,12 @@ class CodebaseMapper:
501
516
  return self._page_response(request, [_symbol_mapping(item) for item in caller_symbols])
502
517
  if relation in {"callees", "uses"}:
503
518
  target_ids = {
504
- item.target_id
505
- for item in references
506
- if item.source_id in request_target_id_set and item.target_id
519
+ item.target_id for item in references if item.source_id in request_target_id_set and item.target_id
507
520
  }
508
521
  target_ids.update(
509
522
  item.target_id
510
523
  for item in self.snapshot.relations
511
- if relation == "uses"
512
- and item.source_id in request_target_id_set
513
- and item.target_id
524
+ if relation == "uses" and item.source_id in request_target_id_set and item.target_id
514
525
  )
515
526
  callee_symbols = [
516
527
  self.snapshot.symbols_by_id[item] for item in target_ids if item in self.snapshot.symbols_by_id
@@ -545,7 +556,7 @@ class CodebaseMapper:
545
556
  start = self._decode_cursor(request)
546
557
  selected: list[dict[str, object]] = []
547
558
  used = 0
548
- for item in items[start:start + request.max_items]:
559
+ for item in items[start : start + request.max_items]:
549
560
  size = len(json.dumps(item, sort_keys=True, separators=(",", ":")))
550
561
  if used + size > request.max_chars:
551
562
  if not selected:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agent-codinglanguage-mapper
3
- Version: 1.1.2
3
+ Version: 1.1.4
4
4
  Summary: Agent-focused semantic mapping and language services for mixed-language codebases.
5
5
  Author: Dark Light
6
6
  License-Expression: MPL-2.0
@@ -106,6 +106,12 @@ Parser-native nodes are intentionally private. Ranges are zero-based and half-op
106
106
 
107
107
  `CodebaseMapper.open()` creates an outline index first. `inspect`, `focus`, and outgoing `callees`/`uses` traces load detail only for the selected source file. Incoming `references`/`callers`/`used_by` traces load the remaining workspace detail because their evidence can originate in any indexed file. Parsed detail and focus remain resident for the mapper session. The same optimized path is used for small and large files.
108
108
 
109
+ Batch consumers that only need the complete outline should use
110
+ `snapshot = CodebaseMapper.index(".")`. This one-shot path returns the same deterministic
111
+ `WorkspaceSnapshot` without retaining source buffers, parser outlines, or the interactive refresh
112
+ cache after indexing. It is intended for inventory and documentation pipelines over very large
113
+ repositories.
114
+
109
115
  The private session index retains each parser-native outline tree, its source buffer, a source digest, and a lightweight file fingerprint. A detail upgrade therefore queries the existing tree instead of rereading or reparsing every indexed source. When an indexed source changes during a worker session, the mapper rebuilds the outline snapshot, updates `workspace_revision`, clears stale detail/focus state, and invalidates old cursors before answering the next request. Parser-native nodes never appear in the public result types.
110
116
 
111
117
  ## CLI