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
@@ -23,12 +23,12 @@ DESIGN DECISIONS:
23
23
  """
24
24
 
25
25
  import asyncio
26
+ import json
26
27
  import platform
28
+ import re
27
29
  import sys
28
30
  from datetime import datetime
29
- from typing import Any, Dict, Optional, List
30
- import json
31
- import re
31
+ from typing import Any, Dict, List, Optional
32
32
 
33
33
  from claude_mpm.services.mcp_gateway.core.interfaces import (
34
34
  MCPToolDefinition,
@@ -41,10 +41,10 @@ from claude_mpm.services.mcp_gateway.tools.base_adapter import BaseToolAdapter
41
41
  class HelloWorldTool(BaseToolAdapter):
42
42
  """
43
43
  Comprehensive Hello World tool for MCP Gateway testing.
44
-
44
+
45
45
  This tool provides multiple greeting variations to thoroughly test
46
46
  the MCP Gateway's tool execution capabilities.
47
-
47
+
48
48
  Features:
49
49
  - Simple greeting: Basic echo functionality
50
50
  - Personalized greeting: Name-based customization
@@ -53,14 +53,14 @@ class HelloWorldTool(BaseToolAdapter):
53
53
  - System info greeting: Integration with system information
54
54
  - Async greeting: Tests async operation support
55
55
  - Error scenarios: Validates error handling
56
-
56
+
57
57
  TRADE-OFFS:
58
58
  - Comprehensive testing vs simplicity: We chose comprehensive testing
59
59
  to ensure all MCP features work correctly
60
60
  - Multiple variations vs single greeting: Multiple variations allow
61
61
  testing different parameter combinations and edge cases
62
62
  """
63
-
63
+
64
64
  # Supported languages for multi-language greetings
65
65
  LANGUAGES = {
66
66
  "english": "Hello",
@@ -87,18 +87,18 @@ class HelloWorldTool(BaseToolAdapter):
87
87
  "thai": "สวัสดี",
88
88
  "vietnamese": "Xin chào",
89
89
  "indonesian": "Halo",
90
- "malay": "Hai"
90
+ "malay": "Hai",
91
91
  }
92
-
92
+
93
93
  # Time-based greeting thresholds
94
94
  TIME_GREETINGS = {
95
95
  (0, 5): "Good night",
96
96
  (5, 12): "Good morning",
97
97
  (12, 17): "Good afternoon",
98
98
  (17, 21): "Good evening",
99
- (21, 24): "Good night"
99
+ (21, 24): "Good night",
100
100
  }
101
-
101
+
102
102
  def __init__(self):
103
103
  """Initialize the Hello World tool with comprehensive schema."""
104
104
  definition = MCPToolDefinition(
@@ -120,71 +120,68 @@ class HelloWorldTool(BaseToolAdapter):
120
120
  "multi_language",
121
121
  "system_info",
122
122
  "async_test",
123
- "error_test"
123
+ "error_test",
124
124
  ],
125
125
  "description": "The greeting mode to use",
126
- "default": "simple"
126
+ "default": "simple",
127
127
  },
128
128
  "name": {
129
129
  "type": "string",
130
130
  "description": "Name for personalized greeting (required for personalized mode)",
131
131
  "minLength": 1,
132
- "maxLength": 100
132
+ "maxLength": 100,
133
133
  },
134
134
  "language": {
135
135
  "type": "string",
136
136
  "description": "Language for multi-language greeting",
137
137
  "enum": list(self.LANGUAGES.keys()),
138
- "default": "english"
138
+ "default": "english",
139
139
  },
140
140
  "delay_ms": {
141
141
  "type": "number",
142
142
  "description": "Delay in milliseconds for async test",
143
143
  "minimum": 0,
144
144
  "maximum": 5000,
145
- "default": 1000
145
+ "default": 1000,
146
146
  },
147
147
  "error_type": {
148
148
  "type": "string",
149
149
  "enum": ["validation", "runtime", "timeout"],
150
150
  "description": "Type of error to simulate for error_test mode",
151
- "default": "validation"
151
+ "default": "validation",
152
152
  },
153
153
  "include_metadata": {
154
154
  "type": "boolean",
155
155
  "description": "Whether to include detailed metadata in response",
156
- "default": True
156
+ "default": True,
157
157
  },
158
158
  "uppercase": {
159
159
  "type": "boolean",
160
160
  "description": "Convert greeting to uppercase",
161
- "default": False
161
+ "default": False,
162
162
  },
163
163
  "repeat": {
164
164
  "type": "number",
165
165
  "description": "Number of times to repeat the greeting",
166
166
  "minimum": 1,
167
167
  "maximum": 10,
168
- "default": 1
169
- }
168
+ "default": 1,
169
+ },
170
170
  },
171
171
  "required": ["mode"],
172
- "additionalProperties": False
172
+ "additionalProperties": False,
173
173
  },
174
174
  output_schema={
175
175
  "type": "object",
176
176
  "properties": {
177
177
  "greeting": {
178
178
  "type": "string",
179
- "description": "The generated greeting message"
180
- },
181
- "mode": {
182
- "type": "string",
183
- "description": "The mode that was used"
179
+ "description": "The generated greeting message",
184
180
  },
181
+ "mode": {"type": "string", "description": "The mode that was used"},
185
182
  "timestamp": {
186
183
  "type": "string",
187
- "description": "ISO timestamp when greeting was generated"
184
+ "description": "ISO timestamp when greeting was generated",
188
185
  },
189
186
  "metadata": {
190
187
  "type": "object",
@@ -192,132 +189,139 @@ class HelloWorldTool(BaseToolAdapter):
192
189
  "properties": {
193
190
  "tool_version": {"type": "string"},
194
191
  "execution_environment": {"type": "object"},
195
- "parameters_used": {"type": "object"}
196
- }
197
- }
198
- }
199
- }
192
+ "parameters_used": {"type": "object"},
193
+ },
194
+ },
195
+ },
196
+ },
200
197
  )
201
198
  super().__init__(definition)
202
-
199
+
203
200
  # Tool version for tracking
204
201
  self.version = "1.0.0"
205
-
202
+
206
203
  # Track greeting history for analytics
207
204
  self.greeting_history: List[Dict[str, Any]] = []
208
205
  self.max_history_size = 100
209
-
206
+
210
207
  def validate_parameters(self, parameters: Dict[str, Any]) -> bool:
211
208
  """
