attocode-code-intel 0.1.25__tar.gz → 0.1.27__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.
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/PKG-INFO +5 -1
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/README.md +4 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/pyproject.toml +1 -1
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/__init__.py +1 -1
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/context/module_resolution.py +2 -1
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/lsp/client.py +56 -5
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/precision.py +6 -5
- attocode_code_intel-0.1.27/tests/test_namespace_snapshot.py +60 -0
- attocode_code_intel-0.1.27/tests/test_precision_budget.py +264 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_quality_evidence.py +53 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/.gitignore +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/LICENSE +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/GUIDELINES.md +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/__init__.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/errors/__init__.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/__init__.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/context/__init__.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/context/architecture_drift.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/context/ast_chunker.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/context/ast_service.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/context/ast_snapshot.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/context/blob_oid.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/context/cache_manifest.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/context/cas.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/context/code_analyzer.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/context/codebase_ast.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/context/codebase_context.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/context/cross_mode.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/context/cross_references.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/context/discovery_snapshot.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/context/embedding_rotation.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/context/embeddings.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/context/frecency.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/context/fuzzy.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/context/hierarchical_explorer.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/context/hydration.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/context/index_probe.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/context/index_repair.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/context/index_store.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/context/language_registry.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/context/memory_store.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/context/parse_diagnostics.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/context/query_constraints.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/context/query_history.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/context/reranker.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/context/semantic_search.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/context/syntax_evidence.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/context/systemone_ranker.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/context/temporal_coupling.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/context/trigram_index.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/context/trigram_regex.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/context/ts_parser.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/context/vector_store.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/feature_flags/__init__.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/lsp/__init__.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/mcp/__init__.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/mcp/client.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/security/__init__.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/security/custom_rules.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/security/dataflow.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/security/dependency_audit.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/security/matcher.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/security/patterns.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/security/scanner.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/utilities/__init__.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/utilities/ignore.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/integrations/utilities/token_estimate.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/types/__init__.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/types/events.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/types/severity.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_shared.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/analysis_coverage.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/__init__.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/access.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/app.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/auth/__init__.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/auth/api_keys.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/auth/context.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/auth/jwt.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/auth/oauth.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/auth/passwords.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/deps.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/knowledge_bridge.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/mcp_transport.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/middleware.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/models.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/providers/__init__.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/providers/db_provider.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/providers/local_provider.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/providers/remote_provider.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/repository_source.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/routes/__init__.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/routes/_pin_helper.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/routes/activity.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/routes/adr.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/routes/analysis.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/routes/api_keys.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/routes/auth.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/routes/branches.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/routes/cross_repo_search.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/routes/embeddings.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/routes/files.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/routes/files_v2.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/routes/gc.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/routes/git_v2.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/routes/graph.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/routes/graph_viz.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/routes/health.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/routes/history.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/routes/jobs.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/routes/learning.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/routes/lsp.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/routes/notify.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/routes/operations.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/routes/orgs.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/routes/preferences.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/routes/presence.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/routes/projects.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/routes/repos.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/routes/search.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/routes/snapshots.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/routes/webhooks.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/routes/websocket.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/static/graph.html +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/api/utils.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/artifacts/__init__.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/artifacts/hashing.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/artifacts/provenance.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/artifacts/retrieval_pin.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/audit.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/bug_finder.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/bundle.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/catalog.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/change_evidence.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/change_investigation.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/change_review.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/cli.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/community.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/confidence/__init__.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/confidence/jev.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/confidence/llm.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/confidence/redact.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/confidence/settings.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/config.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/crypto.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/db/__init__.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/db/base.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/db/engine.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/db/models.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/entrypoint.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/focused_evidence.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/freshness.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/gateway.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/git/__init__.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/git/credentials.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/git/manager.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/git/models.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/git/storage.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/graph_query_parser.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/helpers.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/indexing/__init__.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/indexing/debouncer.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/indexing/delta_indexer.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/indexing/full_indexer.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/indexing/incremental.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/indexing/parser.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/indexing/summarizer.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/installer.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/investigation_cli.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/knowledge.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/local_knowledge.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/migrations/alembic.ini +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/migrations/env.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/migrations/script.py.mako +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/migrations/versions/001_initial_schema.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/migrations/versions/002_branch_version_and_embeddings.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/migrations/versions/003_embedding_uniqueness_and_cascade.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/migrations/versions/004_audit_events.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/migrations/versions/005_user_preferences.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/migrations/versions/006_google_oauth.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/migrations/versions/007_pgvector_embeddings.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/migrations/versions/008_symbol_references.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/migrations/versions/009_webhook_secret_encryption.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/migrations/versions/010_add_commits_table.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/migrations/versions/011_commit_changed_files.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/migrations/versions/012_branch_merged_at.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/migrations/versions/013_revoked_tokens.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/migrations/versions/014_blame_hunks.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/migrations/versions/015_commit_file_stats.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/migrations/versions/016_embedding_provenance_columns.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/migrations/versions/017_provenance_table.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/migrations/versions/018_repo_snapshots.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/migrations/versions/019_symref_caller.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/migrations/versions/020_shared_knowledge.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/onboarding.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/output.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/presence.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/probe.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/project_dir.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/pubsub.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/query_ranking.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/readiness.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/redis.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/reference_pages.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/remote.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/repo_ranker.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/request_context.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/__init__.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/ci.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/combinators.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/enricher.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/evolution.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/executor.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/filters/__init__.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/filters/pipeline.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/formatter.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/hygiene.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/importers/__init__.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/importers/semgrep.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/loader.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/marketplace.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/metavar.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/model.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/__init__.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/community/_license_templates/Apache-2.0.txt +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/community/_license_templates/MIT.txt +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/community/bandit-python/LICENSE +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/community/bandit-python/NOTICE +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/community/bandit-python/PORTING.md +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/community/bandit-python/manifest.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/community/bandit-python/rules/B105-hardcoded-password.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/community/bandit-python/rules/B303-weak-md5.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/community/bandit-python/rules/B304-weak-des.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/community/bandit-python/rules/B307-use-of-eval.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/community/bandit-python/rules/B324-weak-sha1.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/community/bandit-python/rules/B501-no-cert-validation.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/community/bandit-python/rules/B602-shell-true.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/community/bandit-python/rules/B608-sqli.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/community/eslint-typescript/LICENSE +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/community/eslint-typescript/NOTICE +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/community/eslint-typescript/PORTING.md +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/community/eslint-typescript/manifest.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/community/eslint-typescript/rules/eqeqeq.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/community/eslint-typescript/rules/no-eval.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/community/eslint-typescript/rules/no-implied-eval.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/community/eslint-typescript/rules/no-new-func.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/community/eslint-typescript/rules/no-throw-literal.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/community/eslint-typescript/rules/no-var.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/community/eslint-typescript/rules/no-with.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/community/gosec-go/LICENSE +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/community/gosec-go/NOTICE +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/community/gosec-go/PORTING.md +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/community/gosec-go/manifest.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/community/gosec-go/rules/G101-hardcoded-credentials.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/community/gosec-go/rules/G102-bind-all-interfaces.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/community/gosec-go/rules/G103-unsafe-block.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/community/gosec-go/rules/G201-sql-format.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/community/gosec-go/rules/G304-file-inclusion.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/community/gosec-go/rules/G401-weak-cipher.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/community/gosec-go/rules/G402-tls-min-version.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/community/gosec-go/rules/G501-md5-import.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/examples/cpp/manifest.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/examples/cpp/rules/security.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/examples/cpp/rules/structural.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/examples/csharp/manifest.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/examples/csharp/rules/security.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/examples/csharp/rules/structural.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/examples/go/manifest.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/examples/go/rules/performance.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/examples/go/rules/security.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/examples/go/rules/structural.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/examples/go/taint/sanitizers.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/examples/go/taint/sinks.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/examples/go/taint/sources.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/examples/java/manifest.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/examples/java/rules/correctness.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/examples/java/rules/structural.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/examples/java/taint/sinks.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/examples/java/taint/sources.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/examples/kotlin/manifest.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/examples/kotlin/rules/correctness.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/examples/kotlin/rules/structural.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/examples/php/manifest.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/examples/php/rules/security.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/examples/php/rules/structural.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/examples/python/manifest.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/examples/python/rules/performance.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/examples/python/rules/structural.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/examples/ruby/manifest.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/examples/ruby/rules/security.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/examples/ruby/rules/structural.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/examples/rust/manifest.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/examples/rust/rules/correctness.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/examples/rust/rules/structural.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/examples/typescript/manifest.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/examples/typescript/rules/performance.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/examples/typescript/rules/structural.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/packs/pack_loader.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/plugins/__init__.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/plugins/plugin_loader.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/profiling.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/registry.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/sarif.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/synthesis.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/rules/testing.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/search_evidence.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/server.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/service.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/sharing.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/storage/__init__.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/storage/branch_overlay.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/storage/content_store.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/storage/dependency_store.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/storage/diff_engine.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/storage/embedding_store.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/storage/provenance_store.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/storage/security_scanner_db.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/storage/symbol_store.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/structural_evidence.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/symbol_inspection.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/symbol_links.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/telemetry.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/test_ranking.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/testing/__init__.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/testing/fixtures.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/testing/helpers.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/testing/mocks.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/tools/__init__.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/tools/adr_tools.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/tools/analysis_tools.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/tools/composite_tools.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/tools/cross_mode_tools.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/tools/dead_code_tools.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/tools/distill_tools.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/tools/frecency_tools.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/tools/fuzzy_tools.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/tools/history_tools.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/tools/learning_tools.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/tools/lsp_tools.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/tools/maintenance_tools.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/tools/navigation_tools.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/tools/overlay_tools.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/tools/pin_store.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/tools/pin_tools.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/tools/query_constraints_tools.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/tools/query_history_tools.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/tools/readiness_tools.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/tools/rule_tools.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/tools/search_tools.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/tools/snapshot_tools.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/workers/__init__.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/workers/job_utils.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/workers/jobs.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/workers/run.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/workers/settings.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/fixtures/rule_violations/.attocode/rules/team-preferences.yaml +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/fixtures/rule_violations/go/bad_patterns.go +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/fixtures/rule_violations/java/BadPatterns.java +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/fixtures/rule_violations/python/bad_patterns.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/fixtures/rule_violations/rust/bad_patterns.rs +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/fixtures/rule_violations/typescript/bad_patterns.ts +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/fixtures/sample_project/.attocode/.gitignore +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/fixtures/sample_project/__init__.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/fixtures/sample_project/main.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/fixtures/sample_project/models.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/fixtures/sample_project/utils.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/integration/__init__.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/integration/code_intel/__init__.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/integration/code_intel/conftest.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/integration/code_intel/test_http_smoke.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/integration/code_intel/test_mcp_tools_audit.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/integration/code_intel/test_remote_mcp_http_integration.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/integration/code_intel/test_service_integration.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/integration/test_rule_bench_floor_e2e.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_ast_snapshot.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_behavioral_negation.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_capacity_experiment.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_change_focus.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_change_investigation.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_chunk_identity.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_codex_repair_study.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_cold_discovery.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_cold_index_cost.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_compact_inspection.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_corpus_capture.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_daily_workflows.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_db_navigation_http.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_discovery_ceiling.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_discovery_reuse.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_doctor.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_doctor_runtime.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_edit_restart.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_experiment_dispatch.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_experiment_evidence.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_experiment_readiness.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_external_study.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_fallback_lexical.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_file_symbol_scope.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_fixture_source_alias.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_focused_inspection.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_image_budget.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_importance_publication.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_index_probe.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_index_processes.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_index_reuse.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_index_sequences.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_kotlin_test_paths.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_language_capabilities.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_lean_profile.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_lexical_sql_cost.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_local_reranker.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_local_workflow_evidence.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_localize_study.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_lsp_diagnostics.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_lsp_document_lifecycle.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_lsp_stderr_lifecycle.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_mcp_search_evaluation.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_mixed_workspace.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_module_ownership.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_native_capture.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_native_experiment.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_navigation_evidence.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_navigation_prefix_trial.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_ocaml_parser_routing.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_onboarding_study.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_operation_contracts.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_optional_grammar_admission.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_optional_language_depth.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_parse_recovery.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_parser_thread_isolation.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_pilot.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_precision_protocol.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_precision_recovery.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_preview_admission.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_preview_experiment.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_preview_sources.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_preview_windows.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_product.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_quality_cloud.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_quality_evaluation.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_quality_lifecycle.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_quality_runner.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_query_ranking.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_query_requirements.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_ranking_intent.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_real_language_server.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_recovery_readiness.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_release_verification.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_remote.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_repair_study.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_restart_experiment.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_retrieval_ablation.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_retrieval_audit.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_retrieval_body_trial.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_retrieval_cycle.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_search_budget_repair.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_search_coverage.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_search_coverage_scale.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_search_evidence.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_search_evidence_audit.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_search_usefulness.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_snippet_budget.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_source_exclusions.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_structural_evidence.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_structural_write_cost.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_study.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_symbol_order.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_systemone_ranker.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_test_intent_trial.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_token_overhead.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_trigram_workspace.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_understanding_evaluation.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_walk_order.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_warm_cache.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/test_workflow_sequences.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/__init__.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/__init__.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/conftest.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_advisory_lock.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_api.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_api_phase3a.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_api_v2.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_auth.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_branch_versioning.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_bug_finder.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_call_graph_tool.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_ci_runner.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_cli_lifecycle.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_cli_maintenance_local.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_cli_ops.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_cli_query_commands.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_cli_remote.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_codex_rereview_polish.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_combinators.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_confidence.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_confidence_adoption.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_config.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_config_remote.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_cross_mode.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_db_security_scan.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_deps.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_diff_engine.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_edge_cases.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_frecency.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_fuzzy.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_index_store_migration.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_kw_index_status.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_lsp_call_graph.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_lsp_enrichment.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_lsp_extended_models.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_marketplace.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_metavar.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_middleware.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_notify_enhanced.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_org_isolation.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_pack_autoload.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_profiling.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_project_discovery.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_provenance_store.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_pubsub_streams.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_query_constraints.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_query_history.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_readiness.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_reindex_embeddings.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_remote_local_fallback.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_remote_provider.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_remote_reliability.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_repo_ranker.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_rule_evolution.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_rule_hygiene.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_rule_synthesis.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_rule_tools.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_rule_violations.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_rules_engine.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_rules_integration.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_sarif.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_search_tools.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_server_startup.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_service.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_service_mode.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_status_health.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_structural_executor.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_supply_chain_rules.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_testing_framework.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/test_webhook_encryption.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/tools/__init__.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/tools/conftest.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/tools/test_adr_tools.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/tools/test_analysis_tools.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/tools/test_dead_code_tools.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/tools/test_distill_tools.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/tools/test_history_tools.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/tools/test_learning_tools.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/tools/test_lsp_tools.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/tools/test_maintenance_tools_phase2.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/tools/test_navigation_tools.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/tools/test_phase2c_anchors_and_overlays.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/tools/test_readiness_tools.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/tools/test_search_status_mismatch.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/tools/test_search_tools.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/code_intel/tools/test_server_tools.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/context/__init__.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/context/test_action_hash.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/context/test_ast_service_adapter.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/context/test_blob_oid.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/context/test_cache_manifest.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/context/test_cas.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/context/test_embedding_rotation.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/context/test_pagerank_restoration.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/context/test_provenance.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/context/test_retrieval_pin.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/context/test_vector_store_dim_safety.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/eval/__init__.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/eval/conftest.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/eval/test_acc_at_k.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/eval/test_broad_candidate_audit.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/eval/test_calibration_demo.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/eval/test_harness.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/eval/test_matrix_agents.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/eval/test_matrix_ci.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/eval/test_matrix_datasets.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/eval/test_matrix_dense.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/eval/test_matrix_embed_screen.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/eval/test_matrix_function_bm25.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/eval/test_matrix_function_dense.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/eval/test_matrix_rerank.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/eval/test_matrix_retrieve.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/eval/test_matrix_run.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/eval/test_matrix_stats.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/eval/test_mcp_bench.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/eval/test_rule_accuracy.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/eval/test_rule_bench_config.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/eval/test_rule_bench_corpus.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/eval/test_rule_bench_evaluator.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/eval/test_rule_bench_predicate.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/eval/test_rule_bench_scoring.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/eval/test_rule_bench_template_engine.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/eval/test_rule_harness_import.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/eval/test_search_quality_reporting.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/eval/test_search_readiness.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/eval/test_seed_attocode_fixtures.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/integrations/__init__.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/integrations/context/__init__.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/integrations/context/test_architecture_drift.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/integrations/context/test_ast_service_hydration.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/integrations/context/test_body_chunking.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/integrations/context/test_call_graph.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/integrations/context/test_code_analyzer.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/integrations/context/test_codebase_ast.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/integrations/context/test_codebase_context.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/integrations/context/test_context_stores_closed.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/integrations/context/test_cross_ref_search.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/integrations/context/test_embedder_default.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/integrations/context/test_embeddings.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/integrations/context/test_embeddings_query.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/integrations/context/test_go_symbols.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/integrations/context/test_hydration.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/integrations/context/test_index_store.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/integrations/context/test_model_mismatch.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/integrations/context/test_path_downweight.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/integrations/context/test_query_routing.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/integrations/context/test_semantic_search.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/integrations/context/test_supported_languages.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/integrations/context/test_temporal_coupling.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/integrations/context/test_trigram_index.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/integrations/context/test_trigram_regex.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/integrations/context/test_ts_parser.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/integrations/test_dataflow.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/integrations/test_feature_flags.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/integrations/test_new_security_rules.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/integrations/test_security_autofix.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/integrations/test_security_matcher.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/integrations/test_streaming_lsp.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/integrations/utilities/__init__.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/integrations/utilities/test_ignore.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/integrations/utilities/test_token_estimate.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/test_code_intel.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/test_code_intel_hydration.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/test_errors.py +0 -0
- {attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/tests/unit/test_memory_store.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: attocode-code-intel
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.27
|
|
4
4
|
Summary: Local code search and navigation for coding agents and people
|
|
5
5
|
Project-URL: Homepage, https://github.com/eren23/attocode
|
|
6
6
|
Project-URL: Repository, https://github.com/eren23/attocode
|
|
@@ -156,6 +156,10 @@ To use the latest source, install from a clone of this repository: `uv tool inst
|
|
|
156
156
|
|
|
157
157
|
## What your agent gets
|
|
158
158
|
|
|
159
|
+
Version 0.1.27 fixes a dictionary-size error during symbol inspection when AST hydration changes the cache concurrently. Namespace resolution snapshots cached file membership; later changes appear in the next build. See the [release notes](https://github.com/eren23/attocode/blob/main/docs/intelligence-0.1.27.md).
|
|
160
|
+
|
|
161
|
+
Version 0.1.26 gives Rust precision lookups a shared five-second budget and fixes cancelled startup cleanup when a child retains inherited pipes. Other languages keep two seconds; longer reloads still return partial evidence.
|
|
162
|
+
|
|
159
163
|
Version 0.1.25 uses OpenAI embeddings only when you set `ATTOCODE_EMBEDDING_MODEL=openai`. Before, an `OPENAI_API_KEY` in the environment was enough to send code chunks to OpenAI at index time. Rust references are also more reliable while rust-analyzer loads.
|
|
160
164
|
|
|
161
165
|
Version 0.1.24 adds `ATTOCODE_INTEL_RANKING_PROVIDER=openrouter`, a preset for the opt-in hosted rerank. In a frozen trial with 24 short questions, the rerank found 24 of 26 labeled files in the first five results, against 20 without it; see [Hosted rerank](https://github.com/eren23/attocode/blob/main/docs/intelligence-search.md#hosted-rerank-experimental). Rerank stays off by default, because it sends source excerpts to OpenRouter.
|
|
@@ -43,6 +43,10 @@ To use the latest source, install from a clone of this repository: `uv tool inst
|
|
|
43
43
|
|
|
44
44
|
## What your agent gets
|
|
45
45
|
|
|
46
|
+
Version 0.1.27 fixes a dictionary-size error during symbol inspection when AST hydration changes the cache concurrently. Namespace resolution snapshots cached file membership; later changes appear in the next build. See the [release notes](https://github.com/eren23/attocode/blob/main/docs/intelligence-0.1.27.md).
|
|
47
|
+
|
|
48
|
+
Version 0.1.26 gives Rust precision lookups a shared five-second budget and fixes cancelled startup cleanup when a child retains inherited pipes. Other languages keep two seconds; longer reloads still return partial evidence.
|
|
49
|
+
|
|
46
50
|
Version 0.1.25 uses OpenAI embeddings only when you set `ATTOCODE_EMBEDDING_MODEL=openai`. Before, an `OPENAI_API_KEY` in the environment was enough to send code chunks to OpenAI at index time. Rust references are also more reliable while rust-analyzer loads.
|
|
47
51
|
|
|
48
52
|
Version 0.1.24 adds `ATTOCODE_INTEL_RANKING_PROVIDER=openrouter`, a preset for the opt-in hosted rerank. In a frozen trial with 24 short questions, the rerank found 24 of 26 labeled files in the first five results, against 20 without it; see [Hosted rerank](https://github.com/eren23/attocode/blob/main/docs/intelligence-search.md#hosted-rerank-experimental). Rerank stays off by default, because it sends source excerpts to OpenRouter.
|
|
@@ -165,7 +165,8 @@ class FileIndex(dict):
|
|
|
165
165
|
|
|
166
166
|
def configure_namespaces(self, asts):
|
|
167
167
|
self.namespace_files = defaultdict(lambda: defaultdict(dict))
|
|
168
|
-
|
|
168
|
+
# Hydration can change cache membership while namespace members are read.
|
|
169
|
+
for path, ast in asts.copy().items():
|
|
169
170
|
names = {c.name for c in ast.classes} | {f.name for f in ast.functions}
|
|
170
171
|
for namespace in ast.namespaces + ([c.name for c in ast.classes] if ast.language == "elixir" else []):
|
|
171
172
|
self.namespace_files[ast.language][namespace.replace('\\', '.')][path] = names
|
|
@@ -369,6 +369,50 @@ class _LSPClient:
|
|
|
369
369
|
future.cancel()
|
|
370
370
|
self._pending.clear()
|
|
371
371
|
|
|
372
|
+
async def _abort_start(
|
|
373
|
+
self,
|
|
374
|
+
process: asyncio.subprocess.Process | None,
|
|
375
|
+
reader: asyncio.Task[None] | None,
|
|
376
|
+
stderr: asyncio.Task[None] | None,
|
|
377
|
+
) -> None:
|
|
378
|
+
"""Release a cancelled startup without waiting for inherited pipes."""
|
|
379
|
+
tasks = {task for task in (*self._notifications, reader, stderr) if task is not None}
|
|
380
|
+
try:
|
|
381
|
+
if process is not None:
|
|
382
|
+
if process.returncode is None:
|
|
383
|
+
try:
|
|
384
|
+
process.kill()
|
|
385
|
+
except ProcessLookupError:
|
|
386
|
+
pass
|
|
387
|
+
if process.stdin is not None:
|
|
388
|
+
transport = process.stdin.transport
|
|
389
|
+
# close() drains buffered writes; an inheriting child may
|
|
390
|
+
# never read them. abort() also handles a pending close.
|
|
391
|
+
if not transport.is_closing() or transport.get_write_buffer_size():
|
|
392
|
+
transport.abort()
|
|
393
|
+
# Process.wait() can wait for descendants to close inherited
|
|
394
|
+
# pipes. asyncio has no public API to close all owned pipes.
|
|
395
|
+
process._transport.close()
|
|
396
|
+
for task in tasks:
|
|
397
|
+
task.cancel()
|
|
398
|
+
async with asyncio.timeout(0.25):
|
|
399
|
+
if process is None:
|
|
400
|
+
await asyncio.gather(*tasks, return_exceptions=True)
|
|
401
|
+
else:
|
|
402
|
+
await asyncio.gather(*tasks, process.wait(), return_exceptions=True)
|
|
403
|
+
except TimeoutError:
|
|
404
|
+
logger.warning("LSP %s: cancelled startup cleanup timed out", self.language_id)
|
|
405
|
+
finally:
|
|
406
|
+
self._process = None
|
|
407
|
+
self._reader_task = self._stderr_task = None
|
|
408
|
+
self._initialized = self._is_stopping = False
|
|
409
|
+
self._documents.clear()
|
|
410
|
+
self._notifications.clear()
|
|
411
|
+
for future in self._pending.values():
|
|
412
|
+
if not future.done():
|
|
413
|
+
future.cancel()
|
|
414
|
+
self._pending.clear()
|
|
415
|
+
|
|
372
416
|
async def get_definition(
|
|
373
417
|
self, uri: str, line: int, character: int
|
|
374
418
|
) -> LSPLocation | None:
|
|
@@ -933,9 +977,9 @@ class LSPManager:
|
|
|
933
977
|
return started
|
|
934
978
|
|
|
935
979
|
async def start_server(
|
|
936
|
-
self, language_id: str, root_uri: str | None = None
|
|
980
|
+
self, language_id: str, root_uri: str | None = None, *, timeout: float | None = None
|
|
937
981
|
) -> None:
|
|
938
|
-
"""Start a
|
|
982
|
+
"""Start a server, optionally overriding this client's timeout only."""
|
|
939
983
|
if language_id in self._clients:
|
|
940
984
|
return
|
|
941
985
|
|
|
@@ -957,7 +1001,7 @@ class LSPManager:
|
|
|
957
1001
|
client = _LSPClient(
|
|
958
1002
|
server_config,
|
|
959
1003
|
root_uri or self._root_uri,
|
|
960
|
-
self._timeout,
|
|
1004
|
+
self._timeout if timeout is None else timeout,
|
|
961
1005
|
on_diags,
|
|
962
1006
|
)
|
|
963
1007
|
|
|
@@ -968,8 +1012,15 @@ class LSPManager:
|
|
|
968
1012
|
|
|
969
1013
|
try:
|
|
970
1014
|
await client.start()
|
|
971
|
-
except BaseException:
|
|
972
|
-
|
|
1015
|
+
except BaseException as exc:
|
|
1016
|
+
process, reader, stderr = client._process, client._reader_task, client._stderr_task
|
|
1017
|
+
try:
|
|
1018
|
+
if isinstance(exc, asyncio.CancelledError):
|
|
1019
|
+
raise
|
|
1020
|
+
await client.stop()
|
|
1021
|
+
except asyncio.CancelledError:
|
|
1022
|
+
await client._abort_start(process, reader, stderr)
|
|
1023
|
+
raise
|
|
973
1024
|
raise
|
|
974
1025
|
self._clients[language_id] = client
|
|
975
1026
|
self._emit("lsp.started", {
|
|
@@ -50,7 +50,8 @@ class PrecisionSession:
|
|
|
50
50
|
self.retry_after.pop(key)
|
|
51
51
|
from ._internal.integrations.lsp.client import BUILTIN_SERVERS
|
|
52
52
|
outcomes = []
|
|
53
|
-
|
|
53
|
+
timeout = 5.0 if detect_language(definitions[0].file_path) == "rust" else 2.0
|
|
54
|
+
deadline = asyncio.get_running_loop().time() + timeout
|
|
54
55
|
for definition in definitions[:8]:
|
|
55
56
|
language = detect_language(definition.file_path)
|
|
56
57
|
server_id = "typescript" if language == "javascript" else language
|
|
@@ -68,8 +69,8 @@ class PrecisionSession:
|
|
|
68
69
|
try:
|
|
69
70
|
async with asyncio.timeout_at(deadline):
|
|
70
71
|
if server_id not in manager.get_active_servers():
|
|
71
|
-
manager.
|
|
72
|
-
|
|
72
|
+
await manager.start_server(server_id, Path(self.service.project_dir).as_uri(),
|
|
73
|
+
timeout=timeout)
|
|
73
74
|
# Send edits/deletions for all previously opened documents.
|
|
74
75
|
for rel in list(self.pending):
|
|
75
76
|
path = str(Path(self.service.project_dir) / rel)
|
|
@@ -146,7 +147,7 @@ class PrecisionSession:
|
|
|
146
147
|
break
|
|
147
148
|
# A server can briefly return null after a successful
|
|
148
149
|
# warmup or edit. Yield before retrying, never extend
|
|
149
|
-
# the enclosing
|
|
150
|
+
# the enclosing language deadline or loop forever.
|
|
150
151
|
if attempt < 3:
|
|
151
152
|
await asyncio.sleep(.05 * 2 ** attempt)
|
|
152
153
|
# After a null or failed reply, a server that reports
|
|
@@ -180,7 +181,7 @@ class PrecisionSession:
|
|
|
180
181
|
"definitions_truncated": len(definitions) > 8}
|
|
181
182
|
self.completed[key] = result
|
|
182
183
|
# A server can become ready without a source edit. Retry only on a later
|
|
183
|
-
# explicit request after a short cooldown, keeping the same
|
|
184
|
+
# explicit request after a short cooldown, keeping the same language budget.
|
|
184
185
|
if any(o["status"] in _TRANSIENT for o in outcomes):
|
|
185
186
|
self.retry_after[key] = _now() + _RETRY_SECONDS
|
|
186
187
|
return result
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"""Namespace reads keep stable membership while AST hydration publishes files."""
|
|
2
|
+
from concurrent.futures import ThreadPoolExecutor
|
|
3
|
+
from threading import Event
|
|
4
|
+
from types import SimpleNamespace
|
|
5
|
+
|
|
6
|
+
import pytest
|
|
7
|
+
from attocode_intel._internal.integrations.context.module_resolution import FileIndex
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@pytest.mark.parametrize('mutation', ['grow', 'shrink'])
|
|
11
|
+
def test_namespace_lookup_snapshots_cache_during_hydration(mutation):
|
|
12
|
+
reading, changed = Event(), Event()
|
|
13
|
+
|
|
14
|
+
def ast(name):
|
|
15
|
+
return SimpleNamespace(language='php', namespaces=[r'Acme\Core'],
|
|
16
|
+
classes=[SimpleNamespace(name=name)],
|
|
17
|
+
functions=[SimpleNamespace(name=name.lower())])
|
|
18
|
+
|
|
19
|
+
class FirstAST:
|
|
20
|
+
language = 'php'
|
|
21
|
+
namespaces = [r'Acme\Core']
|
|
22
|
+
functions = [SimpleNamespace(name='first')]
|
|
23
|
+
|
|
24
|
+
@property
|
|
25
|
+
def classes(self):
|
|
26
|
+
if not reading.is_set():
|
|
27
|
+
reading.set()
|
|
28
|
+
assert changed.wait(5), 'hydration did not publish its cache update'
|
|
29
|
+
return [SimpleNamespace(name='First')]
|
|
30
|
+
|
|
31
|
+
cache = {'first.php': FirstAST(), 'second.php': ast('Second')}
|
|
32
|
+
index = FileIndex({name: name for name in ('first.php', 'second.php', 'late.php')})
|
|
33
|
+
|
|
34
|
+
def hydrate():
|
|
35
|
+
try:
|
|
36
|
+
assert reading.wait(5), 'namespace traversal did not start'
|
|
37
|
+
if mutation == 'grow':
|
|
38
|
+
cache['late.php'] = ast('Late')
|
|
39
|
+
else:
|
|
40
|
+
del cache['second.php']
|
|
41
|
+
finally:
|
|
42
|
+
changed.set()
|
|
43
|
+
|
|
44
|
+
with ThreadPoolExecutor(max_workers=1) as pool:
|
|
45
|
+
publication = pool.submit(hydrate)
|
|
46
|
+
try:
|
|
47
|
+
index.configure_namespaces(cache)
|
|
48
|
+
finally:
|
|
49
|
+
reading.set()
|
|
50
|
+
publication.result(timeout=5)
|
|
51
|
+
|
|
52
|
+
assert index.namespace_candidates('php', r'Acme\Core\First') == ['first.php']
|
|
53
|
+
assert index.namespace_candidates('php', r'Acme\Core\first') == ['first.php']
|
|
54
|
+
assert index.namespace_candidates('php', r'Acme\Core\Second') == ['second.php']
|
|
55
|
+
assert index.namespace_candidates('php', r'Acme\Core\Late') == []
|
|
56
|
+
|
|
57
|
+
# The next build sees the new membership; the snapshot is local to one read.
|
|
58
|
+
index.configure_namespaces(cache)
|
|
59
|
+
assert index.namespace_candidates('php', r'Acme\Core\Late') == (['late.php'] if mutation == 'grow' else [])
|
|
60
|
+
assert index.namespace_candidates('php', r'Acme\Core\Second') == (['second.php'] if mutation == 'grow' else [])
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
"""Rust reloads get more time without extending other languages or retry deadlines."""
|
|
2
|
+
import sys
|
|
3
|
+
import time
|
|
4
|
+
|
|
5
|
+
import pytest
|
|
6
|
+
from attocode_intel._internal.integrations.lsp.client import (
|
|
7
|
+
BUILTIN_SERVERS,
|
|
8
|
+
LSPConfig,
|
|
9
|
+
LSPManager,
|
|
10
|
+
LanguageServerConfig,
|
|
11
|
+
)
|
|
12
|
+
from attocode_intel.gateway import OperationGateway
|
|
13
|
+
from test_precision_protocol import SERVER
|
|
14
|
+
from test_precision_recovery import _status_server
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def _gateway(tmp_path, monkeypatch, source, language='rust'):
|
|
18
|
+
extension = '.rs' if language == 'rust' else '.py'
|
|
19
|
+
if language == 'rust':
|
|
20
|
+
source = (source.replace("'helper.py'", "'helper.rs'")
|
|
21
|
+
.replace("'caller.py'", "'caller.rs'")
|
|
22
|
+
.replace("'character': 4", "'character': 7"))
|
|
23
|
+
script = tmp_path / 'server.py'
|
|
24
|
+
script.write_text(source)
|
|
25
|
+
monkeypatch.setitem(BUILTIN_SERVERS, language, LanguageServerConfig(
|
|
26
|
+
command=sys.executable, args=[str(script)], extensions=[extension], language_id=language))
|
|
27
|
+
monkeypatch.setenv('ATTOCODE_INTEL_PRECISION', 'auto')
|
|
28
|
+
root = tmp_path / 'project'
|
|
29
|
+
root.mkdir()
|
|
30
|
+
if language == 'rust':
|
|
31
|
+
(root / 'helper.rs').write_text('pub fn helper() -> i32 { 1 }\npub fn local() -> i32 { helper() }\n')
|
|
32
|
+
(root / 'caller.rs').write_text('use crate::helper::helper;\npub fn caller() -> i32 { helper() }\n')
|
|
33
|
+
else:
|
|
34
|
+
(root / 'helper.py').write_text('def helper(): return 1\nhelper()\n')
|
|
35
|
+
(root / 'caller.py').write_text('from helper import helper\nhelper()\n')
|
|
36
|
+
return OperationGateway(str(root), 'daily', watch=False), root, extension
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
async def _inspect(gateway, extension='.rs'):
|
|
40
|
+
response = await gateway.execute('inspect_symbol', {
|
|
41
|
+
'symbol_name': 'helper', 'file_path': 'helper' + extension, 'line': 1})
|
|
42
|
+
assert not response.isError
|
|
43
|
+
return response.structuredContent
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
@pytest.mark.parametrize('delay', ['initialize', 'definition', 'readiness'])
|
|
47
|
+
async def test_rust_recovers_from_a_two_and_a_half_second_delay(tmp_path, monkeypatch, delay):
|
|
48
|
+
if delay == 'readiness':
|
|
49
|
+
source = _status_server(2.5)
|
|
50
|
+
elif delay == 'initialize':
|
|
51
|
+
source = SERVER.replace(" send({'jsonrpc':'2.0','id':pending_init,",
|
|
52
|
+
" __import__('time').sleep(2.5)\n send({'jsonrpc':'2.0','id':pending_init,")
|
|
53
|
+
else:
|
|
54
|
+
source = SERVER.replace(' result = None',
|
|
55
|
+
" if method == 'textDocument/definition': __import__('time').sleep(2.5)\n result = None")
|
|
56
|
+
gateway, _root, _extension = _gateway(tmp_path, monkeypatch, source)
|
|
57
|
+
try:
|
|
58
|
+
result = await _inspect(gateway)
|
|
59
|
+
assert result['metadata']['analysis']['precision']['status'] == 'verified', result
|
|
60
|
+
assert any(r['file_path'] == 'caller.rs' and r['line'] == 2 and r['source'] == 'lsp'
|
|
61
|
+
for r in result['data']['references'])
|
|
62
|
+
finally:
|
|
63
|
+
await gateway.close()
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
async def test_running_rust_server_can_reload_after_an_edit(tmp_path, monkeypatch):
|
|
67
|
+
source = (_status_server(2.5)
|
|
68
|
+
.replace('ready = status = False', 'ready = status = reloading = False')
|
|
69
|
+
.replace('threading.Timer(2.5, become_ready)', 'threading.Timer(2.5 if reloading else 0, become_ready)')
|
|
70
|
+
.replace(" if 'id' not in msg:", """
|
|
71
|
+
if method == 'textDocument/didChange':
|
|
72
|
+
ready = False
|
|
73
|
+
timer = None
|
|
74
|
+
reloading = True
|
|
75
|
+
if status:
|
|
76
|
+
send({'jsonrpc':'2.0','method':'experimental/serverStatus','params':{'health':'ok','quiescent':False}})
|
|
77
|
+
if 'id' not in msg:"""))
|
|
78
|
+
gateway, root, _extension = _gateway(tmp_path, monkeypatch, source)
|
|
79
|
+
try:
|
|
80
|
+
first = await _inspect(gateway)
|
|
81
|
+
assert first['metadata']['analysis']['precision']['status'] == 'verified'
|
|
82
|
+
process = next(iter(gateway._stores.values()))['service']._lsp_manager._clients['rust']._process
|
|
83
|
+
# The selected document is already open. Editing it guarantees didChange
|
|
84
|
+
# and a reload even if the server answered before caller priming was needed.
|
|
85
|
+
helper = root / 'helper.rs'
|
|
86
|
+
helper.write_text(helper.read_text() + '\n')
|
|
87
|
+
(root / 'caller.rs').write_text('use crate::helper::helper;\n\npub fn caller() -> i32 { helper() }\n')
|
|
88
|
+
started = time.monotonic()
|
|
89
|
+
changed = await _inspect(gateway)
|
|
90
|
+
assert 2.0 <= time.monotonic() - started < 5.8 # The reload really happened.
|
|
91
|
+
assert changed['metadata']['analysis']['precision']['status'] == 'verified', changed
|
|
92
|
+
assert any(r['file_path'] == 'caller.rs' and r['line'] == 3 and r['source'] == 'lsp'
|
|
93
|
+
for r in changed['data']['references'])
|
|
94
|
+
assert not any(r['file_path'] == 'caller.rs' and r['line'] == 2
|
|
95
|
+
for r in changed['data']['references'])
|
|
96
|
+
assert next(iter(gateway._stores.values()))['service']._lsp_manager._clients['rust']._process is process
|
|
97
|
+
finally:
|
|
98
|
+
await gateway.close()
|
|
99
|
+
assert process.returncode == 0
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
@pytest.mark.parametrize('language, upper', [('rust', 5.8), ('python', 2.8)])
|
|
103
|
+
async def test_hung_initialization_is_reaped_within_the_precision_budget(tmp_path, monkeypatch, language, upper):
|
|
104
|
+
import asyncio
|
|
105
|
+
|
|
106
|
+
processes = []
|
|
107
|
+
spawn = asyncio.create_subprocess_exec
|
|
108
|
+
|
|
109
|
+
async def record_process(*args, **kwargs):
|
|
110
|
+
process = await spawn(*args, **kwargs)
|
|
111
|
+
processes.append(process)
|
|
112
|
+
return process
|
|
113
|
+
|
|
114
|
+
monkeypatch.setattr(asyncio, 'create_subprocess_exec', record_process)
|
|
115
|
+
source = SERVER.replace(" if method == 'initialize':",
|
|
116
|
+
" if method == 'initialize':\n __import__('time').sleep(60)")
|
|
117
|
+
gateway, _root, extension = _gateway(tmp_path, monkeypatch, source, language)
|
|
118
|
+
try:
|
|
119
|
+
await gateway.execute('symbols', {'path': 'helper' + extension})
|
|
120
|
+
started = time.monotonic()
|
|
121
|
+
result = await _inspect(gateway, extension)
|
|
122
|
+
assert time.monotonic() - started < upper
|
|
123
|
+
assert result['metadata']['analysis']['precision']['queries'][0]['status'] == 'timeout'
|
|
124
|
+
assert result['data']['references']
|
|
125
|
+
assert len(processes) == 1 and processes[0].returncode is not None
|
|
126
|
+
finally:
|
|
127
|
+
await gateway.close()
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
@pytest.mark.parametrize('language, lower, upper', [('rust', 4.5, 5.8), ('python', 1.5, 2.8)])
|
|
131
|
+
async def test_unresponsive_server_is_bounded_and_preserves_syntax(tmp_path, monkeypatch, language, lower, upper):
|
|
132
|
+
source = SERVER.replace(' result = None',
|
|
133
|
+
" if method == 'textDocument/definition': continue\n result = None")
|
|
134
|
+
gateway, _root, extension = _gateway(tmp_path, monkeypatch, source, language)
|
|
135
|
+
try:
|
|
136
|
+
# Index before timing the enrichment rather than timing native parser startup.
|
|
137
|
+
await gateway.execute('symbols', {'path': 'helper' + extension})
|
|
138
|
+
started = time.monotonic()
|
|
139
|
+
result = await _inspect(gateway, extension)
|
|
140
|
+
assert lower <= time.monotonic() - started < upper
|
|
141
|
+
precision = result['metadata']['analysis']['precision']
|
|
142
|
+
assert precision['status'] == 'partial'
|
|
143
|
+
assert precision['queries'][0]['status'] == 'timeout'
|
|
144
|
+
assert any(r['file_path'] == 'helper' + extension for r in result['data']['references'])
|
|
145
|
+
finally:
|
|
146
|
+
await gateway.close()
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
@pytest.mark.parametrize('mode', ['inherited_output', 'startup_error', 'buffered_stdin'])
|
|
150
|
+
async def test_cancelled_startup_releases_pipes_held_by_a_child(tmp_path, monkeypatch, mode):
|
|
151
|
+
import asyncio
|
|
152
|
+
|
|
153
|
+
release = tmp_path / 'release-child'
|
|
154
|
+
exited = tmp_path / 'child-exited'
|
|
155
|
+
child_pid = tmp_path / 'child-pid'
|
|
156
|
+
child_source = f'''
|
|
157
|
+
import os, time
|
|
158
|
+
from pathlib import Path
|
|
159
|
+
Path({str(child_pid)!r}).write_text(str(os.getpid()))
|
|
160
|
+
deadline = time.monotonic() + 12
|
|
161
|
+
while time.monotonic() < deadline and not Path({str(release)!r}).exists():
|
|
162
|
+
time.sleep(.02)
|
|
163
|
+
Path({str(exited)!r}).touch()
|
|
164
|
+
'''
|
|
165
|
+
initialize = f'''
|
|
166
|
+
if method == 'initialize':
|
|
167
|
+
import subprocess
|
|
168
|
+
subprocess.Popen([sys.executable, '-c', {child_source!r}])
|
|
169
|
+
if {mode!r} == 'buffered_stdin':
|
|
170
|
+
send({{'jsonrpc':'2.0','id':'large-config','method':'workspace/configuration',
|
|
171
|
+
'params':{{'items':[{{}}] * 32768}}}})
|
|
172
|
+
if {mode!r} == 'startup_error':
|
|
173
|
+
send({{'jsonrpc':'2.0','id':msg['id'],'error':{{'code':-32603,'message':'initialization failed'}}}})
|
|
174
|
+
__import__('time').sleep(60)
|
|
175
|
+
'''
|
|
176
|
+
source = SERVER.replace(" if method == 'initialize':", initialize)
|
|
177
|
+
processes = []
|
|
178
|
+
spawn = asyncio.create_subprocess_exec
|
|
179
|
+
|
|
180
|
+
async def record_process(*args, **kwargs):
|
|
181
|
+
process = await spawn(*args, **kwargs)
|
|
182
|
+
processes.append(process)
|
|
183
|
+
return process
|
|
184
|
+
|
|
185
|
+
monkeypatch.setattr(asyncio, 'create_subprocess_exec', record_process)
|
|
186
|
+
gateway, _root, _extension = _gateway(tmp_path, monkeypatch, source)
|
|
187
|
+
inspection = None
|
|
188
|
+
try:
|
|
189
|
+
await gateway.execute('symbols', {'path': 'helper.rs'})
|
|
190
|
+
started = time.monotonic()
|
|
191
|
+
inspection = asyncio.create_task(_inspect(gateway))
|
|
192
|
+
if mode == 'buffered_stdin':
|
|
193
|
+
# A real workspace/configuration response fills the inherited stdin.
|
|
194
|
+
# Ordinary StreamWriter.close() would try to drain it indefinitely.
|
|
195
|
+
async with asyncio.timeout(3):
|
|
196
|
+
while not processes or not processes[0].stdin.transport.get_write_buffer_size():
|
|
197
|
+
await asyncio.sleep(.02)
|
|
198
|
+
result = await inspection
|
|
199
|
+
assert time.monotonic() - started < 5.8
|
|
200
|
+
assert child_pid.exists() and not exited.exists(), 'Child must still hold the inherited pipes'
|
|
201
|
+
assert processes[0].returncode is not None
|
|
202
|
+
assert result['metadata']['analysis']['precision']['queries'][0]['status'] == 'timeout'
|
|
203
|
+
assert result['data']['references']
|
|
204
|
+
async with asyncio.timeout(1):
|
|
205
|
+
response = await gateway.execute('search_symbols', {'name': 'helper'})
|
|
206
|
+
assert not response.isError # The workspace worker remains usable.
|
|
207
|
+
finally:
|
|
208
|
+
# The fixture, rather than production code, owns the surviving grandchild.
|
|
209
|
+
release.touch()
|
|
210
|
+
if inspection is not None and not inspection.done():
|
|
211
|
+
await asyncio.wait_for(inspection, 8)
|
|
212
|
+
for process in processes:
|
|
213
|
+
if process.returncode is None:
|
|
214
|
+
process.kill()
|
|
215
|
+
if process.stdin and not process.stdin.is_closing():
|
|
216
|
+
process.stdin.transport.abort()
|
|
217
|
+
process._transport.close()
|
|
218
|
+
await asyncio.wait_for(process.wait(), 1)
|
|
219
|
+
if child_pid.exists():
|
|
220
|
+
async with asyncio.timeout(2):
|
|
221
|
+
while not exited.exists():
|
|
222
|
+
await asyncio.sleep(.02)
|
|
223
|
+
await gateway.close()
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
async def test_rust_startup_and_lookup_share_one_five_second_deadline(tmp_path, monkeypatch):
|
|
227
|
+
source = (SERVER.replace(" send({'jsonrpc':'2.0','id':pending_init,",
|
|
228
|
+
" __import__('time').sleep(2.5)\n send({'jsonrpc':'2.0','id':pending_init,")
|
|
229
|
+
.replace(' result = None',
|
|
230
|
+
" if method == 'textDocument/references': __import__('time').sleep(2.8)\n result = None"))
|
|
231
|
+
gateway, _root, _extension = _gateway(tmp_path, monkeypatch, source)
|
|
232
|
+
try:
|
|
233
|
+
await gateway.execute('symbols', {'path': 'helper.rs'})
|
|
234
|
+
started = time.monotonic()
|
|
235
|
+
result = await _inspect(gateway)
|
|
236
|
+
assert 4.5 <= time.monotonic() - started < 5.8
|
|
237
|
+
assert result['metadata']['analysis']['precision']['queries'][0]['status'] == 'timeout'
|
|
238
|
+
assert result['data']['references']
|
|
239
|
+
finally:
|
|
240
|
+
await gateway.close()
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
async def test_client_timeout_override_does_not_leak_to_other_servers(tmp_path, monkeypatch):
|
|
244
|
+
# Both peers use the same framed protocol; only their timeout policies differ.
|
|
245
|
+
script = tmp_path / 'server.py'
|
|
246
|
+
script.write_text(SERVER.replace(' result = None',
|
|
247
|
+
" if method == 'test/delayed': __import__('time').sleep(0.4)\n result = None"))
|
|
248
|
+
for language in ('rust', 'python'):
|
|
249
|
+
monkeypatch.setitem(BUILTIN_SERVERS, language, LanguageServerConfig(
|
|
250
|
+
command=sys.executable, args=[str(script)], language_id=language))
|
|
251
|
+
manager = LSPManager(LSPConfig(timeout=0.25))
|
|
252
|
+
try:
|
|
253
|
+
await manager.start_server('rust', tmp_path.as_uri(), timeout=5.0)
|
|
254
|
+
await manager.start_server('python', tmp_path.as_uri())
|
|
255
|
+
for language, succeeds in [('rust', True), ('python', False)]:
|
|
256
|
+
client = manager._clients[language]
|
|
257
|
+
if succeeds:
|
|
258
|
+
assert await client._request('test/delayed', {}) is None
|
|
259
|
+
else:
|
|
260
|
+
from attocode_intel._internal.errors import ToolError
|
|
261
|
+
with pytest.raises(ToolError, match='timed out'):
|
|
262
|
+
await client._request('test/delayed', {})
|
|
263
|
+
finally:
|
|
264
|
+
await manager.stop_all()
|
|
@@ -208,6 +208,59 @@ def test_interrupted_pack_preserves_completed_checks_and_stops_its_worker(tmp_pa
|
|
|
208
208
|
assert result['status'] == 'incomplete'
|
|
209
209
|
assert result['checks'][0]['name'] == 'source'
|
|
210
210
|
assert child.poll() is not None
|
|
211
|
+
assert result['worker_limit_seconds'] == .5
|
|
212
|
+
assert result['worker_seconds'] >= result['worker_wait_seconds'] >= .5
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
@pytest.mark.parametrize('exit_code,checkpointed', [(0, True), (7, True), (0, False)])
|
|
216
|
+
def test_pack_reports_parent_worker_lifetime_and_separate_wait_budget(tmp_path, monkeypatch, exit_code, checkpointed):
|
|
217
|
+
import subprocess
|
|
218
|
+
import time
|
|
219
|
+
|
|
220
|
+
from eval.quality import corpus
|
|
221
|
+
|
|
222
|
+
original_launch, original_stop = subprocess.Popen, corpus.stop_group
|
|
223
|
+
boundaries = {}
|
|
224
|
+
children = []
|
|
225
|
+
checkpoint = {'checks': [{'name': 'source', 'outcome': 'passed'}], 'retrieval': [],
|
|
226
|
+
'worker_seconds': 999, 'worker_wait_seconds': 999, 'worker_limit_seconds': 999}
|
|
227
|
+
|
|
228
|
+
def launch(command, **kwargs):
|
|
229
|
+
boundaries['launch'] = time.monotonic()
|
|
230
|
+
time.sleep(.05)
|
|
231
|
+
program = (
|
|
232
|
+
'import json,pathlib,sys,time; '
|
|
233
|
+
'pathlib.Path(sys.argv[1]).write_text(sys.argv[2]) if sys.argv[3] == "yes" else None; '
|
|
234
|
+
'time.sleep(.05); sys.exit(int(sys.argv[4]))'
|
|
235
|
+
)
|
|
236
|
+
child = original_launch([sys.executable, '-c', program, str(tmp_path / 'worker.json'),
|
|
237
|
+
json.dumps(checkpoint), 'yes' if checkpointed else 'no', str(exit_code)], **kwargs)
|
|
238
|
+
children.append(child)
|
|
239
|
+
return child
|
|
240
|
+
|
|
241
|
+
def stop(child):
|
|
242
|
+
original_stop(child)
|
|
243
|
+
time.sleep(.05)
|
|
244
|
+
boundaries['cleanup'] = time.monotonic()
|
|
245
|
+
|
|
246
|
+
monkeypatch.setattr(corpus.subprocess, 'Popen', launch)
|
|
247
|
+
monkeypatch.setattr(corpus, 'stop_group', stop)
|
|
248
|
+
monkeypatch.setattr(corpus, 'PACK_SECONDS', 10)
|
|
249
|
+
started = time.monotonic()
|
|
250
|
+
result = corpus.evaluate_isolated(tmp_path, {'id': 'fixture'}, tmp_path)
|
|
251
|
+
elapsed = time.monotonic() - started
|
|
252
|
+
|
|
253
|
+
assert boundaries['cleanup'] - boundaries['launch'] <= result['worker_seconds'] <= elapsed
|
|
254
|
+
assert 0 < result['worker_wait_seconds'] <= result['worker_seconds'] - .1
|
|
255
|
+
assert result['worker_limit_seconds'] == 10
|
|
256
|
+
assert children[0].poll() is not None
|
|
257
|
+
assert result['checks'] == (checkpoint['checks'] if checkpointed else [])
|
|
258
|
+
assert result['retrieval'] == []
|
|
259
|
+
if exit_code or not checkpointed:
|
|
260
|
+
assert result['status'] == 'incomplete'
|
|
261
|
+
assert 'Workflow worker failed' in result['error']
|
|
262
|
+
else:
|
|
263
|
+
assert 'error' not in result and result.get('status') != 'incomplete'
|
|
211
264
|
|
|
212
265
|
|
|
213
266
|
def test_resume_refuses_changed_inputs_and_missing_question_observations():
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{attocode_code_intel-0.1.25 → attocode_code_intel-0.1.27}/src/attocode_intel/_internal/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|