claude-mpm 3.9.11__py3-none-any.whl → 4.0.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.
Files changed (419) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/__init__.py +2 -2
  3. claude_mpm/__main__.py +3 -2
  4. claude_mpm/agents/__init__.py +85 -79
  5. claude_mpm/agents/agent_loader.py +464 -1003
  6. claude_mpm/agents/agent_loader_integration.py +45 -45
  7. claude_mpm/agents/agents_metadata.py +29 -30
  8. claude_mpm/agents/async_agent_loader.py +156 -138
  9. claude_mpm/agents/base_agent.json +1 -1
  10. claude_mpm/agents/base_agent_loader.py +179 -151
  11. claude_mpm/agents/frontmatter_validator.py +229 -130
  12. claude_mpm/agents/schema/agent_schema.json +1 -1
  13. claude_mpm/agents/system_agent_config.py +213 -147
  14. claude_mpm/agents/templates/__init__.py +13 -13
  15. claude_mpm/agents/templates/code_analyzer.json +2 -2
  16. claude_mpm/agents/templates/data_engineer.json +1 -1
  17. claude_mpm/agents/templates/documentation.json +23 -11
  18. claude_mpm/agents/templates/engineer.json +22 -6
  19. claude_mpm/agents/templates/memory_manager.json +1 -1
  20. claude_mpm/agents/templates/ops.json +2 -2
  21. claude_mpm/agents/templates/project_organizer.json +1 -1
  22. claude_mpm/agents/templates/qa.json +1 -1
  23. claude_mpm/agents/templates/refactoring_engineer.json +222 -0
  24. claude_mpm/agents/templates/research.json +20 -14
  25. claude_mpm/agents/templates/security.json +1 -1
  26. claude_mpm/agents/templates/ticketing.json +1 -1
  27. claude_mpm/agents/templates/version_control.json +1 -1
  28. claude_mpm/agents/templates/web_qa.json +3 -1
  29. claude_mpm/agents/templates/web_ui.json +2 -2
  30. claude_mpm/cli/__init__.py +79 -51
  31. claude_mpm/cli/__main__.py +3 -2
  32. claude_mpm/cli/commands/__init__.py +20 -20
  33. claude_mpm/cli/commands/agents.py +279 -247
  34. claude_mpm/cli/commands/aggregate.py +138 -157
  35. claude_mpm/cli/commands/cleanup.py +147 -147
  36. claude_mpm/cli/commands/config.py +93 -76
  37. claude_mpm/cli/commands/info.py +17 -16
  38. claude_mpm/cli/commands/mcp.py +140 -905
  39. claude_mpm/cli/commands/mcp_command_router.py +139 -0
  40. claude_mpm/cli/commands/mcp_config_commands.py +20 -0
  41. claude_mpm/cli/commands/mcp_install_commands.py +20 -0
  42. claude_mpm/cli/commands/mcp_server_commands.py +175 -0
  43. claude_mpm/cli/commands/mcp_tool_commands.py +34 -0
  44. claude_mpm/cli/commands/memory.py +239 -203
  45. claude_mpm/cli/commands/monitor.py +203 -81
  46. claude_mpm/cli/commands/run.py +380 -429
  47. claude_mpm/cli/commands/run_config_checker.py +160 -0
  48. claude_mpm/cli/commands/socketio_monitor.py +235 -0
  49. claude_mpm/cli/commands/tickets.py +305 -197
  50. claude_mpm/cli/parser.py +24 -1156
  51. claude_mpm/cli/parsers/__init__.py +29 -0
  52. claude_mpm/cli/parsers/agents_parser.py +136 -0
  53. claude_mpm/cli/parsers/base_parser.py +331 -0
  54. claude_mpm/cli/parsers/config_parser.py +85 -0
  55. claude_mpm/cli/parsers/mcp_parser.py +152 -0
  56. claude_mpm/cli/parsers/memory_parser.py +138 -0
  57. claude_mpm/cli/parsers/monitor_parser.py +104 -0
  58. claude_mpm/cli/parsers/run_parser.py +147 -0
  59. claude_mpm/cli/parsers/tickets_parser.py +203 -0
  60. claude_mpm/cli/ticket_cli.py +7 -3
  61. claude_mpm/cli/utils.py +55 -37
  62. claude_mpm/cli_module/__init__.py +6 -6
  63. claude_mpm/cli_module/args.py +188 -140
  64. claude_mpm/cli_module/commands.py +79 -70
  65. claude_mpm/cli_module/migration_example.py +38 -60
  66. claude_mpm/config/__init__.py +32 -25
  67. claude_mpm/config/agent_config.py +151 -119
  68. claude_mpm/config/experimental_features.py +71 -73
  69. claude_mpm/config/paths.py +94 -208
  70. claude_mpm/config/socketio_config.py +84 -73
  71. claude_mpm/constants.py +35 -18
  72. claude_mpm/core/__init__.py +9 -6
  73. claude_mpm/core/agent_name_normalizer.py +68 -71
  74. claude_mpm/core/agent_registry.py +372 -521
  75. claude_mpm/core/agent_session_manager.py +74 -63
  76. claude_mpm/core/base_service.py +116 -87
  77. claude_mpm/core/cache.py +119 -153
  78. claude_mpm/core/claude_runner.py +425 -1120
  79. claude_mpm/core/config.py +263 -168
  80. claude_mpm/core/config_aliases.py +69 -61
  81. claude_mpm/core/config_constants.py +292 -0
  82. claude_mpm/core/constants.py +57 -99
  83. claude_mpm/core/container.py +211 -178
  84. claude_mpm/core/exceptions.py +233 -89
  85. claude_mpm/core/factories.py +92 -54
  86. claude_mpm/core/framework_loader.py +378 -220
  87. claude_mpm/core/hook_manager.py +198 -83
  88. claude_mpm/core/hook_performance_config.py +136 -0
  89. claude_mpm/core/injectable_service.py +61 -55
  90. claude_mpm/core/interactive_session.py +165 -155
  91. claude_mpm/core/interfaces.py +221 -195
  92. claude_mpm/core/lazy.py +96 -96
  93. claude_mpm/core/logger.py +133 -107
  94. claude_mpm/core/logging_config.py +185 -157
  95. claude_mpm/core/minimal_framework_loader.py +20 -15
  96. claude_mpm/core/mixins.py +30 -29
  97. claude_mpm/core/oneshot_session.py +215 -181
  98. claude_mpm/core/optimized_agent_loader.py +134 -138
  99. claude_mpm/core/optimized_startup.py +159 -157
  100. claude_mpm/core/pm_hook_interceptor.py +85 -72
  101. claude_mpm/core/service_registry.py +103 -101
  102. claude_mpm/core/session_manager.py +97 -87
  103. claude_mpm/core/socketio_pool.py +212 -158
  104. claude_mpm/core/tool_access_control.py +58 -51
  105. claude_mpm/core/types.py +46 -24
  106. claude_mpm/core/typing_utils.py +166 -82
  107. claude_mpm/core/unified_agent_registry.py +721 -0
  108. claude_mpm/core/unified_config.py +550 -0
  109. claude_mpm/core/unified_paths.py +549 -0
  110. claude_mpm/dashboard/index.html +1 -1
  111. claude_mpm/dashboard/open_dashboard.py +51 -17
  112. claude_mpm/dashboard/static/css/dashboard.css +27 -8
  113. claude_mpm/dashboard/static/dist/components/agent-inference.js +2 -0
  114. claude_mpm/dashboard/static/dist/components/event-processor.js +2 -0
  115. claude_mpm/dashboard/static/dist/components/event-viewer.js +2 -0
  116. claude_mpm/dashboard/static/dist/components/export-manager.js +2 -0
  117. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +2 -0
  118. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +2 -0
  119. claude_mpm/dashboard/static/dist/components/hud-manager.js +2 -0
  120. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +2 -0
  121. claude_mpm/dashboard/static/dist/components/module-viewer.js +2 -0
  122. claude_mpm/dashboard/static/dist/components/session-manager.js +2 -0
  123. claude_mpm/dashboard/static/dist/components/socket-manager.js +2 -0
  124. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +2 -0
  125. claude_mpm/dashboard/static/dist/components/working-directory.js +2 -0
  126. claude_mpm/dashboard/static/dist/dashboard.js +2 -0
  127. claude_mpm/dashboard/static/dist/socket-client.js +2 -0
  128. claude_mpm/dashboard/static/js/components/agent-inference.js +80 -76
  129. claude_mpm/dashboard/static/js/components/event-processor.js +71 -67
  130. claude_mpm/dashboard/static/js/components/event-viewer.js +74 -70
  131. claude_mpm/dashboard/static/js/components/export-manager.js +31 -28
  132. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +106 -92
  133. claude_mpm/dashboard/static/js/components/hud-library-loader.js +11 -11
  134. claude_mpm/dashboard/static/js/components/hud-manager.js +73 -73
  135. claude_mpm/dashboard/static/js/components/hud-visualizer.js +163 -163
  136. claude_mpm/dashboard/static/js/components/module-viewer.js +305 -233
  137. claude_mpm/dashboard/static/js/components/session-manager.js +32 -29
  138. claude_mpm/dashboard/static/js/components/socket-manager.js +27 -20
  139. claude_mpm/dashboard/static/js/components/ui-state-manager.js +21 -18
  140. claude_mpm/dashboard/static/js/components/working-directory.js +74 -71
  141. claude_mpm/dashboard/static/js/dashboard.js +178 -453
  142. claude_mpm/dashboard/static/js/extension-error-handler.js +164 -0
  143. claude_mpm/dashboard/static/js/socket-client.js +120 -54
  144. claude_mpm/dashboard/templates/index.html +40 -50
  145. claude_mpm/experimental/cli_enhancements.py +60 -58
  146. claude_mpm/generators/__init__.py +1 -1
  147. claude_mpm/generators/agent_profile_generator.py +75 -65
  148. claude_mpm/hooks/__init__.py +1 -1
  149. claude_mpm/hooks/base_hook.py +33 -28
  150. claude_mpm/hooks/claude_hooks/__init__.py +1 -1
  151. claude_mpm/hooks/claude_hooks/connection_pool.py +120 -0
  152. claude_mpm/hooks/claude_hooks/event_handlers.py +743 -0
  153. claude_mpm/hooks/claude_hooks/hook_handler.py +415 -1331
  154. claude_mpm/hooks/claude_hooks/hook_wrapper.sh +4 -4
  155. claude_mpm/hooks/claude_hooks/memory_integration.py +221 -0
  156. claude_mpm/hooks/claude_hooks/response_tracking.py +348 -0
  157. claude_mpm/hooks/claude_hooks/tool_analysis.py +230 -0
  158. claude_mpm/hooks/memory_integration_hook.py +140 -100
  159. claude_mpm/hooks/tool_call_interceptor.py +89 -76
  160. claude_mpm/hooks/validation_hooks.py +57 -49
  161. claude_mpm/init.py +145 -121
  162. claude_mpm/models/__init__.py +9 -9
  163. claude_mpm/models/agent_definition.py +33 -23
  164. claude_mpm/models/agent_session.py +228 -200
  165. claude_mpm/scripts/__init__.py +1 -1
  166. claude_mpm/scripts/socketio_daemon.py +192 -75
  167. claude_mpm/scripts/socketio_server_manager.py +328 -0
  168. claude_mpm/scripts/start_activity_logging.py +25 -22
  169. claude_mpm/services/__init__.py +68 -43
  170. claude_mpm/services/agent_capabilities_service.py +271 -0
  171. claude_mpm/services/agents/__init__.py +23 -32
  172. claude_mpm/services/agents/deployment/__init__.py +3 -3
  173. claude_mpm/services/agents/deployment/agent_config_provider.py +310 -0
  174. claude_mpm/services/agents/deployment/agent_configuration_manager.py +359 -0
  175. claude_mpm/services/agents/deployment/agent_definition_factory.py +84 -0
  176. claude_mpm/services/agents/deployment/agent_deployment.py +415 -2113
  177. claude_mpm/services/agents/deployment/agent_discovery_service.py +387 -0
  178. claude_mpm/services/agents/deployment/agent_environment_manager.py +293 -0
  179. claude_mpm/services/agents/deployment/agent_filesystem_manager.py +387 -0
  180. claude_mpm/services/agents/deployment/agent_format_converter.py +453 -0
  181. claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +161 -0
  182. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +345 -495
  183. claude_mpm/services/agents/deployment/agent_metrics_collector.py +279 -0
  184. claude_mpm/services/agents/deployment/agent_restore_handler.py +88 -0
  185. claude_mpm/services/agents/deployment/agent_template_builder.py +406 -0
  186. claude_mpm/services/agents/deployment/agent_validator.py +352 -0
  187. claude_mpm/services/agents/deployment/agent_version_manager.py +313 -0
  188. claude_mpm/services/agents/deployment/agent_versioning.py +6 -9
  189. claude_mpm/services/agents/deployment/agents_directory_resolver.py +79 -0
  190. claude_mpm/services/agents/deployment/async_agent_deployment.py +298 -234
  191. claude_mpm/services/agents/deployment/config/__init__.py +13 -0
  192. claude_mpm/services/agents/deployment/config/deployment_config.py +182 -0
  193. claude_mpm/services/agents/deployment/config/deployment_config_manager.py +200 -0
  194. claude_mpm/services/agents/deployment/deployment_config_loader.py +54 -0
  195. claude_mpm/services/agents/deployment/deployment_type_detector.py +124 -0
  196. claude_mpm/services/agents/deployment/facade/__init__.py +18 -0
  197. claude_mpm/services/agents/deployment/facade/async_deployment_executor.py +159 -0
  198. claude_mpm/services/agents/deployment/facade/deployment_executor.py +73 -0
  199. claude_mpm/services/agents/deployment/facade/deployment_facade.py +270 -0
  200. claude_mpm/services/agents/deployment/facade/sync_deployment_executor.py +178 -0
  201. claude_mpm/services/agents/deployment/interface_adapter.py +227 -0
  202. claude_mpm/services/agents/deployment/lifecycle_health_checker.py +85 -0
  203. claude_mpm/services/agents/deployment/lifecycle_performance_tracker.py +100 -0
  204. claude_mpm/services/agents/deployment/pipeline/__init__.py +32 -0
  205. claude_mpm/services/agents/deployment/pipeline/pipeline_builder.py +158 -0
  206. claude_mpm/services/agents/deployment/pipeline/pipeline_context.py +159 -0
  207. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +169 -0
  208. claude_mpm/services/agents/deployment/pipeline/steps/__init__.py +19 -0
  209. claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +195 -0
  210. claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +119 -0
  211. claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +79 -0
  212. claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +90 -0
  213. claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +100 -0
  214. claude_mpm/services/agents/deployment/processors/__init__.py +15 -0
  215. claude_mpm/services/agents/deployment/processors/agent_deployment_context.py +98 -0
  216. claude_mpm/services/agents/deployment/processors/agent_deployment_result.py +235 -0
  217. claude_mpm/services/agents/deployment/processors/agent_processor.py +258 -0
  218. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +318 -0
  219. claude_mpm/services/agents/deployment/results/__init__.py +13 -0
  220. claude_mpm/services/agents/deployment/results/deployment_metrics.py +200 -0
  221. claude_mpm/services/agents/deployment/results/deployment_result_builder.py +249 -0
  222. claude_mpm/services/agents/deployment/strategies/__init__.py +25 -0
  223. claude_mpm/services/agents/deployment/strategies/base_strategy.py +119 -0
  224. claude_mpm/services/agents/deployment/strategies/project_strategy.py +150 -0
  225. claude_mpm/services/agents/deployment/strategies/strategy_selector.py +117 -0
  226. claude_mpm/services/agents/deployment/strategies/system_strategy.py +116 -0
  227. claude_mpm/services/agents/deployment/strategies/user_strategy.py +137 -0
  228. claude_mpm/services/agents/deployment/system_instructions_deployer.py +108 -0
  229. claude_mpm/services/agents/deployment/validation/__init__.py +19 -0
  230. claude_mpm/services/agents/deployment/validation/agent_validator.py +323 -0
  231. claude_mpm/services/agents/deployment/validation/deployment_validator.py +238 -0
  232. claude_mpm/services/agents/deployment/validation/template_validator.py +299 -0
  233. claude_mpm/services/agents/deployment/validation/validation_result.py +226 -0
  234. claude_mpm/services/agents/loading/__init__.py +2 -2
  235. claude_mpm/services/agents/loading/agent_profile_loader.py +259 -229
  236. claude_mpm/services/agents/loading/base_agent_manager.py +90 -81
  237. claude_mpm/services/agents/loading/framework_agent_loader.py +154 -129
  238. claude_mpm/services/agents/management/__init__.py +2 -2
  239. claude_mpm/services/agents/management/agent_capabilities_generator.py +72 -58
  240. claude_mpm/services/agents/management/agent_management_service.py +209 -156
  241. claude_mpm/services/agents/memory/__init__.py +9 -6
  242. claude_mpm/services/agents/memory/agent_memory_manager.py +218 -1152
  243. claude_mpm/services/agents/memory/agent_persistence_service.py +20 -16
  244. claude_mpm/services/agents/memory/analyzer.py +430 -0
  245. claude_mpm/services/agents/memory/content_manager.py +376 -0
  246. claude_mpm/services/agents/memory/template_generator.py +468 -0
  247. claude_mpm/services/agents/registry/__init__.py +7 -10
  248. claude_mpm/services/agents/registry/deployed_agent_discovery.py +122 -97
  249. claude_mpm/services/agents/registry/modification_tracker.py +351 -285
  250. claude_mpm/services/async_session_logger.py +187 -153
  251. claude_mpm/services/claude_session_logger.py +87 -72
  252. claude_mpm/services/command_handler_service.py +217 -0
  253. claude_mpm/services/communication/__init__.py +3 -2
  254. claude_mpm/services/core/__init__.py +50 -97
  255. claude_mpm/services/core/base.py +60 -53
  256. claude_mpm/services/core/interfaces/__init__.py +188 -0
  257. claude_mpm/services/core/interfaces/agent.py +351 -0
  258. claude_mpm/services/core/interfaces/communication.py +343 -0
  259. claude_mpm/services/core/interfaces/infrastructure.py +413 -0
  260. claude_mpm/services/core/interfaces/service.py +434 -0
  261. claude_mpm/services/core/interfaces.py +19 -944
  262. claude_mpm/services/event_aggregator.py +208 -170
  263. claude_mpm/services/exceptions.py +387 -308
  264. claude_mpm/services/framework_claude_md_generator/__init__.py +75 -79
  265. claude_mpm/services/framework_claude_md_generator/content_assembler.py +69 -60
  266. claude_mpm/services/framework_claude_md_generator/content_validator.py +65 -61
  267. claude_mpm/services/framework_claude_md_generator/deployment_manager.py +68 -49
  268. claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +34 -34
  269. claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +25 -22
  270. claude_mpm/services/framework_claude_md_generator/section_generators/claude_pm_init.py +10 -10
  271. claude_mpm/services/framework_claude_md_generator/section_generators/core_responsibilities.py +4 -3
  272. claude_mpm/services/framework_claude_md_generator/section_generators/delegation_constraints.py +4 -3
  273. claude_mpm/services/framework_claude_md_generator/section_generators/environment_config.py +4 -3
  274. claude_mpm/services/framework_claude_md_generator/section_generators/footer.py +6 -5
  275. claude_mpm/services/framework_claude_md_generator/section_generators/header.py +8 -7
  276. claude_mpm/services/framework_claude_md_generator/section_generators/orchestration_principles.py +4 -3
  277. claude_mpm/services/framework_claude_md_generator/section_generators/role_designation.py +6 -5
  278. claude_mpm/services/framework_claude_md_generator/section_generators/subprocess_validation.py +9 -8
  279. claude_mpm/services/framework_claude_md_generator/section_generators/todo_task_tools.py +4 -3
  280. claude_mpm/services/framework_claude_md_generator/section_generators/troubleshooting.py +5 -4
  281. claude_mpm/services/framework_claude_md_generator/section_manager.py +28 -27
  282. claude_mpm/services/framework_claude_md_generator/version_manager.py +30 -28
  283. claude_mpm/services/hook_service.py +106 -114
  284. claude_mpm/services/infrastructure/__init__.py +7 -5
  285. claude_mpm/services/infrastructure/context_preservation.py +233 -199
  286. claude_mpm/services/infrastructure/daemon_manager.py +279 -0
  287. claude_mpm/services/infrastructure/logging.py +83 -76
  288. claude_mpm/services/infrastructure/monitoring.py +547 -404
  289. claude_mpm/services/mcp_gateway/__init__.py +30 -13
  290. claude_mpm/services/mcp_gateway/config/__init__.py +2 -2
  291. claude_mpm/services/mcp_gateway/config/config_loader.py +61 -56
  292. claude_mpm/services/mcp_gateway/config/config_schema.py +50 -41
  293. claude_mpm/services/mcp_gateway/config/configuration.py +82 -75
  294. claude_mpm/services/mcp_gateway/core/__init__.py +13 -20
  295. claude_mpm/services/mcp_gateway/core/base.py +80 -67
  296. claude_mpm/services/mcp_gateway/core/exceptions.py +60 -46
  297. claude_mpm/services/mcp_gateway/core/interfaces.py +87 -84
  298. claude_mpm/services/mcp_gateway/main.py +287 -137
  299. claude_mpm/services/mcp_gateway/registry/__init__.py +1 -1
  300. claude_mpm/services/mcp_gateway/registry/service_registry.py +97 -94
  301. claude_mpm/services/mcp_gateway/registry/tool_registry.py +135 -126
  302. claude_mpm/services/mcp_gateway/server/__init__.py +2 -2
  303. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +105 -110
  304. claude_mpm/services/mcp_gateway/server/stdio_handler.py +105 -107
  305. claude_mpm/services/mcp_gateway/server/stdio_server.py +691 -0
  306. claude_mpm/services/mcp_gateway/tools/__init__.py +4 -2
  307. claude_mpm/services/mcp_gateway/tools/base_adapter.py +109 -119
  308. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +283 -215
  309. claude_mpm/services/mcp_gateway/tools/hello_world.py +122 -120
  310. claude_mpm/services/mcp_gateway/tools/ticket_tools.py +652 -0
  311. claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +606 -0
  312. claude_mpm/services/memory/__init__.py +2 -2
  313. claude_mpm/services/memory/builder.py +451 -362
  314. claude_mpm/services/memory/cache/__init__.py +2 -2
  315. claude_mpm/services/memory/cache/shared_prompt_cache.py +232 -194
  316. claude_mpm/services/memory/cache/simple_cache.py +107 -93
  317. claude_mpm/services/memory/indexed_memory.py +195 -193
  318. claude_mpm/services/memory/optimizer.py +267 -234
  319. claude_mpm/services/memory/router.py +571 -263
  320. claude_mpm/services/memory_hook_service.py +237 -0
  321. claude_mpm/services/port_manager.py +223 -0
  322. claude_mpm/services/project/__init__.py +3 -3
  323. claude_mpm/services/project/analyzer.py +451 -305
  324. claude_mpm/services/project/registry.py +262 -240
  325. claude_mpm/services/recovery_manager.py +287 -231
  326. claude_mpm/services/response_tracker.py +87 -67
  327. claude_mpm/services/runner_configuration_service.py +587 -0
  328. claude_mpm/services/session_management_service.py +304 -0
  329. claude_mpm/services/socketio/__init__.py +4 -4
  330. claude_mpm/services/socketio/client_proxy.py +174 -0
  331. claude_mpm/services/socketio/handlers/__init__.py +3 -3
  332. claude_mpm/services/socketio/handlers/base.py +44 -30
  333. claude_mpm/services/socketio/handlers/connection.py +145 -65
  334. claude_mpm/services/socketio/handlers/file.py +123 -108
  335. claude_mpm/services/socketio/handlers/git.py +607 -373
  336. claude_mpm/services/socketio/handlers/hook.py +170 -0
  337. claude_mpm/services/socketio/handlers/memory.py +4 -4
  338. claude_mpm/services/socketio/handlers/project.py +4 -4
  339. claude_mpm/services/socketio/handlers/registry.py +53 -38
  340. claude_mpm/services/socketio/server/__init__.py +18 -0
  341. claude_mpm/services/socketio/server/broadcaster.py +252 -0
  342. claude_mpm/services/socketio/server/core.py +399 -0
  343. claude_mpm/services/socketio/server/main.py +323 -0
  344. claude_mpm/services/socketio_client_manager.py +160 -133
  345. claude_mpm/services/socketio_server.py +36 -1885
  346. claude_mpm/services/subprocess_launcher_service.py +316 -0
  347. claude_mpm/services/system_instructions_service.py +258 -0
  348. claude_mpm/services/ticket_manager.py +19 -533
  349. claude_mpm/services/utility_service.py +285 -0
  350. claude_mpm/services/version_control/__init__.py +18 -21
  351. claude_mpm/services/version_control/branch_strategy.py +20 -10
  352. claude_mpm/services/version_control/conflict_resolution.py +37 -13
  353. claude_mpm/services/version_control/git_operations.py +52 -21
  354. claude_mpm/services/version_control/semantic_versioning.py +92 -53
  355. claude_mpm/services/version_control/version_parser.py +145 -125
  356. claude_mpm/services/version_service.py +270 -0
  357. claude_mpm/storage/__init__.py +2 -2
  358. claude_mpm/storage/state_storage.py +177 -181
  359. claude_mpm/ticket_wrapper.py +2 -2
  360. claude_mpm/utils/__init__.py +2 -2
  361. claude_mpm/utils/agent_dependency_loader.py +453 -243
  362. claude_mpm/utils/config_manager.py +157 -118
  363. claude_mpm/utils/console.py +1 -1
  364. claude_mpm/utils/dependency_cache.py +102 -107
  365. claude_mpm/utils/dependency_manager.py +52 -47
  366. claude_mpm/utils/dependency_strategies.py +131 -96
  367. claude_mpm/utils/environment_context.py +110 -102
  368. claude_mpm/utils/error_handler.py +75 -55
  369. claude_mpm/utils/file_utils.py +80 -67
  370. claude_mpm/utils/framework_detection.py +12 -11
  371. claude_mpm/utils/import_migration_example.py +12 -60
  372. claude_mpm/utils/imports.py +48 -45
  373. claude_mpm/utils/path_operations.py +100 -93
  374. claude_mpm/utils/robust_installer.py +172 -164
  375. claude_mpm/utils/session_logging.py +30 -23
  376. claude_mpm/utils/subprocess_utils.py +99 -61
  377. claude_mpm/validation/__init__.py +1 -1
  378. claude_mpm/validation/agent_validator.py +151 -111
  379. claude_mpm/validation/frontmatter_validator.py +92 -71
  380. {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.3.dist-info}/METADATA +27 -1
  381. claude_mpm-4.0.3.dist-info/RECORD +402 -0
  382. {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.3.dist-info}/entry_points.txt +1 -0
  383. {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.3.dist-info}/licenses/LICENSE +1 -1
  384. claude_mpm/cli/commands/run_guarded.py +0 -511
  385. claude_mpm/config/memory_guardian_config.py +0 -325
  386. claude_mpm/config/memory_guardian_yaml.py +0 -335
  387. claude_mpm/core/config_paths.py +0 -150
  388. claude_mpm/core/memory_aware_runner.py +0 -353
  389. claude_mpm/dashboard/static/js/dashboard-original.js +0 -4134
  390. claude_mpm/deployment_paths.py +0 -261
  391. claude_mpm/hooks/claude_hooks/hook_handler_fixed.py +0 -454
  392. claude_mpm/models/state_models.py +0 -433
  393. claude_mpm/services/agent/__init__.py +0 -24
  394. claude_mpm/services/agent/deployment.py +0 -2548
  395. claude_mpm/services/agent/management.py +0 -598
  396. claude_mpm/services/agent/registry.py +0 -813
  397. claude_mpm/services/agents/registry/agent_registry.py +0 -813
  398. claude_mpm/services/communication/socketio.py +0 -1935
  399. claude_mpm/services/communication/websocket.py +0 -479
  400. claude_mpm/services/framework_claude_md_generator.py +0 -624
  401. claude_mpm/services/health_monitor.py +0 -893
  402. claude_mpm/services/infrastructure/graceful_degradation.py +0 -616
  403. claude_mpm/services/infrastructure/health_monitor.py +0 -775
  404. claude_mpm/services/infrastructure/memory_dashboard.py +0 -479
  405. claude_mpm/services/infrastructure/memory_guardian.py +0 -944
  406. claude_mpm/services/infrastructure/restart_protection.py +0 -642
  407. claude_mpm/services/infrastructure/state_manager.py +0 -774
  408. claude_mpm/services/mcp_gateway/manager.py +0 -334
  409. claude_mpm/services/optimized_hook_service.py +0 -542
  410. claude_mpm/services/project_analyzer.py +0 -864
  411. claude_mpm/services/project_registry.py +0 -608
  412. claude_mpm/services/standalone_socketio_server.py +0 -1300
  413. claude_mpm/services/ticket_manager_di.py +0 -318
  414. claude_mpm/services/ticketing_service_original.py +0 -510
  415. claude_mpm/utils/paths.py +0 -395
  416. claude_mpm/utils/platform_memory.py +0 -524
  417. claude_mpm-3.9.11.dist-info/RECORD +0 -306
  418. {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.3.dist-info}/WHEEL +0 -0
  419. {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.3.dist-info}/top_level.txt +0 -0
