python-delphi-lsp 2.0.4__tar.gz → 2.1.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 (142) hide show
  1. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/.github/workflows/ci.yml +1 -0
  2. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/MANIFEST.in +1 -0
  3. {python_delphi_lsp-2.0.4/python_delphi_lsp.egg-info → python_delphi_lsp-2.1.0}/PKG-INFO +87 -4
  4. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/README.md +86 -3
  5. python_delphi_lsp-2.1.0/delphi_lsp/_version.py +1 -0
  6. python_delphi_lsp-2.1.0/delphi_lsp/agent_cache.py +889 -0
  7. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/delphi_lsp/agent_cli.py +187 -6
  8. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/delphi_lsp/agent_context.py +96 -29
  9. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/delphi_lsp/agent_layers.py +32 -21
  10. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/delphi_lsp/agent_relations.py +0 -1
  11. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/delphi_lsp/agent_workspace.py +7 -0
  12. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/delphi_lsp/binary.py +0 -1
  13. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/delphi_lsp/lsp_server.py +0 -2
  14. python_delphi_lsp-2.1.0/delphi_lsp/parallel_outline.py +278 -0
  15. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/delphi_lsp/semantic.py +1 -1
  16. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/pyproject.toml +1 -1
  17. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0/python_delphi_lsp.egg-info}/PKG-INFO +87 -4
  18. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/python_delphi_lsp.egg-info/SOURCES.txt +5 -0
  19. python_delphi_lsp-2.1.0/scripts/benchmark_parallel_cache.py +71 -0
  20. python_delphi_lsp-2.1.0/tests/test_agent_cache.py +797 -0
  21. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/test_agent_codebase.py +52 -1
  22. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/test_agent_context.py +47 -24
  23. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/test_agent_relations.py +15 -14
  24. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/test_agent_worker.py +221 -2
  25. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/test_lsp_features.py +0 -2
  26. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/test_lsp_support.py +15 -10
  27. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/test_package_metadata.py +4 -3
  28. python_delphi_lsp-2.1.0/tests/test_parallel_outline.py +422 -0
  29. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/test_progress.py +48 -5
  30. python_delphi_lsp-2.0.4/delphi_lsp/_version.py +0 -1
  31. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/LICENSE +0 -0
  32. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/delphi_lsp/__init__.py +0 -0
  33. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/delphi_lsp/agent_metrics.py +0 -0
  34. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/delphi_lsp/agent_protocol.py +0 -0
  35. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/delphi_lsp/agent_templates.py +0 -0
  36. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/delphi_lsp/comment_builder.py +0 -0
  37. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/delphi_lsp/consts.py +0 -0
  38. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/delphi_lsp/grammar.py +0 -0
  39. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/delphi_lsp/lark_builder.py +0 -0
  40. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/delphi_lsp/lark_tokens.py +0 -0
  41. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/delphi_lsp/metrics.py +0 -0
  42. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/delphi_lsp/nodes.py +0 -0
  43. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/delphi_lsp/parser.py +0 -0
  44. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/delphi_lsp/preprocessor.py +0 -0
  45. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/delphi_lsp/progress.py +0 -0
  46. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/delphi_lsp/project_discovery.py +0 -0
  47. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/delphi_lsp/project_indexer.py +0 -0
  48. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/delphi_lsp/semantic_builder.py +0 -0
  49. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/delphi_lsp/source_reader.py +0 -0
  50. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/delphi_lsp/workspace.py +0 -0
  51. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/delphi_lsp/writer.py +0 -0
  52. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/opencode.json +0 -0
  53. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/python_delphi_lsp.egg-info/dependency_links.txt +0 -0
  54. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/python_delphi_lsp.egg-info/entry_points.txt +0 -0
  55. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/python_delphi_lsp.egg-info/requires.txt +0 -0
  56. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/python_delphi_lsp.egg-info/top_level.txt +0 -0
  57. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/scripts/audit_delphi_language_features.py +0 -0
  58. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/scripts/benchmark_github_corpus.py +0 -0
  59. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/scripts/bootstrap_vllm_codebase_skill_test.py +0 -0
  60. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/scripts/bootstrap_vllm_opencode_test.ps1 +0 -0
  61. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/scripts/bootstrap_vllm_opencode_test.py +0 -0
  62. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/scripts/bootstrap_vllm_opencode_test.sh +0 -0
  63. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/scripts/build_github_performance_corpus.py +0 -0
  64. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/scripts/check_ornith_cache.py +0 -0
  65. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/scripts/generate_progress_pdf.py +0 -0
  66. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/scripts/generate_release_evidence.py +0 -0
  67. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/scripts/ollama/ornith-lspctx.Modelfile +0 -0
  68. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/scripts/prepare_ornith_cache.py +0 -0
  69. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/scripts/run_opencode_lsp_probe.py +0 -0
  70. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/scripts/run_openrouter_github_e2e.py +0 -0
  71. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/scripts/start_ornith_vllm.sh +0 -0
  72. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/scripts/summarize_opencode_request_payloads.py +0 -0
  73. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/setup.cfg +0 -0
  74. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/corpora.performance.lock.json +0 -0
  75. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/fixtures/legacy_snippets/DeprecatedOnConst.pas +0 -0
  76. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/fixtures/legacy_snippets/VariantRecordFieldAttributes.pas +0 -0
  77. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/fixtures/legacy_snippets/alignedrecords.pas +0 -0
  78. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/fixtures/legacy_snippets/constset.pas +0 -0
  79. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/fixtures/legacy_snippets/deprecatedtype.pas +0 -0
  80. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/fixtures/legacy_snippets/dottedtypes.pas +0 -0
  81. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/fixtures/legacy_snippets/endtoken.pas +0 -0
  82. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/fixtures/legacy_snippets/experimentals.pas +0 -0
  83. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/fixtures/legacy_snippets/externalfunction.pas +0 -0
  84. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/fixtures/legacy_snippets/finalizationinitializationexports.pas +0 -0
  85. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/fixtures/legacy_snippets/forwardoverloaded.pas +0 -0
  86. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/fixtures/legacy_snippets/forwardwithoutsemicolon.pas +0 -0
  87. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/fixtures/legacy_snippets/genericconstraints.pas +0 -0
  88. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/fixtures/legacy_snippets/genericinterfacemethoddelegation.pas +0 -0
  89. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/fixtures/legacy_snippets/implementsgenerictype.pas +0 -0
  90. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/fixtures/legacy_snippets/include file2.inc +0 -0
  91. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/fixtures/legacy_snippets/includefile.inc +0 -0
  92. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/fixtures/legacy_snippets/includefile.pas +0 -0
  93. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/fixtures/legacy_snippets/managedrecords.pas +0 -0
  94. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/fixtures/legacy_snippets/messagemethod.pas +0 -0
  95. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/fixtures/legacy_snippets/multiline.pas +0 -0
  96. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/fixtures/legacy_snippets/nonalignedrecords.pas +0 -0
  97. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/fixtures/legacy_snippets/numbers.pas +0 -0
  98. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/fixtures/legacy_snippets/pointerchars.pas +0 -0
  99. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/fixtures/legacy_snippets/properties.pas +0 -0
  100. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/fixtures/legacy_snippets/strictvisibility.pas +0 -0
  101. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/fixtures/legacy_snippets/tryexcept.pas +0 -0
  102. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/fixtures/legacy_snippets/umlauts.pas +0 -0
  103. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/fixtures/legacy_snippets/whitespacearoundifdefcondition.pas +0 -0
  104. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/fixtures/library_demo.dpr +0 -0
  105. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/fixtures/package_demo.dpk +0 -0
  106. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/fixtures/program_demo.dpr +0 -0
  107. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/fixtures/unit_advanced.pas +0 -0
  108. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/fixtures/unit_attributes.pas +0 -0
  109. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/fixtures/unit_basic.pas +0 -0
  110. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/fixtures/unit_consumer.pas +0 -0
  111. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/fixtures/unit_generics.pas +0 -0
  112. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/fixtures/unit_inheritance.pas +0 -0
  113. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/fixtures/unit_math.pas +0 -0
  114. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/fixtures/unit_properties.pas +0 -0
  115. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/fixtures/unit_sections.pas +0 -0
  116. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/fixtures/unit_statements.pas +0 -0
  117. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/fixtures/unit_types.pas +0 -0
  118. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/fixtures/unit_unresolved.pas +0 -0
  119. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/fixtures/unit_with.pas +0 -0
  120. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/test_agent_metrics.py +0 -0
  121. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/test_agent_protocol.py +0 -0
  122. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/test_agent_workspace.py +0 -0
  123. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/test_bootstrap_vllm_codebase_skill.py +0 -0
  124. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/test_bootstrap_vllm_opencode.py +0 -0
  125. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/test_diagnostics.py +0 -0
  126. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/test_github_performance_corpus.py +0 -0
  127. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/test_language_feature_matrix.py +0 -0
  128. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/test_legacy_snippets.py +0 -0
  129. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/test_metrics.py +0 -0
  130. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/test_opencode_config.py +0 -0
  131. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/test_opencode_probe.py +0 -0
  132. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/test_opencode_request_payloads.py +0 -0
  133. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/test_openrouter_github_e2e.py +0 -0
  134. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/test_ornith_cache_prepare.py +0 -0
  135. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/test_parser.py +0 -0
  136. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/test_preprocessor.py +0 -0
  137. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/test_project_discovery.py +0 -0
  138. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/test_project_indexer.py +0 -0
  139. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/test_release_evidence.py +0 -0
  140. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/test_semantic.py +0 -0
  141. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/test_vllm_start_script.py +0 -0
  142. {python_delphi_lsp-2.0.4 → python_delphi_lsp-2.1.0}/tests/test_workspace.py +0 -0