212
209
  Enhanced parameter validation with detailed error messages.
213
-
210
+
214
211
  Args:
215
212
  parameters: Parameters to validate
216
-
213
+
217
214
  Returns:
218
215
  True if parameters are valid, False otherwise
219
216
  """
220
217
  # First do base validation
221
218
  if not super().validate_parameters(parameters):
222
219
  return False
223
-
220
+
224
221
  mode = parameters.get("mode", "simple")
225
-
222
+
226
223
  # Validate mode is in allowed enum
227
- valid_modes = ["simple", "personalized", "time_based", "multi_language",
228
- "system_info", "async_test", "error_test"]
224
+ valid_modes = [
225
+ "simple",
226
+ "personalized",
227
+ "time_based",
228
+ "multi_language",
229
+ "system_info",
230
+ "async_test",
231
+ "error_test",
232
+ ]
229
233
  if mode not in valid_modes:
230
234
  self.log_error(f"Invalid mode: {mode}. Must be one of {valid_modes}")
231
235
  return False
232
-
236
+
233
237
  # Mode-specific validation
234
238
  if mode == "personalized":
235
239
  if "name" not in parameters or not parameters["name"]:
236
240
  self.log_error("Personalized mode requires 'name' parameter")
237
241
  return False
238
-
242
+
239
243
  # Validate name format (alphanumeric and basic punctuation)
240
244
  name = parameters["name"]
241
245
  if not re.match(r"^[a-zA-Z0-9\s\-\'\.]+$", name):
242
246
  self.log_error(f"Invalid name format: {name}")
243
247
  return False
244
-
248
+
245
249
  elif mode == "multi_language":
246
250
  language = parameters.get("language", "english")
247
251
  if language not in self.LANGUAGES:
248
252
  self.log_error(f"Unsupported language: {language}")
249
253
  return False
250
-
254
+
251
255
  elif mode == "async_test":
252
256
  delay = parameters.get("delay_ms", 1000)
253
257
  if not isinstance(delay, (int, float)) or delay < 0 or delay > 5000:
254
258
  self.log_error(f"Invalid delay_ms: {delay} (must be 0-5000)")
255
259
  return False
256
-
260
+
257
261
  elif mode == "error_test":
258
262
  error_type = parameters.get("error_type", "validation")
259
263
  if error_type not in ["validation", "runtime", "timeout"]:
260
264
  self.log_error(f"Invalid error_type: {error_type}")
261
265
  return False
262
-
266
+
263
267
  # Validate common parameters
264
268
  repeat = parameters.get("repeat", 1)
265
269
  if not isinstance(repeat, int) or repeat < 1 or repeat > 10:
266
270
  self.log_error(f"Invalid repeat value: {repeat} (must be 1-10)")
267
271
  return False
268
-
272
+
269
273
  return True
270
-
274
+
271
275
  async def initialize(self) -> bool:
272
276
  """
