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