@@ -2,6 +2,7 @@ name: CI
2
2
 
3
3
  on:
4
4
  push:
5
+ branches: [main]
5
6
  pull_request:
6
7
 
7
8
  jobs:
@@ -6,6 +6,7 @@ include scripts/check_ornith_cache.py
6
6
  include scripts/audit_delphi_language_features.py
7
7
  include scripts/build_github_performance_corpus.py
8
8
  include scripts/benchmark_github_corpus.py
9
+ include scripts/benchmark_parallel_cache.py
9
10
  include scripts/bootstrap_vllm_opencode_test.py
10
11
  include scripts/bootstrap_vllm_codebase_skill_test.py
11
12
  include scripts/bootstrap_vllm_opencode_test.ps1
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-delphi-lsp
3
- Version: 2.0.4
3
+ Version: 2.1.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
@@ -41,7 +41,7 @@ Dynamic: license-file
41
41
 
42
42
  `python-delphi-lsp` parses Delphi/Object Pascal, builds semantic and project
43
43
  indexes, serves LSP, and provides bounded codebase navigation for agents.
44
- Version 2.0.4 is authored by Dark Light and supports Windows, macOS, and Linux.
44
+ Version 2.1.0 is authored by Dark Light and supports Windows, macOS, and Linux.
45
45
 
