kodit 0.4.1__py3-none-any.whl → 0.4.3__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 (52) hide show
  1. kodit/_version.py +2 -2
  2. kodit/app.py +9 -2
  3. kodit/application/factories/code_indexing_factory.py +62 -13
  4. kodit/application/factories/reporting_factory.py +32 -0
  5. kodit/application/services/auto_indexing_service.py +41 -33
  6. kodit/application/services/code_indexing_application_service.py +137 -138
  7. kodit/application/services/indexing_worker_service.py +26 -30
  8. kodit/application/services/queue_service.py +12 -14
  9. kodit/application/services/reporting.py +104 -0
  10. kodit/application/services/sync_scheduler.py +21 -20
  11. kodit/cli.py +71 -85
  12. kodit/config.py +26 -3
  13. kodit/database.py +2 -1
  14. kodit/domain/entities.py +99 -1
  15. kodit/domain/protocols.py +34 -1
  16. kodit/domain/services/bm25_service.py +1 -6
  17. kodit/domain/services/index_service.py +23 -57
  18. kodit/domain/services/task_status_query_service.py +19 -0
  19. kodit/domain/value_objects.py +53 -8
  20. kodit/infrastructure/api/v1/dependencies.py +40 -12
  21. kodit/infrastructure/api/v1/routers/indexes.py +45 -0
  22. kodit/infrastructure/api/v1/schemas/task_status.py +39 -0
  23. kodit/infrastructure/cloning/git/working_copy.py +43 -7
  24. kodit/infrastructure/embedding/embedding_factory.py +8 -3
  25. kodit/infrastructure/embedding/embedding_providers/litellm_embedding_provider.py +48 -55
  26. kodit/infrastructure/enrichment/local_enrichment_provider.py +41 -30
  27. kodit/infrastructure/git/git_utils.py +3 -2
  28. kodit/infrastructure/mappers/index_mapper.py +1 -0
  29. kodit/infrastructure/mappers/task_status_mapper.py +85 -0
  30. kodit/infrastructure/reporting/__init__.py +1 -0
  31. kodit/infrastructure/reporting/db_progress.py +23 -0
  32. kodit/infrastructure/reporting/log_progress.py +37 -0
  33. kodit/infrastructure/reporting/tdqm_progress.py +38 -0
  34. kodit/infrastructure/sqlalchemy/embedding_repository.py +47 -68
  35. kodit/infrastructure/sqlalchemy/entities.py +89 -2
  36. kodit/infrastructure/sqlalchemy/index_repository.py +274 -236
  37. kodit/infrastructure/sqlalchemy/task_repository.py +55 -39
  38. kodit/infrastructure/sqlalchemy/task_status_repository.py +79 -0
  39. kodit/infrastructure/sqlalchemy/unit_of_work.py +59 -0
  40. kodit/mcp.py +15 -3
  41. kodit/migrations/env.py +0 -1
  42. kodit/migrations/versions/b9cd1c3fd762_add_task_status.py +77 -0
  43. {kodit-0.4.1.dist-info → kodit-0.4.3.dist-info}/METADATA +1 -1
  44. {kodit-0.4.1.dist-info → kodit-0.4.3.dist-info}/RECORD +47 -40
  45. kodit/domain/interfaces.py +0 -27
  46. kodit/infrastructure/ui/__init__.py +0 -1
  47. kodit/infrastructure/ui/progress.py +0 -170
  48. kodit/infrastructure/ui/spinner.py +0 -74
  49. kodit/reporting.py +0 -78
  50. {kodit-0.4.1.dist-info → kodit-0.4.3.dist-info}/WHEEL +0 -0
  51. {kodit-0.4.1.dist-info → kodit-0.4.3.dist-info}/entry_points.txt +0 -0
  52. {kodit-0.4.1.dist-info → kodit-0.4.3.dist-info}/licenses/LICENSE +0 -0
@@ -1,5 +1,7 @@
1
1
  """Task repository for the task queue."""
2
2
 
3
+ from collections.abc import Callable
4
+
3
5
  import structlog
4
6
  from sqlalchemy import select
5
7
  from sqlalchemy.ext.asyncio import AsyncSession
@@ -9,14 +11,23 @@ from kodit.domain.protocols import TaskRepository
9
11
  from kodit.domain.value_objects import TaskType
10
12
  from kodit.infrastructure.mappers.task_mapper import TaskMapper, TaskTypeMapper
11
13
  from kodit.infrastructure.sqlalchemy import entities as db_entities
14
+ from kodit.infrastructure.sqlalchemy.unit_of_work import SqlAlchemyUnitOfWork
15
+
16
+
17
+ def create_task_repository(
18
+ session_factory: Callable[[], AsyncSession],
19
+ ) -> TaskRepository:
20
+ """Create an index repository."""
21
+ uow = SqlAlchemyUnitOfWork(session_factory=session_factory)
22
+ return SqlAlchemyTaskRepository(uow)
12
23
 
13
24
 
14
25
  class SqlAlchemyTaskRepository(TaskRepository):
15
26
  """Repository for task persistence using the existing Task entity."""
16
27
 
17
- def __init__(self, session: AsyncSession) -> None:
28
+ def __init__(self, uow: SqlAlchemyUnitOfWork) -> None:
18
29
  """Initialize the repository."""
19
- self.session = session
30
+ self.uow = uow
20
31
  self.log = structlog.get_logger(__name__)
21
32
 
22
33
  async def add(
@@ -24,58 +35,63 @@ class SqlAlchemyTaskRepository(TaskRepository):
24
35
  task: Task,
25
36
  ) -> None:
26
37
  """Create a new task in the database."""
27
- self.session.add(TaskMapper.from_domain_task(task))
38
+ async with self.uow:
39
+ self.uow.session.add(TaskMapper.from_domain_task(task))
28
40
 
29
41
  async def get(self, task_id: str) -> Task | None:
30
42
  """Get a task by ID."""
31
- stmt = select(db_entities.Task).where(db_entities.Task.dedup_key == task_id)
32
- result = await self.session.execute(stmt)
33
- db_task = result.scalar_one_or_none()
34
- if not db_task:
35
- return None
36
- return TaskMapper.to_domain_task(db_task)
43
+ async with self.uow:
44
+ stmt = select(db_entities.Task).where(db_entities.Task.dedup_key == task_id)
45
+ result = await self.uow.session.execute(stmt)
46
+ db_task = result.scalar_one_or_none()
47
+ if not db_task:
48
+ return None
49
+ return TaskMapper.to_domain_task(db_task)
37
50
 
