python-delphi-lsp 3.2.2__tar.gz → 3.4.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 (410) hide show
  1. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/MANIFEST.in +2 -0
  2. {python_delphi_lsp-3.2.2/python_delphi_lsp.egg-info → python_delphi_lsp-3.4.0}/PKG-INFO +17 -2
  3. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/README.md +16 -1
  4. python_delphi_lsp-3.4.0/delphi_lsp/_version.py +1 -0
  5. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/agent_cache.py +197 -15
  6. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/agent_cli.py +131 -20
  7. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/agent_context.py +774 -96
  8. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/agent_layers.py +473 -28
  9. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/agent_metrics.py +227 -15
  10. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/agent_relations.py +708 -27
  11. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/agent_wiki.py +165 -13
  12. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/agent_workspace.py +18 -0
  13. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/delphiast_lexer.py +156 -39
  14. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/delphiast_parser.py +336 -48
  15. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/delphiast_tokens.py +4 -4
  16. python_delphi_lsp-3.4.0/delphi_lsp/incremental.py +1139 -0
  17. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/lark_builder.py +6 -3
  18. python_delphi_lsp-3.4.0/delphi_lsp/lsp_server.py +6693 -0
  19. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/metrics.py +654 -75
  20. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/navigation_cache.py +2 -2
  21. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/nodes.py +93 -2
  22. python_delphi_lsp-3.4.0/delphi_lsp/parallel_outline.py +621 -0
  23. python_delphi_lsp-3.4.0/delphi_lsp/parse_artifacts.py +969 -0
  24. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/parser.py +21 -2
  25. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/parser_backend.py +13 -2
  26. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/preprocessor.py +28 -14
  27. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/project_config.py +22 -4
  28. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/project_indexer.py +31 -7
  29. python_delphi_lsp-3.4.0/delphi_lsp/response_cache.py +465 -0
  30. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/semantic.py +31 -21
  31. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/semantic_builder.py +986 -114
  32. python_delphi_lsp-3.4.0/docs/release-3.3.0.md +93 -0
  33. python_delphi_lsp-3.4.0/docs/release-3.4.0.md +97 -0
  34. python_delphi_lsp-3.4.0/docs/superpowers/plans/2026-08-04-release-performance-unblock.md +384 -0
  35. python_delphi_lsp-3.4.0/docs/superpowers/specs/2026-08-04-release-performance-unblock-design.md +190 -0
  36. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/pyproject.toml +1 -1
  37. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0/python_delphi_lsp.egg-info}/PKG-INFO +17 -2
  38. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/python_delphi_lsp.egg-info/SOURCES.txt +19 -0
  39. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/scripts/audit_delphi_language_features.py +1 -1
  40. python_delphi_lsp-3.4.0/scripts/benchmark_response_cache.py +222 -0
  41. python_delphi_lsp-3.4.0/scripts/outline_gap_detector.py +656 -0
  42. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_agent_cache.py +529 -1
  43. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_agent_cli_content.py +178 -21
  44. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_agent_codebase.py +208 -0
  45. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_agent_context.py +735 -0
  46. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_agent_metrics.py +219 -0
  47. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_agent_relations.py +1386 -45
  48. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_agent_wiki.py +128 -3
  49. python_delphi_lsp-3.4.0/tests/test_artifact_cache_cpu_smoke.py +116 -0
  50. python_delphi_lsp-3.4.0/tests/test_artifact_cache_integration.py +315 -0
  51. python_delphi_lsp-3.4.0/tests/test_delphiast_lexer.py +284 -0
  52. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_delphiast_native_compatibility.py +54 -1
  53. python_delphi_lsp-3.4.0/tests/test_delphiast_parser_linearity.py +255 -0
  54. python_delphi_lsp-3.4.0/tests/test_incremental.py +296 -0
  55. python_delphi_lsp-3.4.0/tests/test_incremental_performance.py +58 -0
  56. python_delphi_lsp-3.4.0/tests/test_incremental_property.py +560 -0
  57. python_delphi_lsp-3.4.0/tests/test_lsp_features.py +948 -0
  58. python_delphi_lsp-3.4.0/tests/test_lsp_server.py +4005 -0
  59. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_lsp_support.py +62 -10
  60. python_delphi_lsp-3.4.0/tests/test_metrics.py +604 -0
  61. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_navigation_cache.py +5 -0
  62. python_delphi_lsp-3.4.0/tests/test_outline_gap_detector.py +469 -0
  63. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_package_metadata.py +22 -3
  64. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_parallel_outline.py +127 -2
  65. python_delphi_lsp-3.4.0/tests/test_parse_artifacts.py +230 -0
  66. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_parser_backends.py +46 -1
  67. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_preprocessor.py +40 -0
  68. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_project_indexer.py +75 -0
  69. python_delphi_lsp-3.4.0/tests/test_response_cache.py +329 -0
  70. python_delphi_lsp-3.4.0/tests/test_response_cache_benchmark.py +53 -0
  71. python_delphi_lsp-3.4.0/tests/test_semantic.py +987 -0
  72. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_throughput_scaling.py +23 -0
  73. python_delphi_lsp-3.2.2/delphi_lsp/_version.py +0 -1
  74. python_delphi_lsp-3.2.2/delphi_lsp/lsp_server.py +0 -2722
  75. python_delphi_lsp-3.2.2/delphi_lsp/parallel_outline.py +0 -316
  76. python_delphi_lsp-3.2.2/tests/test_delphiast_lexer.py +0 -122
  77. python_delphi_lsp-3.2.2/tests/test_lsp_features.py +0 -171
  78. python_delphi_lsp-3.2.2/tests/test_lsp_server.py +0 -901
  79. python_delphi_lsp-3.2.2/tests/test_metrics.py +0 -275
  80. python_delphi_lsp-3.2.2/tests/test_semantic.py +0 -283
  81. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/.github/workflows/ci.yml +0 -0
  82. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/LICENSE +0 -0
  83. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/__init__.py +0 -0
  84. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/agent_cpg.py +0 -0
  85. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/agent_cpg_builder.py +0 -0
  86. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/agent_protocol.py +0 -0
  87. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/agent_templates.py +0 -0
  88. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/binary.py +0 -0
  89. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/comment_builder.py +0 -0
  90. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/consts.py +0 -0
  91. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/grammar.py +0 -0
  92. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/lark_tokens.py +0 -0
  93. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/lexical_scanner.py +0 -0
  94. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/progress.py +0 -0
  95. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/project_discovery.py +0 -0
  96. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/py.typed +0 -0
  97. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/source_reader.py +0 -0
  98. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/workspace.py +0 -0
  99. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/delphi_lsp/writer.py +0 -0
  100. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/performance-delphi.md +0 -0
  101. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/performance-fpc.md +0 -0
  102. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/release-2.3.0.md +0 -0
  103. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/release-2.3.3.md +0 -0
  104. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/release-3.0.0.md +0 -0
  105. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/release-3.1.0.md +0 -0
  106. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/release-3.1.1.md +0 -0
  107. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/release-3.1.2.md +0 -0
  108. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/release-3.2.0.md +0 -0
  109. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/release-3.2.1.md +0 -0
  110. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/release-3.2.2.md +0 -0
  111. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/superpowers/plans/2026-07-16-architecture-metrics-implementation.md +0 -0
  112. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/superpowers/plans/2026-07-17-large-codebase-performance.md +0 -0
  113. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/superpowers/plans/2026-07-22-conditional-outline-ranges.md +0 -0
  114. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/superpowers/plans/2026-07-23-2.3-performance.md +0 -0
  115. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/superpowers/plans/2026-07-23-bounded-cli-cache-daemon.md +0 -0
  116. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/superpowers/plans/2026-07-23-delphiast-python-backend.md +0 -0
  117. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/superpowers/plans/2026-07-23-parallel-cache-prewarming.md +0 -0
  118. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/superpowers/plans/2026-07-24-hybrid-cpg.md +0 -0
  119. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/superpowers/plans/2026-07-24-repository-default-navigation.md +0 -0
  120. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/superpowers/plans/2026-07-27-okf-memory-progress.md +0 -0
  121. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/superpowers/plans/2026-07-27-okf-wiki-export.md +0 -0
  122. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/superpowers/plans/2026-07-27-project-path-configuration.md +0 -0
  123. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/superpowers/specs/2026-07-16-architecture-metrics-design.md +0 -0
  124. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/superpowers/specs/2026-07-17-large-codebase-performance-design.md +0 -0
  125. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/superpowers/specs/2026-07-22-conditional-outline-ranges-design.md +0 -0
  126. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/superpowers/specs/2026-07-23-2.3-performance-design.md +0 -0
  127. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/superpowers/specs/2026-07-23-bounded-cli-cache-daemon-design.md +0 -0
  128. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/superpowers/specs/2026-07-23-delphiast-python-backend-design.md +0 -0
  129. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/superpowers/specs/2026-07-23-parallel-cache-prewarming-design.md +0 -0
  130. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/superpowers/specs/2026-07-24-hybrid-cpg-design.md +0 -0
  131. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/superpowers/specs/2026-07-24-repository-default-navigation-design.md +0 -0
  132. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/superpowers/specs/2026-07-27-okf-memory-progress-design.md +0 -0
  133. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/superpowers/specs/2026-07-27-okf-wiki-export-design.md +0 -0
  134. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/docs/superpowers/specs/2026-07-27-project-path-configuration-design.md +0 -0
  135. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/opencode.json +0 -0
  136. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/python_delphi_lsp.egg-info/dependency_links.txt +0 -0
  137. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/python_delphi_lsp.egg-info/entry_points.txt +0 -0
  138. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/python_delphi_lsp.egg-info/requires.txt +0 -0
  139. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/python_delphi_lsp.egg-info/top_level.txt +0 -0
  140. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/scripts/benchmark_cpg.py +0 -0
  141. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/scripts/benchmark_fpc_corpus.py +0 -0
  142. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/scripts/benchmark_github_corpus.py +0 -0
  143. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/scripts/benchmark_parallel_cache.py +0 -0
  144. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/scripts/bootstrap_vllm_codebase_skill_test.py +0 -0
  145. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/scripts/bootstrap_vllm_opencode_test.ps1 +0 -0
  146. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/scripts/bootstrap_vllm_opencode_test.py +0 -0
  147. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/scripts/bootstrap_vllm_opencode_test.sh +0 -0
  148. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/scripts/build_github_performance_corpus.py +0 -0
  149. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/scripts/check_ornith_cache.py +0 -0
  150. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/scripts/generate_progress_pdf.py +0 -0
  151. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/scripts/generate_release_evidence.py +0 -0
  152. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/scripts/ollama/ornith-lspctx.Modelfile +0 -0
  153. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/scripts/prepare_delphi_corpus.py +0 -0
  154. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/scripts/prepare_fpc_corpus.py +0 -0
  155. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/scripts/prepare_ornith_cache.py +0 -0
  156. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/scripts/run_opencode_lsp_probe.py +0 -0
  157. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/scripts/run_openrouter_github_e2e.py +0 -0
  158. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/scripts/start_ornith_vllm.sh +0 -0
  159. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/scripts/summarize_opencode_request_payloads.py +0 -0
  160. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/setup.cfg +0 -0
  161. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitX.Examples.AssertFailureCompare.pas +0 -0
  162. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitX.Examples.EqualityAsserts.pas +0 -0
  163. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitX.Examples.General.pas +0 -0
  164. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitX.Examples.UITest.pas +0 -0
  165. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_2010.dpr +0 -0
  166. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D10Berlin.dpr +0 -0
  167. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D10Rio.dpr +0 -0
  168. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D10Seattle.dpr +0 -0
  169. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D10Sydney.dpr +0 -0
  170. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D10Tokyo.dpr +0 -0
  171. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D11Alexandria.dpr +0 -0
  172. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D12Athens.dpr +0 -0
  173. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D13.dpr +0 -0
  174. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE.dpr +0 -0
  175. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE2.dpr +0 -0
  176. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE3.dpr +0 -0
  177. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE4.dpr +0 -0
  178. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE5.dpr +0 -0
  179. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE6.dpr +0 -0
  180. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE7.dpr +0 -0
  181. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE8.dpr +0 -0
  182. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_D10Berlin.dpr +0 -0
  183. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_D10Seattle.dpr +0 -0
  184. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_D10Tokyo.dpr +0 -0
  185. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_XE5.dpr +0 -0
  186. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_XE6.dpr +0 -0
  187. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_XE7.dpr +0 -0
  188. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_XE8.dpr +0 -0
  189. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXVCLGUI_D10Berlin.dpr +0 -0
  190. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXVCLGUI_D10Seattle.dpr +0 -0
  191. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXVCLGUI_XE.dpr +0 -0
  192. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/DUnitXVCLGUI_XE7.dpr +0 -0
  193. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/NonNamespacedExample.pas +0 -0
  194. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Examples/ProviderExample.pas +0 -0
  195. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.CodeGen.NewProject.pas +0 -0
  196. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.CodeGen.NewTestProject.pas +0 -0
  197. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.CodeGen.NewTestUnit.pas +0 -0
  198. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.CodeGen.NewUnit.pas +0 -0
  199. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.CodeGen.SourceFile.pas +0 -0
  200. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.CodeGen.Templates.pas +0 -0
  201. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.Forms.NewProjectWizard.pas +0 -0
  202. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.Forms.NewUnitWizard.pas +0 -0
  203. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.NewUnitWizard.pas +0 -0
  204. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.NewUnitWizardEx.pas +0 -0
  205. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.ProjectWizard.pas +0 -0
  206. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.ProjectWizardEx.pas +0 -0
  207. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.Registration.pas +0 -0
  208. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_2010.dpk +0 -0
  209. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D10Berlin.dpk +0 -0
  210. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D10Rio.dpk +0 -0
  211. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D10Seattle.dpk +0 -0
  212. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D10Tokyo.dpk +0 -0
  213. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D11Alexandria.dpk +0 -0
  214. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D12Athens.dpk +0 -0
  215. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D13Florence.dpk +0 -0
  216. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_Sydney.dpk +0 -0
  217. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE.dpk +0 -0
  218. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE2.dpk +0 -0
  219. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE3.dpk +0 -0
  220. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE4.dpk +0 -0
  221. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE5.dpk +0 -0
  222. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE6.dpk +0 -0
  223. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE7.dpk +0 -0
  224. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE8.dpk +0 -0
  225. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/LICENSE.txt +0 -0
  226. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUNitX.Loggers.GUIX.pas +0 -0
  227. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUNitX.Loggers.MobileGUI.pas +0 -0
  228. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Assert.Ex.pas +0 -0
  229. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Assert.pas +0 -0
  230. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Attributes.pas +0 -0
  231. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.AutoDetect.Console.pas +0 -0
  232. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Banner.pas +0 -0
  233. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.CategoryExpression.pas +0 -0
  234. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.CommandLine.OptionDef.pas +0 -0
  235. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.CommandLine.Options.pas +0 -0
  236. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.CommandLine.Parser.pas +0 -0
  237. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.ComparableFormat.Csv.pas +0 -0
  238. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.ComparableFormat.Xml.pas +0 -0
  239. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.ComparableFormat.pas +0 -0
  240. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.ConsoleWriter.Base.pas +0 -0
  241. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Constants.pas +0 -0
  242. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.DUnitCompatibility.pas +0 -0
  243. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Exceptions.pas +0 -0
  244. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Extensibility.pas +0 -0
  245. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.FilterBuilder.pas +0 -0
  246. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Filters.pas +0 -0
  247. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.FixtureBuilder.pas +0 -0
  248. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.FixtureProvider.pas +0 -0
  249. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.FixtureResult.pas +0 -0
  250. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Generics.pas +0 -0
  251. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Helpers.pas +0 -0
  252. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Init.pas +0 -0
  253. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.InternalDataProvider.pas +0 -0
  254. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.InternalInterfaces.pas +0 -0
  255. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Linux.Console.pas +0 -0
  256. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.Console.pas +0 -0
  257. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.GUI.VCL.RichEdit.pas +0 -0
  258. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.GUI.VCL.pas +0 -0
  259. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.Null.pas +0 -0
  260. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.Text.pas +0 -0
  261. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.XML.JUnit.pas +0 -0
  262. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.XML.NUnit.pas +0 -0
  263. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.XML.xUnit.pas +0 -0
  264. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.MacOS.Console.pas +0 -0
  265. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.MemoryLeakMonitor.Default.pas +0 -0
  266. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.MemoryLeakMonitor.FastMM4.pas +0 -0
  267. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.MemoryLeakMonitor.FastMM5.pas +0 -0
  268. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.MemoryLeaks.inc +0 -0
  269. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.OptionsDefinition.pas +0 -0
  270. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.ResStrs.pas +0 -0
  271. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.RunResults.pas +0 -0
  272. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.ServiceLocator.pas +0 -0
  273. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.StackTrace.EurekaLog7.pas +0 -0
  274. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.StackTrace.JCL.pas +0 -0
  275. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.StackTrace.MadExcept3.pas +0 -0
  276. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.StackTrace.MadExcept4.pas +0 -0
  277. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.StackTrace.MadExcept5.pas +0 -0
  278. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Stacktrace.inc +0 -0
  279. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Test.pas +0 -0
  280. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.TestDataProvider.pas +0 -0
  281. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.TestFixture.pas +0 -0
  282. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.TestFramework.pas +0 -0
  283. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.TestNameParser.pas +0 -0
  284. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.TestResult.pas +0 -0
  285. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.TestRunner.pas +0 -0
  286. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Timeout.pas +0 -0
  287. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Types.pas +0 -0
  288. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Utils.XML.pas +0 -0
  289. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Utils.pas +0 -0
  290. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.WeakReference.pas +0 -0
  291. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.Windows.Console.pas +0 -0
  292. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Source/DUnitX.inc +0 -0
  293. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Options.pas +0 -0
  294. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.SingleNameSpace.pas +0 -0
  295. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Stacktrace.inc +0 -0
  296. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Assert.pas +0 -0
  297. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.CategoryParser.pas +0 -0
  298. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.CommandLineParser.pas +0 -0
  299. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.ConsoleWriter.Base.pas +0 -0
  300. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.DUnitCompatibility.pas +0 -0
  301. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Example.pas +0 -0
  302. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Framework.pas +0 -0
  303. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.IgnoreFixture.pas +0 -0
  304. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Inheritance.pas +0 -0
  305. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.IoC.pas +0 -0
  306. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Loggers.XML.JUnit.pas +0 -0
  307. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Loggers.XML.NUnit.pas +0 -0
  308. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.MemoryLeaks.pas +0 -0
  309. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.TestDataProvider.pas +0 -0
  310. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.TestFixture.pas +0 -0
  311. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.TestNameParser.pas +0 -0
  312. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Utils.XML.pas +0 -0
  313. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Utils.pas +0 -0
  314. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.WeakReference.pas +0 -0
  315. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitXGuiTest.dpr +0 -0
  316. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitXTestProject.dpr +0 -0
  317. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitXTest_D2010.dpr +0 -0
  318. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/Tests/DUnitXTest_XE.dpr +0 -0
  319. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/packages/RAD Studio 10.0/VSoft.DUnitXWinR.dpk +0 -0
  320. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/packages/RAD Studio 10.1/VSoft.DUnitXWinR.dpk +0 -0
  321. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/packages/RAD Studio 10.2/VSoft.DUnitXWinR.dpk +0 -0
  322. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/packages/RAD Studio 10.3/VSoft.DUnitXWinR.dpk +0 -0
  323. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/packages/RAD Studio 10.4/VSoft.DUnitXWinR.dpk +0 -0
  324. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/packages/RAD Studio 11.0/VSoft.DUnitXWinR.dpk +0 -0
  325. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/packages/RAD Studio 12.0/VSoft.DUnitXWinR.dpk +0 -0
  326. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/packages/RAD Studio 13.0/VSoft.DUnitXWinR.dpk +0 -0
  327. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/packages/RAD Studio XE2/VSoft.DUnitXWinR.dpk +0 -0
  328. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/packages/RAD Studio XE3/VSoft.DUnitXWinR.dpk +0 -0
  329. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/packages/RAD Studio XE4/VSoft.DUnitXWinR.dpk +0 -0
  330. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/packages/RAD Studio XE5/VSoft.DUnitXWinR.dpk +0 -0
  331. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/packages/RAD Studio XE6/VSoft.DUnitXWinR.dpk +0 -0
  332. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/packages/RAD Studio XE7/VSoft.DUnitXWinR.dpk +0 -0
  333. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/DUnitX/packages/RAD Studio XE8/VSoft.DUnitXWinR.dpk +0 -0
  334. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/mORMot2/LICENCE.md +0 -0
  335. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/mORMot2/src/mormot.defines.inc +0 -0
  336. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/test_projects/github_repos/mORMot2/src/ui/mormot.ui.pdf.pas +0 -0
  337. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/corpora.performance.lock.json +0 -0
  338. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/DeprecatedOnConst.pas +0 -0
  339. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/VariantRecordFieldAttributes.pas +0 -0
  340. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/alignedrecords.pas +0 -0
  341. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/constset.pas +0 -0
  342. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/deprecatedtype.pas +0 -0
  343. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/dottedtypes.pas +0 -0
  344. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/endtoken.pas +0 -0
  345. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/experimentals.pas +0 -0
  346. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/externalfunction.pas +0 -0
  347. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/finalizationinitializationexports.pas +0 -0
  348. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/forwardoverloaded.pas +0 -0
  349. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/forwardwithoutsemicolon.pas +0 -0
  350. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/genericconstraints.pas +0 -0
  351. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/genericinterfacemethoddelegation.pas +0 -0
  352. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/implementsgenerictype.pas +0 -0
  353. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/include file2.inc +0 -0
  354. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/includefile.inc +0 -0
  355. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/includefile.pas +0 -0
  356. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/managedrecords.pas +0 -0
  357. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/messagemethod.pas +0 -0
  358. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/multiline.pas +0 -0
  359. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/nonalignedrecords.pas +0 -0
  360. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/numbers.pas +0 -0
  361. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/pointerchars.pas +0 -0
  362. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/properties.pas +0 -0
  363. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/strictvisibility.pas +0 -0
  364. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/tryexcept.pas +0 -0
  365. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/umlauts.pas +0 -0
  366. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/legacy_snippets/whitespacearoundifdefcondition.pas +0 -0
  367. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/library_demo.dpr +0 -0
  368. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/package_demo.dpk +0 -0
  369. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/program_demo.dpr +0 -0
  370. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/unit_advanced.pas +0 -0
  371. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/unit_attributes.pas +0 -0
  372. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/unit_basic.pas +0 -0
  373. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/unit_consumer.pas +0 -0
  374. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/unit_generics.pas +0 -0
  375. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/unit_inheritance.pas +0 -0
  376. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/unit_math.pas +0 -0
  377. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/unit_properties.pas +0 -0
  378. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/unit_sections.pas +0 -0
  379. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/unit_statements.pas +0 -0
  380. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/unit_types.pas +0 -0
  381. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/unit_unresolved.pas +0 -0
  382. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fixtures/unit_with.pas +0 -0
  383. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/fpc_parse_quality.baseline.json +0 -0
  384. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_agent_cli_errors.py +0 -0
  385. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_agent_cpg.py +0 -0
  386. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_agent_protocol.py +0 -0
  387. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_agent_worker.py +0 -0
  388. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_agent_workspace.py +0 -0
  389. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_bootstrap_vllm_codebase_skill.py +0 -0
  390. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_bootstrap_vllm_opencode.py +0 -0
  391. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_delphi_performance_corpus.py +0 -0
  392. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_delphiast_parser.py +0 -0
  393. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_delphiast_semantic_compatibility.py +0 -0
  394. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_diagnostics.py +0 -0
  395. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_fpc_performance_corpus.py +0 -0
  396. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_github_performance_corpus.py +0 -0
  397. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_language_feature_matrix.py +0 -0
  398. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_legacy_snippets.py +0 -0
  399. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_opencode_config.py +0 -0
  400. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_opencode_probe.py +0 -0
  401. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_opencode_request_payloads.py +0 -0
  402. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_openrouter_github_e2e.py +0 -0
  403. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_ornith_cache_prepare.py +0 -0
  404. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_parser.py +0 -0
  405. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_progress.py +0 -0
  406. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_project_config.py +0 -0
  407. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_project_discovery.py +0 -0
  408. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_release_evidence.py +0 -0
  409. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_vllm_start_script.py +0 -0
  410. {python_delphi_lsp-3.2.2 → python_delphi_lsp-3.4.0}/tests/test_workspace.py +0 -0
