python-delphi-lsp 3.2.2__tar.gz → 3.3.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 (388) hide show
  1. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/MANIFEST.in +1 -0
  2. {python_delphi_lsp-3.2.2/python_delphi_lsp.egg-info → python_delphi_lsp-3.3.0}/PKG-INFO +2 -2
  3. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/README.md +1 -1
  4. python_delphi_lsp-3.3.0/delphi_lsp/_version.py +1 -0
  5. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/delphi_lsp/agent_cache.py +157 -30
  6. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/delphi_lsp/agent_cli.py +18 -1
  7. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/delphi_lsp/agent_context.py +106 -24
  8. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/delphi_lsp/agent_layers.py +266 -10
  9. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/delphi_lsp/agent_relations.py +268 -12
  10. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/delphi_lsp/agent_wiki.py +149 -6
  11. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/delphi_lsp/lsp_server.py +161 -28
  12. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/delphi_lsp/semantic.py +27 -20
  13. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/delphi_lsp/semantic_builder.py +240 -93
  14. python_delphi_lsp-3.3.0/docs/release-3.3.0.md +93 -0
  15. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/pyproject.toml +1 -1
  16. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0/python_delphi_lsp.egg-info}/PKG-INFO +2 -2
  17. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/python_delphi_lsp.egg-info/SOURCES.txt +3 -0
  18. python_delphi_lsp-3.3.0/scripts/outline_gap_detector.py +478 -0
  19. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/test_agent_cache.py +128 -0
  20. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/test_agent_cli_content.py +111 -21
  21. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/test_agent_relations.py +147 -0
  22. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/test_agent_wiki.py +85 -2
  23. python_delphi_lsp-3.3.0/tests/test_lsp_features.py +533 -0
  24. python_delphi_lsp-3.3.0/tests/test_outline_gap_detector.py +156 -0
  25. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/test_package_metadata.py +3 -3
  26. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/test_parser_backends.py +45 -0
  27. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/test_throughput_scaling.py +23 -0
  28. python_delphi_lsp-3.2.2/delphi_lsp/_version.py +0 -1
  29. python_delphi_lsp-3.2.2/tests/test_lsp_features.py +0 -171
  30. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/.github/workflows/ci.yml +0 -0
  31. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/LICENSE +0 -0
  32. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/delphi_lsp/__init__.py +0 -0
  33. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/delphi_lsp/agent_cpg.py +0 -0
  34. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/delphi_lsp/agent_cpg_builder.py +0 -0
  35. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/delphi_lsp/agent_metrics.py +0 -0
  36. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/delphi_lsp/agent_protocol.py +0 -0
  37. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/delphi_lsp/agent_templates.py +0 -0
  38. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/delphi_lsp/agent_workspace.py +0 -0
  39. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/delphi_lsp/binary.py +0 -0
  40. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/delphi_lsp/comment_builder.py +0 -0
  41. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/delphi_lsp/consts.py +0 -0
  42. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/delphi_lsp/delphiast_lexer.py +0 -0
  43. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/delphi_lsp/delphiast_parser.py +0 -0
  44. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/delphi_lsp/delphiast_tokens.py +0 -0
  45. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/delphi_lsp/grammar.py +0 -0
  46. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/delphi_lsp/lark_builder.py +0 -0
  47. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/delphi_lsp/lark_tokens.py +0 -0
  48. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/delphi_lsp/lexical_scanner.py +0 -0
  49. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/delphi_lsp/metrics.py +0 -0
  50. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/delphi_lsp/navigation_cache.py +0 -0
  51. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/delphi_lsp/nodes.py +0 -0
  52. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/delphi_lsp/parallel_outline.py +0 -0
  53. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/delphi_lsp/parser.py +0 -0
  54. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/delphi_lsp/parser_backend.py +0 -0
  55. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/delphi_lsp/preprocessor.py +0 -0
  56. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/delphi_lsp/progress.py +0 -0
  57. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/delphi_lsp/project_config.py +0 -0
  58. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/delphi_lsp/project_discovery.py +0 -0
  59. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/delphi_lsp/project_indexer.py +0 -0
  60. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/delphi_lsp/py.typed +0 -0
  61. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/delphi_lsp/source_reader.py +0 -0
  62. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/delphi_lsp/workspace.py +0 -0
  63. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/delphi_lsp/writer.py +0 -0
  64. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/docs/performance-delphi.md +0 -0
  65. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/docs/performance-fpc.md +0 -0
  66. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/docs/release-2.3.0.md +0 -0
  67. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/docs/release-2.3.3.md +0 -0
  68. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/docs/release-3.0.0.md +0 -0
  69. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/docs/release-3.1.0.md +0 -0
  70. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/docs/release-3.1.1.md +0 -0
  71. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/docs/release-3.1.2.md +0 -0
  72. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/docs/release-3.2.0.md +0 -0
  73. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/docs/release-3.2.1.md +0 -0
  74. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/docs/release-3.2.2.md +0 -0
  75. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/docs/superpowers/plans/2026-07-16-architecture-metrics-implementation.md +0 -0
  76. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/docs/superpowers/plans/2026-07-17-large-codebase-performance.md +0 -0
  77. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/docs/superpowers/plans/2026-07-22-conditional-outline-ranges.md +0 -0
  78. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/docs/superpowers/plans/2026-07-23-2.3-performance.md +0 -0
  79. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/docs/superpowers/plans/2026-07-23-bounded-cli-cache-daemon.md +0 -0
  80. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/docs/superpowers/plans/2026-07-23-delphiast-python-backend.md +0 -0
  81. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/docs/superpowers/plans/2026-07-23-parallel-cache-prewarming.md +0 -0
  82. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/docs/superpowers/plans/2026-07-24-hybrid-cpg.md +0 -0
  83. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/docs/superpowers/plans/2026-07-24-repository-default-navigation.md +0 -0
  84. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/docs/superpowers/plans/2026-07-27-okf-memory-progress.md +0 -0
  85. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/docs/superpowers/plans/2026-07-27-okf-wiki-export.md +0 -0
  86. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/docs/superpowers/plans/2026-07-27-project-path-configuration.md +0 -0
  87. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/docs/superpowers/specs/2026-07-16-architecture-metrics-design.md +0 -0
  88. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/docs/superpowers/specs/2026-07-17-large-codebase-performance-design.md +0 -0
  89. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/docs/superpowers/specs/2026-07-22-conditional-outline-ranges-design.md +0 -0
  90. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/docs/superpowers/specs/2026-07-23-2.3-performance-design.md +0 -0
  91. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/docs/superpowers/specs/2026-07-23-bounded-cli-cache-daemon-design.md +0 -0
  92. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/docs/superpowers/specs/2026-07-23-delphiast-python-backend-design.md +0 -0
  93. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/docs/superpowers/specs/2026-07-23-parallel-cache-prewarming-design.md +0 -0
  94. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/docs/superpowers/specs/2026-07-24-hybrid-cpg-design.md +0 -0
  95. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/docs/superpowers/specs/2026-07-24-repository-default-navigation-design.md +0 -0
  96. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/docs/superpowers/specs/2026-07-27-okf-memory-progress-design.md +0 -0
  97. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/docs/superpowers/specs/2026-07-27-okf-wiki-export-design.md +0 -0
  98. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/docs/superpowers/specs/2026-07-27-project-path-configuration-design.md +0 -0
  99. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/opencode.json +0 -0
  100. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/python_delphi_lsp.egg-info/dependency_links.txt +0 -0
  101. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/python_delphi_lsp.egg-info/entry_points.txt +0 -0
  102. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/python_delphi_lsp.egg-info/requires.txt +0 -0
  103. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/python_delphi_lsp.egg-info/top_level.txt +0 -0
  104. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/scripts/audit_delphi_language_features.py +0 -0
  105. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/scripts/benchmark_cpg.py +0 -0
  106. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/scripts/benchmark_fpc_corpus.py +0 -0
  107. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/scripts/benchmark_github_corpus.py +0 -0
  108. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/scripts/benchmark_parallel_cache.py +0 -0
  109. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/scripts/bootstrap_vllm_codebase_skill_test.py +0 -0
  110. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/scripts/bootstrap_vllm_opencode_test.ps1 +0 -0
  111. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/scripts/bootstrap_vllm_opencode_test.py +0 -0
  112. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/scripts/bootstrap_vllm_opencode_test.sh +0 -0
  113. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/scripts/build_github_performance_corpus.py +0 -0
  114. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/scripts/check_ornith_cache.py +0 -0
  115. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/scripts/generate_progress_pdf.py +0 -0
  116. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/scripts/generate_release_evidence.py +0 -0
  117. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/scripts/ollama/ornith-lspctx.Modelfile +0 -0
  118. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/scripts/prepare_delphi_corpus.py +0 -0
  119. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/scripts/prepare_fpc_corpus.py +0 -0
  120. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/scripts/prepare_ornith_cache.py +0 -0
  121. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/scripts/run_opencode_lsp_probe.py +0 -0
  122. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/scripts/run_openrouter_github_e2e.py +0 -0
  123. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/scripts/start_ornith_vllm.sh +0 -0
  124. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/scripts/summarize_opencode_request_payloads.py +0 -0
  125. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/setup.cfg +0 -0
  126. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Examples/DUnitX.Examples.AssertFailureCompare.pas +0 -0
  127. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Examples/DUnitX.Examples.EqualityAsserts.pas +0 -0
  128. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Examples/DUnitX.Examples.General.pas +0 -0
  129. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Examples/DUnitX.Examples.UITest.pas +0 -0
  130. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_2010.dpr +0 -0
  131. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D10Berlin.dpr +0 -0
  132. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D10Rio.dpr +0 -0
  133. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D10Seattle.dpr +0 -0
  134. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D10Sydney.dpr +0 -0
  135. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D10Tokyo.dpr +0 -0
  136. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D11Alexandria.dpr +0 -0
  137. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D12Athens.dpr +0 -0
  138. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D13.dpr +0 -0
  139. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE.dpr +0 -0
  140. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE2.dpr +0 -0
  141. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE3.dpr +0 -0
  142. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE4.dpr +0 -0
  143. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE5.dpr +0 -0
  144. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE6.dpr +0 -0
  145. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE7.dpr +0 -0
  146. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE8.dpr +0 -0
  147. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_D10Berlin.dpr +0 -0
  148. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_D10Seattle.dpr +0 -0
  149. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_D10Tokyo.dpr +0 -0
  150. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_XE5.dpr +0 -0
  151. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_XE6.dpr +0 -0
  152. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_XE7.dpr +0 -0
  153. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_XE8.dpr +0 -0
  154. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Examples/DUnitXVCLGUI_D10Berlin.dpr +0 -0
  155. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Examples/DUnitXVCLGUI_D10Seattle.dpr +0 -0
  156. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Examples/DUnitXVCLGUI_XE.dpr +0 -0
  157. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Examples/DUnitXVCLGUI_XE7.dpr +0 -0
  158. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Examples/NonNamespacedExample.pas +0 -0
  159. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Examples/ProviderExample.pas +0 -0
  160. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.CodeGen.NewProject.pas +0 -0
  161. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.CodeGen.NewTestProject.pas +0 -0
  162. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.CodeGen.NewTestUnit.pas +0 -0
  163. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.CodeGen.NewUnit.pas +0 -0
  164. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.CodeGen.SourceFile.pas +0 -0
  165. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.CodeGen.Templates.pas +0 -0
  166. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.Forms.NewProjectWizard.pas +0 -0
  167. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.Forms.NewUnitWizard.pas +0 -0
  168. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.NewUnitWizard.pas +0 -0
  169. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.NewUnitWizardEx.pas +0 -0
  170. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.ProjectWizard.pas +0 -0
  171. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.ProjectWizardEx.pas +0 -0
  172. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.Registration.pas +0 -0
  173. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_2010.dpk +0 -0
  174. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D10Berlin.dpk +0 -0
  175. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D10Rio.dpk +0 -0
  176. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D10Seattle.dpk +0 -0
  177. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D10Tokyo.dpk +0 -0
  178. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D11Alexandria.dpk +0 -0
  179. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D12Athens.dpk +0 -0
  180. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D13Florence.dpk +0 -0
  181. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_Sydney.dpk +0 -0
  182. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE.dpk +0 -0
  183. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE2.dpk +0 -0
  184. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE3.dpk +0 -0
  185. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE4.dpk +0 -0
  186. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE5.dpk +0 -0
  187. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE6.dpk +0 -0
  188. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE7.dpk +0 -0
  189. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE8.dpk +0 -0
  190. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/LICENSE.txt +0 -0
  191. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUNitX.Loggers.GUIX.pas +0 -0
  192. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUNitX.Loggers.MobileGUI.pas +0 -0
  193. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Assert.Ex.pas +0 -0
  194. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Assert.pas +0 -0
  195. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Attributes.pas +0 -0
  196. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.AutoDetect.Console.pas +0 -0
  197. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Banner.pas +0 -0
  198. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.CategoryExpression.pas +0 -0
  199. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.CommandLine.OptionDef.pas +0 -0
  200. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.CommandLine.Options.pas +0 -0
  201. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.CommandLine.Parser.pas +0 -0
  202. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.ComparableFormat.Csv.pas +0 -0
  203. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.ComparableFormat.Xml.pas +0 -0
  204. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.ComparableFormat.pas +0 -0
  205. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.ConsoleWriter.Base.pas +0 -0
  206. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Constants.pas +0 -0
  207. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.DUnitCompatibility.pas +0 -0
  208. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Exceptions.pas +0 -0
  209. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Extensibility.pas +0 -0
  210. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.FilterBuilder.pas +0 -0
  211. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Filters.pas +0 -0
  212. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.FixtureBuilder.pas +0 -0
  213. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.FixtureProvider.pas +0 -0
  214. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.FixtureResult.pas +0 -0
  215. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Generics.pas +0 -0
  216. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Helpers.pas +0 -0
  217. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Init.pas +0 -0
  218. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.InternalDataProvider.pas +0 -0
  219. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.InternalInterfaces.pas +0 -0
  220. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Linux.Console.pas +0 -0
  221. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.Console.pas +0 -0
  222. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.GUI.VCL.RichEdit.pas +0 -0
  223. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.GUI.VCL.pas +0 -0
  224. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.Null.pas +0 -0
  225. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.Text.pas +0 -0
  226. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.XML.JUnit.pas +0 -0
  227. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.XML.NUnit.pas +0 -0
  228. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.XML.xUnit.pas +0 -0
  229. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.MacOS.Console.pas +0 -0
  230. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.MemoryLeakMonitor.Default.pas +0 -0
  231. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.MemoryLeakMonitor.FastMM4.pas +0 -0
  232. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.MemoryLeakMonitor.FastMM5.pas +0 -0
  233. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.MemoryLeaks.inc +0 -0
  234. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.OptionsDefinition.pas +0 -0
  235. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.ResStrs.pas +0 -0
  236. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.RunResults.pas +0 -0
  237. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.ServiceLocator.pas +0 -0
  238. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.StackTrace.EurekaLog7.pas +0 -0
  239. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.StackTrace.JCL.pas +0 -0
  240. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.StackTrace.MadExcept3.pas +0 -0
  241. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.StackTrace.MadExcept4.pas +0 -0
  242. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.StackTrace.MadExcept5.pas +0 -0
  243. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Stacktrace.inc +0 -0
  244. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Test.pas +0 -0
  245. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.TestDataProvider.pas +0 -0
  246. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.TestFixture.pas +0 -0
  247. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.TestFramework.pas +0 -0
  248. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.TestNameParser.pas +0 -0
  249. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.TestResult.pas +0 -0
  250. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.TestRunner.pas +0 -0
  251. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Timeout.pas +0 -0
  252. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Types.pas +0 -0
  253. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Utils.XML.pas +0 -0
  254. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Utils.pas +0 -0
  255. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.WeakReference.pas +0 -0
  256. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Windows.Console.pas +0 -0
  257. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Source/DUnitX.inc +0 -0
  258. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Options.pas +0 -0
  259. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.SingleNameSpace.pas +0 -0
  260. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Stacktrace.inc +0 -0
  261. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Assert.pas +0 -0
  262. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.CategoryParser.pas +0 -0
  263. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.CommandLineParser.pas +0 -0
  264. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.ConsoleWriter.Base.pas +0 -0
  265. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.DUnitCompatibility.pas +0 -0
  266. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Example.pas +0 -0
  267. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Framework.pas +0 -0
  268. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.IgnoreFixture.pas +0 -0
  269. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Inheritance.pas +0 -0
  270. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.IoC.pas +0 -0
  271. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Loggers.XML.JUnit.pas +0 -0
  272. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Loggers.XML.NUnit.pas +0 -0
  273. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.MemoryLeaks.pas +0 -0
  274. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.TestDataProvider.pas +0 -0
  275. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.TestFixture.pas +0 -0
  276. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.TestNameParser.pas +0 -0
  277. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Utils.XML.pas +0 -0
  278. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Utils.pas +0 -0
  279. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.WeakReference.pas +0 -0
  280. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Tests/DUnitXGuiTest.dpr +0 -0
  281. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Tests/DUnitXTestProject.dpr +0 -0
  282. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Tests/DUnitXTest_D2010.dpr +0 -0
  283. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/Tests/DUnitXTest_XE.dpr +0 -0
  284. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/packages/RAD Studio 10.0/VSoft.DUnitXWinR.dpk +0 -0
  285. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/packages/RAD Studio 10.1/VSoft.DUnitXWinR.dpk +0 -0
  286. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/packages/RAD Studio 10.2/VSoft.DUnitXWinR.dpk +0 -0
  287. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/packages/RAD Studio 10.3/VSoft.DUnitXWinR.dpk +0 -0
  288. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/packages/RAD Studio 10.4/VSoft.DUnitXWinR.dpk +0 -0
  289. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/packages/RAD Studio 11.0/VSoft.DUnitXWinR.dpk +0 -0
  290. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/packages/RAD Studio 12.0/VSoft.DUnitXWinR.dpk +0 -0
  291. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/packages/RAD Studio 13.0/VSoft.DUnitXWinR.dpk +0 -0
  292. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/packages/RAD Studio XE2/VSoft.DUnitXWinR.dpk +0 -0
  293. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/packages/RAD Studio XE3/VSoft.DUnitXWinR.dpk +0 -0
  294. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/packages/RAD Studio XE4/VSoft.DUnitXWinR.dpk +0 -0
  295. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/packages/RAD Studio XE5/VSoft.DUnitXWinR.dpk +0 -0
  296. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/packages/RAD Studio XE6/VSoft.DUnitXWinR.dpk +0 -0
  297. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/packages/RAD Studio XE7/VSoft.DUnitXWinR.dpk +0 -0
  298. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/DUnitX/packages/RAD Studio XE8/VSoft.DUnitXWinR.dpk +0 -0
  299. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/mORMot2/LICENCE.md +0 -0
  300. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/mORMot2/src/mormot.defines.inc +0 -0
  301. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/test_projects/github_repos/mORMot2/src/ui/mormot.ui.pdf.pas +0 -0
  302. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/corpora.performance.lock.json +0 -0
  303. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/fixtures/legacy_snippets/DeprecatedOnConst.pas +0 -0
  304. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/fixtures/legacy_snippets/VariantRecordFieldAttributes.pas +0 -0
  305. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/fixtures/legacy_snippets/alignedrecords.pas +0 -0
  306. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/fixtures/legacy_snippets/constset.pas +0 -0
  307. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/fixtures/legacy_snippets/deprecatedtype.pas +0 -0
  308. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/fixtures/legacy_snippets/dottedtypes.pas +0 -0
  309. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/fixtures/legacy_snippets/endtoken.pas +0 -0
  310. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/fixtures/legacy_snippets/experimentals.pas +0 -0
  311. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/fixtures/legacy_snippets/externalfunction.pas +0 -0
  312. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/fixtures/legacy_snippets/finalizationinitializationexports.pas +0 -0
  313. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/fixtures/legacy_snippets/forwardoverloaded.pas +0 -0
  314. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/fixtures/legacy_snippets/forwardwithoutsemicolon.pas +0 -0
  315. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/fixtures/legacy_snippets/genericconstraints.pas +0 -0
  316. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/fixtures/legacy_snippets/genericinterfacemethoddelegation.pas +0 -0
  317. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/fixtures/legacy_snippets/implementsgenerictype.pas +0 -0
  318. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/fixtures/legacy_snippets/include file2.inc +0 -0
  319. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/fixtures/legacy_snippets/includefile.inc +0 -0
  320. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/fixtures/legacy_snippets/includefile.pas +0 -0
  321. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/fixtures/legacy_snippets/managedrecords.pas +0 -0
  322. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/fixtures/legacy_snippets/messagemethod.pas +0 -0
  323. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/fixtures/legacy_snippets/multiline.pas +0 -0
  324. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/fixtures/legacy_snippets/nonalignedrecords.pas +0 -0
  325. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/fixtures/legacy_snippets/numbers.pas +0 -0
  326. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/fixtures/legacy_snippets/pointerchars.pas +0 -0
  327. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/fixtures/legacy_snippets/properties.pas +0 -0
  328. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/fixtures/legacy_snippets/strictvisibility.pas +0 -0
  329. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/fixtures/legacy_snippets/tryexcept.pas +0 -0
  330. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/fixtures/legacy_snippets/umlauts.pas +0 -0
  331. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/fixtures/legacy_snippets/whitespacearoundifdefcondition.pas +0 -0
  332. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/fixtures/library_demo.dpr +0 -0
  333. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/fixtures/package_demo.dpk +0 -0
  334. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/fixtures/program_demo.dpr +0 -0
  335. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/fixtures/unit_advanced.pas +0 -0
  336. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/fixtures/unit_attributes.pas +0 -0
  337. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/fixtures/unit_basic.pas +0 -0
  338. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/fixtures/unit_consumer.pas +0 -0
  339. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/fixtures/unit_generics.pas +0 -0
  340. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/fixtures/unit_inheritance.pas +0 -0
  341. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/fixtures/unit_math.pas +0 -0
  342. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/fixtures/unit_properties.pas +0 -0
  343. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/fixtures/unit_sections.pas +0 -0
  344. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/fixtures/unit_statements.pas +0 -0
  345. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/fixtures/unit_types.pas +0 -0
  346. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/fixtures/unit_unresolved.pas +0 -0
  347. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/fixtures/unit_with.pas +0 -0
  348. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/fpc_parse_quality.baseline.json +0 -0
  349. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/test_agent_cli_errors.py +0 -0
  350. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/test_agent_codebase.py +0 -0
  351. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/test_agent_context.py +0 -0
  352. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/test_agent_cpg.py +0 -0
  353. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/test_agent_metrics.py +0 -0
  354. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/test_agent_protocol.py +0 -0
  355. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/test_agent_worker.py +0 -0
  356. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/test_agent_workspace.py +0 -0
  357. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/test_bootstrap_vllm_codebase_skill.py +0 -0
  358. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/test_bootstrap_vllm_opencode.py +0 -0
  359. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/test_delphi_performance_corpus.py +0 -0
  360. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/test_delphiast_lexer.py +0 -0
  361. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/test_delphiast_native_compatibility.py +0 -0
  362. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/test_delphiast_parser.py +0 -0
  363. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/test_delphiast_semantic_compatibility.py +0 -0
  364. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/test_diagnostics.py +0 -0
  365. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/test_fpc_performance_corpus.py +0 -0
  366. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/test_github_performance_corpus.py +0 -0
  367. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/test_language_feature_matrix.py +0 -0
  368. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/test_legacy_snippets.py +0 -0
  369. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/test_lsp_server.py +0 -0
  370. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/test_lsp_support.py +0 -0
  371. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/test_metrics.py +0 -0
  372. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/test_navigation_cache.py +0 -0
  373. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/test_opencode_config.py +0 -0
  374. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/test_opencode_probe.py +0 -0
  375. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/test_opencode_request_payloads.py +0 -0
  376. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/test_openrouter_github_e2e.py +0 -0
  377. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/test_ornith_cache_prepare.py +0 -0
  378. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/test_parallel_outline.py +0 -0
  379. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/test_parser.py +0 -0
  380. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/test_preprocessor.py +0 -0
  381. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/test_progress.py +0 -0
  382. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/test_project_config.py +0 -0
  383. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/test_project_discovery.py +0 -0
  384. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/test_project_indexer.py +0 -0
  385. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/test_release_evidence.py +0 -0
  386. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/test_semantic.py +0 -0
  387. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/test_vllm_start_script.py +0 -0
  388. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.3.0}/tests/test_workspace.py +0 -0
