kodit 0.4.3__py3-none-any.whl → 0.5.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 (95) hide show
  1. kodit/_version.py +2 -2
  2. kodit/app.py +53 -23
  3. kodit/application/factories/reporting_factory.py +6 -2
  4. kodit/application/factories/server_factory.py +311 -0
  5. kodit/application/services/code_search_application_service.py +144 -0
  6. kodit/application/services/commit_indexing_application_service.py +543 -0
  7. kodit/application/services/indexing_worker_service.py +13 -44
  8. kodit/application/services/queue_service.py +24 -3
  9. kodit/application/services/reporting.py +0 -2
  10. kodit/application/services/sync_scheduler.py +15 -31
  11. kodit/cli.py +2 -753
  12. kodit/cli_utils.py +2 -9
  13. kodit/config.py +1 -94
  14. kodit/database.py +38 -1
  15. kodit/domain/{entities.py → entities/__init__.py} +50 -195
  16. kodit/domain/entities/git.py +190 -0
  17. kodit/domain/factories/__init__.py +1 -0
  18. kodit/domain/factories/git_repo_factory.py +76 -0
  19. kodit/domain/protocols.py +263 -64
  20. kodit/domain/services/bm25_service.py +5 -1
  21. kodit/domain/services/embedding_service.py +3 -0
  22. kodit/domain/services/git_repository_service.py +429 -0
  23. kodit/domain/services/git_service.py +300 -0
  24. kodit/domain/services/task_status_query_service.py +2 -2
  25. kodit/domain/value_objects.py +83 -114
  26. kodit/infrastructure/api/client/__init__.py +0 -2
  27. kodit/infrastructure/api/v1/__init__.py +0 -4
  28. kodit/infrastructure/api/v1/dependencies.py +92 -46
  29. kodit/infrastructure/api/v1/routers/__init__.py +0 -6
  30. kodit/infrastructure/api/v1/routers/commits.py +271 -0
  31. kodit/infrastructure/api/v1/routers/queue.py +2 -2
  32. kodit/infrastructure/api/v1/routers/repositories.py +282 -0
  33. kodit/infrastructure/api/v1/routers/search.py +31 -14
  34. kodit/infrastructure/api/v1/schemas/__init__.py +0 -24
  35. kodit/infrastructure/api/v1/schemas/commit.py +96 -0
  36. kodit/infrastructure/api/v1/schemas/context.py +2 -0
  37. kodit/infrastructure/api/v1/schemas/repository.py +128 -0
  38. kodit/infrastructure/api/v1/schemas/search.py +12 -9
  39. kodit/infrastructure/api/v1/schemas/snippet.py +58 -0
  40. kodit/infrastructure/api/v1/schemas/tag.py +31 -0
  41. kodit/infrastructure/api/v1/schemas/task_status.py +2 -0
  42. kodit/infrastructure/bm25/local_bm25_repository.py +16 -4
  43. kodit/infrastructure/bm25/vectorchord_bm25_repository.py +68 -52
  44. kodit/infrastructure/cloning/git/git_python_adaptor.py +467 -0
  45. kodit/infrastructure/cloning/git/working_copy.py +1 -1
  46. kodit/infrastructure/embedding/embedding_factory.py +3 -2
  47. kodit/infrastructure/embedding/local_vector_search_repository.py +1 -1
  48. kodit/infrastructure/embedding/vectorchord_vector_search_repository.py +111 -84
  49. kodit/infrastructure/enrichment/litellm_enrichment_provider.py +19 -26
  50. kodit/infrastructure/indexing/fusion_service.py +1 -1
  51. kodit/infrastructure/mappers/git_mapper.py +193 -0
  52. kodit/infrastructure/mappers/snippet_mapper.py +106 -0
  53. kodit/infrastructure/mappers/task_mapper.py +5 -44
  54. kodit/infrastructure/reporting/log_progress.py +8 -5
  55. kodit/infrastructure/reporting/telemetry_progress.py +21 -0
  56. kodit/infrastructure/slicing/slicer.py +32 -31
  57. kodit/infrastructure/sqlalchemy/embedding_repository.py +43 -23
  58. kodit/infrastructure/sqlalchemy/entities.py +394 -158
  59. kodit/infrastructure/sqlalchemy/git_branch_repository.py +263 -0
  60. kodit/infrastructure/sqlalchemy/git_commit_repository.py +337 -0
  61. kodit/infrastructure/sqlalchemy/git_repository.py +252 -0
  62. kodit/infrastructure/sqlalchemy/git_tag_repository.py +257 -0
  63. kodit/infrastructure/sqlalchemy/snippet_v2_repository.py +484 -0
  64. kodit/infrastructure/sqlalchemy/task_repository.py +29 -23
  65. kodit/infrastructure/sqlalchemy/task_status_repository.py +24 -12
  66. kodit/infrastructure/sqlalchemy/unit_of_work.py +10 -14
  67. kodit/mcp.py +12 -30
  68. kodit/migrations/env.py +1 -0
  69. kodit/migrations/versions/04b80f802e0c_foreign_key_review.py +100 -0
  70. kodit/migrations/versions/7f15f878c3a1_add_new_git_entities.py +690 -0
  71. kodit/migrations/versions/f9e5ef5e688f_add_git_commits_number.py +43 -0
  72. kodit/py.typed +0 -0
  73. kodit/utils/dump_openapi.py +7 -4
  74. kodit/utils/path_utils.py +29 -0
  75. {kodit-0.4.3.dist-info → kodit-0.5.0.dist-info}/METADATA +3 -3
  76. kodit-0.5.0.dist-info/RECORD +137 -0
  77. kodit/application/factories/code_indexing_factory.py +0 -195
  78. kodit/application/services/auto_indexing_service.py +0 -99
  79. kodit/application/services/code_indexing_application_service.py +0 -410
  80. kodit/domain/services/index_query_service.py +0 -70
  81. kodit/domain/services/index_service.py +0 -269
  82. kodit/infrastructure/api/client/index_client.py +0 -57
  83. kodit/infrastructure/api/v1/routers/indexes.py +0 -164
  84. kodit/infrastructure/api/v1/schemas/index.py +0 -101
  85. kodit/infrastructure/bm25/bm25_factory.py +0 -28
  86. kodit/infrastructure/cloning/__init__.py +0 -1
  87. kodit/infrastructure/cloning/metadata.py +0 -98
  88. kodit/infrastructure/mappers/index_mapper.py +0 -345
  89. kodit/infrastructure/reporting/tdqm_progress.py +0 -38
  90. kodit/infrastructure/slicing/language_detection_service.py +0 -18
  91. kodit/infrastructure/sqlalchemy/index_repository.py +0 -646
  92. kodit-0.4.3.dist-info/RECORD +0 -125
  93. {kodit-0.4.3.dist-info → kodit-0.5.0.dist-info}/WHEEL +0 -0
  94. {kodit-0.4.3.dist-info → kodit-0.5.0.dist-info}/entry_points.txt +0 -0
  95. {kodit-0.4.3.dist-info → kodit-0.5.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,12 +1,13 @@
1
1
  """Queue service for managing tasks."""
2
2
 
3
3
  from collections.abc import Callable
4
+ from typing import Any
4
5
 
5
6
  import structlog
6
7
  from sqlalchemy.ext.asyncio import AsyncSession
7
8
 
8
9
  from kodit.domain.entities import Task
9
- from kodit.domain.value_objects import TaskType
10
+ from kodit.domain.value_objects import QueuePriority, TaskOperation
10
11
  from kodit.infrastructure.sqlalchemy.task_repository import (
11
12
  create_task_repository,
12
13
  )
@@ -46,9 +47,29 @@ class QueueService:
46
47
  payload=task.payload,
47
48
  )