@@ -12,12 +12,14 @@ include scripts/benchmark_fpc_corpus.py
12
12
  include scripts/prepare_delphi_corpus.py
13
13
  include scripts/benchmark_cpg.py
14
14
  include scripts/benchmark_parallel_cache.py
15
+ include scripts/benchmark_response_cache.py
15
16
  include scripts/bootstrap_vllm_opencode_test.py
16
17
  include scripts/bootstrap_vllm_codebase_skill_test.py
17
18
  include scripts/bootstrap_vllm_opencode_test.ps1
18
19
  include scripts/bootstrap_vllm_opencode_test.sh
19
20
  include scripts/generate_release_evidence.py
20
21
  include scripts/generate_progress_pdf.py
22
+ include scripts/outline_gap_detector.py
21
23
  include scripts/prepare_ornith_cache.py
22
24
  include scripts/run_opencode_lsp_probe.py
23
25
  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.4.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.4.0 is authored by Dark Light and supports Windows, macOS, and Linux.
49
49
 
50
50
  ## Install and quick start
51
51
 
@@ -417,6 +417,21 @@ task, CPU, and eight-worker caps without the cache-budget term. An explicit valu
417
417
  from 1 through 32 overrides the automatic CPU and memory caps but is still
418
418
  limited by the number of tasks.