@@ -18,6 +18,7 @@ include scripts/bootstrap_vllm_opencode_test.ps1
18
18
  include scripts/bootstrap_vllm_opencode_test.sh
19
19
  include scripts/generate_release_evidence.py
20
20
  include scripts/generate_progress_pdf.py
21
+ include scripts/outline_gap_detector.py
21
22
  include scripts/prepare_ornith_cache.py
22
23
  include scripts/run_opencode_lsp_probe.py
23
24
  include scripts/run_openrouter_github_e2e.py
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-delphi-lsp
3
- Version: 3.2.2
3
+ Version: 3.3.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
@@ -45,7 +45,7 @@ Dynamic: license-file
45
45
 
46
46
  `python-delphi-lsp` parses Delphi/Object Pascal, builds semantic and project
47
47
  indexes, serves LSP, and provides bounded codebase navigation for agents.
48
- Version 3.2.2 is authored by Dark Light and supports Windows, macOS, and Linux.
48
+ Version 3.3.0 is authored by Dark Light and supports Windows, macOS, and Linux.
49
49
 
50
50
  ## Install and quick start
51
51
 
@@ -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 3.2.2 is authored by Dark Light and supports Windows, macOS, and Linux.
5
+ Version 3.3.0 is authored by Dark Light and supports Windows, macOS, and Linux.
6
6
 