@@ -10,13 +10,13 @@ All new code should import from claude_mpm.services.core.interfaces
10
10
  Part of TSK-0046: Service Layer Architecture Reorganization
11
11
 
12
12
  Original description:
13
- This module defines the core service interfaces that establish contracts for
13
+ This module defines the core service interfaces that establish contracts for
14
14
  dependency injection, service discovery, and framework orchestration.
15
15
 
16
16
  Phase 1 Refactoring: Interface extraction and dependency injection foundation
17
17
  - IServiceContainer: Dependency injection container
18
18
  - IAgentRegistry: Agent discovery and management
19
- - IPromptCache: Performance-critical caching
19
+ - IPromptCache: Performance-critical caching
20
20
  - IHealthMonitor: Service health monitoring
21
21
  - IConfigurationManager: Configuration management
22
22
  - ITemplateManager: Template processing and rendering
@@ -25,46 +25,49 @@ Phase 1 Refactoring: Interface extraction and dependency injection foundation
25
25
  These interfaces reduce cyclomatic complexity and establish clean separation of concerns.
26
26
  """
27
27
 
28
- # Re-export everything from the new location for backward compatibility
29
- from claude_mpm.services.core.interfaces import *
28
+ import asyncio
30
29
 
31
30
  # Keep original imports to prevent any parsing issues
32
31
  from abc import ABC, abstractmethod
33
- from typing import Any, Dict, List, Optional, Set, Tuple, Union, TypeVar, Generic
34
32
  from dataclasses import dataclass
35
33
  from datetime import datetime
36
34
  from pathlib import Path
37
- import asyncio
35
+ from typing import Any, Dict, Generic, List, Optional, Set, Tuple, TypeVar, Union
36
+
37
+ # Re-export everything from the new location for backward compatibility
38
+ from claude_mpm.services.core.interfaces import *
38
39
 
39
40
  # Type variables for generic interfaces
40
- T = TypeVar('T')
41
- ServiceType = TypeVar('ServiceType')
41
+ T = TypeVar("T")
42
+ ServiceType = TypeVar("ServiceType")
42
43
 
43
44
 
44
45
  # Core dependency injection interfaces
45
46
  class IServiceContainer(ABC):
46
47
  """Service container interface for dependency injection"""
47
-
48
+
48
49
  @abstractmethod
49
- def register(self, service_type: type, implementation: type, singleton: bool = True) -> None:
50
+ def register(
51
+ self, service_type: type, implementation: type, singleton: bool = True
52
+ ) -> None:
50
53
  """Register a service implementation"""
51
54
  pass
52
-
55
+
53
56
  @abstractmethod
54
57
  def register_instance(self, service_type: type, instance: Any) -> None:
55
58
  """Register a service instance"""
56
59
  pass
57
-
60
+
58
61
  @abstractmethod
59
62
  def resolve(self, service_type: type) -> Any:
60
63
  """Resolve a service by type"""
61
64
  pass
62
-
65
+
63
66
  @abstractmethod
64
67
  def resolve_all(self, service_type: type) -> List[Any]:
65
68
  """Resolve all implementations of a service type"""
66
69
  pass
67
-
70
+
68
71
  @abstractmethod
69
72
  def is_registered(self, service_type: type) -> bool:
70
73
  """Check if a service type is registered"""
@@ -74,55 +77,56 @@ class IServiceContainer(ABC):
74
77
  # Configuration management interfaces
75
78
  class IConfigurationService(ABC):
76
79
  """Interface for configuration service (legacy compatibility)"""
77
-
80
+
78
81
  @abstractmethod
79
82
  def get(self, key: str, default: Any = None) -> Any:
80
83
  """Get configuration value by key"""
81
84
  pass
82
-
85
+
83
86
  @abstractmethod
84
87
  def set(self, key: str, value: Any) -> None:
85
88
  """Set configuration value"""
86
89
  pass
87
-
90
+
88
91
  @abstractmethod
89
92
  def initialize(self) -> bool:
90
93
  """Initialize configuration service"""
91
94
  pass
92
-
95
+
93
96
  @abstractmethod
94
97
  def shutdown(self) -> None:
95
98
  """Shutdown configuration service"""
96
99
  pass
97
100
 
101
+
98
102
  class IConfigurationManager(ABC):
99
103
  """Interface for configuration management and validation"""
100
-
104
+
101
105
  @abstractmethod
102
106
  def get(self, key: str, default: Any = None) -> Any:
103
107
  """Get configuration value by key"""
104
108
  pass
105
-
109
+
106
110
  @abstractmethod
107
111
  def set(self, key: str, value: Any) -> None:
108
112
  """Set configuration value"""
109
113
  pass
110
-
114
+
111
115
  @abstractmethod
112
116
  def get_section(self, section: str) -> Dict[str, Any]:
113
117
  """Get entire configuration section"""
114
118
  pass
115
-
119
+
116
120
  @abstractmethod
117
121
  def validate_schema(self, schema: Dict[str, Any]) -> bool:
118
122
  """Validate configuration against schema"""
119
123
  pass
120
-
124
+
121
125
  @abstractmethod
122
126
  def reload(self) -> None:
123
127
  """Reload configuration from sources"""
124
128
  pass
125
-
129
+
126
130
  @abstractmethod
127
131
  def watch_changes(self, callback: callable) -> None:
128
132
  """Watch for configuration changes"""
@@ -132,32 +136,32 @@ class IConfigurationManager(ABC):
132
136
  # Cache service interface
133
137
  class ICacheService(ABC):
134
138
  """Interface for cache service operations"""
135
-
139
+
136
140
  @abstractmethod
137
141
  def get(self, key: str) -> Any:
138
142
  """Get value from cache"""
139
143
  pass
140
-
144
+
141
145
  @abstractmethod
142
146
  def set(self, key: str, value: Any, ttl: Optional[int] = None) -> None:
143
147
  """Set value in cache with optional TTL"""
144
148
  pass
145
-
149
+
146
150
  @abstractmethod
147
151
  def delete(self, key: str) -> bool:
148
152
  """Delete key from cache"""
149
153
  pass
150
-
154
+
151
155
  @abstractmethod
152
156
  def invalidate(self, pattern: str) -> int:
153
157
  """Invalidate keys matching pattern"""
154
158
  pass
155
-
159
+
156
160
  @abstractmethod
157
161
  def clear(self) -> None:
158
162
  """Clear all cache entries"""
159
163
  pass
160
-
164
+
161
165
  @abstractmethod
162
166
  def get_cache_metrics(self) -> Dict[str, Any]:
163
167
  """Get cache performance metrics"""
@@ -168,6 +172,7 @@ class ICacheService(ABC):
168
172
  @dataclass
169
173
  class HealthStatus:
170
174
  """Health status data structure"""
175
+
171
176
  status: str # healthy, degraded, unhealthy, unknown
172
177
  message: str
173
178
  timestamp: datetime
@@ -177,27 +182,27 @@ class HealthStatus:
177
182
 
178
183
  class IHealthMonitor(ABC):
179
184
  """Interface for service health monitoring"""
180
-
185
+
181
186
  @abstractmethod
182
187
  async def check_health(self, service_name: str) -> HealthStatus:
183
188
  """Check health of a specific service"""
184
189
  pass
185
-
190
+
186
191
  @abstractmethod
187
192
  async def get_system_health(self) -> HealthStatus:
188
193
  """Get overall system health"""
189
194
  pass
190
-
195
+
191
196
  @abstractmethod
192
197
  def register_health_check(self, service_name: str, check_func: callable) -> None:
193
198
  """Register a health check function"""
194
199
  pass
195
-
200
+
196
201
  @abstractmethod
197
202
  async def start_monitoring(self) -> None:
198
203
  """Start health monitoring"""
199
204
  pass
200
-
205
+
201
206
  @abstractmethod
202
207
  async def stop_monitoring(self) -> None:
203
208
  """Stop health monitoring"""
@@ -208,6 +213,7 @@ class IHealthMonitor(ABC):
208
213
  @dataclass
209
214
  class AgentMetadata:
210
215
  """Enhanced agent metadata with specialization and model configuration support"""
216
+
211
217
  name: str
212
218
  type: str
213
219
  path: str
@@ -225,7 +231,7 @@ class AgentMetadata:
225
231
  # Model configuration fields
226
232
  preferred_model: Optional[str] = None
227
233
  model_config: Optional[Dict[str, Any]] = None
228
-
234
+
229
235
  def __post_init__(self):
230
236
  """Initialize default values for list fields"""
231
237
  if self.capabilities is None:
@@ -244,32 +250,36 @@ class AgentMetadata:
244
250
 
245
251
  class IAgentRegistry(ABC):
246
252
  """Interface for agent discovery and management"""
247
-
253
+
248
254
  @abstractmethod
249
- async def discover_agents(self, force_refresh: bool = False) -> Dict[str, AgentMetadata]:
255
+ async def discover_agents(
256
+ self, force_refresh: bool = False
257
+ ) -> Dict[str, AgentMetadata]:
250
258
  """Discover all available agents"""
251
259
  pass
252
-
260
+
253
261
  @abstractmethod
254
262
  async def get_agent(self, agent_name: str) -> Optional[AgentMetadata]:
255
263
  """Get specific agent metadata"""
256
264
  pass
257
-
265
+
258
266
  @abstractmethod
259
- async def list_agents(self, agent_type: Optional[str] = None, tier: Optional[str] = None) -> List[AgentMetadata]:
267
+ async def list_agents(
268
+ self, agent_type: Optional[str] = None, tier: Optional[str] = None
269
+ ) -> List[AgentMetadata]:
260
270
  """List agents with optional filtering"""
261
271
  pass
262
-
272
+
263
273
  @abstractmethod
264
274
  async def get_specialized_agents(self, agent_type: str) -> List[AgentMetadata]:
265
275
  """Get agents of a specific specialized type"""
266
276
  pass
267
-
277
+
268
278
  @abstractmethod
269
279
  async def search_by_capability(self, capability: str) -> List[AgentMetadata]:
270
280
  """Search agents by capability"""
271
281
  pass
272
-
282
+
273
283
  @abstractmethod
274
284
  async def get_registry_stats(self) -> Dict[str, Any]:
275
285
  """Get registry statistics"""
@@ -280,6 +290,7 @@ class IAgentRegistry(ABC):
280
290
  @dataclass
281
291
  class CacheEntry:
282
292
  """Cache entry with metadata"""
293
+
283
294
  key: str
284
295
  value: Any
285
296
  created_at: float
@@ -288,7 +299,7 @@ class CacheEntry:
288
299
  last_accessed: float = 0.0
289
300
  size_bytes: int = 0
290
301
  metadata: Dict[str, Any] = None
291
-
302
+
292
303
  def __post_init__(self):
293
304
  if self.metadata is None:
294
305
  self.metadata = {}
@@ -296,32 +307,38 @@ class CacheEntry:
296
307
 
297
308
  class IPromptCache(ABC):
298
309
  """Interface for high-performance prompt caching"""
299
-
310
+
300
311
  @abstractmethod
301
312
  def get(self, key: str) -> Optional[Any]:
302
313
  """Get cached value by key"""
303
314
  pass
304
-
315
+
305
316
  @abstractmethod
306
- def set(self, key: str, value: Any, ttl: Optional[float] = None, metadata: Optional[Dict[str, Any]] = None) -> bool:
317
+ def set(
318
+ self,
319
+ key: str,
320
+ value: Any,
321
+ ttl: Optional[float] = None,
322
+ metadata: Optional[Dict[str, Any]] = None,
323
+ ) -> bool:
307
324
  """Set cached value with optional TTL"""
308
325
  pass
309
-
326
+
310
327
  @abstractmethod
311
328
  def delete(self, key: str) -> bool:
312
329
  """Delete cached value"""
313
330
  pass
314
-
331
+
315
332
  @abstractmethod
316
333
  def invalidate(self, pattern: str) -> int:
317
334
  """Invalidate cached values matching pattern"""
318
335
  pass
319
-
336
+
320
337
  @abstractmethod
321
338
  def clear(self) -> None:
322
339
  """Clear all cached values"""
323
340
  pass
324
-
341
+
325
342
  @abstractmethod
326
343
  def get_metrics(self) -> Dict[str, Any]:
327
344
  """Get cache performance metrics"""
@@ -332,6 +349,7 @@ class IPromptCache(ABC):
332
349
  @dataclass
333
350
  class TemplateRenderContext:
334
351
  """Context for template rendering"""
352
+
335
353
  variables: Dict[str, Any]
336
354
  metadata: Dict[str, Any]
337
355
  target_path: Optional[Path] = None
@@ -340,22 +358,24 @@ class TemplateRenderContext:
340
358
 
341
359
  class ITemplateManager(ABC):
342
360
  """Interface for template processing and rendering"""
343
-
361
+
344
362
  @abstractmethod
345
- async def render_template(self, template_content: str, context: TemplateRenderContext) -> str:
363
+ async def render_template(
364
+ self, template_content: str, context: TemplateRenderContext
365
+ ) -> str:
346
366
  """Render template with given context"""
347
367
  pass
348
-
368
+
349
369
  @abstractmethod
350
370
  async def load_template(self, template_id: str) -> Optional[str]:
351
371
  """Load template by ID"""
352
372
  pass
353
-
373
+
354
374
  @abstractmethod
355
375
  async def validate_template(self, template_content: str) -> Tuple[bool, List[str]]:
356
376
  """Validate template syntax and variables"""
357
377
  pass
358
-
378
+
359
379
  @abstractmethod
360
380
  def register_template_function(self, name: str, func: callable) -> None:
361
381
  """Register custom template function"""
@@ -365,17 +385,17 @@ class ITemplateManager(ABC):
365
385
  # Service factory interface
366
386
  class IServiceFactory(Generic[ServiceType], ABC):
367
387
  """Generic interface for service factories"""
368
-
388
+
369
389
  @abstractmethod
370
390
  def create(self, **kwargs) -> ServiceType:
371
391
  """Create service instance"""
372
392
  pass
373
-
393
+
374
394
  @abstractmethod
375
395
  def create_with_config(self, config: Dict[str, Any]) -> ServiceType:
376
396
  """Create service instance with configuration"""
377
397
  pass
378
-
398
+
379
399
  @abstractmethod
380
400
  def supports_type(self, service_type: type) -> bool:
381
401
  """Check if factory supports service type"""
@@ -385,32 +405,32 @@ class IServiceFactory(Generic[ServiceType], ABC):
385
405
  # Logging interface
386
406
  class IStructuredLogger(ABC):
387
407
  """Interface for structured logging"""
388
-
408
+
389
409
  @abstractmethod
390
410
  def debug(self, message: str, **kwargs) -> None:
391
411
  """Log debug message with structured data"""
392
412
  pass
393
-
413
+
394
414
  @abstractmethod
395
415
  def info(self, message: str, **kwargs) -> None:
396
416
  """Log info message with structured data"""
397
417
  pass
398
-
418
+
399
419
  @abstractmethod
400
420
  def warning(self, message: str, **kwargs) -> None:
401
421
  """Log warning message with structured data"""
402
422
  pass
403
-
423
+
404
424
  @abstractmethod
405
425
  def error(self, message: str, **kwargs) -> None:
406
426
  """Log error message with structured data"""
407
427
  pass
408
-
428
+
409
429
  @abstractmethod
410
430
  def critical(self, message: str, **kwargs) -> None:
411
431
  """Log critical message with structured data"""
412
432
  pass
413
-
433
+
414
434
  @abstractmethod
415
435
  def set_context(self, **kwargs) -> None:
416
436
  """Set logging context for all subsequent messages"""
@@ -420,27 +440,27 @@ class IStructuredLogger(ABC):
420
440
  # Service lifecycle interface
421
441
  class IServiceLifecycle(ABC):
422
442
  """Interface for service lifecycle management"""
423
-
443
+
424
444
  @abstractmethod
425
445
  async def initialize(self) -> None:
426
446
  """Initialize the service"""
427
447
  pass
428
-
448
+
429
449
  @abstractmethod
430
450
  async def start(self) -> None:
431
451
  """Start the service"""
432
452
  pass
433
-
453
+
434
454
  @abstractmethod
435
455
  async def stop(self) -> None:
436
456
  """Stop the service"""
437
457
  pass
438
-
458
+
439
459
  @abstractmethod
440
460
  async def restart(self) -> None:
441
461
  """Restart the service"""
442
462
  pass
443
-
463
+
444
464
  @abstractmethod
445
465
  def is_running(self) -> bool:
446
466
  """Check if service is running"""
@@ -450,17 +470,17 @@ class IServiceLifecycle(ABC):
450
470
  # Error handling interface
451
471
  class IErrorHandler(ABC):
452
472
  """Interface for centralized error handling"""
453
-
473
+
454
474
  @abstractmethod
455
475
  def handle_error(self, error: Exception, context: Dict[str, Any]) -> None:
456
476
  """Handle error with context"""
457
477
  pass
458
-
478
+
459
479
  @abstractmethod
460
480
  def register_error_handler(self, error_type: type, handler: callable) -> None:
461
481
  """Register error handler for specific error type"""
462
482
  pass
463
-
483
+
464
484
  @abstractmethod
465
485
  def get_error_stats(self) -> Dict[str, Any]:
466
486
  """Get error statistics"""
@@ -470,22 +490,24 @@ class IErrorHandler(ABC):
470
490
  # Performance monitoring interface
471
491
  class IPerformanceMonitor(ABC):
472
492
  """Interface for performance monitoring"""
473
-
493
+
474
494
  @abstractmethod
475
495
  def start_timer(self, operation: str) -> str:
476
496
  """Start timing an operation"""
477
497
  pass
478
-
498
+
479
499
  @abstractmethod
480
500
  def stop_timer(self, timer_id: str) -> float:
481
501
  """Stop timing and return duration"""
482
502
  pass
483
-
503
+
484
504
  @abstractmethod
485
- def record_metric(self, name: str, value: float, tags: Optional[Dict[str, str]] = None) -> None:
505
+ def record_metric(
506
+ self, name: str, value: float, tags: Optional[Dict[str, str]] = None
507
+ ) -> None:
486
508
  """Record a performance metric"""
487
509
  pass
488
-
510
+
489
511
  @abstractmethod
490
512
  def get_metrics(self) -> Dict[str, Any]:
491
513
  """Get performance metrics"""
@@ -495,22 +517,22 @@ class IPerformanceMonitor(ABC):
495
517
  # Event system interface
496
518
  class IEventBus(ABC):
497
519
  """Interface for event-driven communication"""
498
-
520
+
499
521
  @abstractmethod
500
522
  def publish(self, event_type: str, data: Any) -> None:
501
523
  """Publish an event"""
502
524
  pass
503
-
525
+
504
526
  @abstractmethod
505
527
  def subscribe(self, event_type: str, handler: callable) -> str:
506
528
  """Subscribe to events"""
507
529
  pass
508
-
530
+
509
531
  @abstractmethod
510
532
  def unsubscribe(self, subscription_id: str) -> None:
511
533
  """Unsubscribe from events"""
512
534
  pass
513
-
535
+
514
536
  @abstractmethod
515
537
  async def publish_async(self, event_type: str, data: Any) -> None:
516
538
  """Publish an event asynchronously"""
@@ -520,56 +542,58 @@ class IEventBus(ABC):
520
542
  # Agent deployment interface
521
543
  class AgentDeploymentInterface(ABC):
522
544
  """Interface for agent deployment operations.