419
419
 
420
+ Standalone `view` and `index` commands cache their exact completed response
421
+ bytes under `.delphi-lsp/response-cache`. A strong content revision covers the
422
+ selected source, include, project, and configuration files, so any relevant
423
+ content change produces a miss. Records are content-addressed, owner-only,
424
+ atomically replaced, size-bounded, and never use pickle. Batch commands bypass
425
+ the older per-unit artifact shards; an unchanged request can therefore return
426
+ the validated response without rebuilding semantic models. To reproduce the
427
+ large-corpus cold/warm gate, run:
428
+
429
+ ```bash
430
+ python scripts/benchmark_response_cache.py \
431
+ --fpc-root /path/to/fpc-corpus \
432
+ --delphi-root /path/to/delphi-corpus
433
+ ```
434
+
420
435
  Worker processes build compact, detached navigation shards and exit before
421
436
  retained-cache accounting. Full semantic object graphs and source text are not
422
437
  retained in the parent. Tokenized source documents are loaded only for source
@@ -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.4.0 is authored by Dark Light and supports Windows, macOS, and Linux.
6
6
 
7
7
  ## Install and quick start
8
8
 
@@ -374,6 +374,21 @@ task, CPU, and eight-worker caps without the cache-budget term. An explicit valu
374
374
  from 1 through 32 overrides the automatic CPU and memory caps but is still
