pulse-engine 0.2.3__tar.gz → 0.2.4__tar.gz

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 (149) hide show
  1. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/PKG-INFO +1 -1
  2. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/pyproject.toml +1 -1
  3. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/pipeline/models.py +1 -3
  4. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/pipeline/repositories.py +7 -15
  5. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/pipeline/router_modules.py +6 -9
  6. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/pipeline/schemas.py +0 -2
  7. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/pipeline/service.py +1 -1
  8. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/README.md +0 -0
  9. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/__init__.py +0 -0
  10. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/adapters/__init__.py +0 -0
  11. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/adapters/audio_transcription.py +0 -0
  12. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/adapters/batcher.py +0 -0
  13. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/adapters/digital_news.py +0 -0
  14. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/adapters/digital_news_metadata.py +0 -0
  15. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/adapters/exceptions.py +0 -0
  16. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/adapters/models.py +0 -0
  17. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/adapters/opensearch_storage.py +0 -0
  18. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/adapters/speech_content.py +0 -0
  19. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/adapters/speech_metadata.py +0 -0
  20. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/adapters/twitter.py +0 -0
  21. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/adapters/youtube_downloader.py +0 -0
  22. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/adapters/youtube_metadata.py +0 -0
  23. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/api/__init__.py +0 -0
  24. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/api/v1/__init__.py +0 -0
  25. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/api/v1/auth.py +0 -0
  26. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/api/v1/health.py +0 -0
  27. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/api/v1/router.py +0 -0
  28. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/chain_recovery.py +0 -0
  29. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/cli/__init__.py +0 -0
  30. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/cli/main.py +0 -0
  31. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/cli/templates/cookiecutter.json +0 -0
  32. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/cli/templates/pulse-{{cookiecutter.product_name}}/.gitignore +0 -0
  33. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/cli/templates/pulse-{{cookiecutter.product_name}}/Dockerfile +0 -0
  34. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/cli/templates/pulse-{{cookiecutter.product_name}}/pipeline.yaml +0 -0
  35. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/cli/templates/pulse-{{cookiecutter.product_name}}/pyproject.toml +0 -0
  36. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/cli/templates/pulse-{{cookiecutter.product_name}}/src/pulse_{{cookiecutter.product_slug}}/__init__.py +0 -0
  37. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/cli/templates/pulse-{{cookiecutter.product_name}}/tests/__init__.py +0 -0
  38. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/cli/templates/pulse-{{cookiecutter.product_name}}/tests/unit/__init__.py +0 -0
  39. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/cli/templates/pulse-{{cookiecutter.product_name}}/tests/unit/test_manifest.py +0 -0
  40. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/client.py +0 -0
  41. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/config.py +0 -0
  42. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/core/__init__.py +0 -0
  43. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/core/error_handlers.py +0 -0
  44. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/core/exceptions.py +0 -0
  45. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/core/job_token.py +0 -0
  46. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/core/logging.py +0 -0
  47. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/core/scope.py +0 -0
  48. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/core/security.py +0 -0
  49. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/database.py +0 -0
  50. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/dependencies.py +0 -0
  51. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/deployment/__init__.py +0 -0
  52. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/deployment/backend_deployment_repository.py +0 -0
  53. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/deployment/backends/__init__.py +0 -0
  54. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/deployment/backends/base.py +0 -0
  55. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/deployment/backends/exceptions.py +0 -0
  56. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/deployment/backends/native_lambda.py +0 -0
  57. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/deployment/backends/prefect_ecs.py +0 -0
  58. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/deployment/backends/prefect_k8s.py +0 -0
  59. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/deployment/backends/registry.py +0 -0
  60. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/deployment/infra_provisioner.py +0 -0
  61. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/deployment/job_launcher.py +0 -0
  62. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/deployment/models.py +0 -0
  63. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/deployment/repository.py +0 -0
  64. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/deployment/router.py +0 -0
  65. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/deployment/schemas.py +0 -0
  66. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/deployment/service.py +0 -0
  67. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/extractor/__init__.py +0 -0
  68. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/extractor/adapters/__init__.py +0 -0
  69. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/extractor/base.py +0 -0
  70. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/extractor/models.py +0 -0
  71. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/extractor/orchestrator/__init__.py +0 -0
  72. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/extractor/orchestrator/base.py +0 -0
  73. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/extractor/orchestrator/noop.py +0 -0
  74. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/extractor/orchestrator/prefect.py +0 -0
  75. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/extractor/repository.py +0 -0
  76. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/extractor/router.py +0 -0
  77. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/extractor/schemas.py +0 -0
  78. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/extractor/service.py +0 -0
  79. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/extractor/stage_models.py +0 -0
  80. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/extractor/stage_repository.py +0 -0
  81. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/main.py +0 -0
  82. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/mcp/__init__.py +0 -0
  83. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/mcp/__main__.py +0 -0
  84. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/mcp/server.py +0 -0
  85. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/mcp/tools_jobs.py +0 -0
  86. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/mcp/tools_kb.py +0 -0
  87. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/mcp/tools_modules.py +0 -0
  88. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/mcp/tools_pipelines.py +0 -0
  89. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/mcp/tools_processor.py +0 -0
  90. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/middleware/__init__.py +0 -0
  91. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/middleware/rate_limit.py +0 -0
  92. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/middleware/request_id.py +0 -0
  93. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/middleware/security_headers.py +0 -0
  94. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/middleware/tenant.py +0 -0
  95. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/pipeline/__init__.py +0 -0
  96. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/pipeline/config_parser.py +0 -0
  97. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/pipeline/expression.py +0 -0
  98. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/pipeline/router_pipelines.py +0 -0
  99. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/pipeline/translators/__init__.py +0 -0
  100. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/pipeline/translators/airflow_status.py +0 -0
  101. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/pipeline/translators/airflow_translator.py +0 -0
  102. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/pipeline/translators/base.py +0 -0
  103. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/pipeline/translators/prefect_status.py +0 -0
  104. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/pipeline/translators/prefect_translator.py +0 -0
  105. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/processor/__init__.py +0 -0
  106. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/processor/base.py +0 -0
  107. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/processor/core/__init__.py +0 -0
  108. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/processor/core/analysis.py +0 -0
  109. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/processor/core/chunking.py +0 -0
  110. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/processor/core/prompts.py +0 -0
  111. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/processor/core/topic_splitter.py +0 -0
  112. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/processor/defaults/__init__.py +0 -0
  113. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/processor/defaults/core_processor.py +0 -0
  114. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/processor/defaults/postprocessor.py +0 -0
  115. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/processor/defaults/preprocessor.py +0 -0
  116. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/processor/llm/__init__.py +0 -0
  117. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/processor/llm/provider.py +0 -0
  118. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/processor/ocr/gemini.py +0 -0
  119. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/processor/pipeline.py +0 -0
  120. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/processor/postprocessor/__init__.py +0 -0
  121. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/processor/postprocessor/embeddings.py +0 -0
  122. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/processor/postprocessor/tasks.py +0 -0
  123. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/processor/preprocessor/__init__.py +0 -0
  124. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/processor/preprocessor/tasks.py +0 -0
  125. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/processor/router.py +0 -0
  126. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/processor/schemas.py +0 -0
  127. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/registry.py +0 -0
  128. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/runners/__init__.py +0 -0
  129. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/runners/lambda_runner.py +0 -0
  130. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/runners/pipeline_runner.py +0 -0
  131. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/runners/prefect_pipeline_flow.py +0 -0
  132. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/runners/prefect_runner.py +0 -0
  133. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/s3.py +0 -0
  134. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/secrets.py +0 -0
  135. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/services/__init__.py +0 -0
  136. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/services/bootstrap.py +0 -0
  137. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/services/opensearch.py +0 -0
  138. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/storage/__init__.py +0 -0
  139. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/storage/connectors/__init__.py +0 -0
  140. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/storage/connectors/athena.py +0 -0
  141. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/storage/connectors/base.py +0 -0
  142. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/storage/connectors/opensearch.py +0 -0
  143. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/storage/knowledge_base.py +0 -0
  144. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/storage/router.py +0 -0
  145. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/storage/schemas.py +0 -0
  146. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/testing/__init__.py +0 -0
  147. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/testing/fixtures.py +0 -0
  148. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/testing/mocks.py +0 -0
  149. {pulse_engine-0.2.3 → pulse_engine-0.2.4}/src/pulse_engine/worker.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pulse-engine