7
7
  ## Install and quick start
8
8
 
@@ -0,0 +1 @@
1
+ __version__ = "3.3.0"
@@ -8,6 +8,8 @@ import math
8
8
  import os
9
9
  import re
10
10
  import secrets
11
+ import select
12
+ import signal
11
13
  import socket
12
14
  import stat
13
15
  import subprocess
@@ -20,7 +22,7 @@ from concurrent.futures import ThreadPoolExecutor
20
22
  from dataclasses import dataclass, fields, is_dataclass, replace
21
23
  from functools import lru_cache
22
24
  from pathlib import Path
23
- from types import ModuleType
25
+ from types import FrameType, ModuleType
24
26
 
25
27
  from watchfiles import watch
26
28
 
@@ -50,6 +52,8 @@ _START_LOCK_INCOMPLETE_GRACE_SECONDS = 1.0
50
52
  _CACHE_REVISION_CHECK_INTERVAL_SECONDS = 3600.0
51
53
  _WATCHER_READY_TIMEOUT_SECONDS = 1.0
52
54
  _WATCHER_READY_POLL_MILLISECONDS = 50
55
+ _STOP_TIMEOUT_SECONDS = 15.0
56
+ _STOP_SIGNAL_DELAY_SECONDS = 3.0
53
57
  _WATCHED_SUFFIXES = frozenset(
54
58
  {".pas", ".pp", ".inc", ".dpr", ".dpk", ".dproj", ".cfg"}
55
59
  )
