attocode-code-intel 0.1.23__tar.gz → 0.1.25__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (638) hide show
  1. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/PKG-INFO +5 -1
  2. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/README.md +4 -0
  3. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/pyproject.toml +1 -1
  4. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/__init__.py +1 -1
  5. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/embeddings.py +18 -21
  6. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/systemone_ranker.py +83 -54
  7. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/lsp/client.py +39 -6
  8. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/embeddings.py +2 -2
  9. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/precision.py +19 -5
  10. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/service.py +24 -7
  11. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/workers/jobs.py +1 -1
  12. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_mcp_search_evaluation.py +209 -1
  13. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_precision_recovery.py +124 -0
  14. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_real_language_server.py +2 -2
  15. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_systemone_ranker.py +28 -0
  16. attocode_code_intel-0.1.25/tests/unit/eval/test_matrix_embed_screen.py +199 -0
  17. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/integrations/context/test_embeddings.py +59 -0
  18. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/.gitignore +0 -0
  19. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/LICENSE +0 -0
  20. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/GUIDELINES.md +0 -0
  21. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/__init__.py +0 -0
  22. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/errors/__init__.py +0 -0
  23. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/__init__.py +0 -0
  24. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/__init__.py +0 -0
  25. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/architecture_drift.py +0 -0
  26. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/ast_chunker.py +0 -0
  27. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/ast_service.py +0 -0
  28. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/ast_snapshot.py +0 -0
  29. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/blob_oid.py +0 -0
  30. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/cache_manifest.py +0 -0
  31. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/cas.py +0 -0
  32. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/code_analyzer.py +0 -0
  33. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/codebase_ast.py +0 -0
  34. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/codebase_context.py +0 -0
  35. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/cross_mode.py +0 -0
  36. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/cross_references.py +0 -0
  37. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/discovery_snapshot.py +0 -0
  38. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/embedding_rotation.py +0 -0
  39. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/frecency.py +0 -0
  40. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/fuzzy.py +0 -0
  41. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/hierarchical_explorer.py +0 -0
  42. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/hydration.py +0 -0
  43. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/index_probe.py +0 -0
  44. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/index_repair.py +0 -0
  45. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/index_store.py +0 -0
  46. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/language_registry.py +0 -0
  47. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/memory_store.py +0 -0
  48. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/module_resolution.py +0 -0
  49. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/parse_diagnostics.py +0 -0
  50. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/query_constraints.py +0 -0
  51. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/query_history.py +0 -0
  52. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/reranker.py +0 -0
  53. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/semantic_search.py +0 -0
  54. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/syntax_evidence.py +0 -0
  55. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/temporal_coupling.py +0 -0
  56. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/trigram_index.py +0 -0
  57. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/trigram_regex.py +0 -0
  58. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/ts_parser.py +0 -0
  59. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/context/vector_store.py +0 -0
  60. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/feature_flags/__init__.py +0 -0
  61. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/lsp/__init__.py +0 -0
  62. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/mcp/__init__.py +0 -0
  63. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/mcp/client.py +0 -0
  64. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/security/__init__.py +0 -0
  65. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/security/custom_rules.py +0 -0
  66. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/security/dataflow.py +0 -0
  67. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/security/dependency_audit.py +0 -0
  68. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/security/matcher.py +0 -0
  69. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/security/patterns.py +0 -0
  70. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/security/scanner.py +0 -0
  71. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/utilities/__init__.py +0 -0
  72. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/utilities/ignore.py +0 -0
  73. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/integrations/utilities/token_estimate.py +0 -0
  74. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/types/__init__.py +0 -0
  75. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/types/events.py +0 -0
  76. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_internal/types/severity.py +0 -0
  77. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/_shared.py +0 -0
  78. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/analysis_coverage.py +0 -0
  79. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/__init__.py +0 -0
  80. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/access.py +0 -0
  81. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/app.py +0 -0
  82. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/auth/__init__.py +0 -0
  83. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/auth/api_keys.py +0 -0
  84. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/auth/context.py +0 -0
  85. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/auth/jwt.py +0 -0
  86. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/auth/oauth.py +0 -0
  87. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/auth/passwords.py +0 -0
  88. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/deps.py +0 -0
  89. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/knowledge_bridge.py +0 -0
  90. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/mcp_transport.py +0 -0
  91. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/middleware.py +0 -0
  92. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/models.py +0 -0
  93. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/providers/__init__.py +0 -0
  94. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/providers/db_provider.py +0 -0
  95. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/providers/local_provider.py +0 -0
  96. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/providers/remote_provider.py +0 -0
  97. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/repository_source.py +0 -0
  98. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/__init__.py +0 -0
  99. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/_pin_helper.py +0 -0
  100. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/activity.py +0 -0
  101. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/adr.py +0 -0
  102. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/analysis.py +0 -0
  103. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/api_keys.py +0 -0
  104. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/auth.py +0 -0
  105. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/branches.py +0 -0
  106. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/cross_repo_search.py +0 -0
  107. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/files.py +0 -0
  108. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/files_v2.py +0 -0
  109. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/gc.py +0 -0
  110. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/git_v2.py +0 -0
  111. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/graph.py +0 -0
  112. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/graph_viz.py +0 -0
  113. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/health.py +0 -0
  114. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/history.py +0 -0
  115. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/jobs.py +0 -0
  116. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/learning.py +0 -0
  117. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/lsp.py +0 -0
  118. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/notify.py +0 -0
  119. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/operations.py +0 -0
  120. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/orgs.py +0 -0
  121. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/preferences.py +0 -0
  122. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/presence.py +0 -0
  123. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/projects.py +0 -0
  124. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/repos.py +0 -0
  125. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/search.py +0 -0
  126. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/snapshots.py +0 -0
  127. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/webhooks.py +0 -0
  128. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/routes/websocket.py +0 -0
  129. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/static/graph.html +0 -0
  130. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/api/utils.py +0 -0
  131. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/artifacts/__init__.py +0 -0
  132. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/artifacts/hashing.py +0 -0
  133. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/artifacts/provenance.py +0 -0
  134. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/artifacts/retrieval_pin.py +0 -0
  135. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/audit.py +0 -0
  136. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/bug_finder.py +0 -0
  137. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/bundle.py +0 -0
  138. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/catalog.py +0 -0
  139. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/change_evidence.py +0 -0
  140. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/change_investigation.py +0 -0
  141. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/change_review.py +0 -0
  142. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/cli.py +0 -0
  143. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/community.py +0 -0
  144. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/confidence/__init__.py +0 -0
  145. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/confidence/jev.py +0 -0
  146. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/confidence/llm.py +0 -0
  147. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/confidence/redact.py +0 -0
  148. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/confidence/settings.py +0 -0
  149. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/config.py +0 -0
  150. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/crypto.py +0 -0
  151. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/db/__init__.py +0 -0
  152. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/db/base.py +0 -0
  153. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/db/engine.py +0 -0
  154. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/db/models.py +0 -0
  155. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/entrypoint.py +0 -0
  156. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/focused_evidence.py +0 -0
  157. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/freshness.py +0 -0
  158. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/gateway.py +0 -0
  159. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/git/__init__.py +0 -0
  160. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/git/credentials.py +0 -0
  161. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/git/manager.py +0 -0
  162. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/git/models.py +0 -0
  163. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/git/storage.py +0 -0
  164. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/graph_query_parser.py +0 -0
  165. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/helpers.py +0 -0
  166. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/indexing/__init__.py +0 -0
  167. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/indexing/debouncer.py +0 -0
  168. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/indexing/delta_indexer.py +0 -0
  169. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/indexing/full_indexer.py +0 -0
  170. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/indexing/incremental.py +0 -0
  171. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/indexing/parser.py +0 -0
  172. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/indexing/summarizer.py +0 -0
  173. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/installer.py +0 -0
  174. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/investigation_cli.py +0 -0
  175. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/knowledge.py +0 -0
  176. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/local_knowledge.py +0 -0
  177. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/migrations/alembic.ini +0 -0
  178. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/migrations/env.py +0 -0
  179. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/migrations/script.py.mako +0 -0
  180. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/migrations/versions/001_initial_schema.py +0 -0
  181. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/migrations/versions/002_branch_version_and_embeddings.py +0 -0
  182. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/migrations/versions/003_embedding_uniqueness_and_cascade.py +0 -0
  183. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/migrations/versions/004_audit_events.py +0 -0
  184. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/migrations/versions/005_user_preferences.py +0 -0
  185. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/migrations/versions/006_google_oauth.py +0 -0
  186. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/migrations/versions/007_pgvector_embeddings.py +0 -0
  187. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/migrations/versions/008_symbol_references.py +0 -0
  188. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/migrations/versions/009_webhook_secret_encryption.py +0 -0
  189. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/migrations/versions/010_add_commits_table.py +0 -0
  190. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/migrations/versions/011_commit_changed_files.py +0 -0
  191. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/migrations/versions/012_branch_merged_at.py +0 -0
  192. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/migrations/versions/013_revoked_tokens.py +0 -0
  193. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/migrations/versions/014_blame_hunks.py +0 -0
  194. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/migrations/versions/015_commit_file_stats.py +0 -0
  195. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/migrations/versions/016_embedding_provenance_columns.py +0 -0
  196. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/migrations/versions/017_provenance_table.py +0 -0
  197. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/migrations/versions/018_repo_snapshots.py +0 -0
  198. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/migrations/versions/019_symref_caller.py +0 -0
  199. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/migrations/versions/020_shared_knowledge.py +0 -0
  200. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/onboarding.py +0 -0
  201. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/output.py +0 -0
  202. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/presence.py +0 -0
  203. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/probe.py +0 -0
  204. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/project_dir.py +0 -0
  205. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/pubsub.py +0 -0
  206. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/query_ranking.py +0 -0
  207. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/readiness.py +0 -0
  208. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/redis.py +0 -0
  209. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/reference_pages.py +0 -0
  210. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/remote.py +0 -0
  211. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/repo_ranker.py +0 -0
  212. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/request_context.py +0 -0
  213. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/__init__.py +0 -0
  214. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/ci.py +0 -0
  215. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/combinators.py +0 -0
  216. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/enricher.py +0 -0
  217. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/evolution.py +0 -0
  218. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/executor.py +0 -0
  219. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/filters/__init__.py +0 -0
  220. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/filters/pipeline.py +0 -0
  221. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/formatter.py +0 -0
  222. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/hygiene.py +0 -0
  223. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/importers/__init__.py +0 -0
  224. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/importers/semgrep.py +0 -0
  225. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/loader.py +0 -0
  226. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/marketplace.py +0 -0
  227. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/metavar.py +0 -0
  228. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/model.py +0 -0
  229. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/__init__.py +0 -0
  230. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/_license_templates/Apache-2.0.txt +0 -0
  231. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/_license_templates/MIT.txt +0 -0
  232. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/bandit-python/LICENSE +0 -0
  233. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/bandit-python/NOTICE +0 -0
  234. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/bandit-python/PORTING.md +0 -0
  235. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/bandit-python/manifest.yaml +0 -0
  236. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/bandit-python/rules/B105-hardcoded-password.yaml +0 -0
  237. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/bandit-python/rules/B303-weak-md5.yaml +0 -0
  238. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/bandit-python/rules/B304-weak-des.yaml +0 -0
  239. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/bandit-python/rules/B307-use-of-eval.yaml +0 -0
  240. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/bandit-python/rules/B324-weak-sha1.yaml +0 -0
  241. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/bandit-python/rules/B501-no-cert-validation.yaml +0 -0
  242. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/bandit-python/rules/B602-shell-true.yaml +0 -0
  243. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/bandit-python/rules/B608-sqli.yaml +0 -0
  244. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/eslint-typescript/LICENSE +0 -0
  245. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/eslint-typescript/NOTICE +0 -0
  246. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/eslint-typescript/PORTING.md +0 -0
  247. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/eslint-typescript/manifest.yaml +0 -0
  248. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/eslint-typescript/rules/eqeqeq.yaml +0 -0
  249. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/eslint-typescript/rules/no-eval.yaml +0 -0
  250. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/eslint-typescript/rules/no-implied-eval.yaml +0 -0
  251. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/eslint-typescript/rules/no-new-func.yaml +0 -0
  252. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/eslint-typescript/rules/no-throw-literal.yaml +0 -0
  253. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/eslint-typescript/rules/no-var.yaml +0 -0
  254. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/eslint-typescript/rules/no-with.yaml +0 -0
  255. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/gosec-go/LICENSE +0 -0
  256. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/gosec-go/NOTICE +0 -0
  257. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/gosec-go/PORTING.md +0 -0
  258. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/gosec-go/manifest.yaml +0 -0
  259. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/gosec-go/rules/G101-hardcoded-credentials.yaml +0 -0
  260. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/gosec-go/rules/G102-bind-all-interfaces.yaml +0 -0
  261. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/gosec-go/rules/G103-unsafe-block.yaml +0 -0
  262. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/gosec-go/rules/G201-sql-format.yaml +0 -0
  263. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/gosec-go/rules/G304-file-inclusion.yaml +0 -0
  264. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/gosec-go/rules/G401-weak-cipher.yaml +0 -0
  265. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/gosec-go/rules/G402-tls-min-version.yaml +0 -0
  266. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/community/gosec-go/rules/G501-md5-import.yaml +0 -0
  267. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/cpp/manifest.yaml +0 -0
  268. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/cpp/rules/security.yaml +0 -0
  269. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/cpp/rules/structural.yaml +0 -0
  270. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/csharp/manifest.yaml +0 -0
  271. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/csharp/rules/security.yaml +0 -0
  272. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/csharp/rules/structural.yaml +0 -0
  273. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/go/manifest.yaml +0 -0
  274. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/go/rules/performance.yaml +0 -0
  275. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/go/rules/security.yaml +0 -0
  276. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/go/rules/structural.yaml +0 -0
  277. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/go/taint/sanitizers.yaml +0 -0
  278. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/go/taint/sinks.yaml +0 -0
  279. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/go/taint/sources.yaml +0 -0
  280. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/java/manifest.yaml +0 -0
  281. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/java/rules/correctness.yaml +0 -0
  282. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/java/rules/structural.yaml +0 -0
  283. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/java/taint/sinks.yaml +0 -0
  284. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/java/taint/sources.yaml +0 -0
  285. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/kotlin/manifest.yaml +0 -0
  286. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/kotlin/rules/correctness.yaml +0 -0
  287. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/kotlin/rules/structural.yaml +0 -0
  288. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/php/manifest.yaml +0 -0
  289. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/php/rules/security.yaml +0 -0
  290. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/php/rules/structural.yaml +0 -0
  291. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/python/manifest.yaml +0 -0
  292. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/python/rules/performance.yaml +0 -0
  293. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/python/rules/structural.yaml +0 -0
  294. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/ruby/manifest.yaml +0 -0
  295. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/ruby/rules/security.yaml +0 -0
  296. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/ruby/rules/structural.yaml +0 -0
  297. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/rust/manifest.yaml +0 -0
  298. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/rust/rules/correctness.yaml +0 -0
  299. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/rust/rules/structural.yaml +0 -0
  300. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/typescript/manifest.yaml +0 -0
  301. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/typescript/rules/performance.yaml +0 -0
  302. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/examples/typescript/rules/structural.yaml +0 -0
  303. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/packs/pack_loader.py +0 -0
  304. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/plugins/__init__.py +0 -0
  305. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/plugins/plugin_loader.py +0 -0
  306. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/profiling.py +0 -0
  307. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/registry.py +0 -0
  308. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/sarif.py +0 -0
  309. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/synthesis.py +0 -0
  310. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/rules/testing.py +0 -0
  311. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/search_evidence.py +0 -0
  312. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/server.py +0 -0
  313. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/sharing.py +0 -0
  314. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/storage/__init__.py +0 -0
  315. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/storage/branch_overlay.py +0 -0
  316. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/storage/content_store.py +0 -0
  317. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/storage/dependency_store.py +0 -0
  318. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/storage/diff_engine.py +0 -0
  319. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/storage/embedding_store.py +0 -0
  320. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/storage/provenance_store.py +0 -0
  321. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/storage/security_scanner_db.py +0 -0
  322. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/storage/symbol_store.py +0 -0
  323. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/structural_evidence.py +0 -0
  324. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/symbol_inspection.py +0 -0
  325. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/symbol_links.py +0 -0
  326. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/telemetry.py +0 -0
  327. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/test_ranking.py +0 -0
  328. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/testing/__init__.py +0 -0
  329. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/testing/fixtures.py +0 -0
  330. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/testing/helpers.py +0 -0
  331. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/testing/mocks.py +0 -0
  332. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/tools/__init__.py +0 -0
  333. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/tools/adr_tools.py +0 -0
  334. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/tools/analysis_tools.py +0 -0
  335. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/tools/composite_tools.py +0 -0
  336. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/tools/cross_mode_tools.py +0 -0
  337. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/tools/dead_code_tools.py +0 -0
  338. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/tools/distill_tools.py +0 -0
  339. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/tools/frecency_tools.py +0 -0
  340. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/tools/fuzzy_tools.py +0 -0
  341. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/tools/history_tools.py +0 -0
  342. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/tools/learning_tools.py +0 -0
  343. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/tools/lsp_tools.py +0 -0
  344. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/tools/maintenance_tools.py +0 -0
  345. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/tools/navigation_tools.py +0 -0
  346. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/tools/overlay_tools.py +0 -0
  347. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/tools/pin_store.py +0 -0
  348. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/tools/pin_tools.py +0 -0
  349. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/tools/query_constraints_tools.py +0 -0
  350. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/tools/query_history_tools.py +0 -0
  351. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/tools/readiness_tools.py +0 -0
  352. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/tools/rule_tools.py +0 -0
  353. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/tools/search_tools.py +0 -0
  354. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/tools/snapshot_tools.py +0 -0
  355. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/workers/__init__.py +0 -0
  356. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/workers/job_utils.py +0 -0
  357. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/workers/run.py +0 -0
  358. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/src/attocode_intel/workers/settings.py +0 -0
  359. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/fixtures/rule_violations/.attocode/rules/team-preferences.yaml +0 -0
  360. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/fixtures/rule_violations/go/bad_patterns.go +0 -0
  361. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/fixtures/rule_violations/java/BadPatterns.java +0 -0
  362. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/fixtures/rule_violations/python/bad_patterns.py +0 -0
  363. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/fixtures/rule_violations/rust/bad_patterns.rs +0 -0
  364. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/fixtures/rule_violations/typescript/bad_patterns.ts +0 -0
  365. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/fixtures/sample_project/.attocode/.gitignore +0 -0
  366. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/fixtures/sample_project/__init__.py +0 -0
  367. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/fixtures/sample_project/main.py +0 -0
  368. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/fixtures/sample_project/models.py +0 -0
  369. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/fixtures/sample_project/utils.py +0 -0
  370. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/integration/__init__.py +0 -0
  371. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/integration/code_intel/__init__.py +0 -0
  372. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/integration/code_intel/conftest.py +0 -0
  373. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/integration/code_intel/test_http_smoke.py +0 -0
  374. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/integration/code_intel/test_mcp_tools_audit.py +0 -0
  375. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/integration/code_intel/test_remote_mcp_http_integration.py +0 -0
  376. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/integration/code_intel/test_service_integration.py +0 -0
  377. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/integration/test_rule_bench_floor_e2e.py +0 -0
  378. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_ast_snapshot.py +0 -0
  379. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_behavioral_negation.py +0 -0
  380. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_capacity_experiment.py +0 -0
  381. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_change_focus.py +0 -0
  382. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_change_investigation.py +0 -0
  383. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_chunk_identity.py +0 -0
  384. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_codex_repair_study.py +0 -0
  385. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_cold_discovery.py +0 -0
  386. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_cold_index_cost.py +0 -0
  387. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_compact_inspection.py +0 -0
  388. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_corpus_capture.py +0 -0
  389. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_daily_workflows.py +0 -0
  390. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_db_navigation_http.py +0 -0
  391. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_discovery_ceiling.py +0 -0
  392. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_discovery_reuse.py +0 -0
  393. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_doctor.py +0 -0
  394. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_doctor_runtime.py +0 -0
  395. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_edit_restart.py +0 -0
  396. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_experiment_dispatch.py +0 -0
  397. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_experiment_evidence.py +0 -0
  398. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_experiment_readiness.py +0 -0
  399. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_external_study.py +0 -0
  400. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_fallback_lexical.py +0 -0
  401. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_file_symbol_scope.py +0 -0
  402. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_fixture_source_alias.py +0 -0
  403. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_focused_inspection.py +0 -0
  404. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_image_budget.py +0 -0
  405. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_importance_publication.py +0 -0
  406. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_index_probe.py +0 -0
  407. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_index_processes.py +0 -0
  408. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_index_reuse.py +0 -0
  409. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_index_sequences.py +0 -0
  410. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_kotlin_test_paths.py +0 -0
  411. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_language_capabilities.py +0 -0
  412. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_lean_profile.py +0 -0
  413. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_lexical_sql_cost.py +0 -0
  414. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_local_reranker.py +0 -0
  415. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_local_workflow_evidence.py +0 -0
  416. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_localize_study.py +0 -0
  417. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_lsp_diagnostics.py +0 -0
  418. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_lsp_document_lifecycle.py +0 -0
  419. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_lsp_stderr_lifecycle.py +0 -0
  420. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_mixed_workspace.py +0 -0
  421. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_module_ownership.py +0 -0
  422. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_native_capture.py +0 -0
  423. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_native_experiment.py +0 -0
  424. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_navigation_evidence.py +0 -0
  425. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_navigation_prefix_trial.py +0 -0
  426. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_ocaml_parser_routing.py +0 -0
  427. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_onboarding_study.py +0 -0
  428. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_operation_contracts.py +0 -0
  429. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_optional_grammar_admission.py +0 -0
  430. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_optional_language_depth.py +0 -0
  431. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_parse_recovery.py +0 -0
  432. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_parser_thread_isolation.py +0 -0
  433. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_pilot.py +0 -0
  434. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_precision_protocol.py +0 -0
  435. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_preview_admission.py +0 -0
  436. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_preview_experiment.py +0 -0
  437. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_preview_sources.py +0 -0
  438. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_preview_windows.py +0 -0
  439. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_product.py +0 -0
  440. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_quality_cloud.py +0 -0
  441. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_quality_evaluation.py +0 -0
  442. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_quality_evidence.py +0 -0
  443. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_quality_lifecycle.py +0 -0
  444. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_quality_runner.py +0 -0
  445. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_query_ranking.py +0 -0
  446. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_query_requirements.py +0 -0
  447. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_ranking_intent.py +0 -0
  448. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_recovery_readiness.py +0 -0
  449. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_release_verification.py +0 -0
  450. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_remote.py +0 -0
  451. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_repair_study.py +0 -0
  452. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_restart_experiment.py +0 -0
  453. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_retrieval_ablation.py +0 -0
  454. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_retrieval_audit.py +0 -0
  455. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_retrieval_body_trial.py +0 -0
  456. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_retrieval_cycle.py +0 -0
  457. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_search_budget_repair.py +0 -0
  458. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_search_coverage.py +0 -0
  459. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_search_coverage_scale.py +0 -0
  460. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_search_evidence.py +0 -0
  461. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_search_evidence_audit.py +0 -0
  462. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_search_usefulness.py +0 -0
  463. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_snippet_budget.py +0 -0
  464. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_source_exclusions.py +0 -0
  465. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_structural_evidence.py +0 -0
  466. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_structural_write_cost.py +0 -0
  467. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_study.py +0 -0
  468. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_symbol_order.py +0 -0
  469. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_test_intent_trial.py +0 -0
  470. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_token_overhead.py +0 -0
  471. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_trigram_workspace.py +0 -0
  472. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_understanding_evaluation.py +0 -0
  473. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_walk_order.py +0 -0
  474. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_warm_cache.py +0 -0
  475. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/test_workflow_sequences.py +0 -0
  476. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/__init__.py +0 -0
  477. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/__init__.py +0 -0
  478. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/conftest.py +0 -0
  479. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_advisory_lock.py +0 -0
  480. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_api.py +0 -0
  481. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_api_phase3a.py +0 -0
  482. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_api_v2.py +0 -0
  483. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_auth.py +0 -0
  484. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_branch_versioning.py +0 -0
  485. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_bug_finder.py +0 -0
  486. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_call_graph_tool.py +0 -0
  487. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_ci_runner.py +0 -0
  488. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_cli_lifecycle.py +0 -0
  489. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_cli_maintenance_local.py +0 -0
  490. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_cli_ops.py +0 -0
  491. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_cli_query_commands.py +0 -0
  492. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_cli_remote.py +0 -0
  493. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_codex_rereview_polish.py +0 -0
  494. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_combinators.py +0 -0
  495. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_confidence.py +0 -0
  496. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_confidence_adoption.py +0 -0
  497. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_config.py +0 -0
  498. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_config_remote.py +0 -0
  499. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_cross_mode.py +0 -0
  500. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_db_security_scan.py +0 -0
  501. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_deps.py +0 -0
  502. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_diff_engine.py +0 -0
  503. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_edge_cases.py +0 -0
  504. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_frecency.py +0 -0
  505. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_fuzzy.py +0 -0
  506. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_index_store_migration.py +0 -0
  507. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_kw_index_status.py +0 -0
  508. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_lsp_call_graph.py +0 -0
  509. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_lsp_enrichment.py +0 -0
  510. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_lsp_extended_models.py +0 -0
  511. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_marketplace.py +0 -0
  512. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_metavar.py +0 -0
  513. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_middleware.py +0 -0
  514. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_notify_enhanced.py +0 -0
  515. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_org_isolation.py +0 -0
  516. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_pack_autoload.py +0 -0
  517. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_profiling.py +0 -0
  518. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_project_discovery.py +0 -0
  519. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_provenance_store.py +0 -0
  520. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_pubsub_streams.py +0 -0
  521. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_query_constraints.py +0 -0
  522. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_query_history.py +0 -0
  523. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_readiness.py +0 -0
  524. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_reindex_embeddings.py +0 -0
  525. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_remote_local_fallback.py +0 -0
  526. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_remote_provider.py +0 -0
  527. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_remote_reliability.py +0 -0
  528. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_repo_ranker.py +0 -0
  529. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_rule_evolution.py +0 -0
  530. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_rule_hygiene.py +0 -0
  531. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_rule_synthesis.py +0 -0
  532. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_rule_tools.py +0 -0
  533. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_rule_violations.py +0 -0
  534. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_rules_engine.py +0 -0
  535. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_rules_integration.py +0 -0
  536. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_sarif.py +0 -0
  537. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_search_tools.py +0 -0
  538. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_server_startup.py +0 -0
  539. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_service.py +0 -0
  540. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_service_mode.py +0 -0
  541. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_status_health.py +0 -0
  542. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_structural_executor.py +0 -0
  543. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_supply_chain_rules.py +0 -0
  544. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_testing_framework.py +0 -0
  545. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/test_webhook_encryption.py +0 -0
  546. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/tools/__init__.py +0 -0
  547. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/tools/conftest.py +0 -0
  548. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/tools/test_adr_tools.py +0 -0
  549. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/tools/test_analysis_tools.py +0 -0
  550. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/tools/test_dead_code_tools.py +0 -0
  551. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/tools/test_distill_tools.py +0 -0
  552. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/tools/test_history_tools.py +0 -0
  553. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/tools/test_learning_tools.py +0 -0
  554. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/tools/test_lsp_tools.py +0 -0
  555. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/tools/test_maintenance_tools_phase2.py +0 -0
  556. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/tools/test_navigation_tools.py +0 -0
  557. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/tools/test_phase2c_anchors_and_overlays.py +0 -0
  558. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/tools/test_readiness_tools.py +0 -0
  559. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/tools/test_search_status_mismatch.py +0 -0
  560. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/tools/test_search_tools.py +0 -0
  561. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/code_intel/tools/test_server_tools.py +0 -0
  562. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/context/__init__.py +0 -0
  563. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/context/test_action_hash.py +0 -0
  564. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/context/test_ast_service_adapter.py +0 -0
  565. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/context/test_blob_oid.py +0 -0
  566. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/context/test_cache_manifest.py +0 -0
  567. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/context/test_cas.py +0 -0
  568. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/context/test_embedding_rotation.py +0 -0
  569. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/context/test_pagerank_restoration.py +0 -0
  570. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/context/test_provenance.py +0 -0
  571. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/context/test_retrieval_pin.py +0 -0
  572. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/context/test_vector_store_dim_safety.py +0 -0
  573. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/eval/__init__.py +0 -0
  574. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/eval/conftest.py +0 -0
  575. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/eval/test_acc_at_k.py +0 -0
  576. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/eval/test_broad_candidate_audit.py +0 -0
  577. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/eval/test_calibration_demo.py +0 -0
  578. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/eval/test_harness.py +0 -0
  579. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/eval/test_matrix_agents.py +0 -0
  580. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/eval/test_matrix_ci.py +0 -0
  581. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/eval/test_matrix_datasets.py +0 -0
  582. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/eval/test_matrix_dense.py +0 -0
  583. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/eval/test_matrix_function_bm25.py +0 -0
  584. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/eval/test_matrix_function_dense.py +0 -0
  585. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/eval/test_matrix_rerank.py +0 -0
  586. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/eval/test_matrix_retrieve.py +0 -0
  587. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/eval/test_matrix_run.py +0 -0
  588. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/eval/test_matrix_stats.py +0 -0
  589. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/eval/test_mcp_bench.py +0 -0
  590. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/eval/test_rule_accuracy.py +0 -0
  591. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/eval/test_rule_bench_config.py +0 -0
  592. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/eval/test_rule_bench_corpus.py +0 -0
  593. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/eval/test_rule_bench_evaluator.py +0 -0
  594. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/eval/test_rule_bench_predicate.py +0 -0
  595. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/eval/test_rule_bench_scoring.py +0 -0
  596. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/eval/test_rule_bench_template_engine.py +0 -0
  597. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/eval/test_rule_harness_import.py +0 -0
  598. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/eval/test_search_quality_reporting.py +0 -0
  599. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/eval/test_search_readiness.py +0 -0
  600. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/eval/test_seed_attocode_fixtures.py +0 -0
  601. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/integrations/__init__.py +0 -0
  602. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/integrations/context/__init__.py +0 -0
  603. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/integrations/context/test_architecture_drift.py +0 -0
  604. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/integrations/context/test_ast_service_hydration.py +0 -0
  605. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/integrations/context/test_body_chunking.py +0 -0
  606. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/integrations/context/test_call_graph.py +0 -0
  607. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/integrations/context/test_code_analyzer.py +0 -0
  608. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/integrations/context/test_codebase_ast.py +0 -0
  609. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/integrations/context/test_codebase_context.py +0 -0
  610. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/integrations/context/test_context_stores_closed.py +0 -0
  611. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/integrations/context/test_cross_ref_search.py +0 -0
  612. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/integrations/context/test_embedder_default.py +0 -0
  613. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/integrations/context/test_embeddings_query.py +0 -0
  614. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/integrations/context/test_go_symbols.py +0 -0
  615. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/integrations/context/test_hydration.py +0 -0
  616. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/integrations/context/test_index_store.py +0 -0
  617. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/integrations/context/test_model_mismatch.py +0 -0
  618. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/integrations/context/test_path_downweight.py +0 -0
  619. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/integrations/context/test_query_routing.py +0 -0
  620. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/integrations/context/test_semantic_search.py +0 -0
  621. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/integrations/context/test_supported_languages.py +0 -0
  622. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/integrations/context/test_temporal_coupling.py +0 -0
  623. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/integrations/context/test_trigram_index.py +0 -0
  624. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/integrations/context/test_trigram_regex.py +0 -0
  625. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/integrations/context/test_ts_parser.py +0 -0
  626. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/integrations/test_dataflow.py +0 -0
  627. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/integrations/test_feature_flags.py +0 -0
  628. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/integrations/test_new_security_rules.py +0 -0
  629. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/integrations/test_security_autofix.py +0 -0
  630. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/integrations/test_security_matcher.py +0 -0
  631. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/integrations/test_streaming_lsp.py +0 -0
  632. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/integrations/utilities/__init__.py +0 -0
  633. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/integrations/utilities/test_ignore.py +0 -0
  634. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/integrations/utilities/test_token_estimate.py +0 -0
  635. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/test_code_intel.py +0 -0
  636. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/test_code_intel_hydration.py +0 -0
  637. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/test_errors.py +0 -0
  638. {attocode_code_intel-0.1.23 → attocode_code_intel-0.1.25}/tests/unit/test_memory_store.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: attocode-code-intel
