claude-mpm 3.2.1__py3-none-any.whl → 3.3.2__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 (35) hide show
  1. claude_mpm/agents/INSTRUCTIONS.md +71 -2
  2. claude_mpm/agents/templates/data_engineer.json +1 -1
  3. claude_mpm/agents/templates/documentation.json +1 -1
  4. claude_mpm/agents/templates/engineer.json +1 -1
  5. claude_mpm/agents/templates/ops.json +1 -1
  6. claude_mpm/agents/templates/pm.json +1 -1
  7. claude_mpm/agents/templates/qa.json +1 -1
  8. claude_mpm/agents/templates/research.json +1 -1
  9. claude_mpm/agents/templates/security.json +1 -1
  10. claude_mpm/agents/templates/test_integration.json +112 -0
  11. claude_mpm/agents/templates/version_control.json +1 -1
  12. claude_mpm/cli/commands/memory.py +575 -25
  13. claude_mpm/cli/commands/run.py +115 -14
  14. claude_mpm/cli/parser.py +76 -0
  15. claude_mpm/constants.py +5 -0
  16. claude_mpm/core/claude_runner.py +13 -11
  17. claude_mpm/core/session_manager.py +46 -0
  18. claude_mpm/core/simple_runner.py +13 -11
  19. claude_mpm/hooks/claude_hooks/hook_handler.py +2 -26
  20. claude_mpm/scripts/launch_socketio_dashboard.py +261 -0
  21. claude_mpm/services/agent_memory_manager.py +264 -23
  22. claude_mpm/services/memory_builder.py +491 -0
  23. claude_mpm/services/memory_optimizer.py +619 -0
  24. claude_mpm/services/memory_router.py +445 -0
  25. claude_mpm/services/socketio_server.py +389 -1
  26. claude_mpm-3.3.2.dist-info/METADATA +159 -0
  27. {claude_mpm-3.2.1.dist-info → claude_mpm-3.3.2.dist-info}/RECORD +31 -29
  28. claude_mpm/agents/templates/test-integration-agent.md +0 -34
  29. claude_mpm/core/websocket_handler.py +0 -233
  30. claude_mpm/services/websocket_server.py +0 -376
  31. claude_mpm-3.2.1.dist-info/METADATA +0 -432
  32. {claude_mpm-3.2.1.dist-info → claude_mpm-3.3.2.dist-info}/WHEEL +0 -0
  33. {claude_mpm-3.2.1.dist-info → claude_mpm-3.3.2.dist-info}/entry_points.txt +0 -0
  34. {claude_mpm-3.2.1.dist-info → claude_mpm-3.3.2.dist-info}/licenses/LICENSE +0 -0
  35. {claude_mpm-3.2.1.dist-info → claude_mpm-3.3.2.dist-info}/top_level.txt +0 -0
@@ -1,10 +1,10 @@
1
1
  claude_mpm/__init__.py,sha256=uDX48EOBrmJbY8Xv3bBpd8kibulIlmZv5jmczAjHNb8,648
2
2
  claude_mpm/__main__.py,sha256=8IcM9tEbTqSN_er04eKTPX3AGo6qzRiTnPI7KfIf7rw,641
3
- claude_mpm/constants.py,sha256=5wYR7YPHQtjZCreM_lgjoT7IPfujiuRWSb1Qu8coBxc,4216
3
+ claude_mpm/constants.py,sha256=kquxfabo4JRbeN86KHBTi8g4h2mSdB8OsUCyTq50kVM,4328
4
4
  claude_mpm/deployment_paths.py,sha256=JO7-fhhp_AkVB7ZssggHDBbee-r2sokpkqjoqnQLTmM,9073
5
5
  claude_mpm/init.py,sha256=gOreOf7BLXkT0_HrQk_As4Kz1OT_NJG_RG0i0hbY0z0,8088
6
6
  claude_mpm/agents/BASE_AGENT_TEMPLATE.md,sha256=TYgSd9jNBMWp4mAOBUl9dconX4RcGbvmMEScRy5uyko,3343
7
- claude_mpm/agents/INSTRUCTIONS.md,sha256=9N0iSfShFc6TeJCajT2lnTIR2ZSS7WQHwmC0vTMTeG0,10548
7
+ claude_mpm/agents/INSTRUCTIONS.md,sha256=7CzaIBCf85rYCufZuOo4KjJGyWRrMd1AkN-Zzun93pE,13245
8
8
  claude_mpm/agents/__init__.py,sha256=r-p7ervzjLPD7_8dm2tXX_fwvdTZy6KwKA03ofxN3sA,3275