273
277
  Initialize the Hello World tool.
274
-
278
+
275
279
  Returns:
276
280
  True if initialization successful
277
281
  """
278
282
  try:
279
283
  self.log_info(f"Initializing Hello World Tool v{self.version}")
280
-
284
+
281
285
  # Clear greeting history
282
286
  self.greeting_history.clear()
283
-
287
+
284
288
  # Mark as initialized
285
289
  self._initialized = True
286
-
290
+
287
291
  self.log_info("Hello World Tool initialized successfully")
288
292
  return True
289
-
293
+
290
294
  except Exception as e:
291
295
  self.log_error(f"Failed to initialize Hello World Tool: {e}")
292
296
  return False
293
-
297
+
294
298
  async def invoke(self, invocation: MCPToolInvocation) -> MCPToolResult:
295
299
  """
296
300
  Invoke the Hello World tool with the specified mode.
297
-
301
+
298
302
  Args:
299
303
  invocation: Tool invocation request
300
-
304
+
301
305
  Returns:
302
306
  Tool execution result with greeting
303
307
  """
304
308
  start_time = datetime.now()
305
-
309
+
306
310
  try:
307
311
  # Validate parameters
308
312
  if not self.validate_parameters(invocation.parameters):
309
313
  return MCPToolResult(
310
314
  success=False,
311
315
  error="Parameter validation failed",
312
- execution_time=0.0
316
+ execution_time=0.0,
313
317
  )
314
-
318
+
315
319
  # Extract parameters
316
320
  mode = invocation.parameters.get("mode", "simple")
317
321
  include_metadata = invocation.parameters.get("include_metadata", True)
318
322
  uppercase = invocation.parameters.get("uppercase", False)
319
323
  repeat = invocation.parameters.get("repeat", 1)
320
-
324
+
321
325
  # Generate greeting based on mode
322
326
  if mode == "simple":
323
327
  greeting = await self._simple_greeting()
@@ -340,24 +344,24 @@ class HelloWorldTool(BaseToolAdapter):
340
344
  return await self._error_test(error_type)
341
345
  else:
342
346
  greeting = f"Hello World! (Unknown mode: {mode})"
343
-
347
+
344
348
  # Apply transformations
345
349
  if uppercase:
346
350
  greeting = greeting.upper()
347
-
351
+
348
352
  if repeat > 1:
349
353
  greeting = " ".join([greeting] * repeat)
350
-
354
+
351
355
  # Calculate execution time
352
356
  execution_time = (datetime.now() - start_time).total_seconds()
353
-
357
+
354
358
  # Build response data
355
359
  response_data = {
356
360
  "greeting": greeting,
357
361
  "mode": mode,
358
- "timestamp": datetime.now().isoformat()
362
+ "timestamp": datetime.now().isoformat(),
359
363
  }
360
-
364
+
361
365
  # Add metadata if requested
362
366
  if include_metadata:
363
367
  response_data["metadata"] = {
@@ -365,96 +369,94 @@ class HelloWorldTool(BaseToolAdapter):
365
369
  "execution_environment": {
366
370
  "platform": platform.platform(),
367
371
  "python_version": sys.version,
368
- "processor": platform.processor() or "unknown"
372
+ "processor": platform.processor() or "unknown",
369
373
  },
370
374
  "parameters_used": invocation.parameters,
371
- "execution_time_ms": execution_time * 1000
375
+ "execution_time_ms": execution_time * 1000,
372
376
  }
373
-
377
+
374
378
  # Track in history
375
379
  self._add_to_history(mode, greeting, execution_time)
376
-
380
+
377
381
  # Update metrics
378
382
  self._update_metrics(True, execution_time)
379
-
383
+
380
384
  return MCPToolResult(
381
385
  success=True,
382
386
  data=response_data,
383
387
  execution_time=execution_time,
384
- metadata={
385
- "tool": "hello_world",
386
- "version": self.version,
387
- "mode": mode
388
- }
388
+ metadata={"tool": "hello_world", "version": self.version, "mode": mode},
389
389
  )
390
-
390
+
391
391
  except Exception as e:
392
392
  execution_time = (datetime.now() - start_time).total_seconds()
393
393
  self._update_metrics(False, execution_time)
394
394
  self._metrics["last_error"] = str(e)
395
-
395
+
396
396
  return MCPToolResult(
397
397
  success=False,
398
398
  error=f"Hello World tool failed: {str(e)}",
399
- execution_time=execution_time
399
+ execution_time=execution_time,
400
400
  )
401
-
401
+
402
402
  async def _simple_greeting(self) -> str:
403
403
  """Generate a simple greeting."""
404
404
  return "Hello World!"
405
-
405
+
406
406
  async def _personalized_greeting(self, name: str) -> str:
407
407
  """Generate a personalized greeting."""
408
408
  return f"Hello, {name}! Welcome to the MCP Gateway."
409
-
409
+
410
410
  async def _time_based_greeting(self) -> str:
411
411
  """Generate a greeting based on current time."""
412
412
  current_hour = datetime.now().hour
413
-
413
+
414
414
  for (start, end), greeting in self.TIME_GREETINGS.items():
415
415
  if start <= current_hour < end:
416
416
  return f"{greeting}! It's {datetime.now().strftime('%I:%M %p')}."
417
-
417
+
418
418
  return "Hello! Time is a curious thing."
419
-
420
- async def _multi_language_greeting(self, language: str, name: Optional[str] = None) -> str:
419
+
420
+ async def _multi_language_greeting(
421
+ self, language: str, name: Optional[str] = None
422
+ ) -> str:
421
423
  """Generate a greeting in the specified language."""
422
424
  greeting_word = self.LANGUAGES.get(language, "Hello")
423
-
425
+
424
426
  if name:
425
427
  # Add name if provided (works for most languages)
426
428
  return f"{greeting_word}, {name}!"
427
429
  else:
428
430
  return f"{greeting_word}, World!"
429
-
431
+
430
432
  async def _system_info_greeting(self) -> str:
431
433
  """Generate a greeting with system information."""
432
434
  system = platform.system()
433
435
  node = platform.node()
434
436
  py_version = platform.python_version()
435
-
437
+
436
438
  return (
437
439
  f"Hello from {system} on {node}! "
438
440
  f"Running Python {py_version} with MCP Gateway."
439
441
  )
440
-
442
+
441
443
  async def _async_greeting(self, delay_ms: int) -> str:
442
444
  """Generate a greeting after an async delay."""
443
445
  self.log_info(f"Starting async greeting with {delay_ms}ms delay")
444
-
446
+
445
447
  # Convert milliseconds to seconds for asyncio.sleep
446
448
  delay_seconds = delay_ms / 1000.0
447
449
  await asyncio.sleep(delay_seconds)
448
-
450
+
449
451
  return f"Hello World! (after {delay_ms}ms async delay)"
450
-
452
+
451
453
  async def _error_test(self, error_type: str) -> MCPToolResult:
452
454
  """Simulate various error conditions for testing."""
453
455
  if error_type == "validation":
454
456
  return MCPToolResult(
455
457
  success=False,
456
458
  error="Simulated validation error: Invalid input parameters",
457
- execution_time=0.001
459
+ execution_time=0.001,
458
460
  )
459
461
  elif error_type == "runtime":
460
462
  # Simulate a runtime error
@@ -463,21 +465,19 @@ class HelloWorldTool(BaseToolAdapter):
463
465
  # Simulate a timeout by sleeping longer than reasonable
464
466
  await asyncio.sleep(10) # This would typically trigger a timeout
465
467
  return MCPToolResult(
466
- success=False,
467
- error="Operation timed out",
468
- execution_time=10.0
468
+ success=False, error="Operation timed out", execution_time=10.0
469
469
  )
470
470
  else:
471
471
  return MCPToolResult(
472
472
  success=False,
473
473
  error=f"Unknown error type: {error_type}",
474
- execution_time=0.001
474
+ execution_time=0.001,
475
475
  )
476
-
476
+
477
477
  def _add_to_history(self, mode: str, greeting: str, execution_time: float) -> None:
478
478
  """