523
-
545
+
524
546
  WHY: Agent deployment needs to be decoupled from concrete implementations
525
547
  to enable different deployment strategies (local, remote, containerized).
526
548
  This interface ensures consistency across different deployment backends.
527
-
549
+
528
550
  DESIGN DECISION: Methods return deployment status/results to enable
529
551
  proper error handling and rollback operations when deployments fail.
530
552
  """
531
-
553
+
532
554
  @abstractmethod
533
- def deploy_agents(self, force: bool = False, include_all: bool = False) -> Dict[str, Any]:
555
+ def deploy_agents(
556
+ self, force: bool = False, include_all: bool = False
557
+ ) -> Dict[str, Any]:
534
558
  """Deploy agents to target environment.
535
-
559
+
536
560
  Args:
537
561
  force: Force deployment even if agents already exist
538
562
  include_all: Include all agents, ignoring exclusion lists
539
-
563
+
540
564
  Returns:
541
565
  Dictionary with deployment results and status
542
566
  """
543
567
  pass
544
-
568
+
545
569
  @abstractmethod
546
570
  def validate_agent(self, agent_path: Path) -> Tuple[bool, List[str]]:
547
571
  """Validate agent configuration and structure.
548
-
572
+
549
573
  Args:
550
574
  agent_path: Path to agent configuration file