375
375
  limited by the number of tasks.
376
376
 
377
+ Standalone `view` and `index` commands cache their exact completed response
378
+ bytes under `.delphi-lsp/response-cache`. A strong content revision covers the
379
+ selected source, include, project, and configuration files, so any relevant
380
+ content change produces a miss. Records are content-addressed, owner-only,
381
+ atomically replaced, size-bounded, and never use pickle. Batch commands bypass
382
+ the older per-unit artifact shards; an unchanged request can therefore return
383
+ the validated response without rebuilding semantic models. To reproduce the
384
+ large-corpus cold/warm gate, run:
385
+
386
+ ```bash
387
+ python scripts/benchmark_response_cache.py \
388
+ --fpc-root /path/to/fpc-corpus \
389
+ --delphi-root /path/to/delphi-corpus
390
+ ```
391
+
377
392
  Worker processes build compact, detached navigation shards and exit before
378
393
  retained-cache accounting. Full semantic object graphs and source text are not
379
394
  retained in the parent. Tokenized source documents are loaded only for source
@@ -0,0 +1 @@
1
+ __version__ = "3.4.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,9 @@ _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
57
+ _STOP_FORCE_TIMEOUT_SECONDS = 2.0
53
58
  _WATCHED_SUFFIXES = frozenset(
54
59
  {".pas", ".pp", ".inc", ".dpr", ".dpk", ".dproj", ".cfg"}
55
60
  )
