@nestjs-mcp/server 0.1.0 → 0.1.2-rc.0

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 (106) hide show
  1. package/README.md +4 -2
  2. package/dist/controllers/sse/sse.controller.d.ts +3 -1
  3. package/dist/controllers/sse/sse.controller.js +8 -2
  4. package/dist/controllers/sse/sse.controller.js.map +1 -1
  5. package/dist/controllers/sse/sse.service.d.ts +3 -2
  6. package/dist/controllers/sse/sse.service.js +21 -6
  7. package/dist/controllers/sse/sse.service.js.map +1 -1
  8. package/dist/controllers/streamable/streamable.service.d.ts +6 -11
  9. package/dist/controllers/streamable/streamable.service.js +36 -11
  10. package/dist/controllers/streamable/streamable.service.js.map +1 -1
  11. package/dist/index.d.ts +1 -0
  12. package/dist/index.js +1 -0
  13. package/dist/index.js.map +1 -1
  14. package/dist/interfaces/capabilities.interface.d.ts +30 -2
  15. package/dist/interfaces/capabilities.interface.js +51 -0
  16. package/dist/interfaces/capabilities.interface.js.map +1 -1
  17. package/dist/interfaces/context.interface.d.ts +6 -0
  18. package/dist/interfaces/context.interface.js +3 -0
  19. package/dist/interfaces/context.interface.js.map +1 -0
  20. package/dist/interfaces/index.d.ts +1 -1
  21. package/dist/interfaces/index.js +1 -1
  22. package/dist/interfaces/index.js.map +1 -1
  23. package/dist/interfaces/mcp-server-options.interface.d.ts +2 -2
  24. package/dist/interfaces/message.types.d.ts +8 -0
  25. package/dist/interfaces/{guards.interface.js → message.types.js} +1 -1
  26. package/dist/interfaces/message.types.js.map +1 -0
  27. package/dist/mcp.module.js +13 -1
  28. package/dist/mcp.module.js.map +1 -1
  29. package/dist/registry/registry.service.d.ts +7 -1
  30. package/dist/registry/registry.service.js +65 -4
  31. package/dist/registry/registry.service.js.map +1 -1
  32. package/dist/services/index.d.ts +1 -0
  33. package/dist/services/index.js +18 -0
  34. package/dist/services/index.js.map +1 -0
  35. package/dist/services/session.manager.d.ts +14 -0
  36. package/dist/services/session.manager.js +27 -0
  37. package/dist/services/session.manager.js.map +1 -0
  38. package/dist/tsconfig.build.tsbuildinfo +1 -1
  39. package/package.json +26 -17
  40. package/.copilotignore +0 -38
  41. package/.devcontainer/Dockerfile.dev +0 -28
  42. package/.devcontainer/devcontainer.json +0 -56
  43. package/.devcontainer/docker-compose.yml +0 -15
  44. package/.dockerignore +0 -37
  45. package/.prettierrc +0 -4
  46. package/coverage/clover.xml +0 -507
  47. package/coverage/coverage-final.json +0 -19
  48. package/coverage/lcov-report/base.css +0 -224
  49. package/coverage/lcov-report/block-navigation.js +0 -87
  50. package/coverage/lcov-report/favicon.png +0 -0
  51. package/coverage/lcov-report/index.html +0 -206
  52. package/coverage/lcov-report/prettify.css +0 -1
  53. package/coverage/lcov-report/prettify.js +0 -2
  54. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  55. package/coverage/lcov-report/sorter.js +0 -196
  56. package/coverage/lcov-report/src/controllers/sse/index.html +0 -146
  57. package/coverage/lcov-report/src/controllers/sse/index.ts.html +0 -91
  58. package/coverage/lcov-report/src/controllers/sse/sse.controller.ts.html +0 -160
  59. package/coverage/lcov-report/src/controllers/sse/sse.service.ts.html +0 -403
  60. package/coverage/lcov-report/src/controllers/streamable/index.html +0 -146
  61. package/coverage/lcov-report/src/controllers/streamable/index.ts.html +0 -91
  62. package/coverage/lcov-report/src/controllers/streamable/streamable.controller.ts.html +0 -157
  63. package/coverage/lcov-report/src/controllers/streamable/streamable.service.ts.html +0 -655
  64. package/coverage/lcov-report/src/decorators/capabilities.constants.ts.html +0 -106
  65. package/coverage/lcov-report/src/decorators/capabilities.decorators.ts.html +0 -535
  66. package/coverage/lcov-report/src/decorators/index.html +0 -146
  67. package/coverage/lcov-report/src/decorators/index.ts.html +0 -91
  68. package/coverage/lcov-report/src/index.html +0 -131
  69. package/coverage/lcov-report/src/index.ts.html +0 -118
  70. package/coverage/lcov-report/src/interfaces/capabilities.interface.ts.html +0 -703
  71. package/coverage/lcov-report/src/interfaces/index.html +0 -131
  72. package/coverage/lcov-report/src/interfaces/index.ts.html +0 -91
  73. package/coverage/lcov-report/src/mcp.module.ts.html +0 -817
  74. package/coverage/lcov-report/src/registry/discovery.service.ts.html +0 -433
  75. package/coverage/lcov-report/src/registry/index.html +0 -161
  76. package/coverage/lcov-report/src/registry/index.ts.html +0 -91
  77. package/coverage/lcov-report/src/registry/logger.service.ts.html +0 -514
  78. package/coverage/lcov-report/src/registry/registry.service.ts.html +0 -1183
  79. package/coverage/lcov-report/src/services/index.html +0 -116
  80. package/coverage/lcov-report/src/services/session.manager.ts.html +0 -163
  81. package/coverage/lcov.info +0 -912
  82. package/dist/interfaces/guards.interface.d.ts +0 -4
  83. package/dist/interfaces/guards.interface.js.map +0 -1
  84. package/eslint.config.mjs +0 -40
  85. package/src/controllers/sse/index.ts +0 -2
  86. package/src/controllers/sse/sse.controller.ts +0 -25
  87. package/src/controllers/sse/sse.service.ts +0 -106
  88. package/src/controllers/streamable/index.ts +0 -2
  89. package/src/controllers/streamable/streamable.controller.ts +0 -24
  90. package/src/controllers/streamable/streamable.service.ts +0 -190
  91. package/src/decorators/capabilities.constants.ts +0 -7
  92. package/src/decorators/capabilities.decorators.ts +0 -150
  93. package/src/decorators/index.ts +0 -2
  94. package/src/index.ts +0 -11
  95. package/src/interfaces/capabilities.interface.ts +0 -206
  96. package/src/interfaces/context.interface.ts +0 -33
  97. package/src/interfaces/index.ts +0 -2
  98. package/src/interfaces/mcp-server-options.interface.ts +0 -105
  99. package/src/interfaces/message.types.ts +0 -13
  100. package/src/mcp.module.ts +0 -244
  101. package/src/mcp.service.spec.ts +0 -28
  102. package/src/registry/discovery.service.ts +0 -116
  103. package/src/registry/index.ts +0 -2
  104. package/src/registry/logger.service.ts +0 -143
  105. package/src/registry/registry.service.ts +0 -366
  106. package/src/services/session.manager.ts +0 -26