3
- Version: 0.2.3
3
+ Version: 0.2.4
4
4
  Summary: Pulse Engine — Hybrid framework for building Pulse products
5
5
  Author: Pulse Team
6
6
  Requires-Python: >=3.11,<3.13
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "pulse-engine"
3
- version = "0.2.3"
3
+ version = "0.2.4"
4
4
  description = "Pulse Engine — Hybrid framework for building Pulse products"
5
5
  authors = ["Pulse Team"]
6
6
  readme = "README.md"
@@ -17,7 +17,6 @@ class ModuleRegistryModel(Base):
17
17
  String(36), primary_key=True, default=lambda: str(uuid.uuid4())
18
18
  )
19
19
  tenant_id: Mapped[str] = mapped_column(String(255), nullable=False)
20
- product: Mapped[str] = mapped_column(String(255), nullable=False)
21
20
  module_name: Mapped[str] = mapped_column(String(255), nullable=False)
22
21
  image: Mapped[str] = mapped_column(Text, nullable=False)
23
22
  created_at: Mapped[datetime] = mapped_column(
@@ -29,9 +28,8 @@ class ModuleRegistryModel(Base):
29
28
 
30
29
  __table_args__ = (
31
30
  Index(
32
- "uq_module_registry_product_module",
31
+ "uq_module_registry_tenant_module",
33
32
  "tenant_id",
34
- "product",
35
33
  "module_name",
36
34
  unique=True,
37
35
  ),
@@ -19,9 +19,9 @@ class ModuleRegistryRepository:
19
19
  self._session = session
20
20
 
21
21
  async def upsert(
22
- self, tenant_id: str, product: str, module_name: str, image: str
22
+ self, tenant_id: str, module_name: str, image: str
23
23
  ) -> ModuleRegistryModel:
24
- existing = await self.get(tenant_id, product, module_name)
24
+ existing = await self.get(tenant_id, module_name)
25
25
  if existing:
26
26
  existing.image = image
27
27
  await self._session.flush()
@@ -30,7 +30,6 @@ class ModuleRegistryRepository:
30
30
  model = ModuleRegistryModel(
31
31
  id=str(uuid.uuid4()),
32
32
  tenant_id=tenant_id,
33
- product=product,
34
33
  module_name=module_name,
35
34
  image=image,
36
35
  )
@@ -38,35 +37,28 @@ class ModuleRegistryRepository:
38
37
  await self._session.flush()
39
38
  return model
40
39
 
41
- async def get(
42
- self, tenant_id: str, product: str, module_name: str
43
- ) -> ModuleRegistryModel | None:
40
+ async def get(self, tenant_id: str, module_name: str) -> ModuleRegistryModel | None:
44
41
  stmt = select(ModuleRegistryModel).where(
45
42
  ModuleRegistryModel.tenant_id == tenant_id,
46
- ModuleRegistryModel.product == product,
47
43
  ModuleRegistryModel.module_name == module_name,
48
44
  )
49
45
  result = await self._session.execute(stmt)
50
46
  return result.scalar_one_or_none()
51
47
 
52
- async def list_by_product(
53
- self, tenant_id: str, product: str
54
- ) -> list[ModuleRegistryModel]:
48
+ async def list_all(self, tenant_id: str) -> list[ModuleRegistryModel]:
55
49
  stmt = select(ModuleRegistryModel).where(
56
50
  ModuleRegistryModel.tenant_id == tenant_id,
57
- ModuleRegistryModel.product == product,
58
51
  )
59
52
  result = await self._session.execute(stmt)
60
53
  return list(result.scalars().all())
61
54
 
62
- async def get_images_map(self, tenant_id: str, product: str) -> dict[str, str]:
63
- modules = await self.list_by_product(tenant_id, product)
55
+ async def get_images_map(self, tenant_id: str) -> dict[str, str]:
56
+ modules = await self.list_all(tenant_id)
64
57
  return {m.module_name: m.image for m in modules}
65
58
 
66
- async def delete(self, tenant_id: str, product: str, module_name: str) -> bool:
59
+ async def delete(self, tenant_id: str, module_name: str) -> bool:
67
60
  stmt = delete(ModuleRegistryModel).where(
68
61
  ModuleRegistryModel.tenant_id == tenant_id,
69
- ModuleRegistryModel.product == product,
70
62
  ModuleRegistryModel.module_name == module_name,
71
63
  )
72
64
  result = await self._session.execute(stmt)
@@ -34,33 +34,30 @@ async def register_modules(
34
34
  ) -> RegisterModulesResponse:
35
35
  result_modules: dict[str, dict[str, str]] = {}
36
36
  for module_name, module_def in body.modules.items():
37
- await repo.upsert(tenant_id, body.product, module_name, module_def.image)
37
+ await repo.upsert(tenant_id, module_name, module_def.image)
38
38
  result_modules[module_name] = {"status": "registered"}
39
39
 
40
- return RegisterModulesResponse(product=body.product, modules=result_modules)
40
+ return RegisterModulesResponse(modules=result_modules)
41
41
 
42
42
 
43
- @router.get("/{product}")
43
+ @router.get("")
44
44
  async def list_modules(
45
- product: str,
46
45
  tenant_id: str = Depends(get_tenant_id),
47
46
  repo: ModuleRegistryRepository = Depends(get_module_registry_repo),
48
47
  ) -> dict[str, Any]:
49
- modules = await repo.list_by_product(tenant_id, product)
48
+ modules = await repo.list_all(tenant_id)
50
49
  return {
51
- "product": product,
52
50
  "modules": {m.module_name: {"image": m.image} for m in modules},
53
51
  }
54
52
 
55
53
 
56
- @router.delete("/{product}/{module_name}", status_code=status.HTTP_204_NO_CONTENT)
54
+ @router.delete("/{module_name}", status_code=status.HTTP_204_NO_CONTENT)
57
55
  async def delete_module(
58
- product: str,
59
56
  module_name: str,
60
57
  tenant_id: str = Depends(get_tenant_id),
61
58
  repo: ModuleRegistryRepository = Depends(get_module_registry_repo),
62
59
  ) -> Response:
63
- deleted = await repo.delete(tenant_id, product, module_name)
60
+ deleted = await repo.delete(tenant_id, module_name)
64
61
  if not deleted:
65
62
  raise HTTPException(status_code=404, detail=f"Module '{module_name}' not found")
66
63
  return Response(status_code=status.HTTP_204_NO_CONTENT)
@@ -184,12 +184,10 @@ class TriggerResponse(BaseModel):
184
184
 
185
185
 
186
186
  class RegisterModulesRequest(BaseModel):
187
- product: str
188
187
  modules: dict[str, ModuleImageDef]
189
188
 
190
189
 
191
190
  class RegisterModulesResponse(BaseModel):
192
- product: str
193
191
  modules: dict[str, dict[str, str]]
194
192
 
195
193
 
@@ -58,7 +58,7 @@ class PipelineService:
58
58
  raise PipelineServiceError(f"Unsupported orchestrator: '{orchestrator}'")
59
59
 
60
60
  # Resolve module images
61
- images = await self._module_repo.get_images_map(tenant_id, product)
61
+ images = await self._module_repo.get_images_map(tenant_id)
62
62
  missing = [m.name for m in config.modules if m.module not in images]
63
63
  if missing:
64
64
  raise PipelineServiceError(
File without changes