@@ -356,6 +361,54 @@ class CacheClientError(RuntimeError):
356
361
  super().__init__(message)
357
362
 
358
363
 
364
+ class _RequestGuard:
365
+ def __init__(
366
+ self,
367
+ service: _CacheService,
368
+ connection: socket.socket,
369
+ *,
370
+ enforce_rss_budget: bool = True,
371
+ ) -> None:
372
+ self._service = service
373
+ self._connection = connection
374
+ self._enforce_rss_budget = enforce_rss_budget
375
+
376
+ def check(self) -> None:
377
+ if self._service.shutdown.is_set():
378
+ raise CacheClientError(
379
+ "request_cancelled",
380
+ "Cache request was cancelled.",
381
+ )
382
+ try:
383
+ readable, _, _ = select.select(
384
+ (self._connection,),
385
+ (),
386
+ (),
387
+ 0,
388
+ )
389
+ if readable and not self._connection.recv(1, socket.MSG_PEEK):
390
+ raise CacheClientError(
391
+ "client_disconnected",
392
+ "Cache client disconnected.",
393
+ )
394
+ except CacheClientError:
395
+ raise
396
+ except (OSError, ValueError) as error:
397
+ raise CacheClientError(
398
+ "client_disconnected",
399
+ "Cache client disconnected.",
400
+ ) from error
401
+ if (
402
+ self._enforce_rss_budget
403
+ and self._service._measure_retained_bytes()
404
+ > self._service.metadata.max_memory_bytes
405
+ ):
406
+ raise CacheClientError(
407
+ "memory_budget_exceeded",
408
+ "Cache request exceeded the configured retained-memory budget.",
409
+ )
410
+
411
+
359
412
  def cache_metadata_path(root: str | Path) -> Path:
360
413
  return Path(root).resolve() / ".delphi-lsp" / "agent-cache" / "daemon.json"
