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.
- kodit/_version.py +2 -2
- kodit/app.py +36 -1
- kodit/application/factories/__init__.py +1 -0
- kodit/application/factories/code_indexing_factory.py +119 -0
- kodit/application/services/{indexing_application_service.py → code_indexing_application_service.py} +159 -198
- kodit/cli.py +214 -62
- kodit/config.py +40 -3
- kodit/domain/entities.py +7 -5
- kodit/domain/repositories.py +33 -0
- kodit/domain/services/bm25_service.py +14 -17
- kodit/domain/services/embedding_service.py +10 -14
- kodit/domain/services/snippet_service.py +198 -0
- kodit/domain/value_objects.py +301 -21
- kodit/infrastructure/bm25/local_bm25_repository.py +20 -12
- kodit/infrastructure/bm25/vectorchord_bm25_repository.py +31 -11
- kodit/infrastructure/cloning/metadata.py +1 -0
- kodit/infrastructure/embedding/embedding_providers/hash_embedding_provider.py +14 -25
- kodit/infrastructure/embedding/local_vector_search_repository.py +26 -38
- kodit/infrastructure/embedding/vectorchord_vector_search_repository.py +50 -35
- kodit/infrastructure/enrichment/enrichment_factory.py +1 -1
- kodit/infrastructure/indexing/auto_indexing_service.py +84 -0
- kodit/infrastructure/indexing/indexing_factory.py +8 -91
- kodit/infrastructure/indexing/snippet_domain_service_factory.py +37 -0
- kodit/infrastructure/snippet_extraction/languages/java.scm +12 -0
- kodit/infrastructure/snippet_extraction/snippet_extraction_factory.py +3 -31
- kodit/infrastructure/sqlalchemy/embedding_repository.py +14 -3
- kodit/infrastructure/sqlalchemy/snippet_repository.py +174 -2
- kodit/mcp.py +61 -49
- {kodit-0.2.8.dist-info → kodit-0.3.0.dist-info}/METADATA +1 -1
- {kodit-0.2.8.dist-info → kodit-0.3.0.dist-info}/RECORD +33 -31
- kodit/application/commands/__init__.py +0 -1
- kodit/application/commands/snippet_commands.py +0 -22
- kodit/application/services/snippet_application_service.py +0 -149
- kodit/infrastructure/enrichment/legacy_enrichment_models.py +0 -42
- {kodit-0.2.8.dist-info → kodit-0.3.0.dist-info}/WHEEL +0 -0
- {kodit-0.2.8.dist-info → kodit-0.3.0.dist-info}/entry_points.txt +0 -0
- {kodit-0.2.8.dist-info → kodit-0.3.0.dist-info}/licenses/LICENSE +0 -0
kodit/_version.py
CHANGED
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
|
-
|
|
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
|
+
)
|