@decaf-ts/mcp-server 0.4.1 → 0.4.6

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 (538) hide show
  1. package/LICENSE.md +31 -0
  2. package/dist/mcp-server.cjs +2 -2328
  3. package/dist/mcp-server.cjs.map +1 -0
  4. package/dist/mcp-server.js +2 -0
  5. package/dist/mcp-server.js.map +1 -0
  6. package/lib/bin/cli.cjs +7 -35
  7. package/lib/bin/cli.d.ts +0 -24
  8. package/lib/bin/cli.js.map +1 -0
  9. package/lib/builders/builder.cjs +91 -0
  10. package/lib/builders/builder.d.ts +25 -0
  11. package/lib/builders/builder.js.map +1 -0
  12. package/lib/{mcp/resources → builders}/index.cjs +5 -2
  13. package/lib/builders/index.d.ts +4 -0
  14. package/lib/builders/index.js.map +1 -0
  15. package/lib/builders/prompt-builder.cjs +76 -0
  16. package/lib/builders/prompt-builder.d.ts +12 -0
  17. package/lib/builders/prompt-builder.js.map +1 -0
  18. package/lib/builders/resource-builder.cjs +83 -0
  19. package/lib/builders/resource-builder.d.ts +14 -0
  20. package/lib/builders/resource-builder.js.map +1 -0
  21. package/lib/builders/tool-builder.cjs +104 -0
  22. package/lib/builders/tool-builder.d.ts +16 -0
  23. package/lib/builders/tool-builder.js.map +1 -0
  24. package/lib/constants.cjs +28 -30
  25. package/lib/constants.d.ts +19 -24
  26. package/lib/constants.js.map +1 -0
  27. package/lib/environment.cjs +32 -0
  28. package/lib/environment.d.ts +71 -0
  29. package/lib/environment.js.map +1 -0
  30. package/lib/esm/bin/cli.d.ts +0 -24
  31. package/lib/esm/bin/cli.js +7 -35
  32. package/lib/esm/bin/cli.js.map +1 -0
  33. package/lib/esm/builders/builder.d.ts +25 -0
  34. package/lib/esm/builders/builder.js +86 -0
  35. package/lib/esm/builders/builder.js.map +1 -0
  36. package/lib/esm/builders/index.d.ts +4 -0
  37. package/lib/esm/builders/index.js +5 -0
  38. package/lib/esm/builders/index.js.map +1 -0
  39. package/lib/esm/builders/prompt-builder.d.ts +12 -0
  40. package/lib/esm/builders/prompt-builder.js +72 -0
  41. package/lib/esm/builders/prompt-builder.js.map +1 -0
  42. package/lib/esm/builders/resource-builder.d.ts +14 -0
  43. package/lib/esm/builders/resource-builder.js +79 -0
  44. package/lib/esm/builders/resource-builder.js.map +1 -0
  45. package/lib/esm/builders/tool-builder.d.ts +16 -0
  46. package/lib/esm/builders/tool-builder.js +100 -0
  47. package/lib/esm/builders/tool-builder.js.map +1 -0
  48. package/lib/esm/constants.d.ts +19 -24
  49. package/lib/esm/constants.js +27 -29
  50. package/lib/esm/constants.js.map +1 -0
  51. package/lib/esm/environment.d.ts +71 -0
  52. package/lib/esm/environment.js +29 -0
  53. package/lib/esm/environment.js.map +1 -0
  54. package/lib/esm/index.d.ts +3 -10
  55. package/lib/esm/index.js +4 -11
  56. package/lib/esm/index.js.map +1 -0
  57. package/lib/esm/mcp-server.d.ts +10 -0
  58. package/lib/esm/mcp-server.js +189 -0
  59. package/lib/esm/mcp-server.js.map +1 -0
  60. package/lib/esm/modules/template-module/index.d.ts +6 -0
  61. package/lib/esm/modules/template-module/index.js +4 -0
  62. package/lib/esm/modules/template-module/index.js.map +1 -0
  63. package/lib/esm/prompts/code/constants.d.ts +1 -0
  64. package/lib/esm/prompts/code/constants.js +2 -0
  65. package/lib/esm/prompts/code/constants.js.map +1 -0
  66. package/lib/esm/prompts/code/design-patterns/builder.d.ts +2 -0
  67. package/lib/esm/prompts/code/design-patterns/builder.js +118 -0
  68. package/lib/esm/prompts/code/design-patterns/builder.js.map +1 -0
  69. package/lib/esm/prompts/code/design-patterns/constants.d.ts +1 -0
  70. package/lib/esm/prompts/code/design-patterns/constants.js +3 -0
  71. package/lib/esm/prompts/code/design-patterns/constants.js.map +1 -0
  72. package/lib/esm/prompts/example-prompt/index.d.ts +2 -0
  73. package/lib/esm/prompts/example-prompt/index.js +18 -0
  74. package/lib/esm/prompts/example-prompt/index.js.map +1 -0
  75. package/lib/esm/prompts/index.d.ts +2 -0
  76. package/lib/esm/prompts/index.js +26 -0
  77. package/lib/esm/prompts/index.js.map +1 -0
  78. package/lib/esm/prompts/interactive-jsdoc/index.d.ts +2 -0
  79. package/lib/esm/prompts/interactive-jsdoc/index.js +18 -0
  80. package/lib/esm/prompts/interactive-jsdoc/index.js.map +1 -0
  81. package/lib/esm/prompts/jsdocs/class-prompt.d.ts +2 -0
  82. package/lib/esm/prompts/jsdocs/class-prompt.js +52 -0
  83. package/lib/esm/prompts/jsdocs/class-prompt.js.map +1 -0
  84. package/lib/esm/prompts/jsdocs/const-prompt.d.ts +2 -0
  85. package/lib/esm/prompts/jsdocs/const-prompt.js +24 -0
  86. package/lib/esm/prompts/jsdocs/const-prompt.js.map +1 -0
  87. package/lib/esm/prompts/jsdocs/constants.d.ts +4 -0
  88. package/lib/esm/prompts/jsdocs/constants.js +46 -0
  89. package/lib/esm/prompts/jsdocs/constants.js.map +1 -0
  90. package/lib/esm/prompts/jsdocs/decorator-prompt.d.ts +2 -0
  91. package/lib/esm/prompts/jsdocs/decorator-prompt.js +42 -0
  92. package/lib/esm/prompts/jsdocs/decorator-prompt.js.map +1 -0
  93. package/lib/esm/prompts/jsdocs/enum-prompt.d.ts +2 -0
  94. package/lib/esm/prompts/jsdocs/enum-prompt.js +24 -0
  95. package/lib/esm/prompts/jsdocs/enum-prompt.js.map +1 -0
  96. package/lib/esm/prompts/jsdocs/function-prompt.d.ts +2 -0
  97. package/lib/esm/prompts/jsdocs/function-prompt.js +43 -0
  98. package/lib/esm/prompts/jsdocs/function-prompt.js.map +1 -0
  99. package/lib/esm/prompts/jsdocs/interface-prompt.d.ts +2 -0
  100. package/lib/esm/prompts/jsdocs/interface-prompt.js +24 -0
  101. package/lib/esm/prompts/jsdocs/interface-prompt.js.map +1 -0
  102. package/lib/esm/prompts/jsdocs/types-prompt.d.ts +2 -0
  103. package/lib/esm/prompts/jsdocs/types-prompt.js +24 -0
  104. package/lib/esm/prompts/jsdocs/types-prompt.js.map +1 -0
  105. package/lib/esm/resources/example-resource/index.d.ts +2 -0
  106. package/lib/esm/resources/example-resource/index.js +19 -0
  107. package/lib/esm/resources/example-resource/index.js.map +1 -0
  108. package/lib/esm/resources/index.d.ts +2 -0
  109. package/lib/esm/resources/index.js +4 -0
  110. package/lib/esm/resources/index.js.map +1 -0
  111. package/lib/esm/resources/repo-metadata/index.d.ts +2 -0
  112. package/lib/esm/resources/repo-metadata/index.js +25 -0
  113. package/lib/esm/resources/repo-metadata/index.js.map +1 -0
  114. package/lib/esm/tools/ast/ts-ast-tool.d.ts +2 -0
  115. package/lib/esm/tools/ast/ts-ast-tool.js +67 -0
  116. package/lib/esm/tools/ast/ts-ast-tool.js.map +1 -0
  117. package/lib/esm/tools/ast/types.d.ts +105 -0
  118. package/lib/esm/tools/ast/types.js +33 -0
  119. package/lib/esm/tools/ast/types.js.map +1 -0
  120. package/lib/esm/tools/ast/utils.d.ts +5 -0
  121. package/lib/esm/tools/ast/utils.js +58 -0
  122. package/lib/esm/tools/ast/utils.js.map +1 -0
  123. package/lib/esm/tools/ast-jsdoc-tools/apply.d.ts +6 -0
  124. package/lib/esm/tools/ast-jsdoc-tools/apply.js +29 -0
  125. package/lib/esm/tools/ast-jsdoc-tools/apply.js.map +1 -0
  126. package/lib/esm/tools/ast-jsdoc-tools/cli.js +33 -0
  127. package/lib/esm/tools/ast-jsdoc-tools/cli.js.map +1 -0
  128. package/lib/esm/tools/ast-jsdoc-tools/enumerator.d.ts +1 -0
  129. package/lib/esm/tools/ast-jsdoc-tools/enumerator.js +25 -0
  130. package/lib/esm/tools/ast-jsdoc-tools/enumerator.js.map +1 -0
  131. package/lib/esm/tools/ast-jsdoc-tools/fileRunner.d.ts +11 -0
  132. package/lib/esm/tools/ast-jsdoc-tools/fileRunner.js +29 -0
  133. package/lib/esm/tools/ast-jsdoc-tools/fileRunner.js.map +1 -0
  134. package/lib/esm/tools/ast-jsdoc-tools/formatter.d.ts +6 -0
  135. package/lib/esm/tools/ast-jsdoc-tools/formatter.js +18 -0
  136. package/lib/esm/tools/ast-jsdoc-tools/formatter.js.map +1 -0
  137. package/lib/esm/tools/ast-jsdoc-tools/generator.d.ts +12 -0
  138. package/lib/esm/tools/ast-jsdoc-tools/generator.js +55 -0
  139. package/lib/esm/tools/ast-jsdoc-tools/generator.js.map +1 -0
  140. package/lib/esm/tools/ast-jsdoc-tools/index.d.ts +7 -0
  141. package/lib/esm/tools/ast-jsdoc-tools/index.js +29 -0
  142. package/lib/esm/tools/ast-jsdoc-tools/index.js.map +1 -0
  143. package/lib/esm/tools/ast-jsdoc-tools/interactive.d.ts +1 -0
  144. package/lib/esm/tools/ast-jsdoc-tools/interactive.js +7 -0
  145. package/lib/esm/tools/ast-jsdoc-tools/interactive.js.map +1 -0
  146. package/lib/esm/tools/ast-jsdoc-tools/parser.d.ts +13 -0
  147. package/lib/esm/tools/ast-jsdoc-tools/parser.js +71 -0
  148. package/lib/esm/tools/ast-jsdoc-tools/parser.js.map +1 -0
  149. package/lib/esm/tools/ast-jsdoc-tools/patch.d.ts +2 -0
  150. package/lib/esm/tools/ast-jsdoc-tools/patch.js +23 -0
  151. package/lib/esm/tools/ast-jsdoc-tools/patch.js.map +1 -0
  152. package/lib/esm/tools/ast-jsdoc-tools/prompts/loader.d.ts +10 -0
  153. package/lib/esm/tools/ast-jsdoc-tools/prompts/loader.js +26 -0
  154. package/lib/esm/tools/ast-jsdoc-tools/prompts/loader.js.map +1 -0
  155. package/lib/esm/tools/ast-jsdoc-tools/repoRunner.d.ts +16 -0
  156. package/lib/esm/tools/ast-jsdoc-tools/repoRunner.js +61 -0
  157. package/lib/esm/tools/ast-jsdoc-tools/repoRunner.js.map +1 -0
  158. package/lib/esm/tools/ast-jsdoc-tools/tools/jsdoc-generator.d.ts +5 -0
  159. package/lib/esm/tools/ast-jsdoc-tools/tools/jsdoc-generator.js +78 -0
  160. package/lib/esm/tools/ast-jsdoc-tools/tools/jsdoc-generator.js.map +1 -0
  161. package/lib/esm/tools/ast-jsdoc-tools/utils/conflict-detector.d.ts +5 -0
  162. package/lib/esm/tools/ast-jsdoc-tools/utils/conflict-detector.js +30 -0
  163. package/lib/esm/tools/ast-jsdoc-tools/utils/conflict-detector.js.map +1 -0
  164. package/lib/esm/tools/ast-jsdoc-tools/utils/context-schema.d.ts +7 -0
  165. package/lib/esm/tools/ast-jsdoc-tools/utils/context-schema.js +29 -0
  166. package/lib/esm/tools/ast-jsdoc-tools/utils/context-schema.js.map +1 -0
  167. package/lib/esm/tools/ast-jsdoc-tools/utils/heuristics.d.ts +2 -0
  168. package/lib/esm/tools/ast-jsdoc-tools/utils/heuristics.js +31 -0
  169. package/lib/esm/tools/ast-jsdoc-tools/utils/heuristics.js.map +1 -0
  170. package/lib/esm/tools/ast-jsdoc-tools/utils/ts-project.d.ts +12 -0
  171. package/lib/esm/tools/ast-jsdoc-tools/utils/ts-project.js +21 -0
  172. package/lib/esm/tools/ast-jsdoc-tools/utils/ts-project.js.map +1 -0
  173. package/lib/esm/tools/example-tool/index.d.ts +2 -0
  174. package/lib/esm/tools/example-tool/index.js +29 -0
  175. package/lib/esm/tools/example-tool/index.js.map +1 -0
  176. package/lib/esm/tools/file-summarizer/index.d.ts +2 -0
  177. package/lib/esm/tools/file-summarizer/index.js +29 -0
  178. package/lib/esm/tools/file-summarizer/index.js.map +1 -0
  179. package/lib/esm/tools/index.d.ts +2 -0
  180. package/lib/esm/tools/index.js +6 -0
  181. package/lib/esm/tools/index.js.map +1 -0
  182. package/lib/esm/tools/jsdoc/ts-jsdoc-element-tool.d.ts +2 -0
  183. package/lib/esm/tools/jsdoc/ts-jsdoc-element-tool.js +84 -0
  184. package/lib/esm/tools/jsdoc/ts-jsdoc-element-tool.js.map +1 -0
  185. package/lib/esm/tools/jsdoc/utils.d.ts +5 -0
  186. package/lib/esm/tools/jsdoc/utils.js +53 -0
  187. package/lib/esm/tools/jsdoc/utils.js.map +1 -0
  188. package/lib/esm/tools/testing/ts-jest-list-tests.d.ts +2 -0
  189. package/lib/esm/tools/testing/ts-jest-list-tests.js +53 -0
  190. package/lib/esm/tools/testing/ts-jest-list-tests.js.map +1 -0
  191. package/lib/esm/types.d.ts +56 -47
  192. package/lib/esm/types.js +1 -1
  193. package/lib/esm/types.js.map +1 -0
  194. package/lib/esm/utils/banner.d.ts +3 -0
  195. package/lib/esm/utils/banner.js +107 -0
  196. package/lib/esm/utils/banner.js.map +1 -0
  197. package/lib/esm/version.d.ts +2 -0
  198. package/lib/esm/version.js +5 -0
  199. package/lib/esm/version.js.map +1 -0
  200. package/lib/index.cjs +4 -11
  201. package/lib/index.d.ts +3 -10
  202. package/lib/index.js.map +1 -0
  203. package/lib/mcp-server.cjs +226 -0
  204. package/lib/mcp-server.d.ts +10 -0
  205. package/lib/mcp-server.js.map +1 -0
  206. package/lib/modules/template-module/index.cjs +7 -0
  207. package/lib/modules/template-module/index.d.ts +6 -0
  208. package/lib/modules/template-module/index.js.map +1 -0
  209. package/lib/prompts/code/constants.cjs +5 -0
  210. package/lib/prompts/code/constants.d.ts +1 -0
  211. package/lib/prompts/code/constants.js.map +1 -0
  212. package/lib/prompts/code/design-patterns/builder.cjs +121 -0
  213. package/lib/prompts/code/design-patterns/builder.d.ts +2 -0
  214. package/lib/prompts/code/design-patterns/builder.js.map +1 -0
  215. package/lib/prompts/code/design-patterns/constants.cjs +6 -0
  216. package/lib/prompts/code/design-patterns/constants.d.ts +1 -0
  217. package/lib/prompts/code/design-patterns/constants.js.map +1 -0
  218. package/lib/prompts/example-prompt/index.cjs +21 -0
  219. package/lib/prompts/example-prompt/index.d.ts +2 -0
  220. package/lib/prompts/example-prompt/index.js.map +1 -0
  221. package/lib/prompts/index.cjs +29 -0
  222. package/lib/prompts/index.d.ts +2 -0
  223. package/lib/prompts/index.js.map +1 -0
  224. package/lib/prompts/interactive-jsdoc/index.cjs +21 -0
  225. package/lib/prompts/interactive-jsdoc/index.d.ts +2 -0
  226. package/lib/prompts/interactive-jsdoc/index.js.map +1 -0
  227. package/lib/prompts/jsdocs/class-prompt.cjs +55 -0
  228. package/lib/prompts/jsdocs/class-prompt.d.ts +2 -0
  229. package/lib/prompts/jsdocs/class-prompt.js.map +1 -0
  230. package/lib/prompts/jsdocs/const-prompt.cjs +27 -0
  231. package/lib/prompts/jsdocs/const-prompt.d.ts +2 -0
  232. package/lib/prompts/jsdocs/const-prompt.js.map +1 -0
  233. package/lib/prompts/jsdocs/constants.cjs +49 -0
  234. package/lib/prompts/jsdocs/constants.d.ts +4 -0
  235. package/lib/prompts/jsdocs/constants.js.map +1 -0
  236. package/lib/prompts/jsdocs/decorator-prompt.cjs +45 -0
  237. package/lib/prompts/jsdocs/decorator-prompt.d.ts +2 -0
  238. package/lib/prompts/jsdocs/decorator-prompt.js.map +1 -0
  239. package/lib/prompts/jsdocs/enum-prompt.cjs +27 -0
  240. package/lib/prompts/jsdocs/enum-prompt.d.ts +2 -0
  241. package/lib/prompts/jsdocs/enum-prompt.js.map +1 -0
  242. package/lib/prompts/jsdocs/function-prompt.cjs +46 -0
  243. package/lib/prompts/jsdocs/function-prompt.d.ts +2 -0
  244. package/lib/prompts/jsdocs/function-prompt.js.map +1 -0
  245. package/lib/prompts/jsdocs/interface-prompt.cjs +27 -0
  246. package/lib/prompts/jsdocs/interface-prompt.d.ts +2 -0
  247. package/lib/prompts/jsdocs/interface-prompt.js.map +1 -0
  248. package/lib/prompts/jsdocs/types-prompt.cjs +27 -0
  249. package/lib/prompts/jsdocs/types-prompt.d.ts +2 -0
  250. package/lib/prompts/jsdocs/types-prompt.js.map +1 -0
  251. package/lib/resources/example-resource/index.cjs +22 -0
  252. package/lib/resources/example-resource/index.d.ts +2 -0
  253. package/lib/resources/example-resource/index.js.map +1 -0
  254. package/lib/resources/index.cjs +7 -0
  255. package/lib/resources/index.d.ts +2 -0
  256. package/lib/resources/index.js.map +1 -0
  257. package/lib/resources/repo-metadata/index.cjs +28 -0
  258. package/lib/resources/repo-metadata/index.d.ts +2 -0
  259. package/lib/resources/repo-metadata/index.js.map +1 -0
  260. package/lib/tools/ast/ts-ast-tool.cjs +70 -0
  261. package/lib/tools/ast/ts-ast-tool.d.ts +2 -0
  262. package/lib/tools/ast/ts-ast-tool.js.map +1 -0
  263. package/lib/tools/ast/types.cjs +36 -0
  264. package/lib/tools/ast/types.d.ts +105 -0
  265. package/lib/tools/ast/types.js.map +1 -0
  266. package/lib/tools/ast/utils.cjs +65 -0
  267. package/lib/tools/ast/utils.d.ts +5 -0
  268. package/lib/tools/ast/utils.js.map +1 -0
  269. package/lib/tools/ast-jsdoc-tools/apply.cjs +36 -0
  270. package/lib/tools/ast-jsdoc-tools/apply.d.ts +6 -0
  271. package/lib/tools/ast-jsdoc-tools/apply.js.map +1 -0
  272. package/lib/tools/ast-jsdoc-tools/cli.cjs +38 -0
  273. package/lib/tools/ast-jsdoc-tools/cli.js.map +1 -0
  274. package/lib/tools/ast-jsdoc-tools/enumerator.cjs +31 -0
  275. package/lib/tools/ast-jsdoc-tools/enumerator.d.ts +1 -0
  276. package/lib/tools/ast-jsdoc-tools/enumerator.js.map +1 -0
  277. package/lib/tools/ast-jsdoc-tools/fileRunner.cjs +35 -0
  278. package/lib/tools/ast-jsdoc-tools/fileRunner.d.ts +11 -0
  279. package/lib/tools/ast-jsdoc-tools/fileRunner.js.map +1 -0
  280. package/lib/tools/ast-jsdoc-tools/formatter.cjs +21 -0
  281. package/lib/tools/ast-jsdoc-tools/formatter.d.ts +6 -0
  282. package/lib/tools/ast-jsdoc-tools/formatter.js.map +1 -0
  283. package/lib/tools/ast-jsdoc-tools/generator.cjs +58 -0
  284. package/lib/tools/ast-jsdoc-tools/generator.d.ts +12 -0
  285. package/lib/tools/ast-jsdoc-tools/generator.js.map +1 -0
  286. package/lib/tools/ast-jsdoc-tools/index.cjs +33 -0
  287. package/lib/tools/ast-jsdoc-tools/index.d.ts +7 -0
  288. package/lib/tools/ast-jsdoc-tools/index.js.map +1 -0
  289. package/lib/tools/ast-jsdoc-tools/interactive.cjs +10 -0
  290. package/lib/tools/ast-jsdoc-tools/interactive.d.ts +1 -0
  291. package/lib/tools/ast-jsdoc-tools/interactive.js.map +1 -0
  292. package/lib/tools/ast-jsdoc-tools/parser.cjs +77 -0
  293. package/lib/tools/ast-jsdoc-tools/parser.d.ts +13 -0
  294. package/lib/tools/ast-jsdoc-tools/parser.js.map +1 -0
  295. package/lib/tools/ast-jsdoc-tools/patch.cjs +29 -0
  296. package/lib/tools/ast-jsdoc-tools/patch.d.ts +2 -0
  297. package/lib/tools/ast-jsdoc-tools/patch.js.map +1 -0
  298. package/lib/tools/ast-jsdoc-tools/prompts/loader.cjs +32 -0
  299. package/lib/tools/ast-jsdoc-tools/prompts/loader.d.ts +10 -0
  300. package/lib/tools/ast-jsdoc-tools/prompts/loader.js.map +1 -0
  301. package/lib/tools/ast-jsdoc-tools/repoRunner.cjs +67 -0
  302. package/lib/tools/ast-jsdoc-tools/repoRunner.d.ts +16 -0
  303. package/lib/tools/ast-jsdoc-tools/repoRunner.js.map +1 -0
  304. package/lib/tools/ast-jsdoc-tools/tools/jsdoc-generator.cjs +81 -0
  305. package/lib/tools/ast-jsdoc-tools/tools/jsdoc-generator.d.ts +5 -0
  306. package/lib/tools/ast-jsdoc-tools/tools/jsdoc-generator.js.map +1 -0
  307. package/lib/tools/ast-jsdoc-tools/utils/conflict-detector.cjs +33 -0
  308. package/lib/tools/ast-jsdoc-tools/utils/conflict-detector.d.ts +5 -0
  309. package/lib/tools/ast-jsdoc-tools/utils/conflict-detector.js.map +1 -0
  310. package/lib/tools/ast-jsdoc-tools/utils/context-schema.cjs +32 -0
  311. package/lib/tools/ast-jsdoc-tools/utils/context-schema.d.ts +7 -0
  312. package/lib/tools/ast-jsdoc-tools/utils/context-schema.js.map +1 -0
  313. package/lib/tools/ast-jsdoc-tools/utils/heuristics.cjs +34 -0
  314. package/lib/tools/ast-jsdoc-tools/utils/heuristics.d.ts +2 -0
  315. package/lib/tools/ast-jsdoc-tools/utils/heuristics.js.map +1 -0
  316. package/lib/tools/ast-jsdoc-tools/utils/ts-project.cjs +57 -0
  317. package/lib/tools/ast-jsdoc-tools/utils/ts-project.d.ts +12 -0
  318. package/lib/tools/ast-jsdoc-tools/utils/ts-project.js.map +1 -0
  319. package/lib/tools/example-tool/index.cjs +32 -0
  320. package/lib/tools/example-tool/index.d.ts +2 -0
  321. package/lib/tools/example-tool/index.js.map +1 -0
  322. package/lib/tools/file-summarizer/index.cjs +32 -0
  323. package/lib/tools/file-summarizer/index.d.ts +2 -0
  324. package/lib/tools/file-summarizer/index.js.map +1 -0
  325. package/lib/tools/index.cjs +9 -0
  326. package/lib/tools/index.d.ts +2 -0
  327. package/lib/tools/index.js.map +1 -0
  328. package/lib/tools/jsdoc/ts-jsdoc-element-tool.cjs +87 -0
  329. package/lib/tools/jsdoc/ts-jsdoc-element-tool.d.ts +2 -0
  330. package/lib/tools/jsdoc/ts-jsdoc-element-tool.js.map +1 -0
  331. package/lib/tools/jsdoc/utils.cjs +60 -0
  332. package/lib/tools/jsdoc/utils.d.ts +5 -0
  333. package/lib/tools/jsdoc/utils.js.map +1 -0
  334. package/lib/tools/testing/ts-jest-list-tests.cjs +56 -0
  335. package/lib/tools/testing/ts-jest-list-tests.d.ts +2 -0
  336. package/lib/tools/testing/ts-jest-list-tests.js.map +1 -0
  337. package/lib/types.cjs +1 -1
  338. package/lib/types.d.ts +56 -47
  339. package/lib/types.js.map +1 -0
  340. package/lib/utils/banner.cjs +114 -0
  341. package/lib/utils/banner.d.ts +3 -0
  342. package/lib/utils/banner.js.map +1 -0
  343. package/lib/version.cjs +8 -0
  344. package/lib/version.d.ts +2 -0
  345. package/lib/version.js.map +1 -0
  346. package/package.json +14 -63
  347. package/dist/mcp-server.esm.cjs +0 -2300
  348. package/lib/McpWrapper.cjs +0 -189
  349. package/lib/McpWrapper.d.ts +0 -101
  350. package/lib/bin/validate-modules.cjs +0 -24
  351. package/lib/esm/McpWrapper.d.ts +0 -101
  352. package/lib/esm/McpWrapper.js +0 -182
  353. package/lib/esm/bin/validate-modules.js +0 -22
  354. package/lib/esm/mcp/aggregateModules.d.ts +0 -26
  355. package/lib/esm/mcp/aggregateModules.js +0 -185
  356. package/lib/esm/mcp/code.d.ts +0 -23
  357. package/lib/esm/mcp/code.js +0 -70
  358. package/lib/esm/mcp/decorator-tools.d.ts +0 -118
  359. package/lib/esm/mcp/decorator-tools.js +0 -237
  360. package/lib/esm/mcp/fastmcp-wiring.d.ts +0 -14
  361. package/lib/esm/mcp/fastmcp-wiring.js +0 -56
  362. package/lib/esm/mcp/index.d.ts +0 -9
  363. package/lib/esm/mcp/index.js +0 -29
  364. package/lib/esm/mcp/mcp-module.d.ts +0 -11
  365. package/lib/esm/mcp/mcp-module.js +0 -31
  366. package/lib/esm/mcp/moduleRegistry.d.ts +0 -14
  367. package/lib/esm/mcp/moduleRegistry.js +0 -47
  368. package/lib/esm/mcp/prompts/index.d.ts +0 -4
  369. package/lib/esm/mcp/prompts/index.js +0 -7
  370. package/lib/esm/mcp/prompts/prompts.d.ts +0 -22
  371. package/lib/esm/mcp/prompts/prompts.js +0 -203
  372. package/lib/esm/mcp/resources/index.d.ts +0 -1
  373. package/lib/esm/mcp/resources/index.js +0 -2
  374. package/lib/esm/mcp/resources/resources.d.ts +0 -2
  375. package/lib/esm/mcp/resources/resources.js +0 -69
  376. package/lib/esm/mcp/schemas.d.ts +0 -53
  377. package/lib/esm/mcp/schemas.js +0 -97
  378. package/lib/esm/mcp/templates/codex-templates.d.ts +0 -3
  379. package/lib/esm/mcp/templates/codex-templates.js +0 -33
  380. package/lib/esm/mcp/templates/index.d.ts +0 -71
  381. package/lib/esm/mcp/templates/index.js +0 -66
  382. package/lib/esm/mcp/templates/resource-templates.d.ts +0 -3
  383. package/lib/esm/mcp/templates/resource-templates.js +0 -60
  384. package/lib/esm/mcp/templates/workspace-templates.d.ts +0 -3
  385. package/lib/esm/mcp/templates/workspace-templates.js +0 -66
  386. package/lib/esm/mcp/tools/codex-tools.d.ts +0 -5
  387. package/lib/esm/mcp/tools/codex-tools.js +0 -244
  388. package/lib/esm/mcp/tools/generateMcpModule.d.ts +0 -9
  389. package/lib/esm/mcp/tools/generateMcpModule.js +0 -133
  390. package/lib/esm/mcp/tools/index.d.ts +0 -219
  391. package/lib/esm/mcp/tools/index.js +0 -27
  392. package/lib/esm/mcp/tools/tools.d.ts +0 -10
  393. package/lib/esm/mcp/tools/tools.js +0 -275
  394. package/lib/esm/mcp/types.d.ts +0 -66
  395. package/lib/esm/mcp/types.js +0 -2
  396. package/lib/esm/mcp/utils.d.ts +0 -3
  397. package/lib/esm/mcp/utils.js +0 -46
  398. package/lib/esm/mcp/validation/index.d.ts +0 -13
  399. package/lib/esm/mcp/validation/index.js +0 -116
  400. package/lib/esm/mcp/validation/scaffoldModule.d.ts +0 -9
  401. package/lib/esm/mcp/validation/scaffoldModule.js +0 -88
  402. package/lib/esm/mcp/workspace.d.ts +0 -9
  403. package/lib/esm/mcp/workspace.js +0 -73
  404. package/lib/esm/metadata.d.ts +0 -9
  405. package/lib/esm/metadata.js +0 -22
  406. package/lib/esm/modules/_template/index.d.ts +0 -32
  407. package/lib/esm/modules/_template/index.js +0 -16
  408. package/lib/esm/modules/_template/prompts/index.d.ts +0 -6
  409. package/lib/esm/modules/_template/prompts/index.js +0 -9
  410. package/lib/esm/modules/_template/resources/index.d.ts +0 -6
  411. package/lib/esm/modules/_template/resources/index.js +0 -9
  412. package/lib/esm/modules/_template/templates/index.d.ts +0 -7
  413. package/lib/esm/modules/_template/templates/index.js +0 -10
  414. package/lib/esm/modules/_template/tools/index.d.ts +0 -6
  415. package/lib/esm/modules/_template/tools/index.js +0 -15
  416. package/lib/esm/modules/decoration/index.d.ts +0 -46
  417. package/lib/esm/modules/decoration/index.js +0 -10
  418. package/lib/esm/modules/decoration/prompts/index.d.ts +0 -1
  419. package/lib/esm/modules/decoration/prompts/index.js +0 -2
  420. package/lib/esm/modules/decoration/resources/index.d.ts +0 -7
  421. package/lib/esm/modules/decoration/resources/index.js +0 -10
  422. package/lib/esm/modules/decoration/templates/index.d.ts +0 -6
  423. package/lib/esm/modules/decoration/templates/index.js +0 -9
  424. package/lib/esm/modules/decoration/tools/index.d.ts +0 -26
  425. package/lib/esm/modules/decoration/tools/index.js +0 -7
  426. package/lib/esm/modules/index.d.ts +0 -2
  427. package/lib/esm/modules/index.js +0 -17
  428. package/lib/esm/modules/mcp/decoration-assist.d.ts +0 -4
  429. package/lib/esm/modules/mcp/decoration-assist.js +0 -6
  430. package/lib/esm/modules/mcp/index.d.ts +0 -6
  431. package/lib/esm/modules/mcp/index.js +0 -16
  432. package/lib/esm/modules/mcp/prompts/index.d.ts +0 -2
  433. package/lib/esm/modules/mcp/prompts/index.js +0 -9
  434. package/lib/esm/modules/mcp/resources/index.d.ts +0 -2
  435. package/lib/esm/modules/mcp/resources/index.js +0 -24
  436. package/lib/esm/modules/mcp/templates/index.d.ts +0 -2
  437. package/lib/esm/modules/mcp/templates/index.js +0 -28
  438. package/lib/esm/modules/mcp/tools/index.d.ts +0 -6
  439. package/lib/esm/modules/mcp/tools/index.js +0 -15
  440. package/lib/esm/utils/modulePaths.d.ts +0 -6
  441. package/lib/esm/utils/modulePaths.js +0 -33
  442. package/lib/esm/utils/moduleValidator.d.ts +0 -14
  443. package/lib/esm/utils/moduleValidator.js +0 -176
  444. package/lib/esm/utils.d.ts +0 -61
  445. package/lib/esm/utils.js +0 -86
  446. package/lib/mcp/aggregateModules.cjs +0 -225
  447. package/lib/mcp/aggregateModules.d.ts +0 -26
  448. package/lib/mcp/code.cjs +0 -81
  449. package/lib/mcp/code.d.ts +0 -23
  450. package/lib/mcp/decorator-tools.cjs +0 -243
  451. package/lib/mcp/decorator-tools.d.ts +0 -118
  452. package/lib/mcp/fastmcp-wiring.cjs +0 -59
  453. package/lib/mcp/fastmcp-wiring.d.ts +0 -14
  454. package/lib/mcp/index.cjs +0 -57
  455. package/lib/mcp/index.d.ts +0 -9
  456. package/lib/mcp/mcp-module.cjs +0 -46
  457. package/lib/mcp/mcp-module.d.ts +0 -11
  458. package/lib/mcp/moduleRegistry.cjs +0 -52
  459. package/lib/mcp/moduleRegistry.d.ts +0 -14
  460. package/lib/mcp/prompts/index.cjs +0 -25
  461. package/lib/mcp/prompts/index.d.ts +0 -4
  462. package/lib/mcp/prompts/prompts.cjs +0 -217
  463. package/lib/mcp/prompts/prompts.d.ts +0 -22
  464. package/lib/mcp/resources/index.d.ts +0 -1
  465. package/lib/mcp/resources/resources.cjs +0 -72
  466. package/lib/mcp/resources/resources.d.ts +0 -2
  467. package/lib/mcp/schemas.cjs +0 -100
  468. package/lib/mcp/schemas.d.ts +0 -53
  469. package/lib/mcp/templates/codex-templates.cjs +0 -40
  470. package/lib/mcp/templates/codex-templates.d.ts +0 -3
  471. package/lib/mcp/templates/index.cjs +0 -76
  472. package/lib/mcp/templates/index.d.ts +0 -71
  473. package/lib/mcp/templates/resource-templates.cjs +0 -67
  474. package/lib/mcp/templates/resource-templates.d.ts +0 -3
  475. package/lib/mcp/templates/workspace-templates.cjs +0 -70
  476. package/lib/mcp/templates/workspace-templates.d.ts +0 -3
  477. package/lib/mcp/tools/codex-tools.cjs +0 -250
  478. package/lib/mcp/tools/codex-tools.d.ts +0 -5
  479. package/lib/mcp/tools/generateMcpModule.cjs +0 -139
  480. package/lib/mcp/tools/generateMcpModule.d.ts +0 -9
  481. package/lib/mcp/tools/index.cjs +0 -30
  482. package/lib/mcp/tools/index.d.ts +0 -219
  483. package/lib/mcp/tools/tools.cjs +0 -317
  484. package/lib/mcp/tools/tools.d.ts +0 -10
  485. package/lib/mcp/types.cjs +0 -3
  486. package/lib/mcp/types.d.ts +0 -66
  487. package/lib/mcp/utils.cjs +0 -54
  488. package/lib/mcp/utils.d.ts +0 -3
  489. package/lib/mcp/validation/index.cjs +0 -123
  490. package/lib/mcp/validation/index.d.ts +0 -13
  491. package/lib/mcp/validation/scaffoldModule.cjs +0 -94
  492. package/lib/mcp/validation/scaffoldModule.d.ts +0 -9
  493. package/lib/mcp/workspace.cjs +0 -119
  494. package/lib/mcp/workspace.d.ts +0 -9
  495. package/lib/metadata.cjs +0 -25
  496. package/lib/metadata.d.ts +0 -9
  497. package/lib/modules/_template/index.cjs +0 -23
  498. package/lib/modules/_template/index.d.ts +0 -32
  499. package/lib/modules/_template/prompts/index.cjs +0 -12
  500. package/lib/modules/_template/prompts/index.d.ts +0 -6
  501. package/lib/modules/_template/resources/index.cjs +0 -12
  502. package/lib/modules/_template/resources/index.d.ts +0 -6
  503. package/lib/modules/_template/templates/index.cjs +0 -13
  504. package/lib/modules/_template/templates/index.d.ts +0 -7
  505. package/lib/modules/_template/tools/index.cjs +0 -18
  506. package/lib/modules/_template/tools/index.d.ts +0 -6
  507. package/lib/modules/decoration/index.cjs +0 -17
  508. package/lib/modules/decoration/index.d.ts +0 -46
  509. package/lib/modules/decoration/prompts/index.cjs +0 -5
  510. package/lib/modules/decoration/prompts/index.d.ts +0 -1
  511. package/lib/modules/decoration/resources/index.cjs +0 -13
  512. package/lib/modules/decoration/resources/index.d.ts +0 -7
  513. package/lib/modules/decoration/templates/index.cjs +0 -12
  514. package/lib/modules/decoration/templates/index.d.ts +0 -6
  515. package/lib/modules/decoration/tools/index.cjs +0 -10
  516. package/lib/modules/decoration/tools/index.d.ts +0 -26
  517. package/lib/modules/index.cjs +0 -20
  518. package/lib/modules/index.d.ts +0 -2
  519. package/lib/modules/mcp/decoration-assist.cjs +0 -13
  520. package/lib/modules/mcp/decoration-assist.d.ts +0 -4
  521. package/lib/modules/mcp/index.cjs +0 -23
  522. package/lib/modules/mcp/index.d.ts +0 -6
  523. package/lib/modules/mcp/prompts/index.cjs +0 -12
  524. package/lib/modules/mcp/prompts/index.d.ts +0 -2
  525. package/lib/modules/mcp/resources/index.cjs +0 -27
  526. package/lib/modules/mcp/resources/index.d.ts +0 -2
  527. package/lib/modules/mcp/templates/index.cjs +0 -31
  528. package/lib/modules/mcp/templates/index.d.ts +0 -2
  529. package/lib/modules/mcp/tools/index.cjs +0 -18
  530. package/lib/modules/mcp/tools/index.d.ts +0 -6
  531. package/lib/utils/modulePaths.cjs +0 -43
  532. package/lib/utils/modulePaths.d.ts +0 -6
  533. package/lib/utils/moduleValidator.cjs +0 -184
  534. package/lib/utils/moduleValidator.d.ts +0 -14
  535. package/lib/utils.cjs +0 -129
  536. package/lib/utils.d.ts +0 -61
  537. /package/lib/{bin/validate-modules.d.ts → esm/tools/ast-jsdoc-tools/cli.d.ts} +0 -0
  538. /package/lib/{esm/bin/validate-modules.d.ts → tools/ast-jsdoc-tools/cli.d.ts} +0 -0