9
9
  claude_mpm/agents/agent-template.yaml,sha256=koKJn8MCAJx0QNQMHouvIZrwvw5qjPV0U-aV-YVyk6s,2036
10
10
  claude_mpm/agents/agent_loader.py,sha256=P4h3qupJHvZL9dfb6ntB582xenYv9JbkMOVav_kNkAo,44030
@@ -16,16 +16,16 @@ claude_mpm/agents/system_agent_config.py,sha256=Lke4FFjU0Vq3LLo4O7KvtHxadP7agAwC
16
16
  claude_mpm/agents/backups/INSTRUCTIONS.md,sha256=3iMs6KyLJ5HzCmzqze1FasWKLKevhqpqwb8PlYiJ7Gw,9155
17
17
  claude_mpm/agents/schema/agent_schema.json,sha256=7zuSk4VfBNTlQN33AkfJp0Y1GltlviwengIM0mb7dGg,8741
18
18
  claude_mpm/agents/templates/__init__.py,sha256=7UyIChghCnkrDctvmCRYr0Wrnn8Oj-eCdgL0KpFy1Mo,2668
19
- claude_mpm/agents/templates/data_engineer.json,sha256=qoUz4nR5dP3ANu-e6Lr5bP_aa1A8_L9cN3iGwZk_B4k,5910
20
- claude_mpm/agents/templates/documentation.json,sha256=ClQ3_zWRSxkCm1_bLuVRi5bl2IYUIjPEINZm82HjJak,3142
21
- claude_mpm/agents/templates/engineer.json,sha256=Vqvxdifa1ldDUiFG1EXYupHCjg1hFYT80YE7Ef1owAk,8922
22
- claude_mpm/agents/templates/ops.json,sha256=uxIu5Tyw-FsnV-RtT-hk2QSy9EJgesmK7eampglL5tk,2988
23
- claude_mpm/agents/templates/pm.json,sha256=T67djHHIaud_OZeyan8BqqfRECyV9GxKHamfjLIz7JU,1350
24
- claude_mpm/agents/templates/qa.json,sha256=ByZw4FT1RW5sRoim2ouUPYipCi-6xI8LDaYEZ26lc6U,3076
25
- claude_mpm/agents/templates/research.json,sha256=Sb0erD1q8qXiG7QhcWC05kbe0XxNCXp1WaW3lepKofM,10013
26
- claude_mpm/agents/templates/security.json,sha256=5RzIlGtRjPIVSKvH_jjx-hzPbjh0TP2SeDBw_7LyfEA,3118
27
- claude_mpm/agents/templates/test-integration-agent.md,sha256=xyauhBApzj8qD24E0G32BF-mPCrGKES1g5S4OWPUtgc,505
28
- claude_mpm/agents/templates/version_control.json,sha256=YPxSufd32PMFTyVzDkOteoS944r74MD3VIToYm4DRCE,3043
19
+ claude_mpm/agents/templates/data_engineer.json,sha256=Z63nwhO3Bo3sUjSc4O0yGVFbJVdCmMLAgcBjKJmfc8Y,8793
20
+ claude_mpm/agents/templates/documentation.json,sha256=z5ApzJYOty5dw5yidNxhwX7QU8FICRAzmzD1xdxPkCI,6224
21
+ claude_mpm/agents/templates/engineer.json,sha256=Qt9mJjbVM0wH9GE6kqAhGDRVmLhWbs0fwGW1IoluTZ8,12474
22
+ claude_mpm/agents/templates/ops.json,sha256=b-LRqYRWjMZnXKd8SMPXDLCq6-nRAmCHN60IlJctjXM,6488
23
+ claude_mpm/agents/templates/pm.json,sha256=FbH9TOJ1NUmgHREPEhl5nOuWS8k7ee_KEQlC7cnLj2w,5239
24
+ claude_mpm/agents/templates/qa.json,sha256=UmNbeONvnzSvHFB3GUXwnN8n-TF5wgrk0JaAkYwOvfY,6636
25
+ claude_mpm/agents/templates/research.json,sha256=10XO-W7cV_SGP16SHboagjbNUlKUoGfpbrjrI2tiSWU,13591
26
+ claude_mpm/agents/templates/security.json,sha256=DkiB98uJf5mo5nP7EIhu8hhsvwGhOnR_FA60EJGuNBk,6741
27
+ claude_mpm/agents/templates/test_integration.json,sha256=QqJtUABq23MlkldAaomTviopOvM7hqxNWbaYbUVCJpk,7620
28
+ claude_mpm/agents/templates/version_control.json,sha256=H9GzDk8Ys8KmOEgfTWGr1GakKFscbd_907ObmAqzlzc,6535
29
29
  claude_mpm/agents/templates/backup/data_engineer_agent_20250726_234551.json,sha256=lLso4RHXVTQmX4A1XwF84kT59zZDblPO1xCgBj4S4x8,5060