3
- Version: 0.1.23
3
+ Version: 0.1.25
4
4
  Summary: Local code search and navigation for coding agents and people
5
5
  Project-URL: Homepage, https://github.com/eren23/attocode
6
6
  Project-URL: Repository, https://github.com/eren23/attocode
@@ -156,6 +156,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.25 uses OpenAI embeddings only when you set `ATTOCODE_EMBEDDING_MODEL=openai`. Before, an `OPENAI_API_KEY` in the environment was enough to send code chunks to OpenAI at index time. Rust references are also more reliable while rust-analyzer loads.
160
+
161
+ Version 0.1.24 adds `ATTOCODE_INTEL_RANKING_PROVIDER=openrouter`, a preset for the opt-in hosted rerank. In a frozen trial with 24 short questions, the rerank found 24 of 26 labeled files in the first five results, against 20 without it; see [Hosted rerank](https://github.com/eren23/attocode/blob/main/docs/intelligence-search.md#hosted-rerank-experimental). Rerank stays off by default, because it sends source excerpts to OpenRouter.
162
+
159
163
  Version 0.1.23 is listed in the official MCP Registry and documents a `uvx` quick start. The opt-in hosted rerank now accepts the dated model ID that OpenRouter returns; see [Hosted rerank](https://github.com/eren23/attocode/blob/main/docs/intelligence-search.md#hosted-rerank-experimental). Rerank stays off by default.
160
164
 
161
165
  Version 0.1.22 adds an opt-in discovery budget of up to 100,000 files
@@ -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.25 uses OpenAI embeddings only when you set `ATTOCODE_EMBEDDING_MODEL=openai`. Before, an `OPENAI_API_KEY` in the environment was enough to send code chunks to OpenAI at index time. Rust references are also more reliable while rust-analyzer loads.
47
+
48
+ Version 0.1.24 adds `ATTOCODE_INTEL_RANKING_PROVIDER=openrouter`, a preset for the opt-in hosted rerank. In a frozen trial with 24 short questions, the rerank found 24 of 26 labeled files in the first five results, against 20 without it; see [Hosted rerank](https://github.com/eren23/attocode/blob/main/docs/intelligence-search.md#hosted-rerank-experimental). Rerank stays off by default, because it sends source excerpts to OpenRouter.
49
+
46
50
  Version 0.1.23 is listed in the official MCP Registry and documents a `uvx` quick start. The opt-in hosted rerank now accepts the dated model ID that OpenRouter returns; see [Hosted rerank](https://github.com/eren23/attocode/blob/main/docs/intelligence-search.md#hosted-rerank-experimental). Rerank stays off by default.
47
51
 
48
52
  Version 0.1.22 adds an opt-in discovery budget of up to 100,000 files
@@ -6,7 +6,7 @@ build-backend = "hatchling.build"
6
6
 
7
7
  [project]
8
8
  name = "attocode-code-intel"
9
- version = "0.1.23"
9
+ version = "0.1.25"
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.23"
52
+ __version__ = "0.1.25"
@@ -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}},
@@ -461,8 +467,13 @@ class _LSPClient:
461
467
  line: int,
462
468
  character: int,
463
469
  include_declaration: bool = True,
464
- ) -> list[LSPLocation]:
465
- """Get all references to a symbol."""
470
+ ) -> list[LSPLocation] | None:
471
+ """Get all references to a symbol.
472
+
473
+ Returns None when the server replied null. A server that is not ready
474
+ (rust-analyzer while its VFS loads) does this; an answer with no
475
+ references is an empty list.
476
+ """
466
477
  if not self._initialized:
