python-delphi-lsp 2.3.2__tar.gz → 3.0.0__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 (158) hide show
  1. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/MANIFEST.in +1 -0
  2. {python_delphi_lsp-2.3.2/python_delphi_lsp.egg-info → python_delphi_lsp-3.0.0}/PKG-INFO +60 -18
  3. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/README.md +59 -17
  4. python_delphi_lsp-3.0.0/delphi_lsp/_version.py +1 -0
  5. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/agent_cache.py +200 -48
  6. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/agent_cli.py +42 -6
  7. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/agent_context.py +205 -1
  8. python_delphi_lsp-3.0.0/delphi_lsp/agent_cpg.py +350 -0
  9. python_delphi_lsp-3.0.0/delphi_lsp/agent_cpg_builder.py +667 -0
  10. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/agent_protocol.py +57 -3
  11. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/agent_templates.py +20 -13
  12. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/pyproject.toml +1 -1
  13. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0/python_delphi_lsp.egg-info}/PKG-INFO +60 -18
  14. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/python_delphi_lsp.egg-info/SOURCES.txt +4 -0
  15. python_delphi_lsp-3.0.0/scripts/benchmark_cpg.py +376 -0
  16. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/scripts/benchmark_github_corpus.py +1 -1
  17. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/scripts/run_openrouter_github_e2e.py +1 -1
  18. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_agent_cache.py +163 -6
  19. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_agent_codebase.py +9 -4
  20. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_agent_context.py +132 -0
  21. python_delphi_lsp-3.0.0/tests/test_agent_cpg.py +581 -0
  22. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_agent_protocol.py +22 -5
  23. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_agent_worker.py +93 -22
  24. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_github_performance_corpus.py +34 -0
  25. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_lsp_support.py +1 -1
  26. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_openrouter_github_e2e.py +5 -5
  27. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_package_metadata.py +30 -5
  28. python_delphi_lsp-2.3.2/delphi_lsp/_version.py +0 -1
  29. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/.github/workflows/ci.yml +0 -0
  30. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/LICENSE +0 -0
  31. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/__init__.py +0 -0
  32. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/agent_layers.py +0 -0
  33. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/agent_metrics.py +0 -0
  34. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/agent_relations.py +0 -0
  35. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/agent_workspace.py +0 -0
  36. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/binary.py +0 -0
  37. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/comment_builder.py +0 -0
  38. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/consts.py +0 -0
  39. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/delphiast_lexer.py +0 -0
  40. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/delphiast_parser.py +0 -0
  41. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/delphiast_tokens.py +0 -0
  42. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/grammar.py +0 -0
  43. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/lark_builder.py +0 -0
  44. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/lark_tokens.py +0 -0
  45. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/lsp_server.py +0 -0
  46. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/metrics.py +0 -0
  47. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/navigation_cache.py +0 -0
  48. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/nodes.py +0 -0
  49. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/parallel_outline.py +0 -0
  50. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/parser.py +0 -0
  51. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/parser_backend.py +0 -0
  52. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/preprocessor.py +0 -0
  53. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/progress.py +0 -0
  54. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/project_discovery.py +0 -0
  55. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/project_indexer.py +0 -0
  56. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/semantic.py +0 -0
  57. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/semantic_builder.py +0 -0
  58. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/source_reader.py +0 -0
  59. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/workspace.py +0 -0
  60. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/delphi_lsp/writer.py +0 -0
  61. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/opencode.json +0 -0
  62. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/python_delphi_lsp.egg-info/dependency_links.txt +0 -0
  63. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/python_delphi_lsp.egg-info/entry_points.txt +0 -0
  64. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/python_delphi_lsp.egg-info/requires.txt +0 -0
  65. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/python_delphi_lsp.egg-info/top_level.txt +0 -0
  66. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/scripts/audit_delphi_language_features.py +0 -0
  67. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/scripts/benchmark_parallel_cache.py +0 -0
  68. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/scripts/bootstrap_vllm_codebase_skill_test.py +0 -0
  69. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/scripts/bootstrap_vllm_opencode_test.ps1 +0 -0
  70. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/scripts/bootstrap_vllm_opencode_test.py +0 -0
  71. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/scripts/bootstrap_vllm_opencode_test.sh +0 -0
  72. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/scripts/build_github_performance_corpus.py +0 -0
  73. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/scripts/check_ornith_cache.py +0 -0
  74. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/scripts/generate_progress_pdf.py +0 -0
  75. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/scripts/generate_release_evidence.py +0 -0
  76. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/scripts/ollama/ornith-lspctx.Modelfile +0 -0
  77. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/scripts/prepare_ornith_cache.py +0 -0
  78. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/scripts/run_opencode_lsp_probe.py +0 -0
  79. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/scripts/start_ornith_vllm.sh +0 -0
  80. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/scripts/summarize_opencode_request_payloads.py +0 -0
  81. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/setup.cfg +0 -0
  82. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/corpora.performance.lock.json +0 -0
  83. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/DeprecatedOnConst.pas +0 -0
  84. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/VariantRecordFieldAttributes.pas +0 -0
  85. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/alignedrecords.pas +0 -0
  86. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/constset.pas +0 -0
  87. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/deprecatedtype.pas +0 -0
  88. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/dottedtypes.pas +0 -0
  89. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/endtoken.pas +0 -0
  90. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/experimentals.pas +0 -0
  91. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/externalfunction.pas +0 -0
  92. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/finalizationinitializationexports.pas +0 -0
  93. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/forwardoverloaded.pas +0 -0
  94. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/forwardwithoutsemicolon.pas +0 -0
  95. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/genericconstraints.pas +0 -0
  96. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/genericinterfacemethoddelegation.pas +0 -0
  97. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/implementsgenerictype.pas +0 -0
  98. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/include file2.inc +0 -0
  99. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/includefile.inc +0 -0
  100. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/includefile.pas +0 -0
  101. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/managedrecords.pas +0 -0
  102. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/messagemethod.pas +0 -0
  103. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/multiline.pas +0 -0
  104. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/nonalignedrecords.pas +0 -0
  105. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/numbers.pas +0 -0
  106. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/pointerchars.pas +0 -0
  107. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/properties.pas +0 -0
  108. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/strictvisibility.pas +0 -0
  109. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/tryexcept.pas +0 -0
  110. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/umlauts.pas +0 -0
  111. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/legacy_snippets/whitespacearoundifdefcondition.pas +0 -0
  112. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/library_demo.dpr +0 -0
  113. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/package_demo.dpk +0 -0
  114. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/program_demo.dpr +0 -0
  115. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/unit_advanced.pas +0 -0
  116. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/unit_attributes.pas +0 -0
  117. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/unit_basic.pas +0 -0
  118. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/unit_consumer.pas +0 -0
  119. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/unit_generics.pas +0 -0
  120. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/unit_inheritance.pas +0 -0
  121. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/unit_math.pas +0 -0
  122. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/unit_properties.pas +0 -0
  123. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/unit_sections.pas +0 -0
  124. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/unit_statements.pas +0 -0
  125. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/unit_types.pas +0 -0
  126. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/unit_unresolved.pas +0 -0
  127. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/fixtures/unit_with.pas +0 -0
  128. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_agent_cli_errors.py +0 -0
  129. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_agent_metrics.py +0 -0
  130. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_agent_relations.py +0 -0
  131. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_agent_workspace.py +0 -0
  132. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_bootstrap_vllm_codebase_skill.py +0 -0
  133. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_bootstrap_vllm_opencode.py +0 -0
  134. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_delphiast_lexer.py +0 -0
  135. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_delphiast_native_compatibility.py +0 -0
  136. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_delphiast_parser.py +0 -0
  137. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_delphiast_semantic_compatibility.py +0 -0
  138. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_diagnostics.py +0 -0
  139. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_language_feature_matrix.py +0 -0
  140. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_legacy_snippets.py +0 -0
  141. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_lsp_features.py +0 -0
  142. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_metrics.py +0 -0
  143. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_navigation_cache.py +0 -0
  144. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_opencode_config.py +0 -0
  145. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_opencode_probe.py +0 -0
  146. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_opencode_request_payloads.py +0 -0
  147. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_ornith_cache_prepare.py +0 -0
  148. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_parallel_outline.py +0 -0
  149. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_parser.py +0 -0
  150. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_parser_backends.py +0 -0
  151. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_preprocessor.py +0 -0
  152. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_progress.py +0 -0
  153. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_project_discovery.py +0 -0
  154. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_project_indexer.py +0 -0
  155. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_release_evidence.py +0 -0
  156. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_semantic.py +0 -0
  157. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_vllm_start_script.py +0 -0
  158. {python_delphi_lsp-2.3.2 → python_delphi_lsp-3.0.0}/tests/test_workspace.py +0 -0