361
414
 
@@ -752,6 +805,8 @@ class _CacheService:
752
805
  self.budget = CacheBudget(metadata.max_memory_bytes)
753
806
  self.stats = CacheStats()
754
807
  self.lock = threading.Lock()
808
+ self._request_state_lock = threading.Lock()
809
+ self._active_requests = 0
755
810
  self.started = time.monotonic()
756
811
  self.last_activity = self.started
757
812
  self.cache_state = "warming"
@@ -803,11 +858,15 @@ class _CacheService:
803
858
  context = self._initialize_context()
804
859
  try:
805
860
  self.last_revision = context.prewarm_navigation()
806
- self.cache_state = "warm"
807
861
  except AgentProtocolError as error:
808
862
  if error.code != "project_required":
809
863
  raise
810
- self.cache_state = "ready"
864
+ prewarm_rss = current_process_rss_bytes()
865
+ if prewarm_rss > 0:
866
+ # Parsing can leave a high allocator RSS watermark even though the
867
+ # retained navigation data is already covered by its own estimate.
868
+ # Track only subsequent, otherwise unaccounted-for RSS growth.
869
+ self._rss_baseline_bytes = prewarm_rss
811
870
  self._enforce_budget()
812
871
  self.prewarm_seconds = time.monotonic() - started
813
872
  self.stats.parallel_fallbacks = context.parallel_stats.fallbacks
@@ -836,7 +895,12 @@ class _CacheService:
836
895
  )
837
896
  self.prewarm_thread.start()
838
897
 
839
- def request(self, request: dict[str, object]) -> CacheClientResponse:
898
+ def request(
899
+ self,
900
+ request: dict[str, object],
901
+ *,
902
+ cancel_check: Callable[[], None] | None = None,
903
+ ) -> CacheClientResponse:
840
904
  action = request.get("action")
841
905
  if action == "status":
842
906
  warning = "" if request.get("_startup_probe") is True else self._consume_warning()
@@ -863,21 +927,69 @@ class _CacheService:
863
927
  self.watcher_ready.wait(timeout=_WATCHER_READY_TIMEOUT_SECONDS)
864
928
  if self.watcher_failed.is_set():
865
929
  self.context.invalidate_revision_cache()
866
- with self.lock:
930
+ with self._request_state_lock:
931
+ self._active_requests += 1
932
+ lock_acquired = False
933
+ try:
934
+ while not self.lock.acquire(timeout=0.05):
935
+ if self.shutdown.is_set():
936
+ raise CacheClientError(
937
+ "request_cancelled",
938
+ "Cache request was cancelled.",
939
+ )
940
+ if cancel_check is not None:
941
+ cancel_check()
942
+ lock_acquired = True
943
+ if self.shutdown.is_set():
944
+ raise CacheClientError(
945
+ "request_cancelled",
946
+ "Cache request was cancelled.",
947
+ )
948
+ if cancel_check is not None:
949
+ cancel_check()
867
950
  self.last_activity = time.monotonic()
868
951
  before = self.last_revision
869
952
  was_warm = self.context.navigation_cache_is_warm
953
+ request_aborted = False
870
954
  try:
871
955
  try:
872
- response = self.context.handle(request).to_mapping()
956
+ handled = (
957
+ self.context.handle(request)
958
+ if cancel_check is None
959
+ else self.context.handle(
960
+ request,
961
+ cancel_check=cancel_check,
962
+ )
963
+ )
964
+ if self.shutdown.is_set():
965
+ raise CacheClientError(
966
+ "request_cancelled",
967
+ "Cache request was cancelled.",
968
+ )
969
+ if cancel_check is not None:
970
+ cancel_check()
971
+ response = handled.to_mapping()
972
+ except CacheClientError:
973
+ request_aborted = True
974
+ raise
873
975
  except AgentProtocolError as error:
874
- raise CacheClientError(error.code, error.message) from None
976
+ raise CacheClientError(
977
+ error.code,
978
+ error.message,
979
+ ) from None
875
980
  except (OSError, UnicodeError):
876
- raise CacheClientError("source_unavailable", "Source is unavailable.") from None
981
+ raise CacheClientError(
982
+ "source_unavailable",
983
+ "Source is unavailable.",
984
+ ) from None
877
985
  except Exception:
878
- raise CacheClientError("internal_error", "Internal cache error.") from None
986
+ raise CacheClientError(
987
+ "internal_error",
988
+ "Internal cache error.",
989
+ ) from None
879
990
  finally:
880
- self._enforce_budget()
991
+ if not request_aborted and not self.shutdown.is_set():
992
+ self._enforce_budget()
881
993
  after = str(response["workspace_revision"])
882
994
  self.last_revision = after
883
995
  self.stats.requests += 1
@@ -885,10 +997,20 @@ class _CacheService:
885
997
  self.stats.warm_hits += 1
886
998
  else:
887
999
  self.stats.rebuilds += 1
888
- self.stats.parallel_fallbacks += self.context.parallel_stats.fallbacks
1000
+ self.stats.parallel_fallbacks += (
1001
+ self.context.parallel_stats.fallbacks
1002
+ )
889
1003
  if before != after:
890
1004
  self.stats.invalidations += 1
891
- return CacheClientResponse(response, self._consume_warning())
1005
+ return CacheClientResponse(
1006
+ response,
1007
+ self._consume_warning(),
1008
+ )
1009
+ finally:
1010
+ if lock_acquired:
1011
+ self.lock.release()
1012
+ with self._request_state_lock:
1013
+ self._active_requests -= 1
892
1014
 
893
1015
  def _enforce_budget(self) -> None:
894
1016
  self.last_budget = self.budget.enforce(
@@ -932,6 +1054,8 @@ class _CacheService:
932
1054
  if context is not None
933
1055
  else None
934
1056
  )
1057
+ with self._request_state_lock:
1058
+ busy = self._active_requests > 0
935
1059
  return {
936
1060
  "pid": self.metadata.pid, "root": self.metadata.root, "project_file": self.metadata.project_file,
937
1061
  "version": self.metadata.version, "uptime": now - self.started, "idle_seconds": idle,
@@ -958,6 +1082,7 @@ class _CacheService:
958
1082
  "workspace_revision": self.last_revision,
959
1083
  "startup_error": self.startup_error,
960
1084
  "watcher_active": not self.watcher_failed.is_set(),
1085
+ "busy": busy,
961
1086
  }