30
30
  claude_mpm/agents/templates/backup/documentation_agent_20250726_234551.json,sha256=snfJW2yW9aMv9ldCSIWW7zwnyoQRx5u7xLMkNlfus9I,2258
31
31
  claude_mpm/agents/templates/backup/engineer_agent_20250726_234551.json,sha256=21o8TGCM9TO6eocSV9Ev5MmCq-xYwwCqMU7KQESaY2Q,8479
@@ -37,13 +37,13 @@ claude_mpm/agents/templates/backup/version_control_agent_20250726_234551.json,sh
37
37
  claude_mpm/agents/test_fix_deployment/.claude-pm/config/project.json,sha256=YZQgq2ri2_Y3qKzvPlC6TmzZKviDv0__GuyUOo1LbT8,146
38
38
  claude_mpm/cli/README.md,sha256=exe9V_UEsMSPXOMlvQUv5FsCuhUpPOsMvIhyDSyuFdI,3423
39
39
  claude_mpm/cli/__init__.py,sha256=OBcyg1xLPddsPURZPCvVhUfHkeak7Ph2qTvhOGYL7rQ,5506
40
- claude_mpm/cli/parser.py,sha256=Cd-_McqKH8uwcD81fHkZMUmQtoZmVMJFenON8V_mZtA,13518
40
+ claude_mpm/cli/parser.py,sha256=5mzUgDWsdGoQjs1OalgXqhwAm3aQJ1g4F7VRTJc9wGU,15823
41
41
  claude_mpm/cli/utils.py,sha256=k_EHLcjDAzYhDeVeWvE-vqvHsEoG6Cc6Yk7fs3YoRVA,6022
42
42
  claude_mpm/cli/commands/__init__.py,sha256=6Oh31iPNWcAehZWIIkX2hoSUBTcvFU733P7Q8Ssf56g,509
43
43
  claude_mpm/cli/commands/agents.py,sha256=FqqEQcfAfCxjz_E7fGQUtLznloJLz8fWQtnjQhkbalQ,6795
44
44
  claude_mpm/cli/commands/info.py,sha256=ETL6jC08OTQVTPjs219Y0m3FzfKOUlI0-yI81AI8FXY,2990
45
- claude_mpm/cli/commands/memory.py,sha256=6odAe-ReIVoRC6NdCsQHPGss51sF9fBQOlmXub7sysE,7600
46
- claude_mpm/cli/commands/run.py,sha256=FVEoYBgKSPNYoC9CFzjNc8m8irgvIUainqfhGVMiKQc,24173
45
+ claude_mpm/cli/commands/memory.py,sha256=oaGcEl5eW42vq20CUu52MDX4CGNcrUgo2ZY0ROE8FBU,30124
46
+ claude_mpm/cli/commands/run.py,sha256=ArHaNBr2_jnZL5FuQdyOU1zySL27u6zdFOBGxkz3xcQ,28761
47
47
  claude_mpm/cli/commands/tickets.py,sha256=SXyGtHSyGJwTeJwDAHf7kRbdiG1DlZkXkod5UoNy7Ik,2150
48
48
  claude_mpm/cli/commands/ui.py,sha256=FhBQiOKW61cNduyryRu0UhC366d6o1eEkBgbPd7Au1w,1900
49
49
  claude_mpm/cli_module/__init__.py,sha256=CkMp4gzWKoZZF_qKyBDi2sQaZw_GLWZYLtKouv-4f8s,390
@@ -60,7 +60,7 @@ claude_mpm/core/agent_registry.py.bak,sha256=cXB0yqhonE1XsXmWcdwyNuvv8yddK_PyZIL
60
60
  claude_mpm/core/agent_session_manager.py,sha256=6alXQr4gnMR-unT4J1ryEtTxJqQolA0-NgPQN6X3lqY,11212
61
61
  claude_mpm/core/base_service.py,sha256=qWI_rUybHmmKroptJxcE4rzPBhK8yeMKIt2JqnqJB7E,29125
62
62
  claude_mpm/core/base_service.py.bak,sha256=48A8eI_HPqxYm42X5jaTo8zQVOfFFXe7SqIUo-8IyC4,13124