@@ -6,6 +6,7 @@ include scripts/check_ornith_cache.py
6
6
  include scripts/audit_delphi_language_features.py
7
7
  include scripts/build_github_performance_corpus.py
8
8
  include scripts/benchmark_github_corpus.py
9
+ include scripts/benchmark_cpg.py
9
10
  include scripts/benchmark_parallel_cache.py
10
11
  include scripts/bootstrap_vllm_opencode_test.py
11
12
  include scripts/bootstrap_vllm_codebase_skill_test.py
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-delphi-lsp
3
- Version: 2.3.2
3
+ Version: 3.0.0
4
4
  Summary: Python Delphi/Object Pascal parser, semantic indexer, and language server.
5
5
  Author: Dark Light
6
6
  License-Expression: MPL-2.0
@@ -42,7 +42,7 @@ Dynamic: license-file
42
42
 
43
43
  `python-delphi-lsp` parses Delphi/Object Pascal, builds semantic and project
44
44
  indexes, serves LSP, and provides bounded codebase navigation for agents.
45
- Version 2.3.2 is authored by Dark Light and supports Windows, macOS, and Linux.
45
+ Version 3.0.0 is authored by Dark Light and supports Windows, macOS, and Linux.
46
46
 
47
47
  ## Install and quick start
48
48
 