48
49
 
49
- async def list_tasks(self, task_type: TaskType | None = None) -> list[Task]:
50
+ async def enqueue_tasks(
51
+ self,
52
+ tasks: list[TaskOperation],
53
+ base_priority: QueuePriority,
54
+ payload: dict[str, Any],
55
+ ) -> None:
56
+ """Queue repository tasks."""
57
+ priority_offset = len(tasks) * 10
58
+ for task in tasks:
59
+ await self.enqueue_task(
60
+ Task.create(
61
+ task,
62
+ base_priority + priority_offset,
63
+ payload,
64
+ )
65
+ )
66
+ priority_offset -= 10
67
+
68
+ async def list_tasks(
69
+ self, task_operation: TaskOperation | None = None
70
+ ) -> list[Task]:
50
71
  """List all tasks in the queue."""
51
- return await self.task_repository.list(task_type)
72
+ return await self.task_repository.list(task_operation)
52
73
 
53
74
  async def get_task(self, task_id: str) -> Task | None:
54
75
  """Get a specific task by ID."""
@@ -82,7 +82,6 @@ class ProgressTracker:
82
82
  async def skip(self, reason: str) -> None:
83
83
  """Skip the step."""
84
84
  self.task_status.skip(reason)
85
- await self.notify_subscribers()
86
85
 
87
86
  def subscribe(self, subscriber: "ReportingModule") -> None:
88
87
  """Subscribe to the step."""
@@ -91,7 +90,6 @@ class ProgressTracker:
91
90
  async def set_total(self, total: int) -> None:
92
91
  """Set the total for the step."""
93
92
  self.task_status.set_total(total)
94
- await self.notify_subscribers()
95
93
 
96
94
  async def set_current(self, current: int, message: str | None = None) -> None:
97
95
  """Progress the step."""
@@ -1,18 +1,16 @@
1
1
  """Service for scheduling periodic sync operations."""
2
2
 
3
3
  import asyncio
4
- from collections.abc import Callable
5
4
  from contextlib import suppress
6
5
 
7
6
  import structlog
8
- from sqlalchemy.ext.asyncio import AsyncSession
9
7
 
10
8
  from kodit.application.services.queue_service import QueueService
11
- from kodit.domain.entities import Task
12
- from kodit.domain.services.index_query_service import IndexQueryService
13
- from kodit.domain.value_objects import QueuePriority
14
- from kodit.infrastructure.indexing.fusion_service import ReciprocalRankFusionService
15
- from kodit.infrastructure.sqlalchemy.index_repository import create_index_repository
9
+ from kodit.domain.protocols import GitRepoRepository
10
+ from kodit.domain.value_objects import (
11
+ PrescribedOperations,
12
+ QueuePriority,
13
+ )
16
14
 
17
15
 
18
16
  class SyncSchedulerService:
@@ -20,10 +18,12 @@ class SyncSchedulerService:
20
18
 
21
19
  def __init__(
22
20
  self,
23
- session_factory: Callable[[], AsyncSession],
21
+ queue_service: QueueService,
22
+ repo_repository: GitRepoRepository,
24
23
  ) -> None:
25
24
  """Initialize the sync scheduler service."""
26
- self.session_factory = session_factory
25
+ self.queue_service = queue_service
26
+ self.repo_repository = repo_repository
27
27
  self.log = structlog.get_logger(__name__)
28
28
  self._sync_task: asyncio.Task | None = None
29
29
  self._shutdown_event = asyncio.Event()
@@ -67,28 +67,12 @@ class SyncSchedulerService:
67
67
  """Perform a sync operation on all indexes."""
68
68
  self.log.info("Starting sync operation")
69
69
 
70
- # Create services
71
- queue_service = QueueService(session_factory=self.session_factory)
72
- index_query_service = IndexQueryService(
73
- index_repository=create_index_repository(
74
- session_factory=self.session_factory
75
- ),
76
- fusion_service=ReciprocalRankFusionService(),
77
- )
78
-
79
- # Get all existing indexes
80
- all_indexes = await index_query_service.list_indexes()
81
-
82
- if not all_indexes:
83
- self.log.info("No indexes found to sync")
84
- return
85
-
86
- self.log.info("Adding sync tasks to queue", count=len(all_indexes))
87
-
88
- # Sync each index
89
- for index in all_indexes:
90
- await queue_service.enqueue_task(
91
- Task.create_index_update_task(index.id, QueuePriority.BACKGROUND)
70
+ # Sync each index - queue all 5 tasks with priority ordering
71
+ for repo in await self.repo_repository.get_all():
72
+ await self.queue_service.enqueue_tasks(
73
+ tasks=PrescribedOperations.SYNC_REPOSITORY,
74
+ base_priority=QueuePriority.BACKGROUND,
75
+ payload={"repository_id": repo.id},
92
76
  )
93
77
 
94
78
  self.log.info("Sync operation completed")