46
46
  ## Install and quick start
47
47
 
@@ -185,15 +185,93 @@ problems; paths are not guessed.
185
185
  `delphi-lsp-agent` has these subcommands and options:
186
186
 
187
187
  ```text
188
+ delphi-lsp-agent cache start --root PATH [--project-file FILE] [--max-memory 512M]
189
+ [--workers auto|N] [--startup-timeout 120]
190
+ [--idle-timeout 1800]
191
+ delphi-lsp-agent cache status --root PATH [--format text|json]
192
+ delphi-lsp-agent cache stop --root PATH
188
193
  delphi-lsp-agent view --root PATH [--project-file FILE] --layer LAYER
189
194
  [--query TEXT] [--format markdown|json] [--deep-projects]
195
+ [--workers auto|N]
190
196
  delphi-lsp-agent index --root PATH [--project-file FILE] [--out FILE]
197
+ [--workers auto|N]
198
+ delphi-lsp-agent query --root PATH ACTION [VALUE]
199
+ [--project-id FILE] [--detail summary|declaration|members|context|body|implementations]
200
+ [--relation references|callers|callees|uses|used_by|inherits|implements]
201
+ [--cursor TEXT] [--max-items INT] [--max-chars INT]
191
202
  delphi-lsp-agent skill install [--target PATH] [--force]
192
203
  delphi-lsp-agent opencode install [--target PATH] [--python PYTHON]
193
204
  [--force] [--write-agent|--write-config]
194
- delphi-lsp-agent worker --root PATH [--project-file FILE]
205
+ delphi-lsp-agent worker --root PATH [--project-file FILE] [--workers auto|N]
195
206
  ```
196
207
 