@@ -184,7 +184,7 @@ directories such as `build`, `dist`, environments, VCS folders, `node_modules`,
184
184
  and tool caches. Missing paths and invalid metadata become problems; paths are
185
185
  not guessed.
186
186
 
187
- ## Agent CLI and Interface/Protocol v2
187
+ ## Agent CLI and Interface/Protocol v3
188
188
 
189
189
  `delphi-lsp-agent` has these subcommands and options:
190
190
 
@@ -202,6 +202,8 @@ delphi-lsp-agent index --root PATH [--project-file FILE] [--out FILE]
202
202
  delphi-lsp-agent query --root PATH ACTION [VALUE]
203
203
  [--project-id ID] [--detail summary|declaration|members|context|body|implementations]
204
204
  [--relation references|callers|callees|uses|used_by|inherits|implements]
205
+ [--graph ast|cfg|dfg|call|full] [--direction out|in|both]
206
+ [--depth 1..16]
205
207
  [--cursor TEXT] [--max-items INT] [--max-chars INT]
206
208
  delphi-lsp-agent skill install [--target PATH] [--force]
207
209
  delphi-lsp-agent opencode install [--target PATH] [--python PYTHON]
@@ -220,13 +222,14 @@ delphi-lsp-agent cache stop --root PATH
220
222
  `cache start` outputs cache lifecycle JSON; runtime warnings are still on stderr.
221
223
  `cache status --format json` outputs status JSON to stdout and the same warning stream on stderr.
222
224
  `cache stop` outputs stop status JSON and may include warnings on stderr.
