attocode-code-intel 0.1.24__tar.gz → 0.1.25__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.24 → attocode_code_intel-0.1.25}/PKG-INFO +3 -1
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/README.md +2 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/pyproject.toml +1 -1
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/__init__.py +1 -1
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/embeddings.py +18 -21
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/systemone_ranker.py +83 -54
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/lsp/client.py +39 -6
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/embeddings.py +2 -2
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/precision.py +19 -5
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/service.py +3 -3
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/workers/jobs.py +1 -1
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_precision_recovery.py +124 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_real_language_server.py +2 -2
- attocode_code_intel-0.1.25/tests/unit/eval/test_matrix_embed_screen.py +199 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/integrations/context/test_embeddings.py +59 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/.gitignore +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/LICENSE +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/GUIDELINES.md +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/errors/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/architecture_drift.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/ast_chunker.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/ast_service.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/ast_snapshot.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/blob_oid.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/cache_manifest.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/cas.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/code_analyzer.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/codebase_ast.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/codebase_context.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/cross_mode.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/cross_references.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/discovery_snapshot.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/embedding_rotation.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/frecency.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/fuzzy.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/hierarchical_explorer.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/hydration.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/index_probe.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/index_repair.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/index_store.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/language_registry.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/memory_store.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/module_resolution.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/parse_diagnostics.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/query_constraints.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/query_history.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/reranker.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/semantic_search.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/syntax_evidence.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/temporal_coupling.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/trigram_index.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/trigram_regex.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/ts_parser.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/vector_store.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/feature_flags/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/lsp/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/mcp/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/mcp/client.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/security/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/security/custom_rules.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/security/dataflow.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/security/dependency_audit.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/security/matcher.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/security/patterns.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/security/scanner.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/utilities/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/utilities/ignore.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/utilities/token_estimate.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/types/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/types/events.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/types/severity.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/_shared.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/analysis_coverage.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/access.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/app.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/auth/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/auth/api_keys.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/auth/context.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/auth/jwt.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/auth/oauth.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/auth/passwords.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/deps.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/knowledge_bridge.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/mcp_transport.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/middleware.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/models.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/providers/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/providers/db_provider.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/providers/local_provider.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/providers/remote_provider.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/repository_source.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/_pin_helper.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/activity.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/adr.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/analysis.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/api_keys.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/auth.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/branches.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/cross_repo_search.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/files.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/files_v2.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/gc.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/git_v2.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/graph.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/graph_viz.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/health.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/history.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/jobs.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/learning.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/lsp.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/notify.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/operations.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/orgs.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/preferences.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/presence.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/projects.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/repos.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/search.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/snapshots.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/webhooks.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/websocket.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/static/graph.html +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/api/utils.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/artifacts/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/artifacts/hashing.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/artifacts/provenance.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/artifacts/retrieval_pin.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/audit.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/bug_finder.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/bundle.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/catalog.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/change_evidence.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/change_investigation.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/change_review.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/cli.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/community.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/confidence/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/confidence/jev.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/confidence/llm.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/confidence/redact.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/confidence/settings.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/config.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/crypto.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/db/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/db/base.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/db/engine.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/db/models.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/entrypoint.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/focused_evidence.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/freshness.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/gateway.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/git/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/git/credentials.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/git/manager.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/git/models.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/git/storage.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/graph_query_parser.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/helpers.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/indexing/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/indexing/debouncer.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/indexing/delta_indexer.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/indexing/full_indexer.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/indexing/incremental.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/indexing/parser.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/indexing/summarizer.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/installer.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/investigation_cli.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/knowledge.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/local_knowledge.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/migrations/alembic.ini +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/migrations/env.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/migrations/script.py.mako +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/migrations/versions/001_initial_schema.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/migrations/versions/002_branch_version_and_embeddings.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/migrations/versions/003_embedding_uniqueness_and_cascade.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/migrations/versions/004_audit_events.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/migrations/versions/005_user_preferences.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/migrations/versions/006_google_oauth.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/migrations/versions/007_pgvector_embeddings.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/migrations/versions/008_symbol_references.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/migrations/versions/009_webhook_secret_encryption.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/migrations/versions/010_add_commits_table.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/migrations/versions/011_commit_changed_files.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/migrations/versions/012_branch_merged_at.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/migrations/versions/013_revoked_tokens.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/migrations/versions/014_blame_hunks.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/migrations/versions/015_commit_file_stats.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/migrations/versions/016_embedding_provenance_columns.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/migrations/versions/017_provenance_table.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/migrations/versions/018_repo_snapshots.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/migrations/versions/019_symref_caller.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/migrations/versions/020_shared_knowledge.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/onboarding.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/output.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/presence.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/probe.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/project_dir.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/pubsub.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/query_ranking.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/readiness.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/redis.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/reference_pages.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/remote.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/repo_ranker.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/request_context.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/ci.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/combinators.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/enricher.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/evolution.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/executor.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/filters/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/filters/pipeline.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/formatter.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/hygiene.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/importers/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/importers/semgrep.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/loader.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/marketplace.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/metavar.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/model.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/_license_templates/Apache-2.0.txt +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/_license_templates/MIT.txt +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/bandit-python/LICENSE +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/bandit-python/NOTICE +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/bandit-python/PORTING.md +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/bandit-python/manifest.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/bandit-python/rules/B105-hardcoded-password.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/bandit-python/rules/B303-weak-md5.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/bandit-python/rules/B304-weak-des.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/bandit-python/rules/B307-use-of-eval.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/bandit-python/rules/B324-weak-sha1.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/bandit-python/rules/B501-no-cert-validation.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/bandit-python/rules/B602-shell-true.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/bandit-python/rules/B608-sqli.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/eslint-typescript/LICENSE +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/eslint-typescript/NOTICE +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/eslint-typescript/PORTING.md +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/eslint-typescript/manifest.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/eslint-typescript/rules/eqeqeq.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/eslint-typescript/rules/no-eval.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/eslint-typescript/rules/no-implied-eval.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/eslint-typescript/rules/no-new-func.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/eslint-typescript/rules/no-throw-literal.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/eslint-typescript/rules/no-var.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/eslint-typescript/rules/no-with.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/gosec-go/LICENSE +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/gosec-go/NOTICE +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/gosec-go/PORTING.md +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/gosec-go/manifest.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/gosec-go/rules/G101-hardcoded-credentials.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/gosec-go/rules/G102-bind-all-interfaces.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/gosec-go/rules/G103-unsafe-block.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/gosec-go/rules/G201-sql-format.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/gosec-go/rules/G304-file-inclusion.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/gosec-go/rules/G401-weak-cipher.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/gosec-go/rules/G402-tls-min-version.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/gosec-go/rules/G501-md5-import.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/cpp/manifest.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/cpp/rules/security.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/cpp/rules/structural.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/csharp/manifest.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/csharp/rules/security.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/csharp/rules/structural.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/go/manifest.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/go/rules/performance.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/go/rules/security.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/go/rules/structural.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/go/taint/sanitizers.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/go/taint/sinks.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/go/taint/sources.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/java/manifest.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/java/rules/correctness.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/java/rules/structural.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/java/taint/sinks.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/java/taint/sources.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/kotlin/manifest.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/kotlin/rules/correctness.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/kotlin/rules/structural.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/php/manifest.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/php/rules/security.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/php/rules/structural.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/python/manifest.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/python/rules/performance.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/python/rules/structural.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/ruby/manifest.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/ruby/rules/security.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/ruby/rules/structural.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/rust/manifest.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/rust/rules/correctness.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/rust/rules/structural.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/typescript/manifest.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/typescript/rules/performance.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/typescript/rules/structural.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/pack_loader.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/plugins/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/plugins/plugin_loader.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/profiling.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/registry.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/sarif.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/synthesis.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/testing.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/search_evidence.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/server.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/sharing.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/storage/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/storage/branch_overlay.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/storage/content_store.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/storage/dependency_store.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/storage/diff_engine.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/storage/embedding_store.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/storage/provenance_store.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/storage/security_scanner_db.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/storage/symbol_store.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/structural_evidence.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/symbol_inspection.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/symbol_links.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/telemetry.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/test_ranking.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/testing/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/testing/fixtures.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/testing/helpers.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/testing/mocks.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/tools/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/tools/adr_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/tools/analysis_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/tools/composite_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/tools/cross_mode_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/tools/dead_code_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/tools/distill_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/tools/frecency_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/tools/fuzzy_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/tools/history_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/tools/learning_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/tools/lsp_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/tools/maintenance_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/tools/navigation_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/tools/overlay_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/tools/pin_store.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/tools/pin_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/tools/query_constraints_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/tools/query_history_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/tools/readiness_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/tools/rule_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/tools/search_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/tools/snapshot_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/workers/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/workers/job_utils.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/workers/run.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/workers/settings.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/fixtures/rule_violations/.attocode/rules/team-preferences.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/fixtures/rule_violations/go/bad_patterns.go +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/fixtures/rule_violations/java/BadPatterns.java +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/fixtures/rule_violations/python/bad_patterns.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/fixtures/rule_violations/rust/bad_patterns.rs +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/fixtures/rule_violations/typescript/bad_patterns.ts +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/fixtures/sample_project/.attocode/.gitignore +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/fixtures/sample_project/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/fixtures/sample_project/main.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/fixtures/sample_project/models.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/fixtures/sample_project/utils.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/integration/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/integration/code_intel/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/integration/code_intel/conftest.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/integration/code_intel/test_http_smoke.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/integration/code_intel/test_mcp_tools_audit.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/integration/code_intel/test_remote_mcp_http_integration.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/integration/code_intel/test_service_integration.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/integration/test_rule_bench_floor_e2e.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_ast_snapshot.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_behavioral_negation.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_capacity_experiment.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_change_focus.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_change_investigation.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_chunk_identity.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_codex_repair_study.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_cold_discovery.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_cold_index_cost.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_compact_inspection.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_corpus_capture.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_daily_workflows.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_db_navigation_http.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_discovery_ceiling.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_discovery_reuse.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_doctor.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_doctor_runtime.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_edit_restart.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_experiment_dispatch.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_experiment_evidence.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_experiment_readiness.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_external_study.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_fallback_lexical.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_file_symbol_scope.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_fixture_source_alias.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_focused_inspection.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_image_budget.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_importance_publication.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_index_probe.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_index_processes.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_index_reuse.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_index_sequences.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_kotlin_test_paths.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_language_capabilities.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_lean_profile.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_lexical_sql_cost.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_local_reranker.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_local_workflow_evidence.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_localize_study.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_lsp_diagnostics.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_lsp_document_lifecycle.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_lsp_stderr_lifecycle.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_mcp_search_evaluation.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_mixed_workspace.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_module_ownership.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_native_capture.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_native_experiment.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_navigation_evidence.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_navigation_prefix_trial.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_ocaml_parser_routing.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_onboarding_study.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_operation_contracts.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_optional_grammar_admission.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_optional_language_depth.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_parse_recovery.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_parser_thread_isolation.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_pilot.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_precision_protocol.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_preview_admission.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_preview_experiment.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_preview_sources.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_preview_windows.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_product.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_quality_cloud.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_quality_evaluation.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_quality_evidence.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_quality_lifecycle.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_quality_runner.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_query_ranking.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_query_requirements.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_ranking_intent.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_recovery_readiness.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_release_verification.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_remote.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_repair_study.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_restart_experiment.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_retrieval_ablation.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_retrieval_audit.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_retrieval_body_trial.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_retrieval_cycle.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_search_budget_repair.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_search_coverage.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_search_coverage_scale.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_search_evidence.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_search_evidence_audit.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_search_usefulness.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_snippet_budget.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_source_exclusions.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_structural_evidence.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_structural_write_cost.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_study.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_symbol_order.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_systemone_ranker.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_test_intent_trial.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_token_overhead.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_trigram_workspace.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_understanding_evaluation.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_walk_order.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_warm_cache.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_workflow_sequences.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/conftest.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_advisory_lock.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_api.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_api_phase3a.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_api_v2.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_auth.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_branch_versioning.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_bug_finder.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_call_graph_tool.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_ci_runner.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_cli_lifecycle.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_cli_maintenance_local.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_cli_ops.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_cli_query_commands.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_cli_remote.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_codex_rereview_polish.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_combinators.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_confidence.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_confidence_adoption.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_config.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_config_remote.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_cross_mode.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_db_security_scan.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_deps.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_diff_engine.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_edge_cases.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_frecency.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_fuzzy.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_index_store_migration.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_kw_index_status.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_lsp_call_graph.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_lsp_enrichment.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_lsp_extended_models.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_marketplace.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_metavar.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_middleware.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_notify_enhanced.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_org_isolation.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_pack_autoload.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_profiling.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_project_discovery.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_provenance_store.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_pubsub_streams.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_query_constraints.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_query_history.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_readiness.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_reindex_embeddings.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_remote_local_fallback.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_remote_provider.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_remote_reliability.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_repo_ranker.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_rule_evolution.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_rule_hygiene.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_rule_synthesis.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_rule_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_rule_violations.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_rules_engine.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_rules_integration.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_sarif.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_search_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_server_startup.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_service.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_service_mode.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_status_health.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_structural_executor.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_supply_chain_rules.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_testing_framework.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_webhook_encryption.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/tools/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/tools/conftest.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/tools/test_adr_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/tools/test_analysis_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/tools/test_dead_code_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/tools/test_distill_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/tools/test_history_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/tools/test_learning_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/tools/test_lsp_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/tools/test_maintenance_tools_phase2.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/tools/test_navigation_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/tools/test_phase2c_anchors_and_overlays.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/tools/test_readiness_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/tools/test_search_status_mismatch.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/tools/test_search_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/code_intel/tools/test_server_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/context/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/context/test_action_hash.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/context/test_ast_service_adapter.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/context/test_blob_oid.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/context/test_cache_manifest.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/context/test_cas.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/context/test_embedding_rotation.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/context/test_pagerank_restoration.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/context/test_provenance.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/context/test_retrieval_pin.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/context/test_vector_store_dim_safety.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/eval/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/eval/conftest.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/eval/test_acc_at_k.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/eval/test_broad_candidate_audit.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/eval/test_calibration_demo.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/eval/test_harness.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/eval/test_matrix_agents.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/eval/test_matrix_ci.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/eval/test_matrix_datasets.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/eval/test_matrix_dense.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/eval/test_matrix_function_bm25.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/eval/test_matrix_function_dense.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/eval/test_matrix_rerank.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/eval/test_matrix_retrieve.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/eval/test_matrix_run.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/eval/test_matrix_stats.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/eval/test_mcp_bench.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/eval/test_rule_accuracy.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/eval/test_rule_bench_config.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/eval/test_rule_bench_corpus.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/eval/test_rule_bench_evaluator.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/eval/test_rule_bench_predicate.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/eval/test_rule_bench_scoring.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/eval/test_rule_bench_template_engine.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/eval/test_rule_harness_import.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/eval/test_search_quality_reporting.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/eval/test_search_readiness.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/eval/test_seed_attocode_fixtures.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/integrations/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/integrations/context/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/integrations/context/test_architecture_drift.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/integrations/context/test_ast_service_hydration.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/integrations/context/test_body_chunking.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/integrations/context/test_call_graph.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/integrations/context/test_code_analyzer.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/integrations/context/test_codebase_ast.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/integrations/context/test_codebase_context.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/integrations/context/test_context_stores_closed.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/integrations/context/test_cross_ref_search.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/integrations/context/test_embedder_default.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/integrations/context/test_embeddings_query.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/integrations/context/test_go_symbols.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/integrations/context/test_hydration.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/integrations/context/test_index_store.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/integrations/context/test_model_mismatch.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/integrations/context/test_path_downweight.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/integrations/context/test_query_routing.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/integrations/context/test_semantic_search.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/integrations/context/test_supported_languages.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/integrations/context/test_temporal_coupling.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/integrations/context/test_trigram_index.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/integrations/context/test_trigram_regex.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/integrations/context/test_ts_parser.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/integrations/test_dataflow.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/integrations/test_feature_flags.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/integrations/test_new_security_rules.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/integrations/test_security_autofix.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/integrations/test_security_matcher.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/integrations/test_streaming_lsp.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/integrations/utilities/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/integrations/utilities/test_ignore.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/integrations/utilities/test_token_estimate.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/test_code_intel.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/test_code_intel_hydration.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/unit/test_errors.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/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.25
|
|
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,8 @@ 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.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
|
+
|
|
159
161
|
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.
|
|
160
162
|
|
|
161
163
|
Version 0.1.23 is listed in the official MCP Registry and documents a `uvx` quick start. The opt-in hosted rerank now accepts the dated model ID that OpenRouter returns; see [Hosted rerank](https://github.com/eren23/attocode/blob/main/docs/intelligence-search.md#hosted-rerank-experimental). Rerank stays off by default.
|
|
@@ -43,6 +43,8 @@ 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.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
|
+
|
|
46
48
|
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.
|
|
47
49
|
|
|
48
50
|
Version 0.1.23 is listed in the official MCP Registry and documents a `uvx` quick start. The opt-in hosted rerank now accepts the dated model ID that OpenRouter returns; see [Hosted rerank](https://github.com/eren23/attocode/blob/main/docs/intelligence-search.md#hosted-rerank-experimental). Rerank stays off by default.
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
"""Embedding provider abstraction for semantic search.
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
1. Local: sentence-transformers with code-
|
|
3
|
+
Auto-detect tries local providers only:
|
|
4
|
+
1. Local: sentence-transformers with code-trained or code-optimized models
|
|
5
5
|
2. Local: sentence-transformers with general model (smaller fallback)
|
|
6
|
-
3.
|
|
7
|
-
|
|
6
|
+
3. None: graceful degradation (returns empty vectors)
|
|
7
|
+
|
|
8
|
+
The OpenAI API sends source text off the machine. It is used only when
|
|
9
|
+
``ATTOCODE_EMBEDDING_MODEL=openai`` (or ``model="openai"``) selects it, never
|
|
10
|
+
because ``OPENAI_API_KEY`` is set, and never with ``ATTOCODE_LOCAL_ONLY``.
|
|
8
11
|
"""
|
|
9
12
|
|
|
10
13
|
from __future__ import annotations
|
|
@@ -172,14 +175,20 @@ def create_embedding_provider(
|
|
|
172
175
|
- "bge" (768-dim, recommended for code search)
|
|
173
176
|
- "all-MiniLM-L6-v2" (384-dim, fast, smaller)
|
|
174
177
|
- "nomic-embed-text" (768-dim, better code understanding)
|
|
175
|
-
- "openai" (API-based, requires OPENAI_API_KEY)
|
|
176
|
-
- "" (auto-detect best available)
|
|
178
|
+
- "openai" (API-based, requires OPENAI_API_KEY; sends source text)
|
|
179
|
+
- "" (auto-detect best available local provider)
|
|
177
180
|
|
|
178
|
-
Auto-detect order: bge
|
|
181
|
+
Auto-detect order: nomic > bge > MiniLM > null. It never selects a remote
|
|
182
|
+
provider, so an API key in the environment alone sends no source text.
|
|
179
183
|
Note: switching models requires reindexing (different vector dims).
|
|
180
184
|
"""
|
|
181
185
|
model = model or os.environ.get("ATTOCODE_EMBEDDING_MODEL", "")
|
|
182
186
|
|
|
187
|
+
# Checked before the cache, so a provider created earlier is not reused.
|
|
188
|
+
if model == "openai" and os.environ.get("ATTOCODE_LOCAL_ONLY", "").lower() in {"1", "true", "yes", "on"}:
|
|
189
|
+
logger.warning("ATTOCODE_LOCAL_ONLY is set; refusing the OpenAI embedding provider")
|
|
190
|
+
return NullEmbeddingProvider()
|
|
191
|
+
|
|
183
192
|
if model in _provider_cache:
|
|
184
193
|
return _provider_cache[model]
|
|
185
194
|
|
|
@@ -251,7 +260,7 @@ def create_embedding_provider(
|
|
|
251
260
|
_provider_cache[model] = provider
|
|
252
261
|
return provider
|
|
253
262
|
except ImportError:
|
|
254
|
-
logger.debug("sentence-transformers not installed
|
|
263
|
+
logger.debug("sentence-transformers not installed")
|
|
255
264
|
except Exception as exc:
|
|
256
265
|
logger.info("BGE model unavailable (%s), falling back to MiniLM", exc)
|
|
257
266
|
try:
|
|
@@ -260,23 +269,11 @@ def create_embedding_provider(
|
|
|
260
269
|
_provider_cache[model] = provider
|
|
261
270
|
return provider
|
|
262
271
|
except ImportError:
|
|
263
|
-
logger.debug("sentence-transformers not installed
|
|
272
|
+
logger.debug("sentence-transformers not installed")
|
|
264
273
|
except Exception as exc2:
|
|
265
274
|
logger.warning("Local embedding provider unavailable: %s", exc2)
|
|
266
275
|
logger.debug("Local embedding provider traceback", exc_info=True)
|
|
267
276
|
|
|
268
|
-
# Try OpenAI API
|
|
269
|
-
if os.environ.get("OPENAI_API_KEY"):
|
|
270
|
-
try:
|
|
271
|
-
provider = OpenAIEmbeddingProvider()
|
|
272
|
-
logger.info("Using OpenAI embedding provider: %s", provider.name)
|
|
273
|
-
_provider_cache[model] = provider
|
|
274
|
-
return provider
|
|
275
|
-
except ImportError:
|
|
276
|
-
logger.debug("openai package not installed")
|
|
277
|
-
except Exception:
|
|
278
|
-
logger.debug("OpenAI embedding provider failed", exc_info=True)
|
|
279
|
-
|
|
280
277
|
# Graceful degradation — don't cache so retry picks up newly installed packages
|
|
281
278
|
logger.info("No embedding provider available; semantic search will use keyword fallback")
|
|
282
279
|
return NullEmbeddingProvider()
|
|
@@ -24,6 +24,85 @@ _MAX_RESPONSE_BYTES = 64 * 1024
|
|
|
24
24
|
_REMOTE_BLOCKED = {"1", "true", "yes", "on"}
|
|
25
25
|
|
|
26
26
|
|
|
27
|
+
def workspace_consent(opt_in: bool, workspace: str, project_dir: str) -> bool:
|
|
28
|
+
"""The hosted-source consent: an opt-in and this exact absolute project directory."""
|
|
29
|
+
return opt_in and os.path.isabs(workspace) and os.path.realpath(workspace) == project_dir
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def check_endpoint(endpoint: str, *, allow_remote: bool, service_mode: bool, auth_env: str) -> bool:
|
|
33
|
+
"""Validate an opt-in hosted endpoint; return whether it is remote.
|
|
34
|
+
|
|
35
|
+
Raises ``ValueError`` for an unsafe URL, a refused remote endpoint or an
|
|
36
|
+
auth setting that is not an environment-variable name.
|
|
37
|
+
"""
|
|
38
|
+
parsed = urlsplit(endpoint)
|
|
39
|
+
try:
|
|
40
|
+
host = parsed.hostname
|
|
41
|
+
_ = parsed.port
|
|
42
|
+
except ValueError as exc:
|
|
43
|
+
raise ValueError("invalid ranking endpoint") from exc
|
|
44
|
+
if (
|
|
45
|
+
parsed.scheme not in {"http", "https"}
|
|
46
|
+
or not host
|
|
47
|
+
or not parsed.path
|
|
48
|
+
or parsed.username
|
|
49
|
+
or parsed.password
|
|
50
|
+
or parsed.query
|
|
51
|
+
or parsed.fragment
|
|
52
|
+
):
|
|
53
|
+
raise ValueError(
|
|
54
|
+
"ranking endpoint must be an absolute HTTP(S) URL without credentials or query"
|
|
55
|
+
)
|
|
56
|
+
try:
|
|
57
|
+
loopback = ipaddress.ip_address(host).is_loopback
|
|
58
|
+
except ValueError:
|
|
59
|
+
# A hostname can resolve differently between validation and use.
|
|
60
|
+
# Local source access requires an explicit loopback IP literal.
|
|
61
|
+
loopback = False
|
|
62
|
+
if not loopback and parsed.scheme != "https":
|
|
63
|
+
raise ValueError("non-loopback ranking endpoints require HTTPS")
|
|
64
|
+
if not loopback and (
|
|
65
|
+
not allow_remote
|
|
66
|
+
or service_mode
|
|
67
|
+
or os.environ.get("ATTOCODE_LOCAL_ONLY", "").lower() in _REMOTE_BLOCKED
|
|
68
|
+
):
|
|
69
|
+
raise ValueError("remote source ranking is not permitted")
|
|
70
|
+
if auth_env and re.fullmatch(r"[A-Za-z_][A-Za-z0-9_]*", auth_env) is None:
|
|
71
|
+
raise ValueError("ranking credential must be an environment-variable name")
|
|
72
|
+
return not loopback
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def post_json(
|
|
76
|
+
endpoint: str,
|
|
77
|
+
body: dict,
|
|
78
|
+
headers: dict[str, str],
|
|
79
|
+
timeout_seconds: float,
|
|
80
|
+
transport: httpx.BaseTransport | None,
|
|
81
|
+
max_bytes: int = _MAX_RESPONSE_BYTES,
|
|
82
|
+
) -> object:
|
|
83
|
+
"""POST JSON and decode a response of at most ``max_bytes`` (64 KiB)."""
|
|
84
|
+
# Do not inherit proxy settings or follow a redirect to a different
|
|
85
|
+
# origin; both could silently send source to an unapproved host.
|
|
86
|
+
with (
|
|
87
|
+
httpx.Client(
|
|
88
|
+
timeout=timeout_seconds,
|
|
89
|
+
trust_env=False,
|
|
90
|
+
follow_redirects=False,
|
|
91
|
+
transport=transport,
|
|
92
|
+
) as client,
|
|
93
|
+
client.stream("POST", endpoint, json=body, headers=headers) as response,
|
|
94
|
+
):
|
|
95
|
+
response.raise_for_status()
|
|
96
|
+
chunks: list[bytes] = []
|
|
97
|
+
size = 0
|
|
98
|
+
for chunk in response.iter_bytes():
|
|
99
|
+
size += len(chunk)
|
|
100
|
+
if size > max_bytes:
|
|
101
|
+
raise ValueError("ranking response too large")
|
|
102
|
+
chunks.append(chunk)
|
|
103
|
+
return json.loads(b"".join(chunks))
|
|
104
|
+
|
|
105
|
+
|
|
27
106
|
class SystemOneChoiceReranker:
|
|
28
107
|
"""One ``choice`` request for a bounded page of distinct files.
|
|
29
108
|
|
|
@@ -46,40 +125,9 @@ class SystemOneChoiceReranker:
|
|
|
46
125
|
max_excerpt_chars: int = 1350,
|
|
47
126
|
transport: httpx.BaseTransport | None = None,
|
|
48
127
|
) -> None:
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
_ = parsed.port
|
|
53
|
-
except ValueError as exc:
|
|
54
|
-
raise ValueError("invalid ranking endpoint") from exc
|
|
55
|
-
if (
|
|
56
|
-
parsed.scheme not in {"http", "https"}
|
|
57
|
-
or not host
|
|
58
|
-
or not parsed.path
|
|
59
|
-
or parsed.username
|
|
60
|
-
or parsed.password
|
|
61
|
-
or parsed.query
|
|
62
|
-
or parsed.fragment
|
|
63
|
-
):
|
|
64
|
-
raise ValueError(
|
|
65
|
-
"ranking endpoint must be an absolute HTTP(S) URL without credentials or query"
|
|
66
|
-
)
|
|
67
|
-
try:
|
|
68
|
-
loopback = ipaddress.ip_address(host).is_loopback
|
|
69
|
-
except ValueError:
|
|
70
|
-
# A hostname can resolve differently between validation and use.
|
|
71
|
-
# Local source access requires an explicit loopback IP literal.
|
|
72
|
-
loopback = False
|
|
73
|
-
if not loopback and parsed.scheme != "https":
|
|
74
|
-
raise ValueError("non-loopback ranking endpoints require HTTPS")
|
|
75
|
-
if not loopback and (
|
|
76
|
-
not allow_remote
|
|
77
|
-
or service_mode
|
|
78
|
-
or os.environ.get("ATTOCODE_LOCAL_ONLY", "").lower() in _REMOTE_BLOCKED
|
|
79
|
-
):
|
|
80
|
-
raise ValueError("remote source ranking is not permitted")
|
|
81
|
-
if auth_env and re.fullmatch(r"[A-Za-z_][A-Za-z0-9_]*", auth_env) is None:
|
|
82
|
-
raise ValueError("ranking credential must be an environment-variable name")
|
|
128
|
+
loopback = not check_endpoint(
|
|
129
|
+
endpoint, allow_remote=allow_remote, service_mode=service_mode, auth_env=auth_env
|
|
130
|
+
)
|
|
83
131
|
if timeout_seconds is None:
|
|
84
132
|
timeout_seconds = 5.0 if loopback else 0.8
|
|
85
133
|
if not 1 <= max_candidates <= 64 or not 0 < timeout_seconds <= 30:
|
|
@@ -106,26 +154,7 @@ class SystemOneChoiceReranker:
|
|
|
106
154
|
return True
|
|
107
155
|
|
|
108
156
|
def _post(self, body: dict, headers: dict[str, str]) -> dict:
|
|
109
|
-
|
|
110
|
-
# origin; both could silently send source to an unapproved host.
|
|
111
|
-
with (
|
|
112
|
-
httpx.Client(
|
|
113
|
-
timeout=self.timeout_seconds,
|
|
114
|
-
trust_env=False,
|
|
115
|
-
follow_redirects=False,
|
|
116
|
-
transport=self._transport,
|
|
117
|
-
) as client,
|
|
118
|
-
client.stream("POST", self.endpoint, json=body, headers=headers) as response,
|
|
119
|
-
):
|
|
120
|
-
response.raise_for_status()
|
|
121
|
-
chunks: list[bytes] = []
|
|
122
|
-
size = 0
|
|
123
|
-
for chunk in response.iter_bytes():
|
|
124
|
-
size += len(chunk)
|
|
125
|
-
if size > _MAX_RESPONSE_BYTES:
|
|
126
|
-
raise ValueError("ranking response too large")
|
|
127
|
-
chunks.append(chunk)
|
|
128
|
-
result = json.loads(b"".join(chunks))
|
|
157
|
+
result = post_json(self.endpoint, body, headers, self.timeout_seconds, self._transport)
|
|
129
158
|
if not isinstance(result, dict):
|
|
130
159
|
raise ValueError("invalid ranking response")
|
|
131
160
|
# Workers AI wraps every answer as {"result": {...}, "success": true, "errors": []}.
|
|
@@ -194,6 +194,10 @@ class _LSPClient:
|
|
|
194
194
|
self._stderr_task: asyncio.Task[None] | None = None
|
|
195
195
|
self._is_stopping = False # Suppress spurious errors during shutdown
|
|
196
196
|
self._trace_enabled = False # Protocol tracing (set via feature flag)
|
|
197
|
+
# rust-analyzer replies null while its VFS loads; experimental/serverStatus
|
|
198
|
+
# tells when it is ready. Servers that send no status count as ready.
|
|
199
|
+
self._ready = asyncio.Event()
|
|
200
|
+
self._ready.set()
|
|
197
201
|
|
|
198
202
|
@property
|
|
199
203
|
def language_id(self) -> str:
|
|
@@ -210,6 +214,7 @@ class _LSPClient:
|
|
|
210
214
|
async def start(self) -> None:
|
|
211
215
|
"""Start the language server and initialize it."""
|
|
212
216
|
self._documents.clear()
|
|
217
|
+
self._ready.set()
|
|
213
218
|
self._process = await asyncio.create_subprocess_exec( # noqa: S603
|
|
214
219
|
self._config.command,
|
|
215
220
|
*self._config.args,
|
|
@@ -231,6 +236,7 @@ class _LSPClient:
|
|
|
231
236
|
"rootUri": self._root_uri,
|
|
232
237
|
"workspaceFolders": [{"uri": self._root_uri, "name": "workspace"}],
|
|
233
238
|
"capabilities": {
|
|
239
|
+
"experimental": {"serverStatusNotification": True},
|
|
234
240
|
"workspace": {"workspaceFolders": True},
|
|
235
241
|
"textDocument": {
|
|
236
242
|
"completion": {"completionItem": {"snippetSupport": True}},
|
|
@@ -461,8 +467,13 @@ class _LSPClient:
|
|
|
461
467
|
line: int,
|
|
462
468
|
character: int,
|
|
463
469
|
include_declaration: bool = True,
|
|
464
|
-
) -> list[LSPLocation]:
|
|
465
|
-
"""Get all references to a symbol.
|
|
470
|
+
) -> list[LSPLocation] | None:
|
|
471
|
+
"""Get all references to a symbol.
|
|
472
|
+
|
|
473
|
+
Returns None when the server replied null. A server that is not ready
|
|
474
|
+
(rust-analyzer while its VFS loads) does this; an answer with no
|
|
475
|
+
references is an empty list.
|
|
476
|
+
"""
|
|
466
477
|
if not self._initialized:
|
|
467
478
|
return []
|
|
468
479
|
|
|
@@ -471,7 +482,9 @@ class _LSPClient:
|
|
|
471
482
|
"position": {"line": line, "character": character},
|
|
472
483
|
"context": {"includeDeclaration": include_declaration},
|
|
473
484
|
})
|
|
474
|
-
if
|
|
485
|
+
if result is None:
|
|
486
|
+
return None
|
|
487
|
+
if not isinstance(result, list):
|
|
475
488
|
return []
|
|
476
489
|
|
|
477
490
|
return [
|
|
@@ -806,9 +819,24 @@ class _LSPClient:
|
|
|
806
819
|
elif "method" in message:
|
|
807
820
|
self._handle_notification(message["method"], message.get("params"))
|
|
808
821
|
|
|
822
|
+
async def wait_ready(self, timeout: float) -> bool:
|
|
823
|
+
"""Wait up to ``timeout`` seconds until the server reports it is ready."""
|
|
824
|
+
if self._ready.is_set():
|
|
825
|
+
return True
|
|
826
|
+
try:
|
|
827
|
+
await asyncio.wait_for(self._ready.wait(), max(timeout, 0))
|
|
828
|
+
except TimeoutError:
|
|
829
|
+
return False
|
|
830
|
+
return True
|
|
831
|
+
|
|
809
832
|
def _handle_notification(self, method: str, params: Any) -> None:
|
|
810
833
|
"""Handle server notification."""
|
|
811
|
-
if method == "
|
|
834
|
+
if method == "experimental/serverStatus" and isinstance(params, dict):
|
|
835
|
+
if params.get("quiescent"):
|
|
836
|
+
self._ready.set()
|
|
837
|
+
else:
|
|
838
|
+
self._ready.clear()
|
|
839
|
+
elif method == "textDocument/publishDiagnostics" and self._on_diagnostics:
|
|
812
840
|
uri = params.get("uri", "")
|
|
813
841
|
raw_diags = params.get("diagnostics", [])
|
|
814
842
|
severity_map = {1: "error", 2: "warning", 3: "information", 4: "hint"}
|
|
@@ -1002,8 +1030,8 @@ class LSPManager:
|
|
|
1002
1030
|
async def get_references(
|
|
1003
1031
|
self, file: str, line: int, col: int,
|
|
1004
1032
|
include_declaration: bool = True,
|
|
1005
|
-
) -> list[LSPLocation]:
|
|
1006
|
-
"""Get all references to a symbol."""
|
|
1033
|
+
) -> list[LSPLocation] | None:
|
|
1034
|
+
"""Get all references to a symbol. None: the server replied null."""
|
|
1007
1035
|
client = self._get_client_for_file(file)
|
|
1008
1036
|
if not client:
|
|
1009
1037
|
return []
|
|
@@ -1103,6 +1131,11 @@ class LSPManager:
|
|
|
1103
1131
|
return file
|
|
1104
1132
|
return f"file://{os.path.abspath(file)}"
|
|
1105
1133
|
|
|
1134
|
+
async def wait_ready(self, file: str, timeout: float) -> bool:
|
|
1135
|
+
"""Wait until the server for ``file`` reports it is ready."""
|
|
1136
|
+
client = self._get_client_for_file(file)
|
|
1137
|
+
return True if client is None else await client.wait_ready(timeout)
|
|
1138
|
+
|
|
1106
1139
|
def _get_client_for_file(self, file: str) -> _LSPClient | None:
|
|
1107
1140
|
"""Find the appropriate client for a file extension."""
|
|
1108
1141
|
ext = Path(file).suffix.lower()
|
|
@@ -146,7 +146,7 @@ async def get_embedding_status(
|
|
|
146
146
|
response.provider_available = False
|
|
147
147
|
response.provider_hint = (
|
|
148
148
|
"No embedding provider detected. "
|
|
149
|
-
"Install sentence-transformers (`pip install attocode[semantic]`) or set OPENAI_API_KEY."
|
|
149
|
+
"Install sentence-transformers (`pip install attocode[semantic]`) or set ATTOCODE_EMBEDDING_MODEL=openai with OPENAI_API_KEY."
|
|
150
150
|
)
|
|
151
151
|
except (ImportError, RuntimeError) as exc:
|
|
152
152
|
response.provider_available = False
|
|
@@ -297,7 +297,7 @@ async def trigger_generate_embeddings(
|
|
|
297
297
|
if provider.name == "none":
|
|
298
298
|
raise HTTPException(
|
|
299
299
|
status_code=400,
|
|
300
|
-
detail="No embedding provider available. Install sentence-transformers or set OPENAI_API_KEY.",
|
|
300
|
+
detail="No embedding provider available. Install sentence-transformers or set ATTOCODE_EMBEDDING_MODEL=openai with OPENAI_API_KEY.",
|
|
301
301
|
)
|
|
302
302
|
|
|
303
303
|
# Enqueue the ARQ job
|
|
@@ -100,6 +100,7 @@ class PrecisionSession:
|
|
|
100
100
|
candidates = ast.get_callers(definition.qualified_name)
|
|
101
101
|
resolved, references = None, []
|
|
102
102
|
for attempt in range(4):
|
|
103
|
+
answered = False
|
|
103
104
|
try:
|
|
104
105
|
resolved = await manager.get_definition(path, *position)
|
|
105
106
|
# Some servers (including rust-analyzer) return no
|
|
@@ -134,29 +135,42 @@ class PrecisionSession:
|
|
|
134
135
|
if str(exc).lower() != "content modified" or attempt == 3:
|
|
135
136
|
raise
|
|
136
137
|
else:
|
|
138
|
+
answered = resolved is not None and references is not None
|
|
137
139
|
# No syntax callers does not establish server
|
|
138
140
|
# readiness: both native lookups may be transiently
|
|
139
141
|
# unresolved. A resolved unused declaration can
|
|
140
|
-
# still take the fast path
|
|
141
|
-
|
|
142
|
+
# still take the fast path, but only on an answer:
|
|
143
|
+
# null references (None) mean "not ready".
|
|
144
|
+
if references or (resolved is not None and references is not None
|
|
145
|
+
and not candidates):
|
|
142
146
|
break
|
|
143
147
|
# A server can briefly return null after a successful
|
|
144
148
|
# warmup or edit. Yield before retrying, never extend
|
|
145
149
|
# the enclosing two-second deadline or loop forever.
|
|
146
150
|
if attempt < 3:
|
|
147
151
|
await asyncio.sleep(.05 * 2 ** attempt)
|
|
152
|
+
# After a null or failed reply, a server that reports
|
|
153
|
+
# its status (rust-analyzer) can stay not ready for
|
|
154
|
+
# longer than this backoff. Wait for it, but leave half
|
|
155
|
+
# the deadline for the remaining lookups. Do not wait
|
|
156
|
+
# after an answer: rust-analyzer also answers while
|
|
157
|
+
# its status is not ready. Other servers return at once.
|
|
158
|
+
if not answered:
|
|
159
|
+
await manager.wait_ready(path, (deadline - asyncio.get_running_loop().time()) / 2)
|
|
148
160
|
if resolved is None and not references:
|
|
149
161
|
outcomes.append({"language": language, "status": "not_resolved"})
|
|
150
162
|
continue
|
|
151
163
|
finally:
|
|
152
164
|
manager.on_result_callback = callback
|
|
153
|
-
ast.ingest_lsp_results("references", path, references,
|
|
165
|
+
ast.ingest_lsp_results("references", path, references or [],
|
|
154
166
|
{"line": position[0], "col": position[1],
|
|
155
167
|
"symbol_name": definition.qualified_name,
|
|
156
168
|
"definition_key": json.dumps([definition.file_path, definition.start_line, definition.qualified_name])})
|
|
157
169
|
self.verified_languages.add(language)
|
|
158
|
-
|
|
159
|
-
|
|
170
|
+
answered = references is not None
|
|
171
|
+
outcomes.append({"language": language,
|
|
172
|
+
"status": "verified" if references or (answered and not candidates) else "no_references",
|
|
173
|
+
"symbol": definition.qualified_name, "references": len(references or [])})
|
|
160
174
|
except Exception as exc:
|
|
161
175
|
status = "timeout" if isinstance(exc, TimeoutError) or isinstance(exc.__cause__, TimeoutError) else "failed"
|
|
162
176
|
self.failures[server_id] = (status, _now() + _RETRY_SECONDS)
|
|
@@ -123,6 +123,7 @@ class CodeIntelService:
|
|
|
123
123
|
try:
|
|
124
124
|
from attocode_intel._internal.integrations.context.systemone_ranker import (
|
|
125
125
|
SystemOneChoiceReranker,
|
|
126
|
+
workspace_consent,
|
|
126
127
|
)
|
|
127
128
|
|
|
128
129
|
environment = os.environ if config is None else {}
|
|
@@ -141,8 +142,7 @@ class CodeIntelService:
|
|
|
141
142
|
or preset.get("model", ""),
|
|
142
143
|
auth_env=self._config.ranking_auth_env or environment.get("ATTOCODE_INTEL_RANKING_AUTH_ENV", "")
|
|
143
144
|
or preset.get("auth_env", ""),
|
|
144
|
-
allow_remote=(remote_opt_in
|
|
145
|
-
os.path.realpath(remote_workspace) == self._project_dir),
|
|
145
|
+
allow_remote=workspace_consent(remote_opt_in, remote_workspace, self._project_dir),
|
|
146
146
|
service_mode=self._config.is_service_mode,
|
|
147
147
|
timeout_seconds=None if timeout_ms == 0 else timeout_ms / 1000,
|
|
148
148
|
max_candidates=(self._config.ranking_max_candidates if config is not None else
|
|
@@ -1816,7 +1816,7 @@ class CodeIntelService:
|
|
|
1816
1816
|
except Exception as e:
|
|
1817
1817
|
return {"locations": [], "total": 0, "error": f"LSP error: {e}"}
|
|
1818
1818
|
locations = []
|
|
1819
|
-
for loc in locs:
|
|
1819
|
+
for loc in locs or []:
|
|
1820
1820
|
uri = loc.uri
|
|
1821
1821
|
if uri.startswith("file://"):
|
|
1822
1822
|
uri = uri[7:]
|
{attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/src/attocode_intel/workers/jobs.py
RENAMED
|
@@ -292,7 +292,7 @@ async def generate_embeddings(ctx: dict, repo_id: str, branch_name: str = "main"
|
|
|
292
292
|
except (ImportError, RuntimeError) as exc:
|
|
293
293
|
return {"error": str(exc)}
|
|
294
294
|
if provider.name == "none":
|
|
295
|
-
return {"error": "No embedding provider available", "hint": "Install sentence-transformers or set OPENAI_API_KEY"}
|
|
295
|
+
return {"error": "No embedding provider available", "hint": "Install sentence-transformers or set ATTOCODE_EMBEDDING_MODEL=openai with OPENAI_API_KEY"}
|
|
296
296
|
|
|
297
297
|
dim = provider.dimension()
|
|
298
298
|
|
|
@@ -194,3 +194,127 @@ async def test_null_lookup_without_static_callers_after_warmup(
|
|
|
194
194
|
finally:
|
|
195
195
|
await gateway.close()
|
|
196
196
|
assert process is not None and process.returncode == 0
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
def _status_server(window: float) -> str:
|
|
200
|
+
"""A server like rust-analyzer: null replies while its VFS loads, with status."""
|
|
201
|
+
gate = f'''
|
|
202
|
+
if method in ('textDocument/definition', 'textDocument/references'):
|
|
203
|
+
if timer is None:
|
|
204
|
+
def become_ready():
|
|
205
|
+
global ready
|
|
206
|
+
ready = True
|
|
207
|
+
if status:
|
|
208
|
+
send({{'jsonrpc':'2.0','method':'experimental/serverStatus','params':{{'health':'ok','quiescent':True}}}})
|
|
209
|
+
timer = threading.Timer({window!r}, become_ready)
|
|
210
|
+
timer.daemon = True
|
|
211
|
+
timer.start()
|
|
212
|
+
if not ready:
|
|
213
|
+
send({{'jsonrpc':'2.0','id':msg['id'],'result':None}})
|
|
214
|
+
continue
|
|
215
|
+
'''
|
|
216
|
+
source = (SERVER
|
|
217
|
+
.replace('root = None', 'import threading\nlock = threading.Lock()\n'
|
|
218
|
+
'ready = status = False\ntimer = None\nroot = None')
|
|
219
|
+
.replace('def send(value):', 'def _send(value):')
|
|
220
|
+
.replace('while True:\n header', 'def send(value):\n with lock:\n _send(value)\n\n'
|
|
221
|
+
'while True:\n header')
|
|
222
|
+
.replace(" pending_init = msg['id']\n", " pending_init = msg['id']\n"
|
|
223
|
+
" status = bool(params['capabilities'].get('experimental', {})"
|
|
224
|
+
".get('serverStatusNotification'))\n")
|
|
225
|
+
.replace(" pending_init = None\n continue", " pending_init = None\n"
|
|
226
|
+
" if status:\n"
|
|
227
|
+
" send({'jsonrpc':'2.0','method':'experimental/serverStatus',"
|
|
228
|
+
"'params':{'health':'ok','quiescent':False}})\n continue")
|
|
229
|
+
.replace(' result = None', gate + '\n result = None'))
|
|
230
|
+
assert source.count('experimental/serverStatus') == 2 and 'def _send' in source
|
|
231
|
+
return source
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
async def test_not_ready_window_longer_than_backoff_is_waited_out(tmp_path, monkeypatch):
|
|
235
|
+
"""The null window (0.6 s) is longer than the retry backoff (about 0.35 s)."""
|
|
236
|
+
script = tmp_path / 'server.py'
|
|
237
|
+
script.write_text(_status_server(0.6))
|
|
238
|
+
monkeypatch.setitem(BUILTIN_SERVERS, 'python', LanguageServerConfig(
|
|
239
|
+
command=sys.executable, args=[str(script)], extensions=['.py'], language_id='python'))
|
|
240
|
+
monkeypatch.setenv('ATTOCODE_INTEL_PRECISION', 'auto')
|
|
241
|
+
root = tmp_path / 'project'
|
|
242
|
+
root.mkdir()
|
|
243
|
+
(root / 'helper.py').write_text('def helper(): return 1\n')
|
|
244
|
+
(root / 'caller.py').write_text('from helper import helper\nhelper()\n')
|
|
245
|
+
gateway = OperationGateway(str(root), 'daily', watch=False)
|
|
246
|
+
try:
|
|
247
|
+
response = await gateway.execute('inspect_symbol', {
|
|
248
|
+
'symbol_name': 'helper', 'file_path': 'helper.py', 'line': 1})
|
|
249
|
+
assert not response.isError
|
|
250
|
+
result = response.structuredContent
|
|
251
|
+
precision = result['metadata']['analysis']['precision']
|
|
252
|
+
assert precision['status'] == 'verified', precision
|
|
253
|
+
assert any(r['file_path'] == 'caller.py' and r['source'] == 'lsp'
|
|
254
|
+
for r in result['data']['references'])
|
|
255
|
+
finally:
|
|
256
|
+
await gateway.close()
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
async def test_null_references_are_not_an_answer_of_zero(tmp_path, monkeypatch):
|
|
260
|
+
"""A resolved symbol with no static callers needs an answer, not a null reply."""
|
|
261
|
+
script = tmp_path / 'server.py'
|
|
262
|
+
gate = '''
|
|
263
|
+
if method == 'textDocument/references':
|
|
264
|
+
send({'jsonrpc':'2.0','id':msg['id'],'result':None})
|
|
265
|
+
continue
|
|
266
|
+
'''
|
|
267
|
+
script.write_text(SERVER.replace(' result = None', gate + '\n result = None'))
|
|
268
|
+
monkeypatch.setitem(BUILTIN_SERVERS, 'python', LanguageServerConfig(
|
|
269
|
+
command=sys.executable, args=[str(script)], extensions=['.py'], language_id='python'))
|
|
270
|
+
monkeypatch.setenv('ATTOCODE_INTEL_PRECISION', 'auto')
|
|
271
|
+
root = tmp_path / 'project'
|
|
272
|
+
root.mkdir()
|
|
273
|
+
(root / 'helper.py').write_text('def helper(): return 1\n')
|
|
274
|
+
gateway = OperationGateway(str(root), 'daily', watch=False)
|
|
275
|
+
try:
|
|
276
|
+
response = await gateway.execute('inspect_symbol', {
|
|
277
|
+
'symbol_name': 'helper', 'file_path': 'helper.py', 'line': 1})
|
|
278
|
+
assert not response.isError
|
|
279
|
+
precision = response.structuredContent['metadata']['analysis']['precision']
|
|
280
|
+
assert precision['queries'][0]['status'] == 'no_references', precision
|
|
281
|
+
assert precision['status'] == 'partial'
|
|
282
|
+
finally:
|
|
283
|
+
await gateway.close()
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
async def test_empty_answer_is_not_a_wait_for_readiness(tmp_path, monkeypatch):
|
|
287
|
+
"""rust-analyzer can answer [] while it reports not ready: do not wait then."""
|
|
288
|
+
from attocode_intel._internal.integrations.lsp.client import LSPManager
|
|
289
|
+
null_gate = (" if not ready:\n"
|
|
290
|
+
" send({'jsonrpc':'2.0','id':msg['id'],'result':None})")
|
|
291
|
+
source = _status_server(30.0)
|
|
292
|
+
assert source.count(null_gate) == 1
|
|
293
|
+
script = tmp_path / 'server.py'
|
|
294
|
+
script.write_text(source.replace(null_gate, (
|
|
295
|
+
" if not ready and method == 'textDocument/references':\n"
|
|
296
|
+
" send({'jsonrpc':'2.0','id':msg['id'],'result':[]})")))
|
|
297
|
+
waits = []
|
|
298
|
+
|
|
299
|
+
async def record_wait(self, file, timeout):
|
|
300
|
+
waits.append(timeout)
|
|
301
|
+
return False
|
|
302
|
+
|
|
303
|
+
monkeypatch.setattr(LSPManager, 'wait_ready', record_wait)
|
|
304
|
+
monkeypatch.setitem(BUILTIN_SERVERS, 'python', LanguageServerConfig(
|
|
305
|
+
command=sys.executable, args=[str(script)], extensions=['.py'], language_id='python'))
|
|
306
|
+
monkeypatch.setenv('ATTOCODE_INTEL_PRECISION', 'auto')
|
|
307
|
+
root = tmp_path / 'project'
|
|
308
|
+
root.mkdir()
|
|
309
|
+
(root / 'helper.py').write_text('def helper(): return 1\n')
|
|
310
|
+
(root / 'caller.py').write_text('from helper import helper\nhelper()\n')
|
|
311
|
+
gateway = OperationGateway(str(root), 'daily', watch=False)
|
|
312
|
+
try:
|
|
313
|
+
response = await gateway.execute('inspect_symbol', {
|
|
314
|
+
'symbol_name': 'helper', 'file_path': 'helper.py', 'line': 1})
|
|
315
|
+
assert not response.isError
|
|
316
|
+
precision = response.structuredContent['metadata']['analysis']['precision']
|
|
317
|
+
assert precision['queries'][0]['status'] == 'no_references', precision
|
|
318
|
+
assert waits == []
|
|
319
|
+
finally:
|
|
320
|
+
await gateway.close()
|
{attocode_code_intel-0.1.24 → attocode_code_intel-0.1.25}/tests/test_real_language_server.py
RENAMED
|
@@ -123,7 +123,7 @@ async def test_real_server_warmed_selected_definition_and_edit(tmp_path, monkeyp
|
|
|
123
123
|
manager.notify_file_opened(str(tmp_path / name), content)
|
|
124
124
|
while True:
|
|
125
125
|
try:
|
|
126
|
-
refs = await manager.get_references(str(tmp_path / target), line - 1, column, include_declaration=False)
|
|
126
|
+
refs = await manager.get_references(str(tmp_path / target), line - 1, column, include_declaration=False) or []
|
|
127
127
|
except ToolError as error:
|
|
128
128
|
if str(error).lower() != 'content modified':
|
|
129
129
|
raise
|
|
@@ -156,7 +156,7 @@ async def test_real_server_warmed_selected_definition_and_edit(tmp_path, monkeyp
|
|
|
156
156
|
async with asyncio.timeout(15):
|
|
157
157
|
while True:
|
|
158
158
|
try:
|
|
159
|
-
refs = await manager.get_references(str(tmp_path / other), line - 1, column, include_declaration=False)
|
|
159
|
+
refs = await manager.get_references(str(tmp_path / other), line - 1, column, include_declaration=False) or []
|
|
160
160
|
except ToolError as error:
|
|
161
161
|
if str(error).lower() != 'content modified':
|
|
162
162
|
raise
|