208
+ The `cache` commands manage one daemon per canonical root. Use these:
209
+
210
+ ```bash
211
+ delphi-lsp-agent cache start --root PATH
212
+ delphi-lsp-agent cache status --root PATH
213
+ delphi-lsp-agent cache stop --root PATH
214
+ ```
215
+
216
+ `cache start` outputs cache lifecycle JSON; runtime warnings are still on stderr.
217
+ `cache status --format json` outputs status JSON to stdout and the same warning stream on stderr.
218
+ `cache stop` outputs stop status JSON and may include warnings on stderr.
219
+ `query` outputs Protocol v2 JSON responses and writes warnings to stderr.
220
+
221
+ ```bash
222
+ delphi-lsp-agent query --root PATH find TCustomer
223
+ delphi-lsp-agent query --root PATH focus TARGET_ID
224
+ delphi-lsp-agent query --root PATH inspect
225
+ delphi-lsp-agent query --root PATH trace TARGET_ID --relation callers
226
+ delphi-lsp-agent query --root PATH metrics
227
+ delphi-lsp-agent query --root PATH metrics UNIT_QUERY
228
+ delphi-lsp-agent cache status --root PATH --format json
229
+ ```
230
+
231
+ `inspect` uses the currently focused target, so call `focus TARGET_ID` before
232
+ `inspect` unless a previous request already selected it.
233
+
234
+ The cache daemon prewarms the navigation cache at startup so first `find` requests are
235
+ fast. The cache retained-cache budget is `512 MiB` by default and tracks retained
236
+ cache usage only, not a hard RSS/parse peak. Warnings are emitted on stderr at or
237
+ above 80 percent.
238
+
239
+ Cold builds parse independent source units in short-lived processes created with
240
+ the cross-platform `spawn` method. `--workers auto|N` defaults to `auto`.
241
+ Automatic selection uses at most four worker processes, leaves one detected CPU
242
+ free, never exceeds the source task count, and—for the cache daemon—allows one
243
+ worker per `128 MiB` of retained-cache budget. `view` and `index` use the same
244
+ task, CPU, and four-worker caps without the cache-budget term. An explicit value
245
+ from 1 through 32 overrides the automatic CPU and memory caps but is still
246
+ limited by the number of tasks.
247
+
248
+ Worker processes exit before retained-cache accounting. Their models and source
249
+ text are streamed into the parent, so transient worker memory is separate from
250
+ the retained navigation structures and the existing 80-percent warning. If an
251
+ automatic pool fails before accepting a result, one automatic serial fallback
252
+ is attempted; explicit worker counts fail instead of silently changing the
253
+ requested configuration.
254
+
255
+ `cache start` waits up to `--startup-timeout 120` seconds by default for a large
256
+ workspace to prewarm. The timeout belongs to the starting client and does not
257
+ change daemon compatibility or idle shutdown. Starting a live root with a
258
+ different worker configuration reports a configuration conflict.
259
+
260
+ Eviction is ordered: auxiliary caches are evicted first, navigation caches second.
261
+ If compaction removes navigable data, the daemon rebuilds the navigation state on demand
262
+ while preserving focus state for the next request.
263
+
264
+ The daemon tracks a 30-minute idle timeout; idle state shows in JSON status (`cache status`).
265
+ `source revision` changes on source edits and invalidate reused request caches.
266
+ Workspace state appears in status as `requests`, `warm_hits`, `rebuilds`, `invalidations`,
267
+ `evictions`, and `cache_state`. Parallel prewarm status adds
268
+ `workers_configured`, `workers_effective`, `parallel_files_completed`,
269
+ `prewarm_seconds`, `parallel_seconds`, and `parallel_fallbacks`.
270
+
271
+ Metadata is stored in `.delphi-lsp/agent-cache/daemon.json` with owner-only token and
272
+ permissions (`daemon.json` mode 600 and parent 700). Do not copy or share this token
273
+ outside the root workspace.
274
+
197
275
  `view --layer` accepts `overview`, `projects`, `units`, `unit`,
198
276
  `symbols`, `symbol`, `implementation`, `references`, `problems`, and
199
277
  `metrics`. For example, `delphi-lsp-agent view --layer metrics --format json`
@@ -227,7 +305,7 @@ Focus preserves the selected project, unit, or target. Cursors bind a workspace
227
305
  revision and request fingerprint, so source changes and cross-target or
228
306
  cross-detail reuse invalidate them. `max_items` and `max_chars` bound each
229
307
  response. A `sound_partial` relation is sound but incomplete: unresolved and