63
- claude_mpm/core/claude_runner.py,sha256=dsLosbf2e7zYof4SirTuLM048EF4OEG1C6tEs7S-ZV8,37520
63
+ claude_mpm/core/claude_runner.py,sha256=UTeAvhdeZK7EViNaEiiMIPWBmn44utJvj9fNiqwGNe8,37740
64
64
  claude_mpm/core/config.py,sha256=_V0sbCOFNabm9nZUuRAZ9AGe65A03FbFY36QFCrDdHo,13464
65
65
  claude_mpm/core/config_aliases.py,sha256=8eqA4wpWViIDm_9pL3f9j7cR_ssmhOYYiY2UzHrfUzg,10058
66
66
  claude_mpm/core/container.py,sha256=P4c4nSo_USSfHTxvpR1sQkVGNsgqozZBN27l3IXqiDc,12216
@@ -74,11 +74,10 @@ claude_mpm/core/minimal_framework_loader.py,sha256=liYS4IyuW_aFK7yhRDZwTwT-3q09f
74
74
  claude_mpm/core/mixins.py,sha256=rTEH-7FDpNiLB8oo6mSb0CLarJklv4fDJw1xM-gr5wI,5599
75
75
  claude_mpm/core/pm_hook_interceptor.py,sha256=PRaloqgxn-Alt9HflrywYXRL2GL3Ixb8Wxov8GfAMMU,7173
76
76
  claude_mpm/core/service_registry.py,sha256=wKJUO1g4UFA4dUpE3RkIYz1Ek8kIh4XfvU1kFeLCl2Q,10529
77
- claude_mpm/core/session_manager.py,sha256=3rO4KGZp8Qd_cUw6OWv4jyxGCUaL_MNPgCCpnwQt12A,6581
78
- claude_mpm/core/simple_runner.py,sha256=dsLosbf2e7zYof4SirTuLM048EF4OEG1C6tEs7S-ZV8,37520
77
+ claude_mpm/core/session_manager.py,sha256=D6ZA7bHAgfdkv0nLKjza0FKDng5iqi___IESrb3nSuk,8292
78
+ claude_mpm/core/simple_runner.py,sha256=UTeAvhdeZK7EViNaEiiMIPWBmn44utJvj9fNiqwGNe8,37740
79
79
  claude_mpm/core/socketio_pool.py,sha256=B83uDsmqRF5S0QDwwatyKS-m2SdTvotCVfc3_2uQxd8,22438
80
80
  claude_mpm/core/tool_access_control.py,sha256=htZbDhC8s7D7BVqfmk0BwRrYJnlnUAk8_NeJKOaeNlg,6632
81
- claude_mpm/core/websocket_handler.py,sha256=1PwnZ6AzAOgfTWO5n4T52fSQxAuboj7bHOmL3TItq6M,8895
82
81
  claude_mpm/experimental/cli_enhancements.py,sha256=-N5f2u9TaxUcOJegUd3lt1FRz5ErEyYUvvgrNmMRL7Q,11814
83
82
  claude_mpm/generators/__init__.py,sha256=l53aBn6kBQSDz3b6bZkMCJBcEmYnV9hHEZq8LKzXgH8,152
84
83
  claude_mpm/generators/agent_profile_generator.py,sha256=2HjOscogSyvrtQj8KwdgNPS6Ym_QvgX1BMeauQZewZA,5751
@@ -99,7 +98,7 @@ claude_mpm/hooks/builtin/ticket_extraction_hook_example.py,sha256=4wNhS2tFUXgdcv
99
98
  claude_mpm/hooks/builtin/todo_agent_prefix_hook.py,sha256=v_4w2vcZIt0bkZxqdHmgtN79yHZ1gviuhhBws0FHpIQ,10226
100
99
  claude_mpm/hooks/builtin/workflow_start_hook.py,sha256=EQrtYD9qLMLSYPl3oQinEheZAJ2i5EO_h2jhhR8lmt0,7490
101
100
  claude_mpm/hooks/claude_hooks/__init__.py,sha256=bMUwt2RzDGAcEbtDMA7vWS1uJsauOY0OixIe4pHwgQ0,129
102
- claude_mpm/hooks/claude_hooks/hook_handler.py,sha256=BHjMqyr_EiHPYhNa8XY2f8MPwia-KESBloM5CTMm9WU,31687
101
+ claude_mpm/hooks/claude_hooks/hook_handler.py,sha256=xK7Gr6hQRM3bRsubNEy9l4sc3W4vq8z5UyaYmK9wN6A,30814
103
102
  claude_mpm/hooks/claude_hooks/hook_wrapper.sh,sha256=otLBTac_sBI3s5dH--9nok59tU91_U_vV5kmzc2fmRo,1995