@@ -356,6 +360,51 @@ class CacheClientError(RuntimeError):
356
360
  super().__init__(message)
357
361
 
358
362
 
363
+ class _RequestGuard:
364
+ def __init__(
365
+ self,
366
+ service: _CacheService,
367
+ connection: socket.socket,
368
+ ) -> None:
369
+ self._service = service
370
+ self._connection = connection
371
+
372
+ def check(self) -> None:
373
+ if self._service.shutdown.is_set():
374
+ raise CacheClientError(
375
+ "request_cancelled",
376
+ "Cache request was cancelled.",
377
+ )
378
+ try:
379
+ readable, _, _ = select.select(
380
+ (self._connection,),
381
+ (),
382
+ (),
383
+ 0,
384
+ )
385
+ if readable and not self._connection.recv(1, socket.MSG_PEEK):
386
+ raise CacheClientError(
387
+ "client_disconnected",
388
+ "Cache client disconnected.",
389
+ )
390
+ except CacheClientError:
391
+ raise
392
+ except (OSError, ValueError) as error:
393
+ raise CacheClientError(
394
+ "client_disconnected",
395
+ "Cache client disconnected.",
396
+ ) from error
397
+ rss_bytes = current_process_rss_bytes()
398
+ if (
399
+ rss_bytes > 0
400
+ and rss_bytes > self._service.metadata.max_memory_bytes
401
+ ):
402
+ raise CacheClientError(
403
+ "memory_budget_exceeded",
404
+ "Cache request exceeded the configured RSS memory budget.",
405
+ )
406
+
407
+
359
408
  def cache_metadata_path(root: str | Path) -> Path:
