attocode-code-intel 0.1.24__tar.gz → 0.1.26__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.26}/PKG-INFO +5 -1
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/README.md +4 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/pyproject.toml +1 -1
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/__init__.py +1 -1
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/embeddings.py +18 -21
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/systemone_ranker.py +83 -54
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/lsp/client.py +95 -11
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/embeddings.py +2 -2
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/precision.py +25 -10
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/service.py +3 -3
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/workers/jobs.py +1 -1
- attocode_code_intel-0.1.26/tests/test_precision_budget.py +264 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_precision_recovery.py +124 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_real_language_server.py +2 -2
- attocode_code_intel-0.1.26/tests/unit/eval/test_matrix_embed_screen.py +199 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/context/test_embeddings.py +59 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/.gitignore +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/LICENSE +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/GUIDELINES.md +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/errors/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/architecture_drift.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/ast_chunker.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/ast_service.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/ast_snapshot.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/blob_oid.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/cache_manifest.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/cas.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/code_analyzer.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/codebase_ast.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/codebase_context.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/cross_mode.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/cross_references.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/discovery_snapshot.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/embedding_rotation.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/frecency.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/fuzzy.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/hierarchical_explorer.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/hydration.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/index_probe.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/index_repair.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/index_store.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/language_registry.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/memory_store.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/module_resolution.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/parse_diagnostics.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/query_constraints.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/query_history.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/reranker.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/semantic_search.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/syntax_evidence.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/temporal_coupling.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/trigram_index.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/trigram_regex.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/ts_parser.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/vector_store.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/feature_flags/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/lsp/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/mcp/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/mcp/client.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/security/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/security/custom_rules.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/security/dataflow.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/security/dependency_audit.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/security/matcher.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/security/patterns.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/security/scanner.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/utilities/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/utilities/ignore.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/utilities/token_estimate.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/types/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/types/events.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/types/severity.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_shared.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/analysis_coverage.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/access.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/app.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/auth/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/auth/api_keys.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/auth/context.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/auth/jwt.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/auth/oauth.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/auth/passwords.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/deps.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/knowledge_bridge.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/mcp_transport.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/middleware.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/models.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/providers/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/providers/db_provider.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/providers/local_provider.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/providers/remote_provider.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/repository_source.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/_pin_helper.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/activity.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/adr.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/analysis.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/api_keys.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/auth.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/branches.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/cross_repo_search.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/files.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/files_v2.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/gc.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/git_v2.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/graph.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/graph_viz.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/health.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/history.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/jobs.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/learning.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/lsp.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/notify.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/operations.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/orgs.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/preferences.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/presence.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/projects.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/repos.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/search.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/snapshots.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/webhooks.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/websocket.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/static/graph.html +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/utils.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/artifacts/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/artifacts/hashing.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/artifacts/provenance.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/artifacts/retrieval_pin.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/audit.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/bug_finder.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/bundle.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/catalog.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/change_evidence.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/change_investigation.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/change_review.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/cli.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/community.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/confidence/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/confidence/jev.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/confidence/llm.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/confidence/redact.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/confidence/settings.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/config.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/crypto.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/db/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/db/base.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/db/engine.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/db/models.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/entrypoint.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/focused_evidence.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/freshness.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/gateway.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/git/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/git/credentials.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/git/manager.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/git/models.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/git/storage.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/graph_query_parser.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/helpers.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/indexing/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/indexing/debouncer.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/indexing/delta_indexer.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/indexing/full_indexer.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/indexing/incremental.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/indexing/parser.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/indexing/summarizer.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/installer.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/investigation_cli.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/knowledge.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/local_knowledge.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/migrations/alembic.ini +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/migrations/env.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/migrations/script.py.mako +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/migrations/versions/001_initial_schema.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/migrations/versions/002_branch_version_and_embeddings.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/migrations/versions/003_embedding_uniqueness_and_cascade.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/migrations/versions/004_audit_events.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/migrations/versions/005_user_preferences.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/migrations/versions/006_google_oauth.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/migrations/versions/007_pgvector_embeddings.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/migrations/versions/008_symbol_references.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/migrations/versions/009_webhook_secret_encryption.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/migrations/versions/010_add_commits_table.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/migrations/versions/011_commit_changed_files.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/migrations/versions/012_branch_merged_at.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/migrations/versions/013_revoked_tokens.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/migrations/versions/014_blame_hunks.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/migrations/versions/015_commit_file_stats.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/migrations/versions/016_embedding_provenance_columns.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/migrations/versions/017_provenance_table.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/migrations/versions/018_repo_snapshots.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/migrations/versions/019_symref_caller.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/migrations/versions/020_shared_knowledge.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/onboarding.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/output.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/presence.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/probe.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/project_dir.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/pubsub.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/query_ranking.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/readiness.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/redis.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/reference_pages.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/remote.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/repo_ranker.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/request_context.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/ci.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/combinators.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/enricher.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/evolution.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/executor.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/filters/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/filters/pipeline.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/formatter.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/hygiene.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/importers/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/importers/semgrep.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/loader.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/marketplace.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/metavar.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/model.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/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.26}/src/attocode_intel/rules/packs/community/_license_templates/MIT.txt +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/community/bandit-python/LICENSE +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/community/bandit-python/NOTICE +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/community/bandit-python/PORTING.md +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/community/bandit-python/manifest.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/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.26}/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.26}/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.26}/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.26}/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.26}/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.26}/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.26}/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.26}/src/attocode_intel/rules/packs/community/eslint-typescript/LICENSE +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/community/eslint-typescript/NOTICE +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/community/eslint-typescript/PORTING.md +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/community/eslint-typescript/manifest.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/community/eslint-typescript/rules/eqeqeq.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/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.26}/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.26}/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.26}/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.26}/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.26}/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.26}/src/attocode_intel/rules/packs/community/gosec-go/LICENSE +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/community/gosec-go/NOTICE +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/community/gosec-go/PORTING.md +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/community/gosec-go/manifest.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/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.26}/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.26}/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.26}/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.26}/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.26}/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.26}/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.26}/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.26}/src/attocode_intel/rules/packs/examples/cpp/manifest.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/cpp/rules/security.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/cpp/rules/structural.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/csharp/manifest.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/csharp/rules/security.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/csharp/rules/structural.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/go/manifest.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/go/rules/performance.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/go/rules/security.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/go/rules/structural.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/go/taint/sanitizers.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/go/taint/sinks.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/go/taint/sources.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/java/manifest.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/java/rules/correctness.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/java/rules/structural.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/java/taint/sinks.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/java/taint/sources.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/kotlin/manifest.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/kotlin/rules/correctness.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/kotlin/rules/structural.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/php/manifest.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/php/rules/security.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/php/rules/structural.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/python/manifest.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/python/rules/performance.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/python/rules/structural.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/ruby/manifest.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/ruby/rules/security.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/ruby/rules/structural.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/rust/manifest.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/rust/rules/correctness.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/rust/rules/structural.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/typescript/manifest.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/typescript/rules/performance.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/typescript/rules/structural.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/pack_loader.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/plugins/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/plugins/plugin_loader.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/profiling.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/registry.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/sarif.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/synthesis.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/testing.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/search_evidence.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/server.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/sharing.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/storage/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/storage/branch_overlay.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/storage/content_store.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/storage/dependency_store.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/storage/diff_engine.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/storage/embedding_store.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/storage/provenance_store.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/storage/security_scanner_db.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/storage/symbol_store.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/structural_evidence.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/symbol_inspection.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/symbol_links.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/telemetry.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/test_ranking.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/testing/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/testing/fixtures.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/testing/helpers.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/testing/mocks.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/tools/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/tools/adr_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/tools/analysis_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/tools/composite_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/tools/cross_mode_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/tools/dead_code_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/tools/distill_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/tools/frecency_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/tools/fuzzy_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/tools/history_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/tools/learning_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/tools/lsp_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/tools/maintenance_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/tools/navigation_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/tools/overlay_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/tools/pin_store.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/tools/pin_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/tools/query_constraints_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/tools/query_history_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/tools/readiness_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/tools/rule_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/tools/search_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/tools/snapshot_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/workers/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/workers/job_utils.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/workers/run.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/workers/settings.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/fixtures/rule_violations/.attocode/rules/team-preferences.yaml +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/fixtures/rule_violations/go/bad_patterns.go +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/fixtures/rule_violations/java/BadPatterns.java +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/fixtures/rule_violations/python/bad_patterns.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/fixtures/rule_violations/rust/bad_patterns.rs +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/fixtures/rule_violations/typescript/bad_patterns.ts +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/fixtures/sample_project/.attocode/.gitignore +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/fixtures/sample_project/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/fixtures/sample_project/main.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/fixtures/sample_project/models.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/fixtures/sample_project/utils.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/integration/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/integration/code_intel/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/integration/code_intel/conftest.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/integration/code_intel/test_http_smoke.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/integration/code_intel/test_mcp_tools_audit.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/integration/code_intel/test_remote_mcp_http_integration.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/integration/code_intel/test_service_integration.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/integration/test_rule_bench_floor_e2e.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_ast_snapshot.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_behavioral_negation.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_capacity_experiment.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_change_focus.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_change_investigation.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_chunk_identity.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_codex_repair_study.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_cold_discovery.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_cold_index_cost.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_compact_inspection.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_corpus_capture.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_daily_workflows.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_db_navigation_http.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_discovery_ceiling.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_discovery_reuse.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_doctor.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_doctor_runtime.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_edit_restart.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_experiment_dispatch.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_experiment_evidence.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_experiment_readiness.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_external_study.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_fallback_lexical.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_file_symbol_scope.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_fixture_source_alias.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_focused_inspection.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_image_budget.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_importance_publication.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_index_probe.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_index_processes.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_index_reuse.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_index_sequences.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_kotlin_test_paths.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_language_capabilities.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_lean_profile.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_lexical_sql_cost.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_local_reranker.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_local_workflow_evidence.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_localize_study.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_lsp_diagnostics.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_lsp_document_lifecycle.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_lsp_stderr_lifecycle.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_mcp_search_evaluation.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_mixed_workspace.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_module_ownership.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_native_capture.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_native_experiment.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_navigation_evidence.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_navigation_prefix_trial.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_ocaml_parser_routing.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_onboarding_study.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_operation_contracts.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_optional_grammar_admission.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_optional_language_depth.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_parse_recovery.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_parser_thread_isolation.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_pilot.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_precision_protocol.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_preview_admission.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_preview_experiment.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_preview_sources.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_preview_windows.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_product.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_quality_cloud.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_quality_evaluation.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_quality_evidence.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_quality_lifecycle.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_quality_runner.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_query_ranking.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_query_requirements.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_ranking_intent.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_recovery_readiness.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_release_verification.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_remote.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_repair_study.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_restart_experiment.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_retrieval_ablation.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_retrieval_audit.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_retrieval_body_trial.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_retrieval_cycle.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_search_budget_repair.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_search_coverage.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_search_coverage_scale.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_search_evidence.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_search_evidence_audit.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_search_usefulness.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_snippet_budget.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_source_exclusions.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_structural_evidence.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_structural_write_cost.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_study.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_symbol_order.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_systemone_ranker.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_test_intent_trial.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_token_overhead.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_trigram_workspace.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_understanding_evaluation.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_walk_order.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_warm_cache.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_workflow_sequences.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/conftest.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_advisory_lock.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_api.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_api_phase3a.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_api_v2.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_auth.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_branch_versioning.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_bug_finder.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_call_graph_tool.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_ci_runner.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_cli_lifecycle.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_cli_maintenance_local.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_cli_ops.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_cli_query_commands.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_cli_remote.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_codex_rereview_polish.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_combinators.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_confidence.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_confidence_adoption.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_config.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_config_remote.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_cross_mode.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_db_security_scan.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_deps.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_diff_engine.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_edge_cases.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_frecency.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_fuzzy.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_index_store_migration.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_kw_index_status.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_lsp_call_graph.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_lsp_enrichment.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_lsp_extended_models.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_marketplace.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_metavar.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_middleware.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_notify_enhanced.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_org_isolation.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_pack_autoload.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_profiling.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_project_discovery.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_provenance_store.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_pubsub_streams.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_query_constraints.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_query_history.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_readiness.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_reindex_embeddings.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_remote_local_fallback.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_remote_provider.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_remote_reliability.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_repo_ranker.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_rule_evolution.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_rule_hygiene.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_rule_synthesis.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_rule_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_rule_violations.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_rules_engine.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_rules_integration.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_sarif.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_search_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_server_startup.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_service.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_service_mode.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_status_health.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_structural_executor.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_supply_chain_rules.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_testing_framework.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_webhook_encryption.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/tools/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/tools/conftest.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/tools/test_adr_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/tools/test_analysis_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/tools/test_dead_code_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/tools/test_distill_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/tools/test_history_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/tools/test_learning_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/tools/test_lsp_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/tools/test_maintenance_tools_phase2.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/tools/test_navigation_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/tools/test_phase2c_anchors_and_overlays.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/tools/test_readiness_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/tools/test_search_status_mismatch.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/tools/test_search_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/tools/test_server_tools.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/context/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/context/test_action_hash.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/context/test_ast_service_adapter.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/context/test_blob_oid.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/context/test_cache_manifest.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/context/test_cas.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/context/test_embedding_rotation.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/context/test_pagerank_restoration.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/context/test_provenance.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/context/test_retrieval_pin.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/context/test_vector_store_dim_safety.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/conftest.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_acc_at_k.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_broad_candidate_audit.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_calibration_demo.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_harness.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_matrix_agents.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_matrix_ci.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_matrix_datasets.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_matrix_dense.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_matrix_function_bm25.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_matrix_function_dense.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_matrix_rerank.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_matrix_retrieve.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_matrix_run.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_matrix_stats.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_mcp_bench.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_rule_accuracy.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_rule_bench_config.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_rule_bench_corpus.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_rule_bench_evaluator.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_rule_bench_predicate.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_rule_bench_scoring.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_rule_bench_template_engine.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_rule_harness_import.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_search_quality_reporting.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_search_readiness.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_seed_attocode_fixtures.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/context/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/context/test_architecture_drift.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/context/test_ast_service_hydration.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/context/test_body_chunking.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/context/test_call_graph.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/context/test_code_analyzer.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/context/test_codebase_ast.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/context/test_codebase_context.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/context/test_context_stores_closed.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/context/test_cross_ref_search.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/context/test_embedder_default.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/context/test_embeddings_query.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/context/test_go_symbols.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/context/test_hydration.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/context/test_index_store.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/context/test_model_mismatch.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/context/test_path_downweight.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/context/test_query_routing.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/context/test_semantic_search.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/context/test_supported_languages.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/context/test_temporal_coupling.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/context/test_trigram_index.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/context/test_trigram_regex.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/context/test_ts_parser.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/test_dataflow.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/test_feature_flags.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/test_new_security_rules.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/test_security_autofix.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/test_security_matcher.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/test_streaming_lsp.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/utilities/__init__.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/utilities/test_ignore.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/utilities/test_token_estimate.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/test_code_intel.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/test_code_intel_hydration.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/test_errors.py +0 -0
- {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/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.26
|
|
4
4
|
Summary: Local code search and navigation for coding agents and people
|
|
5
5
|
Project-URL: Homepage, https://github.com/eren23/attocode
|
|
6
6
|
Project-URL: Repository, https://github.com/eren23/attocode
|
|
@@ -156,6 +156,10 @@ To use the latest source, install from a clone of this repository: `uv tool inst
|
|
|
156
156
|
|
|
157
157
|
## What your agent gets
|
|
158
158
|
|
|
159
|
+
Version 0.1.26 gives Rust precision lookups a shared five-second budget and fixes cancelled startup cleanup when a child retains inherited pipes. Other languages keep two seconds; longer reloads still return partial evidence.
|
|
160
|
+
|
|
161
|
+
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.
|
|
162
|
+
|
|
159
163
|
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
164
|
|
|
161
165
|
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,10 @@ To use the latest source, install from a clone of this repository: `uv tool inst
|
|
|
43
43
|
|
|
44
44
|
## What your agent gets
|
|
45
45
|
|
|
46
|
+
Version 0.1.26 gives Rust precision lookups a shared five-second budget and fixes cancelled startup cleanup when a child retains inherited pipes. Other languages keep two seconds; longer reloads still return partial evidence.
|
|
47
|
+
|
|
48
|
+
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.
|
|
49
|
+
|
|
46
50
|
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
51
|
|
|
48
52
|
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}},
|
|
@@ -363,6 +369,50 @@ class _LSPClient:
|
|
|
363
369
|
future.cancel()
|
|
364
370
|
self._pending.clear()
|
|
365
371
|
|
|
372
|
+
async def _abort_start(
|
|
373
|
+
self,
|
|
374
|
+
process: asyncio.subprocess.Process | None,
|
|
375
|
+
reader: asyncio.Task[None] | None,
|
|
376
|
+
stderr: asyncio.Task[None] | None,
|
|
377
|
+
) -> None:
|
|
378
|
+
"""Release a cancelled startup without waiting for inherited pipes."""
|
|
379
|
+
tasks = {task for task in (*self._notifications, reader, stderr) if task is not None}
|
|
380
|
+
try:
|
|
381
|
+
if process is not None:
|
|
382
|
+
if process.returncode is None:
|
|
383
|
+
try:
|
|
384
|
+
process.kill()
|
|
385
|
+
except ProcessLookupError:
|
|
386
|
+
pass
|
|
387
|
+
if process.stdin is not None:
|
|
388
|
+
transport = process.stdin.transport
|
|
389
|
+
# close() drains buffered writes; an inheriting child may
|
|
390
|
+
# never read them. abort() also handles a pending close.
|
|
391
|
+
if not transport.is_closing() or transport.get_write_buffer_size():
|
|
392
|
+
transport.abort()
|
|
393
|
+
# Process.wait() can wait for descendants to close inherited
|
|
394
|
+
# pipes. asyncio has no public API to close all owned pipes.
|
|
395
|
+
process._transport.close()
|
|
396
|
+
for task in tasks:
|
|
397
|
+
task.cancel()
|
|
398
|
+
async with asyncio.timeout(0.25):
|
|
399
|
+
if process is None:
|
|
400
|
+
await asyncio.gather(*tasks, return_exceptions=True)
|
|
401
|
+
else:
|
|
402
|
+
await asyncio.gather(*tasks, process.wait(), return_exceptions=True)
|
|
403
|
+
except TimeoutError:
|
|
404
|
+
logger.warning("LSP %s: cancelled startup cleanup timed out", self.language_id)
|
|
405
|
+
finally:
|
|
406
|
+
self._process = None
|
|
407
|
+
self._reader_task = self._stderr_task = None
|
|
408
|
+
self._initialized = self._is_stopping = False
|
|
409
|
+
self._documents.clear()
|
|
410
|
+
self._notifications.clear()
|
|
411
|
+
for future in self._pending.values():
|
|
412
|
+
if not future.done():
|
|
413
|
+
future.cancel()
|
|
414
|
+
self._pending.clear()
|
|
415
|
+
|
|
366
416
|
async def get_definition(
|
|
367
417
|
self, uri: str, line: int, character: int
|
|
368
418
|
) -> LSPLocation | None:
|
|
@@ -461,8 +511,13 @@ class _LSPClient:
|
|
|
461
511
|
line: int,
|
|
462
512
|
character: int,
|
|
463
513
|
include_declaration: bool = True,
|
|
464
|
-
) -> list[LSPLocation]:
|
|
465
|
-
"""Get all references to a symbol.
|
|
514
|
+
) -> list[LSPLocation] | None:
|
|
515
|
+
"""Get all references to a symbol.
|
|
516
|
+
|
|
517
|
+
Returns None when the server replied null. A server that is not ready
|
|
518
|
+
(rust-analyzer while its VFS loads) does this; an answer with no
|
|
519
|
+
references is an empty list.
|
|
520
|
+
"""
|
|
466
521
|
if not self._initialized:
|
|
467
522
|
return []
|
|
468
523
|
|
|
@@ -471,7 +526,9 @@ class _LSPClient:
|
|
|
471
526
|
"position": {"line": line, "character": character},
|
|
472
527
|
"context": {"includeDeclaration": include_declaration},
|
|
473
528
|
})
|
|
474
|
-
if
|
|
529
|
+
if result is None:
|
|
530
|
+
return None
|
|
531
|
+
if not isinstance(result, list):
|
|
475
532
|
return []
|
|
476
533
|
|
|
477
534
|
return [
|
|
@@ -806,9 +863,24 @@ class _LSPClient:
|
|
|
806
863
|
elif "method" in message:
|
|
807
864
|
self._handle_notification(message["method"], message.get("params"))
|
|
808
865
|
|
|
866
|
+
async def wait_ready(self, timeout: float) -> bool:
|
|
867
|
+
"""Wait up to ``timeout`` seconds until the server reports it is ready."""
|
|
868
|
+
if self._ready.is_set():
|
|
869
|
+
return True
|
|
870
|
+
try:
|
|
871
|
+
await asyncio.wait_for(self._ready.wait(), max(timeout, 0))
|
|
872
|
+
except TimeoutError:
|
|
873
|
+
return False
|
|
874
|
+
return True
|
|
875
|
+
|
|
809
876
|
def _handle_notification(self, method: str, params: Any) -> None:
|
|
810
877
|
"""Handle server notification."""
|
|
811
|
-
if method == "
|
|
878
|
+
if method == "experimental/serverStatus" and isinstance(params, dict):
|
|
879
|
+
if params.get("quiescent"):
|
|
880
|
+
self._ready.set()
|
|
881
|
+
else:
|
|
882
|
+
self._ready.clear()
|
|
883
|
+
elif method == "textDocument/publishDiagnostics" and self._on_diagnostics:
|
|
812
884
|
uri = params.get("uri", "")
|
|
813
885
|
raw_diags = params.get("diagnostics", [])
|
|
814
886
|
severity_map = {1: "error", 2: "warning", 3: "information", 4: "hint"}
|
|
@@ -905,9 +977,9 @@ class LSPManager:
|
|
|
905
977
|
return started
|
|
906
978
|
|
|
907
979
|
async def start_server(
|
|
908
|
-
self, language_id: str, root_uri: str | None = None
|
|
980
|
+
self, language_id: str, root_uri: str | None = None, *, timeout: float | None = None
|
|
909
981
|
) -> None:
|
|
910
|
-
"""Start a
|
|
982
|
+
"""Start a server, optionally overriding this client's timeout only."""
|
|
911
983
|
if language_id in self._clients:
|
|
912
984
|
return
|
|
913
985
|
|
|
@@ -929,7 +1001,7 @@ class LSPManager:
|
|
|
929
1001
|
client = _LSPClient(
|
|
930
1002
|
server_config,
|
|
931
1003
|
root_uri or self._root_uri,
|
|
932
|
-
self._timeout,
|
|
1004
|
+
self._timeout if timeout is None else timeout,
|
|
933
1005
|
on_diags,
|
|
934
1006
|
)
|
|
935
1007
|
|
|
@@ -940,8 +1012,15 @@ class LSPManager:
|
|
|
940
1012
|
|
|
941
1013
|
try:
|
|
942
1014
|
await client.start()
|
|
943
|
-
except BaseException:
|
|
944
|
-
|
|
1015
|
+
except BaseException as exc:
|
|
1016
|
+
process, reader, stderr = client._process, client._reader_task, client._stderr_task
|
|
1017
|
+
try:
|
|
1018
|
+
if isinstance(exc, asyncio.CancelledError):
|
|
1019
|
+
raise
|
|
1020
|
+
await client.stop()
|
|
1021
|
+
except asyncio.CancelledError:
|
|
1022
|
+
await client._abort_start(process, reader, stderr)
|
|
1023
|
+
raise
|
|
945
1024
|
raise
|
|
946
1025
|
self._clients[language_id] = client
|
|
947
1026
|
self._emit("lsp.started", {
|
|
@@ -1002,8 +1081,8 @@ class LSPManager:
|
|
|
1002
1081
|
async def get_references(
|
|
1003
1082
|
self, file: str, line: int, col: int,
|
|
1004
1083
|
include_declaration: bool = True,
|
|
1005
|
-
) -> list[LSPLocation]:
|
|
1006
|
-
"""Get all references to a symbol."""
|
|
1084
|
+
) -> list[LSPLocation] | None:
|
|
1085
|
+
"""Get all references to a symbol. None: the server replied null."""
|
|
1007
1086
|
client = self._get_client_for_file(file)
|
|
1008
1087
|
if not client:
|
|
1009
1088
|
return []
|
|
@@ -1103,6 +1182,11 @@ class LSPManager:
|
|
|
1103
1182
|
return file
|
|
1104
1183
|
return f"file://{os.path.abspath(file)}"
|
|
1105
1184
|
|
|
1185
|
+
async def wait_ready(self, file: str, timeout: float) -> bool:
|
|
1186
|
+
"""Wait until the server for ``file`` reports it is ready."""
|
|
1187
|
+
client = self._get_client_for_file(file)
|
|
1188
|
+
return True if client is None else await client.wait_ready(timeout)
|
|
1189
|
+
|
|
1106
1190
|
def _get_client_for_file(self, file: str) -> _LSPClient | None:
|
|
1107
1191
|
"""Find the appropriate client for a file extension."""
|
|
1108
1192
|
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
|
|
@@ -50,7 +50,8 @@ class PrecisionSession:
|
|
|
50
50
|
self.retry_after.pop(key)
|
|
51
51
|
from ._internal.integrations.lsp.client import BUILTIN_SERVERS
|
|
52
52
|
outcomes = []
|
|
53
|
-
|
|
53
|
+
timeout = 5.0 if detect_language(definitions[0].file_path) == "rust" else 2.0
|
|
54
|
+
deadline = asyncio.get_running_loop().time() + timeout
|
|
54
55
|
for definition in definitions[:8]:
|
|
55
56
|
language = detect_language(definition.file_path)
|
|
56
57
|
server_id = "typescript" if language == "javascript" else language
|
|
@@ -68,8 +69,8 @@ class PrecisionSession:
|
|
|
68
69
|
try:
|
|
69
70
|
async with asyncio.timeout_at(deadline):
|
|
70
71
|
if server_id not in manager.get_active_servers():
|
|
71
|
-
manager.
|
|
72
|
-
|
|
72
|
+
await manager.start_server(server_id, Path(self.service.project_dir).as_uri(),
|
|
73
|
+
timeout=timeout)
|
|
73
74
|
# Send edits/deletions for all previously opened documents.
|
|
74
75
|
for rel in list(self.pending):
|
|
75
76
|
path = str(Path(self.service.project_dir) / rel)
|
|
@@ -100,6 +101,7 @@ class PrecisionSession:
|
|
|
100
101
|
candidates = ast.get_callers(definition.qualified_name)
|
|
101
102
|
resolved, references = None, []
|
|
102
103
|
for attempt in range(4):
|
|
104
|
+
answered = False
|
|
103
105
|
try:
|
|
104
106
|
resolved = await manager.get_definition(path, *position)
|
|
105
107
|
# Some servers (including rust-analyzer) return no
|
|
@@ -134,29 +136,42 @@ class PrecisionSession:
|
|
|
134
136
|
if str(exc).lower() != "content modified" or attempt == 3:
|
|
135
137
|
raise
|
|
136
138
|
else:
|
|
139
|
+
answered = resolved is not None and references is not None
|
|
137
140
|
# No syntax callers does not establish server
|
|
138
141
|
# readiness: both native lookups may be transiently
|
|
139
142
|
# unresolved. A resolved unused declaration can
|
|
140
|
-
# still take the fast path
|
|
141
|
-
|
|
143
|
+
# still take the fast path, but only on an answer:
|
|
144
|
+
# null references (None) mean "not ready".
|
|
145
|
+
if references or (resolved is not None and references is not None
|
|
146
|
+
and not candidates):
|
|
142
147
|
break
|
|
143
148
|
# A server can briefly return null after a successful
|
|
144
149
|
# warmup or edit. Yield before retrying, never extend
|
|
145
|
-
# the enclosing
|
|
150
|
+
# the enclosing language deadline or loop forever.
|
|
146
151
|
if attempt < 3:
|
|
147
152
|
await asyncio.sleep(.05 * 2 ** attempt)
|
|
153
|
+
# After a null or failed reply, a server that reports
|
|
154
|
+
# its status (rust-analyzer) can stay not ready for
|
|
155
|
+
# longer than this backoff. Wait for it, but leave half
|
|
156
|
+
# the deadline for the remaining lookups. Do not wait
|
|
157
|
+
# after an answer: rust-analyzer also answers while
|
|
158
|
+
# its status is not ready. Other servers return at once.
|
|
159
|
+
if not answered:
|
|
160
|
+
await manager.wait_ready(path, (deadline - asyncio.get_running_loop().time()) / 2)
|
|
148
161
|
if resolved is None and not references:
|
|
149
162
|
outcomes.append({"language": language, "status": "not_resolved"})
|
|
150
163
|
continue
|
|
151
164
|
finally:
|
|
152
165
|
manager.on_result_callback = callback
|
|
153
|
-
ast.ingest_lsp_results("references", path, references,
|
|
166
|
+
ast.ingest_lsp_results("references", path, references or [],
|
|
154
167
|
{"line": position[0], "col": position[1],
|
|
155
168
|
"symbol_name": definition.qualified_name,
|
|
156
169
|
"definition_key": json.dumps([definition.file_path, definition.start_line, definition.qualified_name])})
|
|
157
170
|
self.verified_languages.add(language)
|
|
158
|
-
|
|
159
|
-
|
|
171
|
+
answered = references is not None
|
|
172
|
+
outcomes.append({"language": language,
|
|
173
|
+
"status": "verified" if references or (answered and not candidates) else "no_references",
|
|
174
|
+
"symbol": definition.qualified_name, "references": len(references or [])})
|
|
160
175
|
except Exception as exc:
|
|
161
176
|
status = "timeout" if isinstance(exc, TimeoutError) or isinstance(exc.__cause__, TimeoutError) else "failed"
|
|
162
177
|
self.failures[server_id] = (status, _now() + _RETRY_SECONDS)
|
|
@@ -166,7 +181,7 @@ class PrecisionSession:
|
|
|
166
181
|
"definitions_truncated": len(definitions) > 8}
|
|
167
182
|
self.completed[key] = result
|
|
168
183
|
# A server can become ready without a source edit. Retry only on a later
|
|
169
|
-
# explicit request after a short cooldown, keeping the same
|
|
184
|
+
# explicit request after a short cooldown, keeping the same language budget.
|
|
170
185
|
if any(o["status"] in _TRANSIENT for o in outcomes):
|
|
171
186
|
self.retry_after[key] = _now() + _RETRY_SECONDS
|
|
172
187
|
return result
|
|
@@ -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.26}/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
|
|