django-cfg 1.3.5__py3-none-any.whl → 1.3.9__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.
Files changed (252) hide show
  1. django_cfg/__init__.py +1 -1
  2. django_cfg/apps/accounts/admin/__init__.py +24 -8
  3. django_cfg/apps/accounts/admin/activity_admin.py +146 -0
  4. django_cfg/apps/accounts/admin/filters.py +98 -22
  5. django_cfg/apps/accounts/admin/group_admin.py +86 -0
  6. django_cfg/apps/accounts/admin/inlines.py +42 -13
  7. django_cfg/apps/accounts/admin/otp_admin.py +115 -0
  8. django_cfg/apps/accounts/admin/registration_admin.py +173 -0
  9. django_cfg/apps/accounts/admin/resources.py +123 -19
  10. django_cfg/apps/accounts/admin/twilio_admin.py +327 -0
  11. django_cfg/apps/accounts/admin/user_admin.py +362 -0
  12. django_cfg/apps/agents/admin/__init__.py +17 -4
  13. django_cfg/apps/agents/admin/execution_admin.py +204 -183
  14. django_cfg/apps/agents/admin/registry_admin.py +230 -255
  15. django_cfg/apps/agents/admin/toolsets_admin.py +274 -321
  16. django_cfg/apps/agents/core/__init__.py +1 -1
  17. django_cfg/apps/agents/core/django_agent.py +221 -0
  18. django_cfg/apps/agents/core/exceptions.py +14 -0
  19. django_cfg/apps/agents/core/orchestrator.py +18 -3
  20. django_cfg/apps/knowbase/admin/__init__.py +1 -1
  21. django_cfg/apps/knowbase/admin/archive_admin.py +352 -640
  22. django_cfg/apps/knowbase/admin/chat_admin.py +258 -192
  23. django_cfg/apps/knowbase/admin/document_admin.py +269 -262
  24. django_cfg/apps/knowbase/admin/external_data_admin.py +271 -489
  25. django_cfg/apps/knowbase/config/settings.py +21 -4
  26. django_cfg/apps/knowbase/views/chat_views.py +3 -0
  27. django_cfg/apps/leads/admin/__init__.py +3 -1
  28. django_cfg/apps/leads/admin/leads_admin.py +235 -35
  29. django_cfg/apps/maintenance/admin/__init__.py +2 -2
  30. django_cfg/apps/maintenance/admin/api_key_admin.py +125 -63
  31. django_cfg/apps/maintenance/admin/log_admin.py +143 -61
  32. django_cfg/apps/maintenance/admin/scheduled_admin.py +212 -301
  33. django_cfg/apps/maintenance/admin/site_admin.py +213 -352
  34. django_cfg/apps/newsletter/admin/__init__.py +29 -2
  35. django_cfg/apps/newsletter/admin/newsletter_admin.py +531 -193
  36. django_cfg/apps/payments/admin/__init__.py +18 -27
  37. django_cfg/apps/payments/admin/api_keys_admin.py +179 -546
  38. django_cfg/apps/payments/admin/balance_admin.py +166 -632
  39. django_cfg/apps/payments/admin/currencies_admin.py +235 -607
  40. django_cfg/apps/payments/admin/endpoint_groups_admin.py +127 -0
  41. django_cfg/apps/payments/admin/filters.py +83 -3
  42. django_cfg/apps/payments/admin/networks_admin.py +258 -0
  43. django_cfg/apps/payments/admin/payments_admin.py +171 -461
  44. django_cfg/apps/payments/admin/subscriptions_admin.py +119 -636
  45. django_cfg/apps/payments/admin/tariffs_admin.py +248 -0
  46. django_cfg/apps/payments/admin_interface/serializers/payment_serializers.py +105 -34
  47. django_cfg/apps/payments/admin_interface/templates/payments/payment_form.html +12 -16
  48. django_cfg/apps/payments/admin_interface/views/__init__.py +2 -0
  49. django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +13 -18
  50. django_cfg/apps/payments/management/commands/manage_currencies.py +236 -274
  51. django_cfg/apps/payments/management/commands/manage_providers.py +4 -1
  52. django_cfg/apps/payments/middleware/api_access.py +32 -6
  53. django_cfg/apps/payments/migrations/0002_currency_usd_rate_currency_usd_rate_updated_at.py +26 -0
  54. django_cfg/apps/payments/migrations/0003_remove_provider_currency_fields.py +28 -0
  55. django_cfg/apps/payments/migrations/0004_add_reserved_usd_field.py +30 -0
  56. django_cfg/apps/payments/models/balance.py +12 -0
  57. django_cfg/apps/payments/models/currencies.py +106 -32
  58. django_cfg/apps/payments/models/managers/currency_managers.py +65 -0
  59. django_cfg/apps/payments/services/core/currency_service.py +35 -28
  60. django_cfg/apps/payments/services/core/payment_service.py +1 -1
  61. django_cfg/apps/payments/services/providers/__init__.py +3 -0
  62. django_cfg/apps/payments/services/providers/base.py +95 -39
  63. django_cfg/apps/payments/services/providers/models/__init__.py +40 -0
  64. django_cfg/apps/payments/services/providers/models/base.py +122 -0
  65. django_cfg/apps/payments/services/providers/models/providers.py +87 -0
  66. django_cfg/apps/payments/services/providers/models/universal.py +48 -0
  67. django_cfg/apps/payments/services/providers/nowpayments/__init__.py +31 -0
  68. django_cfg/apps/payments/services/providers/nowpayments/config.py +70 -0
  69. django_cfg/apps/payments/services/providers/nowpayments/models.py +150 -0
  70. django_cfg/apps/payments/services/providers/nowpayments/parsers.py +879 -0
  71. django_cfg/apps/payments/services/providers/{nowpayments.py → nowpayments/provider.py} +240 -209
  72. django_cfg/apps/payments/services/providers/nowpayments/sync.py +196 -0
  73. django_cfg/apps/payments/services/providers/registry.py +4 -32
  74. django_cfg/apps/payments/services/providers/sync_service.py +277 -0
  75. django_cfg/apps/payments/static/payments/js/api-client.js +23 -5
  76. django_cfg/apps/payments/static/payments/js/payment-form.js +65 -8
  77. django_cfg/apps/payments/tasks/__init__.py +39 -0
  78. django_cfg/apps/payments/tasks/types.py +73 -0
  79. django_cfg/apps/payments/tasks/usage_tracking.py +308 -0
  80. django_cfg/apps/payments/templates/admin/payments/_components/dashboard_header.html +23 -0
  81. django_cfg/apps/payments/templates/admin/payments/_components/stats_card.html +25 -0
  82. django_cfg/apps/payments/templates/admin/payments/_components/stats_grid.html +16 -0
  83. django_cfg/apps/payments/templates/admin/payments/apikey/change_list.html +39 -0
  84. django_cfg/apps/payments/templates/admin/payments/balance/change_list.html +50 -0
  85. django_cfg/apps/payments/templates/admin/payments/currency/change_list.html +40 -0
  86. django_cfg/apps/payments/templates/admin/payments/payment/change_list.html +48 -0
  87. django_cfg/apps/payments/templates/admin/payments/subscription/change_list.html +48 -0
  88. django_cfg/apps/payments/urls_admin.py +1 -1
  89. django_cfg/apps/payments/views/api/currencies.py +5 -5
  90. django_cfg/apps/payments/views/overview/services.py +2 -2
  91. django_cfg/apps/payments/views/serializers/currencies.py +4 -3
  92. django_cfg/apps/support/admin/__init__.py +10 -1
  93. django_cfg/apps/support/admin/support_admin.py +338 -141
  94. django_cfg/apps/tasks/admin/__init__.py +11 -0
  95. django_cfg/apps/tasks/admin/tasks_admin.py +430 -0
  96. django_cfg/apps/urls.py +1 -2
  97. django_cfg/config.py +1 -1
  98. django_cfg/core/config.py +10 -5
  99. django_cfg/core/generation.py +1 -1
  100. django_cfg/management/commands/__init__.py +13 -1
  101. django_cfg/management/commands/app_agent_diagnose.py +470 -0
  102. django_cfg/management/commands/app_agent_generate.py +342 -0
  103. django_cfg/management/commands/app_agent_info.py +308 -0
  104. django_cfg/management/commands/migrate_all.py +9 -3
  105. django_cfg/management/commands/migrator.py +11 -6
  106. django_cfg/management/commands/rundramatiq.py +3 -2
  107. django_cfg/middleware/__init__.py +0 -2
  108. django_cfg/models/api_keys.py +115 -0
  109. django_cfg/modules/django_admin/__init__.py +64 -0
  110. django_cfg/modules/django_admin/decorators/__init__.py +13 -0
  111. django_cfg/modules/django_admin/decorators/actions.py +106 -0
  112. django_cfg/modules/django_admin/decorators/display.py +106 -0
  113. django_cfg/modules/django_admin/mixins/__init__.py +14 -0
  114. django_cfg/modules/django_admin/mixins/display_mixin.py +81 -0
  115. django_cfg/modules/django_admin/mixins/optimization_mixin.py +41 -0
  116. django_cfg/modules/django_admin/mixins/standalone_actions_mixin.py +202 -0
  117. django_cfg/modules/django_admin/models/__init__.py +20 -0
  118. django_cfg/modules/django_admin/models/action_models.py +33 -0
  119. django_cfg/modules/django_admin/models/badge_models.py +20 -0
  120. django_cfg/modules/django_admin/models/base.py +26 -0
  121. django_cfg/modules/django_admin/models/display_models.py +31 -0
  122. django_cfg/modules/django_admin/utils/badges.py +159 -0
  123. django_cfg/modules/django_admin/utils/displays.py +247 -0
  124. django_cfg/modules/django_app_agent/__init__.py +87 -0
  125. django_cfg/modules/django_app_agent/agents/__init__.py +40 -0
  126. django_cfg/modules/django_app_agent/agents/base/__init__.py +24 -0
  127. django_cfg/modules/django_app_agent/agents/base/agent.py +354 -0
  128. django_cfg/modules/django_app_agent/agents/base/context.py +236 -0
  129. django_cfg/modules/django_app_agent/agents/base/executor.py +430 -0
  130. django_cfg/modules/django_app_agent/agents/generation/__init__.py +12 -0
  131. django_cfg/modules/django_app_agent/agents/generation/app_generator/__init__.py +15 -0
  132. django_cfg/modules/django_app_agent/agents/generation/app_generator/config_validator.py +147 -0
  133. django_cfg/modules/django_app_agent/agents/generation/app_generator/main.py +99 -0
  134. django_cfg/modules/django_app_agent/agents/generation/app_generator/models.py +32 -0
  135. django_cfg/modules/django_app_agent/agents/generation/app_generator/prompt_manager.py +290 -0
  136. django_cfg/modules/django_app_agent/agents/interfaces.py +376 -0
  137. django_cfg/modules/django_app_agent/core/__init__.py +33 -0
  138. django_cfg/modules/django_app_agent/core/config.py +300 -0
  139. django_cfg/modules/django_app_agent/core/exceptions.py +359 -0
  140. django_cfg/modules/django_app_agent/models/__init__.py +71 -0
  141. django_cfg/modules/django_app_agent/models/base.py +283 -0
  142. django_cfg/modules/django_app_agent/models/context.py +496 -0
  143. django_cfg/modules/django_app_agent/models/enums.py +481 -0
  144. django_cfg/modules/django_app_agent/models/requests.py +500 -0
  145. django_cfg/modules/django_app_agent/models/responses.py +585 -0
  146. django_cfg/modules/django_app_agent/pytest.ini +6 -0
  147. django_cfg/modules/django_app_agent/services/__init__.py +42 -0
  148. django_cfg/modules/django_app_agent/services/app_generator/__init__.py +30 -0
  149. django_cfg/modules/django_app_agent/services/app_generator/ai_integration.py +133 -0
  150. django_cfg/modules/django_app_agent/services/app_generator/context.py +40 -0
  151. django_cfg/modules/django_app_agent/services/app_generator/main.py +202 -0
  152. django_cfg/modules/django_app_agent/services/app_generator/structure.py +316 -0
  153. django_cfg/modules/django_app_agent/services/app_generator/validation.py +125 -0
  154. django_cfg/modules/django_app_agent/services/base.py +437 -0
  155. django_cfg/modules/django_app_agent/services/context_builder/__init__.py +34 -0
  156. django_cfg/modules/django_app_agent/services/context_builder/code_extractor.py +141 -0
  157. django_cfg/modules/django_app_agent/services/context_builder/context_generator.py +276 -0
  158. django_cfg/modules/django_app_agent/services/context_builder/main.py +272 -0
  159. django_cfg/modules/django_app_agent/services/context_builder/models.py +40 -0
  160. django_cfg/modules/django_app_agent/services/context_builder/pattern_analyzer.py +85 -0
  161. django_cfg/modules/django_app_agent/services/project_scanner/__init__.py +31 -0
  162. django_cfg/modules/django_app_agent/services/project_scanner/app_discovery.py +311 -0
  163. django_cfg/modules/django_app_agent/services/project_scanner/main.py +221 -0
  164. django_cfg/modules/django_app_agent/services/project_scanner/models.py +59 -0
  165. django_cfg/modules/django_app_agent/services/project_scanner/pattern_detection.py +94 -0
  166. django_cfg/modules/django_app_agent/services/questioning_service/__init__.py +28 -0
  167. django_cfg/modules/django_app_agent/services/questioning_service/main.py +273 -0
  168. django_cfg/modules/django_app_agent/services/questioning_service/models.py +111 -0
  169. django_cfg/modules/django_app_agent/services/questioning_service/question_generator.py +251 -0
  170. django_cfg/modules/django_app_agent/services/questioning_service/response_processor.py +347 -0
  171. django_cfg/modules/django_app_agent/services/questioning_service/session_manager.py +356 -0
  172. django_cfg/modules/django_app_agent/services/report_service.py +332 -0
  173. django_cfg/modules/django_app_agent/services/template_manager/__init__.py +18 -0
  174. django_cfg/modules/django_app_agent/services/template_manager/jinja_engine.py +236 -0
  175. django_cfg/modules/django_app_agent/services/template_manager/main.py +159 -0
  176. django_cfg/modules/django_app_agent/services/template_manager/models.py +36 -0
  177. django_cfg/modules/django_app_agent/services/template_manager/template_loader.py +100 -0
  178. django_cfg/modules/django_app_agent/services/template_manager/templates/admin.py.j2 +105 -0
  179. django_cfg/modules/django_app_agent/services/template_manager/templates/apps.py.j2 +31 -0
  180. django_cfg/modules/django_app_agent/services/template_manager/templates/cfg_config.py.j2 +44 -0
  181. django_cfg/modules/django_app_agent/services/template_manager/templates/cfg_module.py.j2 +81 -0
  182. django_cfg/modules/django_app_agent/services/template_manager/templates/forms.py.j2 +107 -0
  183. django_cfg/modules/django_app_agent/services/template_manager/templates/models.py.j2 +139 -0
  184. django_cfg/modules/django_app_agent/services/template_manager/templates/serializers.py.j2 +91 -0
  185. django_cfg/modules/django_app_agent/services/template_manager/templates/tests.py.j2 +195 -0
  186. django_cfg/modules/django_app_agent/services/template_manager/templates/urls.py.j2 +35 -0
  187. django_cfg/modules/django_app_agent/services/template_manager/templates/views.py.j2 +211 -0
  188. django_cfg/modules/django_app_agent/services/template_manager/variable_processor.py +200 -0
  189. django_cfg/modules/django_app_agent/services/validation_service/__init__.py +25 -0
  190. django_cfg/modules/django_app_agent/services/validation_service/django_validator.py +333 -0
  191. django_cfg/modules/django_app_agent/services/validation_service/main.py +242 -0
  192. django_cfg/modules/django_app_agent/services/validation_service/models.py +66 -0
  193. django_cfg/modules/django_app_agent/services/validation_service/quality_validator.py +352 -0
  194. django_cfg/modules/django_app_agent/services/validation_service/security_validator.py +272 -0
  195. django_cfg/modules/django_app_agent/services/validation_service/syntax_validator.py +203 -0
  196. django_cfg/modules/django_app_agent/ui/__init__.py +25 -0
  197. django_cfg/modules/django_app_agent/ui/cli.py +419 -0
  198. django_cfg/modules/django_app_agent/ui/rich_components.py +622 -0
  199. django_cfg/modules/django_app_agent/utils/__init__.py +38 -0
  200. django_cfg/modules/django_app_agent/utils/logging.py +360 -0
  201. django_cfg/modules/django_app_agent/utils/validation.py +417 -0
  202. django_cfg/modules/django_currency/__init__.py +2 -2
  203. django_cfg/modules/django_currency/clients/__init__.py +2 -2
  204. django_cfg/modules/django_currency/clients/hybrid_client.py +587 -0
  205. django_cfg/modules/django_currency/core/converter.py +12 -12
  206. django_cfg/modules/django_currency/database/__init__.py +2 -2
  207. django_cfg/modules/django_currency/database/database_loader.py +93 -42
  208. django_cfg/modules/django_llm/llm/client.py +10 -2
  209. django_cfg/modules/django_unfold/callbacks/actions.py +1 -1
  210. django_cfg/modules/django_unfold/callbacks/statistics.py +1 -1
  211. django_cfg/modules/django_unfold/dashboard.py +14 -13
  212. django_cfg/modules/django_unfold/models/config.py +1 -1
  213. django_cfg/registry/core.py +3 -0
  214. django_cfg/registry/third_party.py +2 -2
  215. django_cfg/template_archive/django_sample.zip +0 -0
  216. {django_cfg-1.3.5.dist-info → django_cfg-1.3.9.dist-info}/METADATA +2 -1
  217. {django_cfg-1.3.5.dist-info → django_cfg-1.3.9.dist-info}/RECORD +224 -118
  218. django_cfg/apps/accounts/admin/activity.py +0 -96
  219. django_cfg/apps/accounts/admin/group.py +0 -17
  220. django_cfg/apps/accounts/admin/otp.py +0 -59
  221. django_cfg/apps/accounts/admin/registration_source.py +0 -97
  222. django_cfg/apps/accounts/admin/twilio_response.py +0 -227
  223. django_cfg/apps/accounts/admin/user.py +0 -300
  224. django_cfg/apps/agents/core/agent.py +0 -281
  225. django_cfg/apps/payments/admin_interface/old/payments/base.html +0 -175
  226. django_cfg/apps/payments/admin_interface/old/payments/components/dev_tool_card.html +0 -125
  227. django_cfg/apps/payments/admin_interface/old/payments/components/loading_spinner.html +0 -16
  228. django_cfg/apps/payments/admin_interface/old/payments/components/ngrok_status_card.html +0 -113
  229. django_cfg/apps/payments/admin_interface/old/payments/components/notification.html +0 -27
  230. django_cfg/apps/payments/admin_interface/old/payments/components/provider_card.html +0 -86
  231. django_cfg/apps/payments/admin_interface/old/payments/components/status_card.html +0 -35
  232. django_cfg/apps/payments/admin_interface/old/payments/currency_converter.html +0 -382
  233. django_cfg/apps/payments/admin_interface/old/payments/payment_dashboard.html +0 -309
  234. django_cfg/apps/payments/admin_interface/old/payments/payment_form.html +0 -303
  235. django_cfg/apps/payments/admin_interface/old/payments/payment_list.html +0 -382
  236. django_cfg/apps/payments/admin_interface/old/payments/payment_status.html +0 -500
  237. django_cfg/apps/payments/admin_interface/old/payments/webhook_dashboard.html +0 -518
  238. django_cfg/apps/payments/admin_interface/old/static/payments/css/components.css +0 -619
  239. django_cfg/apps/payments/admin_interface/old/static/payments/css/dashboard.css +0 -188
  240. django_cfg/apps/payments/admin_interface/old/static/payments/js/components.js +0 -545
  241. django_cfg/apps/payments/admin_interface/old/static/payments/js/ngrok-status.js +0 -163
  242. django_cfg/apps/payments/admin_interface/old/static/payments/js/utils.js +0 -412
  243. django_cfg/apps/tasks/admin.py +0 -320
  244. django_cfg/middleware/static_nocache.py +0 -55
  245. django_cfg/modules/django_currency/clients/yahoo_client.py +0 -157
  246. /django_cfg/modules/{django_unfold → django_admin}/icons/README.md +0 -0
  247. /django_cfg/modules/{django_unfold → django_admin}/icons/__init__.py +0 -0
  248. /django_cfg/modules/{django_unfold → django_admin}/icons/constants.py +0 -0
  249. /django_cfg/modules/{django_unfold → django_admin}/icons/generate_icons.py +0 -0
  250. {django_cfg-1.3.5.dist-info → django_cfg-1.3.9.dist-info}/WHEEL +0 -0
  251. {django_cfg-1.3.5.dist-info → django_cfg-1.3.9.dist-info}/entry_points.txt +0 -0
  252. {django_cfg-1.3.5.dist-info → django_cfg-1.3.9.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,376 @@
1
+ """
2
+ Agent Interfaces for Django App Agent Module.
3
+
4
+ This module defines abstract interfaces for all AI agents, designed for
5
+ easy extraction into separate web services while maintaining clean
6
+ separation of concerns between services and agents.
7
+ """
8
+
9
+ from typing import Dict, Any, List, Optional, Protocol, runtime_checkable
10
+ from abc import ABC, abstractmethod
11
+ from pathlib import Path
12
+
13
+ from pydantic import BaseModel, Field, ConfigDict
14
+
15
+ from ..models.context import ProjectContext
16
+ from ..models.requests import AppGenerationRequest
17
+
18
+
19
+ class AgentRequest(BaseModel):
20
+ """Base request for all agent operations."""
21
+
22
+ model_config = ConfigDict(extra='forbid', validate_assignment=True)
23
+
24
+ operation_id: str = Field(description="Unique operation identifier")
25
+ correlation_id: str = Field(description="Correlation ID for tracing")
26
+ agent_name: str = Field(description="Name of the target agent")
27
+ operation_type: str = Field(description="Type of operation to perform")
28
+ context: Dict[str, Any] = Field(default_factory=dict, description="Operation context")
29
+ parameters: Dict[str, Any] = Field(default_factory=dict, description="Operation parameters")
30
+
31
+
32
+ class AgentResponse(BaseModel):
33
+ """Base response from all agent operations."""
34
+
35
+ model_config = ConfigDict(extra='forbid', validate_assignment=True)
36
+
37
+ operation_id: str = Field(description="Operation identifier")
38
+ agent_name: str = Field(description="Name of the responding agent")
39
+ success: bool = Field(description="Whether operation was successful")
40
+ result: Dict[str, Any] = Field(default_factory=dict, description="Operation result")
41
+ error: Optional[str] = Field(default=None, description="Error message if failed")
42
+ metadata: Dict[str, Any] = Field(default_factory=dict, description="Additional metadata")
43
+ execution_time_ms: int = Field(default=0, description="Execution time in milliseconds")
44
+
45
+
46
+ # Specific request/response types for different agent operations
47
+
48
+ class QuestionGenerationRequest(AgentRequest):
49
+ """Request for question generation agents."""
50
+
51
+ user_intent: str = Field(description="User's stated intent")
52
+ project_context: ProjectContext = Field(description="Project analysis context")
53
+ max_questions: int = Field(default=5, description="Maximum questions to generate")
54
+ focus_areas: List[str] = Field(default_factory=list, description="Areas to focus on")
55
+
56
+
57
+ class QuestionGenerationResponse(AgentResponse):
58
+ """Response from question generation agents."""
59
+
60
+ questions: List[Dict[str, Any]] = Field(default_factory=list, description="Generated questions")
61
+ insights: Dict[str, Any] = Field(default_factory=dict, description="Agent insights")
62
+ confidence_score: float = Field(default=0.0, description="Confidence in questions")
63
+
64
+
65
+ class CodeGenerationRequest(AgentRequest):
66
+ """Request for code generation agents."""
67
+
68
+ generation_request: AppGenerationRequest = Field(description="App generation request")
69
+ project_context: ProjectContext = Field(description="Project context")
70
+ development_context: Dict[str, Any] = Field(description="Development context from questioning")
71
+ template_variables: Dict[str, Any] = Field(default_factory=dict, description="Template variables")
72
+
73
+
74
+ class CodeGenerationResponse(AgentResponse):
75
+ """Response from code generation agents."""
76
+
77
+ generated_files: List[Dict[str, Any]] = Field(default_factory=list, description="Generated files")
78
+ quality_metrics: Dict[str, Any] = Field(default_factory=dict, description="Quality metrics")
79
+ recommendations: List[str] = Field(default_factory=list, description="Recommendations")
80
+
81
+
82
+ class ValidationRequest(AgentRequest):
83
+ """Request for validation agents."""
84
+
85
+ files_to_validate: List[Dict[str, Any]] = Field(description="Files to validate")
86
+ validation_rules: List[str] = Field(description="Validation rules to apply")
87
+ project_context: ProjectContext = Field(description="Project context")
88
+
89
+
90
+ class ValidationResponse(AgentResponse):
91
+ """Response from validation agents."""
92
+
93
+ validation_issues: List[Dict[str, Any]] = Field(default_factory=list, description="Found issues")
94
+ quality_score: float = Field(default=0.0, description="Overall quality score")
95
+ suggestions: List[str] = Field(default_factory=list, description="Improvement suggestions")
96
+
97
+
98
+ # Abstract interfaces for different agent types
99
+
100
+ @runtime_checkable
101
+ class AgentInterface(Protocol):
102
+ """Protocol for all AI agents."""
103
+
104
+ async def execute(self, request: AgentRequest) -> AgentResponse:
105
+ """Execute agent operation."""
106
+ ...
107
+
108
+ def get_capabilities(self) -> List[str]:
109
+ """Get list of agent capabilities."""
110
+ ...
111
+
112
+ def get_status(self) -> Dict[str, Any]:
113
+ """Get agent status information."""
114
+ ...
115
+
116
+
117
+ class BaseAgentInterface(ABC):
118
+ """Abstract base class for all agent interfaces."""
119
+
120
+ def __init__(self, agent_name: str):
121
+ """Initialize agent interface."""
122
+ self.agent_name = agent_name
123
+
124
+ @abstractmethod
125
+ async def execute(self, request: AgentRequest) -> AgentResponse:
126
+ """Execute agent operation."""
127
+ pass
128
+
129
+ @abstractmethod
130
+ def get_capabilities(self) -> List[str]:
131
+ """Get list of agent capabilities."""
132
+ pass
133
+
134
+ def get_status(self) -> Dict[str, Any]:
135
+ """Get agent status information."""
136
+ return {
137
+ "agent_name": self.agent_name,
138
+ "status": "active",
139
+ "capabilities": self.get_capabilities()
140
+ }
141
+
142
+
143
+ class QuestioningAgentInterface(BaseAgentInterface):
144
+ """Interface for questioning/dialogue agents."""
145
+
146
+ @abstractmethod
147
+ async def generate_questions(self, request: QuestionGenerationRequest) -> QuestionGenerationResponse:
148
+ """Generate contextual questions."""
149
+ pass
150
+
151
+ async def execute(self, request: AgentRequest) -> AgentResponse:
152
+ """Execute questioning operation."""
153
+ if request.operation_type == "generate_questions":
154
+ # Convert generic request to specific request
155
+ question_request = QuestionGenerationRequest(**request.model_dump())
156
+ return await self.generate_questions(question_request)
157
+ else:
158
+ return AgentResponse(
159
+ operation_id=request.operation_id,
160
+ agent_name=self.agent_name,
161
+ success=False,
162
+ error=f"Unsupported operation: {request.operation_type}"
163
+ )
164
+
165
+
166
+ class CodeGenerationAgentInterface(BaseAgentInterface):
167
+ """Interface for code generation agents."""
168
+
169
+ @abstractmethod
170
+ async def generate_code(self, request: CodeGenerationRequest) -> CodeGenerationResponse:
171
+ """Generate application code."""
172
+ pass
173
+
174
+ async def execute(self, request: AgentRequest) -> AgentResponse:
175
+ """Execute code generation operation."""
176
+ if request.operation_type == "generate_code":
177
+ code_request = CodeGenerationRequest(**request.model_dump())
178
+ return await self.generate_code(code_request)
179
+ else:
180
+ return AgentResponse(
181
+ operation_id=request.operation_id,
182
+ agent_name=self.agent_name,
183
+ success=False,
184
+ error=f"Unsupported operation: {request.operation_type}"
185
+ )
186
+
187
+
188
+ class ValidationAgentInterface(BaseAgentInterface):
189
+ """Interface for validation agents."""
190
+
191
+ @abstractmethod
192
+ async def validate_code(self, request: ValidationRequest) -> ValidationResponse:
193
+ """Validate generated code."""
194
+ pass
195
+
196
+ async def execute(self, request: AgentRequest) -> AgentResponse:
197
+ """Execute validation operation."""
198
+ if request.operation_type == "validate_code":
199
+ validation_request = ValidationRequest(**request.model_dump())
200
+ return await self.validate_code(validation_request)
201
+ else:
202
+ return AgentResponse(
203
+ operation_id=request.operation_id,
204
+ agent_name=self.agent_name,
205
+ success=False,
206
+ error=f"Unsupported operation: {request.operation_type}"
207
+ )
208
+
209
+
210
+ # Agent registry for managing agent instances
211
+
212
+ class AgentRegistry:
213
+ """Registry for managing agent instances and routing requests."""
214
+
215
+ def __init__(self):
216
+ """Initialize agent registry."""
217
+ self._agents: Dict[str, AgentInterface] = {}
218
+ self._agent_types: Dict[str, str] = {}
219
+
220
+ def register_agent(self, agent_name: str, agent: AgentInterface, agent_type: str):
221
+ """Register an agent instance."""
222
+ self._agents[agent_name] = agent
223
+ self._agent_types[agent_name] = agent_type
224
+
225
+ def unregister_agent(self, agent_name: str):
226
+ """Unregister an agent instance."""
227
+ self._agents.pop(agent_name, None)
228
+ self._agent_types.pop(agent_name, None)
229
+
230
+ def get_agent(self, agent_name: str) -> Optional[AgentInterface]:
231
+ """Get agent instance by name."""
232
+ return self._agents.get(agent_name)
233
+
234
+ def list_agents(self) -> Dict[str, Dict[str, Any]]:
235
+ """List all registered agents."""
236
+ return {
237
+ name: {
238
+ "type": self._agent_types.get(name, "unknown"),
239
+ "capabilities": agent.get_capabilities(),
240
+ "status": agent.get_status()
241
+ }
242
+ for name, agent in self._agents.items()
243
+ }
244
+
245
+ def get_agents_by_type(self, agent_type: str) -> List[str]:
246
+ """Get agent names by type."""
247
+ return [
248
+ name for name, atype in self._agent_types.items()
249
+ if atype == agent_type
250
+ ]
251
+
252
+ async def execute_agent_request(self, request: AgentRequest) -> AgentResponse:
253
+ """Execute request on specified agent."""
254
+ agent = self.get_agent(request.agent_name)
255
+
256
+ if not agent:
257
+ return AgentResponse(
258
+ operation_id=request.operation_id,
259
+ agent_name=request.agent_name,
260
+ success=False,
261
+ error=f"Agent '{request.agent_name}' not found"
262
+ )
263
+
264
+ try:
265
+ return await agent.execute(request)
266
+ except Exception as e:
267
+ return AgentResponse(
268
+ operation_id=request.operation_id,
269
+ agent_name=request.agent_name,
270
+ success=False,
271
+ error=f"Agent execution failed: {e}"
272
+ )
273
+
274
+
275
+ # Web service adapter for future extraction
276
+
277
+ class WebServiceAgentAdapter:
278
+ """Adapter for communicating with agents via web service."""
279
+
280
+ def __init__(self, base_url: str, api_key: Optional[str] = None):
281
+ """Initialize web service adapter."""
282
+ self.base_url = base_url.rstrip('/')
283
+ self.api_key = api_key
284
+
285
+ async def execute_agent_request(self, request: AgentRequest) -> AgentResponse:
286
+ """Execute agent request via web service."""
287
+ # This would implement HTTP client logic for web service communication
288
+ # For now, it's a placeholder that shows the interface
289
+
290
+ # In real implementation:
291
+ # 1. Serialize request to JSON
292
+ # 2. Send HTTP POST to {base_url}/agents/{agent_name}/execute
293
+ # 3. Handle authentication with API key
294
+ # 4. Deserialize response to AgentResponse
295
+ # 5. Handle errors and retries
296
+
297
+ return AgentResponse(
298
+ operation_id=request.operation_id,
299
+ agent_name=request.agent_name,
300
+ success=False,
301
+ error="Web service adapter not implemented yet"
302
+ )
303
+
304
+ async def list_agents(self) -> Dict[str, Dict[str, Any]]:
305
+ """List agents available via web service."""
306
+ # Would implement HTTP GET to {base_url}/agents
307
+ return {}
308
+
309
+ async def get_agent_status(self, agent_name: str) -> Dict[str, Any]:
310
+ """Get agent status via web service."""
311
+ # Would implement HTTP GET to {base_url}/agents/{agent_name}/status
312
+ return {}
313
+
314
+
315
+ # Factory for creating agent clients (local or remote)
316
+
317
+ class AgentClientFactory:
318
+ """Factory for creating agent clients (local or web service)."""
319
+
320
+ @staticmethod
321
+ def create_local_client(registry: AgentRegistry) -> 'LocalAgentClient':
322
+ """Create client for local agent execution."""
323
+ return LocalAgentClient(registry)
324
+
325
+ @staticmethod
326
+ def create_web_service_client(base_url: str, api_key: Optional[str] = None) -> 'WebServiceAgentClient':
327
+ """Create client for web service agent execution."""
328
+ return WebServiceAgentClient(base_url, api_key)
329
+
330
+
331
+ class LocalAgentClient:
332
+ """Client for executing agents locally."""
333
+
334
+ def __init__(self, registry: AgentRegistry):
335
+ """Initialize local agent client."""
336
+ self.registry = registry
337
+
338
+ async def execute_request(self, request: AgentRequest) -> AgentResponse:
339
+ """Execute agent request locally."""
340
+ return await self.registry.execute_agent_request(request)
341
+
342
+ async def list_agents(self) -> Dict[str, Dict[str, Any]]:
343
+ """List available agents."""
344
+ return self.registry.list_agents()
345
+
346
+
347
+ class WebServiceAgentClient:
348
+ """Client for executing agents via web service."""
349
+
350
+ def __init__(self, base_url: str, api_key: Optional[str] = None):
351
+ """Initialize web service client."""
352
+ self.adapter = WebServiceAgentAdapter(base_url, api_key)
353
+
354
+ async def execute_request(self, request: AgentRequest) -> AgentResponse:
355
+ """Execute agent request via web service."""
356
+ return await self.adapter.execute_agent_request(request)
357
+
358
+ async def list_agents(self) -> Dict[str, Dict[str, Any]]:
359
+ """List available agents."""
360
+ return await self.adapter.list_agents()
361
+
362
+
363
+ # Global registry instance (can be replaced with web service client)
364
+ _global_registry = AgentRegistry()
365
+
366
+
367
+ def get_agent_client() -> LocalAgentClient:
368
+ """Get the global agent client (local by default)."""
369
+ return LocalAgentClient(_global_registry)
370
+
371
+
372
+ def set_web_service_client(base_url: str, api_key: Optional[str] = None):
373
+ """Switch to web service client globally."""
374
+ # This would replace the global client with web service client
375
+ # Implementation depends on how we want to handle the global state
376
+ pass
@@ -0,0 +1,33 @@
1
+ """
2
+ Core module for Django App Agent.
3
+
4
+ This module contains the foundational components including:
5
+ - Exception hierarchy
6
+ - Configuration management
7
+ - Base classes and interfaces
8
+ - Logging infrastructure
9
+ """
10
+
11
+ from .exceptions import (
12
+ DjangoAppAgentError,
13
+ ConfigurationError,
14
+ GenerationError,
15
+ ValidationError,
16
+ QualityValidationError,
17
+ AgentExecutionError,
18
+ AuthenticationError,
19
+ RateLimitError,
20
+ TimeoutError as AgentTimeoutError,
21
+ )
22
+
23
+ __all__ = [
24
+ "DjangoAppAgentError",
25
+ "ConfigurationError",
26
+ "GenerationError",
27
+ "ValidationError",
28
+ "QualityValidationError",
29
+ "AgentExecutionError",
30
+ "AuthenticationError",
31
+ "RateLimitError",
32
+ "AgentTimeoutError",
33
+ ]