104
103
  claude_mpm/models/__init__.py,sha256=vy2NLX2KT9QeH76SjCYh9dOYKPLRgxGrnwkQFAg08gc,465
105
104
  claude_mpm/models/agent_definition.py,sha256=y9XQOED_maOyiYKhNB8H8MfJJMBN0vIYPS_wCXnRJmA,6647
@@ -130,6 +129,7 @@ claude_mpm/scripts/claude-mpm-socketio,sha256=usdZgOQs0vjAKBhUcGJoRPnzJt3wYZDQM8
130
129
  claude_mpm/scripts/claude_mpm_monitor.html,sha256=24g1YWNB8PZ2S_q2xLQycK0Z06e2C7yOTsEm6qQRVUI,17634
131
130
  claude_mpm/scripts/install_socketio_server.py,sha256=Bx3BL48EF1peH111k_HU7tQdcUU6QVthAemGQcPsano,15522
132
131
  claude_mpm/scripts/launch_monitor.py,sha256=fAgRFJknrYq31SEWD9oEAEH2xvR3Lh_bzRPGDKEAFGg,4437
132
+ claude_mpm/scripts/launch_socketio_dashboard.py,sha256=BaZv_nuNY8rIFu76YhKswnrJAdM1pA3xNpb5-hQfsiA,9274
133
133
  claude_mpm/scripts/manage_version.py,sha256=5c86LD-_m0AlWqfgjRF6BH3Jc7n_nm5Z7hFVqB3iExQ,17524
134
134
  claude_mpm/scripts/socketio_daemon.py,sha256=HuRr7kzwwZskgLjHqf0wSW8IndsTs2s-aeR1tgnPMag,5115
135
135
  claude_mpm/scripts/socketio_server_manager.py,sha256=94uTdTuMHvTZrBNSrOHSKMz_z0AINl3uoc44msWfEz8,15522
@@ -139,7 +139,7 @@ claude_mpm/services/agent_capabilities_generator.py,sha256=hWG0zV2InmzrDMxSbQzjV
139
139
  claude_mpm/services/agent_deployment.py,sha256=DtK1BX2yCrutUkQdVPD01mYHm-ya36l3EPOnEcaDfog,67961
140
140
  claude_mpm/services/agent_lifecycle_manager.py,sha256=fWggWu5rT7FkDQrRHyw05Y4KaNN9cXeaCinsymPJwM4,50127
141
141
  claude_mpm/services/agent_management_service.py,sha256=eX5n6w17b9urcogVdr4V-kXcuo7yyjORTrIihjF8PeQ,22853
142
- claude_mpm/services/agent_memory_manager.py,sha256=Rs0aHEU2txOGf3v3tYZ-11DCmmhp8osFS9ltxAFWclw,26703
142
+ claude_mpm/services/agent_memory_manager.py,sha256=xFwOxcknDhsZRuMtMoenbroWtbMuWmtSXpc6pcK2bm4,37277
143
143
  claude_mpm/services/agent_modification_tracker.py,sha256=uxELrXtFt5Xlv0mhRbq5ynagEowczTRrv3mAp-aRZFc,34519
144
144
  claude_mpm/services/agent_persistence_service.py,sha256=B_Vz43zCKWq47zWkoibcia-Qwn2y3gARu7MV5Cpiptc,2893
145
145
  claude_mpm/services/agent_profile_loader.py,sha256=4D1Xj0vgqV8wN7Y3r8lijh7ghy5cVGU5t5s931sVqGc,23133
@@ -150,14 +150,16 @@ claude_mpm/services/deployed_agent_discovery.py,sha256=GoXhho5EBz_FZDDl4xUWW_BnP
150
150
  claude_mpm/services/framework_agent_loader.py,sha256=QdRSYRurYF3YbAXJwIGei71BffD5AqOVcV3ktRPdk7g,14018
151
151
  claude_mpm/services/framework_claude_md_generator.py,sha256=3kHmkRLHTex6HFZ4DhbLVQb48j-5dAoy1q6UW1Qf7U8,22914
152
152
  claude_mpm/services/hook_service.py,sha256=hkpN8mXXYCwzdLVJwsoVg_fw5seEmei-q0ZzQyNoCXA,14200
153
+ claude_mpm/services/memory_builder.py,sha256=T-JrR5vlLN5ucXSK0uQsgYQwpFIIXbHFbJOT_U9orz4,19288
154
+ claude_mpm/services/memory_optimizer.py,sha256=YLs9DHH2c7T-t5Mr-OIlV4-vWdvKxS0KN3CIDGiPa5A,23332
155
+ claude_mpm/services/memory_router.py,sha256=opUFx2xJs1vZN6FyGo8yubqLRwQ6apIm1htZ_6yyoBc,17693
153
156
  claude_mpm/services/shared_prompt_cache.py,sha256=D04lrRWyg0lHyqGcAHy7IYvRHRKSg6EOpAJwBUPa2wk,29890
