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.
Files changed (639) hide show
  1. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/PKG-INFO +5 -1
  2. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/README.md +4 -0
  3. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/pyproject.toml +1 -1
  4. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/__init__.py +1 -1
  5. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/embeddings.py +18 -21
  6. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/systemone_ranker.py +83 -54
  7. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/lsp/client.py +95 -11
  8. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/embeddings.py +2 -2
  9. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/precision.py +25 -10
  10. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/service.py +3 -3
  11. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/workers/jobs.py +1 -1
  12. attocode_code_intel-0.1.26/tests/test_precision_budget.py +264 -0
  13. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_precision_recovery.py +124 -0
  14. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_real_language_server.py +2 -2
  15. attocode_code_intel-0.1.26/tests/unit/eval/test_matrix_embed_screen.py +199 -0
  16. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/context/test_embeddings.py +59 -0
  17. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/.gitignore +0 -0
  18. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/LICENSE +0 -0
  19. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/GUIDELINES.md +0 -0
  20. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/__init__.py +0 -0
  21. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/errors/__init__.py +0 -0
  22. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/__init__.py +0 -0
  23. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/__init__.py +0 -0
  24. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/architecture_drift.py +0 -0
  25. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/ast_chunker.py +0 -0
  26. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/ast_service.py +0 -0
  27. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/ast_snapshot.py +0 -0
  28. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/blob_oid.py +0 -0
  29. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/cache_manifest.py +0 -0
  30. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/cas.py +0 -0
  31. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/code_analyzer.py +0 -0
  32. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/codebase_ast.py +0 -0
  33. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/codebase_context.py +0 -0
  34. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/cross_mode.py +0 -0
  35. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/cross_references.py +0 -0
  36. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/discovery_snapshot.py +0 -0
  37. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/embedding_rotation.py +0 -0
  38. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/frecency.py +0 -0
  39. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/fuzzy.py +0 -0
  40. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/hierarchical_explorer.py +0 -0
  41. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/hydration.py +0 -0
  42. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/index_probe.py +0 -0
  43. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/index_repair.py +0 -0
  44. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/index_store.py +0 -0
  45. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/language_registry.py +0 -0
  46. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/memory_store.py +0 -0
  47. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/module_resolution.py +0 -0
  48. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/parse_diagnostics.py +0 -0
  49. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/query_constraints.py +0 -0
  50. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/query_history.py +0 -0
  51. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/reranker.py +0 -0
  52. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/semantic_search.py +0 -0
  53. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/syntax_evidence.py +0 -0
  54. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/temporal_coupling.py +0 -0
  55. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/trigram_index.py +0 -0
  56. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/trigram_regex.py +0 -0
  57. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/ts_parser.py +0 -0
  58. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/context/vector_store.py +0 -0
  59. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/feature_flags/__init__.py +0 -0
  60. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/lsp/__init__.py +0 -0
  61. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/mcp/__init__.py +0 -0
  62. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/mcp/client.py +0 -0
  63. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/security/__init__.py +0 -0
  64. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/security/custom_rules.py +0 -0
  65. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/security/dataflow.py +0 -0
  66. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/security/dependency_audit.py +0 -0
  67. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/security/matcher.py +0 -0
  68. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/security/patterns.py +0 -0
  69. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/security/scanner.py +0 -0
  70. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/utilities/__init__.py +0 -0
  71. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/utilities/ignore.py +0 -0
  72. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/integrations/utilities/token_estimate.py +0 -0
  73. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/types/__init__.py +0 -0
  74. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/types/events.py +0 -0
  75. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_internal/types/severity.py +0 -0
  76. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/_shared.py +0 -0
  77. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/analysis_coverage.py +0 -0
  78. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/__init__.py +0 -0
  79. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/access.py +0 -0
  80. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/app.py +0 -0
  81. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/auth/__init__.py +0 -0
  82. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/auth/api_keys.py +0 -0
  83. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/auth/context.py +0 -0
  84. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/auth/jwt.py +0 -0
  85. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/auth/oauth.py +0 -0
  86. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/auth/passwords.py +0 -0
  87. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/deps.py +0 -0
  88. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/knowledge_bridge.py +0 -0
  89. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/mcp_transport.py +0 -0
  90. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/middleware.py +0 -0
  91. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/models.py +0 -0
  92. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/providers/__init__.py +0 -0
  93. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/providers/db_provider.py +0 -0
  94. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/providers/local_provider.py +0 -0
  95. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/providers/remote_provider.py +0 -0
  96. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/repository_source.py +0 -0
  97. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/__init__.py +0 -0
  98. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/_pin_helper.py +0 -0
  99. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/activity.py +0 -0
  100. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/adr.py +0 -0
  101. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/analysis.py +0 -0
  102. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/api_keys.py +0 -0
  103. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/auth.py +0 -0
  104. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/branches.py +0 -0
  105. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/cross_repo_search.py +0 -0
  106. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/files.py +0 -0
  107. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/files_v2.py +0 -0
  108. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/gc.py +0 -0
  109. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/git_v2.py +0 -0
  110. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/graph.py +0 -0
  111. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/graph_viz.py +0 -0
  112. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/health.py +0 -0
  113. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/history.py +0 -0
  114. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/jobs.py +0 -0
  115. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/learning.py +0 -0
  116. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/lsp.py +0 -0
  117. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/notify.py +0 -0
  118. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/operations.py +0 -0
  119. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/orgs.py +0 -0
  120. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/preferences.py +0 -0
  121. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/presence.py +0 -0
  122. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/projects.py +0 -0
  123. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/repos.py +0 -0
  124. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/search.py +0 -0
  125. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/snapshots.py +0 -0
  126. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/webhooks.py +0 -0
  127. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/routes/websocket.py +0 -0
  128. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/static/graph.html +0 -0
  129. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/api/utils.py +0 -0
  130. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/artifacts/__init__.py +0 -0
  131. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/artifacts/hashing.py +0 -0
  132. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/artifacts/provenance.py +0 -0
  133. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/artifacts/retrieval_pin.py +0 -0
  134. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/audit.py +0 -0
  135. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/bug_finder.py +0 -0
  136. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/bundle.py +0 -0
  137. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/catalog.py +0 -0
  138. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/change_evidence.py +0 -0
  139. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/change_investigation.py +0 -0
  140. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/change_review.py +0 -0
  141. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/cli.py +0 -0
  142. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/community.py +0 -0
  143. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/confidence/__init__.py +0 -0
  144. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/confidence/jev.py +0 -0
  145. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/confidence/llm.py +0 -0
  146. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/confidence/redact.py +0 -0
  147. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/confidence/settings.py +0 -0
  148. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/config.py +0 -0
  149. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/crypto.py +0 -0
  150. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/db/__init__.py +0 -0
  151. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/db/base.py +0 -0
  152. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/db/engine.py +0 -0
  153. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/db/models.py +0 -0
  154. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/entrypoint.py +0 -0
  155. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/focused_evidence.py +0 -0
  156. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/freshness.py +0 -0
  157. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/gateway.py +0 -0
  158. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/git/__init__.py +0 -0
  159. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/git/credentials.py +0 -0
  160. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/git/manager.py +0 -0
  161. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/git/models.py +0 -0
  162. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/git/storage.py +0 -0
  163. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/graph_query_parser.py +0 -0
  164. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/helpers.py +0 -0
  165. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/indexing/__init__.py +0 -0
  166. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/indexing/debouncer.py +0 -0
  167. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/indexing/delta_indexer.py +0 -0
  168. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/indexing/full_indexer.py +0 -0
  169. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/indexing/incremental.py +0 -0
  170. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/indexing/parser.py +0 -0
  171. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/indexing/summarizer.py +0 -0
  172. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/installer.py +0 -0
  173. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/investigation_cli.py +0 -0
  174. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/knowledge.py +0 -0
  175. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/local_knowledge.py +0 -0
  176. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/migrations/alembic.ini +0 -0
  177. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/migrations/env.py +0 -0
  178. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/migrations/script.py.mako +0 -0
  179. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/migrations/versions/001_initial_schema.py +0 -0
  180. {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
  181. {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
  182. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/migrations/versions/004_audit_events.py +0 -0
  183. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/migrations/versions/005_user_preferences.py +0 -0
  184. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/migrations/versions/006_google_oauth.py +0 -0
  185. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/migrations/versions/007_pgvector_embeddings.py +0 -0
  186. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/migrations/versions/008_symbol_references.py +0 -0
  187. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/migrations/versions/009_webhook_secret_encryption.py +0 -0
  188. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/migrations/versions/010_add_commits_table.py +0 -0
  189. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/migrations/versions/011_commit_changed_files.py +0 -0
  190. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/migrations/versions/012_branch_merged_at.py +0 -0
  191. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/migrations/versions/013_revoked_tokens.py +0 -0
  192. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/migrations/versions/014_blame_hunks.py +0 -0
  193. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/migrations/versions/015_commit_file_stats.py +0 -0
  194. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/migrations/versions/016_embedding_provenance_columns.py +0 -0
  195. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/migrations/versions/017_provenance_table.py +0 -0
  196. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/migrations/versions/018_repo_snapshots.py +0 -0
  197. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/migrations/versions/019_symref_caller.py +0 -0
  198. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/migrations/versions/020_shared_knowledge.py +0 -0
  199. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/onboarding.py +0 -0
  200. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/output.py +0 -0
  201. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/presence.py +0 -0
  202. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/probe.py +0 -0
  203. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/project_dir.py +0 -0
  204. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/pubsub.py +0 -0
  205. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/query_ranking.py +0 -0
  206. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/readiness.py +0 -0
  207. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/redis.py +0 -0
  208. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/reference_pages.py +0 -0
  209. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/remote.py +0 -0
  210. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/repo_ranker.py +0 -0
  211. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/request_context.py +0 -0
  212. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/__init__.py +0 -0
  213. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/ci.py +0 -0
  214. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/combinators.py +0 -0
  215. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/enricher.py +0 -0
  216. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/evolution.py +0 -0
  217. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/executor.py +0 -0
  218. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/filters/__init__.py +0 -0
  219. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/filters/pipeline.py +0 -0
  220. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/formatter.py +0 -0
  221. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/hygiene.py +0 -0
  222. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/importers/__init__.py +0 -0
  223. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/importers/semgrep.py +0 -0
  224. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/loader.py +0 -0
  225. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/marketplace.py +0 -0
  226. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/metavar.py +0 -0
  227. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/model.py +0 -0
  228. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/__init__.py +0 -0
  229. {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
  230. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/community/_license_templates/MIT.txt +0 -0
  231. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/community/bandit-python/LICENSE +0 -0
  232. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/community/bandit-python/NOTICE +0 -0
  233. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/community/bandit-python/PORTING.md +0 -0
  234. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/community/bandit-python/manifest.yaml +0 -0
  235. {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
  236. {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
  237. {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
  238. {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
  239. {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
  240. {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
  241. {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
  242. {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
  243. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/community/eslint-typescript/LICENSE +0 -0
  244. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/community/eslint-typescript/NOTICE +0 -0
  245. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/community/eslint-typescript/PORTING.md +0 -0
  246. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/community/eslint-typescript/manifest.yaml +0 -0
  247. {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
  248. {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
  249. {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
  250. {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
  251. {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
  252. {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
  253. {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
  254. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/community/gosec-go/LICENSE +0 -0
  255. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/community/gosec-go/NOTICE +0 -0
  256. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/community/gosec-go/PORTING.md +0 -0
  257. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/community/gosec-go/manifest.yaml +0 -0
  258. {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
  259. {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
  260. {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
  261. {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
  262. {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
  263. {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
  264. {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
  265. {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
  266. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/cpp/manifest.yaml +0 -0
  267. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/cpp/rules/security.yaml +0 -0
  268. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/cpp/rules/structural.yaml +0 -0
  269. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/csharp/manifest.yaml +0 -0
  270. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/csharp/rules/security.yaml +0 -0
  271. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/csharp/rules/structural.yaml +0 -0
  272. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/go/manifest.yaml +0 -0
  273. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/go/rules/performance.yaml +0 -0
  274. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/go/rules/security.yaml +0 -0
  275. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/go/rules/structural.yaml +0 -0
  276. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/go/taint/sanitizers.yaml +0 -0
  277. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/go/taint/sinks.yaml +0 -0
  278. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/go/taint/sources.yaml +0 -0
  279. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/java/manifest.yaml +0 -0
  280. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/java/rules/correctness.yaml +0 -0
  281. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/java/rules/structural.yaml +0 -0
  282. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/java/taint/sinks.yaml +0 -0
  283. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/java/taint/sources.yaml +0 -0
  284. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/kotlin/manifest.yaml +0 -0
  285. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/kotlin/rules/correctness.yaml +0 -0
  286. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/kotlin/rules/structural.yaml +0 -0
  287. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/php/manifest.yaml +0 -0
  288. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/php/rules/security.yaml +0 -0
  289. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/php/rules/structural.yaml +0 -0
  290. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/python/manifest.yaml +0 -0
  291. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/python/rules/performance.yaml +0 -0
  292. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/python/rules/structural.yaml +0 -0
  293. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/ruby/manifest.yaml +0 -0
  294. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/ruby/rules/security.yaml +0 -0
  295. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/ruby/rules/structural.yaml +0 -0
  296. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/rust/manifest.yaml +0 -0
  297. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/rust/rules/correctness.yaml +0 -0
  298. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/rust/rules/structural.yaml +0 -0
  299. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/typescript/manifest.yaml +0 -0
  300. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/typescript/rules/performance.yaml +0 -0
  301. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/examples/typescript/rules/structural.yaml +0 -0
  302. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/packs/pack_loader.py +0 -0
  303. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/plugins/__init__.py +0 -0
  304. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/plugins/plugin_loader.py +0 -0
  305. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/profiling.py +0 -0
  306. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/registry.py +0 -0
  307. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/sarif.py +0 -0
  308. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/synthesis.py +0 -0
  309. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/rules/testing.py +0 -0
  310. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/search_evidence.py +0 -0
  311. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/server.py +0 -0
  312. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/sharing.py +0 -0
  313. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/storage/__init__.py +0 -0
  314. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/storage/branch_overlay.py +0 -0
  315. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/storage/content_store.py +0 -0
  316. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/storage/dependency_store.py +0 -0
  317. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/storage/diff_engine.py +0 -0
  318. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/storage/embedding_store.py +0 -0
  319. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/storage/provenance_store.py +0 -0
  320. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/storage/security_scanner_db.py +0 -0
  321. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/storage/symbol_store.py +0 -0
  322. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/structural_evidence.py +0 -0
  323. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/symbol_inspection.py +0 -0
  324. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/symbol_links.py +0 -0
  325. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/telemetry.py +0 -0
  326. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/test_ranking.py +0 -0
  327. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/testing/__init__.py +0 -0
  328. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/testing/fixtures.py +0 -0
  329. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/testing/helpers.py +0 -0
  330. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/testing/mocks.py +0 -0
  331. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/tools/__init__.py +0 -0
  332. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/tools/adr_tools.py +0 -0
  333. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/tools/analysis_tools.py +0 -0
  334. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/tools/composite_tools.py +0 -0
  335. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/tools/cross_mode_tools.py +0 -0
  336. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/tools/dead_code_tools.py +0 -0
  337. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/tools/distill_tools.py +0 -0
  338. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/tools/frecency_tools.py +0 -0
  339. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/tools/fuzzy_tools.py +0 -0
  340. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/tools/history_tools.py +0 -0
  341. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/tools/learning_tools.py +0 -0
  342. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/tools/lsp_tools.py +0 -0
  343. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/tools/maintenance_tools.py +0 -0
  344. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/tools/navigation_tools.py +0 -0
  345. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/tools/overlay_tools.py +0 -0
  346. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/tools/pin_store.py +0 -0
  347. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/tools/pin_tools.py +0 -0
  348. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/tools/query_constraints_tools.py +0 -0
  349. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/tools/query_history_tools.py +0 -0
  350. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/tools/readiness_tools.py +0 -0
  351. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/tools/rule_tools.py +0 -0
  352. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/tools/search_tools.py +0 -0
  353. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/tools/snapshot_tools.py +0 -0
  354. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/workers/__init__.py +0 -0
  355. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/workers/job_utils.py +0 -0
  356. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/workers/run.py +0 -0
  357. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/src/attocode_intel/workers/settings.py +0 -0
  358. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/fixtures/rule_violations/.attocode/rules/team-preferences.yaml +0 -0
  359. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/fixtures/rule_violations/go/bad_patterns.go +0 -0
  360. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/fixtures/rule_violations/java/BadPatterns.java +0 -0
  361. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/fixtures/rule_violations/python/bad_patterns.py +0 -0
  362. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/fixtures/rule_violations/rust/bad_patterns.rs +0 -0
  363. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/fixtures/rule_violations/typescript/bad_patterns.ts +0 -0
  364. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/fixtures/sample_project/.attocode/.gitignore +0 -0
  365. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/fixtures/sample_project/__init__.py +0 -0
  366. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/fixtures/sample_project/main.py +0 -0
  367. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/fixtures/sample_project/models.py +0 -0
  368. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/fixtures/sample_project/utils.py +0 -0
  369. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/integration/__init__.py +0 -0
  370. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/integration/code_intel/__init__.py +0 -0
  371. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/integration/code_intel/conftest.py +0 -0
  372. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/integration/code_intel/test_http_smoke.py +0 -0
  373. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/integration/code_intel/test_mcp_tools_audit.py +0 -0
  374. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/integration/code_intel/test_remote_mcp_http_integration.py +0 -0
  375. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/integration/code_intel/test_service_integration.py +0 -0
  376. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/integration/test_rule_bench_floor_e2e.py +0 -0
  377. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_ast_snapshot.py +0 -0
  378. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_behavioral_negation.py +0 -0
  379. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_capacity_experiment.py +0 -0
  380. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_change_focus.py +0 -0
  381. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_change_investigation.py +0 -0
  382. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_chunk_identity.py +0 -0
  383. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_codex_repair_study.py +0 -0
  384. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_cold_discovery.py +0 -0
  385. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_cold_index_cost.py +0 -0
  386. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_compact_inspection.py +0 -0
  387. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_corpus_capture.py +0 -0
  388. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_daily_workflows.py +0 -0
  389. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_db_navigation_http.py +0 -0
  390. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_discovery_ceiling.py +0 -0
  391. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_discovery_reuse.py +0 -0
  392. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_doctor.py +0 -0
  393. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_doctor_runtime.py +0 -0
  394. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_edit_restart.py +0 -0
  395. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_experiment_dispatch.py +0 -0
  396. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_experiment_evidence.py +0 -0
  397. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_experiment_readiness.py +0 -0
  398. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_external_study.py +0 -0
  399. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_fallback_lexical.py +0 -0
  400. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_file_symbol_scope.py +0 -0
  401. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_fixture_source_alias.py +0 -0
  402. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_focused_inspection.py +0 -0
  403. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_image_budget.py +0 -0
  404. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_importance_publication.py +0 -0
  405. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_index_probe.py +0 -0
  406. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_index_processes.py +0 -0
  407. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_index_reuse.py +0 -0
  408. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_index_sequences.py +0 -0
  409. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_kotlin_test_paths.py +0 -0
  410. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_language_capabilities.py +0 -0
  411. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_lean_profile.py +0 -0
  412. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_lexical_sql_cost.py +0 -0
  413. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_local_reranker.py +0 -0
  414. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_local_workflow_evidence.py +0 -0
  415. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_localize_study.py +0 -0
  416. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_lsp_diagnostics.py +0 -0
  417. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_lsp_document_lifecycle.py +0 -0
  418. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_lsp_stderr_lifecycle.py +0 -0
  419. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_mcp_search_evaluation.py +0 -0
  420. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_mixed_workspace.py +0 -0
  421. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_module_ownership.py +0 -0
  422. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_native_capture.py +0 -0
  423. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_native_experiment.py +0 -0
  424. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_navigation_evidence.py +0 -0
  425. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_navigation_prefix_trial.py +0 -0
  426. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_ocaml_parser_routing.py +0 -0
  427. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_onboarding_study.py +0 -0
  428. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_operation_contracts.py +0 -0
  429. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_optional_grammar_admission.py +0 -0
  430. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_optional_language_depth.py +0 -0
  431. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_parse_recovery.py +0 -0
  432. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_parser_thread_isolation.py +0 -0
  433. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_pilot.py +0 -0
  434. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_precision_protocol.py +0 -0
  435. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_preview_admission.py +0 -0
  436. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_preview_experiment.py +0 -0
  437. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_preview_sources.py +0 -0
  438. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_preview_windows.py +0 -0
  439. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_product.py +0 -0
  440. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_quality_cloud.py +0 -0
  441. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_quality_evaluation.py +0 -0
  442. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_quality_evidence.py +0 -0
  443. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_quality_lifecycle.py +0 -0
  444. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_quality_runner.py +0 -0
  445. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_query_ranking.py +0 -0
  446. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_query_requirements.py +0 -0
  447. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_ranking_intent.py +0 -0
  448. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_recovery_readiness.py +0 -0
  449. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_release_verification.py +0 -0
  450. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_remote.py +0 -0
  451. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_repair_study.py +0 -0
  452. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_restart_experiment.py +0 -0
  453. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_retrieval_ablation.py +0 -0
  454. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_retrieval_audit.py +0 -0
  455. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_retrieval_body_trial.py +0 -0
  456. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_retrieval_cycle.py +0 -0
  457. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_search_budget_repair.py +0 -0
  458. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_search_coverage.py +0 -0
  459. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_search_coverage_scale.py +0 -0
  460. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_search_evidence.py +0 -0
  461. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_search_evidence_audit.py +0 -0
  462. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_search_usefulness.py +0 -0
  463. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_snippet_budget.py +0 -0
  464. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_source_exclusions.py +0 -0
  465. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_structural_evidence.py +0 -0
  466. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_structural_write_cost.py +0 -0
  467. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_study.py +0 -0
  468. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_symbol_order.py +0 -0
  469. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_systemone_ranker.py +0 -0
  470. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_test_intent_trial.py +0 -0
  471. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_token_overhead.py +0 -0
  472. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_trigram_workspace.py +0 -0
  473. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_understanding_evaluation.py +0 -0
  474. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_walk_order.py +0 -0
  475. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_warm_cache.py +0 -0
  476. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/test_workflow_sequences.py +0 -0
  477. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/__init__.py +0 -0
  478. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/__init__.py +0 -0
  479. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/conftest.py +0 -0
  480. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_advisory_lock.py +0 -0
  481. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_api.py +0 -0
  482. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_api_phase3a.py +0 -0
  483. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_api_v2.py +0 -0
  484. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_auth.py +0 -0
  485. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_branch_versioning.py +0 -0
  486. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_bug_finder.py +0 -0
  487. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_call_graph_tool.py +0 -0
  488. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_ci_runner.py +0 -0
  489. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_cli_lifecycle.py +0 -0
  490. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_cli_maintenance_local.py +0 -0
  491. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_cli_ops.py +0 -0
  492. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_cli_query_commands.py +0 -0
  493. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_cli_remote.py +0 -0
  494. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_codex_rereview_polish.py +0 -0
  495. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_combinators.py +0 -0
  496. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_confidence.py +0 -0
  497. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_confidence_adoption.py +0 -0
  498. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_config.py +0 -0
  499. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_config_remote.py +0 -0
  500. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_cross_mode.py +0 -0
  501. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_db_security_scan.py +0 -0
  502. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_deps.py +0 -0
  503. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_diff_engine.py +0 -0
  504. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_edge_cases.py +0 -0
  505. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_frecency.py +0 -0
  506. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_fuzzy.py +0 -0
  507. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_index_store_migration.py +0 -0
  508. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_kw_index_status.py +0 -0
  509. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_lsp_call_graph.py +0 -0
  510. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_lsp_enrichment.py +0 -0
  511. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_lsp_extended_models.py +0 -0
  512. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_marketplace.py +0 -0
  513. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_metavar.py +0 -0
  514. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_middleware.py +0 -0
  515. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_notify_enhanced.py +0 -0
  516. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_org_isolation.py +0 -0
  517. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_pack_autoload.py +0 -0
  518. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_profiling.py +0 -0
  519. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_project_discovery.py +0 -0
  520. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_provenance_store.py +0 -0
  521. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_pubsub_streams.py +0 -0
  522. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_query_constraints.py +0 -0
  523. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_query_history.py +0 -0
  524. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_readiness.py +0 -0
  525. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_reindex_embeddings.py +0 -0
  526. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_remote_local_fallback.py +0 -0
  527. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_remote_provider.py +0 -0
  528. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_remote_reliability.py +0 -0
  529. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_repo_ranker.py +0 -0
  530. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_rule_evolution.py +0 -0
  531. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_rule_hygiene.py +0 -0
  532. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_rule_synthesis.py +0 -0
  533. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_rule_tools.py +0 -0
  534. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_rule_violations.py +0 -0
  535. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_rules_engine.py +0 -0
  536. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_rules_integration.py +0 -0
  537. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_sarif.py +0 -0
  538. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_search_tools.py +0 -0
  539. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_server_startup.py +0 -0
  540. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_service.py +0 -0
  541. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_service_mode.py +0 -0
  542. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_status_health.py +0 -0
  543. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_structural_executor.py +0 -0
  544. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_supply_chain_rules.py +0 -0
  545. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_testing_framework.py +0 -0
  546. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/test_webhook_encryption.py +0 -0
  547. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/tools/__init__.py +0 -0
  548. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/tools/conftest.py +0 -0
  549. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/tools/test_adr_tools.py +0 -0
  550. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/tools/test_analysis_tools.py +0 -0
  551. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/tools/test_dead_code_tools.py +0 -0
  552. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/tools/test_distill_tools.py +0 -0
  553. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/tools/test_history_tools.py +0 -0
  554. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/tools/test_learning_tools.py +0 -0
  555. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/tools/test_lsp_tools.py +0 -0
  556. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/tools/test_maintenance_tools_phase2.py +0 -0
  557. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/tools/test_navigation_tools.py +0 -0
  558. {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
  559. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/tools/test_readiness_tools.py +0 -0
  560. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/tools/test_search_status_mismatch.py +0 -0
  561. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/tools/test_search_tools.py +0 -0
  562. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/code_intel/tools/test_server_tools.py +0 -0
  563. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/context/__init__.py +0 -0
  564. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/context/test_action_hash.py +0 -0
  565. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/context/test_ast_service_adapter.py +0 -0
  566. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/context/test_blob_oid.py +0 -0
  567. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/context/test_cache_manifest.py +0 -0
  568. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/context/test_cas.py +0 -0
  569. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/context/test_embedding_rotation.py +0 -0
  570. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/context/test_pagerank_restoration.py +0 -0
  571. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/context/test_provenance.py +0 -0
  572. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/context/test_retrieval_pin.py +0 -0
  573. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/context/test_vector_store_dim_safety.py +0 -0
  574. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/__init__.py +0 -0
  575. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/conftest.py +0 -0
  576. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_acc_at_k.py +0 -0
  577. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_broad_candidate_audit.py +0 -0
  578. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_calibration_demo.py +0 -0
  579. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_harness.py +0 -0
  580. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_matrix_agents.py +0 -0
  581. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_matrix_ci.py +0 -0
  582. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_matrix_datasets.py +0 -0
  583. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_matrix_dense.py +0 -0
  584. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_matrix_function_bm25.py +0 -0
  585. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_matrix_function_dense.py +0 -0
  586. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_matrix_rerank.py +0 -0
  587. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_matrix_retrieve.py +0 -0
  588. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_matrix_run.py +0 -0
  589. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_matrix_stats.py +0 -0
  590. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_mcp_bench.py +0 -0
  591. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_rule_accuracy.py +0 -0
  592. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_rule_bench_config.py +0 -0
  593. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_rule_bench_corpus.py +0 -0
  594. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_rule_bench_evaluator.py +0 -0
  595. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_rule_bench_predicate.py +0 -0
  596. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_rule_bench_scoring.py +0 -0
  597. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_rule_bench_template_engine.py +0 -0
  598. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_rule_harness_import.py +0 -0
  599. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_search_quality_reporting.py +0 -0
  600. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_search_readiness.py +0 -0
  601. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/eval/test_seed_attocode_fixtures.py +0 -0
  602. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/__init__.py +0 -0
  603. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/context/__init__.py +0 -0
  604. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/context/test_architecture_drift.py +0 -0
  605. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/context/test_ast_service_hydration.py +0 -0
  606. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/context/test_body_chunking.py +0 -0
  607. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/context/test_call_graph.py +0 -0
  608. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/context/test_code_analyzer.py +0 -0
  609. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/context/test_codebase_ast.py +0 -0
  610. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/context/test_codebase_context.py +0 -0
  611. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/context/test_context_stores_closed.py +0 -0
  612. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/context/test_cross_ref_search.py +0 -0
  613. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/context/test_embedder_default.py +0 -0
  614. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/context/test_embeddings_query.py +0 -0
  615. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/context/test_go_symbols.py +0 -0
  616. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/context/test_hydration.py +0 -0
  617. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/context/test_index_store.py +0 -0
  618. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/context/test_model_mismatch.py +0 -0
  619. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/context/test_path_downweight.py +0 -0
  620. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/context/test_query_routing.py +0 -0
  621. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/context/test_semantic_search.py +0 -0
  622. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/context/test_supported_languages.py +0 -0
  623. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/context/test_temporal_coupling.py +0 -0
  624. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/context/test_trigram_index.py +0 -0
  625. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/context/test_trigram_regex.py +0 -0
  626. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/context/test_ts_parser.py +0 -0
  627. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/test_dataflow.py +0 -0
  628. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/test_feature_flags.py +0 -0
  629. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/test_new_security_rules.py +0 -0
  630. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/test_security_autofix.py +0 -0
  631. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/test_security_matcher.py +0 -0
  632. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/test_streaming_lsp.py +0 -0
  633. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/utilities/__init__.py +0 -0
  634. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/utilities/test_ignore.py +0 -0
  635. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/integrations/utilities/test_token_estimate.py +0 -0
  636. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/test_code_intel.py +0 -0
  637. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/test_code_intel_hydration.py +0 -0
  638. {attocode_code_intel-0.1.24 → attocode_code_intel-0.1.26}/tests/unit/test_errors.py +0 -0
  639. {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.24
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.
@@ -6,7 +6,7 @@ build-backend = "hatchling.build"
6
6
 
7
7
  [project]
8
8
  name = "attocode-code-intel"
9
- version = "0.1.24"
9
+ version = "0.1.26"
10
10
  description = "Local code search and navigation for coding agents and people"
11
11
  readme = "README.md"
12
12
  requires-python = ">=3.12"
@@ -49,4 +49,4 @@ def __getattr__(name: str) -> Any:
49
49
  raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
50
50
 
51
51
  # The other copy is packages/code-intel/pyproject.toml. A test checks that both match.
52
- __version__ = "0.1.24"
52
+ __version__ = "0.1.26"
@@ -1,10 +1,13 @@
1
1
  """Embedding provider abstraction for semantic search.
2
2
 
3
- Tries providers in order:
4
- 1. Local: sentence-transformers with code-optimized model (no API cost)
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. API: OpenAI text-embedding-3-small (if OPENAI_API_KEY set)
7
- 4. None: graceful degradation (returns empty vectors)
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 (code-optimized) > MiniLM > OpenAI API > null.
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, trying OpenAI")
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, trying OpenAI")
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
- parsed = urlsplit(endpoint)
50
- try:
51
- host = parsed.hostname
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
- # Do not inherit proxy settings or follow a redirect to a different
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 not result or not isinstance(result, list):
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 == "textDocument/publishDiagnostics" and self._on_diagnostics:
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 specific language server."""
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
- await client.stop()
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
- deadline = asyncio.get_running_loop().time() + 2.0
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._timeout = 2
72
- await manager.start_server(server_id, Path(self.service.project_dir).as_uri())
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
- if references or (resolved is not None and not candidates):
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 two-second deadline or loop forever.
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
- outcomes.append({"language": language, "status": "verified" if references or not candidates else "no_references",
159
- "symbol": definition.qualified_name, "references": len(references)})
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 2s deadline.
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 and os.path.isabs(remote_workspace) and
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:]
@@ -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