479
479
  Add greeting to history for analytics.
480
-
480
+
481
481
  Args:
482
482
  mode: Greeting mode used
483
483
  greeting: Generated greeting
@@ -487,19 +487,19 @@ class HelloWorldTool(BaseToolAdapter):
487
487
  "timestamp": datetime.now().isoformat(),
488
488
  "mode": mode,
489
489
  "greeting": greeting[:100], # Truncate long greetings
490
- "execution_time": execution_time
490
+ "execution_time": execution_time,
491
491
  }
492
-
492
+
493
493
  self.greeting_history.append(entry)
494
-
494
+
495
495
  # Maintain history size limit
496
496
  if len(self.greeting_history) > self.max_history_size:
497
497
  self.greeting_history.pop(0)
498
-
498
+
499
499
  def get_analytics(self) -> Dict[str, Any]:
500
500
  """
501
501
  Get analytics about tool usage.
502
-
502
+
503
503
  Returns:
504
504
  Analytics dictionary with usage statistics
505
505
  """
@@ -508,44 +508,46 @@ class HelloWorldTool(BaseToolAdapter):
508
508
  "total_greetings": 0,
509
509
  "modes_used": {},
510
510
  "average_execution_time": 0.0,
511
- "last_greeting": None
511
+ "last_greeting": None,
512
512
  }