38
51
  async def take(self) -> Task | None:
39
52
  """Take a task for processing and remove it from the database."""
40
- stmt = (
41
- select(db_entities.Task)
42
- .order_by(db_entities.Task.priority.desc(), db_entities.Task.created_at)
43
- .limit(1)
44
- )
45
- result = await self.session.execute(stmt)
46
- db_task = result.scalar_one_or_none()
47
- if not db_task:
48
- return None
49
- await self.session.delete(db_task)
50
- return TaskMapper.to_domain_task(db_task)
53
+ async with self.uow:
54
+ stmt = (
55
+ select(db_entities.Task)
56
+ .order_by(db_entities.Task.priority.desc(), db_entities.Task.created_at)
57
+ .limit(1)
58
+ )
59
+ result = await self.uow.session.execute(stmt)
60
+ db_task = result.scalar_one_or_none()
61
+ if not db_task:
62
+ return None
63
+ await self.uow.session.delete(db_task)
64
+ return TaskMapper.to_domain_task(db_task)
51
65
 
52
66
  async def update(self, task: Task) -> None:
53
67
  """Update a task in the database."""
54
- stmt = select(db_entities.Task).where(db_entities.Task.dedup_key == task.id)
55
- result = await self.session.execute(stmt)
56
- db_task = result.scalar_one_or_none()
68
+ async with self.uow:
69
+ stmt = select(db_entities.Task).where(db_entities.Task.dedup_key == task.id)
70
+ result = await self.uow.session.execute(stmt)
71
+ db_task = result.scalar_one_or_none()
57
72
 
58
- if not db_task:
59
- raise ValueError(f"Task not found: {task.id}")
73
+ if not db_task:
74
+ raise ValueError(f"Task not found: {task.id}")
60
75
 
61
- db_task.priority = task.priority
62
- db_task.payload = task.payload
76
+ db_task.priority = task.priority
77
+ db_task.payload = task.payload
63
78
 
64
79
  async def list(self, task_type: TaskType | None = None) -> list[Task]:
65
80
  """List tasks with optional status filter."""
66
- stmt = select(db_entities.Task)
81
+ async with self.uow:
82
+ stmt = select(db_entities.Task)
67
83
 
68
- if task_type:
69
- stmt = stmt.where(
70
- db_entities.Task.type == TaskTypeMapper.from_domain_type(task_type)
71
- )
84
+ if task_type:
85
+ stmt = stmt.where(
86
+ db_entities.Task.type == TaskTypeMapper.from_domain_type(task_type)
87
+ )
72
88
 
73
- stmt = stmt.order_by(
74
- db_entities.Task.priority.desc(), db_entities.Task.created_at
75
- )
89
+ stmt = stmt.order_by(
90
+ db_entities.Task.priority.desc(), db_entities.Task.created_at
91
+ )
76
92
 
77
- result = await self.session.execute(stmt)
78
- records = result.scalars().all()
93
+ result = await self.uow.session.execute(stmt)
94
+ records = result.scalars().all()
79
95
 
80
- # Convert to domain entities
81
- return [TaskMapper.to_domain_task(record) for record in records]
96
+ # Convert to domain entities
97
+ return [TaskMapper.to_domain_task(record) for record in records]
@@ -0,0 +1,79 @@
1
+ """Task repository for the task queue."""
2
+
3
+ from collections.abc import Callable
4
+
5
+ import structlog
6
+ from sqlalchemy import delete, select
7
+ from sqlalchemy.ext.asyncio import AsyncSession
8
+
9
+ from kodit.domain import entities as domain_entities
10
+ from kodit.domain.protocols import TaskStatusRepository
11
+ from kodit.infrastructure.mappers.task_status_mapper import TaskStatusMapper
12
+ from kodit.infrastructure.sqlalchemy import entities as db_entities
13
+ from kodit.infrastructure.sqlalchemy.unit_of_work import SqlAlchemyUnitOfWork
14
+
15
+
16
+ def create_task_status_repository(
17
+ session_factory: Callable[[], AsyncSession],
18
+ ) -> TaskStatusRepository:
19
+ """Create an index repository."""
20
+ uow = SqlAlchemyUnitOfWork(session_factory=session_factory)
21
+ return SqlAlchemyTaskStatusRepository(uow)
22
+
23
+
24
+ class SqlAlchemyTaskStatusRepository(TaskStatusRepository):
25
+ """Repository for persisting TaskStatus entities."""
26
+
27
+ def __init__(self, uow: SqlAlchemyUnitOfWork) -> None:
28
+ """Initialize the repository."""
29
+ self.uow = uow
30
+ self.log = structlog.get_logger(__name__)
31
+ self.mapper = TaskStatusMapper()
32
+
33
+ async def save(self, status: domain_entities.TaskStatus) -> None:
34
+ """Save a TaskStatus to database."""
35
+ async with self.uow:
36
+ # Convert domain entity to database entity
37
+ db_status = self.mapper.from_domain_task_status(status)
38
+ stmt = select(db_entities.TaskStatus).where(
39
+ db_entities.TaskStatus.id == db_status.id,
40
+ )
41
+ result = await self.uow.session.execute(stmt)
42
+ existing = result.scalar_one_or_none()
43
+
44
+ if not existing:
45
+ self.uow.session.add(db_status)
46
+ else:
47
+ # Update existing record with new values
48
+ existing.operation = db_status.operation
49
+ existing.state = db_status.state
50
+ existing.error = db_status.error
51
+ existing.total = db_status.total
52
+ existing.current = db_status.current
53
+ existing.updated_at = db_status.updated_at
54
+ existing.parent = db_status.parent
55
+ existing.trackable_id = db_status.trackable_id
56
+ existing.trackable_type = db_status.trackable_type
57
+
58
+ async def load_with_hierarchy(
59
+ self, trackable_type: str, trackable_id: int
60
+ ) -> list[domain_entities.TaskStatus]:
61
+ """Load TaskStatus entities with hierarchy from database."""
62
+ async with self.uow:
63
+ stmt = select(db_entities.TaskStatus).where(
64
+ db_entities.TaskStatus.trackable_id == trackable_id,
65
+ db_entities.TaskStatus.trackable_type == trackable_type,
66
+ )
67
+ result = await self.uow.session.execute(stmt)
68
+ db_statuses = list(result.scalars().all())
69
+
70
+ # Use mapper to convert and reconstruct hierarchy
71
+ return self.mapper.to_domain_task_status_with_hierarchy(db_statuses)
72
+
73
+ async def delete(self, status: domain_entities.TaskStatus) -> None:
74
+ """Delete a TaskStatus."""
75
+ async with self.uow:
76
+ stmt = delete(db_entities.TaskStatus).where(
77
+ db_entities.TaskStatus.id == status.id,
78
+ )
79
+ await self.uow.session.execute(stmt)
@@ -0,0 +1,59 @@
1
+ """SQLAlchemy implementation of Unit of Work pattern."""
2
+
3
+ from collections.abc import Callable
4
+ from types import TracebackType
5
+
6
+ from sqlalchemy.ext.asyncio import AsyncSession
7
+
8
+
9
+ class SqlAlchemyUnitOfWork:
10
+ """SQLAlchemy implementation of Unit of Work pattern."""
11
+
12
+ def __init__(self, session_factory: Callable[[], AsyncSession]) -> None:
13
+ """Initialize the unit of work with a session factory."""
14
+ self._session_factory = session_factory
15
+ self._session: AsyncSession | None = None
16
+
17
+ @property
18
+ def session(self) -> AsyncSession:
19
+ """Get the current session."""
20
+ if self._session is None:
21
+ raise RuntimeError("UnitOfWork must be used within async context")
22
+ return self._session
23
+
24
+ async def __aenter__(self) -> "SqlAlchemyUnitOfWork":
25
+ """Enter the unit of work context."""
26
+ self._session = self._session_factory()
27
+ return self
28
+
29
+ async def __aexit__(
30
+ self,
31
+ exc_type: type[BaseException] | None,
32
+ exc_val: BaseException | None,
33
+ exc_tb: TracebackType | None,
34
+ ) -> None:
35
+ """Exit the unit of work context."""
36
+ if self._session:
37
+ if exc_type is not None:
38
+ await self._session.rollback()
39
+ await self._session.commit()
40
+ await self._session.close()
41
+ self._session = None
42
+
43
+ async def commit(self) -> None:
44
+ """Commit the current transaction."""
45
+ if self._session is None:
46
+ raise RuntimeError("UnitOfWork must be used within async context")
47
+ await self._session.commit()
48
+
49
+ async def rollback(self) -> None:
50
+ """Rollback the current transaction."""
51
+ if self._session is None:
52
+ raise RuntimeError("UnitOfWork must be used within async context")
53
+ await self._session.rollback()
54
+
55
+ async def flush(self) -> None:
56
+ """Flush pending changes to the database without committing."""
57
+ if self._session is None:
58
+ raise RuntimeError("UnitOfWork must be used within async context")
59
+ await self._session.flush()
kodit/mcp.py CHANGED
@@ -1,6 +1,6 @@
1
1
  """MCP server for kodit."""