223
- `query` outputs Protocol v2 JSON responses and writes warnings to stderr.
225
+ `query` outputs Protocol v3 JSON responses and writes warnings to stderr.
224
226
 
225
227
  ```bash
226
228
  delphi-lsp-agent query --root PATH find TCustomer
227
229
  delphi-lsp-agent query --root PATH focus TARGET_ID
228
230
  delphi-lsp-agent query --root PATH inspect
229
231
  delphi-lsp-agent query --root PATH trace TARGET_ID --relation callers
232
+ delphi-lsp-agent query --root PATH cpg TARGET_ID --graph full --direction out --depth 4
230
233
  delphi-lsp-agent query --root PATH metrics
231
234
  delphi-lsp-agent query --root PATH metrics UNIT_QUERY
232
235
  delphi-lsp-agent cache status --root PATH --format json
@@ -298,10 +301,13 @@ an empty-query result, symbol cards, pagination, or JSON payloads. Up to sixteen
298
301
  recent ranked queries are retained in a small LRU so alternating CLI and
299
302
  OpenCode searches remain warm.
300
303
 
301
- `cache start` waits up to `--startup-timeout 120` seconds by default for a large
302
- workspace to prewarm. The timeout belongs to the starting client and does not
303
- change daemon compatibility or idle shutdown. Starting a live root with a
304
- different worker configuration reports a configuration conflict.
304
+ `cache start` waits up to `--startup-timeout 120` seconds for the child process
305
+ to bind and publish readiness metadata, not for the large workspace to finish
306
+ prewarming. Workspace discovery and prewarming continue in the daemon while
307
+ status reports `warming`. If bootstrap fails, the CLI reports whether it timed
308
+ out or exited, the exit code, Python executable, workspace, and a sanitized
309
+ tail of child stderr. Starting a live root with a different worker
310
+ configuration reports a configuration conflict.
305
311
 
306
312
  Eviction is ordered: auxiliary caches are evicted first, navigation caches second.
307
313
  If compaction removes navigable data, the daemon rebuilds the navigation state on demand
@@ -330,8 +336,8 @@ agent, and plugin. The two deprecated write flags are harmless aliases and do
330
336
  not change user configuration.
331
337
  `worker` serves NDJSON over standard input/output.
332
338
 
333
- Protocol v2 actions are `open`, `find`, `inspect`, `trace`, `focus`,
334
- `problems`, and `metrics`. A `metrics` request without a query returns the
339
+ Protocol v3 actions are `open`, `find`, `inspect`, `trace`, `focus`,
340
+ `problems`, `metrics`, and `cpg`. A `metrics` request without a query returns the
335
341
  project summary followed by unit cards. A query filters units, while a unit
336
342
  `target_id` from `open` selects one unit; `detail: "members"` adds routine,
337
343
  Halstead, dependency, and symbol-count detail without returning source text.
@@ -341,12 +347,15 @@ Detail values are `summary`, `declaration`, `members`,
341
347
  `implements`.
342
348
 
343
349
  A request requires `action` and can include `query`, `target_id`,
344
- `project_id`, `detail`, `relation`, `cursor`, `max_items`, and
345
- `max_chars`. Defaults are empty text fields, `detail: "summary"`, no
346
- relation, `max_items: 12`, and `max_chars: 12000`. Ranges are 1–50 items
347
- and 256–40000 characters. A successful envelope has `schema: 2`,
350
+ `project_id`, `detail`, `relation`, `graph`, `direction`, `depth`, `cursor`,
351
+ `max_items`, and `max_chars`. Defaults are empty text fields,
352
+ `detail: "summary"`, no relation, `graph: "full"`, `direction: "out"`,
353
+ `depth: 4`, `max_items: 12`, and `max_chars: 12000`. Depth is 1–16;
354
+ response ranges are 1–50 items and 256–40000 characters. A successful envelope
355
+ has `schema: 3`,
348
356
  `workspace_revision`, `focus` (project, unit, and target IDs), `result`,
349
- `page`, and `context`; errors have `schema: 2` and a code/message.
357
+ `page`, and `context`; errors have `schema: 3` and a code/message. Existing
358
+ target IDs remain unchanged across the protocol upgrade.
350
359
 
351
360
  Focus preserves the selected project, unit, or target. Cursors bind a workspace
352
361
  revision and request fingerprint, so source changes and cross-target or
@@ -354,6 +363,37 @@ cross-detail reuse invalidate them. `max_items` and `max_chars` bound each
354
363
  response. A `sound_partial` relation is sound but incomplete: unresolved and
355
364
  ambiguous relations are never fabricated. Unsupported relations are rejected.
356
365
 
366
+ ### Lazy code property graph
367
+
368
+ The `cpg` action translates one selected unit, type, or routine into a bounded
369
+ code property graph. Graph selectors are `ast`, `cfg`, `dfg`, `call`, and `full`;
370
+ `direction` accepts `out`, `in`, or `both`, and `depth` limits traversal
371
+ from the selected target. Together, `graph`, `direction`, and `depth` select
372
+ the returned subgraph. Results contain stable CPG node and edge IDs,
373
+ location and symbol properties, graph metadata, and explicit problems.
374
+
375
+ AST edges preserve syntax containment. CFG edges include routine entry/exit,
376
+ sequence, conditional branches, loop back-edges, and conservative structured
377
+ control flow. Local DFG edges distinguish definitions, uses, and reaching
378
+ definitions. CALL edges are emitted only for a uniquely resolved explicit
379
+ callee. Ambiguous or unsupported semantics increase the unresolved count and
380
+ are reported as `sound_partial`; the navigator does not fabricate certainty.
381
+
382
+ CPG construction is lazy: navigation prewarming creates no graph. The first
383
+ request parses only the selected source, and identical requests reuse an
384
+ in-memory LRU keyed by workspace revision, target, `graph`, `direction`, and
385
+ `depth`. The CPG LRU receives 20 percent of the configured retained-cache
386
+ budget, capped at 128 MiB. Source text and full parser trees are not retained
387
+ inside graph records, and normal navigation keeps its existing cache path.
388
+
389
+ The release gate used the pinned 8,549-file FPC corpus with 4,021,192 physical
390
+ lines on an Apple-silicon Mac with Python 3.14 and eight workers. Navigation
391
+ prewarming took 22.62 seconds. The first focused CPG query took 0.0166 seconds;
392
+ the cached query took 0.000069 seconds and retained 4,007 bytes. Exactly one
393
+ source was parsed for CPG. Legacy navigation retained 98.43 percent of its
394
+ in-run control throughput, above the 95-percent release floor. Reproduce it
395
+ with `python scripts/benchmark_cpg.py --root CORPUS --query Run --workers 8`.
396
+
357
397
  For every source size the navigator builds an outline first, loads source detail
358
398
  lazily for a selected target, and returns only selected fragments. Typed source
359
399
  chunks are at most 6000 characters and also respect the response budget. This
@@ -383,14 +423,16 @@ retired `.opencode/tools` path and never reads or changes `opencode.json`; that
383
423
  file remains entirely user-owned. The deprecated `--write-config` and
384
424
  `--write-agent` options are accepted harmlessly for compatibility.
385
425
 
386
- The plugin maintains one worker per session/root, reusing focus and indexes.
426
+ The plugin maintains one worker per session/root, reusing focus, indexes, and
427
+ lazy CPG subgraphs.
387
428
  During compaction it restores the focus and summary into the new context.
388
429
  Transport failure, session deletion, and plugin disposal clean up the worker.
389
430
 
390
431
  OpenCode history: 1.1.0 and 1.1.1 used a spawned view per call model.
391
432
  Persistent session/root worker support first shipped in 2.0.0.
392
433
  This is the same persistent session/root worker boundary.
393
- The OpenCode worker stays separate from CLI daemon, and current plugin behavior is unchanged.
434
+ The OpenCode worker stays separate from CLI daemon. Protocol v3 adds CPG
435
+ arguments without changing the persistent session/root boundary.
394
436
 
395
437
  A generated OpenCode agent starts with this Markdown frontmatter:
396
438
 
@@ -426,7 +468,7 @@ permission:
426
468
 
427
469
  Select `python-delphi-lsp`, ask it to load the `python-delphi-lsp` skill, then
428
470
  use `delphi_codebase` actions such as
429
- `open`, `find`, `focus`, and `inspect`. Use semantic tool calls, not raw
471
+ `open`, `find`, `focus`, `inspect`, and `cpg`. Use semantic tool calls, not raw
430
472
  source tools.
431
473
 
432
474
  For architecture questions, call `metrics` without a query to compare unit
@@ -2,7 +2,7 @@
2
2
 
3
3
  `python-delphi-lsp` parses Delphi/Object Pascal, builds semantic and project
4
4
  indexes, serves LSP, and provides bounded codebase navigation for agents.
5
- Version 2.3.2 is authored by Dark Light and supports Windows, macOS, and Linux.
5
+ Version 3.0.0 is authored by Dark Light and supports Windows, macOS, and Linux.
6
6
 
7
7
  ## Install and quick start
8
8
 
@@ -144,7 +144,7 @@ directories such as `build`, `dist`, environments, VCS folders, `node_modules`,
144
144
  and tool caches. Missing paths and invalid metadata become problems; paths are
145
145
  not guessed.
146
146
 
147
- ## Agent CLI and Interface/Protocol v2
147
+ ## Agent CLI and Interface/Protocol v3
148
148
 
149
149
  `delphi-lsp-agent` has these subcommands and options:
150
150
 
@@ -162,6 +162,8 @@ delphi-lsp-agent index --root PATH [--project-file FILE] [--out FILE]
162
162
  delphi-lsp-agent query --root PATH ACTION [VALUE]
163
163
  [--project-id ID] [--detail summary|declaration|members|context|body|implementations]
164
164
  [--relation references|callers|callees|uses|used_by|inherits|implements]
165
+ [--graph ast|cfg|dfg|call|full] [--direction out|in|both]
166
+ [--depth 1..16]
165
167
  [--cursor TEXT] [--max-items INT] [--max-chars INT]
166
168
  delphi-lsp-agent skill install [--target PATH] [--force]
167
169
  delphi-lsp-agent opencode install [--target PATH] [--python PYTHON]
@@ -180,13 +182,14 @@ delphi-lsp-agent cache stop --root PATH
180
182
  `cache start` outputs cache lifecycle JSON; runtime warnings are still on stderr.
181
183
  `cache status --format json` outputs status JSON to stdout and the same warning stream on stderr.
182
184
  `cache stop` outputs stop status JSON and may include warnings on stderr.
183
- `query` outputs Protocol v2 JSON responses and writes warnings to stderr.
185
+ `query` outputs Protocol v3 JSON responses and writes warnings to stderr.
184
186
 
185
187
  ```bash