230
- ambiguous relations are never fabricated.
308
+ ambiguous relations are never fabricated. Unsupported relations are rejected.
231
309
 
232
310
  For every source size the navigator builds an outline first, loads source detail
233
311
  lazily for a selected target, and returns only selected fragments. Typed source
@@ -262,6 +340,11 @@ The plugin maintains one worker per session/root, reusing focus and indexes.
262
340
  During compaction it restores the focus and summary into the new context.
263
341
  Transport failure, session deletion, and plugin disposal clean up the worker.
264
342
 
343
+ OpenCode history: 1.1.0 and 1.1.1 used a spawned view per call model.
344
+ Persistent session/root worker support first shipped in 2.0.0.
345
+ This is the same persistent session/root worker boundary.
346
+ The OpenCode worker stays separate from CLI daemon, and current plugin behavior is unchanged.
347
+
265
348
  A generated OpenCode agent starts with this Markdown frontmatter:
266
349
 
267
350
  ```markdown
@@ -2,7 +2,7 @@
2
2
 
3
3
  `python-delphi-lsp` parses Delphi/Object Pascal, builds semantic and project
4
4
  indexes, serves LSP, and provides bounded codebase navigation for agents.
5
- Version 2.0.4 is authored by Dark Light and supports Windows, macOS, and Linux.
5
+ Version 2.1.0 is authored by Dark Light and supports Windows, macOS, and Linux.
6
6
 
7
7
  ## Install and quick start
8
8
 
@@ -146,15 +146,93 @@ problems; paths are not guessed.
146
146
  `delphi-lsp-agent` has these subcommands and options:
147
147
 
148
148
  ```text
149
+ delphi-lsp-agent cache start --root PATH [--project-file FILE] [--max-memory 512M]
150
+ [--workers auto|N] [--startup-timeout 120]
151
+ [--idle-timeout 1800]
152
+ delphi-lsp-agent cache status --root PATH [--format text|json]
153
+ delphi-lsp-agent cache stop --root PATH
149
154
  delphi-lsp-agent view --root PATH [--project-file FILE] --layer LAYER
150
155
  [--query TEXT] [--format markdown|json] [--deep-projects]
156
+ [--workers auto|N]
151
157
  delphi-lsp-agent index --root PATH [--project-file FILE] [--out FILE]
158
+ [--workers auto|N]
159
+ delphi-lsp-agent query --root PATH ACTION [VALUE]
160
+ [--project-id FILE] [--detail summary|declaration|members|context|body|implementations]
161
+ [--relation references|callers|callees|uses|used_by|inherits|implements]
162
+ [--cursor TEXT] [--max-items INT] [--max-chars INT]
152
163
  delphi-lsp-agent skill install [--target PATH] [--force]
153
164
  delphi-lsp-agent opencode install [--target PATH] [--python PYTHON]
154
165
  [--force] [--write-agent|--write-config]