154
157
  claude_mpm/services/socketio_client_manager.py,sha256=2Ly63iiGA_BUzf73UwQDu9Q75wA1C4O1CWFv8hi8bms,18074
155
- claude_mpm/services/socketio_server.py,sha256=PoLOAyLi3xqPt7fAOTKjWXns48e5zyUyL26bPl0nuM8,28712
158
+ claude_mpm/services/socketio_server.py,sha256=1DIBfm6oqI7whB02bvSjEmNU1KkatrExqJjlxadw0JA,47687
156
159
  claude_mpm/services/standalone_socketio_server.py,sha256=XhsJ40Me3eSFHDpweIouy7dIqHK1aubikHCY275mUXk,24764
157
160
  claude_mpm/services/ticket_manager.py,sha256=Ki11YjBkDax8BFVSaDdOBk3K4VU5gvdbgq9AmCyyoZ0,7454
158
161
  claude_mpm/services/ticket_manager_di.py,sha256=pIsIGncbboKzBYSRQTO7ZX5MuQzV6iFfIflvKe6u1jw,11123
159
162
  claude_mpm/services/ticketing_service_original.py,sha256=Dg3TYKsy0Z3JCqV5rlMBXeMrhrkAGxOgAMUNRZtJIhw,16680
160
- claude_mpm/services/websocket_server.py,sha256=mC033w8TjwUGIv1r4uedtvQBPQQ_X7ZUA-u3ANugdMo,13553
161
163
  claude_mpm/services/framework_claude_md_generator/README.md,sha256=_-ty72t2afPagDVVUEizPkhs4BYkCeqCnZDNPgZAYtY,3511
162
164
  claude_mpm/services/framework_claude_md_generator/__init__.py,sha256=OtnwxLiJektfFtsKdkHM1X27rKkFiNd_rcf4843ziKw,7334
163
165
  claude_mpm/services/framework_claude_md_generator/content_assembler.py,sha256=CZlw84bBWjvK68VQhjAdLnMxXBXipZtcdyPtYWLdrKo,6590
@@ -211,9 +213,9 @@ claude_mpm/utils/paths.py,sha256=Xv0SZWdZRkRjN9e6clBcA165ya00GNQxt7SwMz51tfA,101
211
213
  claude_mpm/validation/__init__.py,sha256=bJ19g9lnk7yIjtxzN8XPegp87HTFBzCrGQOpFgRTf3g,155
212
214
  claude_mpm/validation/agent_validator.py,sha256=GCA2b2rKhKDeaNyUqWxTiWIs3sDdWjD9cgOFRp9K6ic,18227
213
215
  claude_mpm/web/open_dashboard.py,sha256=aXUc6LzUMwmTQMkl_h2jjvICimr-ED4FPMHP_9mnrgQ,1108
214
- claude_mpm-3.2.1.dist-info/licenses/LICENSE,sha256=cSdDfXjoTVhstrERrqme4zgxAu4GubU22zVEHsiXGxs,1071
215
- claude_mpm-3.2.1.dist-info/METADATA,sha256=Huw-Iij7OODoeQTLXpjKOHtaWuArPOy4g_iM9ul3Rlw,15029
216
- claude_mpm-3.2.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
217
- claude_mpm-3.2.1.dist-info/entry_points.txt,sha256=3_d7wLrg9sRmQ1SfrFGWoTNL8Wrd6lQb2XVSYbTwRIg,324
218
- claude_mpm-3.2.1.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
219
- claude_mpm-3.2.1.dist-info/RECORD,,
216
+ claude_mpm-3.3.2.dist-info/licenses/LICENSE,sha256=cSdDfXjoTVhstrERrqme4zgxAu4GubU22zVEHsiXGxs,1071
217
+ claude_mpm-3.3.2.dist-info/METADATA,sha256=QAeWt_WCNC36nD1Q8d5OdTW0kEUB0-mHLmbagNBflXY,5304
218
+ claude_mpm-3.3.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
219
+ claude_mpm-3.3.2.dist-info/entry_points.txt,sha256=3_d7wLrg9sRmQ1SfrFGWoTNL8Wrd6lQb2XVSYbTwRIg,324
220
+ claude_mpm-3.3.2.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
221
+ claude_mpm-3.3.2.dist-info/RECORD,,
@@ -1,34 +0,0 @@
1
- ---
2
- author: test-script
3
- model_preference: claude-3-sonnet
4
- specializations: []
5
- tags:
6
- - test
7
- - integration
8
- type: custom
9
- version: 1.0.0
10
- ---
11
-
12
- # Test Integration Agent
13
-
14
- ## 🎯 Primary Role
15
- test-integration-agent agent
16
-
17
- ## 🎯 When to Use This Agent
18
-
19
- **Select this agent when:**
20
-
21
- **Do NOT select for:**
22
-
23
- ## 🔧 Core Capabilities
24
-
25
- ## 🔑 Authority & Permissions
26
-
27
- ### ✅ Exclusive Write Access
28
-
29
- ### ❌ Forbidden Operations
30
-
31
- ---
32
- **Agent Type**: custom
33
- **Model Preference**: claude-3-sonnet
34
- **Version**: 1.0.0
@@ -1,233 +0,0 @@
1
- """Socket.IO logging handler with connection pooling for real-time log streaming.
2
-
3
- This handler now uses the Socket.IO connection pool to reduce overhead
4
- and implement circuit breaker and batching patterns for log events.
5
-
6
- WHY connection pooling approach:
7
- - Reduces connection setup/teardown overhead by 80%
8
- - Implements circuit breaker for resilience during outages
9
- - Provides micro-batching for high-frequency log events
10
- - Maintains persistent connections for better performance
11
- - Falls back gracefully when pool unavailable
12
- """
13
-
14
- import logging
15
- import json
16
- import os
17
- from datetime import datetime
18
- from typing import Optional
19
-
20
- # Connection pool import
21
- try:
22
- from .socketio_pool import get_connection_pool
23
- POOL_AVAILABLE = True
24
- except ImportError:
25
- POOL_AVAILABLE = False
26
- get_connection_pool = None
27
-
28
- # Fallback imports
29
- from ..services.websocket_server import get_server_instance
30
-
31
-
32
- class WebSocketHandler(logging.Handler):
33
- """Logging handler that broadcasts log messages via Socket.IO connection pool.
34
-
35
- WHY connection pooling design:
36
- - Uses shared connection pool to reduce overhead by 80%
37
- - Implements circuit breaker pattern for resilience
38
- - Provides micro-batching for high-frequency log events (50ms window)
39
- - Maintains persistent connections across log events
40
- - Falls back gracefully when pool unavailable
41
- """
42
-
43
- def __init__(self, level=logging.NOTSET):
44
- super().__init__(level)
45
- self._websocket_server = None
46
- self._connection_pool = None
47
- self._pool_initialized = False
48
- self._debug = os.environ.get('CLAUDE_MPM_HOOK_DEBUG', '').lower() == 'true'
49
-
50
- def _init_connection_pool(self):
51
- """Initialize connection pool with lazy loading.
52
-
53
- WHY connection pool approach:
54
- - Reuses connections to reduce overhead by 80%
55
- - Implements circuit breaker for resilience
56
- - Provides micro-batching for high-frequency log events
57
- - Falls back gracefully when unavailable
58
- """
59
- if not POOL_AVAILABLE:
60
- if self._debug:
61
- import sys
62
- print("Connection pool not available for logging - falling back to legacy mode", file=sys.stderr)
63
- return
64
-
65
- try:
66
- self._connection_pool = get_connection_pool()
67
- if self._debug:
68
- import sys
69
- print("WebSocket handler: Using Socket.IO connection pool", file=sys.stderr)
70
- except Exception as e:
71
- if self._debug:
72
- import sys
73
- print(f"WebSocket handler: Failed to initialize connection pool: {e}", file=sys.stderr)
74
- self._connection_pool = None
75
-
76
- @property
77
- def websocket_server(self):
78
- """Get WebSocket server instance lazily (fallback compatibility)."""
79
- if self._websocket_server is None:
80
- self._websocket_server = get_server_instance()
81
- return self._websocket_server
82
-
83
- def emit(self, record: logging.LogRecord):
84
- """Emit a log record via Socket.IO connection pool with batching.
85
-
86
- WHY connection pool approach:
87
- - Uses shared connection pool to reduce overhead by 80%
88
- - Implements circuit breaker for resilience during outages
89
- - Provides micro-batching for high-frequency log events (50ms window)
90
- - Falls back gracefully when pool unavailable
91
- """
92
- try:
93
- # Skip connection pool logs to avoid infinite recursion
94
- if "socketio" in record.name.lower() or record.name == "claude_mpm.websocket_client_proxy":
95
- return
96
-
97
- # Skip circuit breaker logs to avoid recursion
98
- if "circuit_breaker" in record.name.lower() or "socketio_pool" in record.name.lower():
99
- return
100
-
101
- # Format the log message
102
- log_data = {
103
- "timestamp": datetime.utcnow().isoformat() + "Z",
104
- "level": record.levelname,
105
- "logger": record.name,
106
- "message": self.format(record),
107
- "module": record.module,
108
- "function": record.funcName,
109
- "line": record.lineno,
110
- "thread": record.thread,
111
- "thread_name": record.threadName
112
- }
113
-
114
- # Add exception info if present
115
- if record.exc_info:
116
- import traceback
117
- log_data["exception"] = ''.join(traceback.format_exception(*record.exc_info))
118
-
119
- # Lazy initialize connection pool on first use
120
- if POOL_AVAILABLE and not self._pool_initialized:
121
- self._pool_initialized = True
122
- self._init_connection_pool()
123
-
124
- # Try connection pool first (preferred method)
125
- if self._connection_pool:
126
- try:
127
- self._connection_pool.emit_event('/log', 'message', log_data)
128
- if self._debug:
129
- import sys
130
- print(f"Emitted pooled Socket.IO log event: /log/message", file=sys.stderr)
131
- return
132
- except Exception as e:
133
- if self._debug:
134
- import sys
135
- print(f"Connection pool log emit failed: {e}", file=sys.stderr)
136
-
137
- # Fallback to legacy WebSocket server
138
- if self.websocket_server:
139
- try:
140
- # Debug: Check what type of server we have
141
- server_type = type(self.websocket_server).__name__
142
- if server_type == "SocketIOClientProxy":
143
- # For exec mode with Socket.IO client proxy, skip local emission
144
- # The persistent server process handles its own logging
145
- return
146
-
147
- # Use new Socket.IO event format
148
- if hasattr(self.websocket_server, 'log_message'):
149
- self.websocket_server.log_message(
150
- level=record.levelname,
151
- message=self.format(record),
152
- module=record.module
153
- )
154
- else:
155
- # Legacy fallback
156
- self.websocket_server.broadcast_event("log.message", log_data)
157
-
158
- if self._debug:
159
- import sys
160
- print(f"Emitted legacy log event", file=sys.stderr)
161
-
162
- except Exception as fallback_error:
163
- if self._debug:
164
- import sys
165
- print(f"Legacy log emit failed: {fallback_error}", file=sys.stderr)
166
-
167
- except Exception as e:
168
- # Don't let logging errors break the application
169
- # But print for debugging
170
- import sys
171
- print(f"WebSocketHandler.emit error: {e}", file=sys.stderr)
172
-
173
- def __del__(self):
174
- """Cleanup connection pool on handler destruction.
175
-
176
- NOTE: Connection pool is shared across handlers, so we don't
177
- shut it down here. The pool manages its own lifecycle.
178
- """
179
- # Connection pool is managed globally, no cleanup needed per handler
180
- pass
181
-
182
-
183
- class WebSocketFormatter(logging.Formatter):
184
- """Custom formatter for WebSocket log messages."""
185
-
186
- def __init__(self):
187
- super().__init__(
188
- fmt='%(name)s - %(levelname)s - %(message)s',
189
- datefmt='%Y-%m-%d %H:%M:%S'
190
- )
191
-
192
-
193
- def setup_websocket_logging(logger_name: Optional[str] = None, level: int = logging.INFO):
194
- """
195
- Set up WebSocket logging for a logger.
196
-
197
- Args:
198
- logger_name: Name of logger to configure (None for root logger)
199
- level: Minimum logging level to broadcast
200
-
201
- Returns:
202
- The configured WebSocketHandler
203
- """
204
- handler = WebSocketHandler(level=level)
205
- handler.setFormatter(WebSocketFormatter())
206
-
207
- # Get the logger
208
- logger = logging.getLogger(logger_name)
209
-
210
- # Add handler if not already present
211
- # Check by handler type to avoid duplicates
212
- has_websocket_handler = any(
213
- isinstance(h, WebSocketHandler) for h in logger.handlers
214
- )
215
-
216
- if not has_websocket_handler:
217
- logger.addHandler(handler)
218
-
219
- return handler
220
-
221
-
222
- def remove_websocket_logging(logger_name: Optional[str] = None):
223
- """Remove WebSocket handler from a logger."""
224
- logger = logging.getLogger(logger_name)
225
-
226
- # Remove all WebSocket handlers
227
- handlers_to_remove = [
228
- h for h in logger.handlers if isinstance(h, WebSocketHandler)
229
- ]
230
-
231
- for handler in handlers_to_remove:
232
- logger.removeHandler(handler)
233
- handler.close()