551
-
575
+
552
576
  Returns:
553
577
  Tuple of (is_valid, list_of_errors)
554
578
  """
555
579
  pass
556
-
580
+
557
581
  @abstractmethod
558
582
  def clean_deployment(self, preserve_user_agents: bool = True) -> bool:
559
583
  """Clean up deployed agents.
560
-
584
+
561
585
  Args:
562
586
  preserve_user_agents: Whether to keep user-created agents
563
-
587
+
564
588
  Returns:
565
589
  True if cleanup successful
566
590
  """
567
591
  pass
568
-
592
+
569
593
  @abstractmethod
570
594
  def get_deployment_status(self) -> Dict[str, Any]:
571
595
  """Get current deployment status and metrics.
572
-
596
+
573
597
  Returns:
574
598
  Dictionary with deployment status information
575
599
  """
@@ -579,71 +603,71 @@ class AgentDeploymentInterface(ABC):
579
603
  # Memory service interface
580
604
  class MemoryServiceInterface(ABC):
581
605
  """Interface for memory management operations.
582
-
606
+
583
607
  WHY: Memory management is crucial for agent learning and context retention.
584
608
  This interface abstracts memory storage, retrieval, and optimization to
585
609
  enable different backends (file-based, database, distributed cache).
586
-
610
+
587
611
  DESIGN DECISION: Memory operations return success/failure status to enable
