python-delphi-lsp 2.3.3__tar.gz → 3.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.
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/MANIFEST.in +1 -0
- {python_delphi_lsp-2.3.3/python_delphi_lsp.egg-info → python_delphi_lsp-3.1.0}/PKG-INFO +98 -19
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/README.md +97 -18
- python_delphi_lsp-3.1.0/delphi_lsp/_version.py +1 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/agent_cache.py +159 -43
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/agent_cli.py +74 -6
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/agent_context.py +205 -1
- python_delphi_lsp-3.1.0/delphi_lsp/agent_cpg.py +350 -0
- python_delphi_lsp-3.1.0/delphi_lsp/agent_cpg_builder.py +667 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/agent_layers.py +1 -1
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/agent_metrics.py +110 -1
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/agent_protocol.py +57 -3
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/agent_templates.py +20 -13
- python_delphi_lsp-3.1.0/delphi_lsp/agent_wiki.py +1084 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/pyproject.toml +1 -1
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0/python_delphi_lsp.egg-info}/PKG-INFO +98 -19
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/python_delphi_lsp.egg-info/SOURCES.txt +6 -0
- python_delphi_lsp-3.1.0/scripts/benchmark_cpg.py +376 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/scripts/benchmark_github_corpus.py +1 -1
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/scripts/run_openrouter_github_e2e.py +1 -1
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_agent_cache.py +65 -6
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_agent_codebase.py +40 -4
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_agent_context.py +132 -0
- python_delphi_lsp-3.1.0/tests/test_agent_cpg.py +581 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_agent_metrics.py +32 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_agent_protocol.py +22 -5
- python_delphi_lsp-3.1.0/tests/test_agent_wiki.py +347 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_agent_worker.py +93 -22
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_github_performance_corpus.py +34 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_lsp_support.py +1 -1
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_openrouter_github_e2e.py +5 -5
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_package_metadata.py +42 -5
- python_delphi_lsp-2.3.3/delphi_lsp/_version.py +0 -1
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/.github/workflows/ci.yml +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/LICENSE +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/__init__.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/agent_relations.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/agent_workspace.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/binary.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/comment_builder.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/consts.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/delphiast_lexer.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/delphiast_parser.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/delphiast_tokens.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/grammar.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/lark_builder.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/lark_tokens.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/lsp_server.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/metrics.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/navigation_cache.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/nodes.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/parallel_outline.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/parser.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/parser_backend.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/preprocessor.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/progress.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/project_discovery.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/project_indexer.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/semantic.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/semantic_builder.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/source_reader.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/workspace.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/delphi_lsp/writer.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/opencode.json +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/python_delphi_lsp.egg-info/dependency_links.txt +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/python_delphi_lsp.egg-info/entry_points.txt +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/python_delphi_lsp.egg-info/requires.txt +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/python_delphi_lsp.egg-info/top_level.txt +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/scripts/audit_delphi_language_features.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/scripts/benchmark_parallel_cache.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/scripts/bootstrap_vllm_codebase_skill_test.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/scripts/bootstrap_vllm_opencode_test.ps1 +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/scripts/bootstrap_vllm_opencode_test.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/scripts/bootstrap_vllm_opencode_test.sh +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/scripts/build_github_performance_corpus.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/scripts/check_ornith_cache.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/scripts/generate_progress_pdf.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/scripts/generate_release_evidence.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/scripts/ollama/ornith-lspctx.Modelfile +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/scripts/prepare_ornith_cache.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/scripts/run_opencode_lsp_probe.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/scripts/start_ornith_vllm.sh +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/scripts/summarize_opencode_request_payloads.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/setup.cfg +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/corpora.performance.lock.json +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/DeprecatedOnConst.pas +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/VariantRecordFieldAttributes.pas +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/alignedrecords.pas +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/constset.pas +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/deprecatedtype.pas +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/dottedtypes.pas +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/endtoken.pas +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/experimentals.pas +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/externalfunction.pas +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/finalizationinitializationexports.pas +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/forwardoverloaded.pas +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/forwardwithoutsemicolon.pas +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/genericconstraints.pas +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/genericinterfacemethoddelegation.pas +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/implementsgenerictype.pas +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/include file2.inc +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/includefile.inc +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/includefile.pas +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/managedrecords.pas +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/messagemethod.pas +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/multiline.pas +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/nonalignedrecords.pas +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/numbers.pas +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/pointerchars.pas +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/properties.pas +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/strictvisibility.pas +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/tryexcept.pas +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/umlauts.pas +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/legacy_snippets/whitespacearoundifdefcondition.pas +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/library_demo.dpr +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/package_demo.dpk +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/program_demo.dpr +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/unit_advanced.pas +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/unit_attributes.pas +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/unit_basic.pas +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/unit_consumer.pas +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/unit_generics.pas +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/unit_inheritance.pas +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/unit_math.pas +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/unit_properties.pas +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/unit_sections.pas +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/unit_statements.pas +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/unit_types.pas +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/unit_unresolved.pas +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/fixtures/unit_with.pas +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_agent_cli_errors.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_agent_relations.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_agent_workspace.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_bootstrap_vllm_codebase_skill.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_bootstrap_vllm_opencode.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_delphiast_lexer.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_delphiast_native_compatibility.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_delphiast_parser.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_delphiast_semantic_compatibility.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_diagnostics.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_language_feature_matrix.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_legacy_snippets.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_lsp_features.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_metrics.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_navigation_cache.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_opencode_config.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_opencode_probe.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_opencode_request_payloads.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_ornith_cache_prepare.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_parallel_outline.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_parser.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_parser_backends.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_preprocessor.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_progress.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_project_discovery.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_project_indexer.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_release_evidence.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_semantic.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_vllm_start_script.py +0 -0
- {python_delphi_lsp-2.3.3 → python_delphi_lsp-3.1.0}/tests/test_workspace.py +0 -0
|
@@ -6,6 +6,7 @@ include scripts/check_ornith_cache.py
|
|
|
6
6
|
include scripts/audit_delphi_language_features.py
|
|
7
7
|
include scripts/build_github_performance_corpus.py
|
|
8
8
|
include scripts/benchmark_github_corpus.py
|
|
9
|
+
include scripts/benchmark_cpg.py
|
|
9
10
|
include scripts/benchmark_parallel_cache.py
|
|
10
11
|
include scripts/bootstrap_vllm_opencode_test.py
|
|
11
12
|
include scripts/bootstrap_vllm_codebase_skill_test.py
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: python-delphi-lsp
|
|
3
|
-
Version:
|
|
3
|
+
Version: 3.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
|
|
@@ -42,7 +42,7 @@ Dynamic: license-file
|
|
|
42
42
|
|
|
43
43
|
`python-delphi-lsp` parses Delphi/Object Pascal, builds semantic and project
|
|
44
44
|
indexes, serves LSP, and provides bounded codebase navigation for agents.
|
|
45
|
-
Version
|
|
45
|
+
Version 3.1.0 is authored by Dark Light and supports Windows, macOS, and Linux.
|
|
46
46
|
|
|
47
47
|
## Install and quick start
|
|
48
48
|
|
|
@@ -184,7 +184,7 @@ directories such as `build`, `dist`, environments, VCS folders, `node_modules`,
|
|
|
184
184
|
and tool caches. Missing paths and invalid metadata become problems; paths are
|
|
185
185
|
not guessed.
|
|
186
186
|
|
|
187
|
-
## Agent CLI and Interface/Protocol
|
|
187
|
+
## Agent CLI and Interface/Protocol v3
|
|
188
188
|
|
|
189
189
|
`delphi-lsp-agent` has these subcommands and options:
|
|
190
190
|
|
|
@@ -199,9 +199,13 @@ delphi-lsp-agent view --root PATH [--project-file FILE] --layer LAYER
|
|
|
199
199
|
[--workers auto|N]
|
|
200
200
|
delphi-lsp-agent index --root PATH [--project-file FILE] [--out FILE]
|
|
201
201
|
[--workers auto|N]
|
|
202
|
+
delphi-lsp-agent wiki export --root PATH [--project-file FILE] [--out DIRECTORY]
|
|
203
|
+
[--workers auto|N] [--force]
|
|
202
204
|
delphi-lsp-agent query --root PATH ACTION [VALUE]
|
|
203
205
|
[--project-id ID] [--detail summary|declaration|members|context|body|implementations]
|
|
204
206
|
[--relation references|callers|callees|uses|used_by|inherits|implements]
|
|
207
|
+
[--graph ast|cfg|dfg|call|full] [--direction out|in|both]
|
|
208
|
+
[--depth 1..16]
|
|
205
209
|
[--cursor TEXT] [--max-items INT] [--max-chars INT]
|
|
206
210
|
delphi-lsp-agent skill install [--target PATH] [--force]
|
|
207
211
|
delphi-lsp-agent opencode install [--target PATH] [--python PYTHON]
|
|
@@ -220,13 +224,48 @@ delphi-lsp-agent cache stop --root PATH
|
|
|
220
224
|
`cache start` outputs cache lifecycle JSON; runtime warnings are still on stderr.
|
|
221
225
|
`cache status --format json` outputs status JSON to stdout and the same warning stream on stderr.
|
|
222
226
|
`cache stop` outputs stop status JSON and may include warnings on stderr.
|
|
223
|
-
`query` outputs Protocol
|
|
227
|
+
`query` outputs Protocol v3 JSON responses and writes warnings to stderr.
|
|
228
|
+
|
|
229
|
+
### Open Knowledge Format wiki export
|
|
230
|
+
|
|
231
|
+
Export the complete unique knowledge represented by the layered codebase views
|
|
232
|
+
as a portable Markdown wiki:
|
|
233
|
+
|
|
234
|
+
```bash
|
|
235
|
+
delphi-lsp-agent wiki export --root PATH --out codebase-wiki
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
When `--out` is relative, it is resolved below `--root`; the default is
|
|
239
|
+
`.delphi-lsp/wiki`. The command builds the semantic index once, deep-indexes
|
|
240
|
+
discovered projects, calculates workspace and unit metrics, and writes:
|
|
241
|
+
|
|
242
|
+
- an OKF 0.2 root `index.md`;
|
|
243
|
+
- linked project, unit, and symbol concepts;
|
|
244
|
+
- declaration and implementation source fragments;
|
|
245
|
+
- resolved and unresolved semantic references;
|
|
246
|
+
- discovery/project problems and complete metric records;
|
|
247
|
+
- Protocol v3, relation, CPG, cache, and layer-mapping reference concepts.
|
|
248
|
+
|
|
249
|
+
Every non-index concept is UTF-8 Markdown with YAML frontmatter and a non-empty
|
|
250
|
+
`type`. Readable filenames include a stable digest, so overloads and equal names
|
|
251
|
+
from different units remain distinct even on case-insensitive filesystems.
|
|
252
|
+
Output order and content are deterministic. The finished bundle replaces the
|
|
253
|
+
destination only after generation succeeds; an existing non-empty destination
|
|
254
|
+
requires `--force`, and unsafe root/ancestor/symlink targets are rejected.
|
|
255
|
+
|
|
256
|
+
Pages are streamed to disk, decoded source retention is bounded, and metrics
|
|
257
|
+
process source paths without materializing the entire source corpus. Lazy CPG
|
|
258
|
+
subgraphs are documented rather than eagerly multiplied across all possible
|
|
259
|
+
targets; a focused live `cpg` query remains the bounded way to obtain one graph.
|
|
260
|
+
The bundle structure follows the
|
|
261
|
+
[Open Knowledge Format 0.2 specification](https://github.com/GoogleCloudPlatform/knowledge-catalog/blob/main/okf/SPEC.md).
|
|
224
262
|
|
|
225
263
|
```bash
|
|
226
264
|
delphi-lsp-agent query --root PATH find TCustomer
|
|
227
265
|
delphi-lsp-agent query --root PATH focus TARGET_ID
|
|
228
266
|
delphi-lsp-agent query --root PATH inspect
|
|
229
267
|
delphi-lsp-agent query --root PATH trace TARGET_ID --relation callers
|
|
268
|
+
delphi-lsp-agent query --root PATH cpg TARGET_ID --graph full --direction out --depth 4
|
|
230
269
|
delphi-lsp-agent query --root PATH metrics
|
|
231
270
|
delphi-lsp-agent query --root PATH metrics UNIT_QUERY
|
|
232
271
|
delphi-lsp-agent cache status --root PATH --format json
|
|
@@ -298,10 +337,13 @@ an empty-query result, symbol cards, pagination, or JSON payloads. Up to sixteen
|
|
|
298
337
|
recent ranked queries are retained in a small LRU so alternating CLI and
|
|
299
338
|
OpenCode searches remain warm.
|
|
300
339
|
|
|
301
|
-
`cache start` waits up to `--startup-timeout 120` seconds
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
340
|
+
`cache start` waits up to `--startup-timeout 120` seconds for the child process
|
|
341
|
+
to bind and publish readiness metadata, not for the large workspace to finish
|
|
342
|
+
prewarming. Workspace discovery and prewarming continue in the daemon while
|
|
343
|
+
status reports `warming`. If bootstrap fails, the CLI reports whether it timed
|
|
344
|
+
out or exited, the exit code, Python executable, workspace, and a sanitized
|
|
345
|
+
tail of child stderr. Starting a live root with a different worker
|
|
346
|
+
configuration reports a configuration conflict.
|
|
305
347
|
|
|
306
348
|
Eviction is ordered: auxiliary caches are evicted first, navigation caches second.
|
|
307
349
|
If compaction removes navigable data, the daemon rebuilds the navigation state on demand
|
|
@@ -324,14 +366,15 @@ outside the root workspace.
|
|
|
324
366
|
`metrics`. For example, `delphi-lsp-agent view --layer metrics --format json`
|
|
325
367
|
returns a project summary and detailed unit metric objects; `--query` filters
|
|
326
368
|
units by name or path.
|
|
327
|
-
`index` materializes overview, projects, and problems JSON. `
|
|
369
|
+
`index` materializes overview, projects, and problems JSON. `wiki export`
|
|
370
|
+
materializes the same navigational knowledge as a linked OKF Markdown bundle. `skill install`
|
|
328
371
|
writes the skill; `opencode install` writes the package-named skill, Markdown
|
|
329
372
|
agent, and plugin. The two deprecated write flags are harmless aliases and do
|
|
330
373
|
not change user configuration.
|
|
331
374
|
`worker` serves NDJSON over standard input/output.
|
|
332
375
|
|
|
333
|
-
Protocol
|
|
334
|
-
`problems`, and `
|
|
376
|
+
Protocol v3 actions are `open`, `find`, `inspect`, `trace`, `focus`,
|
|
377
|
+
`problems`, `metrics`, and `cpg`. A `metrics` request without a query returns the
|
|
335
378
|
project summary followed by unit cards. A query filters units, while a unit
|
|
336
379
|
`target_id` from `open` selects one unit; `detail: "members"` adds routine,
|
|
337
380
|
Halstead, dependency, and symbol-count detail without returning source text.
|
|
@@ -341,12 +384,15 @@ Detail values are `summary`, `declaration`, `members`,
|
|
|
341
384
|
`implements`.
|
|
342
385
|
|
|
343
386
|
A request requires `action` and can include `query`, `target_id`,
|
|
344
|
-
`project_id`, `detail`, `relation`, `
|
|
345
|
-
`max_chars`. Defaults are empty text fields,
|
|
346
|
-
relation, `
|
|
347
|
-
|
|
387
|
+
`project_id`, `detail`, `relation`, `graph`, `direction`, `depth`, `cursor`,
|
|
388
|
+
`max_items`, and `max_chars`. Defaults are empty text fields,
|
|
389
|
+
`detail: "summary"`, no relation, `graph: "full"`, `direction: "out"`,
|
|
390
|
+
`depth: 4`, `max_items: 12`, and `max_chars: 12000`. Depth is 1–16;
|
|
391
|
+
response ranges are 1–50 items and 256–40000 characters. A successful envelope
|
|
392
|
+
has `schema: 3`,
|
|
348
393
|
`workspace_revision`, `focus` (project, unit, and target IDs), `result`,
|
|
349
|
-
`page`, and `context`; errors have `schema:
|
|
394
|
+
`page`, and `context`; errors have `schema: 3` and a code/message. Existing
|
|
395
|
+
target IDs remain unchanged across the protocol upgrade.
|
|
350
396
|
|
|
351
397
|
Focus preserves the selected project, unit, or target. Cursors bind a workspace
|
|
352
398
|
revision and request fingerprint, so source changes and cross-target or
|
|
@@ -354,6 +400,37 @@ cross-detail reuse invalidate them. `max_items` and `max_chars` bound each
|
|
|
354
400
|
response. A `sound_partial` relation is sound but incomplete: unresolved and
|
|
355
401
|
ambiguous relations are never fabricated. Unsupported relations are rejected.
|
|
356
402
|
|
|
403
|
+
### Lazy code property graph
|
|
404
|
+
|
|
405
|
+
The `cpg` action translates one selected unit, type, or routine into a bounded
|
|
406
|
+
code property graph. Graph selectors are `ast`, `cfg`, `dfg`, `call`, and `full`;
|
|
407
|
+
`direction` accepts `out`, `in`, or `both`, and `depth` limits traversal
|
|
408
|
+
from the selected target. Together, `graph`, `direction`, and `depth` select
|
|
409
|
+
the returned subgraph. Results contain stable CPG node and edge IDs,
|
|
410
|
+
location and symbol properties, graph metadata, and explicit problems.
|
|
411
|
+
|
|
412
|
+
AST edges preserve syntax containment. CFG edges include routine entry/exit,
|
|
413
|
+
sequence, conditional branches, loop back-edges, and conservative structured
|
|
414
|
+
control flow. Local DFG edges distinguish definitions, uses, and reaching
|
|
415
|
+
definitions. CALL edges are emitted only for a uniquely resolved explicit
|
|
416
|
+
callee. Ambiguous or unsupported semantics increase the unresolved count and
|
|
417
|
+
are reported as `sound_partial`; the navigator does not fabricate certainty.
|
|
418
|
+
|
|
419
|
+
CPG construction is lazy: navigation prewarming creates no graph. The first
|
|
420
|
+
request parses only the selected source, and identical requests reuse an
|
|
421
|
+
in-memory LRU keyed by workspace revision, target, `graph`, `direction`, and
|
|
422
|
+
`depth`. The CPG LRU receives 20 percent of the configured retained-cache
|
|
423
|
+
budget, capped at 128 MiB. Source text and full parser trees are not retained
|
|
424
|
+
inside graph records, and normal navigation keeps its existing cache path.
|
|
425
|
+
|
|
426
|
+
The release gate used the pinned 8,549-file FPC corpus with 4,021,192 physical
|
|
427
|
+
lines on an Apple-silicon Mac with Python 3.14 and eight workers. Navigation
|
|
428
|
+
prewarming took 22.62 seconds. The first focused CPG query took 0.0166 seconds;
|
|
429
|
+
the cached query took 0.000069 seconds and retained 4,007 bytes. Exactly one
|
|
430
|
+
source was parsed for CPG. Legacy navigation retained 98.43 percent of its
|
|
431
|
+
in-run control throughput, above the 95-percent release floor. Reproduce it
|
|
432
|
+
with `python scripts/benchmark_cpg.py --root CORPUS --query Run --workers 8`.
|
|
433
|
+
|
|
357
434
|
For every source size the navigator builds an outline first, loads source detail
|
|
358
435
|
lazily for a selected target, and returns only selected fragments. Typed source
|
|
359
436
|
chunks are at most 6000 characters and also respect the response budget. This
|
|
@@ -383,14 +460,16 @@ retired `.opencode/tools` path and never reads or changes `opencode.json`; that
|
|
|
383
460
|
file remains entirely user-owned. The deprecated `--write-config` and
|
|
384
461
|
`--write-agent` options are accepted harmlessly for compatibility.
|
|
385
462
|
|
|
386
|
-
The plugin maintains one worker per session/root, reusing focus and
|
|
463
|
+
The plugin maintains one worker per session/root, reusing focus, indexes, and
|
|
464
|
+
lazy CPG subgraphs.
|
|
387
465
|
During compaction it restores the focus and summary into the new context.
|
|
388
466
|
Transport failure, session deletion, and plugin disposal clean up the worker.
|
|
389
467
|
|
|
390
468
|
OpenCode history: 1.1.0 and 1.1.1 used a spawned view per call model.
|
|
391
469
|
Persistent session/root worker support first shipped in 2.0.0.
|
|
392
470
|
This is the same persistent session/root worker boundary.
|
|
393
|
-
The OpenCode worker stays separate from CLI daemon
|
|
471
|
+
The OpenCode worker stays separate from CLI daemon. Protocol v3 adds CPG
|
|
472
|
+
arguments without changing the persistent session/root boundary.
|
|
394
473
|
|
|
395
474
|
A generated OpenCode agent starts with this Markdown frontmatter:
|
|
396
475
|
|
|
@@ -426,7 +505,7 @@ permission:
|
|
|
426
505
|
|
|
427
506
|
Select `python-delphi-lsp`, ask it to load the `python-delphi-lsp` skill, then
|
|
428
507
|
use `delphi_codebase` actions such as
|
|
429
|
-
`open`, `find`, `focus`, and `
|
|
508
|
+
`open`, `find`, `focus`, `inspect`, and `cpg`. Use semantic tool calls, not raw
|
|
430
509
|
source tools.
|
|
431
510
|
|
|
432
511
|
For architecture questions, call `metrics` without a query to compare unit
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
`python-delphi-lsp` parses Delphi/Object Pascal, builds semantic and project
|
|
4
4
|
indexes, serves LSP, and provides bounded codebase navigation for agents.
|
|
5
|
-
Version
|
|
5
|
+
Version 3.1.0 is authored by Dark Light and supports Windows, macOS, and Linux.
|
|
6
6
|
|
|
7
7
|
## Install and quick start
|
|
8
8
|
|
|
@@ -144,7 +144,7 @@ directories such as `build`, `dist`, environments, VCS folders, `node_modules`,
|
|
|
144
144
|
and tool caches. Missing paths and invalid metadata become problems; paths are
|
|
145
145
|
not guessed.
|
|
146
146
|
|
|
147
|
-
## Agent CLI and Interface/Protocol
|
|
147
|
+
## Agent CLI and Interface/Protocol v3
|
|
148
148
|
|
|
149
149
|
`delphi-lsp-agent` has these subcommands and options:
|
|
150
150
|
|
|
@@ -159,9 +159,13 @@ delphi-lsp-agent view --root PATH [--project-file FILE] --layer LAYER
|
|
|
159
159
|
[--workers auto|N]
|
|
160
160
|
delphi-lsp-agent index --root PATH [--project-file FILE] [--out FILE]
|
|
161
161
|
[--workers auto|N]
|
|
162
|
+
delphi-lsp-agent wiki export --root PATH [--project-file FILE] [--out DIRECTORY]
|
|
163
|
+
[--workers auto|N] [--force]
|
|
162
164
|
delphi-lsp-agent query --root PATH ACTION [VALUE]
|
|
163
165
|
[--project-id ID] [--detail summary|declaration|members|context|body|implementations]
|
|
164
166
|
[--relation references|callers|callees|uses|used_by|inherits|implements]
|
|
167
|
+
[--graph ast|cfg|dfg|call|full] [--direction out|in|both]
|
|
168
|
+
[--depth 1..16]
|
|
165
169
|
[--cursor TEXT] [--max-items INT] [--max-chars INT]
|
|
166
170
|
delphi-lsp-agent skill install [--target PATH] [--force]
|
|
167
171
|
delphi-lsp-agent opencode install [--target PATH] [--python PYTHON]
|
|
@@ -180,13 +184,48 @@ delphi-lsp-agent cache stop --root PATH
|
|
|
180
184
|
`cache start` outputs cache lifecycle JSON; runtime warnings are still on stderr.
|
|
181
185
|
`cache status --format json` outputs status JSON to stdout and the same warning stream on stderr.
|
|
182
186
|
`cache stop` outputs stop status JSON and may include warnings on stderr.
|
|
183
|
-
`query` outputs Protocol
|
|
187
|
+
`query` outputs Protocol v3 JSON responses and writes warnings to stderr.
|
|
188
|
+
|
|
189
|
+
### Open Knowledge Format wiki export
|
|
190
|
+
|
|
191
|
+
Export the complete unique knowledge represented by the layered codebase views
|
|
192
|
+
as a portable Markdown wiki:
|
|
193
|
+
|
|
194
|
+
```bash
|
|
195
|
+
delphi-lsp-agent wiki export --root PATH --out codebase-wiki
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
When `--out` is relative, it is resolved below `--root`; the default is
|
|
199
|
+
`.delphi-lsp/wiki`. The command builds the semantic index once, deep-indexes
|
|
200
|
+
discovered projects, calculates workspace and unit metrics, and writes:
|
|
201
|
+
|
|
202
|
+
- an OKF 0.2 root `index.md`;
|
|
203
|
+
- linked project, unit, and symbol concepts;
|
|
204
|
+
- declaration and implementation source fragments;
|
|
205
|
+
- resolved and unresolved semantic references;
|
|
206
|
+
- discovery/project problems and complete metric records;
|
|
207
|
+
- Protocol v3, relation, CPG, cache, and layer-mapping reference concepts.
|
|
208
|
+
|
|
209
|
+
Every non-index concept is UTF-8 Markdown with YAML frontmatter and a non-empty
|
|
210
|
+
`type`. Readable filenames include a stable digest, so overloads and equal names
|
|
211
|
+
from different units remain distinct even on case-insensitive filesystems.
|
|
212
|
+
Output order and content are deterministic. The finished bundle replaces the
|
|
213
|
+
destination only after generation succeeds; an existing non-empty destination
|
|
214
|
+
requires `--force`, and unsafe root/ancestor/symlink targets are rejected.
|
|
215
|
+
|
|
216
|
+
Pages are streamed to disk, decoded source retention is bounded, and metrics
|
|
217
|
+
process source paths without materializing the entire source corpus. Lazy CPG
|
|
218
|
+
subgraphs are documented rather than eagerly multiplied across all possible
|
|
219
|
+
targets; a focused live `cpg` query remains the bounded way to obtain one graph.
|
|
220
|
+
The bundle structure follows the
|
|
221
|
+
[Open Knowledge Format 0.2 specification](https://github.com/GoogleCloudPlatform/knowledge-catalog/blob/main/okf/SPEC.md).
|
|
184
222
|
|
|
185
223
|
```bash
|
|
186
224
|
delphi-lsp-agent query --root PATH find TCustomer
|
|
187
225
|
delphi-lsp-agent query --root PATH focus TARGET_ID
|
|
188
226
|
delphi-lsp-agent query --root PATH inspect
|
|
189
227
|
delphi-lsp-agent query --root PATH trace TARGET_ID --relation callers
|
|
228
|
+
delphi-lsp-agent query --root PATH cpg TARGET_ID --graph full --direction out --depth 4
|
|
190
229
|
delphi-lsp-agent query --root PATH metrics
|
|
191
230
|
delphi-lsp-agent query --root PATH metrics UNIT_QUERY
|
|
192
231
|
delphi-lsp-agent cache status --root PATH --format json
|
|
@@ -258,10 +297,13 @@ an empty-query result, symbol cards, pagination, or JSON payloads. Up to sixteen
|
|
|
258
297
|
recent ranked queries are retained in a small LRU so alternating CLI and
|
|
259
298
|
OpenCode searches remain warm.
|
|
260
299
|
|
|
261
|
-
`cache start` waits up to `--startup-timeout 120` seconds
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
300
|
+
`cache start` waits up to `--startup-timeout 120` seconds for the child process
|
|
301
|
+
to bind and publish readiness metadata, not for the large workspace to finish
|
|
302
|
+
prewarming. Workspace discovery and prewarming continue in the daemon while
|
|
303
|
+
status reports `warming`. If bootstrap fails, the CLI reports whether it timed
|
|
304
|
+
out or exited, the exit code, Python executable, workspace, and a sanitized
|
|
305
|
+
tail of child stderr. Starting a live root with a different worker
|
|
306
|
+
configuration reports a configuration conflict.
|
|
265
307
|
|
|
266
308
|
Eviction is ordered: auxiliary caches are evicted first, navigation caches second.
|
|
267
309
|
If compaction removes navigable data, the daemon rebuilds the navigation state on demand
|
|
@@ -284,14 +326,15 @@ outside the root workspace.
|
|
|
284
326
|
`metrics`. For example, `delphi-lsp-agent view --layer metrics --format json`
|
|
285
327
|
returns a project summary and detailed unit metric objects; `--query` filters
|
|
286
328
|
units by name or path.
|
|
287
|
-
`index` materializes overview, projects, and problems JSON. `
|
|
329
|
+
`index` materializes overview, projects, and problems JSON. `wiki export`
|
|
330
|
+
materializes the same navigational knowledge as a linked OKF Markdown bundle. `skill install`
|
|
288
331
|
writes the skill; `opencode install` writes the package-named skill, Markdown
|
|
289
332
|
agent, and plugin. The two deprecated write flags are harmless aliases and do
|
|
290
333
|
not change user configuration.
|
|
291
334
|
`worker` serves NDJSON over standard input/output.
|
|
292
335
|
|
|
293
|
-
Protocol
|
|
294
|
-
`problems`, and `
|
|
336
|
+
Protocol v3 actions are `open`, `find`, `inspect`, `trace`, `focus`,
|
|
337
|
+
`problems`, `metrics`, and `cpg`. A `metrics` request without a query returns the
|
|
295
338
|
project summary followed by unit cards. A query filters units, while a unit
|
|
296
339
|
`target_id` from `open` selects one unit; `detail: "members"` adds routine,
|
|
297
340
|
Halstead, dependency, and symbol-count detail without returning source text.
|
|
@@ -301,12 +344,15 @@ Detail values are `summary`, `declaration`, `members`,
|
|
|
301
344
|
`implements`.
|
|
302
345
|
|
|
303
346
|
A request requires `action` and can include `query`, `target_id`,
|
|
304
|
-
`project_id`, `detail`, `relation`, `
|
|
305
|
-
`max_chars`. Defaults are empty text fields,
|
|
306
|
-
relation, `
|
|
307
|
-
|
|
347
|
+
`project_id`, `detail`, `relation`, `graph`, `direction`, `depth`, `cursor`,
|
|
348
|
+
`max_items`, and `max_chars`. Defaults are empty text fields,
|
|
349
|
+
`detail: "summary"`, no relation, `graph: "full"`, `direction: "out"`,
|
|
350
|
+
`depth: 4`, `max_items: 12`, and `max_chars: 12000`. Depth is 1–16;
|
|
351
|
+
response ranges are 1–50 items and 256–40000 characters. A successful envelope
|
|
352
|
+
has `schema: 3`,
|
|
308
353
|
`workspace_revision`, `focus` (project, unit, and target IDs), `result`,
|
|
309
|
-
`page`, and `context`; errors have `schema:
|
|
354
|
+
`page`, and `context`; errors have `schema: 3` and a code/message. Existing
|
|
355
|
+
target IDs remain unchanged across the protocol upgrade.
|
|
310
356
|
|
|
311
357
|
Focus preserves the selected project, unit, or target. Cursors bind a workspace
|
|
312
358
|
revision and request fingerprint, so source changes and cross-target or
|
|
@@ -314,6 +360,37 @@ cross-detail reuse invalidate them. `max_items` and `max_chars` bound each
|
|
|
314
360
|
response. A `sound_partial` relation is sound but incomplete: unresolved and
|
|
315
361
|
ambiguous relations are never fabricated. Unsupported relations are rejected.
|
|
316
362
|
|
|
363
|
+
### Lazy code property graph
|
|
364
|
+
|
|
365
|
+
The `cpg` action translates one selected unit, type, or routine into a bounded
|
|
366
|
+
code property graph. Graph selectors are `ast`, `cfg`, `dfg`, `call`, and `full`;
|
|
367
|
+
`direction` accepts `out`, `in`, or `both`, and `depth` limits traversal
|
|
368
|
+
from the selected target. Together, `graph`, `direction`, and `depth` select
|
|
369
|
+
the returned subgraph. Results contain stable CPG node and edge IDs,
|
|
370
|
+
location and symbol properties, graph metadata, and explicit problems.
|
|
371
|
+
|
|
372
|
+
AST edges preserve syntax containment. CFG edges include routine entry/exit,
|
|
373
|
+
sequence, conditional branches, loop back-edges, and conservative structured
|
|
374
|
+
control flow. Local DFG edges distinguish definitions, uses, and reaching
|
|
375
|
+
definitions. CALL edges are emitted only for a uniquely resolved explicit
|
|
376
|
+
callee. Ambiguous or unsupported semantics increase the unresolved count and
|
|
377
|
+
are reported as `sound_partial`; the navigator does not fabricate certainty.
|
|
378
|
+
|
|
379
|
+
CPG construction is lazy: navigation prewarming creates no graph. The first
|
|
380
|
+
request parses only the selected source, and identical requests reuse an
|
|
381
|
+
in-memory LRU keyed by workspace revision, target, `graph`, `direction`, and
|
|
382
|
+
`depth`. The CPG LRU receives 20 percent of the configured retained-cache
|
|
383
|
+
budget, capped at 128 MiB. Source text and full parser trees are not retained
|
|
384
|
+
inside graph records, and normal navigation keeps its existing cache path.
|
|
385
|
+
|
|
386
|
+
The release gate used the pinned 8,549-file FPC corpus with 4,021,192 physical
|
|
387
|
+
lines on an Apple-silicon Mac with Python 3.14 and eight workers. Navigation
|
|
388
|
+
prewarming took 22.62 seconds. The first focused CPG query took 0.0166 seconds;
|
|
389
|
+
the cached query took 0.000069 seconds and retained 4,007 bytes. Exactly one
|
|
390
|
+
source was parsed for CPG. Legacy navigation retained 98.43 percent of its
|
|
391
|
+
in-run control throughput, above the 95-percent release floor. Reproduce it
|
|
392
|
+
with `python scripts/benchmark_cpg.py --root CORPUS --query Run --workers 8`.
|
|
393
|
+
|
|
317
394
|
For every source size the navigator builds an outline first, loads source detail
|
|
318
395
|
lazily for a selected target, and returns only selected fragments. Typed source
|
|
319
396
|
chunks are at most 6000 characters and also respect the response budget. This
|
|
@@ -343,14 +420,16 @@ retired `.opencode/tools` path and never reads or changes `opencode.json`; that
|
|
|
343
420
|
file remains entirely user-owned. The deprecated `--write-config` and
|
|
344
421
|
`--write-agent` options are accepted harmlessly for compatibility.
|
|
345
422
|
|
|
346
|
-
The plugin maintains one worker per session/root, reusing focus and
|
|
423
|
+
The plugin maintains one worker per session/root, reusing focus, indexes, and
|
|
424
|
+
lazy CPG subgraphs.
|
|
347
425
|
During compaction it restores the focus and summary into the new context.
|
|
348
426
|
Transport failure, session deletion, and plugin disposal clean up the worker.
|
|
349
427
|
|
|
350
428
|
OpenCode history: 1.1.0 and 1.1.1 used a spawned view per call model.
|
|
351
429
|
Persistent session/root worker support first shipped in 2.0.0.
|
|
352
430
|
This is the same persistent session/root worker boundary.
|
|
353
|
-
The OpenCode worker stays separate from CLI daemon
|
|
431
|
+
The OpenCode worker stays separate from CLI daemon. Protocol v3 adds CPG
|
|
432
|
+
arguments without changing the persistent session/root boundary.
|
|
354
433
|
|
|
355
434
|
A generated OpenCode agent starts with this Markdown frontmatter:
|
|
356
435
|
|
|
@@ -386,7 +465,7 @@ permission:
|
|
|
386
465
|
|
|
387
466
|
Select `python-delphi-lsp`, ask it to load the `python-delphi-lsp` skill, then
|
|
388
467
|
use `delphi_codebase` actions such as
|
|
389
|
-
`open`, `find`, `focus`, and `
|
|
468
|
+
`open`, `find`, `focus`, `inspect`, and `cpg`. Use semantic tool calls, not raw
|
|
390
469
|
source tools.
|
|
391
470
|
|
|
392
471
|
For architecture questions, call `metrics` without a query to compare unit
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "3.1.0"
|