186
188
  delphi-lsp-agent query --root PATH find TCustomer
187
189
  delphi-lsp-agent query --root PATH focus TARGET_ID
188
190
  delphi-lsp-agent query --root PATH inspect
189
191
  delphi-lsp-agent query --root PATH trace TARGET_ID --relation callers
192
+ delphi-lsp-agent query --root PATH cpg TARGET_ID --graph full --direction out --depth 4
190
193
  delphi-lsp-agent query --root PATH metrics
191
194
  delphi-lsp-agent query --root PATH metrics UNIT_QUERY
192
195
  delphi-lsp-agent cache status --root PATH --format json
@@ -258,10 +261,13 @@ an empty-query result, symbol cards, pagination, or JSON payloads. Up to sixteen
258
261
  recent ranked queries are retained in a small LRU so alternating CLI and
259
262
  OpenCode searches remain warm.
260
263
 
261
- `cache start` waits up to `--startup-timeout 120` seconds by default for a large
262
- workspace to prewarm. The timeout belongs to the starting client and does not
263
- change daemon compatibility or idle shutdown. Starting a live root with a
264
- different worker configuration reports a configuration conflict.
264
+ `cache start` waits up to `--startup-timeout 120` seconds for the child process
265
+ to bind and publish readiness metadata, not for the large workspace to finish
266
+ prewarming. Workspace discovery and prewarming continue in the daemon while
267
+ status reports `warming`. If bootstrap fails, the CLI reports whether it timed
268
+ out or exited, the exit code, Python executable, workspace, and a sanitized
269
+ tail of child stderr. Starting a live root with a different worker
270
+ configuration reports a configuration conflict.
265
271
 