588
612
  proper error handling and fallback strategies when memory is unavailable.
589
613
  """
590
-
614
+
591
615
  @abstractmethod
592
616
  def load_memory(self, agent_id: str) -> Optional[str]:
593
617
  """Load memory for a specific agent.
594
-
618
+
595
619
  Args:
596
620
  agent_id: Identifier of the agent
597
-
621
+
598
622
  Returns:
599
623
  Memory content as string or None if not found
600
624
  """
601
625
  pass
602
-
626
+
603
627
  @abstractmethod
604
628
  def save_memory(self, agent_id: str, content: str) -> bool:
605
629
  """Save memory for a specific agent.
606
-
630
+
607
631
  Args:
608
632
  agent_id: Identifier of the agent
609
633
  content: Memory content to save
610
-
634
+
611
635
  Returns:
612
636
  True if save successful
613
637
  """
614
638
  pass
615
-
639
+
616
640
  @abstractmethod
617
641
  def validate_memory_size(self, content: str) -> Tuple[bool, Optional[str]]:
618
642
  """Validate memory content size and structure.
619
-
643
+
620
644
  Args:
621
645
  content: Memory content to validate
622
-
646
+
623
647
  Returns:
624
648
  Tuple of (is_valid, error_message)
625
649
  """
626
650
  pass
627
-
651
+
628
652
  @abstractmethod
629
653
  def optimize_memory(self, agent_id: str) -> bool:
630
654
  """Optimize memory by removing duplicates and consolidating entries.