@@ -1,1183 +0,0 @@
1
-
2
- <!doctype html>
3
- <html lang="en">
4
-
5
- <head>
6
- <title>Code coverage report for src/registry/registry.service.ts</title>
7
- <meta charset="utf-8" />
8
- <link rel="stylesheet" href="../../prettify.css" />
9
- <link rel="stylesheet" href="../../base.css" />
10
- <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
11
- <meta name="viewport" content="width=device-width, initial-scale=1" />
12
- <style type='text/css'>
13
- .coverage-summary .sorter {
14
- background-image: url(../../sort-arrow-sprite.png);
15
- }
16
- </style>
17
- </head>
18
-
19
- <body>
20
- <div class='wrapper'>
21
- <div class='pad1'>
22
- <h1><a href="../../index.html">All files</a> / <a href="index.html">src/registry</a> registry.service.ts</h1>
23
- <div class='clearfix'>
24
-
25
- <div class='fl pad1y space-right2'>
26
- <span class="strong">13.6% </span>
27
- <span class="quiet">Statements</span>
28
- <span class='fraction'>17/125</span>
29
- </div>
30
-
31
-
32
- <div class='fl pad1y space-right2'>
33
- <span class="strong">0% </span>
34
- <span class="quiet">Branches</span>
35
- <span class='fraction'>0/68</span>
36
- </div>
37
-
38
-
39
- <div class='fl pad1y space-right2'>
40
- <span class="strong">4.34% </span>
41
- <span class="quiet">Functions</span>
42
- <span class='fraction'>1/23</span>
43
- </div>
44
-
45
-
46
- <div class='fl pad1y space-right2'>
47
- <span class="strong">12.82% </span>
48
- <span class="quiet">Lines</span>
49
- <span class='fraction'>15/117</span>
50
- </div>
51
-
52
-
53
- </div>
54
- <p class="quiet">
55
- Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
- </p>
57
- <template id="filterTemplate">
58
- <div class="quiet">
59
- Filter:
60
- <input type="search" id="fileSearch">
61
- </div>
62
- </template>
63
- </div>
64
- <div class='status-line low'></div>
65
- <pre><table class="coverage">
66
- <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
- <a name='L2'></a><a href='#L2'>2</a>
68
- <a name='L3'></a><a href='#L3'>3</a>
69
- <a name='L4'></a><a href='#L4'>4</a>
70
- <a name='L5'></a><a href='#L5'>5</a>
71
- <a name='L6'></a><a href='#L6'>6</a>
72
- <a name='L7'></a><a href='#L7'>7</a>
73
- <a name='L8'></a><a href='#L8'>8</a>
74
- <a name='L9'></a><a href='#L9'>9</a>
75
- <a name='L10'></a><a href='#L10'>10</a>
76
- <a name='L11'></a><a href='#L11'>11</a>
77
- <a name='L12'></a><a href='#L12'>12</a>
78
- <a name='L13'></a><a href='#L13'>13</a>
79
- <a name='L14'></a><a href='#L14'>14</a>
80
- <a name='L15'></a><a href='#L15'>15</a>
81
- <a name='L16'></a><a href='#L16'>16</a>
82
- <a name='L17'></a><a href='#L17'>17</a>
83
- <a name='L18'></a><a href='#L18'>18</a>
84
- <a name='L19'></a><a href='#L19'>19</a>
85
- <a name='L20'></a><a href='#L20'>20</a>
86
- <a name='L21'></a><a href='#L21'>21</a>
87
- <a name='L22'></a><a href='#L22'>22</a>
88
- <a name='L23'></a><a href='#L23'>23</a>
89
- <a name='L24'></a><a href='#L24'>24</a>
90
- <a name='L25'></a><a href='#L25'>25</a>
91
- <a name='L26'></a><a href='#L26'>26</a>
92
- <a name='L27'></a><a href='#L27'>27</a>
93
- <a name='L28'></a><a href='#L28'>28</a>
94
- <a name='L29'></a><a href='#L29'>29</a>
95
- <a name='L30'></a><a href='#L30'>30</a>
96
- <a name='L31'></a><a href='#L31'>31</a>
97
- <a name='L32'></a><a href='#L32'>32</a>
98
- <a name='L33'></a><a href='#L33'>33</a>
99
- <a name='L34'></a><a href='#L34'>34</a>
100
- <a name='L35'></a><a href='#L35'>35</a>
101
- <a name='L36'></a><a href='#L36'>36</a>
102
- <a name='L37'></a><a href='#L37'>37</a>
103
- <a name='L38'></a><a href='#L38'>38</a>
104
- <a name='L39'></a><a href='#L39'>39</a>
105
- <a name='L40'></a><a href='#L40'>40</a>
106
- <a name='L41'></a><a href='#L41'>41</a>
107
- <a name='L42'></a><a href='#L42'>42</a>
108
- <a name='L43'></a><a href='#L43'>43</a>
109
- <a name='L44'></a><a href='#L44'>44</a>
110
- <a name='L45'></a><a href='#L45'>45</a>
111
- <a name='L46'></a><a href='#L46'>46</a>
112
- <a name='L47'></a><a href='#L47'>47</a>
113
- <a name='L48'></a><a href='#L48'>48</a>
114
- <a name='L49'></a><a href='#L49'>49</a>
115
- <a name='L50'></a><a href='#L50'>50</a>
116
- <a name='L51'></a><a href='#L51'>51</a>
117
- <a name='L52'></a><a href='#L52'>52</a>
118
- <a name='L53'></a><a href='#L53'>53</a>
119
- <a name='L54'></a><a href='#L54'>54</a>
120
- <a name='L55'></a><a href='#L55'>55</a>
121
- <a name='L56'></a><a href='#L56'>56</a>
122
- <a name='L57'></a><a href='#L57'>57</a>
123
- <a name='L58'></a><a href='#L58'>58</a>
124
- <a name='L59'></a><a href='#L59'>59</a>
125
- <a name='L60'></a><a href='#L60'>60</a>
126
- <a name='L61'></a><a href='#L61'>61</a>
127
- <a name='L62'></a><a href='#L62'>62</a>
128
- <a name='L63'></a><a href='#L63'>63</a>
129
- <a name='L64'></a><a href='#L64'>64</a>
130
- <a name='L65'></a><a href='#L65'>65</a>
131
- <a name='L66'></a><a href='#L66'>66</a>
132
- <a name='L67'></a><a href='#L67'>67</a>
133
- <a name='L68'></a><a href='#L68'>68</a>
134
- <a name='L69'></a><a href='#L69'>69</a>
135
- <a name='L70'></a><a href='#L70'>70</a>
136
- <a name='L71'></a><a href='#L71'>71</a>
137
- <a name='L72'></a><a href='#L72'>72</a>
138
- <a name='L73'></a><a href='#L73'>73</a>
139
- <a name='L74'></a><a href='#L74'>74</a>
140
- <a name='L75'></a><a href='#L75'>75</a>
141
- <a name='L76'></a><a href='#L76'>76</a>
142
- <a name='L77'></a><a href='#L77'>77</a>
143
- <a name='L78'></a><a href='#L78'>78</a>
144
- <a name='L79'></a><a href='#L79'>79</a>
145
- <a name='L80'></a><a href='#L80'>80</a>
146
- <a name='L81'></a><a href='#L81'>81</a>
147
- <a name='L82'></a><a href='#L82'>82</a>
148
- <a name='L83'></a><a href='#L83'>83</a>
149
- <a name='L84'></a><a href='#L84'>84</a>
150
- <a name='L85'></a><a href='#L85'>85</a>
151
- <a name='L86'></a><a href='#L86'>86</a>
152
- <a name='L87'></a><a href='#L87'>87</a>
153
- <a name='L88'></a><a href='#L88'>88</a>
154
- <a name='L89'></a><a href='#L89'>89</a>
155
- <a name='L90'></a><a href='#L90'>90</a>
156
- <a name='L91'></a><a href='#L91'>91</a>
157
- <a name='L92'></a><a href='#L92'>92</a>
158
- <a name='L93'></a><a href='#L93'>93</a>
159
- <a name='L94'></a><a href='#L94'>94</a>
160
- <a name='L95'></a><a href='#L95'>95</a>
161
- <a name='L96'></a><a href='#L96'>96</a>
162
- <a name='L97'></a><a href='#L97'>97</a>
163
- <a name='L98'></a><a href='#L98'>98</a>
164
- <a name='L99'></a><a href='#L99'>99</a>
165
- <a name='L100'></a><a href='#L100'>100</a>
166
- <a name='L101'></a><a href='#L101'>101</a>
167
- <a name='L102'></a><a href='#L102'>102</a>
168
- <a name='L103'></a><a href='#L103'>103</a>
169
- <a name='L104'></a><a href='#L104'>104</a>
170
- <a name='L105'></a><a href='#L105'>105</a>
171
- <a name='L106'></a><a href='#L106'>106</a>
172
- <a name='L107'></a><a href='#L107'>107</a>
173
- <a name='L108'></a><a href='#L108'>108</a>
174
- <a name='L109'></a><a href='#L109'>109</a>
175
- <a name='L110'></a><a href='#L110'>110</a>
176
- <a name='L111'></a><a href='#L111'>111</a>
177
- <a name='L112'></a><a href='#L112'>112</a>
178
- <a name='L113'></a><a href='#L113'>113</a>
179
- <a name='L114'></a><a href='#L114'>114</a>
180
- <a name='L115'></a><a href='#L115'>115</a>
181
- <a name='L116'></a><a href='#L116'>116</a>
182
- <a name='L117'></a><a href='#L117'>117</a>
183
- <a name='L118'></a><a href='#L118'>118</a>
184
- <a name='L119'></a><a href='#L119'>119</a>
185
- <a name='L120'></a><a href='#L120'>120</a>
186
- <a name='L121'></a><a href='#L121'>121</a>
187
- <a name='L122'></a><a href='#L122'>122</a>
188
- <a name='L123'></a><a href='#L123'>123</a>
189
- <a name='L124'></a><a href='#L124'>124</a>
190
- <a name='L125'></a><a href='#L125'>125</a>
191
- <a name='L126'></a><a href='#L126'>126</a>
192
- <a name='L127'></a><a href='#L127'>127</a>
193
- <a name='L128'></a><a href='#L128'>128</a>
194
- <a name='L129'></a><a href='#L129'>129</a>
195
- <a name='L130'></a><a href='#L130'>130</a>
196
- <a name='L131'></a><a href='#L131'>131</a>
197
- <a name='L132'></a><a href='#L132'>132</a>
198
- <a name='L133'></a><a href='#L133'>133</a>
199
- <a name='L134'></a><a href='#L134'>134</a>
200
- <a name='L135'></a><a href='#L135'>135</a>
201
- <a name='L136'></a><a href='#L136'>136</a>
202
- <a name='L137'></a><a href='#L137'>137</a>
203
- <a name='L138'></a><a href='#L138'>138</a>
204
- <a name='L139'></a><a href='#L139'>139</a>
205
- <a name='L140'></a><a href='#L140'>140</a>
206
- <a name='L141'></a><a href='#L141'>141</a>
207
- <a name='L142'></a><a href='#L142'>142</a>
208
- <a name='L143'></a><a href='#L143'>143</a>
209
- <a name='L144'></a><a href='#L144'>144</a>
210
- <a name='L145'></a><a href='#L145'>145</a>
211
- <a name='L146'></a><a href='#L146'>146</a>
212
- <a name='L147'></a><a href='#L147'>147</a>
213
- <a name='L148'></a><a href='#L148'>148</a>
214
- <a name='L149'></a><a href='#L149'>149</a>
215
- <a name='L150'></a><a href='#L150'>150</a>
216
- <a name='L151'></a><a href='#L151'>151</a>
217
- <a name='L152'></a><a href='#L152'>152</a>
218
- <a name='L153'></a><a href='#L153'>153</a>
219
- <a name='L154'></a><a href='#L154'>154</a>
220
- <a name='L155'></a><a href='#L155'>155</a>
221
- <a name='L156'></a><a href='#L156'>156</a>
222
- <a name='L157'></a><a href='#L157'>157</a>
223
- <a name='L158'></a><a href='#L158'>158</a>
224
- <a name='L159'></a><a href='#L159'>159</a>
225
- <a name='L160'></a><a href='#L160'>160</a>
226
- <a name='L161'></a><a href='#L161'>161</a>
227
- <a name='L162'></a><a href='#L162'>162</a>
228
- <a name='L163'></a><a href='#L163'>163</a>
229
- <a name='L164'></a><a href='#L164'>164</a>
230
- <a name='L165'></a><a href='#L165'>165</a>
231
- <a name='L166'></a><a href='#L166'>166</a>
232
- <a name='L167'></a><a href='#L167'>167</a>
233
- <a name='L168'></a><a href='#L168'>168</a>
234
- <a name='L169'></a><a href='#L169'>169</a>
235
- <a name='L170'></a><a href='#L170'>170</a>
236
- <a name='L171'></a><a href='#L171'>171</a>
237
- <a name='L172'></a><a href='#L172'>172</a>
238
- <a name='L173'></a><a href='#L173'>173</a>
239
- <a name='L174'></a><a href='#L174'>174</a>
240
- <a name='L175'></a><a href='#L175'>175</a>
241
- <a name='L176'></a><a href='#L176'>176</a>
242
- <a name='L177'></a><a href='#L177'>177</a>
243
- <a name='L178'></a><a href='#L178'>178</a>
244
- <a name='L179'></a><a href='#L179'>179</a>
245
- <a name='L180'></a><a href='#L180'>180</a>
246
- <a name='L181'></a><a href='#L181'>181</a>
247
- <a name='L182'></a><a href='#L182'>182</a>
248
- <a name='L183'></a><a href='#L183'>183</a>
249
- <a name='L184'></a><a href='#L184'>184</a>
250
- <a name='L185'></a><a href='#L185'>185</a>
251
- <a name='L186'></a><a href='#L186'>186</a>
252
- <a name='L187'></a><a href='#L187'>187</a>
253
- <a name='L188'></a><a href='#L188'>188</a>
254
- <a name='L189'></a><a href='#L189'>189</a>
255
- <a name='L190'></a><a href='#L190'>190</a>
256
- <a name='L191'></a><a href='#L191'>191</a>
257
- <a name='L192'></a><a href='#L192'>192</a>
258
- <a name='L193'></a><a href='#L193'>193</a>
259
- <a name='L194'></a><a href='#L194'>194</a>
260
- <a name='L195'></a><a href='#L195'>195</a>
261
- <a name='L196'></a><a href='#L196'>196</a>
262
- <a name='L197'></a><a href='#L197'>197</a>
263
- <a name='L198'></a><a href='#L198'>198</a>
264
- <a name='L199'></a><a href='#L199'>199</a>
265
- <a name='L200'></a><a href='#L200'>200</a>
266
- <a name='L201'></a><a href='#L201'>201</a>
267
- <a name='L202'></a><a href='#L202'>202</a>
268
- <a name='L203'></a><a href='#L203'>203</a>
269
- <a name='L204'></a><a href='#L204'>204</a>
270
- <a name='L205'></a><a href='#L205'>205</a>
271
- <a name='L206'></a><a href='#L206'>206</a>
272
- <a name='L207'></a><a href='#L207'>207</a>
273
- <a name='L208'></a><a href='#L208'>208</a>
274
- <a name='L209'></a><a href='#L209'>209</a>
275
- <a name='L210'></a><a href='#L210'>210</a>
276
- <a name='L211'></a><a href='#L211'>211</a>
277
- <a name='L212'></a><a href='#L212'>212</a>
278
- <a name='L213'></a><a href='#L213'>213</a>
279
- <a name='L214'></a><a href='#L214'>214</a>
280
- <a name='L215'></a><a href='#L215'>215</a>
281
- <a name='L216'></a><a href='#L216'>216</a>
282
- <a name='L217'></a><a href='#L217'>217</a>
283
- <a name='L218'></a><a href='#L218'>218</a>
284
- <a name='L219'></a><a href='#L219'>219</a>
285
- <a name='L220'></a><a href='#L220'>220</a>
286
- <a name='L221'></a><a href='#L221'>221</a>
287
- <a name='L222'></a><a href='#L222'>222</a>
288
- <a name='L223'></a><a href='#L223'>223</a>
289
- <a name='L224'></a><a href='#L224'>224</a>
290
- <a name='L225'></a><a href='#L225'>225</a>
291
- <a name='L226'></a><a href='#L226'>226</a>
292
- <a name='L227'></a><a href='#L227'>227</a>
293
- <a name='L228'></a><a href='#L228'>228</a>
294
- <a name='L229'></a><a href='#L229'>229</a>
295
- <a name='L230'></a><a href='#L230'>230</a>
296
- <a name='L231'></a><a href='#L231'>231</a>
297
- <a name='L232'></a><a href='#L232'>232</a>
298
- <a name='L233'></a><a href='#L233'>233</a>
299
- <a name='L234'></a><a href='#L234'>234</a>
300
- <a name='L235'></a><a href='#L235'>235</a>
301
- <a name='L236'></a><a href='#L236'>236</a>
302
- <a name='L237'></a><a href='#L237'>237</a>
303
- <a name='L238'></a><a href='#L238'>238</a>
304
- <a name='L239'></a><a href='#L239'>239</a>
305
- <a name='L240'></a><a href='#L240'>240</a>
306
- <a name='L241'></a><a href='#L241'>241</a>
307
- <a name='L242'></a><a href='#L242'>242</a>
308
- <a name='L243'></a><a href='#L243'>243</a>
309
- <a name='L244'></a><a href='#L244'>244</a>
310
- <a name='L245'></a><a href='#L245'>245</a>
311
- <a name='L246'></a><a href='#L246'>246</a>
312
- <a name='L247'></a><a href='#L247'>247</a>
313
- <a name='L248'></a><a href='#L248'>248</a>
314
- <a name='L249'></a><a href='#L249'>249</a>
315
- <a name='L250'></a><a href='#L250'>250</a>
316
- <a name='L251'></a><a href='#L251'>251</a>
317
- <a name='L252'></a><a href='#L252'>252</a>
318
- <a name='L253'></a><a href='#L253'>253</a>
319
- <a name='L254'></a><a href='#L254'>254</a>
320
- <a name='L255'></a><a href='#L255'>255</a>
321
- <a name='L256'></a><a href='#L256'>256</a>
322
- <a name='L257'></a><a href='#L257'>257</a>
323
- <a name='L258'></a><a href='#L258'>258</a>
324
- <a name='L259'></a><a href='#L259'>259</a>
325
- <a name='L260'></a><a href='#L260'>260</a>
326
- <a name='L261'></a><a href='#L261'>261</a>
327
- <a name='L262'></a><a href='#L262'>262</a>
328
- <a name='L263'></a><a href='#L263'>263</a>
329
- <a name='L264'></a><a href='#L264'>264</a>
330
- <a name='L265'></a><a href='#L265'>265</a>
331
- <a name='L266'></a><a href='#L266'>266</a>
332
- <a name='L267'></a><a href='#L267'>267</a>
333
- <a name='L268'></a><a href='#L268'>268</a>
334
- <a name='L269'></a><a href='#L269'>269</a>
335
- <a name='L270'></a><a href='#L270'>270</a>
336
- <a name='L271'></a><a href='#L271'>271</a>
337
- <a name='L272'></a><a href='#L272'>272</a>
338
- <a name='L273'></a><a href='#L273'>273</a>
339
- <a name='L274'></a><a href='#L274'>274</a>
340
- <a name='L275'></a><a href='#L275'>275</a>
341
- <a name='L276'></a><a href='#L276'>276</a>
342
- <a name='L277'></a><a href='#L277'>277</a>
343
- <a name='L278'></a><a href='#L278'>278</a>
344
- <a name='L279'></a><a href='#L279'>279</a>
345
- <a name='L280'></a><a href='#L280'>280</a>
346
- <a name='L281'></a><a href='#L281'>281</a>
347
- <a name='L282'></a><a href='#L282'>282</a>
348
- <a name='L283'></a><a href='#L283'>283</a>
349
- <a name='L284'></a><a href='#L284'>284</a>
350
- <a name='L285'></a><a href='#L285'>285</a>
351
- <a name='L286'></a><a href='#L286'>286</a>
352
- <a name='L287'></a><a href='#L287'>287</a>
353
- <a name='L288'></a><a href='#L288'>288</a>
354
- <a name='L289'></a><a href='#L289'>289</a>
355
- <a name='L290'></a><a href='#L290'>290</a>
356
- <a name='L291'></a><a href='#L291'>291</a>
357
- <a name='L292'></a><a href='#L292'>292</a>
358
- <a name='L293'></a><a href='#L293'>293</a>
359
- <a name='L294'></a><a href='#L294'>294</a>
360
- <a name='L295'></a><a href='#L295'>295</a>
361
- <a name='L296'></a><a href='#L296'>296</a>
362
- <a name='L297'></a><a href='#L297'>297</a>
363
- <a name='L298'></a><a href='#L298'>298</a>
364
- <a name='L299'></a><a href='#L299'>299</a>
365
- <a name='L300'></a><a href='#L300'>300</a>
366
- <a name='L301'></a><a href='#L301'>301</a>
367
- <a name='L302'></a><a href='#L302'>302</a>
368
- <a name='L303'></a><a href='#L303'>303</a>
369
- <a name='L304'></a><a href='#L304'>304</a>
370
- <a name='L305'></a><a href='#L305'>305</a>
371
- <a name='L306'></a><a href='#L306'>306</a>
372
- <a name='L307'></a><a href='#L307'>307</a>
373
- <a name='L308'></a><a href='#L308'>308</a>
374
- <a name='L309'></a><a href='#L309'>309</a>
375
- <a name='L310'></a><a href='#L310'>310</a>
376
- <a name='L311'></a><a href='#L311'>311</a>
377
- <a name='L312'></a><a href='#L312'>312</a>
378
- <a name='L313'></a><a href='#L313'>313</a>
379
- <a name='L314'></a><a href='#L314'>314</a>
380
- <a name='L315'></a><a href='#L315'>315</a>
381
- <a name='L316'></a><a href='#L316'>316</a>
382
- <a name='L317'></a><a href='#L317'>317</a>
383
- <a name='L318'></a><a href='#L318'>318</a>
384
- <a name='L319'></a><a href='#L319'>319</a>
385
- <a name='L320'></a><a href='#L320'>320</a>
386
- <a name='L321'></a><a href='#L321'>321</a>
387
- <a name='L322'></a><a href='#L322'>322</a>
388
- <a name='L323'></a><a href='#L323'>323</a>
389
- <a name='L324'></a><a href='#L324'>324</a>
390
- <a name='L325'></a><a href='#L325'>325</a>
391
- <a name='L326'></a><a href='#L326'>326</a>
392
- <a name='L327'></a><a href='#L327'>327</a>
393
- <a name='L328'></a><a href='#L328'>328</a>
394
- <a name='L329'></a><a href='#L329'>329</a>
395
- <a name='L330'></a><a href='#L330'>330</a>
396
- <a name='L331'></a><a href='#L331'>331</a>
397
- <a name='L332'></a><a href='#L332'>332</a>
398
- <a name='L333'></a><a href='#L333'>333</a>
399
- <a name='L334'></a><a href='#L334'>334</a>
400
- <a name='L335'></a><a href='#L335'>335</a>
401
- <a name='L336'></a><a href='#L336'>336</a>
402
- <a name='L337'></a><a href='#L337'>337</a>
403
- <a name='L338'></a><a href='#L338'>338</a>
404
- <a name='L339'></a><a href='#L339'>339</a>
405
- <a name='L340'></a><a href='#L340'>340</a>
406
- <a name='L341'></a><a href='#L341'>341</a>
407
- <a name='L342'></a><a href='#L342'>342</a>
408
- <a name='L343'></a><a href='#L343'>343</a>
409
- <a name='L344'></a><a href='#L344'>344</a>
410
- <a name='L345'></a><a href='#L345'>345</a>
411
- <a name='L346'></a><a href='#L346'>346</a>
412
- <a name='L347'></a><a href='#L347'>347</a>
413
- <a name='L348'></a><a href='#L348'>348</a>
414
- <a name='L349'></a><a href='#L349'>349</a>
415
- <a name='L350'></a><a href='#L350'>350</a>
416
- <a name='L351'></a><a href='#L351'>351</a>
417
- <a name='L352'></a><a href='#L352'>352</a>
418
- <a name='L353'></a><a href='#L353'>353</a>
419
- <a name='L354'></a><a href='#L354'>354</a>
420
- <a name='L355'></a><a href='#L355'>355</a>
421
- <a name='L356'></a><a href='#L356'>356</a>
422
- <a name='L357'></a><a href='#L357'>357</a>
423
- <a name='L358'></a><a href='#L358'>358</a>
424
- <a name='L359'></a><a href='#L359'>359</a>
425
- <a name='L360'></a><a href='#L360'>360</a>
426
- <a name='L361'></a><a href='#L361'>361</a>
427
- <a name='L362'></a><a href='#L362'>362</a>
428
- <a name='L363'></a><a href='#L363'>363</a>
429
- <a name='L364'></a><a href='#L364'>364</a>
430
- <a name='L365'></a><a href='#L365'>365</a>
431
- <a name='L366'></a><a href='#L366'>366</a>
432
- <a name='L367'></a><a href='#L367'>367</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
433
- <span class="cline-any cline-neutral">&nbsp;</span>
434
- <span class="cline-any cline-neutral">&nbsp;</span>
435
- <span class="cline-any cline-neutral">&nbsp;</span>
436
- <span class="cline-any cline-neutral">&nbsp;</span>
437
- <span class="cline-any cline-yes">1x</span>
438
- <span class="cline-any cline-yes">1x</span>
439
- <span class="cline-any cline-neutral">&nbsp;</span>
440
- <span class="cline-any cline-yes">1x</span>
441
- <span class="cline-any cline-yes">1x</span>
442
- <span class="cline-any cline-neutral">&nbsp;</span>
443
- <span class="cline-any cline-neutral">&nbsp;</span>
444
- <span class="cline-any cline-neutral">&nbsp;</span>
445
- <span class="cline-any cline-neutral">&nbsp;</span>
446
- <span class="cline-any cline-yes">1x</span>
447
- <span class="cline-any cline-yes">1x</span>
448
- <span class="cline-any cline-neutral">&nbsp;</span>
449
- <span class="cline-any cline-neutral">&nbsp;</span>
450
- <span class="cline-any cline-neutral">&nbsp;</span>
451
- <span class="cline-any cline-neutral">&nbsp;</span>
452
- <span class="cline-any cline-neutral">&nbsp;</span>
453
- <span class="cline-any cline-neutral">&nbsp;</span>
454
- <span class="cline-any cline-neutral">&nbsp;</span>
455
- <span class="cline-any cline-neutral">&nbsp;</span>
456
- <span class="cline-any cline-neutral">&nbsp;</span>
457
- <span class="cline-any cline-neutral">&nbsp;</span>
458
- <span class="cline-any cline-yes">1x</span>
459
- <span class="cline-any cline-yes">1x</span>
460
- <span class="cline-any cline-yes">1x</span>
461
- <span class="cline-any cline-neutral">&nbsp;</span>
462
- <span class="cline-any cline-neutral">&nbsp;</span>
463
- <span class="cline-any cline-yes">1x</span>
464
- <span class="cline-any cline-neutral">&nbsp;</span>
465
- <span class="cline-any cline-yes">1x</span>
466
- <span class="cline-any cline-yes">1x</span>
467
- <span class="cline-any cline-yes">1x</span>
468
- <span class="cline-any cline-yes">1x</span>
469
- <span class="cline-any cline-neutral">&nbsp;</span>
470
- <span class="cline-any cline-neutral">&nbsp;</span>
471
- <span class="cline-any cline-neutral">&nbsp;</span>
472
- <span class="cline-any cline-no">&nbsp;</span>
473
- <span class="cline-any cline-neutral">&nbsp;</span>
474
- <span class="cline-any cline-neutral">&nbsp;</span>
475
- <span class="cline-any cline-neutral">&nbsp;</span>
476
- <span class="cline-any cline-neutral">&nbsp;</span>
477
- <span class="cline-any cline-no">&nbsp;</span>
478
- <span class="cline-any cline-neutral">&nbsp;</span>
479
- <span class="cline-any cline-neutral">&nbsp;</span>
480
- <span class="cline-any cline-neutral">&nbsp;</span>
481
- <span class="cline-any cline-neutral">&nbsp;</span>
482
- <span class="cline-any cline-neutral">&nbsp;</span>
483
- <span class="cline-any cline-neutral">&nbsp;</span>
484
- <span class="cline-any cline-neutral">&nbsp;</span>
485
- <span class="cline-any cline-no">&nbsp;</span>
486
- <span class="cline-any cline-neutral">&nbsp;</span>
487
- <span class="cline-any cline-no">&nbsp;</span>
488
- <span class="cline-any cline-no">&nbsp;</span>
489
- <span class="cline-any cline-no">&nbsp;</span>
490
- <span class="cline-any cline-neutral">&nbsp;</span>
491
- <span class="cline-any cline-no">&nbsp;</span>
492
- <span class="cline-any cline-neutral">&nbsp;</span>
493
- <span class="cline-any cline-neutral">&nbsp;</span>
494
- <span class="cline-any cline-neutral">&nbsp;</span>
495
- <span class="cline-any cline-neutral">&nbsp;</span>
496
- <span class="cline-any cline-neutral">&nbsp;</span>
497
- <span class="cline-any cline-neutral">&nbsp;</span>
498
- <span class="cline-any cline-neutral">&nbsp;</span>
499
- <span class="cline-any cline-neutral">&nbsp;</span>
500
- <span class="cline-any cline-neutral">&nbsp;</span>
501
- <span class="cline-any cline-neutral">&nbsp;</span>
502
- <span class="cline-any cline-no">&nbsp;</span>
503
- <span class="cline-any cline-neutral">&nbsp;</span>
504
- <span class="cline-any cline-no">&nbsp;</span>
505
- <span class="cline-any cline-neutral">&nbsp;</span>
506
- <span class="cline-any cline-no">&nbsp;</span>
507
- <span class="cline-any cline-neutral">&nbsp;</span>
508
- <span class="cline-any cline-neutral">&nbsp;</span>
509
- <span class="cline-any cline-neutral">&nbsp;</span>
510
- <span class="cline-any cline-neutral">&nbsp;</span>
511
- <span class="cline-any cline-neutral">&nbsp;</span>
512
- <span class="cline-any cline-neutral">&nbsp;</span>
513
- <span class="cline-any cline-neutral">&nbsp;</span>
514
- <span class="cline-any cline-neutral">&nbsp;</span>
515
- <span class="cline-any cline-neutral">&nbsp;</span>
516
- <span class="cline-any cline-neutral">&nbsp;</span>
517
- <span class="cline-any cline-no">&nbsp;</span>
518
- <span class="cline-any cline-neutral">&nbsp;</span>
519
- <span class="cline-any cline-neutral">&nbsp;</span>
520
- <span class="cline-any cline-neutral">&nbsp;</span>
521
- <span class="cline-any cline-neutral">&nbsp;</span>
522
- <span class="cline-any cline-neutral">&nbsp;</span>
523
- <span class="cline-any cline-neutral">&nbsp;</span>
524
- <span class="cline-any cline-no">&nbsp;</span>
525
- <span class="cline-any cline-neutral">&nbsp;</span>
526
- <span class="cline-any cline-neutral">&nbsp;</span>
527
- <span class="cline-any cline-neutral">&nbsp;</span>
528
- <span class="cline-any cline-neutral">&nbsp;</span>
529
- <span class="cline-any cline-neutral">&nbsp;</span>
530
- <span class="cline-any cline-neutral">&nbsp;</span>
531
- <span class="cline-any cline-no">&nbsp;</span>
532
- <span class="cline-any cline-neutral">&nbsp;</span>
533
- <span class="cline-any cline-neutral">&nbsp;</span>
534
- <span class="cline-any cline-neutral">&nbsp;</span>
535
- <span class="cline-any cline-neutral">&nbsp;</span>
536
- <span class="cline-any cline-neutral">&nbsp;</span>
537
- <span class="cline-any cline-neutral">&nbsp;</span>
538
- <span class="cline-any cline-neutral">&nbsp;</span>
539
- <span class="cline-any cline-neutral">&nbsp;</span>
540
- <span class="cline-any cline-neutral">&nbsp;</span>
541
- <span class="cline-any cline-neutral">&nbsp;</span>
542
- <span class="cline-any cline-neutral">&nbsp;</span>
543
- <span class="cline-any cline-neutral">&nbsp;</span>
544
- <span class="cline-any cline-neutral">&nbsp;</span>
545
- <span class="cline-any cline-neutral">&nbsp;</span>
546
- <span class="cline-any cline-neutral">&nbsp;</span>
547
- <span class="cline-any cline-neutral">&nbsp;</span>
548
- <span class="cline-any cline-neutral">&nbsp;</span>
549
- <span class="cline-any cline-neutral">&nbsp;</span>
550
- <span class="cline-any cline-no">&nbsp;</span>
551
- <span class="cline-any cline-neutral">&nbsp;</span>
552
- <span class="cline-any cline-neutral">&nbsp;</span>
553
- <span class="cline-any cline-no">&nbsp;</span>
554
- <span class="cline-any cline-neutral">&nbsp;</span>
555
- <span class="cline-any cline-neutral">&nbsp;</span>
556
- <span class="cline-any cline-neutral">&nbsp;</span>
557
- <span class="cline-any cline-neutral">&nbsp;</span>
558
- <span class="cline-any cline-neutral">&nbsp;</span>
559
- <span class="cline-any cline-no">&nbsp;</span>
560
- <span class="cline-any cline-neutral">&nbsp;</span>
561
- <span class="cline-any cline-neutral">&nbsp;</span>
562
- <span class="cline-any cline-neutral">&nbsp;</span>
563
- <span class="cline-any cline-neutral">&nbsp;</span>
564
- <span class="cline-any cline-no">&nbsp;</span>
565
- <span class="cline-any cline-neutral">&nbsp;</span>
566
- <span class="cline-any cline-neutral">&nbsp;</span>
567
- <span class="cline-any cline-no">&nbsp;</span>
568
- <span class="cline-any cline-neutral">&nbsp;</span>
569
- <span class="cline-any cline-neutral">&nbsp;</span>
570
- <span class="cline-any cline-neutral">&nbsp;</span>
571
- <span class="cline-any cline-neutral">&nbsp;</span>
572
- <span class="cline-any cline-neutral">&nbsp;</span>
573
- <span class="cline-any cline-neutral">&nbsp;</span>
574
- <span class="cline-any cline-neutral">&nbsp;</span>
575
- <span class="cline-any cline-no">&nbsp;</span>
576
- <span class="cline-any cline-neutral">&nbsp;</span>
577
- <span class="cline-any cline-no">&nbsp;</span>
578
- <span class="cline-any cline-neutral">&nbsp;</span>
579
- <span class="cline-any cline-no">&nbsp;</span>
580
- <span class="cline-any cline-neutral">&nbsp;</span>
581
- <span class="cline-any cline-no">&nbsp;</span>
582
- <span class="cline-any cline-neutral">&nbsp;</span>
583
- <span class="cline-any cline-no">&nbsp;</span>
584
- <span class="cline-any cline-no">&nbsp;</span>
585
- <span class="cline-any cline-neutral">&nbsp;</span>
586
- <span class="cline-any cline-neutral">&nbsp;</span>
587
- <span class="cline-any cline-no">&nbsp;</span>
588
- <span class="cline-any cline-neutral">&nbsp;</span>
589
- <span class="cline-any cline-no">&nbsp;</span>
590
- <span class="cline-any cline-no">&nbsp;</span>
591
- <span class="cline-any cline-neutral">&nbsp;</span>
592
- <span class="cline-any cline-neutral">&nbsp;</span>
593
- <span class="cline-any cline-no">&nbsp;</span>
594
- <span class="cline-any cline-neutral">&nbsp;</span>
595
- <span class="cline-any cline-neutral">&nbsp;</span>
596
- <span class="cline-any cline-no">&nbsp;</span>
597
- <span class="cline-any cline-no">&nbsp;</span>
598
- <span class="cline-any cline-no">&nbsp;</span>
599
- <span class="cline-any cline-no">&nbsp;</span>
600
- <span class="cline-any cline-no">&nbsp;</span>
601
- <span class="cline-any cline-no">&nbsp;</span>
602
- <span class="cline-any cline-no">&nbsp;</span>
603
- <span class="cline-any cline-no">&nbsp;</span>
604
- <span class="cline-any cline-neutral">&nbsp;</span>
605
- <span class="cline-any cline-no">&nbsp;</span>
606
- <span class="cline-any cline-neutral">&nbsp;</span>
607
- <span class="cline-any cline-neutral">&nbsp;</span>
608
- <span class="cline-any cline-no">&nbsp;</span>
609
- <span class="cline-any cline-neutral">&nbsp;</span>
610
- <span class="cline-any cline-neutral">&nbsp;</span>
611
- <span class="cline-any cline-neutral">&nbsp;</span>
612
- <span class="cline-any cline-neutral">&nbsp;</span>
613
- <span class="cline-any cline-no">&nbsp;</span>
614
- <span class="cline-any cline-no">&nbsp;</span>
615
- <span class="cline-any cline-neutral">&nbsp;</span>
616
- <span class="cline-any cline-no">&nbsp;</span>
617
- <span class="cline-any cline-no">&nbsp;</span>
618
- <span class="cline-any cline-neutral">&nbsp;</span>
619
- <span class="cline-any cline-no">&nbsp;</span>
620
- <span class="cline-any cline-no">&nbsp;</span>
621
- <span class="cline-any cline-neutral">&nbsp;</span>
622
- <span class="cline-any cline-neutral">&nbsp;</span>
623
- <span class="cline-any cline-neutral">&nbsp;</span>
624
- <span class="cline-any cline-neutral">&nbsp;</span>
625
- <span class="cline-any cline-neutral">&nbsp;</span>
626
- <span class="cline-any cline-neutral">&nbsp;</span>
627
- <span class="cline-any cline-neutral">&nbsp;</span>
628
- <span class="cline-any cline-neutral">&nbsp;</span>
629
- <span class="cline-any cline-neutral">&nbsp;</span>
630
- <span class="cline-any cline-no">&nbsp;</span>
631
- <span class="cline-any cline-neutral">&nbsp;</span>
632
- <span class="cline-any cline-no">&nbsp;</span>
633
- <span class="cline-any cline-no">&nbsp;</span>
634
- <span class="cline-any cline-neutral">&nbsp;</span>
635
- <span class="cline-any cline-neutral">&nbsp;</span>
636
- <span class="cline-any cline-neutral">&nbsp;</span>
637
- <span class="cline-any cline-neutral">&nbsp;</span>
638
- <span class="cline-any cline-no">&nbsp;</span>
639
- <span class="cline-any cline-neutral">&nbsp;</span>
640
- <span class="cline-any cline-no">&nbsp;</span>
641
- <span class="cline-any cline-neutral">&nbsp;</span>
642
- <span class="cline-any cline-no">&nbsp;</span>
643
- <span class="cline-any cline-neutral">&nbsp;</span>
644
- <span class="cline-any cline-neutral">&nbsp;</span>
645
- <span class="cline-any cline-neutral">&nbsp;</span>
646
- <span class="cline-any cline-neutral">&nbsp;</span>
647
- <span class="cline-any cline-no">&nbsp;</span>
648
- <span class="cline-any cline-neutral">&nbsp;</span>
649
- <span class="cline-any cline-neutral">&nbsp;</span>
650
- <span class="cline-any cline-no">&nbsp;</span>
651
- <span class="cline-any cline-no">&nbsp;</span>
652
- <span class="cline-any cline-neutral">&nbsp;</span>
653
- <span class="cline-any cline-no">&nbsp;</span>
654
- <span class="cline-any cline-neutral">&nbsp;</span>
655
- <span class="cline-any cline-neutral">&nbsp;</span>
656
- <span class="cline-any cline-neutral">&nbsp;</span>
657
- <span class="cline-any cline-neutral">&nbsp;</span>
658
- <span class="cline-any cline-no">&nbsp;</span>
659
- <span class="cline-any cline-no">&nbsp;</span>
660
- <span class="cline-any cline-neutral">&nbsp;</span>
661
- <span class="cline-any cline-no">&nbsp;</span>
662
- <span class="cline-any cline-no">&nbsp;</span>
663
- <span class="cline-any cline-no">&nbsp;</span>
664
- <span class="cline-any cline-no">&nbsp;</span>
665
- <span class="cline-any cline-neutral">&nbsp;</span>
666
- <span class="cline-any cline-neutral">&nbsp;</span>
667
- <span class="cline-any cline-neutral">&nbsp;</span>
668
- <span class="cline-any cline-neutral">&nbsp;</span>
669
- <span class="cline-any cline-neutral">&nbsp;</span>
670
- <span class="cline-any cline-neutral">&nbsp;</span>
671
- <span class="cline-any cline-no">&nbsp;</span>
672
- <span class="cline-any cline-neutral">&nbsp;</span>
673
- <span class="cline-any cline-neutral">&nbsp;</span>
674
- <span class="cline-any cline-neutral">&nbsp;</span>
675
- <span class="cline-any cline-neutral">&nbsp;</span>
676
- <span class="cline-any cline-neutral">&nbsp;</span>
677
- <span class="cline-any cline-no">&nbsp;</span>
678
- <span class="cline-any cline-no">&nbsp;</span>
679
- <span class="cline-any cline-no">&nbsp;</span>
680
- <span class="cline-any cline-neutral">&nbsp;</span>
681
- <span class="cline-any cline-neutral">&nbsp;</span>
682
- <span class="cline-any cline-neutral">&nbsp;</span>
683
- <span class="cline-any cline-neutral">&nbsp;</span>
684
- <span class="cline-any cline-neutral">&nbsp;</span>
685
- <span class="cline-any cline-neutral">&nbsp;</span>
686
- <span class="cline-any cline-no">&nbsp;</span>
687
- <span class="cline-any cline-neutral">&nbsp;</span>
688
- <span class="cline-any cline-neutral">&nbsp;</span>
689
- <span class="cline-any cline-neutral">&nbsp;</span>
690
- <span class="cline-any cline-no">&nbsp;</span>
691
- <span class="cline-any cline-neutral">&nbsp;</span>
692
- <span class="cline-any cline-neutral">&nbsp;</span>
693
- <span class="cline-any cline-neutral">&nbsp;</span>
694
- <span class="cline-any cline-neutral">&nbsp;</span>
695
- <span class="cline-any cline-no">&nbsp;</span>
696
- <span class="cline-any cline-no">&nbsp;</span>
697
- <span class="cline-any cline-neutral">&nbsp;</span>
698
- <span class="cline-any cline-neutral">&nbsp;</span>
699
- <span class="cline-any cline-neutral">&nbsp;</span>
700
- <span class="cline-any cline-neutral">&nbsp;</span>
701
- <span class="cline-any cline-neutral">&nbsp;</span>
702
- <span class="cline-any cline-neutral">&nbsp;</span>
703
- <span class="cline-any cline-neutral">&nbsp;</span>
704
- <span class="cline-any cline-neutral">&nbsp;</span>
705
- <span class="cline-any cline-neutral">&nbsp;</span>
706
- <span class="cline-any cline-neutral">&nbsp;</span>
707
- <span class="cline-any cline-neutral">&nbsp;</span>
708
- <span class="cline-any cline-no">&nbsp;</span>
709
- <span class="cline-any cline-neutral">&nbsp;</span>
710
- <span class="cline-any cline-neutral">&nbsp;</span>
711
- <span class="cline-any cline-no">&nbsp;</span>
712
- <span class="cline-any cline-no">&nbsp;</span>
713
- <span class="cline-any cline-neutral">&nbsp;</span>
714
- <span class="cline-any cline-no">&nbsp;</span>
715
- <span class="cline-any cline-neutral">&nbsp;</span>
716
- <span class="cline-any cline-neutral">&nbsp;</span>
717
- <span class="cline-any cline-neutral">&nbsp;</span>
718
- <span class="cline-any cline-neutral">&nbsp;</span>
719
- <span class="cline-any cline-no">&nbsp;</span>
720
- <span class="cline-any cline-no">&nbsp;</span>
721
- <span class="cline-any cline-neutral">&nbsp;</span>
722
- <span class="cline-any cline-no">&nbsp;</span>
723
- <span class="cline-any cline-no">&nbsp;</span>
724
- <span class="cline-any cline-no">&nbsp;</span>
725
- <span class="cline-any cline-neutral">&nbsp;</span>
726
- <span class="cline-any cline-neutral">&nbsp;</span>
727
- <span class="cline-any cline-neutral">&nbsp;</span>
728
- <span class="cline-any cline-neutral">&nbsp;</span>
729
- <span class="cline-any cline-neutral">&nbsp;</span>
730
- <span class="cline-any cline-no">&nbsp;</span>
731
- <span class="cline-any cline-no">&nbsp;</span>
732
- <span class="cline-any cline-no">&nbsp;</span>
733
- <span class="cline-any cline-no">&nbsp;</span>
734
- <span class="cline-any cline-neutral">&nbsp;</span>
735
- <span class="cline-any cline-no">&nbsp;</span>
736
- <span class="cline-any cline-neutral">&nbsp;</span>
737
- <span class="cline-any cline-neutral">&nbsp;</span>
738
- <span class="cline-any cline-no">&nbsp;</span>
739
- <span class="cline-any cline-neutral">&nbsp;</span>
740
- <span class="cline-any cline-neutral">&nbsp;</span>
741
- <span class="cline-any cline-neutral">&nbsp;</span>
742
- <span class="cline-any cline-neutral">&nbsp;</span>
743
- <span class="cline-any cline-no">&nbsp;</span>
744
- <span class="cline-any cline-no">&nbsp;</span>
745
- <span class="cline-any cline-neutral">&nbsp;</span>
746
- <span class="cline-any cline-neutral">&nbsp;</span>
747
- <span class="cline-any cline-neutral">&nbsp;</span>
748
- <span class="cline-any cline-neutral">&nbsp;</span>
749
- <span class="cline-any cline-neutral">&nbsp;</span>
750
- <span class="cline-any cline-neutral">&nbsp;</span>
751
- <span class="cline-any cline-neutral">&nbsp;</span>
752
- <span class="cline-any cline-neutral">&nbsp;</span>
753
- <span class="cline-any cline-neutral">&nbsp;</span>
754
- <span class="cline-any cline-neutral">&nbsp;</span>
755
- <span class="cline-any cline-neutral">&nbsp;</span>
756
- <span class="cline-any cline-no">&nbsp;</span>
757
- <span class="cline-any cline-neutral">&nbsp;</span>
758
- <span class="cline-any cline-no">&nbsp;</span>
759
- <span class="cline-any cline-no">&nbsp;</span>
760
- <span class="cline-any cline-neutral">&nbsp;</span>
761
- <span class="cline-any cline-no">&nbsp;</span>
762
- <span class="cline-any cline-neutral">&nbsp;</span>
763
- <span class="cline-any cline-no">&nbsp;</span>
764
- <span class="cline-any cline-no">&nbsp;</span>
765
- <span class="cline-any cline-neutral">&nbsp;</span>
766
- <span class="cline-any cline-no">&nbsp;</span>
767
- <span class="cline-any cline-no">&nbsp;</span>
768
- <span class="cline-any cline-no">&nbsp;</span>
769
- <span class="cline-any cline-neutral">&nbsp;</span>
770
- <span class="cline-any cline-neutral">&nbsp;</span>
771
- <span class="cline-any cline-neutral">&nbsp;</span>
772
- <span class="cline-any cline-neutral">&nbsp;</span>
773
- <span class="cline-any cline-neutral">&nbsp;</span>
774
- <span class="cline-any cline-no">&nbsp;</span>
775
- <span class="cline-any cline-no">&nbsp;</span>
776
- <span class="cline-any cline-no">&nbsp;</span>
777
- <span class="cline-any cline-no">&nbsp;</span>
778
- <span class="cline-any cline-neutral">&nbsp;</span>
779
- <span class="cline-any cline-no">&nbsp;</span>
780
- <span class="cline-any cline-neutral">&nbsp;</span>
781
- <span class="cline-any cline-neutral">&nbsp;</span>
782
- <span class="cline-any cline-no">&nbsp;</span>
783
- <span class="cline-any cline-neutral">&nbsp;</span>
784
- <span class="cline-any cline-neutral">&nbsp;</span>
785
- <span class="cline-any cline-neutral">&nbsp;</span>
786
- <span class="cline-any cline-neutral">&nbsp;</span>
787
- <span class="cline-any cline-no">&nbsp;</span>
788
- <span class="cline-any cline-no">&nbsp;</span>
789
- <span class="cline-any cline-neutral">&nbsp;</span>
790
- <span class="cline-any cline-neutral">&nbsp;</span>
791
- <span class="cline-any cline-neutral">&nbsp;</span>
792
- <span class="cline-any cline-neutral">&nbsp;</span>
793
- <span class="cline-any cline-neutral">&nbsp;</span>
794
- <span class="cline-any cline-neutral">&nbsp;</span>
795
- <span class="cline-any cline-neutral">&nbsp;</span>
796
- <span class="cline-any cline-neutral">&nbsp;</span>
797
- <span class="cline-any cline-neutral">&nbsp;</span>
798
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import {
799
- McpServer,
800
- ResourceTemplate,
801
- } from '@modelcontextprotocol/sdk/server/mcp.js';
802
- import type { CanActivate, Type } from '@nestjs/common';
803
- import { Injectable } from '@nestjs/common';
804
- import { Reflector } from '@nestjs/core';
805
- &nbsp;
806
- import { MCP_RESOLVER } from '../decorators';
807
- import {
808
- MCP_PROMPT,
809
- MCP_RESOURCE,
810
- MCP_TOOL,
811
- } from '../decorators/capabilities.constants';
812
- import { MCP_GUARDS } from '../decorators/capabilities.decorators';
813
- import {
814
- PromptHandlerParams,
815
- PromptOptions,
816
- RequestHandlerExtra,
817
- ResourceOptions,
818
- ResourceTemplateHandlerParams,
819
- ResourceUriHandlerParams,
820
- ToolHandlerParams,
821
- ToolOptions,
822
- } from '../interfaces/capabilities.interface';
823
- import { McpExecutionContext } from '../interfaces/context.interface';
824
- import { SessionManager } from '../services/session.manager';
825
- import { DiscoveryService } from './discovery.service';
826
- import { McpLoggerService } from './logger.service';
827
- &nbsp;
828
- @Injectable()
829
- export class RegistryService {
830
- constructor(
831
- private readonly discoveryService: DiscoveryService,
832
- private readonly logger: McpLoggerService,
833
- private readonly reflector: Reflector,
834
- private readonly sessionManager: SessionManager,
835
- ) {}
836
- &nbsp;
837
- <span class="fstat-no" title="function not covered" > async </span>registerAll(server: McpServer): Promise&lt;void&gt; {
838
- <span class="cstat-no" title="statement not covered" > this.logger.log(</span>
839
- 'Starting registration of all MCP capabilities...',
840
- 'registry',
841
- );
842
- &nbsp;
843
- <span class="cstat-no" title="statement not covered" > await Promise.all([</span>
844
- this.registerResources(server),
845
- this.registerPrompts(server),
846
- this.registerTools(server),
847
- ]);
848
- }
849
- &nbsp;
850
- private <span class="fstat-no" title="function not covered" >getDecoratorType(</span>method: Type&lt;any&gt; | undefined): string | null {
851
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!method) <span class="cstat-no" title="statement not covered" >return null;</span></span>
852
- &nbsp;
853
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this.reflector.get(MCP_TOOL, method)) <span class="cstat-no" title="statement not covered" >return 'TOOL';</span></span>
854
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this.reflector.get(MCP_PROMPT, method)) <span class="cstat-no" title="statement not covered" >return 'PROMPT';</span></span>
855
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this.reflector.get(MCP_RESOURCE, method)) <span class="cstat-no" title="statement not covered" >return 'RESOURCE';</span></span>
856
- &nbsp;
857
- <span class="cstat-no" title="statement not covered" > return null;</span>
858
- }
859
- &nbsp;
860
- private <span class="fstat-no" title="function not covered" >getHandlerArgs(</span>
861
- method: Type&lt;any&gt; | undefined,
862
- args: unknown[],
863
- ):
864
- | ResourceUriHandlerParams
865
- | ResourceTemplateHandlerParams
866
- | PromptHandlerParams
867
- | ToolHandlerParams {
868
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!method) <span class="cstat-no" title="statement not covered" >throw new Error('Method not found');</span></span>
869
- &nbsp;
870
- <span class="cstat-no" title="statement not covered" > switch (this.getDecoratorType(method)) {</span>
871
- case 'RESOURCE':
872
- <span class="cstat-no" title="statement not covered" > return args[0] instanceof URL</span>
873
- ? ResourceUriHandlerParams.from(
874
- args[0],
875
- args[1] as RequestHandlerExtra,
876
- )
877
- : ResourceTemplateHandlerParams.from(
878
- args[0] as any,
879
- args[2] as RequestHandlerExtra,
880
- args[1] as Record&lt;string, string&gt;,
881
- );
882
- case 'PROMPT':
883
- <span class="cstat-no" title="statement not covered" > return args.length === 1</span>
884
- ? PromptHandlerParams.from(args[0] as RequestHandlerExtra)
885
- : PromptHandlerParams.from(
886
- args[1] as RequestHandlerExtra,
887
- args[0] as any,
888
- );
889
- case 'TOOL':
890
- <span class="cstat-no" title="statement not covered" > return args.length === 1</span>
891
- ? ToolHandlerParams.from(args[0] as RequestHandlerExtra)
892
- : ToolHandlerParams.from(
893
- args[1] as RequestHandlerExtra,
894
- args[0] as any,
895
- );
896
- default:
897
- <span class="cstat-no" title="statement not covered" > throw new Error(`Unknown decorator type for method ${method.name}`);</span>
898
- }
899
- }
900
- &nbsp;
901
- /**
902
- * Executes all guards attached to the resolver class and method.
903
- * Throws an error if any guard denies access.
904
- *
905
- * @param instance The resolver instance
906
- * @param methodName The method name being invoked
907
- * @param args The arguments passed to the method
908
- * @throws Error if any guard denies access
909
- */
910
- private <span class="fstat-no" title="function not covered" >runGuards(</span>
911
- instance: object,
912
- methodName: string,
913
- args: unknown[],
914
- ): Promise&lt;void&gt; {
915
- // Retrieve class-level guards
916
- const classConstructor = <span class="cstat-no" title="statement not covered" >instance.constructor;</span>
917
- &nbsp;
918
- const classGuards: (CanActivate | { new (): CanActivate })[] =
919
- (<span class="cstat-no" title="statement not covered" >Reflect.getMetadata(MCP_GUARDS, classConstructor) as (</span>
920
- | CanActivate
921
- | { new (): CanActivate }
922
- )[]) || [];
923
- &nbsp;
924
- // Retrieve method-level guards
925
- const prototype = <span class="cstat-no" title="statement not covered" >Object.getPrototypeOf(instance) as Record&lt;</span>
926
- string,
927
- unknown
928
- &gt;;
929
- &nbsp;
930
- const methodKey = <span class="cstat-no" title="statement not covered" >prototype[methodName] as Type&lt;any&gt; | undefined;</span>
931
- &nbsp;
932
- const methodGuards: (CanActivate | { new (): CanActivate })[] =
933
- <span class="cstat-no" title="statement not covered" > (methodKey &amp;&amp;</span>
934
- (Reflect.getMetadata(MCP_GUARDS, methodKey) as (
935
- | CanActivate
936
- | { new (): CanActivate }
937
- )[])) ||
938
- [];
939
- &nbsp;
940
- // Combine guards: class-level first, then method-level
941
- const allGuards = <span class="cstat-no" title="statement not covered" >[...classGuards, ...methodGuards];</span>
942
- &nbsp;
943
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!allGuards.length) <span class="cstat-no" title="statement not covered" >return Promise.resolve();</span></span>
944
- &nbsp;
945
- const handlerArgs = <span class="cstat-no" title="statement not covered" >this.getHandlerArgs(methodKey, args);</span>
946
- &nbsp;
947
- const { sessionId } = <span class="cstat-no" title="statement not covered" >handlerArgs.extra;</span>
948
- &nbsp;
949
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!sessionId) {</span>
950
- <span class="cstat-no" title="statement not covered" > throw new Error('Session not found');</span>
951
- }
952
- &nbsp;
953
- const session = <span class="cstat-no" title="statement not covered" >this.sessionManager.getSession(sessionId);</span>
954
- &nbsp;
955
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!session) {</span>
956
- <span class="cstat-no" title="statement not covered" > throw new Error('Session not found');</span>
957
- }
958
- &nbsp;
959
- const context: McpExecutionContext = <span class="cstat-no" title="statement not covered" >{</span>
960
- args: handlerArgs,
961
- // @ts-expect-error: Default types are 'http' | 'ws' | 'rpc' but in our case, we are using 'mcp'
962
- getType: <span class="fstat-no" title="function not covered" >() =</span>&gt; <span class="cstat-no" title="statement not covered" >'mcp',</span>
963
- getClass: <span class="fstat-no" title="function not covered" >() =</span>&gt; <span class="cstat-no" title="statement not covered" >instance.constructor as Type&lt;any&gt;,</span>
964
- getArgs: <span class="fstat-no" title="function not covered" >&lt;T = any&gt;() =</span>&gt; <span class="cstat-no" title="statement not covered" >args as T,</span>
965
- getArgByIndex: <span class="fstat-no" title="function not covered" >&lt;T = any&gt;(i</span>ndex: number) =&gt; <span class="cstat-no" title="statement not covered" >args[index] as T,</span>
966
- getSessionId: <span class="fstat-no" title="function not covered" >() =</span>&gt; <span class="cstat-no" title="statement not covered" >sessionId,</span>
967
- getHandler: <span class="fstat-no" title="function not covered" >() =</span>&gt; <span class="cstat-no" title="statement not covered" >methodKey as unknown as Type&lt;any&gt;,</span>
968
- switchToHttp: <span class="fstat-no" title="function not covered" >() =</span>&gt; (<span class="cstat-no" title="statement not covered" >{</span>
969
- getRequest: <span class="fstat-no" title="function not covered" >&lt;R = Request&gt;() =</span>&gt; <span class="cstat-no" title="statement not covered" >session.request as R,</span>
970
- getResponse: <span class="fstat-no" title="function not covered" >() =</span>&gt; {
971
- <span class="cstat-no" title="statement not covered" > throw new Error('Response not available in MCP context');</span>
972
- },
973
- getNext: <span class="fstat-no" title="function not covered" >() =</span>&gt; {
974
- <span class="cstat-no" title="statement not covered" > throw new Error('Next not available in MCP context');</span>
975
- },
976
- }),
977
- };
978
- &nbsp;
979
- <span class="cstat-no" title="statement not covered" > return (<span class="fstat-no" title="function not covered" >async </span>() =&gt; {</span>
980
- <span class="cstat-no" title="statement not covered" > for (const Guard of allGuards) {</span>
981
- const guardInstance: CanActivate =
982
- <span class="cstat-no" title="statement not covered" > typeof Guard === 'function' ? new Guard() : Guard;</span>
983
- const allowed = <span class="cstat-no" title="statement not covered" >await guardInstance.canActivate(context);</span>
984
- &nbsp;
985
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!allowed)</span>
986
- <span class="cstat-no" title="statement not covered" > throw new Error(`Access denied by guard on ${methodName}`);</span>
987
- }
988
- })();
989
- }
990
- &nbsp;
991
- private <span class="fstat-no" title="function not covered" >async </span>wrappedHandler&lt;TArgs extends unknown[], TResult&gt;(
992
- instance: object,
993
- handler: (...args: TArgs) =&gt; TResult,
994
- args: unknown[],
995
- ) {
996
- const isResolver = <span class="cstat-no" title="statement not covered" >Reflect.hasMetadata(MCP_RESOLVER, instance.constructor);</span>
997
- &nbsp;
998
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!isResolver) {</span>
999
- <span class="cstat-no" title="statement not covered" > throw new Error(</span>
1000
- `Class "${instance.constructor.name}" must be decorated with @Resolver to use @Prompt, @Tool, or @Resource.`,
1001
- );
1002
- }
1003
- &nbsp;
1004
- const methodName = <span class="cstat-no" title="statement not covered" >handler.name;</span>
1005
- &nbsp;
1006
- <span class="cstat-no" title="statement not covered" > await this.runGuards(instance, methodName, args);</span>
1007
- &nbsp;
1008
- <span class="cstat-no" title="statement not covered" > return handler(...(args as TArgs));</span>
1009
- }
1010
- &nbsp;
1011
- private <span class="fstat-no" title="function not covered" >registerResources(</span>server: McpServer) {
1012
- const resourceMethods =
1013
- <span class="cstat-no" title="statement not covered" > this.discoveryService.getAllMethodsWithMetadata&lt;ResourceOptions&gt;(</span>
1014
- MCP_RESOURCE,
1015
- );
1016
- <span class="cstat-no" title="statement not covered" > for (const method of resourceMethods) {</span>
1017
- const { metadata, handler, instance } = <span class="cstat-no" title="statement not covered" >method;</span>
1018
- &nbsp;
1019
- <span class="cstat-no" title="statement not covered" > this.logger.log(</span>
1020
- `Resource "${metadata?.name || 'unnamed'}" found.`,
1021
- 'resources',
1022
- );
1023
- &nbsp;
1024
- const wrappedHandler = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >(.</span>..args: unknown[]) =&gt;</span>
1025
- <span class="cstat-no" title="statement not covered" > this.wrappedHandler(instance, handler, args);</span>
1026
- &nbsp;
1027
- <span class="cstat-no" title="statement not covered" > try {</span>
1028
- <span class="cstat-no" title="statement not covered" > if ('template' in metadata) {</span>
1029
- <span class="cstat-no" title="statement not covered" > if ('metadata' in metadata) {</span>
1030
- <span class="cstat-no" title="statement not covered" > server.resource(</span>
1031
- metadata.name,
1032
- new ResourceTemplate(metadata.template, { list: undefined }),
1033
- metadata.metadata,
1034
- wrappedHandler,
1035
- );
1036
- } else {
1037
- <span class="cstat-no" title="statement not covered" > server.resource(</span>
1038
- metadata.name,
1039
- new ResourceTemplate(metadata.template, { list: undefined }),
1040
- wrappedHandler,
1041
- );
1042
- }
1043
- } else <span class="cstat-no" title="statement not covered" ><span class="missing-if-branch" title="if path not taken" >I</span>if ('uri' in metadata) {</span>
1044
- <span class="cstat-no" title="statement not covered" > if ('metadata' in metadata) {</span>
1045
- <span class="cstat-no" title="statement not covered" > server.resource(</span>
1046
- metadata.name,
1047
- metadata.uri,
1048
- metadata.metadata,
1049
- wrappedHandler,
1050
- );
1051
- } else {
1052
- <span class="cstat-no" title="statement not covered" > server.resource(metadata.name, metadata.uri, wrappedHandler);</span>
1053
- }
1054
- }
1055
- } catch (error) {
1056
- <span class="cstat-no" title="statement not covered" > this.logger.error(</span>
1057
- `Error registering resource ${metadata.name}: ${error}`,
1058
- undefined,
1059
- 'resources',
1060
- );
1061
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (error &amp;&amp; typeof error === 'object' &amp;&amp; 'stack' in error) {</span>
1062
- <span class="cstat-no" title="statement not covered" > this.logger.error(</span>
1063
- `Error stack: ${(error as Error).stack}`,
1064
- undefined,
1065
- 'resources',
1066
- );
1067
- }
1068
- }
1069
- }
1070
- }
1071
- &nbsp;
1072
- private <span class="fstat-no" title="function not covered" >registerPrompts(</span>server: McpServer) {
1073
- const promptMethods =
1074
- <span class="cstat-no" title="statement not covered" > this.discoveryService.getAllMethodsWithMetadata&lt;PromptOptions&gt;(</span>
1075
- MCP_PROMPT,
1076
- );
1077
- <span class="cstat-no" title="statement not covered" > for (const method of promptMethods) {</span>
1078
- const { metadata, handler, instance } = <span class="cstat-no" title="statement not covered" >method;</span>
1079
- &nbsp;
1080
- <span class="cstat-no" title="statement not covered" > this.logger.log(</span>
1081
- `Prompt "${metadata?.name || 'unnamed'}" found.`,
1082
- 'prompts',
1083
- );
1084
- &nbsp;
1085
- const wrappedHandler = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >(.</span>..args: unknown[]) =&gt;</span>
1086
- <span class="cstat-no" title="statement not covered" > this.wrappedHandler(instance, handler, args);</span>
1087
- &nbsp;
1088
- <span class="cstat-no" title="statement not covered" > try {</span>
1089
- <span class="cstat-no" title="statement not covered" > if ('description' in metadata &amp;&amp; 'argsSchema' in metadata) {</span>
1090
- <span class="cstat-no" title="statement not covered" > server.prompt(</span>
1091
- metadata.name,
1092
- metadata.description,
1093
- metadata.argsSchema,
1094
- wrappedHandler,
1095
- );
1096
- } else <span class="cstat-no" title="statement not covered" >if ('argsSchema' in metadata) {</span>
1097
- <span class="cstat-no" title="statement not covered" > server.prompt(metadata.name, metadata.argsSchema, wrappedHandler);</span>
1098
- } else <span class="cstat-no" title="statement not covered" >if ('description' in metadata) {</span>
1099
- <span class="cstat-no" title="statement not covered" > server.prompt(metadata.name, metadata.description, wrappedHandler);</span>
1100
- } else {
1101
- <span class="cstat-no" title="statement not covered" > server.prompt(metadata.name, wrappedHandler);</span>
1102
- }
1103
- } catch (error) {
1104
- <span class="cstat-no" title="statement not covered" > this.logger.error(</span>
1105
- `Error registering prompt ${metadata.name}: ${error}`,
1106
- undefined,
1107
- 'prompts',
1108
- );
1109
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (error &amp;&amp; typeof error === 'object' &amp;&amp; 'stack' in error) {</span>
1110
- <span class="cstat-no" title="statement not covered" > this.logger.error(</span>
1111
- `Error stack: ${(error as Error).stack}`,
1112
- undefined,
1113
- 'prompts',
1114
- );
1115
- }
1116
- }
1117
- }
1118
- }
1119
- &nbsp;
1120
- private <span class="fstat-no" title="function not covered" >registerTools(</span>server: McpServer) {
1121
- const toolMethods =
1122
- <span class="cstat-no" title="statement not covered" > this.discoveryService.getAllMethodsWithMetadata&lt;ToolOptions&gt;(MCP_TOOL);</span>
1123
- &nbsp;
1124
- <span class="cstat-no" title="statement not covered" > for (const method of toolMethods) {</span>
1125
- const { metadata, handler, instance } = <span class="cstat-no" title="statement not covered" >method;</span>
1126
- &nbsp;
1127
- <span class="cstat-no" title="statement not covered" > this.logger.log(`Tool "${metadata?.name || 'unnamed'}" found.`, 'tools');</span>
1128
- &nbsp;
1129
- const wrappedHandler = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >(.</span>..args: unknown[]) =&gt;</span>
1130
- <span class="cstat-no" title="statement not covered" > this.wrappedHandler(instance, handler, args);</span>
1131
- &nbsp;
1132
- <span class="cstat-no" title="statement not covered" > try {</span>
1133
- <span class="cstat-no" title="statement not covered" > if ('description' in metadata &amp;&amp; 'paramSchema' in metadata) {</span>
1134
- <span class="cstat-no" title="statement not covered" > server.tool(</span>
1135
- metadata.name,
1136
- metadata.description,
1137
- metadata.paramSchema,
1138
- wrappedHandler,
1139
- );
1140
- } else <span class="cstat-no" title="statement not covered" >if ('paramSchema' in metadata) {</span>
1141
- <span class="cstat-no" title="statement not covered" > server.tool(metadata.name, metadata.paramSchema, wrappedHandler);</span>
1142
- } else <span class="cstat-no" title="statement not covered" >if ('description' in metadata) {</span>
1143
- <span class="cstat-no" title="statement not covered" > server.tool(metadata.name, metadata.description, wrappedHandler);</span>
1144
- } else {
1145
- <span class="cstat-no" title="statement not covered" > server.tool(metadata.name, wrappedHandler);</span>
1146
- }
1147
- } catch (error) {
1148
- <span class="cstat-no" title="statement not covered" > this.logger.error(</span>
1149
- `Error registering tool ${metadata.name}: ${error}`,
1150
- undefined,
1151
- 'tools',
1152
- );
1153
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (error &amp;&amp; typeof error === 'object' &amp;&amp; 'stack' in error) {</span>
1154
- <span class="cstat-no" title="statement not covered" > this.logger.error(</span>
1155
- `Stack trace: ${(error as Error).stack}`,
1156
- undefined,
1157
- 'tools',
1158
- );
1159
- }
1160
- }
1161
- }
1162
- }
1163
- }
1164
- &nbsp;</pre></td></tr></table></pre>
1165
-
1166
- <div class='push'></div><!-- for sticky footer -->
1167
- </div><!-- /wrapper -->
1168
- <div class='footer quiet pad2 space-top1 center small'>
1169
- Code coverage generated by
1170
- <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1171
- at 2025-05-02T07:30:51.864Z
1172
- </div>
1173
- <script src="../../prettify.js"></script>
1174
- <script>
1175
- window.onload = function () {
1176
- prettyPrint();
1177
- };
1178
- </script>
1179
- <script src="../../sorter.js"></script>
1180
- <script src="../../block-navigation.js"></script>
1181
- </body>
1182
- </html>
1183
-