155
- delphi-lsp-agent worker --root PATH [--project-file FILE]
166
+ delphi-lsp-agent worker --root PATH [--project-file FILE] [--workers auto|N]
156
167
  ```
157
168
 
169
+ The `cache` commands manage one daemon per canonical root. Use these:
170
+
171
+ ```bash
172
+ delphi-lsp-agent cache start --root PATH
173
+ delphi-lsp-agent cache status --root PATH
174
+ delphi-lsp-agent cache stop --root PATH
175
+ ```
176
+
177
+ `cache start` outputs cache lifecycle JSON; runtime warnings are still on stderr.
178
+ `cache status --format json` outputs status JSON to stdout and the same warning stream on stderr.
179
+ `cache stop` outputs stop status JSON and may include warnings on stderr.
180
+ `query` outputs Protocol v2 JSON responses and writes warnings to stderr.
181
+
182
+ ```bash
183
+ delphi-lsp-agent query --root PATH find TCustomer
184
+ delphi-lsp-agent query --root PATH focus TARGET_ID
185
+ delphi-lsp-agent query --root PATH inspect
186
+ delphi-lsp-agent query --root PATH trace TARGET_ID --relation callers
187
+ delphi-lsp-agent query --root PATH metrics
188
+ delphi-lsp-agent query --root PATH metrics UNIT_QUERY
189
+ delphi-lsp-agent cache status --root PATH --format json
190
+ ```
191
+
192
+ `inspect` uses the currently focused target, so call `focus TARGET_ID` before
193
+ `inspect` unless a previous request already selected it.
194
+
195
+ The cache daemon prewarms the navigation cache at startup so first `find` requests are
196
+ fast. The cache retained-cache budget is `512 MiB` by default and tracks retained
197
+ cache usage only, not a hard RSS/parse peak. Warnings are emitted on stderr at or
198
+ above 80 percent.
199
+
200
+ Cold builds parse independent source units in short-lived processes created with
201
+ the cross-platform `spawn` method. `--workers auto|N` defaults to `auto`.
202
+ Automatic selection uses at most four worker processes, leaves one detected CPU
203
+ free, never exceeds the source task count, and—for the cache daemon—allows one
204
+ worker per `128 MiB` of retained-cache budget. `view` and `index` use the same
205
+ task, CPU, and four-worker caps without the cache-budget term. An explicit value
206
+ from 1 through 32 overrides the automatic CPU and memory caps but is still
207
+ limited by the number of tasks.
208
+
209
+ Worker processes exit before retained-cache accounting. Their models and source
210
+ text are streamed into the parent, so transient worker memory is separate from
211
+ the retained navigation structures and the existing 80-percent warning. If an
212
+ automatic pool fails before accepting a result, one automatic serial fallback
213
+ is attempted; explicit worker counts fail instead of silently changing the
214
+ requested configuration.
215
+
216
+ `cache start` waits up to `--startup-timeout 120` seconds by default for a large
217
+ workspace to prewarm. The timeout belongs to the starting client and does not
218
+ change daemon compatibility or idle shutdown. Starting a live root with a
219
+ different worker configuration reports a configuration conflict.
220
+
221
+ Eviction is ordered: auxiliary caches are evicted first, navigation caches second.
222
+ If compaction removes navigable data, the daemon rebuilds the navigation state on demand
223
+ while preserving focus state for the next request.
224
+
225
+ The daemon tracks a 30-minute idle timeout; idle state shows in JSON status (`cache status`).
226
+ `source revision` changes on source edits and invalidate reused request caches.
227
+ Workspace state appears in status as `requests`, `warm_hits`, `rebuilds`, `invalidations`,
228
+ `evictions`, and `cache_state`. Parallel prewarm status adds
229
+ `workers_configured`, `workers_effective`, `parallel_files_completed`,
230
+ `prewarm_seconds`, `parallel_seconds`, and `parallel_fallbacks`.
231
+
232
+ Metadata is stored in `.delphi-lsp/agent-cache/daemon.json` with owner-only token and
233
+ permissions (`daemon.json` mode 600 and parent 700). Do not copy or share this token
234
+ outside the root workspace.
235
+
158
236
  `view --layer` accepts `overview`, `projects`, `units`, `unit`,
159
237
  `symbols`, `symbol`, `implementation`, `references`, `problems`, and
160
238
  `metrics`. For example, `delphi-lsp-agent view --layer metrics --format json`
@@ -188,7 +266,7 @@ Focus preserves the selected project, unit, or target. Cursors bind a workspace
188
266
  revision and request fingerprint, so source changes and cross-target or
189
267
  cross-detail reuse invalidate them. `max_items` and `max_chars` bound each
190
268
  response. A `sound_partial` relation is sound but incomplete: unresolved and
191
- ambiguous relations are never fabricated.
269
+ ambiguous relations are never fabricated. Unsupported relations are rejected.
192
270
 
193
271
  For every source size the navigator builds an outline first, loads source detail
194
272
  lazily for a selected target, and returns only selected fragments. Typed source
@@ -223,6 +301,11 @@ The plugin maintains one worker per session/root, reusing focus and indexes.
223
301
  During compaction it restores the focus and summary into the new context.
224
302
  Transport failure, session deletion, and plugin disposal clean up the worker.
225
303
 
304
+ OpenCode history: 1.1.0 and 1.1.1 used a spawned view per call model.
305
+ Persistent session/root worker support first shipped in 2.0.0.
306
+ This is the same persistent session/root worker boundary.
307
+ The OpenCode worker stays separate from CLI daemon, and current plugin behavior is unchanged.
308
+
226
309
  A generated OpenCode agent starts with this Markdown frontmatter:
227
310
 
228
311
  ```markdown
@@ -0,0 +1 @@
1
+ __version__ = "2.1.0"