266
272
  Eviction is ordered: auxiliary caches are evicted first, navigation caches second.
267
273
  If compaction removes navigable data, the daemon rebuilds the navigation state on demand
@@ -290,8 +296,8 @@ agent, and plugin. The two deprecated write flags are harmless aliases and do
290
296
  not change user configuration.
291
297
  `worker` serves NDJSON over standard input/output.
292
298
 
293
- Protocol v2 actions are `open`, `find`, `inspect`, `trace`, `focus`,
294
- `problems`, and `metrics`. A `metrics` request without a query returns the
299
+ Protocol v3 actions are `open`, `find`, `inspect`, `trace`, `focus`,
300
+ `problems`, `metrics`, and `cpg`. A `metrics` request without a query returns the
295
301
  project summary followed by unit cards. A query filters units, while a unit
296
302
  `target_id` from `open` selects one unit; `detail: "members"` adds routine,
297
303
  Halstead, dependency, and symbol-count detail without returning source text.
@@ -301,12 +307,15 @@ Detail values are `summary`, `declaration`, `members`,
301
307
  `implements`.
302
308
 
303
309
  A request requires `action` and can include `query`, `target_id`,
304
- `project_id`, `detail`, `relation`, `cursor`, `max_items`, and
305
- `max_chars`. Defaults are empty text fields, `detail: "summary"`, no
306
- relation, `max_items: 12`, and `max_chars: 12000`. Ranges are 1–50 items
307
- and 256–40000 characters. A successful envelope has `schema: 2`,
310
+ `project_id`, `detail`, `relation`, `graph`, `direction`, `depth`, `cursor`,
311
+ `max_items`, and `max_chars`. Defaults are empty text fields,
312
+ `detail: "summary"`, no relation, `graph: "full"`, `direction: "out"`,
313
+ `depth: 4`, `max_items: 12`, and `max_chars: 12000`. Depth is 1–16;
314
+ response ranges are 1–50 items and 256–40000 characters. A successful envelope
315
+ has `schema: 3`,
308
316
  `workspace_revision`, `focus` (project, unit, and target IDs), `result`,
309
- `page`, and `context`; errors have `schema: 2` and a code/message.
317
+ `page`, and `context`; errors have `schema: 3` and a code/message. Existing
318
+ target IDs remain unchanged across the protocol upgrade.
310
319
 
311
320
  Focus preserves the selected project, unit, or target. Cursors bind a workspace
312
321
  revision and request fingerprint, so source changes and cross-target or
@@ -314,6 +323,37 @@ cross-detail reuse invalidate them. `max_items` and `max_chars` bound each
314
323
  response. A `sound_partial` relation is sound but incomplete: unresolved and
315
324
  ambiguous relations are never fabricated. Unsupported relations are rejected.
316
325
 
326
+ ### Lazy code property graph
327
+
328
+ The `cpg` action translates one selected unit, type, or routine into a bounded
329
+ code property graph. Graph selectors are `ast`, `cfg`, `dfg`, `call`, and `full`;
330
+ `direction` accepts `out`, `in`, or `both`, and `depth` limits traversal
331
+ from the selected target. Together, `graph`, `direction`, and `depth` select
332
+ the returned subgraph. Results contain stable CPG node and edge IDs,
333
+ location and symbol properties, graph metadata, and explicit problems.
334
+
335
+ AST edges preserve syntax containment. CFG edges include routine entry/exit,
336
+ sequence, conditional branches, loop back-edges, and conservative structured
337
+ control flow. Local DFG edges distinguish definitions, uses, and reaching
338
+ definitions. CALL edges are emitted only for a uniquely resolved explicit
339
+ callee. Ambiguous or unsupported semantics increase the unresolved count and
340
+ are reported as `sound_partial`; the navigator does not fabricate certainty.
341
+
342
+ CPG construction is lazy: navigation prewarming creates no graph. The first
343
+ request parses only the selected source, and identical requests reuse an
344
+ in-memory LRU keyed by workspace revision, target, `graph`, `direction`, and
345
+ `depth`. The CPG LRU receives 20 percent of the configured retained-cache
346
+ budget, capped at 128 MiB. Source text and full parser trees are not retained
347
+ inside graph records, and normal navigation keeps its existing cache path.
348
+
349
+ The release gate used the pinned 8,549-file FPC corpus with 4,021,192 physical
350
+ lines on an Apple-silicon Mac with Python 3.14 and eight workers. Navigation
351
+ prewarming took 22.62 seconds. The first focused CPG query took 0.0166 seconds;
352
+ the cached query took 0.000069 seconds and retained 4,007 bytes. Exactly one
353
+ source was parsed for CPG. Legacy navigation retained 98.43 percent of its
354
+ in-run control throughput, above the 95-percent release floor. Reproduce it
355
+ with `python scripts/benchmark_cpg.py --root CORPUS --query Run --workers 8`.
356
+
317
357
  For every source size the navigator builds an outline first, loads source detail
318
358
  lazily for a selected target, and returns only selected fragments. Typed source
319
359
  chunks are at most 6000 characters and also respect the response budget. This
@@ -343,14 +383,16 @@ retired `.opencode/tools` path and never reads or changes `opencode.json`; that
343
383
  file remains entirely user-owned. The deprecated `--write-config` and
344
384
  `--write-agent` options are accepted harmlessly for compatibility.
345
385
 
346
- The plugin maintains one worker per session/root, reusing focus and indexes.
386
+ The plugin maintains one worker per session/root, reusing focus, indexes, and
387
+ lazy CPG subgraphs.
347
388
  During compaction it restores the focus and summary into the new context.
348
389
  Transport failure, session deletion, and plugin disposal clean up the worker.
349
390
 
350
391
  OpenCode history: 1.1.0 and 1.1.1 used a spawned view per call model.
351
392
  Persistent session/root worker support first shipped in 2.0.0.
352
393
  This is the same persistent session/root worker boundary.
353
- The OpenCode worker stays separate from CLI daemon, and current plugin behavior is unchanged.
394
+ The OpenCode worker stays separate from CLI daemon. Protocol v3 adds CPG
395
+ arguments without changing the persistent session/root boundary.
354
396
 
355
397
  A generated OpenCode agent starts with this Markdown frontmatter:
356
398
 
@@ -386,7 +428,7 @@ permission:
386
428
 
387
429
  Select `python-delphi-lsp`, ask it to load the `python-delphi-lsp` skill, then
388
430
  use `delphi_codebase` actions such as
389
- `open`, `find`, `focus`, and `inspect`. Use semantic tool calls, not raw
431
+ `open`, `find`, `focus`, `inspect`, and `cpg`. Use semantic tool calls, not raw
390
432
  source tools.
391
433
 
392
434
  For architecture questions, call `metrics` without a query to compare unit
@@ -0,0 +1 @@
1
+ __version__ = "3.0.0"