@@ -1,189 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.McpWrapper = void 0;
7
- const fs_1 = __importDefault(require("fs"));
8
- const path_1 = __importDefault(require("path"));
9
- const constants_1 = require("./constants.cjs");
10
- const utils_1 = require("./utils.cjs");
11
- const fastmcp_1 = require("fastmcp");
12
- const logging_1 = require("@decaf-ts/logging");
13
- const metadata_1 = require("./metadata.cjs");
14
- /**
15
- * @description Utility class to handle CLI functionality from all Decaf modules
16
- * @summary This class provides a wrapper around Commander.js to handle CLI commands from different Decaf modules.
17
- * It crawls the filesystem to find CLI modules, loads them, and registers their commands.
18
- *
19
- * @param {string} [basePath] The base path to look for modules in. Defaults to `./`
20
- * @param {number} [crawlLevels] Number of folder levels to crawl to find modules from the basePath. Defaults to 4
21
- *
22
- * @example
23
- * // Create a new CLI wrapper and run it with custom options
24
- * const cli = new CliWrapper('./src', 2);
25
- * cli.run(process.argv).then(() => {
26
- * console.log('CLI commands executed successfully');
27
- * });
28
- *
29
- * @class McpWrapper
30
- */
31
- class McpWrapper extends logging_1.LoggedClass {
32
- constructor(basePath = "./", crawlLevels = 4) {
33
- super();
34
- this.basePath = basePath;
35
- this.crawlLevels = crawlLevels;
36
- this.modules = {};
37
- this.rootPath = path_1.default.resolve(__dirname, "..");
38
- }
39
- /**
40
- * @description Retrieves and initializes the Commander Command object
41
- * @summary Lazy-loads the Command object, initializing it with the package name, description, and version
42
- * @return {FastMCP} The initialized Command object
43
- * @private
44
- */
45
- get mcp() {
46
- if (!this._mcp) {
47
- this._mcp = new fastmcp_1.FastMCP({
48
- name: "decaf-ts MCP server",
49
- instructions: "",
50
- version: metadata_1.VERSION,
51
- });
52
- }
53
- return this._mcp;
54
- }
55
- /**
56
- * @description Loads and registers an mcp extension module from a file
57
- * @summary Dynamically imports an mcp extension module from the specified file path, initializes it, and registers it in the modules collection
58
- *
59
- */
60
- async load(server, filePath) {
61
- const log = this.log.for(this.load);
62
- let pkg, version, enrich;
63
- try {
64
- const res = await utils_1.McpUtils.loadFromFile(filePath);
65
- pkg = res.PACKAGE_NAME;
66
- version = res.VERSION;
67
- enrich = res.enrich;
68
- }
69
- catch (e) {
70
- throw new Error(e.message || e);
71
- }
72
- try {
73
- log.info(`Enriching mcp server with module ${pkg} v${version}`);
74
- const result = enrich(server);
75
- server = result instanceof Promise ? await result : result;
76
- }
77
- catch (e) {
78
- throw new Error(`failed to enrich mcp with module ${pkg || "unnamed"} under ${filePath}: ${e instanceof Error ? e.message : e}`);
79
- }
80
- return {
81
- mcp: server,
82
- package: pkg,
83
- version: version,
84
- };
85
- }
86
- /**
87
- * @description Finds and loads all CLI modules in the basePath
88
- * @summary Uses the crawl method to find all CLI modules in the specified base path,
89
- * then loads and registers each module as a subcommand
90
- *
91
- * @return {Promise<void>} A promise that resolves when all modules are loaded
92
- *
93
- * @private
94
- * @mermaid
95
- * sequenceDiagram
96
- * participant CliWrapper
97
- * participant Filesystem
98
- * participant Module
99
- *
100
- * CliWrapper->>Filesystem: Join basePath with cwd
101
- * CliWrapper->>CliWrapper: crawl(basePath, crawlLevels)
102
- * CliWrapper-->>CliWrapper: modules[]
103
- * loop For each module
104
- * alt Not @decaf-ts/cli
105
- * CliWrapper->>CliWrapper: load(module, cwd)
106
- * CliWrapper-->>CliWrapper: name
107
- * CliWrapper->>CliWrapper: Check if command exists
108
- * alt Command doesn't exist
109
- * CliWrapper->>Command: command(name).addCommand(modules[name])
110
- * end
111
- * end
112
- * end
113
- * CliWrapper->>Console: Log loaded modules
114
- */
115
- async boot() {
116
- const log = this.log.for(this.boot);
117
- let server = this.mcp;
118
- // discover modules by crawling basePath
119
- const moduleFiles = this.crawl(path_1.default.resolve(this.basePath), this.crawlLevels);
120
- for (const moduleFile of moduleFiles) {
121
- if (moduleFile.includes("@decaf-ts/mcp")) {
122
- continue;
123
- }
124
- try {
125
- const res = await this.load(server, moduleFile);
126
- server = res.mcp;
127
- this.modules[res.package] = moduleFile;
128
- }
129
- catch (e) {
130
- log.error(`Failed to load MCP configs for ${moduleFile}: ${e instanceof Error ? e.message : e}`);
131
- }
132
- }
133
- console.log(`loaded modules:\n${Object.keys(this.modules)
134
- .map((k) => `- ${k}`)
135
- .join("\n")}`);
136
- return server;
137
- }
138
- /**
139
- * @description Recursively searches for CLI module files in the directory structure
140
- * @summary Crawls the basePath up to the specified number of folder levels to find files named according to CLI_FILE_NAME
141
- *
142
- * @param {string} basePath The absolute base path to start searching in
143
- * @param {number} [levels=2] The maximum number of directory levels to crawl
144
- * @return {string[]} An array of file paths to CLI modules
145
- *
146
- * @private
147
- */
148
- crawl(basePath, levels = 2) {
149
- if (levels <= 0)
150
- return [];
151
- return fs_1.default.readdirSync(basePath).reduce((accum, file) => {
152
- file = path_1.default.join(basePath, file);
153
- if (fs_1.default.statSync(file).isDirectory()) {
154
- accum.push(...this.crawl(file, levels - 1));
155
- }
156
- else if (file.match(new RegExp(`${constants_1.MCP_FILE_NAME}.[cm]?js$`, "gm"))) {
157
- accum.push(file);
158
- }
159
- return accum;
160
- }, []);
161
- }
162
- /**
163
- * @description Executes the CLI with the provided arguments
164
- * @summary Boots the CLI by loading all modules, then parses and executes the command specified in the arguments
165
- *
166
- * @param {string[]} [args=process.argv] Command line arguments to parse and execute
167
- * @return {Promise<void>} A promise that resolves when the command execution is complete
168
- *
169
- * @mermaid
170
- * sequenceDiagram
171
- * participant Client
172
- * participant CliWrapper
173
- * participant Command
174
- *
175
- * Client->>CliWrapper: run(args)
176
- * CliWrapper->>CliWrapper: boot()
177
- * Note over CliWrapper: Loads all modules
178
- * CliWrapper->>Command: parseAsync(args)
179
- * Command-->>CliWrapper: result
180
- * CliWrapper-->>Client: result
181
- */
182
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
183
- async run(args = process.argv) {
184
- const server = await this.boot();
185
- await server.start({ transportType: "stdio" });
186
- }
187
- }
188
- exports.McpWrapper = McpWrapper;
189
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWNwV3JhcHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9NY3BXcmFwcGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDRDQUFvQjtBQUNwQixnREFBd0I7QUFDeEIsK0NBQTRDO0FBQzVDLHVDQUFtQztBQUNuQyxxQ0FBa0M7QUFDbEMsK0NBQWdEO0FBQ2hELDZDQUFxQztBQUVyQzs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILE1BQWEsVUFBVyxTQUFRLHFCQUFXO0lBS3pDLFlBQ1UsV0FBbUIsSUFBSSxFQUN2QixjQUFjLENBQUM7UUFFdkIsS0FBSyxFQUFFLENBQUM7UUFIQSxhQUFRLEdBQVIsUUFBUSxDQUFlO1FBQ3ZCLGdCQUFXLEdBQVgsV0FBVyxDQUFJO1FBTGpCLFlBQU8sR0FBMkIsRUFBRSxDQUFDO1FBUTNDLElBQUksQ0FBQyxRQUFRLEdBQUcsY0FBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsSUFBWSxHQUFHO1FBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxpQkFBTyxDQUFDO2dCQUN0QixJQUFJLEVBQUUscUJBQXFCO2dCQUMzQixZQUFZLEVBQUUsRUFBRTtnQkFDaEIsT0FBTyxFQUFFLGtCQUFjO2FBQ3hCLENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxLQUFLLENBQUMsSUFBSSxDQUNoQixNQUFlLEVBQ2YsUUFBZ0I7UUFFaEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXBDLElBQUksR0FBVyxFQUFFLE9BQWUsRUFBRSxNQUFXLENBQUM7UUFD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LEVBQUUsU0FBaUIsQ0FBQztRQUNoRCxJQUFJLE1BQU0sSUFBSSxDQUFDO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDM0IsT0FBTyxZQUFFLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQWUsRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUMvRCxJQUFJLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDakMsSUFBSSxZQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7Z0JBQ3BDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5QyxDQUFDO2lCQUFNLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxHQUFHLHlCQUFhLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3JFLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkIsQ0FBQztZQUNELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ1QsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BbUJHO0lBQ0gsNkRBQTZEO0lBQzdELEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBaUIsT0FBTyxDQUFDLElBQUk7UUFDckMsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDakMsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDakQsQ0FBQztDQUNGO0FBN0tELGdDQTZLQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBNQ1BfRklMRV9OQU1FIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBNY3BVdGlscyB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBGYXN0TUNQIH0gZnJvbSBcImZhc3RtY3BcIjtcbmltcG9ydCB7IExvZ2dlZENsYXNzIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBWRVJTSU9OIH0gZnJvbSBcIi4vbWV0YWRhdGFcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVXRpbGl0eSBjbGFzcyB0byBoYW5kbGUgQ0xJIGZ1bmN0aW9uYWxpdHkgZnJvbSBhbGwgRGVjYWYgbW9kdWxlc1xuICogQHN1bW1hcnkgVGhpcyBjbGFzcyBwcm92aWRlcyBhIHdyYXBwZXIgYXJvdW5kIENvbW1hbmRlci5qcyB0byBoYW5kbGUgQ0xJIGNvbW1hbmRzIGZyb20gZGlmZmVyZW50IERlY2FmIG1vZHVsZXMuXG4gKiBJdCBjcmF3bHMgdGhlIGZpbGVzeXN0ZW0gdG8gZmluZCBDTEkgbW9kdWxlcywgbG9hZHMgdGhlbSwgYW5kIHJlZ2lzdGVycyB0aGVpciBjb21tYW5kcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW2Jhc2VQYXRoXSBUaGUgYmFzZSBwYXRoIHRvIGxvb2sgZm9yIG1vZHVsZXMgaW4uIERlZmF1bHRzIHRvIGAuL2BcbiAqIEBwYXJhbSB7bnVtYmVyfSBbY3Jhd2xMZXZlbHNdIE51bWJlciBvZiBmb2xkZXIgbGV2ZWxzIHRvIGNyYXdsIHRvIGZpbmQgbW9kdWxlcyBmcm9tIHRoZSBiYXNlUGF0aC4gRGVmYXVsdHMgdG8gNFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgYSBuZXcgQ0xJIHdyYXBwZXIgYW5kIHJ1biBpdCB3aXRoIGN1c3RvbSBvcHRpb25zXG4gKiBjb25zdCBjbGkgPSBuZXcgQ2xpV3JhcHBlcignLi9zcmMnLCAyKTtcbiAqIGNsaS5ydW4ocHJvY2Vzcy5hcmd2KS50aGVuKCgpID0+IHtcbiAqICAgY29uc29sZS5sb2coJ0NMSSBjb21tYW5kcyBleGVjdXRlZCBzdWNjZXNzZnVsbHknKTtcbiAqIH0pO1xuICpcbiAqIEBjbGFzcyBNY3BXcmFwcGVyXG4gKi9cbmV4cG9ydCBjbGFzcyBNY3BXcmFwcGVyIGV4dGVuZHMgTG9nZ2VkQ2xhc3Mge1xuICBwcml2YXRlIF9tY3A/OiBGYXN0TUNQO1xuICBwcml2YXRlIG1vZHVsZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgcHJpdmF0ZSByZWFkb25seSByb290UGF0aDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYmFzZVBhdGg6IHN0cmluZyA9IFwiLi9cIixcbiAgICBwcml2YXRlIGNyYXdsTGV2ZWxzID0gNFxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucm9vdFBhdGggPSBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCBcIi4uXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYW5kIGluaXRpYWxpemVzIHRoZSBDb21tYW5kZXIgQ29tbWFuZCBvYmplY3RcbiAgICogQHN1bW1hcnkgTGF6eS1sb2FkcyB0aGUgQ29tbWFuZCBvYmplY3QsIGluaXRpYWxpemluZyBpdCB3aXRoIHRoZSBwYWNrYWdlIG5hbWUsIGRlc2NyaXB0aW9uLCBhbmQgdmVyc2lvblxuICAgKiBAcmV0dXJuIHtGYXN0TUNQfSBUaGUgaW5pdGlhbGl6ZWQgQ29tbWFuZCBvYmplY3RcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgZ2V0IG1jcCgpIHtcbiAgICBpZiAoIXRoaXMuX21jcCkge1xuICAgICAgdGhpcy5fbWNwID0gbmV3IEZhc3RNQ1Aoe1xuICAgICAgICBuYW1lOiBcImRlY2FmLXRzIE1DUCBzZXJ2ZXJcIixcbiAgICAgICAgaW5zdHJ1Y3Rpb25zOiBcIlwiLFxuICAgICAgICB2ZXJzaW9uOiBWRVJTSU9OIGFzIGFueSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fbWNwO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2FkcyBhbmQgcmVnaXN0ZXJzIGFuIG1jcCBleHRlbnNpb24gbW9kdWxlIGZyb20gYSBmaWxlXG4gICAqIEBzdW1tYXJ5IER5bmFtaWNhbGx5IGltcG9ydHMgYW4gbWNwIGV4dGVuc2lvbiBtb2R1bGUgZnJvbSB0aGUgc3BlY2lmaWVkIGZpbGUgcGF0aCwgaW5pdGlhbGl6ZXMgaXQsIGFuZCByZWdpc3RlcnMgaXQgaW4gdGhlIG1vZHVsZXMgY29sbGVjdGlvblxuICAgKlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsb2FkKFxuICAgIHNlcnZlcjogRmFzdE1DUCxcbiAgICBmaWxlUGF0aDogc3RyaW5nXG4gICk6IFByb21pc2U8eyBtY3A6IEZhc3RNQ1A7IHBhY2thZ2U6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nIH0+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5sb2FkKTtcblxuICAgIGxldCBwa2c6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nLCBlbnJpY2g6IGFueTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgTWNwVXRpbHMubG9hZEZyb21GaWxlKGZpbGVQYXRoKTtcbiAgICAgIHBrZyA9IHJlcy5QQUNLQUdFX05BTUU7XG4gICAgICB2ZXJzaW9uID0gcmVzLlZFUlNJT047XG4gICAgICBlbnJpY2ggPSByZXMuZW5yaWNoO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigoZSBhcyBhbnkpLm1lc3NhZ2UgfHwgKGUgYXMgYW55KSk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBsb2cuaW5mbyhgRW5yaWNoaW5nIG1jcCBzZXJ2ZXIgd2l0aCBtb2R1bGUgJHtwa2d9IHYke3ZlcnNpb259YCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBlbnJpY2goc2VydmVyKTtcbiAgICAgIHNlcnZlciA9IHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UgPyBhd2FpdCByZXN1bHQgOiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgZmFpbGVkIHRvIGVucmljaCBtY3Agd2l0aCBtb2R1bGUgJHtwa2cgfHwgXCJ1bm5hbWVkXCJ9IHVuZGVyICR7ZmlsZVBhdGh9OiAke2UgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IGV9YFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG1jcDogc2VydmVyLFxuICAgICAgcGFja2FnZTogcGtnLFxuICAgICAgdmVyc2lvbjogdmVyc2lvbixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGaW5kcyBhbmQgbG9hZHMgYWxsIENMSSBtb2R1bGVzIGluIHRoZSBiYXNlUGF0aFxuICAgKiBAc3VtbWFyeSBVc2VzIHRoZSBjcmF3bCBtZXRob2QgdG8gZmluZCBhbGwgQ0xJIG1vZHVsZXMgaW4gdGhlIHNwZWNpZmllZCBiYXNlIHBhdGgsXG4gICAqIHRoZW4gbG9hZHMgYW5kIHJlZ2lzdGVycyBlYWNoIG1vZHVsZSBhcyBhIHN1YmNvbW1hbmRcbiAgICpcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgbW9kdWxlcyBhcmUgbG9hZGVkXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaVdyYXBwZXJcbiAgICogICBwYXJ0aWNpcGFudCBGaWxlc3lzdGVtXG4gICAqICAgcGFydGljaXBhbnQgTW9kdWxlXG4gICAqXG4gICAqICAgQ2xpV3JhcHBlci0+PkZpbGVzeXN0ZW06IEpvaW4gYmFzZVBhdGggd2l0aCBjd2RcbiAgICogICBDbGlXcmFwcGVyLT4+Q2xpV3JhcHBlcjogY3Jhd2woYmFzZVBhdGgsIGNyYXdsTGV2ZWxzKVxuICAgKiAgIENsaVdyYXBwZXItLT4+Q2xpV3JhcHBlcjogbW9kdWxlc1tdXG4gICAqICAgbG9vcCBGb3IgZWFjaCBtb2R1bGVcbiAgICogICAgIGFsdCBOb3QgQGRlY2FmLXRzL2NsaVxuICAgKiAgICAgICBDbGlXcmFwcGVyLT4+Q2xpV3JhcHBlcjogbG9hZChtb2R1bGUsIGN3ZClcbiAgICogICAgICAgQ2xpV3JhcHBlci0tPj5DbGlXcmFwcGVyOiBuYW1lXG4gICAqICAgICAgIENsaVdyYXBwZXItPj5DbGlXcmFwcGVyOiBDaGVjayBpZiBjb21tYW5kIGV4aXN0c1xuICAgKiAgICAgICBhbHQgQ29tbWFuZCBkb2Vzbid0IGV4aXN0XG4gICAqICAgICAgICAgQ2xpV3JhcHBlci0+PkNvbW1hbmQ6IGNvbW1hbmQobmFtZSkuYWRkQ29tbWFuZChtb2R1bGVzW25hbWVdKVxuICAgKiAgICAgICBlbmRcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKiAgIENsaVdyYXBwZXItPj5Db25zb2xlOiBMb2cgbG9hZGVkIG1vZHVsZXNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYm9vdCgpIHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5ib290KTtcbiAgICBsZXQgc2VydmVyID0gdGhpcy5tY3A7XG4gICAgLy8gZGlzY292ZXIgbW9kdWxlcyBieSBjcmF3bGluZyBiYXNlUGF0aFxuICAgIGNvbnN0IG1vZHVsZUZpbGVzID0gdGhpcy5jcmF3bChcbiAgICAgIHBhdGgucmVzb2x2ZSh0aGlzLmJhc2VQYXRoKSxcbiAgICAgIHRoaXMuY3Jhd2xMZXZlbHNcbiAgICApO1xuICAgIGZvciAoY29uc3QgbW9kdWxlRmlsZSBvZiBtb2R1bGVGaWxlcykge1xuICAgICAgaWYgKG1vZHVsZUZpbGUuaW5jbHVkZXMoXCJAZGVjYWYtdHMvbWNwXCIpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5sb2FkKHNlcnZlciwgbW9kdWxlRmlsZSk7XG4gICAgICAgIHNlcnZlciA9IHJlcy5tY3A7XG4gICAgICAgIHRoaXMubW9kdWxlc1tyZXMucGFja2FnZV0gPSBtb2R1bGVGaWxlO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBsb2cuZXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBsb2FkIE1DUCBjb25maWdzIGZvciAke21vZHVsZUZpbGV9OiAke2UgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IGV9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGBsb2FkZWQgbW9kdWxlczpcXG4ke09iamVjdC5rZXlzKHRoaXMubW9kdWxlcylcbiAgICAgICAgLm1hcCgoaykgPT4gYC0gJHtrfWApXG4gICAgICAgIC5qb2luKFwiXFxuXCIpfWBcbiAgICApO1xuICAgIHJldHVybiBzZXJ2ZXI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlY3Vyc2l2ZWx5IHNlYXJjaGVzIGZvciBDTEkgbW9kdWxlIGZpbGVzIGluIHRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlXG4gICAqIEBzdW1tYXJ5IENyYXdscyB0aGUgYmFzZVBhdGggdXAgdG8gdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZm9sZGVyIGxldmVscyB0byBmaW5kIGZpbGVzIG5hbWVkIGFjY29yZGluZyB0byBDTElfRklMRV9OQU1FXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlUGF0aCBUaGUgYWJzb2x1dGUgYmFzZSBwYXRoIHRvIHN0YXJ0IHNlYXJjaGluZyBpblxuICAgKiBAcGFyYW0ge251bWJlcn0gW2xldmVscz0yXSBUaGUgbWF4aW11bSBudW1iZXIgb2YgZGlyZWN0b3J5IGxldmVscyB0byBjcmF3bFxuICAgKiBAcmV0dXJuIHtzdHJpbmdbXX0gQW4gYXJyYXkgb2YgZmlsZSBwYXRocyB0byBDTEkgbW9kdWxlc1xuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBjcmF3bChiYXNlUGF0aDogc3RyaW5nLCBsZXZlbHM6IG51bWJlciA9IDIpIHtcbiAgICBpZiAobGV2ZWxzIDw9IDApIHJldHVybiBbXTtcbiAgICByZXR1cm4gZnMucmVhZGRpclN5bmMoYmFzZVBhdGgpLnJlZHVjZSgoYWNjdW06IHN0cmluZ1tdLCBmaWxlKSA9PiB7XG4gICAgICBmaWxlID0gcGF0aC5qb2luKGJhc2VQYXRoLCBmaWxlKTtcbiAgICAgIGlmIChmcy5zdGF0U3luYyhmaWxlKS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIGFjY3VtLnB1c2goLi4udGhpcy5jcmF3bChmaWxlLCBsZXZlbHMgLSAxKSk7XG4gICAgICB9IGVsc2UgaWYgKGZpbGUubWF0Y2gobmV3IFJlZ0V4cChgJHtNQ1BfRklMRV9OQU1FfS5bY21dP2pzJGAsIFwiZ21cIikpKSB7XG4gICAgICAgIGFjY3VtLnB1c2goZmlsZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjdW07XG4gICAgfSwgW10pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyB0aGUgQ0xJIHdpdGggdGhlIHByb3ZpZGVkIGFyZ3VtZW50c1xuICAgKiBAc3VtbWFyeSBCb290cyB0aGUgQ0xJIGJ5IGxvYWRpbmcgYWxsIG1vZHVsZXMsIHRoZW4gcGFyc2VzIGFuZCBleGVjdXRlcyB0aGUgY29tbWFuZCBzcGVjaWZpZWQgaW4gdGhlIGFyZ3VtZW50c1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbYXJncz1wcm9jZXNzLmFyZ3ZdIENvbW1hbmQgbGluZSBhcmd1bWVudHMgdG8gcGFyc2UgYW5kIGV4ZWN1dGVcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgY29tbWFuZCBleGVjdXRpb24gaXMgY29tcGxldGVcbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgQ2xpV3JhcHBlclxuICAgKiAgIHBhcnRpY2lwYW50IENvbW1hbmRcbiAgICpcbiAgICogICBDbGllbnQtPj5DbGlXcmFwcGVyOiBydW4oYXJncylcbiAgICogICBDbGlXcmFwcGVyLT4+Q2xpV3JhcHBlcjogYm9vdCgpXG4gICAqICAgTm90ZSBvdmVyIENsaVdyYXBwZXI6IExvYWRzIGFsbCBtb2R1bGVzXG4gICAqICAgQ2xpV3JhcHBlci0+PkNvbW1hbmQ6IHBhcnNlQXN5bmMoYXJncylcbiAgICogICBDb21tYW5kLS0+PkNsaVdyYXBwZXI6IHJlc3VsdFxuICAgKiAgIENsaVdyYXBwZXItLT4+Q2xpZW50OiByZXN1bHRcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgYXN5bmMgcnVuKGFyZ3M6IHN0cmluZ1tdID0gcHJvY2Vzcy5hcmd2KSB7XG4gICAgY29uc3Qgc2VydmVyID0gYXdhaXQgdGhpcy5ib290KCk7XG4gICAgYXdhaXQgc2VydmVyLnN0YXJ0KHsgdHJhbnNwb3J0VHlwZTogXCJzdGRpb1wiIH0pO1xuICB9XG59XG4iXX0=
@@ -1,101 +0,0 @@
1
- import { LoggedClass } from "@decaf-ts/logging";
2
- /**
3
- * @description Utility class to handle CLI functionality from all Decaf modules
4
- * @summary This class provides a wrapper around Commander.js to handle CLI commands from different Decaf modules.
5
- * It crawls the filesystem to find CLI modules, loads them, and registers their commands.
6
- *
7
- * @param {string} [basePath] The base path to look for modules in. Defaults to `./`
8
- * @param {number} [crawlLevels] Number of folder levels to crawl to find modules from the basePath. Defaults to 4
9
- *
10
- * @example
11
- * // Create a new CLI wrapper and run it with custom options
12
- * const cli = new CliWrapper('./src', 2);
13
- * cli.run(process.argv).then(() => {
14
- * console.log('CLI commands executed successfully');
15
- * });
16
- *
17
- * @class McpWrapper
18
- */
19
- export declare class McpWrapper extends LoggedClass {
20
- private basePath;
21
- private crawlLevels;
22
- private _mcp?;
23
- private modules;
24
- private readonly rootPath;
25
- constructor(basePath?: string, crawlLevels?: number);
26
- /**
27
- * @description Retrieves and initializes the Commander Command object
28
- * @summary Lazy-loads the Command object, initializing it with the package name, description, and version
29
- * @return {FastMCP} The initialized Command object
30
- * @private
31
- */
32
- private get mcp();
33
- /**
34
- * @description Loads and registers an mcp extension module from a file
35
- * @summary Dynamically imports an mcp extension module from the specified file path, initializes it, and registers it in the modules collection
36
- *
37
- */
38
- private load;
39
- /**
40
- * @description Finds and loads all CLI modules in the basePath
41
- * @summary Uses the crawl method to find all CLI modules in the specified base path,
42
- * then loads and registers each module as a subcommand
43
- *
44
- * @return {Promise<void>} A promise that resolves when all modules are loaded
45
- *
46
- * @private
47
- * @mermaid
48
- * sequenceDiagram
49
- * participant CliWrapper
50
- * participant Filesystem
51
- * participant Module
52
- *
53
- * CliWrapper->>Filesystem: Join basePath with cwd
54
- * CliWrapper->>CliWrapper: crawl(basePath, crawlLevels)
55
- * CliWrapper-->>CliWrapper: modules[]
56
- * loop For each module
57
- * alt Not @decaf-ts/cli
58
- * CliWrapper->>CliWrapper: load(module, cwd)
59
- * CliWrapper-->>CliWrapper: name
60
- * CliWrapper->>CliWrapper: Check if command exists
61
- * alt Command doesn't exist
62
- * CliWrapper->>Command: command(name).addCommand(modules[name])
63
- * end
64
- * end
65
- * end
66
- * CliWrapper->>Console: Log loaded modules
67
- */
68
- private boot;
69
- /**
70
- * @description Recursively searches for CLI module files in the directory structure
71
- * @summary Crawls the basePath up to the specified number of folder levels to find files named according to CLI_FILE_NAME
72
- *
73
- * @param {string} basePath The absolute base path to start searching in
74
- * @param {number} [levels=2] The maximum number of directory levels to crawl
75
- * @return {string[]} An array of file paths to CLI modules
76
- *
77
- * @private
78
- */
79
- private crawl;
80
- /**
81
- * @description Executes the CLI with the provided arguments
82
- * @summary Boots the CLI by loading all modules, then parses and executes the command specified in the arguments
83
- *
84
- * @param {string[]} [args=process.argv] Command line arguments to parse and execute
85
- * @return {Promise<void>} A promise that resolves when the command execution is complete
86
- *
87
- * @mermaid
88
- * sequenceDiagram
89
- * participant Client
90
- * participant CliWrapper
91
- * participant Command
92
- *
93
- * Client->>CliWrapper: run(args)
94
- * CliWrapper->>CliWrapper: boot()
95
- * Note over CliWrapper: Loads all modules
96
- * CliWrapper->>Command: parseAsync(args)
97
- * Command-->>CliWrapper: result
98
- * CliWrapper-->>Client: result
99
- */
100
- run(args?: string[]): Promise<void>;
101
- }
@@ -1,24 +0,0 @@
1
- #!/usr/bin/env node
2
- "use strict";
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- const moduleValidator_1 = require("./../utils/moduleValidator.cjs");
5
- async function main() {
6
- try {
7
- const issues = (0, moduleValidator_1.assertModuleScaffolding)();
8
- if (issues.length) {
9
- console.log(`[module-validator] Completed with ${issues.length} issue(s) (warnings may persist)`);
10
- for (const issue of issues) {
11
- console.log(` - [${issue.severity.toUpperCase()}] ${issue.module}: ${issue.detail}`);
12
- }
13
- }
14
- else {
15
- console.log("[module-validator] Modules validated successfully");
16
- }
17
- }
18
- catch (error) {
19
- console.error(`[module-validator] ${error instanceof Error ? error.message : error}`);
20
- process.exitCode = 1;
21
- }
22
- }
23
- void main();
24
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUtbW9kdWxlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaW4vdmFsaWRhdGUtbW9kdWxlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxvRUFBbUU7QUFFbkUsS0FBSyxVQUFVLElBQUk7SUFDakIsSUFBSSxDQUFDO1FBQ0gsTUFBTSxNQUFNLEdBQUcsSUFBQSx5Q0FBdUIsR0FBRSxDQUFDO1FBQ3pDLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2xCLE9BQU8sQ0FBQyxHQUFHLENBQ1QscUNBQXFDLE1BQU0sQ0FBQyxNQUFNLGtDQUFrQyxDQUNyRixDQUFDO1lBQ0YsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDM0IsT0FBTyxDQUFDLEdBQUcsQ0FDVCxRQUFRLEtBQUssQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEtBQUssS0FBSyxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQ3pFLENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLENBQUMsR0FBRyxDQUFDLG1EQUFtRCxDQUFDLENBQUM7UUFDbkUsQ0FBQztJQUNILENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUN0RixPQUFPLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztJQUN2QixDQUFDO0FBQ0gsQ0FBQztBQUVELEtBQUssSUFBSSxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG5pbXBvcnQgeyBhc3NlcnRNb2R1bGVTY2FmZm9sZGluZyB9IGZyb20gXCIuLi91dGlscy9tb2R1bGVWYWxpZGF0b3JcIjtcblxuYXN5bmMgZnVuY3Rpb24gbWFpbigpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBpc3N1ZXMgPSBhc3NlcnRNb2R1bGVTY2FmZm9sZGluZygpO1xuICAgIGlmIChpc3N1ZXMubGVuZ3RoKSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgYFttb2R1bGUtdmFsaWRhdG9yXSBDb21wbGV0ZWQgd2l0aCAke2lzc3Vlcy5sZW5ndGh9IGlzc3VlKHMpICh3YXJuaW5ncyBtYXkgcGVyc2lzdClgXG4gICAgICApO1xuICAgICAgZm9yIChjb25zdCBpc3N1ZSBvZiBpc3N1ZXMpIHtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgYCAgLSBbJHtpc3N1ZS5zZXZlcml0eS50b1VwcGVyQ2FzZSgpfV0gJHtpc3N1ZS5tb2R1bGV9OiAke2lzc3VlLmRldGFpbH1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiW21vZHVsZS12YWxpZGF0b3JdIE1vZHVsZXMgdmFsaWRhdGVkIHN1Y2Nlc3NmdWxseVwiKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihgW21vZHVsZS12YWxpZGF0b3JdICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcn1gKTtcbiAgICBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbiAgfVxufVxuXG52b2lkIG1haW4oKTtcbiJdfQ==
@@ -1,101 +0,0 @@
1
- import { LoggedClass } from "@decaf-ts/logging";
2
- /**
3
- * @description Utility class to handle CLI functionality from all Decaf modules
4
- * @summary This class provides a wrapper around Commander.js to handle CLI commands from different Decaf modules.
5
- * It crawls the filesystem to find CLI modules, loads them, and registers their commands.
6
- *
7
- * @param {string} [basePath] The base path to look for modules in. Defaults to `./`
8
- * @param {number} [crawlLevels] Number of folder levels to crawl to find modules from the basePath. Defaults to 4
9
- *
10
- * @example
11
- * // Create a new CLI wrapper and run it with custom options
12
- * const cli = new CliWrapper('./src', 2);
13
- * cli.run(process.argv).then(() => {
14
- * console.log('CLI commands executed successfully');
15
- * });
16
- *
17
- * @class McpWrapper
18
- */
19
- export declare class McpWrapper extends LoggedClass {
20
- private basePath;
21
- private crawlLevels;
22
- private _mcp?;
23
- private modules;
24
- private readonly rootPath;
25
- constructor(basePath?: string, crawlLevels?: number);
26
- /**
27
- * @description Retrieves and initializes the Commander Command object
28
- * @summary Lazy-loads the Command object, initializing it with the package name, description, and version
29
- * @return {FastMCP} The initialized Command object
30
- * @private
31
- */
32
- private get mcp();
33
- /**
34
- * @description Loads and registers an mcp extension module from a file
35
- * @summary Dynamically imports an mcp extension module from the specified file path, initializes it, and registers it in the modules collection
36
- *
37
- */
38
- private load;
39
- /**
40
- * @description Finds and loads all CLI modules in the basePath
41
- * @summary Uses the crawl method to find all CLI modules in the specified base path,
42
- * then loads and registers each module as a subcommand
43
- *
44
- * @return {Promise<void>} A promise that resolves when all modules are loaded
45
- *
46
- * @private
47
- * @mermaid
48
- * sequenceDiagram
49
- * participant CliWrapper
50
- * participant Filesystem
51
- * participant Module
52
- *
53
- * CliWrapper->>Filesystem: Join basePath with cwd
54
- * CliWrapper->>CliWrapper: crawl(basePath, crawlLevels)
55
- * CliWrapper-->>CliWrapper: modules[]
56
- * loop For each module
57
- * alt Not @decaf-ts/cli
58
- * CliWrapper->>CliWrapper: load(module, cwd)
59
- * CliWrapper-->>CliWrapper: name
60
- * CliWrapper->>CliWrapper: Check if command exists
61
- * alt Command doesn't exist
62
- * CliWrapper->>Command: command(name).addCommand(modules[name])
63
- * end
64
- * end
65
- * end
66
- * CliWrapper->>Console: Log loaded modules
67
- */
68
- private boot;
69
- /**
70
- * @description Recursively searches for CLI module files in the directory structure
71
- * @summary Crawls the basePath up to the specified number of folder levels to find files named according to CLI_FILE_NAME
72
- *
73
- * @param {string} basePath The absolute base path to start searching in
74
- * @param {number} [levels=2] The maximum number of directory levels to crawl
75
- * @return {string[]} An array of file paths to CLI modules
76
- *
77
- * @private
78
- */
79
- private crawl;
80
- /**
81
- * @description Executes the CLI with the provided arguments
82
- * @summary Boots the CLI by loading all modules, then parses and executes the command specified in the arguments
83
- *
84
- * @param {string[]} [args=process.argv] Command line arguments to parse and execute
85
- * @return {Promise<void>} A promise that resolves when the command execution is complete
86
- *
87
- * @mermaid
88
- * sequenceDiagram
89
- * participant Client
90
- * participant CliWrapper
91
- * participant Command
92
- *
93
- * Client->>CliWrapper: run(args)
94
- * CliWrapper->>CliWrapper: boot()
95
- * Note over CliWrapper: Loads all modules
96
- * CliWrapper->>Command: parseAsync(args)
97
- * Command-->>CliWrapper: result
98
- * CliWrapper-->>Client: result
99
- */
100
- run(args?: string[]): Promise<void>;
101
- }
@@ -1,182 +0,0 @@
1
- import fs from "fs";
2
- import path from "path";
3
- import { MCP_FILE_NAME } from "./constants";
4
- import { McpUtils } from "./utils";
5
- import { FastMCP } from "fastmcp";
6
- import { LoggedClass } from "@decaf-ts/logging";
7
- import { VERSION } from "./metadata";
8
- /**
9
- * @description Utility class to handle CLI functionality from all Decaf modules
10
- * @summary This class provides a wrapper around Commander.js to handle CLI commands from different Decaf modules.
11
- * It crawls the filesystem to find CLI modules, loads them, and registers their commands.
12
- *
13
- * @param {string} [basePath] The base path to look for modules in. Defaults to `./`
14
- * @param {number} [crawlLevels] Number of folder levels to crawl to find modules from the basePath. Defaults to 4
15
- *
16
- * @example
17
- * // Create a new CLI wrapper and run it with custom options
18
- * const cli = new CliWrapper('./src', 2);
19
- * cli.run(process.argv).then(() => {
20
- * console.log('CLI commands executed successfully');
21
- * });
22
- *
23
- * @class McpWrapper
24
- */
25
- export class McpWrapper extends LoggedClass {
26
- constructor(basePath = "./", crawlLevels = 4) {
27
- super();
28
- this.basePath = basePath;
29
- this.crawlLevels = crawlLevels;
30
- this.modules = {};
31
- this.rootPath = path.resolve(__dirname, "..");
32
- }
33
- /**
34
- * @description Retrieves and initializes the Commander Command object
35
- * @summary Lazy-loads the Command object, initializing it with the package name, description, and version
36
- * @return {FastMCP} The initialized Command object
37
- * @private
38
- */
39
- get mcp() {
40
- if (!this._mcp) {
41
- this._mcp = new FastMCP({
42
- name: "decaf-ts MCP server",
43
- instructions: "",
44
- version: VERSION,
45
- });
46
- }
47
- return this._mcp;
48
- }
49
- /**
50
- * @description Loads and registers an mcp extension module from a file
51
- * @summary Dynamically imports an mcp extension module from the specified file path, initializes it, and registers it in the modules collection
52
- *
53
- */
54
- async load(server, filePath) {
55
- const log = this.log.for(this.load);
56
- let pkg, version, enrich;
57
- try {
58
- const res = await McpUtils.loadFromFile(filePath);
59
- pkg = res.PACKAGE_NAME;
60
- version = res.VERSION;
61
- enrich = res.enrich;
62
- }
63
- catch (e) {
64
- throw new Error(e.message || e);
65
- }
66
- try {
67
- log.info(`Enriching mcp server with module ${pkg} v${version}`);
68
- const result = enrich(server);
69
- server = result instanceof Promise ? await result : result;
70
- }
71
- catch (e) {
72
- throw new Error(`failed to enrich mcp with module ${pkg || "unnamed"} under ${filePath}: ${e instanceof Error ? e.message : e}`);
73
- }
74
- return {
75
- mcp: server,
76
- package: pkg,
77
- version: version,
78
- };
79
- }
80
- /**
81
- * @description Finds and loads all CLI modules in the basePath
82
- * @summary Uses the crawl method to find all CLI modules in the specified base path,
83
- * then loads and registers each module as a subcommand
84
- *
85
- * @return {Promise<void>} A promise that resolves when all modules are loaded
86
- *
87
- * @private
88
- * @mermaid
89
- * sequenceDiagram
90
- * participant CliWrapper
91
- * participant Filesystem
92
- * participant Module
93
- *
94
- * CliWrapper->>Filesystem: Join basePath with cwd
95
- * CliWrapper->>CliWrapper: crawl(basePath, crawlLevels)
96
- * CliWrapper-->>CliWrapper: modules[]
97
- * loop For each module
98
- * alt Not @decaf-ts/cli
99
- * CliWrapper->>CliWrapper: load(module, cwd)
100
- * CliWrapper-->>CliWrapper: name
101
- * CliWrapper->>CliWrapper: Check if command exists
102
- * alt Command doesn't exist
103
- * CliWrapper->>Command: command(name).addCommand(modules[name])
104
- * end
105
- * end
106
- * end
107
- * CliWrapper->>Console: Log loaded modules
108
- */
109
- async boot() {
110
- const log = this.log.for(this.boot);
111
- let server = this.mcp;
112
- // discover modules by crawling basePath
113
- const moduleFiles = this.crawl(path.resolve(this.basePath), this.crawlLevels);
114
- for (const moduleFile of moduleFiles) {
115
- if (moduleFile.includes("@decaf-ts/mcp")) {
116
- continue;
117
- }
118
- try {
119
- const res = await this.load(server, moduleFile);
120
- server = res.mcp;
121
- this.modules[res.package] = moduleFile;
122
- }
123
- catch (e) {
124
- log.error(`Failed to load MCP configs for ${moduleFile}: ${e instanceof Error ? e.message : e}`);
125
- }
126
- }
127
- console.log(`loaded modules:\n${Object.keys(this.modules)
128
- .map((k) => `- ${k}`)
129
- .join("\n")}`);
130
- return server;
131
- }
132
- /**
133
- * @description Recursively searches for CLI module files in the directory structure
134
- * @summary Crawls the basePath up to the specified number of folder levels to find files named according to CLI_FILE_NAME
135
- *
136
- * @param {string} basePath The absolute base path to start searching in
137
- * @param {number} [levels=2] The maximum number of directory levels to crawl
138
- * @return {string[]} An array of file paths to CLI modules
139
- *
140
- * @private
141
- */
142
- crawl(basePath, levels = 2) {
143
- if (levels <= 0)
144
- return [];
145
- return fs.readdirSync(basePath).reduce((accum, file) => {
146
- file = path.join(basePath, file);
147
- if (fs.statSync(file).isDirectory()) {
148
- accum.push(...this.crawl(file, levels - 1));
149
- }
150
- else if (file.match(new RegExp(`${MCP_FILE_NAME}.[cm]?js$`, "gm"))) {
151
- accum.push(file);
152
- }
153
- return accum;
154
- }, []);
155
- }
156
- /**
157
- * @description Executes the CLI with the provided arguments
158
- * @summary Boots the CLI by loading all modules, then parses and executes the command specified in the arguments
159
- *
160
- * @param {string[]} [args=process.argv] Command line arguments to parse and execute
161
- * @return {Promise<void>} A promise that resolves when the command execution is complete
162
- *
163
- * @mermaid
164
- * sequenceDiagram
165
- * participant Client
166
- * participant CliWrapper
167
- * participant Command
168
- *
169
- * Client->>CliWrapper: run(args)
170
- * CliWrapper->>CliWrapper: boot()
171
- * Note over CliWrapper: Loads all modules
172
- * CliWrapper->>Command: parseAsync(args)
173
- * Command-->>CliWrapper: result
174
- * CliWrapper-->>Client: result
175
- */
176
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
177
- async run(args = process.argv) {
178
- const server = await this.boot();
179
- await server.start({ transportType: "stdio" });
180
- }
181
- }
182
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWNwV3JhcHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9NY3BXcmFwcGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQztBQUNwQixPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7QUFDeEIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM1QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ25DLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDbEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFckM7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxNQUFNLE9BQU8sVUFBVyxTQUFRLFdBQVc7SUFLekMsWUFDVSxXQUFtQixJQUFJLEVBQ3ZCLGNBQWMsQ0FBQztRQUV2QixLQUFLLEVBQUUsQ0FBQztRQUhBLGFBQVEsR0FBUixRQUFRLENBQWU7UUFDdkIsZ0JBQVcsR0FBWCxXQUFXLENBQUk7UUFMakIsWUFBTyxHQUEyQixFQUFFLENBQUM7UUFRM0MsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxJQUFZLEdBQUc7UUFDYixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLE9BQU8sQ0FBQztnQkFDdEIsSUFBSSxFQUFFLHFCQUFxQjtnQkFDM0IsWUFBWSxFQUFFLEVBQUU7Z0JBQ2hCLE9BQU8sRUFBRSxPQUFjO2FBQ3hCLENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FB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Q2pDLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ2pELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBNQ1BfRklMRV9OQU1FIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBNY3BVdGlscyB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBGYXN0TUNQIH0gZnJvbSBcImZhc3RtY3BcIjtcbmltcG9ydCB7IExvZ2dlZENsYXNzIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBWRVJTSU9OIH0gZnJvbSBcIi4vbWV0YWRhdGFcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVXRpbGl0eSBjbGFzcyB0byBoYW5kbGUgQ0xJIGZ1bmN0aW9uYWxpdHkgZnJvbSBhbGwgRGVjYWYgbW9kdWxlc1xuICogQHN1bW1hcnkgVGhpcyBjbGFzcyBwcm92aWRlcyBhIHdyYXBwZXIgYXJvdW5kIENvbW1hbmRlci5qcyB0byBoYW5kbGUgQ0xJIGNvbW1hbmRzIGZyb20gZGlmZmVyZW50IERlY2FmIG1vZHVsZXMuXG4gKiBJdCBjcmF3bHMgdGhlIGZpbGVzeXN0ZW0gdG8gZmluZCBDTEkgbW9kdWxlcywgbG9hZHMgdGhlbSwgYW5kIHJlZ2lzdGVycyB0aGVpciBjb21tYW5kcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW2Jhc2VQYXRoXSBUaGUgYmFzZSBwYXRoIHRvIGxvb2sgZm9yIG1vZHVsZXMgaW4uIERlZmF1bHRzIHRvIGAuL2BcbiAqIEBwYXJhbSB7bnVtYmVyfSBbY3Jhd2xMZXZlbHNdIE51bWJlciBvZiBmb2xkZXIgbGV2ZWxzIHRvIGNyYXdsIHRvIGZpbmQgbW9kdWxlcyBmcm9tIHRoZSBiYXNlUGF0aC4gRGVmYXVsdHMgdG8gNFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgYSBuZXcgQ0xJIHdyYXBwZXIgYW5kIHJ1biBpdCB3aXRoIGN1c3RvbSBvcHRpb25zXG4gKiBjb25zdCBjbGkgPSBuZXcgQ2xpV3JhcHBlcignLi9zcmMnLCAyKTtcbiAqIGNsaS5ydW4ocHJvY2Vzcy5hcmd2KS50aGVuKCgpID0+IHtcbiAqICAgY29uc29sZS5sb2coJ0NMSSBjb21tYW5kcyBleGVjdXRlZCBzdWNjZXNzZnVsbHknKTtcbiAqIH0pO1xuICpcbiAqIEBjbGFzcyBNY3BXcmFwcGVyXG4gKi9cbmV4cG9ydCBjbGFzcyBNY3BXcmFwcGVyIGV4dGVuZHMgTG9nZ2VkQ2xhc3Mge1xuICBwcml2YXRlIF9tY3A/OiBGYXN0TUNQO1xuICBwcml2YXRlIG1vZHVsZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgcHJpdmF0ZSByZWFkb25seSByb290UGF0aDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYmFzZVBhdGg6IHN0cmluZyA9IFwiLi9cIixcbiAgICBwcml2YXRlIGNyYXdsTGV2ZWxzID0gNFxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucm9vdFBhdGggPSBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCBcIi4uXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYW5kIGluaXRpYWxpemVzIHRoZSBDb21tYW5kZXIgQ29tbWFuZCBvYmplY3RcbiAgICogQHN1bW1hcnkgTGF6eS1sb2FkcyB0aGUgQ29tbWFuZCBvYmplY3QsIGluaXRpYWxpemluZyBpdCB3aXRoIHRoZSBwYWNrYWdlIG5hbWUsIGRlc2NyaXB0aW9uLCBhbmQgdmVyc2lvblxuICAgKiBAcmV0dXJuIHtGYXN0TUNQfSBUaGUgaW5pdGlhbGl6ZWQgQ29tbWFuZCBvYmplY3RcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgZ2V0IG1jcCgpIHtcbiAgICBpZiAoIXRoaXMuX21jcCkge1xuICAgICAgdGhpcy5fbWNwID0gbmV3IEZhc3RNQ1Aoe1xuICAgICAgICBuYW1lOiBcImRlY2FmLXRzIE1DUCBzZXJ2ZXJcIixcbiAgICAgICAgaW5zdHJ1Y3Rpb25zOiBcIlwiLFxuICAgICAgICB2ZXJzaW9uOiBWRVJTSU9OIGFzIGFueSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fbWNwO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2FkcyBhbmQgcmVnaXN0ZXJzIGFuIG1jcCBleHRlbnNpb24gbW9kdWxlIGZyb20gYSBmaWxlXG4gICAqIEBzdW1tYXJ5IER5bmFtaWNhbGx5IGltcG9ydHMgYW4gbWNwIGV4dGVuc2lvbiBtb2R1bGUgZnJvbSB0aGUgc3BlY2lmaWVkIGZpbGUgcGF0aCwgaW5pdGlhbGl6ZXMgaXQsIGFuZCByZWdpc3RlcnMgaXQgaW4gdGhlIG1vZHVsZXMgY29sbGVjdGlvblxuICAgKlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsb2FkKFxuICAgIHNlcnZlcjogRmFzdE1DUCxcbiAgICBmaWxlUGF0aDogc3RyaW5nXG4gICk6IFByb21pc2U8eyBtY3A6IEZhc3RNQ1A7IHBhY2thZ2U6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nIH0+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5sb2FkKTtcblxuICAgIGxldCBwa2c6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nLCBlbnJpY2g6IGFueTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgTWNwVXRpbHMubG9hZEZyb21GaWxlKGZpbGVQYXRoKTtcbiAgICAgIHBrZyA9IHJlcy5QQUNLQUdFX05BTUU7XG4gICAgICB2ZXJzaW9uID0gcmVzLlZFUlNJT047XG4gICAgICBlbnJpY2ggPSByZXMuZW5yaWNoO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigoZSBhcyBhbnkpLm1lc3NhZ2UgfHwgKGUgYXMgYW55KSk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBsb2cuaW5mbyhgRW5yaWNoaW5nIG1jcCBzZXJ2ZXIgd2l0aCBtb2R1bGUgJHtwa2d9IHYke3ZlcnNpb259YCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBlbnJpY2goc2VydmVyKTtcbiAgICAgIHNlcnZlciA9IHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UgPyBhd2FpdCByZXN1bHQgOiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgZmFpbGVkIHRvIGVucmljaCBtY3Agd2l0aCBtb2R1bGUgJHtwa2cgfHwgXCJ1bm5hbWVkXCJ9IHVuZGVyICR7ZmlsZVBhdGh9OiAke2UgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IGV9YFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG1jcDogc2VydmVyLFxuICAgICAgcGFja2FnZTogcGtnLFxuICAgICAgdmVyc2lvbjogdmVyc2lvbixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGaW5kcyBhbmQgbG9hZHMgYWxsIENMSSBtb2R1bGVzIGluIHRoZSBiYXNlUGF0aFxuICAgKiBAc3VtbWFyeSBVc2VzIHRoZSBjcmF3bCBtZXRob2QgdG8gZmluZCBhbGwgQ0xJIG1vZHVsZXMgaW4gdGhlIHNwZWNpZmllZCBiYXNlIHBhdGgsXG4gICAqIHRoZW4gbG9hZHMgYW5kIHJlZ2lzdGVycyBlYWNoIG1vZHVsZSBhcyBhIHN1YmNvbW1hbmRcbiAgICpcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgbW9kdWxlcyBhcmUgbG9hZGVkXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaVdyYXBwZXJcbiAgICogICBwYXJ0aWNpcGFudCBGaWxlc3lzdGVtXG4gICAqICAgcGFydGljaXBhbnQgTW9kdWxlXG4gICAqXG4gICAqICAgQ2xpV3JhcHBlci0+PkZpbGVzeXN0ZW06IEpvaW4gYmFzZVBhdGggd2l0aCBjd2RcbiAgICogICBDbGlXcmFwcGVyLT4+Q2xpV3JhcHBlcjogY3Jhd2woYmFzZVBhdGgsIGNyYXdsTGV2ZWxzKVxuICAgKiAgIENsaVdyYXBwZXItLT4+Q2xpV3JhcHBlcjogbW9kdWxlc1tdXG4gICAqICAgbG9vcCBGb3IgZWFjaCBtb2R1bGVcbiAgICogICAgIGFsdCBOb3QgQGRlY2FmLXRzL2NsaVxuICAgKiAgICAgICBDbGlXcmFwcGVyLT4+Q2xpV3JhcHBlcjogbG9hZChtb2R1bGUsIGN3ZClcbiAgICogICAgICAgQ2xpV3JhcHBlci0tPj5DbGlXcmFwcGVyOiBuYW1lXG4gICAqICAgICAgIENsaVdyYXBwZXItPj5DbGlXcmFwcGVyOiBDaGVjayBpZiBjb21tYW5kIGV4aXN0c1xuICAgKiAgICAgICBhbHQgQ29tbWFuZCBkb2Vzbid0IGV4aXN0XG4gICAqICAgICAgICAgQ2xpV3JhcHBlci0+PkNvbW1hbmQ6IGNvbW1hbmQobmFtZSkuYWRkQ29tbWFuZChtb2R1bGVzW25hbWVdKVxuICAgKiAgICAgICBlbmRcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKiAgIENsaVdyYXBwZXItPj5Db25zb2xlOiBMb2cgbG9hZGVkIG1vZHVsZXNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYm9vdCgpIHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5ib290KTtcbiAgICBsZXQgc2VydmVyID0gdGhpcy5tY3A7XG4gICAgLy8gZGlzY292ZXIgbW9kdWxlcyBieSBjcmF3bGluZyBiYXNlUGF0aFxuICAgIGNvbnN0IG1vZHVsZUZpbGVzID0gdGhpcy5jcmF3bChcbiAgICAgIHBhdGgucmVzb2x2ZSh0aGlzLmJhc2VQYXRoKSxcbiAgICAgIHRoaXMuY3Jhd2xMZXZlbHNcbiAgICApO1xuICAgIGZvciAoY29uc3QgbW9kdWxlRmlsZSBvZiBtb2R1bGVGaWxlcykge1xuICAgICAgaWYgKG1vZHVsZUZpbGUuaW5jbHVkZXMoXCJAZGVjYWYtdHMvbWNwXCIpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5sb2FkKHNlcnZlciwgbW9kdWxlRmlsZSk7XG4gICAgICAgIHNlcnZlciA9IHJlcy5tY3A7XG4gICAgICAgIHRoaXMubW9kdWxlc1tyZXMucGFja2FnZV0gPSBtb2R1bGVGaWxlO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBsb2cuZXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBsb2FkIE1DUCBjb25maWdzIGZvciAke21vZHVsZUZpbGV9OiAke2UgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IGV9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGBsb2FkZWQgbW9kdWxlczpcXG4ke09iamVjdC5rZXlzKHRoaXMubW9kdWxlcylcbiAgICAgICAgLm1hcCgoaykgPT4gYC0gJHtrfWApXG4gICAgICAgIC5qb2luKFwiXFxuXCIpfWBcbiAgICApO1xuICAgIHJldHVybiBzZXJ2ZXI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlY3Vyc2l2ZWx5IHNlYXJjaGVzIGZvciBDTEkgbW9kdWxlIGZpbGVzIGluIHRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlXG4gICAqIEBzdW1tYXJ5IENyYXdscyB0aGUgYmFzZVBhdGggdXAgdG8gdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZm9sZGVyIGxldmVscyB0byBmaW5kIGZpbGVzIG5hbWVkIGFjY29yZGluZyB0byBDTElfRklMRV9OQU1FXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlUGF0aCBUaGUgYWJzb2x1dGUgYmFzZSBwYXRoIHRvIHN0YXJ0IHNlYXJjaGluZyBpblxuICAgKiBAcGFyYW0ge251bWJlcn0gW2xldmVscz0yXSBUaGUgbWF4aW11bSBudW1iZXIgb2YgZGlyZWN0b3J5IGxldmVscyB0byBjcmF3bFxuICAgKiBAcmV0dXJuIHtzdHJpbmdbXX0gQW4gYXJyYXkgb2YgZmlsZSBwYXRocyB0byBDTEkgbW9kdWxlc1xuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBjcmF3bChiYXNlUGF0aDogc3RyaW5nLCBsZXZlbHM6IG51bWJlciA9IDIpIHtcbiAgICBpZiAobGV2ZWxzIDw9IDApIHJldHVybiBbXTtcbiAgICByZXR1cm4gZnMucmVhZGRpclN5bmMoYmFzZVBhdGgpLnJlZHVjZSgoYWNjdW06IHN0cmluZ1tdLCBmaWxlKSA9PiB7XG4gICAgICBmaWxlID0gcGF0aC5qb2luKGJhc2VQYXRoLCBmaWxlKTtcbiAgICAgIGlmIChmcy5zdGF0U3luYyhmaWxlKS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIGFjY3VtLnB1c2goLi4udGhpcy5jcmF3bChmaWxlLCBsZXZlbHMgLSAxKSk7XG4gICAgICB9IGVsc2UgaWYgKGZpbGUubWF0Y2gobmV3IFJlZ0V4cChgJHtNQ1BfRklMRV9OQU1FfS5bY21dP2pzJGAsIFwiZ21cIikpKSB7XG4gICAgICAgIGFjY3VtLnB1c2goZmlsZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjdW07XG4gICAgfSwgW10pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyB0aGUgQ0xJIHdpdGggdGhlIHByb3ZpZGVkIGFyZ3VtZW50c1xuICAgKiBAc3VtbWFyeSBCb290cyB0aGUgQ0xJIGJ5IGxvYWRpbmcgYWxsIG1vZHVsZXMsIHRoZW4gcGFyc2VzIGFuZCBleGVjdXRlcyB0aGUgY29tbWFuZCBzcGVjaWZpZWQgaW4gdGhlIGFyZ3VtZW50c1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbYXJncz1wcm9jZXNzLmFyZ3ZdIENvbW1hbmQgbGluZSBhcmd1bWVudHMgdG8gcGFyc2UgYW5kIGV4ZWN1dGVcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgY29tbWFuZCBleGVjdXRpb24gaXMgY29tcGxldGVcbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgQ2xpV3JhcHBlclxuICAgKiAgIHBhcnRpY2lwYW50IENvbW1hbmRcbiAgICpcbiAgICogICBDbGllbnQtPj5DbGlXcmFwcGVyOiBydW4oYXJncylcbiAgICogICBDbGlXcmFwcGVyLT4+Q2xpV3JhcHBlcjogYm9vdCgpXG4gICAqICAgTm90ZSBvdmVyIENsaVdyYXBwZXI6IExvYWRzIGFsbCBtb2R1bGVzXG4gICAqICAgQ2xpV3JhcHBlci0+PkNvbW1hbmQ6IHBhcnNlQXN5bmMoYXJncylcbiAgICogICBDb21tYW5kLS0+PkNsaVdyYXBwZXI6IHJlc3VsdFxuICAgKiAgIENsaVdyYXBwZXItLT4+Q2xpZW50OiByZXN1bHRcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgYXN5bmMgcnVuKGFyZ3M6IHN0cmluZ1tdID0gcHJvY2Vzcy5hcmd2KSB7XG4gICAgY29uc3Qgc2VydmVyID0gYXdhaXQgdGhpcy5ib290KCk7XG4gICAgYXdhaXQgc2VydmVyLnN0YXJ0KHsgdHJhbnNwb3J0VHlwZTogXCJzdGRpb1wiIH0pO1xuICB9XG59XG4iXX0=