962
1087
 
963
1088
 
@@ -1053,7 +1178,16 @@ def _serve_connection(connection: socket.socket, service: _CacheService) -> None
1053
1178
  response: dict[str, object] = {"error": {"code": "authentication_failed", "message": "authentication failed"}}
1054
1179
  else:
1055
1180
  try:
1056
- result = service.request(request)
1181
+ action = request.get("action")
1182
+ guard = None if action in {"status", "stop"} else _RequestGuard(
1183
+ service,
1184
+ connection,
1185
+ enforce_rss_budget=action in {"trace", "cpg"},
1186
+ )
1187
+ result = service.request(
1188
+ request,
1189
+ cancel_check=guard.check if guard is not None else None,
1190
+ )
1057
1191
  response = {"payload": result.payload, "warning": result.warning}
1058
1192
  except CacheClientError as error:
1059
1193
  response = {"error": {"code": error.code, "message": error.message}}
@@ -1105,6 +1239,11 @@ def run_cache_daemon(
1105
1239
  max_disk_cache_bytes,
1106
1240
  )
1107
1241
  watcher: threading.Thread | None = None
1242
+ previous_sigterm: (
1243
+ Callable[[int, FrameType | None], object]
1244
+ | int
1245
+ | None
1246
+ ) = None
1108
1247
  connection_slots = threading.BoundedSemaphore(_CONNECTION_WORKERS)