467
478
  return []
468
479
 
@@ -471,7 +482,9 @@ class _LSPClient:
471
482
  "position": {"line": line, "character": character},
472
483
  "context": {"includeDeclaration": include_declaration},
473
484
  })
474
- if not result or not isinstance(result, list):
485
+ if result is None:
486
+ return None
487
+ if not isinstance(result, list):
475
488
  return []
476
489
 
477
490
  return [
@@ -806,9 +819,24 @@ class _LSPClient:
806
819
  elif "method" in message:
807
820
  self._handle_notification(message["method"], message.get("params"))
808
821
 
822
+ async def wait_ready(self, timeout: float) -> bool:
823
+ """Wait up to ``timeout`` seconds until the server reports it is ready."""
824
+ if self._ready.is_set():
825
+ return True
826
+ try:
827
+ await asyncio.wait_for(self._ready.wait(), max(timeout, 0))
828
+ except TimeoutError:
829
+ return False
830
+ return True
831
+
809
832
  def _handle_notification(self, method: str, params: Any) -> None:
810
833
  """Handle server notification."""
811
- if method == "textDocument/publishDiagnostics" and self._on_diagnostics:
834
+ if method == "experimental/serverStatus" and isinstance(params, dict):
835
+ if params.get("quiescent"):
836
+ self._ready.set()
837
+ else:
838
+ self._ready.clear()
839
+ elif method == "textDocument/publishDiagnostics" and self._on_diagnostics:
812
840
  uri = params.get("uri", "")
813
841
  raw_diags = params.get("diagnostics", [])
814
842
  severity_map = {1: "error", 2: "warning", 3: "information", 4: "hint"}
@@ -1002,8 +1030,8 @@ class LSPManager:
1002
1030
  async def get_references(
1003
1031
  self, file: str, line: int, col: int,
1004
1032
  include_declaration: bool = True,
1005
- ) -> list[LSPLocation]:
1006
- """Get all references to a symbol."""
1033
+ ) -> list[LSPLocation] | None:
1034
+ """Get all references to a symbol. None: the server replied null."""
1007
1035
  client = self._get_client_for_file(file)