631
-
655
+
632
656
  Args:
633
657
  agent_id: Identifier of the agent
634
-
658
+
635
659
  Returns:
636
660
  True if optimization successful
637
661
  """
638
662
  pass
639
-
663
+
640
664
  @abstractmethod
641
665
  def get_memory_metrics(self, agent_id: Optional[str] = None) -> Dict[str, Any]:
642
666
  """Get memory usage metrics.
643
-
667
+
644
668
  Args:
645
669
  agent_id: Optional specific agent ID, or None for all
646
-
670
+
647
671
  Returns:
648
672
  Dictionary with memory metrics
649
673
  """
@@ -653,64 +677,64 @@ class MemoryServiceInterface(ABC):
653
677
  # Hook service interface
654
678
  class HookServiceInterface(ABC):
655
679
  """Interface for hook execution operations.
656
-
680
+
657
681
  WHY: Hooks provide extensibility points for the framework, allowing plugins
658
682
  and extensions to modify behavior. This interface ensures consistent hook
659
683
  registration, priority handling, and execution across different hook systems.
660
-
684
+
661
685
  DESIGN DECISION: Separate pre/post delegation methods for clarity and
662
686
  performance - no runtime type checking needed during execution.
663
687
  """
664
-
688
+
665
689
  @abstractmethod
666
690
  def register_hook(self, hook: Any) -> bool:
667
691
  """Register a hook with the service.