1109
1248
  connection_pool = ThreadPoolExecutor(
1110
1249
  max_workers=_CONNECTION_WORKERS,
@@ -1112,6 +1251,16 @@ def run_cache_daemon(
1112
1251
  )
1113
1252
  try:
1114
1253
  service = _CacheService(metadata, defer_context=True)
1254
+ if threading.current_thread() is threading.main_thread():
1255
+ previous_sigterm = signal.getsignal(signal.SIGTERM)
1256
+
1257
+ def request_shutdown(
1258
+ _signum: int,
1259
+ _frame: FrameType | None,
1260
+ ) -> None:
1261
+ service.shutdown.set()
1262
+
1263
+ signal.signal(signal.SIGTERM, request_shutdown)
1115
1264
  _write_metadata(metadata)
1116
1265
  watcher = threading.Thread(
1117
1266
  target=_watch_workspace,
@@ -1150,6 +1299,8 @@ def run_cache_daemon(
1150
1299
  _remove_metadata_if_owned(metadata)
1151
1300
  if watcher is not None:
1152
1301
  watcher.join(timeout=2.0)
1302
+ if previous_sigterm is not None:
1303
+ signal.signal(signal.SIGTERM, previous_sigterm)
1153
1304
 
1154
1305
 
1155
1306
  def _start_cache_unlocked(
@@ -1339,16 +1490,47 @@ def stop_cache(root: str | Path) -> None:
1339
1490
  _client_exchange(metadata, {"action": "stop"})
1340
1491
  except CacheClientError:
1341
1492
  pass
1342
- deadline = time.monotonic() + 3
1493
+ started = time.monotonic()
1494
+ deadline = started + _STOP_TIMEOUT_SECONDS
1495
+ signal_sent = False
1343
1496
  stopped = False
1344
- while time.monotonic() < deadline:
1497
+ while True:
1498
+ now = time.monotonic()
1499
+ if now >= deadline:
1500
+ break
1345
1501
  if _reap_child_if_exited(metadata.pid):
1346
1502
  stopped = True
1347
1503
  break
1348
1504
  if not _pid_alive(metadata.pid):
1349
1505
  stopped = True
1350
1506
  break
1507
+ if (
1508
+ not signal_sent
1509
+ and os.name != "nt"
1510
+ and now - started >= _STOP_SIGNAL_DELAY_SECONDS
1511
+ ):
1512
+ with contextlib.suppress(OSError):
1513
+ os.kill(metadata.pid, signal.SIGTERM)
1514
+ signal_sent = True
1351
1515
  time.sleep(0.05)
1516
+ if not stopped and _pid_alive(metadata.pid):
1517
+ current = _read_metadata(root)
1518
+ if current == metadata:
1519
+ force_signal = (
1520
+ signal.SIGKILL
1521
+ if os.name != "nt" and hasattr(signal, "SIGKILL")
1522
+ else signal.SIGTERM
1523
+ )
1524
+ with contextlib.suppress(OSError):
1525
+ os.kill(metadata.pid, force_signal)
1526
+ force_deadline = time.monotonic() + _STOP_FORCE_TIMEOUT_SECONDS
1527
+ while time.monotonic() < force_deadline:
1528
+ if _reap_child_if_exited(metadata.pid) or not _pid_alive(
1529
+ metadata.pid
1530
+ ):
1531
+ stopped = True
1532
+ break
1533
+ time.sleep(0.05)
1352
1534
  if not stopped and _pid_alive(metadata.pid):
1353
1535
  raise CacheClientError("stop_failed", "Cache daemon did not stop.")
1354
1536
  _remove_metadata_if_owned(metadata)
@@ -25,7 +25,14 @@ 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_metrics_payload,
31
+ build_references_payload,
32
+ layer_payload,
33
+ render_layer,
34
+ render_payload,
35
+ )
29
36
  from .agent_protocol import (
30
37
  SCHEMA_VERSION,
31
38
  SUPPORTED_ACTIONS,
@@ -39,6 +46,12 @@ from .agent_templates import install_opencode_support, install_skill
39
46
  from .agent_wiki import WikiExportError, WikiProgressEvent, export_okf_wiki
40
47
  from .parallel_outline import ParallelOutlineError, parse_worker_setting
41
48
  from .project_config import ProjectConfigError
49
+ from .response_cache import (
50
+ ResponseCacheKey,
51
+ ResponseCacheStore,
52
+ WorkspaceContentSnapshot,
53
+ workspace_content_snapshot,
54
+ )
42
55
 
43
56
  _MAX_WORKER_RECORD_BYTES = 1024 * 1024
44
57
  _INVALID_JSON_MESSAGE = "Invalid JSON request."
@@ -317,36 +330,130 @@ def _discard_broken_stdout() -> None:
317
330
  def _view(args: argparse.Namespace) -> None:
318
331
  args.root = _workspace_root(args.root)
319
332
  args.project_file = _project_file(args.root, args.project_file)
320
- index = build_codebase_index(
321
- args.root,
322
- project_file=args.project_file,
323
- index_projects=args.deep_projects,
324
- workers=args.workers,
333
+ store, cache_key, snapshot = _batch_response_cache(
334
+ args,
335
+ command="view",
336
+ layer=args.layer,
337
+ query=args.query,
338
+ output_format=args.format,
325
339
  )
326
- sys.stdout.write(render_layer(index, args.layer, query=args.query, output_format=args.format))
340
+ cached = store.load(cache_key)
341
+ if cached is not None:
342
+ sys.stdout.write(cached.decode("utf-8"))
343
+ return
344
+ if args.layer == "references":
345
+ payload = build_references_payload(
346
+ args.root,
347
+ query=args.query,
348
+ project_file=args.project_file,
349
+ workers=args.workers,
350
+ )
351
+ rendered = render_payload(payload, output_format=args.format)
352
+ elif args.layer == "metrics":
353
+ payload = build_metrics_payload(
354
+ args.root,
355
+ query=args.query,
356
+ project_file=args.project_file,
357
+ workers=args.workers,
358
+ discovery=snapshot.discovery,
359
+ )
360
+ if args.format == "json":
361
+ rendered = _json_text(payload)
362
+ else:
363
+ rendered = render_payload(payload, output_format=args.format)
364
+ else:
365
+ index = build_codebase_index(
366
+ args.root,
367
+ project_file=args.project_file,
368
+ index_projects=args.deep_projects,
369
+ workers=args.workers,
370
+ use_artifact_cache=False,
371
+ discovery=snapshot.discovery,
372
+ )
373
+ rendered = render_layer(
374
+ index,
375
+ args.layer,
376
+ query=args.query,
377
+ output_format=args.format,
378
+ )
379
+ encoded = rendered.encode("utf-8")
380
+ _store_batch_response(store, cache_key, encoded)
381
+ sys.stdout.write(rendered)
327
382
 
328
383
 
329
384
  def _index(args: argparse.Namespace) -> None:
330
385
  args.root = _workspace_root(args.root)
331
386
  args.project_file = _project_file(args.root, args.project_file)
332
387
  output = _resolve_output_path(args.root, args.out)
333
- index = build_codebase_index(
334
- args.root,
335
- project_file=args.project_file,
336
- index_projects=args.deep_projects,
337
- workers=args.workers,
388
+ store, cache_key, snapshot = _batch_response_cache(
389
+ args,
390
+ command="index",
391
+ layer="",
392
+ query="",
393
+ output_format="json",
338
394
  )
339
- payload = {
340
- "deep_projects": bool(args.deep_projects),
341
- "overview": layer_payload(index, "overview"),
342
- "projects": layer_payload(index, "projects"),
343
- "problems": layer_payload(index, "problems"),
344
- }
395
+ encoded = store.load(cache_key)
396
+ if encoded is None:
397
+ index = build_codebase_index(
398
+ args.root,
399
+ project_file=args.project_file,
400
+ index_projects=args.deep_projects,
401
+ workers=args.workers,
402
+ use_artifact_cache=False,
403
+ discovery=snapshot.discovery,
404
+ )
405
+ payload = {
406
+ "deep_projects": bool(args.deep_projects),
407
+ "overview": layer_payload(index, "overview"),
408
+ "projects": layer_payload(index, "projects"),
409
+ "problems": layer_payload(index, "problems"),
410
+ }
411
+ encoded = (json.dumps(payload, indent=2, sort_keys=True) + "\n").encode(
412
+ "utf-8"
413
+ )
414
+ _store_batch_response(store, cache_key, encoded)
345
415
  output.parent.mkdir(parents=True, exist_ok=True)
346
- output.write_text(json.dumps(payload, indent=2, sort_keys=True) + "\n", encoding="utf-8")
416
+ output.write_bytes(encoded)
347
417
  print(output)
348
418
 
349
419
 
420
+ def _batch_response_cache(
421
+ args: argparse.Namespace,
422
+ *,
423
+ command: str,
424
+ layer: str,
425
+ query: str,
426
+ output_format: str,
427
+ ) -> tuple[ResponseCacheStore, ResponseCacheKey, WorkspaceContentSnapshot]:
428
+ snapshot = workspace_content_snapshot(
429
+ args.root,
430
+ project_file=args.project_file,
431
+ )
432
+ return (
433
+ ResponseCacheStore(args.root / ".delphi-lsp" / "response-cache"),
434
+ ResponseCacheKey(
435
+ workspace_revision=snapshot.revision,
436
+ command=command,
437
+ layer=layer,
438
+ query=query,
439
+ output_format=output_format,
440
+ deep_projects=bool(args.deep_projects),
441
+ ),
442
+ snapshot,
443
+ )
444
+
445
+
446
+ def _store_batch_response(
447
+ store: ResponseCacheStore,
448
+ key: ResponseCacheKey,
449
+ payload: bytes,
450
+ ) -> None:
451
+ try:
452
+ store.store(key, payload)
453
+ except (OSError, ValueError):
454
+ pass
455
+
456
+
350
457
  def _wiki_export(args: argparse.Namespace) -> None:
351
458
  args.root = _workspace_root(args.root)
352
459
  args.project_file = _project_file(args.root, args.project_file)
@@ -501,7 +608,11 @@ def _open_worker_context(
501
608
 
502
609
 
503
610
  def _write_json(payload: object) -> None:
504
- sys.stdout.write(json.dumps(payload, ensure_ascii=False, sort_keys=True, separators=(",", ":")) + "\n")
611
+ sys.stdout.write(_json_text(payload))
612
+
613
+
614
+ def _json_text(payload: object) -> str:
615
+ return json.dumps(payload, sort_keys=True, separators=(",", ":")) + "\n"
505
616
 
506
617
 
507
618
  def _write_warning(warning: str) -> None: