attocode-code-intel 0.1.0__py3-none-any.whl

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 (345) hide show
  1. attocode_code_intel-0.1.0.dist-info/METADATA +221 -0
  2. attocode_code_intel-0.1.0.dist-info/RECORD +345 -0
  3. attocode_code_intel-0.1.0.dist-info/WHEEL +4 -0
  4. attocode_code_intel-0.1.0.dist-info/entry_points.txt +2 -0
  5. attocode_code_intel-0.1.0.dist-info/licenses/LICENSE +21 -0
  6. attocode_intel/GUIDELINES.md +432 -0
  7. attocode_intel/__init__.py +52 -0
  8. attocode_intel/_internal/__init__.py +1 -0
  9. attocode_intel/_internal/errors/__init__.py +126 -0
  10. attocode_intel/_internal/integrations/__init__.py +1 -0
  11. attocode_intel/_internal/integrations/context/__init__.py +1 -0
  12. attocode_intel/_internal/integrations/context/architecture_drift.py +354 -0
  13. attocode_intel/_internal/integrations/context/ast_chunker.py +202 -0
  14. attocode_intel/_internal/integrations/context/ast_service.py +1483 -0
  15. attocode_intel/_internal/integrations/context/blob_oid.py +423 -0
  16. attocode_intel/_internal/integrations/context/cache_manifest.py +221 -0
  17. attocode_intel/_internal/integrations/context/cas.py +466 -0
  18. attocode_intel/_internal/integrations/context/code_analyzer.py +528 -0
  19. attocode_intel/_internal/integrations/context/codebase_ast.py +1461 -0
  20. attocode_intel/_internal/integrations/context/codebase_context.py +1736 -0
  21. attocode_intel/_internal/integrations/context/cross_mode.py +263 -0
  22. attocode_intel/_internal/integrations/context/cross_references.py +616 -0
  23. attocode_intel/_internal/integrations/context/embedding_rotation.py +597 -0
  24. attocode_intel/_internal/integrations/context/embeddings.py +282 -0
  25. attocode_intel/_internal/integrations/context/frecency.py +427 -0
  26. attocode_intel/_internal/integrations/context/fuzzy.py +320 -0
  27. attocode_intel/_internal/integrations/context/hierarchical_explorer.py +331 -0
  28. attocode_intel/_internal/integrations/context/hydration.py +90 -0
  29. attocode_intel/_internal/integrations/context/index_repair.py +87 -0
  30. attocode_intel/_internal/integrations/context/index_store.py +586 -0
  31. attocode_intel/_internal/integrations/context/memory_store.py +602 -0
  32. attocode_intel/_internal/integrations/context/module_resolution.py +52 -0
  33. attocode_intel/_internal/integrations/context/query_constraints.py +361 -0
  34. attocode_intel/_internal/integrations/context/query_history.py +417 -0
  35. attocode_intel/_internal/integrations/context/reranker.py +351 -0
  36. attocode_intel/_internal/integrations/context/semantic_search.py +2931 -0
  37. attocode_intel/_internal/integrations/context/syntax_evidence.py +94 -0
  38. attocode_intel/_internal/integrations/context/systemone_ranker.py +245 -0
  39. attocode_intel/_internal/integrations/context/temporal_coupling.py +411 -0
  40. attocode_intel/_internal/integrations/context/trigram_index.py +820 -0
  41. attocode_intel/_internal/integrations/context/trigram_regex.py +171 -0
  42. attocode_intel/_internal/integrations/context/ts_parser.py +2199 -0
  43. attocode_intel/_internal/integrations/context/vector_store.py +795 -0
  44. attocode_intel/_internal/integrations/feature_flags/__init__.py +357 -0
  45. attocode_intel/_internal/integrations/lsp/__init__.py +1 -0
  46. attocode_intel/_internal/integrations/lsp/client.py +1140 -0
  47. attocode_intel/_internal/integrations/mcp/__init__.py +1 -0
  48. attocode_intel/_internal/integrations/mcp/client.py +253 -0
  49. attocode_intel/_internal/integrations/security/__init__.py +1 -0
  50. attocode_intel/_internal/integrations/security/custom_rules.py +176 -0
  51. attocode_intel/_internal/integrations/security/dataflow.py +522 -0
  52. attocode_intel/_internal/integrations/security/dependency_audit.py +303 -0
  53. attocode_intel/_internal/integrations/security/matcher.py +44 -0
  54. attocode_intel/_internal/integrations/security/patterns.py +724 -0
  55. attocode_intel/_internal/integrations/security/scanner.py +351 -0
  56. attocode_intel/_internal/integrations/utilities/__init__.py +1 -0
  57. attocode_intel/_internal/integrations/utilities/ignore.py +64 -0
  58. attocode_intel/_internal/integrations/utilities/token_estimate.py +51 -0
  59. attocode_intel/_internal/tricks/__init__.py +1 -0
  60. attocode_intel/_internal/tricks/recursive_context.py +357 -0
  61. attocode_intel/_internal/types/__init__.py +1 -0
  62. attocode_intel/_internal/types/events.py +289 -0
  63. attocode_intel/_internal/types/severity.py +15 -0
  64. attocode_intel/_shared.py +341 -0
  65. attocode_intel/analysis_coverage.py +56 -0
  66. attocode_intel/api/__init__.py +1 -0
  67. attocode_intel/api/access.py +32 -0
  68. attocode_intel/api/app.py +247 -0
  69. attocode_intel/api/auth/__init__.py +128 -0
  70. attocode_intel/api/auth/api_keys.py +61 -0
  71. attocode_intel/api/auth/context.py +34 -0
  72. attocode_intel/api/auth/jwt.py +66 -0
  73. attocode_intel/api/auth/oauth.py +146 -0
  74. attocode_intel/api/auth/passwords.py +15 -0
  75. attocode_intel/api/deps.py +351 -0
  76. attocode_intel/api/knowledge_bridge.py +13 -0
  77. attocode_intel/api/mcp_transport.py +51 -0
  78. attocode_intel/api/middleware.py +411 -0
  79. attocode_intel/api/models.py +698 -0
  80. attocode_intel/api/providers/__init__.py +1 -0
  81. attocode_intel/api/providers/db_provider.py +1106 -0
  82. attocode_intel/api/providers/local_provider.py +476 -0
  83. attocode_intel/api/providers/remote_provider.py +740 -0
  84. attocode_intel/api/repository_source.py +21 -0
  85. attocode_intel/api/routes/__init__.py +1 -0
  86. attocode_intel/api/routes/_pin_helper.py +158 -0
  87. attocode_intel/api/routes/activity.py +148 -0
  88. attocode_intel/api/routes/adr.py +102 -0
  89. attocode_intel/api/routes/analysis.py +515 -0
  90. attocode_intel/api/routes/api_keys.py +170 -0
  91. attocode_intel/api/routes/auth.py +428 -0
  92. attocode_intel/api/routes/branches.py +262 -0
  93. attocode_intel/api/routes/cross_repo_search.py +198 -0
  94. attocode_intel/api/routes/embeddings.py +386 -0
  95. attocode_intel/api/routes/files.py +132 -0
  96. attocode_intel/api/routes/files_v2.py +388 -0
  97. attocode_intel/api/routes/gc.py +322 -0
  98. attocode_intel/api/routes/git_v2.py +433 -0
  99. attocode_intel/api/routes/graph.py +174 -0
  100. attocode_intel/api/routes/graph_viz.py +160 -0
  101. attocode_intel/api/routes/health.py +62 -0
  102. attocode_intel/api/routes/history.py +175 -0
  103. attocode_intel/api/routes/jobs.py +84 -0
  104. attocode_intel/api/routes/learning.py +205 -0
  105. attocode_intel/api/routes/lsp.py +272 -0
  106. attocode_intel/api/routes/notify.py +623 -0
  107. attocode_intel/api/routes/operations.py +27 -0
  108. attocode_intel/api/routes/orgs.py +924 -0
  109. attocode_intel/api/routes/preferences.py +100 -0
  110. attocode_intel/api/routes/presence.py +42 -0
  111. attocode_intel/api/routes/projects.py +116 -0
  112. attocode_intel/api/routes/repos.py +47 -0
  113. attocode_intel/api/routes/search.py +180 -0
  114. attocode_intel/api/routes/snapshots.py +614 -0
  115. attocode_intel/api/routes/webhooks.py +313 -0
  116. attocode_intel/api/routes/websocket.py +116 -0
  117. attocode_intel/api/static/graph.html +239 -0
  118. attocode_intel/api/utils.py +96 -0
  119. attocode_intel/artifacts/__init__.py +45 -0
  120. attocode_intel/artifacts/hashing.py +230 -0
  121. attocode_intel/artifacts/provenance.py +190 -0
  122. attocode_intel/artifacts/retrieval_pin.py +159 -0
  123. attocode_intel/audit.py +59 -0
  124. attocode_intel/bug_finder.py +206 -0
  125. attocode_intel/bundle.py +80 -0
  126. attocode_intel/catalog.py +242 -0
  127. attocode_intel/change_review.py +75 -0
  128. attocode_intel/cli.py +3062 -0
  129. attocode_intel/community.py +63 -0
  130. attocode_intel/confidence/__init__.py +144 -0
  131. attocode_intel/confidence/jev.py +234 -0
  132. attocode_intel/confidence/llm.py +330 -0
  133. attocode_intel/confidence/redact.py +44 -0
  134. attocode_intel/confidence/settings.py +74 -0
  135. attocode_intel/config.py +256 -0
  136. attocode_intel/crypto.py +31 -0
  137. attocode_intel/db/__init__.py +7 -0
  138. attocode_intel/db/base.py +33 -0
  139. attocode_intel/db/engine.py +61 -0
  140. attocode_intel/db/models.py +529 -0
  141. attocode_intel/entrypoint.py +185 -0
  142. attocode_intel/focused_evidence.py +130 -0
  143. attocode_intel/freshness.py +154 -0
  144. attocode_intel/gateway.py +734 -0
  145. attocode_intel/git/__init__.py +7 -0
  146. attocode_intel/git/credentials.py +75 -0
  147. attocode_intel/git/manager.py +493 -0
  148. attocode_intel/git/models.py +96 -0
  149. attocode_intel/git/storage.py +98 -0
  150. attocode_intel/graph_query_parser.py +761 -0
  151. attocode_intel/helpers.py +712 -0
  152. attocode_intel/indexing/__init__.py +29 -0
  153. attocode_intel/indexing/debouncer.py +136 -0
  154. attocode_intel/indexing/delta_indexer.py +151 -0
  155. attocode_intel/indexing/full_indexer.py +323 -0
  156. attocode_intel/indexing/incremental.py +240 -0
  157. attocode_intel/indexing/parser.py +403 -0
  158. attocode_intel/indexing/summarizer.py +264 -0
  159. attocode_intel/installer.py +1896 -0
  160. attocode_intel/knowledge.py +269 -0
  161. attocode_intel/local_knowledge.py +77 -0
  162. attocode_intel/migrations/alembic.ini +36 -0
  163. attocode_intel/migrations/env.py +71 -0
  164. attocode_intel/migrations/script.py.mako +27 -0
  165. attocode_intel/migrations/versions/001_initial_schema.py +219 -0
  166. attocode_intel/migrations/versions/002_branch_version_and_embeddings.py +61 -0
  167. attocode_intel/migrations/versions/003_embedding_uniqueness_and_cascade.py +51 -0
  168. attocode_intel/migrations/versions/004_audit_events.py +38 -0
  169. attocode_intel/migrations/versions/005_user_preferences.py +30 -0
  170. attocode_intel/migrations/versions/006_google_oauth.py +27 -0
  171. attocode_intel/migrations/versions/007_pgvector_embeddings.py +28 -0
  172. attocode_intel/migrations/versions/008_symbol_references.py +37 -0
  173. attocode_intel/migrations/versions/009_webhook_secret_encryption.py +25 -0
  174. attocode_intel/migrations/versions/010_add_commits_table.py +40 -0
  175. attocode_intel/migrations/versions/011_commit_changed_files.py +25 -0
  176. attocode_intel/migrations/versions/012_branch_merged_at.py +25 -0
  177. attocode_intel/migrations/versions/013_revoked_tokens.py +32 -0
  178. attocode_intel/migrations/versions/014_blame_hunks.py +40 -0
  179. attocode_intel/migrations/versions/015_commit_file_stats.py +40 -0
  180. attocode_intel/migrations/versions/016_embedding_provenance_columns.py +179 -0
  181. attocode_intel/migrations/versions/017_provenance_table.py +102 -0
  182. attocode_intel/migrations/versions/018_repo_snapshots.py +178 -0
  183. attocode_intel/migrations/versions/019_symref_caller.py +42 -0
  184. attocode_intel/migrations/versions/020_shared_knowledge.py +29 -0
  185. attocode_intel/onboarding.py +258 -0
  186. attocode_intel/output.py +178 -0
  187. attocode_intel/precision.py +133 -0
  188. attocode_intel/presence.py +160 -0
  189. attocode_intel/probe.py +110 -0
  190. attocode_intel/project_dir.py +97 -0
  191. attocode_intel/pubsub.py +113 -0
  192. attocode_intel/query_ranking.py +242 -0
  193. attocode_intel/readiness.py +972 -0
  194. attocode_intel/redis.py +51 -0
  195. attocode_intel/reference_pages.py +60 -0
  196. attocode_intel/remote.py +131 -0
  197. attocode_intel/repo_ranker.py +246 -0
  198. attocode_intel/request_context.py +82 -0
  199. attocode_intel/rules/__init__.py +28 -0
  200. attocode_intel/rules/ci.py +320 -0
  201. attocode_intel/rules/combinators.py +293 -0
  202. attocode_intel/rules/enricher.py +127 -0
  203. attocode_intel/rules/evolution.py +452 -0
  204. attocode_intel/rules/executor.py +531 -0
  205. attocode_intel/rules/filters/__init__.py +5 -0
  206. attocode_intel/rules/filters/pipeline.py +151 -0
  207. attocode_intel/rules/formatter.py +198 -0
  208. attocode_intel/rules/hygiene.py +242 -0
  209. attocode_intel/rules/importers/__init__.py +1 -0
  210. attocode_intel/rules/importers/semgrep.py +382 -0
  211. attocode_intel/rules/loader.py +292 -0
  212. attocode_intel/rules/marketplace.py +375 -0
  213. attocode_intel/rules/metavar.py +181 -0
  214. attocode_intel/rules/model.py +317 -0
  215. attocode_intel/rules/packs/__init__.py +1 -0
  216. attocode_intel/rules/packs/community/_license_templates/Apache-2.0.txt +176 -0
  217. attocode_intel/rules/packs/community/_license_templates/MIT.txt +21 -0
  218. attocode_intel/rules/packs/community/bandit-python/LICENSE +176 -0
  219. attocode_intel/rules/packs/community/bandit-python/NOTICE +13 -0
  220. attocode_intel/rules/packs/community/bandit-python/PORTING.md +23 -0
  221. attocode_intel/rules/packs/community/bandit-python/manifest.yaml +14 -0
  222. attocode_intel/rules/packs/community/bandit-python/rules/B105-hardcoded-password.yaml +23 -0
  223. attocode_intel/rules/packs/community/bandit-python/rules/B303-weak-md5.yaml +21 -0
  224. attocode_intel/rules/packs/community/bandit-python/rules/B304-weak-des.yaml +20 -0
  225. attocode_intel/rules/packs/community/bandit-python/rules/B307-use-of-eval.yaml +22 -0
  226. attocode_intel/rules/packs/community/bandit-python/rules/B324-weak-sha1.yaml +21 -0
  227. attocode_intel/rules/packs/community/bandit-python/rules/B501-no-cert-validation.yaml +23 -0
  228. attocode_intel/rules/packs/community/bandit-python/rules/B602-shell-true.yaml +22 -0
  229. attocode_intel/rules/packs/community/bandit-python/rules/B608-sqli.yaml +22 -0
  230. attocode_intel/rules/packs/community/eslint-typescript/LICENSE +21 -0
  231. attocode_intel/rules/packs/community/eslint-typescript/NOTICE +13 -0
  232. attocode_intel/rules/packs/community/eslint-typescript/PORTING.md +23 -0
  233. attocode_intel/rules/packs/community/eslint-typescript/manifest.yaml +14 -0
  234. attocode_intel/rules/packs/community/eslint-typescript/rules/eqeqeq.yaml +20 -0
  235. attocode_intel/rules/packs/community/eslint-typescript/rules/no-eval.yaml +22 -0
  236. attocode_intel/rules/packs/community/eslint-typescript/rules/no-implied-eval.yaml +20 -0
  237. attocode_intel/rules/packs/community/eslint-typescript/rules/no-new-func.yaml +21 -0
  238. attocode_intel/rules/packs/community/eslint-typescript/rules/no-throw-literal.yaml +19 -0
  239. attocode_intel/rules/packs/community/eslint-typescript/rules/no-var.yaml +20 -0
  240. attocode_intel/rules/packs/community/eslint-typescript/rules/no-with.yaml +18 -0
  241. attocode_intel/rules/packs/community/gosec-go/LICENSE +176 -0
  242. attocode_intel/rules/packs/community/gosec-go/NOTICE +13 -0
  243. attocode_intel/rules/packs/community/gosec-go/PORTING.md +23 -0
  244. attocode_intel/rules/packs/community/gosec-go/manifest.yaml +14 -0
  245. attocode_intel/rules/packs/community/gosec-go/rules/G101-hardcoded-credentials.yaml +22 -0
  246. attocode_intel/rules/packs/community/gosec-go/rules/G102-bind-all-interfaces.yaml +21 -0
  247. attocode_intel/rules/packs/community/gosec-go/rules/G103-unsafe-block.yaml +21 -0
  248. attocode_intel/rules/packs/community/gosec-go/rules/G201-sql-format.yaml +21 -0
  249. attocode_intel/rules/packs/community/gosec-go/rules/G304-file-inclusion.yaml +23 -0
  250. attocode_intel/rules/packs/community/gosec-go/rules/G401-weak-cipher.yaml +20 -0
  251. attocode_intel/rules/packs/community/gosec-go/rules/G402-tls-min-version.yaml +20 -0
  252. attocode_intel/rules/packs/community/gosec-go/rules/G501-md5-import.yaml +21 -0
  253. attocode_intel/rules/packs/examples/cpp/manifest.yaml +4 -0
  254. attocode_intel/rules/packs/examples/cpp/rules/security.yaml +90 -0
  255. attocode_intel/rules/packs/examples/cpp/rules/structural.yaml +42 -0
  256. attocode_intel/rules/packs/examples/csharp/manifest.yaml +4 -0
  257. attocode_intel/rules/packs/examples/csharp/rules/security.yaml +69 -0
  258. attocode_intel/rules/packs/examples/csharp/rules/structural.yaml +42 -0
  259. attocode_intel/rules/packs/examples/go/manifest.yaml +4 -0
  260. attocode_intel/rules/packs/examples/go/rules/performance.yaml +136 -0
  261. attocode_intel/rules/packs/examples/go/rules/security.yaml +48 -0
  262. attocode_intel/rules/packs/examples/go/rules/structural.yaml +58 -0
  263. attocode_intel/rules/packs/examples/go/taint/sanitizers.yaml +24 -0
  264. attocode_intel/rules/packs/examples/go/taint/sinks.yaml +51 -0
  265. attocode_intel/rules/packs/examples/go/taint/sources.yaml +26 -0
  266. attocode_intel/rules/packs/examples/java/manifest.yaml +4 -0
  267. attocode_intel/rules/packs/examples/java/rules/correctness.yaml +55 -0
  268. attocode_intel/rules/packs/examples/java/rules/structural.yaml +48 -0
  269. attocode_intel/rules/packs/examples/java/taint/sinks.yaml +37 -0
  270. attocode_intel/rules/packs/examples/java/taint/sources.yaml +21 -0
  271. attocode_intel/rules/packs/examples/kotlin/manifest.yaml +4 -0
  272. attocode_intel/rules/packs/examples/kotlin/rules/correctness.yaml +50 -0
  273. attocode_intel/rules/packs/examples/kotlin/rules/structural.yaml +38 -0
  274. attocode_intel/rules/packs/examples/php/manifest.yaml +4 -0
  275. attocode_intel/rules/packs/examples/php/rules/security.yaml +66 -0
  276. attocode_intel/rules/packs/examples/php/rules/structural.yaml +41 -0
  277. attocode_intel/rules/packs/examples/python/manifest.yaml +4 -0
  278. attocode_intel/rules/packs/examples/python/rules/performance.yaml +90 -0
  279. attocode_intel/rules/packs/examples/python/rules/structural.yaml +55 -0
  280. attocode_intel/rules/packs/examples/ruby/manifest.yaml +4 -0
  281. attocode_intel/rules/packs/examples/ruby/rules/security.yaml +73 -0
  282. attocode_intel/rules/packs/examples/ruby/rules/structural.yaml +41 -0
  283. attocode_intel/rules/packs/examples/rust/manifest.yaml +4 -0
  284. attocode_intel/rules/packs/examples/rust/rules/correctness.yaml +51 -0
  285. attocode_intel/rules/packs/examples/rust/rules/structural.yaml +49 -0
  286. attocode_intel/rules/packs/examples/typescript/manifest.yaml +4 -0
  287. attocode_intel/rules/packs/examples/typescript/rules/performance.yaml +70 -0
  288. attocode_intel/rules/packs/examples/typescript/rules/structural.yaml +48 -0
  289. attocode_intel/rules/packs/pack_loader.py +244 -0
  290. attocode_intel/rules/plugins/__init__.py +1 -0
  291. attocode_intel/rules/plugins/plugin_loader.py +132 -0
  292. attocode_intel/rules/profiling.py +332 -0
  293. attocode_intel/rules/registry.py +213 -0
  294. attocode_intel/rules/sarif.py +187 -0
  295. attocode_intel/rules/synthesis.py +420 -0
  296. attocode_intel/rules/testing.py +326 -0
  297. attocode_intel/server.py +734 -0
  298. attocode_intel/service.py +3416 -0
  299. attocode_intel/sharing.py +57 -0
  300. attocode_intel/storage/__init__.py +6 -0
  301. attocode_intel/storage/branch_overlay.py +352 -0
  302. attocode_intel/storage/content_store.py +220 -0
  303. attocode_intel/storage/dependency_store.py +143 -0
  304. attocode_intel/storage/diff_engine.py +187 -0
  305. attocode_intel/storage/embedding_store.py +594 -0
  306. attocode_intel/storage/provenance_store.py +137 -0
  307. attocode_intel/storage/security_scanner_db.py +164 -0
  308. attocode_intel/storage/symbol_store.py +160 -0
  309. attocode_intel/structural_evidence.py +144 -0
  310. attocode_intel/symbol_inspection.py +141 -0
  311. attocode_intel/symbol_links.py +167 -0
  312. attocode_intel/telemetry.py +42 -0
  313. attocode_intel/test_ranking.py +73 -0
  314. attocode_intel/testing/__init__.py +43 -0
  315. attocode_intel/testing/fixtures.py +122 -0
  316. attocode_intel/testing/helpers.py +75 -0
  317. attocode_intel/testing/mocks.py +99 -0
  318. attocode_intel/tools/__init__.py +2 -0
  319. attocode_intel/tools/adr_tools.py +628 -0
  320. attocode_intel/tools/analysis_tools.py +382 -0
  321. attocode_intel/tools/composite_tools.py +695 -0
  322. attocode_intel/tools/cross_mode_tools.py +173 -0
  323. attocode_intel/tools/dead_code_tools.py +582 -0
  324. attocode_intel/tools/distill_tools.py +353 -0
  325. attocode_intel/tools/frecency_tools.py +220 -0
  326. attocode_intel/tools/fuzzy_tools.py +255 -0
  327. attocode_intel/tools/history_tools.py +486 -0
  328. attocode_intel/tools/learning_tools.py +222 -0
  329. attocode_intel/tools/lsp_tools.py +218 -0
  330. attocode_intel/tools/maintenance_tools.py +1662 -0
  331. attocode_intel/tools/navigation_tools.py +220 -0
  332. attocode_intel/tools/overlay_tools.py +540 -0
  333. attocode_intel/tools/pin_store.py +432 -0
  334. attocode_intel/tools/pin_tools.py +266 -0
  335. attocode_intel/tools/query_constraints_tools.py +262 -0
  336. attocode_intel/tools/query_history_tools.py +158 -0
  337. attocode_intel/tools/readiness_tools.py +44 -0
  338. attocode_intel/tools/rule_tools.py +992 -0
  339. attocode_intel/tools/search_tools.py +770 -0
  340. attocode_intel/tools/snapshot_tools.py +624 -0
  341. attocode_intel/workers/__init__.py +1 -0
  342. attocode_intel/workers/job_utils.py +111 -0
  343. attocode_intel/workers/jobs.py +573 -0
  344. attocode_intel/workers/run.py +30 -0
  345. attocode_intel/workers/settings.py +61 -0