2
2
 
3
- from collections.abc import AsyncIterator
3
+ from collections.abc import AsyncIterator, Callable
4
4
  from contextlib import asynccontextmanager
5
5
  from dataclasses import dataclass
6
6
  from pathlib import Path
@@ -15,6 +15,7 @@ from kodit._version import version
15
15
  from kodit.application.factories.code_indexing_factory import (
16
16
  create_code_indexing_application_service,
17
17
  )
18
+ from kodit.application.factories.reporting_factory import create_server_operation
18
19
  from kodit.config import AppContext
19
20
  from kodit.database import Database
20
21
  from kodit.domain.value_objects import (
@@ -22,6 +23,9 @@ from kodit.domain.value_objects import (
22
23
  MultiSearchResult,
23
24
  SnippetSearchFilters,
24
25
  )
26
+ from kodit.infrastructure.sqlalchemy.task_status_repository import (
27
+ create_task_status_repository,
28
+ )
25
29
 
26
30
  # Global database connection for MCP server
27
31
  _mcp_db: Database | None = None
@@ -32,6 +36,7 @@ class MCPContext:
32
36
  """Context for the MCP server."""
33
37
 
34
38
  session: AsyncSession
39
+ session_factory: Callable[[], AsyncSession]
35
40
  app_context: AppContext
36
41
 
37
42
 
@@ -55,7 +60,11 @@ async def mcp_lifespan(_: FastMCP) -> AsyncIterator[MCPContext]:
55
60
  if _mcp_db is None:
56
61
  _mcp_db = await app_context.get_db()
57
62
  async with _mcp_db.session_factory() as session:
58
- yield MCPContext(session=session, app_context=app_context)
63
+ yield MCPContext(
64
+ session=session,
65
+ app_context=app_context,
66
+ session_factory=_mcp_db.session_factory,
67
+ )
59
68
 
60
69
 
61
70
  def create_mcp_server(name: str, instructions: str | None = None) -> FastMCP:
@@ -173,7 +182,10 @@ def register_mcp_tools(mcp_server: FastMCP) -> None:
173
182
  # Use the unified application service
174
183
  service = create_code_indexing_application_service(
175
184
  app_context=mcp_context.app_context,
176
- session=mcp_context.session,
185
+ session_factory=mcp_context.session_factory,
186
+ operation=create_server_operation(
187
+ create_task_status_repository(mcp_context.session_factory)
188
+ ),
177
189
  )
178
190
 
179
191
  log.debug("Searching for snippets")
kodit/migrations/env.py CHANGED
@@ -1,4 +1,3 @@
1
- # ruff: noqa: F401
2
1
  """Alembic environment file for kodit."""
3
2
 
4
3
  import asyncio
@@ -0,0 +1,77 @@
1
+ # ruff: noqa
2
+ """add task status
3
+
4
+ Revision ID: b9cd1c3fd762
5
+ Revises: 9cf0e87de578
6
+ Create Date: 2025-09-05 13:41:29.645898
7
+
8
+ """
9
+
10
+ from typing import Sequence, Union
11
+
12
+ from alembic import op
13
+ import sqlalchemy as sa
14
+
15
+
16
+ # revision identifiers, used by Alembic.
17
+ revision: str = "b9cd1c3fd762"
18
+ down_revision: Union[str, None] = "9cf0e87de578"
19
+ branch_labels: Union[str, Sequence[str], None] = None
20
+ depends_on: Union[str, Sequence[str], None] = None
21
+
22
+
23
+ def upgrade() -> None:
24
+ """Upgrade schema."""
25
+ # ### commands auto generated by Alembic - please adjust! ###
26
+ op.create_table(
27
+ "task_status",
28
+ sa.Column("id", sa.String(length=255), nullable=False),
29
+ sa.Column("created_at", sa.DateTime(timezone=True), nullable=False),
30
+ sa.Column("updated_at", sa.DateTime(timezone=True), nullable=False),
31
+ sa.Column("operation", sa.String(length=255), nullable=False),
32
+ sa.Column("trackable_id", sa.Integer(), nullable=True),
33
+ sa.Column("trackable_type", sa.String(length=255), nullable=True),
34
+ sa.Column("parent", sa.String(length=255), nullable=True),
35
+ sa.Column("message", sa.UnicodeText(), nullable=False),
36
+ sa.Column("state", sa.String(length=255), nullable=False),
37
+ sa.Column("error", sa.UnicodeText(), nullable=False),
38
+ sa.Column("total", sa.Integer(), nullable=False),
39
+ sa.Column("current", sa.Integer(), nullable=False),
40
+ sa.ForeignKeyConstraint(
41
+ ["parent"],
42
+ ["task_status.id"],
43
+ ),
44
+ sa.PrimaryKeyConstraint("id"),
45
+ )
46
+ op.create_index(op.f("ix_task_status_id"), "task_status", ["id"], unique=False)
47
+ op.create_index(
48
+ op.f("ix_task_status_operation"), "task_status", ["operation"], unique=False
49
+ )
50
+ op.create_index(
51
+ op.f("ix_task_status_parent"), "task_status", ["parent"], unique=False
52
+ )
53
+ op.create_index(
54
+ op.f("ix_task_status_trackable_id"),
55
+ "task_status",
56
+ ["trackable_id"],
57
+ unique=False,
58
+ )
59
+ op.create_index(
60
+ op.f("ix_task_status_trackable_type"),
61
+ "task_status",
62
+ ["trackable_type"],
63
+ unique=False,
64
+ )
65
+ # ### end Alembic commands ###
66
+
67
+
68
+ def downgrade() -> None:
69
+ """Downgrade schema."""
70
+ # ### commands auto generated by Alembic - please adjust! ###
71
+ op.drop_index(op.f("ix_task_status_trackable_type"), table_name="task_status")
72
+ op.drop_index(op.f("ix_task_status_trackable_id"), table_name="task_status")
73
+ op.drop_index(op.f("ix_task_status_parent"), table_name="task_status")
74
+ op.drop_index(op.f("ix_task_status_operation"), table_name="task_status")
75
+ op.drop_index(op.f("ix_task_status_id"), table_name="task_status")
76
+ op.drop_table("task_status")
77
+ # ### end Alembic commands ###
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kodit
3
- Version: 0.4.1
3
+ Version: 0.4.3
4
4
  Summary: Code indexing for better AI code generation
5
5
  Project-URL: Homepage, https://docs.helixml.tech/kodit/
6
6
  Project-URL: Documentation, https://docs.helixml.tech/kodit/
@@ -1,36 +1,37 @@
1
1
  kodit/.gitignore,sha256=ztkjgRwL9Uud1OEi36hGQeDGk3OLK1NfDEO8YqGYy8o,11
2
2
  kodit/__init__.py,sha256=aEKHYninUq1yh6jaNfvJBYg-6fenpN132nJt1UU6Jxs,59
3
- kodit/_version.py,sha256=k7cu0JKra64gmMNU_UfA5sw2eNc_GRvf3QmesiYAy8g,704
4
- kodit/app.py,sha256=FKqHbJNoHpnBb5KLJaUINDm0a5cHpxlrQ5qNoWnHsBc,4326
5
- kodit/cli.py,sha256=VUZD4cPRgAnrKEWUl2PbS-nOA0FkDVqmJ2SR0g1yJsk,28202
3
+ kodit/_version.py,sha256=bmI9ViMEsJ1Rjce-6ExwiNh2B7sZKTyBkze4k8NsTrU,704
4
+ kodit/app.py,sha256=_AXw_ICyPXkRxXaFPEbeQdSsj5Ybq5z2IEA4XBngXkE,4637
5
+ kodit/cli.py,sha256=1n4pGjnzlZCBhWOJayHo_zFixs1mqkhPP3EosoZRbfE,27385
6
6
  kodit/cli_utils.py,sha256=bW4rIm-elrsyM_pSGHh30zV0_oX7V-64pL3YSaBcOt0,2810
7
- kodit/config.py,sha256=EOyB3BfSDfGJeOts2vrOyX8lhGXbAHVUl69kzjqGHXE,10326
8
- kodit/database.py,sha256=kI9yBm4uunsgV4-QeVoCBL0wLzU4kYmYv5qZilGnbPE,1740
7
+ kodit/config.py,sha256=7q0MR8wKqSeS7_qhswWZPOM0E7aTATvLSW2mkze9CC8,11058
8
+ kodit/database.py,sha256=k93byjVUX1VjAb0hLZxUo4liEKKxAWUBJNw2e7rzaiI,1771
9
9
  kodit/log.py,sha256=ZpM0eMo_DVGQqrHxg0VV6dMrN2AAmu_3C0I3G7p2nMw,8828
10
- kodit/mcp.py,sha256=aEcPc8dQiZaR0AswCZZNxcm_rhhUZNsEBimYti0ibSI,7221
10
+ kodit/mcp.py,sha256=5Qvme_dRW4qeK33av8_PfBKGrhaVx3vOVRs6alG2HP4,7708
11
11
  kodit/middleware.py,sha256=TiwebNpaEmiP7QRuZrfZcCL51IUefQyNLSPuzVyk8UM,2813
12
- kodit/reporting.py,sha256=icce1ZyiADsA_Qz-mSjgn2H4SSqKuGfLKnw-yrl9nsg,2722
13
12
  kodit/application/__init__.py,sha256=mH50wTpgP9dhbKztFsL8Dda9Hi18TSnMVxXtpp4aGOA,35
14
13
  kodit/application/factories/__init__.py,sha256=bU5CvEnaBePZ7JbkCOp1MGTNP752bnU2uEqmfy5FdRk,37
15
- kodit/application/factories/code_indexing_factory.py,sha256=R9f0wsj4-3NJFS5SEt_-OIGR_s_01gJXaL3PkZd8MlU,5911
14
+ kodit/application/factories/code_indexing_factory.py,sha256=KfQnmJmMI3G9yamg3fd3tK0_taPGnqcscmHMFS9LBLw,7353
15
+ kodit/application/factories/reporting_factory.py,sha256=6zZ6Rjh0WXmO0ehafeAOb2xe36bxnOuMBuIFr7DLgfw,1287
16
16
  kodit/application/services/__init__.py,sha256=p5UQNw-H5sxQvs5Etfte93B3cJ1kKW6DNxK34uFvU1E,38
17
- kodit/application/services/auto_indexing_service.py,sha256=O5BNR5HypgghzUFG4ykIWMl9mxHCUExnBmJuITIhECk,3457
18
- kodit/application/services/code_indexing_application_service.py,sha256=nrnd_Md-D0AfNKku7Aqt3YHDbXsBV9f44Z6XsjhiF3E,15877
19
- kodit/application/services/indexing_worker_service.py,sha256=Un4PytnWJU4uwROcxOMUFkt4cD7nmPezaBLsEHrMN6U,5185
20
- kodit/application/services/queue_service.py,sha256=vf_TEl76B0F0RSvfCeGDuM-QFzW-VUuj3zQaRmDPEYI,1921
21
- kodit/application/services/sync_scheduler.py,sha256=aLpEczZdTM8ubfAEY0Ajdh3MLfDcB9s-0ILZJrtIuZs,3504
17
+ kodit/application/services/auto_indexing_service.py,sha256=TiA809X9TUTzRsh_uMCqPQZjq_HpznzN-A4ypDJhWAk,3740
18
+ kodit/application/services/code_indexing_application_service.py,sha256=WzxmIsjrkQMeJViGU-v95AaWr5AKfL2vrWL98Jw7h1c,16708
19
+ kodit/application/services/indexing_worker_service.py,sha256=z5fZuUk_iPfcCST0ywPqiEWZaQHhyRbxEGps8e1y2BY,5182
20
+ kodit/application/services/queue_service.py,sha256=G42lR31maFRZ9cSvnWZrzeyb4P1R6yFqrcHWVKAqc9U,1924
21
+ kodit/application/services/reporting.py,sha256=UkDa23ifz9eF8vxrD8L2T4-_sYtMTgKQUfZkiy3SN8s,3598
22
+ kodit/application/services/sync_scheduler.py,sha256=FUUpDtxUh7Eg-lnzOrUHzmSWGpzdpYJQYgPhnQYwTcg,3446
22
23
  kodit/domain/__init__.py,sha256=TCpg4Xx-oF4mKV91lo4iXqMEfBT1OoRSYnbG-zVWolA,66
23
- kodit/domain/entities.py,sha256=QsCzKXT7gF9jTPAjJo5lqjFGRsIklAFC2qRy_Gt3RbA,10377
24
+ kodit/domain/entities.py,sha256=pCvBSLK5hutZtiZ0OAcIW1WBswZNKQBh8BzZeuwGvyk,13353
24
25
  kodit/domain/errors.py,sha256=yIsgCjM_yOFIg8l7l-t7jM8pgeAX4cfPq0owf7iz3DA,106
25
- kodit/domain/interfaces.py,sha256=Jkd0Ob4qSvhZHI9jRPFQ1n5Cv0SvU-y3Z-HCw2ikc4I,742
26
- kodit/domain/protocols.py,sha256=GA0CCvmhvQ3F4MseeQUVw3NeIgUoaV7V_7TdAaU70Is,2587
27
- kodit/domain/value_objects.py,sha256=dkfbg99PSCrfj6nJ7tZ2UzDG3QUgNa_Cpj2gLakDM5k,17512
26
+ kodit/domain/protocols.py,sha256=tKl7zzS3k5n4czN7TSwjJp0DauPz_IcZjJN3qgE2d_M,3317
27
+ kodit/domain/value_objects.py,sha256=CQ3qS3g_zYghiY1pYrC6kVngSuJwctFSW3yKdOvVOpQ,18827
28
28
  kodit/domain/services/__init__.py,sha256=Q1GhCK_PqKHYwYE4tkwDz5BIyXkJngLBBOHhzvX8nzo,42
29
- kodit/domain/services/bm25_service.py,sha256=nsfTan3XtDwXuuAu1LUv-6Jukm6qFKVqqCVymjyepZQ,3625
29
+ kodit/domain/services/bm25_service.py,sha256=seRo0V-zW6Uq-Y67j0-zp1xz93gbfQgvlEbpQeYHN1U,3529
30
30
  kodit/domain/services/embedding_service.py,sha256=7drYRC2kjg0WJmo06a2E9N0vDnwInUlBB96twjz2BT8,4526
31
31
  kodit/domain/services/enrichment_service.py,sha256=XsXg3nV-KN4rqtC7Zro_ZiZ6RSq-1eA1MG6IDzFGyBA,1316
32
32
  kodit/domain/services/index_query_service.py,sha256=cDQkgpJ3JbyeZ3z3GTIqH1JzhhKE_LBIwYE6b-lakwU,2172
33
- kodit/domain/services/index_service.py,sha256=uVwDUEQWfZ5yJRvcjaWW7P9gCZttmnlkI51IHz52eew,11554
33
+ kodit/domain/services/index_service.py,sha256=4iROJC5RGKhf9P3SrvW9jjichGTQRqweVWskYF5ltac,10637
34
+ kodit/domain/services/task_status_query_service.py,sha256=R2YPl42sdt8stUvPmIPxVG5WDcohT0yLESs_i0Y14lI,727
34
35
  kodit/infrastructure/__init__.py,sha256=HzEYIjoXnkz_i_MHO2e0sIVYweUcRnl2RpyBiTbMObU,28
35
36
  kodit/infrastructure/api/__init__.py,sha256=U0TSMPpHrlj1zbAtleuZjU3nXGwudyMe-veNBgvODwM,34
36
37
  kodit/infrastructure/api/client/__init__.py,sha256=6RSYqeuxjDe_zTUq48D0F-VfBBUvDmTkO3K3vD61q3I,349
@@ -42,9 +43,9 @@ kodit/infrastructure/api/client/search_client.py,sha256=f4mM5ZJpAuR7w-i9yASbh4SY
42
43
  kodit/infrastructure/api/middleware/__init__.py,sha256=6m7eE5k5buboJbuzyX5E9-Tf99yNwFaeJF0f_6HwLyM,30
43
44
  kodit/infrastructure/api/middleware/auth.py,sha256=QSnMcMLWvfumqN1iG4ePj2vEZb2Dlsgr-WHptkEkkhE,1064
44
45
  kodit/infrastructure/api/v1/__init__.py,sha256=hQ03es21FSgzQlmdP5xWZzK80woIvuYGjiZLwFYuYwk,151
45
- kodit/infrastructure/api/v1/dependencies.py,sha256=jaM000IfSnvU8uzwnC1cBZsfsMC-19jWFjObHfqBYuM,2475
46
+ kodit/infrastructure/api/v1/dependencies.py,sha256=NPfRXe-Tsj4R4GPSrU1jOp6JTMr3E-0M19xG78pft2I,3457
46
47
  kodit/infrastructure/api/v1/routers/__init__.py,sha256=YYyeiuyphIPc-Q_2totF8zfR0BoseOH4ZYFdHP0ed_M,218
47
- kodit/infrastructure/api/v1/routers/indexes.py,sha256=_lUir1M0SW6kPHeGqjiPjtSa50rY4PN2es5TZEpSHYE,3442
48
+ kodit/infrastructure/api/v1/routers/indexes.py,sha256=BslFWHw1DWH8rpm9fWOH1foQl62F22jZ8rNF7YGBIZE,4905
48
49
  kodit/infrastructure/api/v1/routers/queue.py,sha256=EZbR-G0qDO9W5ajV_75GRk2pW1Qdgc0ggOwrGKlBE2A,2138
49
50
  kodit/infrastructure/api/v1/routers/search.py,sha256=da9YTR6VTzU85_6X3aaZemdTHGCEvcPNeKuMFBgmT_A,2452
50
51
  kodit/infrastructure/api/v1/schemas/__init__.py,sha256=_5BVqv4EUi_vvWlAQOE_VfRulUDAF21ZQ7z27y7YOdw,498
@@ -52,6 +53,7 @@ kodit/infrastructure/api/v1/schemas/context.py,sha256=NlsIn9j1R3se7JkGZivS_CUN4g
52
53
  kodit/infrastructure/api/v1/schemas/index.py,sha256=NtL09YtO50h-ddpAFxNf-dyxu_Xi5v3yOpKW0W4xsAM,1950
53
54
  kodit/infrastructure/api/v1/schemas/queue.py,sha256=oa4wumWOvGzi53Q3cjwIrQJRoentp5nsQSsaj-l-B4U,652
54
55
  kodit/infrastructure/api/v1/schemas/search.py,sha256=CWzg5SIMUJ_4yM-ZfgSLWCanMxov6AyGgQQcOMkRlGw,5618
56
+ kodit/infrastructure/api/v1/schemas/task_status.py,sha256=WVB7QdSEg1lKZh_H4sCe-zFdAZA3hCUoxvqCZmhlMXQ,1220
55
57
  kodit/infrastructure/bm25/__init__.py,sha256=DmGbrEO34FOJy4e685BbyxLA7gPW1eqs2gAxsp6JOuM,34
56
58
  kodit/infrastructure/bm25/bm25_factory.py,sha256=I4eo7qRslnyXIRkBf-StZ5ga2Evrr5J5YFocTChFD3g,884
57
59
  kodit/infrastructure/bm25/local_bm25_repository.py,sha256=qdDRiiap168XivjkukRHVj1fxlprqRIG0iRSaseLv5I,4695
@@ -59,45 +61,49 @@ kodit/infrastructure/bm25/vectorchord_bm25_repository.py,sha256=p6ht5K-jlDTvEkmo
59
61
  kodit/infrastructure/cloning/__init__.py,sha256=IzIvX-yeRRFZ-lfvPVSEe_qXszO6DGQdjKwwDigexyQ,30
60
62
  kodit/infrastructure/cloning/metadata.py,sha256=GD2UnCC1oR82RD0SVUqk9CJOqzXPxhOAHVOp7jqN6Qc,3571
61
63
  kodit/infrastructure/cloning/git/__init__.py,sha256=20ePcp0qE6BuLsjsv4KYB1DzKhMIMsPXwEqIEZtjTJs,34
62
- kodit/infrastructure/cloning/git/working_copy.py,sha256=qYcrR5qP1rhWZiYGMT1p-1Alavi_YvQLXx4MgIV7eXs,2611
64
+ kodit/infrastructure/cloning/git/working_copy.py,sha256=-DPHW9YZ-wyCC-etkIurFurW-Ef-xIJfa05TCPAD4tc,3909
63
65
  kodit/infrastructure/embedding/__init__.py,sha256=F-8nLlWAerYJ0MOIA4tbXHLan8bW5rRR84vzxx6tRKI,39
64
- kodit/infrastructure/embedding/embedding_factory.py,sha256=wngBD2g6NniHDq_-KcYhhwSvmcMYyI8yIzoXvGQvu1U,3287
66
+ kodit/infrastructure/embedding/embedding_factory.py,sha256=BNhrrYQAkcnXkuuQy-Q-lwJhyoGONsTsbgN4t0UdGeY,3395
65
67
  kodit/infrastructure/embedding/local_vector_search_repository.py,sha256=ExweyNEL5cP-g3eDhGqZSih7zhdOrop2WdFPPJL-tB4,3505
66
68
  kodit/infrastructure/embedding/vectorchord_vector_search_repository.py,sha256=PIoU0HsDlaoXDXnGjOR0LAkAcW4JiE3ymJy_SBhEopc,8030
67
69
  kodit/infrastructure/embedding/embedding_providers/__init__.py,sha256=qeZ-oAIAxMl5QqebGtO1lq-tHjl_ucAwOXePklcwwGk,34
68
70
  kodit/infrastructure/embedding/embedding_providers/batching.py,sha256=a8CL9PX2VLmbeg616fc_lQzfC4BWTVn32m4SEhXpHxc,3279
69
71
  kodit/infrastructure/embedding/embedding_providers/hash_embedding_provider.py,sha256=V6OdCuWyQQOvo3OJGRi-gBKDApIcrELydFg7T696P5s,2257
70
- kodit/infrastructure/embedding/embedding_providers/litellm_embedding_provider.py,sha256=5LCrPSQn3ZaLZ1XTKzJV_LzANH7FdaR4NL-gJupaiDE,5579
72
+ kodit/infrastructure/embedding/embedding_providers/litellm_embedding_provider.py,sha256=9Q5he_MI8xXENODwCvYCbhVawTjTv1bArGQrmxoWLas,5297
71
73
  kodit/infrastructure/embedding/embedding_providers/local_embedding_provider.py,sha256=9aLV1Zg4KMhYWlGRwgAUtswW4aIabNqbsipWhAn64RI,4133
72
74
  kodit/infrastructure/enrichment/__init__.py,sha256=8acZKNzql8Fs0lceFu9U3KoUrOptRBtVIxr_Iw6lz3Y,40
73
75
  kodit/infrastructure/enrichment/enrichment_factory.py,sha256=NFGY6u9SJ_GOgiB_RtotbQmte0kGFQUymwzZCbbsx34,1530
74
76
  kodit/infrastructure/enrichment/litellm_enrichment_provider.py,sha256=AM4-4KApDndzWzQzzKAedy21iGMhkwylR5VCmV9K-uI,6040
75
- kodit/infrastructure/enrichment/local_enrichment_provider.py,sha256=aVU3_kbLJ0BihwGIwvJ00DBe0voHkiKdFSjPxxkVfVA,4150
77
+ kodit/infrastructure/enrichment/local_enrichment_provider.py,sha256=6WVVt5Nlq8mDGSRCOTjjVPMDCUyMgW-cxCzZv3WfP7k,4589
76
78
  kodit/infrastructure/enrichment/null_enrichment_provider.py,sha256=DhZkJBnkvXg_XSAs-oKiFnKqYFPnmTl3ikdxrqeEfbc,713
77
79
  kodit/infrastructure/enrichment/utils.py,sha256=FE9UCuxxzSdoHrmAC8Si2b5D6Nf6kVqgM1yjUVyCvW0,930
78
80
  kodit/infrastructure/git/__init__.py,sha256=0iMosFzudj4_xNIMe2SRbV6l5bWqkjnUsZoFsoZFuM8,33
79
- kodit/infrastructure/git/git_utils.py,sha256=3Fg2ZX9pkp8Mk1mWuW30PSO_ZKXrPL7wTCS9TMTfIUM,765
81
+ kodit/infrastructure/git/git_utils.py,sha256=5lH94AcF7Hac4h6kBzo_B9pzC1S6AK2-Dy13gz--Zf0,781
80
82
  kodit/infrastructure/ignore/__init__.py,sha256=VzFv8XOzHmsu0MEGnWVSF6KsgqLBmvHlRqAkT1Xb1MY,36
81
83
  kodit/infrastructure/ignore/ignore_pattern_provider.py,sha256=zdxun3GodLfXxyssBK8QDUK58xb4fBJ0SKcHUyn3pzM,2131
82
84
  kodit/infrastructure/indexing/__init__.py,sha256=7UPRa2jwCAsa0Orsp6PqXSF8iIXJVzXHMFmrKkI9yH8,38
83
85
  kodit/infrastructure/indexing/fusion_service.py,sha256=2B0guBsuKz19uWcs18sIJpUJPzXoRvULgl7UNWQGysA,1809
84
86
  kodit/infrastructure/mappers/__init__.py,sha256=QPHOjNreXmBPPovZ6elnYFS0vD-IsmrGl4TT01FCKro,77
85
- kodit/infrastructure/mappers/index_mapper.py,sha256=ZSfu8kjTaa8_UY0nTqr4b02NS3VrjqZYkduCN71AL2g,12743
87
+ kodit/infrastructure/mappers/index_mapper.py,sha256=XWtv_him2Sd9dR-Jy_ndy9jYXVtv3LttzmmUGzNK6CE,12825
86
88
  kodit/infrastructure/mappers/task_mapper.py,sha256=QW7uL8rji6QJ7RRdHwbvkWqmwDcUDGTYPLwbwiKlViY,2919
89
+ kodit/infrastructure/mappers/task_status_mapper.py,sha256=5lo_jS2EKYg4czOOAFmrWfQl3OojIokwpzhaR3b1wE0,3433
90
+ kodit/infrastructure/reporting/__init__.py,sha256=4Qu38YbDOaeDqLdT_CbK8tOZHTKGrHRXncVKlGRzOeQ,32
91
+ kodit/infrastructure/reporting/db_progress.py,sha256=VVaCKjC_UFwdRptXbBroG9qhXCxI4bZmElf1PMsBzWA,819
92
+ kodit/infrastructure/reporting/log_progress.py,sha256=dXy-xwIFLBnVTDPJd_h6e9iszmpQHvUUXAiVMLkOCWQ,1202
93
+ kodit/infrastructure/reporting/tdqm_progress.py,sha256=-7ZrxTcb1L1tNiBGb5W_HKQ_uBNyMdeuelS3ZW3Wl3E,1288
87
94
  kodit/infrastructure/slicing/__init__.py,sha256=x7cjvHA9Ay2weUYE_dpdAaPaStp20M-4U2b5MLgT5KM,37
88
95
  kodit/infrastructure/slicing/language_detection_service.py,sha256=JGJXrq9bLyfnisWJXeP7y1jbZMmKAISdPBlRBCosUcE,684
89
96
  kodit/infrastructure/slicing/slicer.py,sha256=GOqJykd00waOTO1WJHyE5KUgJ2RLx2rOQ7M7T_u5LLg,35600
90
97
  kodit/infrastructure/sqlalchemy/__init__.py,sha256=UXPMSF_hgWaqr86cawRVqM8XdVNumQyyK5B8B97GnlA,33
91
- kodit/infrastructure/sqlalchemy/embedding_repository.py,sha256=dC2Wzj_zQiWExwfScE1LAGiiyxPyg0YepwyLOgDwcs4,7905
92
- kodit/infrastructure/sqlalchemy/entities.py,sha256=2iG_2NoKS26rJXimLFL8whRqFsUvKNGFAXCkQYK5GtE,6951
93
- kodit/infrastructure/sqlalchemy/index_repository.py,sha256=QQNsyLBI09YLUPLguB9qvqPZMxtg1p2twpm7sO_gNlo,23598
94
- kodit/infrastructure/sqlalchemy/task_repository.py,sha256=yazMO6Kw0Pb2b3L8wlGKOFA0QuMFcWBUXYFGZdtZo0w,2874
95
- kodit/infrastructure/ui/__init__.py,sha256=CzbLOBwIZ6B6iAHEd1L8cIBydCj-n_kobxJAhz2I9_Y,32
96
- kodit/infrastructure/ui/progress.py,sha256=SHEUoQA_x36z4nqHrQduVrrWIvFfX6QxAawC7zQ50pw,6433
97
- kodit/infrastructure/ui/spinner.py,sha256=GcP115qtR0VEnGfMEtsGoAUpRzVGUSfiUXfoJJERngA,2357
98
+ kodit/infrastructure/sqlalchemy/embedding_repository.py,sha256=YYxbUEdzDdlKdy0FyAP4EzhJMAIdEnNZiXT6hzPHk9I,7731
99
+ kodit/infrastructure/sqlalchemy/entities.py,sha256=QTtLlWFeFH8R3y4RWPESXk5IYMlVwAAAaJJsmg5OacY,9978
100
+ kodit/infrastructure/sqlalchemy/index_repository.py,sha256=x8MPl0j7GrW_lEZh464EZyb0w935p_EHv2NIMNxjJu0,25680
101
+ kodit/infrastructure/sqlalchemy/task_repository.py,sha256=60ECbxiXC2_UR80f4uPSmJiP_so7PTBzZG_w1WXSiuE,3546
102
+ kodit/infrastructure/sqlalchemy/task_status_repository.py,sha256=xZm4j7V0NUD3OFj4o1Mwv1K8ngSoqWKlgFBgrVlWBxo,3283
103
+ kodit/infrastructure/sqlalchemy/unit_of_work.py,sha256=gK-C8yk2HYBrAEDrblWxBrldrGb83SBHn-8lURkFeMg,2093
98
104
  kodit/migrations/README,sha256=ISVtAOvqvKk_5ThM5ioJE-lMkvf9IbknFUFVU_vPma4,58
99
105
  kodit/migrations/__init__.py,sha256=lP5MuwlyWRMO6UcDWnQcQ3G-GYHcFb6rl9gYPHJ1sjo,40
100
- kodit/migrations/env.py,sha256=m57TkFLYjQ4w2aw1YICXkeek27M6qjwRDMHvThWqIL0,2383
106
+ kodit/migrations/env.py,sha256=asxYDVHeIPjM43SkF6b0raVOe-xKykyJTtjxXiSj4Bo,2364
101
107
  kodit/migrations/script.py.mako,sha256=zWziKtiwYKEWuwPV_HBNHwa9LCT45_bi01-uSNFaOOE,703
102
108
  kodit/migrations/versions/4073b33f9436_add_file_processing_flag.py,sha256=c8dMcKQ-BBBr_2-92eJZFS3Fwe3__B2eNqvQeMZHs0w,917
103
109
  kodit/migrations/versions/4552eb3f23ce_add_summary.py,sha256=WjyBQzFK8IXuvta15YBE23yaTMM1rZCXvPxW98MStng,870
@@ -106,13 +112,14 @@ kodit/migrations/versions/85155663351e_initial.py,sha256=h8DWmSxVwTtWlmWNH8-S4Ax
106
112
  kodit/migrations/versions/9cf0e87de578_add_queue.py,sha256=FYrco38f3_-1ZRfGOU617bgR1Ta0YTwwz3QDQMw_NKY,1600
107
113
  kodit/migrations/versions/9e53ea8bb3b0_add_authors.py,sha256=a32Zm8KUQyiiLkjKNPYdaJDgjW6VsV-GhaLnPnK_fpI,3884
108
114
  kodit/migrations/versions/__init__.py,sha256=9-lHzptItTzq_fomdIRBegQNm4Znx6pVjwD4MiqRIdo,36
115
+ kodit/migrations/versions/b9cd1c3fd762_add_task_status.py,sha256=7cgdMKu4OBidL0ER8AGgyerfSfEk1I3XHo6Kh0sCzIQ,2754
109
116
  kodit/migrations/versions/c3f5137d30f5_index_all_the_things.py,sha256=r7ukmJ_axXLAWewYx-F1fEmZ4JbtFd37i7cSb0tq3y0,1722
110
117
  kodit/utils/__init__.py,sha256=DPEB1i8evnLF4Ns3huuAYg-0pKBFKUFuiDzOKG9r-sw,33
111
118
  kodit/utils/dump_openapi.py,sha256=29VdjHpNSaGAg7RjQw0meq1OLhljCx1ElgBlTC8xoF4,1247
112
119
  kodit/utils/generate_api_paths.py,sha256=TMtx9v55podDfUmiWaHgJHLtEWLV2sLL-5ejGFMPzAo,3569
113
120
  kodit/utils/path_utils.py,sha256=thK6YGGNvQThdBaCYCCeCvS1L8x-lwl3AoGht2jnjGw,1645
114
- kodit-0.4.1.dist-info/METADATA,sha256=Mf4UuPg2D08hfp1STtsZ1DwOHA2a1J4ba5_-T7Pifr4,7702
115
- kodit-0.4.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
116
- kodit-0.4.1.dist-info/entry_points.txt,sha256=hoTn-1aKyTItjnY91fnO-rV5uaWQLQ-Vi7V5et2IbHY,40
117
- kodit-0.4.1.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
118
- kodit-0.4.1.dist-info/RECORD,,
121
+ kodit-0.4.3.dist-info/METADATA,sha256=HGyP_rA98DrqrsLJWOvUmRkbmRrrYd-p9czPjiF38aI,7702
122
+ kodit-0.4.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
123
+ kodit-0.4.3.dist-info/entry_points.txt,sha256=hoTn-1aKyTItjnY91fnO-rV5uaWQLQ-Vi7V5et2IbHY,40
124
+ kodit-0.4.3.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
125
+ kodit-0.4.3.dist-info/RECORD,,
@@ -1,27 +0,0 @@
1
- """Domain interfaces."""
2
-
3
- from abc import ABC, abstractmethod
4
-
5
- from kodit.domain.value_objects import ProgressEvent
6
-
7
-
8
- class ProgressCallback(ABC):
9
- """Abstract interface for progress callbacks."""
10
-
11
- @abstractmethod
12
- async def on_progress(self, event: ProgressEvent) -> None:
13
- """On progress hook."""
14
-
15
- @abstractmethod
16
- async def on_complete(self, operation: str) -> None:
17
- """On complete hook."""
18
-
19
-
20
- class NullProgressCallback(ProgressCallback):
21
- """Null implementation of progress callback that does nothing."""
22
-
23
- async def on_progress(self, event: ProgressEvent) -> None:
24
- """Do nothing on progress."""
25
-
26
- async def on_complete(self, operation: str) -> None:
27
- """Do nothing on complete."""
@@ -1 +0,0 @@
1
- """UI infrastructure module."""