1008
1036
  if not client:
1009
1037
  return []
@@ -1103,6 +1131,11 @@ class LSPManager:
1103
1131
  return file
1104
1132
  return f"file://{os.path.abspath(file)}"
1105
1133
 
1134
+ async def wait_ready(self, file: str, timeout: float) -> bool:
1135
+ """Wait until the server for ``file`` reports it is ready."""
1136
+ client = self._get_client_for_file(file)
1137
+ return True if client is None else await client.wait_ready(timeout)
1138
+
1106
1139
  def _get_client_for_file(self, file: str) -> _LSPClient | None:
1107
1140
  """Find the appropriate client for a file extension."""
1108
1141
  ext = Path(file).suffix.lower()
@@ -146,7 +146,7 @@ async def get_embedding_status(
146
146
  response.provider_available = False
147
147
  response.provider_hint = (
148
148
  "No embedding provider detected. "
149
- "Install sentence-transformers (`pip install attocode[semantic]`) or set OPENAI_API_KEY."
149
+ "Install sentence-transformers (`pip install attocode[semantic]`) or set ATTOCODE_EMBEDDING_MODEL=openai with OPENAI_API_KEY."
150
150
  )
151
151
  except (ImportError, RuntimeError) as exc:
152
152
  response.provider_available = False
@@ -297,7 +297,7 @@ async def trigger_generate_embeddings(
297
297
  if provider.name == "none":
298
298
  raise HTTPException(
299
299
  status_code=400,
300
- detail="No embedding provider available. Install sentence-transformers or set OPENAI_API_KEY.",
300
+ detail="No embedding provider available. Install sentence-transformers or set ATTOCODE_EMBEDDING_MODEL=openai with OPENAI_API_KEY.",
301
301
  )
302
302
 
303
303
  # Enqueue the ARQ job
@@ -100,6 +100,7 @@ class PrecisionSession:
100
100
  candidates = ast.get_callers(definition.qualified_name)
101
101
  resolved, references = None, []
102
102
  for attempt in range(4):
103
+ answered = False
103
104
  try:
104
105
  resolved = await manager.get_definition(path, *position)
105
106
  # Some servers (including rust-analyzer) return no
@@ -134,29 +135,42 @@ class PrecisionSession:
134
135
  if str(exc).lower() != "content modified" or attempt == 3:
135
136
  raise
136
137
  else:
138
+ answered = resolved is not None and references is not None
137
139
  # No syntax callers does not establish server
138
140
  # readiness: both native lookups may be transiently
139
141
  # unresolved. A resolved unused declaration can
140
- # still take the fast path.
141
- if references or (resolved is not None and not candidates):
142
+ # still take the fast path, but only on an answer:
143
+ # null references (None) mean "not ready".
144
+ if references or (resolved is not None and references is not None
145
+ and not candidates):
142
146
  break
143
147
  # A server can briefly return null after a successful
144
148
  # warmup or edit. Yield before retrying, never extend
145
149
  # the enclosing two-second deadline or loop forever.
146
150
  if attempt < 3:
147
151
  await asyncio.sleep(.05 * 2 ** attempt)
152
+ # After a null or failed reply, a server that reports
153
+ # its status (rust-analyzer) can stay not ready for
154
+ # longer than this backoff. Wait for it, but leave half
155
+ # the deadline for the remaining lookups. Do not wait
156
+ # after an answer: rust-analyzer also answers while
157
+ # its status is not ready. Other servers return at once.
158
+ if not answered:
159
+ await manager.wait_ready(path, (deadline - asyncio.get_running_loop().time()) / 2)
148
160
  if resolved is None and not references:
149
161
  outcomes.append({"language": language, "status": "not_resolved"})
150
162
  continue
151
163
  finally:
152
164
  manager.on_result_callback = callback
153
- ast.ingest_lsp_results("references", path, references,
165
+ ast.ingest_lsp_results("references", path, references or [],
154
166
  {"line": position[0], "col": position[1],
155
167
  "symbol_name": definition.qualified_name,
156
168
  "definition_key": json.dumps([definition.file_path, definition.start_line, definition.qualified_name])})
157
169
  self.verified_languages.add(language)
158
- outcomes.append({"language": language, "status": "verified" if references or not candidates else "no_references",
159
- "symbol": definition.qualified_name, "references": len(references)})
170
+ answered = references is not None
171
+ outcomes.append({"language": language,
172
+ "status": "verified" if references or (answered and not candidates) else "no_references",
173
+ "symbol": definition.qualified_name, "references": len(references or [])})
160
174
  except Exception as exc:
161
175
  status = "timeout" if isinstance(exc, TimeoutError) or isinstance(exc.__cause__, TimeoutError) else "failed"
162
176
  self.failures[server_id] = (status, _now() + _RETRY_SECONDS)
@@ -60,6 +60,14 @@ if TYPE_CHECKING:
60
60
 
61
61
  logger = logging.getLogger(__name__)
62
62
 
63
+ # Settings of the frozen hosted-rerank trial (evals/results/2026-11-01-hosted-rerank.md).
64
+ _OPENROUTER_PRESET = {
65
+ "endpoint": "https://openrouter.ai/api/alpha/decisions",
66
+ "model": "typesafe/jev-1.13",
67
+ "auth_env": "OPENROUTER_API_KEY",
68
+ "timeout_ms": 1500,
69
+ }
70
+
63
71
  # Registry of service instances by project_dir
64
72
  _instances: dict[str, CodeIntelService] = {}
65
73
  _instances_lock = threading.Lock()
@@ -91,6 +99,11 @@ class CodeIntelService:
91
99
  self._ranking_provider = (self._config.ranking_provider
92
100
  if config is not None else
93
101
  os.environ.get("ATTOCODE_INTEL_RANKING_PROVIDER", "")) or "auto"
102
+ # The "openrouter" preset is SystemOne with the trial-tested defaults. Explicit
103
+ # settings still win, and the remote opt-in stays scoped to one workspace.
104
+ preset = _OPENROUTER_PRESET if self._ranking_provider == "openrouter" else {}
105
+ if preset:
106
+ self._ranking_provider = "systemone"
94
107
  self._systemone_status = "not_configured"
95
108
  self._memory_store: MemoryStore | None = None
96
109
  self._temporal_analyzer: TemporalCouplingAnalyzer | None = None
@@ -110,6 +123,7 @@ class CodeIntelService:
110
123
  try:
111
124
  from attocode_intel._internal.integrations.context.systemone_ranker import (
112
125
  SystemOneChoiceReranker,
126
+ workspace_consent,
113
127
  )
114
128
 
115
129
  environment = os.environ if config is None else {}
@@ -119,13 +133,16 @@ class CodeIntelService:
119
133
  remote_workspace = (self._config.ranking_remote_workspace or
120
134
  environment.get("ATTOCODE_INTEL_RANKING_REMOTE_WORKSPACE", ""))
121
135
  timeout_ms = (self._config.ranking_timeout_ms if config is not None else
122
- int(environment.get("ATTOCODE_INTEL_RANKING_TIMEOUT_MS", "0")))
136
+ int(environment.get("ATTOCODE_INTEL_RANKING_TIMEOUT_MS", "0"))
137
+ ) or preset.get("timeout_ms", 0)
123
138
  self._systemone_ranker = SystemOneChoiceReranker(
124
- self._config.ranking_endpoint or environment.get("ATTOCODE_INTEL_RANKING_ENDPOINT", ""),
125
- model=self._config.ranking_model or environment.get("ATTOCODE_INTEL_RANKING_MODEL", ""),
126
- auth_env=self._config.ranking_auth_env or environment.get("ATTOCODE_INTEL_RANKING_AUTH_ENV", ""),
127
- allow_remote=(remote_opt_in and os.path.isabs(remote_workspace) and
128
- os.path.realpath(remote_workspace) == self._project_dir),
139
+ self._config.ranking_endpoint or environment.get("ATTOCODE_INTEL_RANKING_ENDPOINT", "")
140
+ or preset.get("endpoint", ""),
141
+ model=self._config.ranking_model or environment.get("ATTOCODE_INTEL_RANKING_MODEL", "")
142
+ or preset.get("model", ""),
143
+ auth_env=self._config.ranking_auth_env or environment.get("ATTOCODE_INTEL_RANKING_AUTH_ENV", "")
144
+ or preset.get("auth_env", ""),
145
+ allow_remote=workspace_consent(remote_opt_in, remote_workspace, self._project_dir),
129
146
  service_mode=self._config.is_service_mode,
130
147
  timeout_seconds=None if timeout_ms == 0 else timeout_ms / 1000,
131
148
  max_candidates=(self._config.ranking_max_candidates if config is not None else
@@ -1799,7 +1816,7 @@ class CodeIntelService:
1799
1816
  except Exception as e:
1800
1817
  return {"locations": [], "total": 0, "error": f"LSP error: {e}"}
1801
1818
  locations = []
1802
- for loc in locs:
1819
+ for loc in locs or []:
1803
1820
  uri = loc.uri
1804
1821
  if uri.startswith("file://"):
1805
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