@@ -0,0 +1,698 @@
1
+ """Pydantic request/response models for the HTTP API."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import TypeVar
6
+
7
+ from pydantic import BaseModel, Field
8
+
9
+ T = TypeVar("T")
10
+
11
+ # ------------------------------------------------------------------
12
+ # Common
13
+ # ------------------------------------------------------------------
14
+
15
+
16
+ class ErrorResponse(BaseModel):
17
+ detail: str
18
+
19
+
20
+ # ------------------------------------------------------------------
21
+ # Projects
22
+ # ------------------------------------------------------------------
23
+
24
+
25
+ class ProjectRegister(BaseModel):
26
+ path: str = Field(..., description="Local path to the project directory")
27
+ name: str = Field("", description="Optional human-readable name (auto-detected if empty)")
28
+
29
+
30
+ class ProjectInfo(BaseModel):
31
+ id: str
32
+ name: str
33
+ path: str
34
+ status: str
35
+ file_count: int = 0
36
+ symbol_count: int = 0
37
+
38
+
39
+ class ProjectListResponse(BaseModel):
40
+ projects: list[ProjectInfo]
41
+ total: int = 0
42
+ limit: int = 20
43
+ offset: int = 0
44
+ has_more: bool = False
45
+
46
+
47
+ # ------------------------------------------------------------------
48
+ # Analysis
49
+ # ------------------------------------------------------------------
50
+
51
+
52
+ class DependencyGraphRequest(BaseModel):
53
+ start_file: str = ""
54
+ depth: int = Field(3, ge=1, le=10)
55
+ directory: str = ""
56
+
57
+
58
+ class GraphQueryRequest(BaseModel):
59
+ file: str
60
+ edge_type: str = "IMPORTS"
61
+ direction: str = "outbound"
62
+ depth: int = 2
63
+
64
+
65
+ class FindRelatedRequest(BaseModel):
66
+ file: str
67
+ top_k: int = 10
68
+
69
+
70
+ class RelevantContextRequest(BaseModel):
71
+ files: list[str]
72
+ depth: int = 1
73
+ max_tokens: int = 4000
74
+ include_symbols: bool = True
75
+
76
+
77
+ class BootstrapRequest(BaseModel):
78
+ task_hint: str = ""
79
+ max_tokens: int = 8000
80
+ indexing_depth: str = "auto"
81
+
82
+
83
+ class ExploreRequest(BaseModel):
84
+ path: str = ""
85
+ max_items: int = 30
86
+ importance_threshold: float = 0.3
87
+
88
+
89
+ class SecurityScanRequest(BaseModel):
90
+ mode: str = "full"
91
+ path: str = ""
92
+
93
+
94
+ class RepoMapRankedRequest(BaseModel):
95
+ task_context: str = ""
96
+ token_budget: int = 1024
97
+ exclude_tests: bool = True
98
+
99
+
100
+ class GraphDSLRequest(BaseModel):
101
+ query: str
102
+
103
+
104
+ class DeadCodeRequest(BaseModel):
105
+ scope: str = ""
106
+ entry_points: list[str] | None = None
107
+ level: str = "symbol"
108
+ min_confidence: float = 0.5
109
+ top_n: int = 30
110
+
111
+
112
+ class DistillRequest(BaseModel):
113
+ files: list[str] | None = None
114
+ depth: int = 1
115
+ level: str = "signatures"
116
+ max_tokens: int = 4000
117
+
118
+
119
+ class ReadinessReportRequest(BaseModel):
120
+ phases: list[int] | None = None
121
+ scope: str = ""
122
+ tracer_bullets: bool = True
123
+ min_severity: str = "info"
124
+
125
+
126
+ class BugScanRequest(BaseModel):
127
+ base_branch: str = "main"
128
+ min_confidence: float = 0.5
129
+
130
+
131
+ # ------------------------------------------------------------------
132
+ # Search
133
+ # ------------------------------------------------------------------
134
+
135
+
136
+ class SemanticSearchRequest(BaseModel):
137
+ query: str
138
+ top_k: int = 10
139
+ file_filter: str = ""
140
+
141
+
142
+ class FastSearchRequest(BaseModel):
143
+ pattern: str
144
+ path: str = ""
145
+ max_results: int = 50
146
+ case_insensitive: bool = False
147
+ selectivity_threshold: float = 0.10
148
+ explain: bool = False
149
+
150
+
151
+ # ------------------------------------------------------------------
152
+ # Learning
153
+ # ------------------------------------------------------------------
154
+
155
+
156
+ class RecordLearningRequest(BaseModel):
157
+ type: str
158
+ description: str
159
+ details: str = ""
160
+ scope: str = ""
161
+ confidence: float = 0.7
162
+
163
+
164
+ class LearningFeedbackRequest(BaseModel):
165
+ helpful: bool
166
+
167
+
168
+ class RecordADRRequest(BaseModel):
169
+ title: str
170
+ context: str
171
+ decision: str
172
+ consequences: str = ""
173
+ related_files: list[str] | None = None
174
+ tags: list[str] | None = None
175
+
176
+
177
+ class UpdateADRStatusRequest(BaseModel):
178
+ status: str
179
+ superseded_by: int | None = None
180
+
181
+
182
+ # ------------------------------------------------------------------
183
+ # LSP
184
+ # ------------------------------------------------------------------
185
+
186
+
187
+ class LSPPositionRequest(BaseModel):
188
+ file: str
189
+ line: int
190
+ col: int = 0
191
+
192
+
193
+ class LSPReferencesRequest(BaseModel):
194
+ file: str
195
+ line: int
196
+ col: int = 0
197
+ include_declaration: bool = True
198
+
199
+
200
+ class LSPEnrichRequest(BaseModel):
201
+ files: list[str]
202
+
203
+
204
+ class ChangeCouplingRequest(BaseModel):
205
+ file: str
206
+ days: int = 90
207
+ min_coupling: float = 0.3
208
+ top_k: int = 20
209
+
210
+
211
+ class MergeRiskRequest(BaseModel):
212
+ files: list[str]
213
+ days: int = 90
214
+
215
+
216
+ # ------------------------------------------------------------------
217
+ # Notifications
218
+ # ------------------------------------------------------------------
219
+
220
+
221
+ class NotifyFilesRequest(BaseModel):
222
+ files: list[str]
223
+
224
+
225
+ # ------------------------------------------------------------------
226
+ # Generic text result
227
+ # ------------------------------------------------------------------
228
+
229
+
230
+ class TextResult(BaseModel):
231
+ result: str
232
+
233
+
234
+ # ------------------------------------------------------------------
235
+ # Pagination
236
+ # ------------------------------------------------------------------
237
+
238
+
239
+ class PaginatedResponse[T](BaseModel):
240
+ items: list[T]
241
+ total: int
242
+ limit: int
243
+ offset: int
244
+ has_more: bool
245
+
246
+
247
+ # ------------------------------------------------------------------
248
+ # Structured v2 responses
249
+ # ------------------------------------------------------------------
250
+
251
+
252
+ class FileMetricsItem(BaseModel):
253
+ path: str
254
+ line_count: int = 0
255
+ symbol_count: int = 0
256
+ public_symbols: int = 0
257
+ fan_in: int = 0
258
+ fan_out: int = 0
259
+ density: float = 0.0
260
+ composite: float = 0.0
261
+ categories: list[str] = []
262
+
263
+
264
+ class FunctionMetricsItem(BaseModel):
265
+ file_path: str
266
+ name: str
267
+ line_count: int = 0
268
+ param_count: int = 0
269
+ is_public: bool = True
270
+ has_return_type: bool = False
271
+
272
+
273
+ class HotspotsResponse(BaseModel):
274
+ file_hotspots: list[FileMetricsItem]
275
+ function_hotspots: list[FunctionMetricsItem]
276
+ orphan_files: list[FileMetricsItem]
277
+
278
+
279
+ class SymbolItem(BaseModel):
280
+ kind: str = ""
281
+ name: str = ""
282
+ qualified_name: str = ""
283
+ signature: str = ""
284
+ file_path: str = ""
285
+ start_line: int = 0
286
+ end_line: int = 0
287
+ score: float = 0.0
288
+
289
+
290
+ class SymbolListResponse(BaseModel):
291
+ path: str
292
+ symbols: list[SymbolItem]
293
+
294
+
295
+ class SymbolSearchResponse(BaseModel):
296
+ query: str
297
+ definitions: list[SymbolItem]
298
+
299
+
300
+ class DependencyResponse(BaseModel):
301
+ analysis_status: str = "partial"
302
+ absence_proven: bool = False
303
+ path: str
304
+ imports: list[str]
305
+ imported_by: list[str]
306
+
307
+
308
+ class DependencyGraphNode(BaseModel):
309
+ id: str
310
+ label: str
311
+ type: str = "file"
312
+
313
+
314
+ class DependencyGraphEdge(BaseModel):
315
+ source: str
316
+ target: str
317
+ type: str = "import"
318
+
319
+
320
+ class DependencyGraphResponse(BaseModel):
321
+ nodes: list[DependencyGraphNode]
322
+ edges: list[DependencyGraphEdge]
323
+
324
+
325
+ class ImpactLayer(BaseModel):
326
+ depth: int
327
+ files: list[str]
328
+
329
+
330
+ class ImpactAnalysisResponse(BaseModel):
331
+ interpretation: str = "potential_graph_reachability"
332
+ absence_proven: bool = False
333
+ changed_files: list[str]
334
+ impacted_files: list[str]
335
+ total_impacted: int
336
+ layers: list[ImpactLayer] = []
337
+
338
+
339
+ class ReferenceItem(BaseModel):
340
+ source: str = "unknown"
341
+ symbol: str = ""
342
+ ref_kind: str = ""
343
+ file_path: str = ""
344
+ line: int = 0
345
+
346
+
347
+ class CrossRefResponse(BaseModel):
348
+ analysis_status: str = "partial"
349
+ ambiguous: bool | None = None
350
+ symbol: str
351
+ definitions: list[SymbolItem]
352
+ references: list[ReferenceItem]
353
+ total_references: int
354
+
355
+
356
+ class CodeChunkItem(BaseModel):
357
+ kind: str = ""
358
+ name: str = ""
359
+ parent: str | None = None
360
+ signature: str | None = None
361
+ start_line: int = 0
362
+ end_line: int = 0
363
+
364
+
365
+ class FileAnalysisResponse(BaseModel):
366
+ path: str
367
+ language: str = ""
368
+ line_count: int = 0
369
+ imports: list[str] = []
370
+ exports: list[str] = []
371
+ chunks: list[CodeChunkItem] = []
372
+
373
+
374
+ class SearchResultItem(BaseModel):
375
+ file_path: str = ""
376
+ score: float = 0.0
377
+ snippet: str = ""
378
+ line: int | None = None
379
+
380
+
381
+ class SearchResultsResponse(BaseModel):
382
+ query: str
383
+ results: list[SearchResultItem]
384
+ total: int
385
+ # Server-side search responses expose the same ``pin_id`` /
386
+ # ``manifest_hash`` pair that local ``_stamp_pin`` emits in the MCP
387
+ # tool footer. Clients round-trip them via ``pin_resolve``. Both
388
+ # default to empty strings so clients that ignore them are
389
+ # unaffected.
390
+ pin_id: str = ""
391
+ manifest_hash: str = ""
392
+
393
+
394
+ class SecurityFinding(BaseModel):
395
+ severity: str = ""
396
+ category: str = ""
397
+ file_path: str = ""
398
+ line: int | None = None
399
+ message: str = ""
400
+ suggestion: str = ""
401
+
402
+
403
+ class SecurityScanResponse(BaseModel):
404
+ mode: str
405
+ path: str = ""
406
+ findings: list[SecurityFinding]
407
+ total_findings: int
408
+ summary: dict = {}
409
+
410
+
411
+ class ConventionStats(BaseModel):
412
+ total_functions: int = 0
413
+ snake_names: int = 0
414
+ camel_names: int = 0
415
+ typed_return: int = 0
416
+ typed_params: int = 0
417
+ total_params: int = 0
418
+ has_docstring_fn: int = 0
419
+ has_docstring_cls: int = 0
420
+ total_classes: int = 0
421
+ async_count: int = 0
422
+ from_imports: int = 0
423
+ plain_imports: int = 0
424
+ relative_imports: int = 0
425
+ total_imports: int = 0
426
+ decorator_counts: dict[str, int] = {}
427
+ dataclass_count: int = 0
428
+ abstract_count: int = 0
429
+ base_classes: dict[str, int] = {}
430
+ exception_classes: list[dict] = []
431
+ private_functions: int = 0
432
+ staticmethod_count: int = 0
433
+ classmethod_count: int = 0
434
+ property_count: int = 0
435
+ all_exports_count: int = 0
436
+ file_sizes: list[int] = []
437
+
438
+
439
+ class ConventionsResponse(BaseModel):
440
+ sample_size: int
441
+ path: str = ""
442
+ stats: ConventionStats
443
+ dir_stats: dict[str, ConventionStats] = {}
444
+
445
+
446
+ class CommunityItem(BaseModel):
447
+ id: int
448
+ files: list[str]
449
+ size: int
450
+ theme: str = ""
451
+ internal_edges: int = 0
452
+ external_edges: int = 0
453
+ hub: str = ""
454
+ hub_internal_degree: int = 0
455
+ top_dirs: list[str] = []
456
+
457
+
458
+ class CommunityBridge(BaseModel):
459
+ source_id: int
460
+ target_id: int
461
+ edge_count: int
462
+ sample_files: list[str] = []
463
+
464
+
465
+ class CommunityResponse(BaseModel):
466
+ method: str
467
+ modularity: float
468
+ communities: list[CommunityItem]
469
+ bridges: list[CommunityBridge] = []
470
+
471
+
472
+ class GraphQueryHop(BaseModel):
473
+ depth: int
474
+ files: list[str]
475
+
476
+
477
+ class GraphQueryResponse(BaseModel):
478
+ root: str
479
+ direction: str
480
+ depth: int
481
+ hops: list[GraphQueryHop]
482
+ total_reachable: int
483
+
484
+
485
+ class RelatedFileItem(BaseModel):
486
+ path: str
487
+ score: int
488
+ relation_type: str
489
+
490
+
491
+ class FindRelatedResponse(BaseModel):
492
+ file: str
493
+ related: list[RelatedFileItem]
494
+
495
+
496
+ class LSPLocation(BaseModel):
497
+ file: str
498
+ line: int
499
+ col: int
500
+
501
+
502
+ class LSPDefinitionResponse(BaseModel):
503
+ location: LSPLocation | None = None
504
+ error: str | None = None
505
+
506
+
507
+ class LSPReferencesResponse(BaseModel):
508
+ locations: list[LSPLocation]
509
+ total: int
510
+ error: str | None = None
511
+
512
+
513
+ class LSPHoverResponse(BaseModel):
514
+ content: str | None = None
515
+ file: str = ""
516
+ line: int = 0
517
+ col: int = 0
518
+ error: str | None = None
519
+
520
+
521
+ class LSPDiagnosticItem(BaseModel):
522
+ severity: str = ""
523
+ source: str | None = None
524
+ code: str | None = None
525
+ line: int = 0
526
+ col: int = 0
527
+ message: str = ""
528
+
529
+
530
+ class LSPDiagnosticsResponse(BaseModel):
531
+ file: str
532
+ diagnostics: list[LSPDiagnosticItem]
533
+ total: int
534
+ error: str | None = None
535
+
536
+
537
+ # ------------------------------------------------------------------
538
+ # LSP completions, call hierarchy, workspace symbol
539
+ # ------------------------------------------------------------------
540
+
541
+
542
+ class LSPCompletionItem(BaseModel):
543
+ label: str
544
+ kind: str = "text"
545
+ detail: str | None = None
546
+ documentation: str | None = None
547
+ insert_text: str | None = None
548
+
549
+
550
+ class LSPCompletionsResponse(BaseModel):
551
+ file: str
552
+ line: int = 0
553
+ col: int = 0
554
+ completions: list[LSPCompletionItem]
555
+ total: int
556
+ error: str | None = None
557
+
558
+
559
+ class LSPIncomingCallItem(BaseModel):
560
+ name: str
561
+ container: str | None = None
562
+ file: str
563
+ line: int = 0
564
+ col: int = 0
565
+
566
+
567
+ class LSPOutgoingCallItem(BaseModel):
568
+ name: str
569
+ container: str | None = None
570
+ file: str
571
+ line: int = 0
572
+ col: int = 0
573
+
574
+
575
+ class LSPIncomingCallsResponse(BaseModel):
576
+ symbol: str
577
+ file: str
578
+ line: int = 0
579
+ col: int = 0
580
+ callers: list[LSPIncomingCallItem]
581
+ total: int
582
+ error: str | None = None
583
+
584
+
585
+ class LSPOutgoingCallsResponse(BaseModel):
586
+ symbol: str
587
+ file: str
588
+ line: int = 0
589
+ col: int = 0
590
+ callees: list[LSPOutgoingCallItem]
591
+ total: int
592
+ error: str | None = None
593
+
594
+
595
+ class LSPWorkspaceSymbolItem(BaseModel):
596
+ name: str
597
+ kind: str = "text"
598
+ file: str
599
+ line: int = 0
600
+ container: str | None = None
601
+ detail: str | None = None
602
+
603
+
604
+ class LSPWorkspaceSymbolResponse(BaseModel):
605
+ query: str
606
+ symbols: list[LSPWorkspaceSymbolItem]
607
+ total: int
608
+ error: str | None = None
609
+
610
+
611
+ # ------------------------------------------------------------------
612
+ # File content API
613
+ # ------------------------------------------------------------------
614
+
615
+
616
+ class FileContentResponse(BaseModel):
617
+ path: str
618
+ content: str
619
+ language: str = ""
620
+ size_bytes: int = 0
621
+ line_count: int = 0
622
+
623
+
624
+ class TreeEntry(BaseModel):
625
+ name: str
626
+ type: str # "file" or "dir"
627
+ size_bytes: int | None = None
628
+ language: str | None = None
629
+
630
+
631
+ class FileTreeResponse(BaseModel):
632
+ path: str
633
+ entries: list[TreeEntry]
634
+
635
+
636
+ # ------------------------------------------------------------------
637
+ # Learning v2 (structured)
638
+ # ------------------------------------------------------------------
639
+
640
+
641
+ class LearningItem(BaseModel):
642
+ id: int
643
+ type: str
644
+ description: str
645
+ details: str = ""
646
+ scope: str = ""
647
+ confidence: float = 0.7
648
+ status: str = "active"
649
+ helpful_count: int = 0
650
+ unhelpful_count: int = 0
651
+
652
+
653
+ class LearningListResponse(BaseModel):
654
+ learnings: list[LearningItem]
655
+ total: int
656
+
657
+
658
+ class LearningRecallItem(BaseModel):
659
+ id: int
660
+ type: str
661
+ description: str
662
+ scope: str = ""
663
+ confidence: float = 0.7
664
+ relevance_score: float = 0.0
665
+
666
+
667
+ class LearningRecallResponse(BaseModel):
668
+ query: str
669
+ results: list[LearningRecallItem]
670
+ total: int
671
+
672
+
673
+ # ---------------------------------------------------------------------------
674
+ # Rule-based analysis
675
+ # ---------------------------------------------------------------------------
676
+
677
+
678
+ class AnalyzeRequest(BaseModel):
679
+ files: list[str] | None = None
680
+ path: str = ""
681
+ language: str = ""
682
+ category: str = ""
683
+ severity: str = ""
684
+ pack: str = ""
685
+ min_confidence: float = 0.5
686
+ max_findings: int = 50
687
+
688
+
689
+ class ListRulesRequest(BaseModel):
690
+ language: str = ""
691
+ category: str = ""
692
+ severity: str = ""
693
+ pack: str = ""
694
+ verbose: bool = False
695
+
696
+
697
+ class RegisterRuleRequest(BaseModel):
698
+ yaml_content: str
@@ -0,0 +1 @@
1
+ """Data providers for mode-aware route handling."""