kodit 0.2.8__py3-none-any.whl → 0.3.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.

Potentially problematic release.


This version of kodit might be problematic. Click here for more details.

Files changed (37) hide show
  1. kodit/_version.py +2 -2
  2. kodit/app.py +36 -1
  3. kodit/application/factories/__init__.py +1 -0
  4. kodit/application/factories/code_indexing_factory.py +119 -0
  5. kodit/application/services/{indexing_application_service.py → code_indexing_application_service.py} +159 -198
  6. kodit/cli.py +214 -62
  7. kodit/config.py +40 -3
  8. kodit/domain/entities.py +7 -5
  9. kodit/domain/repositories.py +33 -0
  10. kodit/domain/services/bm25_service.py +14 -17
  11. kodit/domain/services/embedding_service.py +10 -14
  12. kodit/domain/services/snippet_service.py +198 -0
  13. kodit/domain/value_objects.py +301 -21
  14. kodit/infrastructure/bm25/local_bm25_repository.py +20 -12
  15. kodit/infrastructure/bm25/vectorchord_bm25_repository.py +31 -11
  16. kodit/infrastructure/cloning/metadata.py +1 -0
  17. kodit/infrastructure/embedding/embedding_providers/hash_embedding_provider.py +14 -25
  18. kodit/infrastructure/embedding/local_vector_search_repository.py +26 -38
  19. kodit/infrastructure/embedding/vectorchord_vector_search_repository.py +50 -35
  20. kodit/infrastructure/enrichment/enrichment_factory.py +1 -1
  21. kodit/infrastructure/indexing/auto_indexing_service.py +84 -0
  22. kodit/infrastructure/indexing/indexing_factory.py +8 -91
  23. kodit/infrastructure/indexing/snippet_domain_service_factory.py +37 -0
  24. kodit/infrastructure/snippet_extraction/languages/java.scm +12 -0
  25. kodit/infrastructure/snippet_extraction/snippet_extraction_factory.py +3 -31
  26. kodit/infrastructure/sqlalchemy/embedding_repository.py +14 -3
  27. kodit/infrastructure/sqlalchemy/snippet_repository.py +174 -2
  28. kodit/mcp.py +61 -49
  29. {kodit-0.2.8.dist-info → kodit-0.3.0.dist-info}/METADATA +1 -1
  30. {kodit-0.2.8.dist-info → kodit-0.3.0.dist-info}/RECORD +33 -31
  31. kodit/application/commands/__init__.py +0 -1
  32. kodit/application/commands/snippet_commands.py +0 -22
  33. kodit/application/services/snippet_application_service.py +0 -149
  34. kodit/infrastructure/enrichment/legacy_enrichment_models.py +0 -42
  35. {kodit-0.2.8.dist-info → kodit-0.3.0.dist-info}/WHEEL +0 -0
  36. {kodit-0.2.8.dist-info → kodit-0.3.0.dist-info}/entry_points.txt +0 -0
  37. {kodit-0.2.8.dist-info → kodit-0.3.0.dist-info}/licenses/LICENSE +0 -0
kodit/_version.py CHANGED
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '0.2.8'
21
- __version_tuple__ = version_tuple = (0, 2, 8)
20
+ __version__ = version = '0.3.0'
21
+ __version_tuple__ = version_tuple = (0, 3, 0)
kodit/app.py CHANGED
@@ -1,14 +1,49 @@
1
1
  """FastAPI application for kodit API."""
2
2
 
3
+ from collections.abc import AsyncIterator
4
+ from contextlib import asynccontextmanager
5
+
3
6
  from asgi_correlation_id import CorrelationIdMiddleware
4
7
  from fastapi import FastAPI
5
8
 
9
+ from kodit.config import AppContext
10
+ from kodit.infrastructure.indexing.auto_indexing_service import AutoIndexingService
6
11
  from kodit.mcp import mcp
7
12
  from kodit.middleware import ASGICancelledErrorMiddleware, logging_middleware
8
13
 
14
+ # Global auto-indexing service
15
+ _auto_indexing_service: AutoIndexingService | None = None
16
+
17
+
18
+ @asynccontextmanager
19
+ async def app_lifespan(_: FastAPI) -> AsyncIterator[None]:
20
+ """Manage application lifespan for auto-indexing."""
21
+ global _auto_indexing_service # noqa: PLW0603
22
+ # Start auto-indexing service
23
+ app_context = AppContext()
24
+ db = await app_context.get_db()
25
+ _auto_indexing_service = AutoIndexingService(
26
+ app_context=app_context,
27
+ session_factory=db.session_factory,
28
+ )
29
+ await _auto_indexing_service.start_background_indexing()
30
+ yield
31
+ if _auto_indexing_service:
32
+ await _auto_indexing_service.stop()
33
+
34
+
9
35
  # See https://gofastmcp.com/deployment/asgi#fastapi-integration
10
36
  mcp_app = mcp.sse_app()
11
- app = FastAPI(title="kodit API", lifespan=mcp_app.router.lifespan_context)
37
+
38
+
39
+ @asynccontextmanager
40
+ async def combined_lifespan(app: FastAPI) -> AsyncIterator[None]:
41
+ """Combine app and MCP lifespans."""
42
+ async with app_lifespan(app), mcp_app.router.lifespan_context(app):
43
+ yield
44
+
45
+
46
+ app = FastAPI(title="kodit API", lifespan=combined_lifespan)
12
47
 
13
48
  # Add middleware
14
49
  app.middleware("http")(logging_middleware)
@@ -0,0 +1 @@
1
+ """Application factories package."""
@@ -0,0 +1,119 @@
1
+ """Factory for creating the unified code indexing application service."""
2
+
3
+ from sqlalchemy.ext.asyncio import AsyncSession
4
+
5
+ from kodit.application.services.code_indexing_application_service import (
6
+ CodeIndexingApplicationService,
7
+ )
8
+ from kodit.config import AppContext
9
+ from kodit.domain.entities import EmbeddingType
10
+ from kodit.domain.services.bm25_service import BM25DomainService
11
+ from kodit.domain.services.embedding_service import EmbeddingDomainService
12
+ from kodit.domain.services.enrichment_service import EnrichmentDomainService
13
+ from kodit.domain.services.source_service import SourceService
14
+ from kodit.infrastructure.bm25.bm25_factory import bm25_repository_factory
15
+ from kodit.infrastructure.embedding.embedding_factory import (
16
+ embedding_domain_service_factory,
17
+ )
18
+ from kodit.infrastructure.embedding.embedding_providers import (
19
+ hash_embedding_provider,
20
+ )
21
+ from kodit.infrastructure.embedding.local_vector_search_repository import (
22
+ LocalVectorSearchRepository,
23
+ )
24
+ from kodit.infrastructure.enrichment.enrichment_factory import (
25
+ enrichment_domain_service_factory,
26
+ )
27
+ from kodit.infrastructure.enrichment.null_enrichment_provider import (
28
+ NullEnrichmentProvider,
29
+ )
30
+ from kodit.infrastructure.indexing.indexing_factory import (
31
+ indexing_domain_service_factory,
32
+ )
33
+ from kodit.infrastructure.indexing.snippet_domain_service_factory import (
34
+ snippet_domain_service_factory,
35
+ )
36
+ from kodit.infrastructure.sqlalchemy.embedding_repository import (
37
+ SqlAlchemyEmbeddingRepository,
38
+ )
39
+
40
+
41
+ def create_code_indexing_application_service(
42
+ app_context: AppContext,
43
+ session: AsyncSession,
44
+ source_service: SourceService,
45
+ ) -> CodeIndexingApplicationService:
46
+ """Create a unified code indexing application service with all dependencies."""
47
+ # Create domain services
48
+ indexing_domain_service = indexing_domain_service_factory(session)
49
+ snippet_domain_service = snippet_domain_service_factory(session)
50
+ bm25_service = BM25DomainService(bm25_repository_factory(app_context, session))
51
+ code_search_service = embedding_domain_service_factory("code", app_context, session)
52
+ text_search_service = embedding_domain_service_factory("text", app_context, session)
53
+ enrichment_service = enrichment_domain_service_factory(app_context)
54
+
55
+ # Create and return the unified application service
56
+ return CodeIndexingApplicationService(
57
+ indexing_domain_service=indexing_domain_service,
58
+ snippet_domain_service=snippet_domain_service,
59
+ source_service=source_service,
60
+ bm25_service=bm25_service,
61
+ code_search_service=code_search_service,
62
+ text_search_service=text_search_service,
63
+ enrichment_service=enrichment_service,
64
+ session=session,
65
+ )
66
+
67
+
68
+ def create_fast_test_code_indexing_application_service(
69
+ app_context: AppContext,
70
+ session: AsyncSession,
71
+ source_service: SourceService,
72
+ ) -> CodeIndexingApplicationService:
73
+ """Create a fast test version of CodeIndexingApplicationService."""
74
+ # Create domain services
75
+ indexing_domain_service = indexing_domain_service_factory(session)
76
+ snippet_domain_service = snippet_domain_service_factory(session)
77
+ bm25_service = BM25DomainService(bm25_repository_factory(app_context, session))
78
+
79
+ # Create fast embedding services using HashEmbeddingProvider
80
+ embedding_repository = SqlAlchemyEmbeddingRepository(session=session)
81
+
82
+ # Fast code search service
83
+ code_search_repository = LocalVectorSearchRepository(
84
+ embedding_repository=embedding_repository,
85
+ embedding_provider=hash_embedding_provider.HashEmbeddingProvider(),
86
+ embedding_type=EmbeddingType.CODE,
87
+ )
88
+ code_search_service = EmbeddingDomainService(
89
+ embedding_provider=hash_embedding_provider.HashEmbeddingProvider(),
90
+ vector_search_repository=code_search_repository,
91
+ )
92
+
93
+ # Fast text search service
94
+ text_search_repository = LocalVectorSearchRepository(
95
+ embedding_repository=embedding_repository,
96
+ embedding_provider=hash_embedding_provider.HashEmbeddingProvider(),
97
+ embedding_type=EmbeddingType.TEXT,
98
+ )
99
+ text_search_service = EmbeddingDomainService(
100
+ embedding_provider=hash_embedding_provider.HashEmbeddingProvider(),
101
+ vector_search_repository=text_search_repository,
102
+ )
103
+
104
+ # Fast enrichment service using NullEnrichmentProvider
105
+ enrichment_service = EnrichmentDomainService(
106
+ enrichment_provider=NullEnrichmentProvider()
107
+ )
108
+
109
+ # Create and return the unified application service
110
+ return CodeIndexingApplicationService(
111
+ indexing_domain_service=indexing_domain_service,
112
+ snippet_domain_service=snippet_domain_service,
113
+ source_service=source_service,
114
+ bm25_service=bm25_service,
115
+ code_search_service=code_search_service,
116
+ text_search_service=text_search_service,
117
+ enrichment_service=enrichment_service,
118
+ session=session,
119
+ )