513
-
513
+
514
514
  # Calculate mode usage
515
515
  modes_used = {}
516
516
  total_time = 0.0
517
-
517
+
518
518
  for entry in self.greeting_history:
519
519
  mode = entry["mode"]
520
520
  modes_used[mode] = modes_used.get(mode, 0) + 1
521
521
  total_time += entry["execution_time"]
522
-
522
+
523
523
  return {
524
524
  "total_greetings": len(self.greeting_history),
525
525
  "modes_used": modes_used,
526
526
  "average_execution_time": total_time / len(self.greeting_history),
527
- "last_greeting": self.greeting_history[-1] if self.greeting_history else None,
528
- "metrics": self.get_metrics()
527
+ "last_greeting": self.greeting_history[-1]
528
+ if self.greeting_history
529
+ else None,
530
+ "metrics": self.get_metrics(),
529
531
  }
530
-
532
+
531
533
  async def shutdown(self) -> None:
532
534
  """
533
535
  Shutdown the Hello World tool and clean up resources.
534
536
  """
535
537
  try:
536
538
  self.log_info(f"Shutting down Hello World Tool v{self.version}")
537
-
539
+
538
540
  # Log final analytics
539
541
  analytics = self.get_analytics()
540
542
  self.log_info(f"Final analytics: {json.dumps(analytics, indent=2)}")
541
-
543
+
542
544
  # Clear history
543
545
  self.greeting_history.clear()
544
-
546
+
545
547
  # Mark as not initialized
546
548
  self._initialized = False
547
-
549
+
548
550
  self.log_info("Hello World Tool shutdown complete")
549
-
551
+
550
552
  except Exception as e:
551
- self.log_error(f"Error during Hello World Tool shutdown: {e}")
553
+ self.log_error(f"Error during Hello World Tool shutdown: {e}")