668
-
692
+
669
693
  Args:
670
694
  hook: Hook instance to register
671
-
695
+
672
696
  Returns:
673
697
  True if registration successful
674
698
  """
675
699
  pass
676
-
700
+
677
701
  @abstractmethod
678
702
  def execute_pre_delegation_hooks(self, context: Any) -> Any:
679
703
  """Execute all pre-delegation hooks.
680
-
704
+
681
705
  Args:
682
706
  context: Hook execution context
683
-
707
+
684
708
  Returns:
685
709
  Hook execution result
686
710
  """
687
711
  pass
688
-
712
+
689
713
  @abstractmethod
690
714
  def execute_post_delegation_hooks(self, context: Any) -> Any:
691
715
  """Execute all post-delegation hooks.
692
-
716
+
693
717
  Args:
694
718
  context: Hook execution context
695
-
719
+
696
720
  Returns:
697
721
  Hook execution result
698
722
  """
699
723
  pass
700
-
724
+
701
725
  @abstractmethod
702
726
  def get_registered_hooks(self) -> Dict[str, List[Any]]:
703
727
  """Get all registered hooks by type.
704
-
728
+
705
729
  Returns:
706
730
  Dictionary mapping hook types to lists of hooks
707
731
  """
708
732
  pass
709
-
733
+
710
734
  @abstractmethod
711
735
  def clear_hooks(self, hook_type: Optional[str] = None) -> None:
712
736
  """Clear registered hooks.
713
-
737
+
714
738
  Args:
715
739
  hook_type: Optional specific hook type to clear, or None for all
716
740
  """
@@ -720,64 +744,64 @@ class HookServiceInterface(ABC):
720
744
  # WebSocket/SocketIO service interface
721
745
  class SocketIOServiceInterface(ABC):
722
746
  """Interface for WebSocket communication.
723
-
747
+
724
748
  WHY: Real-time communication is essential for monitoring and interactive
725
749
  features. This interface abstracts WebSocket/SocketIO implementation to
726
750
  enable different transport mechanisms and fallback strategies.
727
-
751
+
728
752
  DESIGN DECISION: Async methods for non-blocking I/O operations, with
729
753
  support for both broadcast and targeted messaging.
730
754
  """
731
-
755
+
732
756
  @abstractmethod
733
757
  async def start(self, host: str = "localhost", port: int = 8765) -> None:
734
758
  """Start the WebSocket server.
735
-
759
+
736
760
  Args:
737
761
  host: Host to bind to
738
762
  port: Port to listen on
739
763
  """
740
764
  pass
741
-
765
+
742
766
  @abstractmethod
743
767
  async def stop(self) -> None:
744
768
  """Stop the WebSocket server."""
745
769
  pass
746
-
770
+
747
771
  @abstractmethod
748
772
  async def emit(self, event: str, data: Any, room: Optional[str] = None) -> None:
749
773
  """Emit an event to connected clients.
750
-
774
+
751
775
  Args:
752
776
  event: Event name
753
777
  data: Event data
754
778
  room: Optional room to target
755
779
  """
756
780
  pass
757
-
781
+
758
782
  @abstractmethod
759
783
  async def broadcast(self, event: str, data: Any) -> None:
760
784
  """Broadcast event to all connected clients.
761
-
785
+
762
786
  Args:
763
787
  event: Event name
764
788
  data: Event data
765
789
  """
766
790
  pass
767
-
791
+
768
792
  @abstractmethod
769
793
  def get_connection_count(self) -> int:
770
794
  """Get number of connected clients.
771
-
795
+
772
796
  Returns:
773
797
  Number of active connections
774
798
  """
775
799
  pass
776
-
800
+
777
801
  @abstractmethod
778
802
  def is_running(self) -> bool:
779
803
  """Check if server is running.
780
-
804
+
781
805
  Returns:
782
806
  True if server is active
783
807
  """
@@ -787,58 +811,58 @@ class SocketIOServiceInterface(ABC):
787
811
  # Project analyzer interface
788
812
  class ProjectAnalyzerInterface(ABC):
789
813
  """Interface for project analysis operations.
790
-
814
+
791
815
  WHY: Understanding project structure and characteristics is essential for
792
816
  context-aware agent behavior. This interface abstracts project analysis
793
817
  to support different project types and structures.
794
-
818
+
795
819
  DESIGN DECISION: Returns structured data classes for type safety and
796
820
  clear contracts between analysis and consumption components.
797
821
  """
798
-
822
+
799
823
  @abstractmethod
800
824
  def analyze_project(self, project_path: Optional[Path] = None) -> Any:
801
825
  """Analyze project characteristics.
802
-
826
+
803
827
  Args:
804
828
  project_path: Optional path to project, defaults to current
805
-
829
+
806
830
  Returns:
807
831
  ProjectCharacteristics or similar structured data
808
832
  """
809
833
  pass
810
-
834
+
811
835
  @abstractmethod
812
836
  def detect_technology_stack(self) -> List[str]:
813
837
  """Detect technologies used in the project.
814
-
838
+
815
839
  Returns:
816
840
  List of detected technologies
817
841
  """
818
842
  pass
819
-
843
+
820
844
  @abstractmethod
821
845
  def analyze_code_patterns(self) -> Dict[str, Any]:
822
846
  """Analyze code patterns and conventions.
823
-
847
+
824
848
  Returns:
825
849
  Dictionary of pattern analysis results
826
850
  """
827
851
  pass
828
-
852
+
829
853
  @abstractmethod
830
854
  def get_project_structure(self) -> Dict[str, Any]:
831
855
  """Get project directory structure analysis.
832
-
856
+
833
857
  Returns:
834
858
  Dictionary representing project structure
835
859
  """
836
860
  pass
837
-
861
+
838
862
  @abstractmethod
839
863
  def identify_entry_points(self) -> List[Path]:
840
864
  """Identify project entry points.
841
-
865
+
842
866
  Returns:
843
867
  List of entry point paths
844
868
  """
@@ -848,75 +872,77 @@ class ProjectAnalyzerInterface(ABC):
848
872
  # Ticket manager interface
849
873
  class TicketManagerInterface(ABC):
850
874
  """Interface for ticket management operations.
851
-
875
+
852
876
  WHY: Ticket management provides work tracking and organization. This
853
877
  interface abstracts ticket operations to support different backend
854
878
  systems (file-based, API-based, database).
855
-
879
+
856
880
  DESIGN DECISION: Uses string IDs for flexibility across different
857
881
  ticketing systems, with structured data returns for consistency.
858
882
  """
859
-
883
+
860
884
  @abstractmethod
861
885
  def create_task(self, title: str, description: str, **kwargs) -> Optional[str]:
862
886
  """Create a new task ticket.
863
-
887
+
864
888
  Args:
865
889
  title: Task title
866
890
  description: Task description
867
891
  **kwargs: Additional task properties
868
-
892
+
869
893
  Returns:
870
894
  Task ID if created successfully, None otherwise
871
895
  """
872
896
  pass
873
-
897
+
874
898
  @abstractmethod
875
899
  def update_task(self, task_id: str, **updates) -> bool:
876
900
  """Update an existing task.
877
-
901
+
878
902
  Args:
879
903
  task_id: ID of task to update
880
904
  **updates: Fields to update
881
-
905
+
882
906
  Returns:
883
907
  True if update successful
884
908
  """
885
909
  pass
886
-
910
+
887
911
  @abstractmethod
888
912
  def get_task(self, task_id: str) -> Optional[Dict[str, Any]]:
889
913
  """Get task details.
890
-
914
+
891
915
  Args:
892
916
  task_id: ID of task to retrieve
893
-
917
+
894
918
  Returns:
895
919
  Task data dictionary or None if not found
896
920
  """
897
921
  pass
898
-
922
+
899
923
  @abstractmethod
900
- def list_tasks(self, status: Optional[str] = None, **filters) -> List[Dict[str, Any]]:
924
+ def list_tasks(
925
+ self, status: Optional[str] = None, **filters
926
+ ) -> List[Dict[str, Any]]:
901
927
  """List tasks with optional filtering.
902
-
928
+
903
929
  Args:
904
930
  status: Optional status filter
905
931
  **filters: Additional filter criteria
906
-
932
+
907
933
  Returns:
908
934
  List of task dictionaries
909
935
  """
910
936
  pass
911
-
937
+
912
938
  @abstractmethod
913
939
  def close_task(self, task_id: str, resolution: Optional[str] = None) -> bool:
914
940
  """Close a task.
915
-
941
+
916
942
  Args:
917
943
  task_id: ID of task to close
918
944
  resolution: Optional resolution description
919
-
945
+
920
946
  Returns:
921
947
  True if close successful
922
948
  """
@@ -926,38 +952,38 @@ class TicketManagerInterface(ABC):
926
952
  # Interface registry for dependency injection discovery
927
953
  class InterfaceRegistry:
928
954
  """Registry of all core interfaces for dependency injection"""
929
-
955
+
930
956
  _interfaces = {
931
- 'service_container': IServiceContainer,
932
- 'configuration_manager': IConfigurationManager,
933
- 'health_monitor': IHealthMonitor,
934
- 'agent_registry': IAgentRegistry,
935
- 'prompt_cache': IPromptCache,
936
- 'template_manager': ITemplateManager,
937
- 'structured_logger': IStructuredLogger,
938
- 'service_lifecycle': IServiceLifecycle,
939
- 'error_handler': IErrorHandler,
940
- 'performance_monitor': IPerformanceMonitor,
941
- 'event_bus': IEventBus,
942
- 'agent_deployment': AgentDeploymentInterface,
943
- 'memory_service': MemoryServiceInterface,
944
- 'hook_service': HookServiceInterface,
945
- 'socketio_service': SocketIOServiceInterface,
946
- 'project_analyzer': ProjectAnalyzerInterface,
947
- 'ticket_manager': TicketManagerInterface,
957
+ "service_container": IServiceContainer,
958
+ "configuration_manager": IConfigurationManager,
959
+ "health_monitor": IHealthMonitor,
960
+ "agent_registry": IAgentRegistry,
961
+ "prompt_cache": IPromptCache,
962
+ "template_manager": ITemplateManager,
963
+ "structured_logger": IStructuredLogger,
964
+ "service_lifecycle": IServiceLifecycle,
965
+ "error_handler": IErrorHandler,
966
+ "performance_monitor": IPerformanceMonitor,
967
+ "event_bus": IEventBus,
968
+ "agent_deployment": AgentDeploymentInterface,
969
+ "memory_service": MemoryServiceInterface,
970
+ "hook_service": HookServiceInterface,
971
+ "socketio_service": SocketIOServiceInterface,
972
+ "project_analyzer": ProjectAnalyzerInterface,
973
+ "ticket_manager": TicketManagerInterface,
948
974
  }
949
-
975
+
950
976
  @classmethod
951
977
  def get_interface(cls, name: str) -> Optional[type]:
952
978
  """Get interface by name"""
953
979
  return cls._interfaces.get(name)
954
-
980
+
955
981
  @classmethod
956
982
  def get_all_interfaces(cls) -> Dict[str, type]:
957
983
  """Get all registered interfaces"""
958
984
  return cls._interfaces.copy()
959
-
985
+
960
986
  @classmethod
961
987
  def register_interface(cls, name: str, interface: type) -> None:
962
988
  """Register a new interface"""
963
- cls._interfaces[name] = interface
989
+ cls._interfaces[name] = interface