360
409
  return Path(root).resolve() / ".delphi-lsp" / "agent-cache" / "daemon.json"
361
410
 
@@ -752,6 +801,8 @@ class _CacheService:
752
801
  self.budget = CacheBudget(metadata.max_memory_bytes)
753
802
  self.stats = CacheStats()
754
803
  self.lock = threading.Lock()
804
+ self._request_state_lock = threading.Lock()
805
+ self._active_requests = 0
755
806
  self.started = time.monotonic()
756
807
  self.last_activity = self.started
757
808
  self.cache_state = "warming"
@@ -836,7 +887,12 @@ class _CacheService:
836
887
  )
837
888
  self.prewarm_thread.start()
838
889
 
839
- def request(self, request: dict[str, object]) -> CacheClientResponse:
890
+ def request(
891
+ self,
892
+ request: dict[str, object],
893
+ *,
894
+ cancel_check: Callable[[], None] | None = None,
895
+ ) -> CacheClientResponse:
840
896
  action = request.get("action")
841
897
  if action == "status":
842
898
  warning = "" if request.get("_startup_probe") is True else self._consume_warning()
@@ -863,32 +919,62 @@ class _CacheService:
863
919
  self.watcher_ready.wait(timeout=_WATCHER_READY_TIMEOUT_SECONDS)
864
920
  if self.watcher_failed.is_set():
865
921
  self.context.invalidate_revision_cache()
866
- with self.lock:
867
- self.last_activity = time.monotonic()
868
- before = self.last_revision
869
- was_warm = self.context.navigation_cache_is_warm
870
- try:
922
+ with self._request_state_lock:
923
+ self._active_requests += 1
924
+ try:
925
+ with self.lock:
926
+ self.last_activity = time.monotonic()
927
+ before = self.last_revision
928
+ was_warm = self.context.navigation_cache_is_warm
871
929
  try:
872
- response = self.context.handle(request).to_mapping()
873
- except AgentProtocolError as error:
874
- raise CacheClientError(error.code, error.message) from None
875
- except (OSError, UnicodeError):
876
- raise CacheClientError("source_unavailable", "Source is unavailable.") from None
877
- except Exception:
878
- raise CacheClientError("internal_error", "Internal cache error.") from None
879
- finally:
880
- self._enforce_budget()
881
- after = str(response["workspace_revision"])
882
- self.last_revision = after
883
- self.stats.requests += 1
884
- if was_warm:
885
- self.stats.warm_hits += 1
886
- else:
887
- self.stats.rebuilds += 1
888
- self.stats.parallel_fallbacks += self.context.parallel_stats.fallbacks
889
- if before != after:
890
- self.stats.invalidations += 1
891
- return CacheClientResponse(response, self._consume_warning())
930
+ try:
931
+ handled = (
932
+ self.context.handle(request)
933
+ if cancel_check is None
934
+ else self.context.handle(
935
+ request,
936
+ cancel_check=cancel_check,
937
+ )
938
+ )
939
+ response = handled.to_mapping()
940
+ except CacheClientError:
941
+ raise
942
+ except AgentProtocolError as error:
943
+ raise CacheClientError(
944
+ error.code,
945
+ error.message,
946
+ ) from None
947
+ except (OSError, UnicodeError):
948
+ raise CacheClientError(
949
+ "source_unavailable",
950
+ "Source is unavailable.",
951
+ ) from None
952
+ except Exception:
953
+ raise CacheClientError(
954
+ "internal_error",
955
+ "Internal cache error.",
956
+ ) from None
957
+ finally:
958
+ self._enforce_budget()
959
+ after = str(response["workspace_revision"])
960
+ self.last_revision = after
961
+ self.stats.requests += 1
962
+ if was_warm:
963
+ self.stats.warm_hits += 1
964
+ else:
965
+ self.stats.rebuilds += 1
966
+ self.stats.parallel_fallbacks += (
967
+ self.context.parallel_stats.fallbacks
968
+ )
969
+ if before != after:
970
+ self.stats.invalidations += 1
971
+ return CacheClientResponse(
972
+ response,
973
+ self._consume_warning(),
974
+ )
975
+ finally:
976
+ with self._request_state_lock:
977
+ self._active_requests -= 1
892
978
 
893
979
  def _enforce_budget(self) -> None:
894
980
  self.last_budget = self.budget.enforce(
@@ -932,6 +1018,8 @@ class _CacheService:
932
1018
  if context is not None
933
1019
  else None
934
1020
  )
1021
+ with self._request_state_lock:
1022
+ busy = self._active_requests > 0
935
1023
  return {
936
1024
  "pid": self.metadata.pid, "root": self.metadata.root, "project_file": self.metadata.project_file,
937
1025
  "version": self.metadata.version, "uptime": now - self.started, "idle_seconds": idle,
@@ -958,6 +1046,7 @@ class _CacheService:
958
1046
  "workspace_revision": self.last_revision,
959
1047
  "startup_error": self.startup_error,
960
1048
  "watcher_active": not self.watcher_failed.is_set(),
1049
+ "busy": busy,
961
1050
  }
962
1051
 
963
1052
 
@@ -1053,7 +1142,15 @@ def _serve_connection(connection: socket.socket, service: _CacheService) -> None
1053
1142
  response: dict[str, object] = {"error": {"code": "authentication_failed", "message": "authentication failed"}}
1054
1143
  else:
1055
1144
  try:
1056
- result = service.request(request)
1145
+ guard = (
1146
+ _RequestGuard(service, connection)
1147
+ if request.get("action") in {"trace", "cpg"}
1148
+ else None
1149
+ )
1150
+ result = service.request(
1151
+ request,
1152
+ cancel_check=guard.check if guard is not None else None,
1153
+ )
1057
1154
  response = {"payload": result.payload, "warning": result.warning}
1058
1155
  except CacheClientError as error:
1059
1156
  response = {"error": {"code": error.code, "message": error.message}}
@@ -1105,6 +1202,11 @@ def run_cache_daemon(
1105
1202
  max_disk_cache_bytes,
1106
1203
  )
1107
1204
  watcher: threading.Thread | None = None
1205
+ previous_sigterm: (
1206
+ Callable[[int, FrameType | None], object]
1207
+ | int
1208
+ | None
1209
+ ) = None
1108
1210
  connection_slots = threading.BoundedSemaphore(_CONNECTION_WORKERS)
1109
1211
  connection_pool = ThreadPoolExecutor(
1110
1212
  max_workers=_CONNECTION_WORKERS,
@@ -1112,6 +1214,16 @@ def run_cache_daemon(
1112
1214
  )
1113
1215
  try:
1114
1216
  service = _CacheService(metadata, defer_context=True)
1217
+ if threading.current_thread() is threading.main_thread():
1218
+ previous_sigterm = signal.getsignal(signal.SIGTERM)
1219
+
1220
+ def request_shutdown(
1221
+ _signum: int,
1222
+ _frame: FrameType | None,
1223
+ ) -> None:
1224
+ service.shutdown.set()
1225
+
1226
+ signal.signal(signal.SIGTERM, request_shutdown)
1115
1227
  _write_metadata(metadata)
1116
1228
  watcher = threading.Thread(
1117
1229
  target=_watch_workspace,
@@ -1150,6 +1262,8 @@ def run_cache_daemon(
1150
1262
  _remove_metadata_if_owned(metadata)
1151
1263
  if watcher is not None:
1152
1264
  watcher.join(timeout=2.0)
1265
+ if previous_sigterm is not None:
1266
+ signal.signal(signal.SIGTERM, previous_sigterm)
1153
1267
 
1154
1268
 
1155
1269
  def _start_cache_unlocked(
@@ -1339,15 +1453,28 @@ def stop_cache(root: str | Path) -> None:
1339
1453
  _client_exchange(metadata, {"action": "stop"})
1340
1454
  except CacheClientError:
1341
1455
  pass
1342
- deadline = time.monotonic() + 3
1456
+ started = time.monotonic()
1457
+ deadline = started + _STOP_TIMEOUT_SECONDS
1458
+ signal_sent = False
1343
1459
  stopped = False
1344
- while time.monotonic() < deadline:
1460
+ while True:
1461
+ now = time.monotonic()
1462
+ if now >= deadline:
1463
+ break
1345
1464
  if _reap_child_if_exited(metadata.pid):
1346
1465
  stopped = True
1347
1466
  break
1348
1467
  if not _pid_alive(metadata.pid):
1349
1468
  stopped = True
1350
1469
  break
1470
+ if (
1471
+ not signal_sent
1472
+ and os.name != "nt"
1473
+ and now - started >= _STOP_SIGNAL_DELAY_SECONDS
1474
+ ):
1475
+ with contextlib.suppress(OSError):
1476
+ os.kill(metadata.pid, signal.SIGTERM)
1477
+ signal_sent = True
1351
1478
  time.sleep(0.05)
1352
1479
  if not stopped and _pid_alive(metadata.pid):
1353
1480
  raise CacheClientError("stop_failed", "Cache daemon did not stop.")
@@ -25,7 +25,13 @@ from .agent_cache import (
25
25
  watch_workspace_changes,
26
26
  )
27
27
  from .agent_context import AgentContext
28
- from .agent_layers import build_codebase_index, layer_payload, render_layer
28
+ from .agent_layers import (
29
+ build_codebase_index,
30
+ build_references_payload,
31
+ layer_payload,
32
+ render_layer,
33
+ render_payload,
34
+ )
29
35
  from .agent_protocol import (
30
36
  SCHEMA_VERSION,
31
37
  SUPPORTED_ACTIONS,
@@ -317,6 +323,17 @@ def _discard_broken_stdout() -> None:
317
323
  def _view(args: argparse.Namespace) -> None:
318
324
  args.root = _workspace_root(args.root)
319
325
  args.project_file = _project_file(args.root, args.project_file)
326
+ if args.layer == "references":
327
+ payload = build_references_payload(
328
+ args.root,
329
+ query=args.query,
330
+ project_file=args.project_file,
331
+ workers=args.workers,
332
+ )
333
+ sys.stdout.write(
334
+ render_payload(payload, output_format=args.format)
335
+ )
336
+ return
320
337
  index = build_codebase_index(
321
338
  args.root,
322
339
  project_file=args.project_file,
@@ -1,5 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import gc
3
4
  import hashlib
4
5
  import json
5
6
  import sys
@@ -7,7 +8,7 @@ import time
7
8
  import unicodedata
8
9
  from bisect import bisect_left, bisect_right
9
10
  from collections import OrderedDict
10
- from collections.abc import Mapping, Sequence
11
+ from collections.abc import Callable, Mapping, Sequence
11
12
  from dataclasses import dataclass, replace
12
13
  from heapq import heappop, heappush
13
14
  from pathlib import Path, PureWindowsPath
@@ -704,6 +705,26 @@ def _cpg_target(entry: _SymbolEntry) -> CpgTarget:
704
705
  )
705
706
 
706
707
 
708
+ def _relation_target(entry: _SymbolEntry) -> RelationTarget:
709
+ return RelationTarget(
710
+ target_id=entry.target_id,
711
+ source_path=str(entry.source_path),
712
+ path=entry.path,
713
+ unit_id=entry.unit_id,
714
+ unit_name=entry.unit_name,
715
+ name=entry.name,
716
+ qualified_name=entry.qualified_name,
717
+ kind=entry.kind.value,
718
+ signature=entry.signature,
719
+ line=entry.line,
720
+ column=entry.column,
721
+ card={},
722
+ visibility=entry.visibility.value,
723
+ type_name=entry.type_name,
724
+ owner=entry.owner,
725
+ )
726
+
727
+
707
728
  class AgentContext:
708
729
  def __init__(
709
730
  self,
@@ -875,8 +896,15 @@ class AgentContext:
875
896
  self._revision_epoch += 1
876
897
  self._last_revision_check_at = float("-inf")
877
898
 
878
- def handle(self, request: AgentRequest | Mapping[str, object]) -> AgentResponse:
899
+ def handle(
900
+ self,
901
+ request: AgentRequest | Mapping[str, object],
902
+ *,
903
+ cancel_check: Callable[[], None] | None = None,
904
+ ) -> AgentResponse:
879
905
  parsed = _validated_request(request)
906
+ if cancel_check is not None:
907
+ cancel_check()
880
908
  revision = self._refresh_workspace(parsed.project_id)
881
909
 
882
910
  if parsed.action == "cpg":
@@ -890,13 +918,57 @@ class AgentContext:
890
918
  target_id=entry.target_id,
891
919
  )
892
920
  if parsed.action == "trace":
921
+ if cancel_check is not None:
922
+ cancel_check()
893
923
  if parsed.relation is None:
894
924
  raise AgentProtocolError("relation_required", "Trace requires a relation.")
895
- registry = self._require_registry(revision)
896
- entry = self._resolve_target(registry, parsed.target_id)
897
- relation_index = self._require_relation_index(registry, parsed.relation)
898
- items = relation_index.trace(entry.target_id, parsed.relation)
899
- return self._response(parsed, revision, items, target_id=entry.target_id)
925
+ targeted_references = (
926
+ parsed.relation == "references"
927
+ and len(self._workspace.units) >= 256
928
+ )
929
+ relation_index = (
930
+ self._relation_index
931
+ if (
932
+ targeted_references
933
+ and self._relation_index is not None
934
+ and self._relation_index.project_id
935
+ == self._workspace.active_project_id
936
+ and self._relation_index.revision == revision
937
+ and self._relation_index.has_target(parsed.target_id)
938
+ )
939
+ else None
940
+ )
941
+ resolved_target_id = parsed.target_id
942
+ if relation_index is None:
943
+ registry = self._require_registry(revision)
944
+ entry = self._resolve_target(registry, parsed.target_id)
945
+ resolved_target_id = entry.target_id
946
+ if targeted_references:
947
+ relation_index = self._require_reference_relation_index(
948
+ registry,
949
+ entry,
950
+ )
951
+ registry.sources.clear_loaded()
952
+ self._registry = None
953
+ del registry
954
+ gc.collect()
955
+ else:
956
+ relation_index = self._require_relation_index(
957
+ registry,
958
+ parsed.relation,
959
+ )
960
+ items = relation_index.trace(
961
+ resolved_target_id,
962
+ parsed.relation,
963
+ cancel_check=cancel_check,
964
+ max_relations=parsed.max_items,
965
+ )
966
+ return self._response(
967
+ parsed,
968
+ revision,
969
+ items,
970
+ target_id=resolved_target_id,
971
+ )
900
972
  if parsed.action == "open":
901
973
  items = self._open_items()
902
974
  return self._response(parsed, revision, items)
@@ -1265,23 +1337,7 @@ class AgentContext:
1265
1337
  ):
1266
1338
  return self._relation_index
1267
1339
  targets = tuple(
1268
- RelationTarget(
1269
- target_id=entry.target_id,
1270
- source_path=str(entry.source_path),
1271
- path=entry.path,
1272
- unit_id=entry.unit_id,
1273
- unit_name=entry.unit_name,
1274
- name=entry.name,
1275
- qualified_name=entry.qualified_name,
1276
- kind=entry.kind.value,
1277
- signature=entry.signature,
1278
- line=entry.line,
1279
- column=entry.column,
1280
- card={},
1281
- visibility=entry.visibility.value,
1282
- type_name=entry.type_name,
1283
- owner=entry.owner,
1284
- )
1340
+ _relation_target(entry)
1285
1341
  for entry in registry.entries
1286
1342
  if requires_complete_targets or entry.kind == SymbolKind.UNIT
1287
1343
  )
@@ -1294,6 +1350,32 @@ class AgentContext:
1294
1350
  )
1295
1351
  return self._relation_index
1296
1352
 
1353
+ def _require_reference_relation_index(
1354
+ self,
1355
+ registry: _Registry,
1356
+ entry: _SymbolEntry,
1357
+ ) -> ProjectRelationIndex:
1358
+ if (
1359
+ self._relation_index is not None
1360
+ and self._relation_index.project_id == registry.project_id
1361
+ and self._relation_index.revision == registry.revision
1362
+ and self._relation_index.has_target(entry.target_id)
1363
+ ):
1364
+ return self._relation_index
1365
+ targets = tuple(
1366
+ _relation_target(candidate)
1367
+ for candidate in registry.entries
1368
+ if candidate.source_path == entry.source_path
1369
+ )
1370
+ self._relation_index = ProjectRelationIndex(
1371
+ self._workspace,
1372
+ registry.project_id,
1373
+ registry.revision,
1374
+ targets,
1375
+ targets_complete=False,
1376
+ )
1377
+ return self._relation_index
1378
+
1297
1379
  def _require_selected_project(self) -> str:
1298
1380
  project_id = self._workspace.active_project_id
1299
1381
  if not project_id: