@decaf-ts/decorator-validation 1.7.3 → 1.7.5

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 (134) hide show
  1. package/LICENSE.md +21 -157
  2. package/dist/decorator-validation.cjs +461 -265
  3. package/dist/decorator-validation.esm.cjs +459 -265
  4. package/lib/constants/errors.cjs +19 -0
  5. package/lib/constants/errors.d.ts +11 -0
  6. package/lib/constants/index.cjs +2 -1
  7. package/lib/constants/index.d.ts +1 -0
  8. package/lib/esm/constants/errors.d.ts +11 -0
  9. package/lib/esm/constants/errors.js +16 -0
  10. package/lib/esm/constants/index.d.ts +1 -0
  11. package/lib/esm/constants/index.js +3 -2
  12. package/lib/esm/index.d.ts +1 -1
  13. package/lib/esm/index.js +6 -6
  14. package/lib/esm/mcp/ModelContextProtocol.d.ts +31 -0
  15. package/lib/esm/mcp/ModelContextProtocol.js +66 -0
  16. package/lib/esm/mcp/mcp1.d.ts +0 -0
  17. package/lib/esm/mcp/mcp1.js +405 -0
  18. package/lib/esm/mcp/tools/createModel.tool.d.ts +0 -0
  19. package/lib/esm/mcp/tools/createModel.tool.js +67 -0
  20. package/lib/esm/mcp/tools/validateModel.tool.d.ts +0 -0
  21. package/lib/esm/mcp/tools/validateModel.tool.js +2 -0
  22. package/lib/esm/mcp/types.d.ts +3 -0
  23. package/lib/esm/mcp/types.js +2 -0
  24. package/lib/esm/model/Builder.d.ts +0 -0
  25. package/lib/esm/model/Builder.js +130 -0
  26. package/lib/esm/model/Model.d.ts +1 -0
  27. package/lib/esm/model/Model.js +19 -9
  28. package/lib/esm/model/construction.js +2 -2
  29. package/lib/esm/model/decorators.d.ts +10 -0
  30. package/lib/esm/model/decorators.js +16 -4
  31. package/lib/esm/model/index.js +9 -9
  32. package/lib/esm/model/utils.js +2 -2
  33. package/lib/esm/model/validation.js +16 -13
  34. package/lib/esm/utils/Decoration.js +2 -2
  35. package/lib/esm/utils/PathProxy.d.ts +43 -0
  36. package/lib/esm/utils/PathProxy.js +89 -0
  37. package/lib/esm/utils/constants.d.ts +1 -0
  38. package/lib/esm/utils/constants.js +2 -1
  39. package/lib/esm/utils/dates.js +3 -3
  40. package/lib/esm/utils/decorators.js +2 -2
  41. package/lib/esm/utils/index.d.ts +1 -0
  42. package/lib/esm/utils/index.js +11 -10
  43. package/lib/esm/utils/serialization.js +4 -4
  44. package/lib/esm/validation/Validation.d.ts +3 -0
  45. package/lib/esm/validation/Validation.js +14 -3
  46. package/lib/esm/validation/Validators/DateValidator.js +4 -4
  47. package/lib/esm/validation/Validators/DiffValidator.d.ts +4 -2
  48. package/lib/esm/validation/Validators/DiffValidator.js +8 -8
  49. package/lib/esm/validation/Validators/EmailValidator.js +4 -4
  50. package/lib/esm/validation/Validators/EqualsValidator.d.ts +4 -2
  51. package/lib/esm/validation/Validators/EqualsValidator.js +8 -8
  52. package/lib/esm/validation/Validators/GreaterThanOrEqualValidator.d.ts +4 -2
  53. package/lib/esm/validation/Validators/GreaterThanOrEqualValidator.js +9 -8
  54. package/lib/esm/validation/Validators/GreaterThanValidator.d.ts +4 -2
  55. package/lib/esm/validation/Validators/GreaterThanValidator.js +9 -8
  56. package/lib/esm/validation/Validators/LessThanOrEqualValidator.d.ts +4 -2
  57. package/lib/esm/validation/Validators/LessThanOrEqualValidator.js +9 -8
  58. package/lib/esm/validation/Validators/LessThanValidator.d.ts +4 -2
  59. package/lib/esm/validation/Validators/LessThanValidator.js +9 -8
  60. package/lib/esm/validation/Validators/ListValidator.js +4 -4
  61. package/lib/esm/validation/Validators/MaxLengthValidator.js +4 -4
  62. package/lib/esm/validation/Validators/MaxValidator.js +4 -4
  63. package/lib/esm/validation/Validators/MinLengthValidator.js +4 -4
  64. package/lib/esm/validation/Validators/MinValidator.js +4 -4
  65. package/lib/esm/validation/Validators/PasswordValidator.js +4 -4
  66. package/lib/esm/validation/Validators/PatternValidator.js +4 -4
  67. package/lib/esm/validation/Validators/RequiredValidator.js +4 -4
  68. package/lib/esm/validation/Validators/StepValidator.js +4 -4
  69. package/lib/esm/validation/Validators/TypeValidator.js +6 -6
  70. package/lib/esm/validation/Validators/URLValidator.js +4 -4
  71. package/lib/esm/validation/Validators/Validator.d.ts +3 -2
  72. package/lib/esm/validation/Validators/Validator.js +3 -3
  73. package/lib/esm/validation/Validators/ValidatorRegistry.js +2 -2
  74. package/lib/esm/validation/Validators/constants.d.ts +0 -13
  75. package/lib/esm/validation/Validators/constants.js +2 -15
  76. package/lib/esm/validation/Validators/decorators.js +3 -3
  77. package/lib/esm/validation/Validators/index.js +25 -25
  78. package/lib/esm/validation/Validators/utils.d.ts +0 -14
  79. package/lib/esm/validation/Validators/utils.js +69 -56
  80. package/lib/esm/validation/decorators.d.ts +26 -3
  81. package/lib/esm/validation/decorators.js +107 -58
  82. package/lib/esm/validation/index.js +5 -5
  83. package/lib/esm/validation/types.d.ts +11 -5
  84. package/lib/esm/validation/types.js +2 -2
  85. package/lib/index.cjs +1 -1
  86. package/lib/index.d.ts +1 -1
  87. package/lib/mcp/ModelContextProtocol.cjs +70 -0
  88. package/lib/mcp/ModelContextProtocol.d.ts +31 -0
  89. package/lib/mcp/mcp1.cjs +405 -0
  90. package/lib/mcp/mcp1.d.ts +0 -0
  91. package/lib/mcp/tools/createModel.tool.cjs +67 -0
  92. package/lib/mcp/tools/createModel.tool.d.ts +0 -0
  93. package/lib/mcp/tools/validateModel.tool.cjs +2 -0
  94. package/lib/mcp/tools/validateModel.tool.d.ts +0 -0
  95. package/lib/mcp/types.cjs +3 -0
  96. package/lib/mcp/types.d.ts +3 -0
  97. package/lib/model/Builder.cjs +130 -0
  98. package/lib/model/Builder.d.ts +0 -0
  99. package/lib/model/Model.cjs +12 -2
  100. package/lib/model/Model.d.ts +1 -0
  101. package/lib/model/decorators.cjs +14 -1
  102. package/lib/model/decorators.d.ts +10 -0
  103. package/lib/model/validation.cjs +8 -5
  104. package/lib/utils/PathProxy.cjs +93 -0
  105. package/lib/utils/PathProxy.d.ts +43 -0
  106. package/lib/utils/constants.cjs +2 -1
  107. package/lib/utils/constants.d.ts +1 -0
  108. package/lib/utils/index.cjs +2 -1
  109. package/lib/utils/index.d.ts +1 -0
  110. package/lib/validation/Validation.cjs +12 -1
  111. package/lib/validation/Validation.d.ts +3 -0
  112. package/lib/validation/Validators/DiffValidator.cjs +5 -5
  113. package/lib/validation/Validators/DiffValidator.d.ts +4 -2
  114. package/lib/validation/Validators/EqualsValidator.cjs +5 -5
  115. package/lib/validation/Validators/EqualsValidator.d.ts +4 -2
  116. package/lib/validation/Validators/GreaterThanOrEqualValidator.cjs +5 -4
  117. package/lib/validation/Validators/GreaterThanOrEqualValidator.d.ts +4 -2
  118. package/lib/validation/Validators/GreaterThanValidator.cjs +5 -4
  119. package/lib/validation/Validators/GreaterThanValidator.d.ts +4 -2
  120. package/lib/validation/Validators/LessThanOrEqualValidator.cjs +5 -4
  121. package/lib/validation/Validators/LessThanOrEqualValidator.d.ts +4 -2
  122. package/lib/validation/Validators/LessThanValidator.cjs +5 -4
  123. package/lib/validation/Validators/LessThanValidator.d.ts +4 -2
  124. package/lib/validation/Validators/Validator.cjs +1 -1
  125. package/lib/validation/Validators/Validator.d.ts +3 -2
  126. package/lib/validation/Validators/constants.cjs +2 -15
  127. package/lib/validation/Validators/constants.d.ts +0 -13
  128. package/lib/validation/Validators/utils.cjs +79 -67
  129. package/lib/validation/Validators/utils.d.ts +0 -14
  130. package/lib/validation/decorators.cjs +102 -52
  131. package/lib/validation/decorators.d.ts +26 -3
  132. package/lib/validation/types.cjs +1 -1
  133. package/lib/validation/types.d.ts +11 -5
  134. package/package.json +16 -5
@@ -0,0 +1,405 @@
1
+ "use strict";
2
+ // import { FastMCP } from "fastmcp";
3
+ // import { z } from "zod";
4
+ // import { version } from "../../package.json";
5
+ // import { ModelContextProtocol } from "./ModelContextProtocol";
6
+ // import { Model } from "../model";
7
+ // import {
8
+ // email,
9
+ // max,
10
+ // maxlength,
11
+ // min,
12
+ // minlength,
13
+ // pattern,
14
+ // required,
15
+ // } from "../validation";
16
+ // import { createModelTool } from "./tools/createModel.tool";
17
+ //
18
+ // const DecoratorValidatonMCP = ModelContextProtocol.builder
19
+ // .setName("decaf-validation-server")
20
+ // .setVersion(version)
21
+ // .addTool(createModelTool)
22
+ // .build();
23
+ //
24
+ // // Initialize FastMCP server
25
+ // const server = new FastMCP({
26
+ // name: "decaf-validation-server",
27
+ // // @ts-ignore
28
+ // version: version,
29
+ // });
30
+ //
31
+ // // Model registry for dynamic model management
32
+ // const modelRegistry = new Map<string, any>();
33
+ //
34
+ // // Tool: Validate a model instance
35
+ // server.addTool({
36
+ // name: "validate-model",
37
+ // description: "Validate a model instance against its decorators",
38
+ // parameters: z.object({
39
+ // modelName: z.string().describe("Name of the model class"),
40
+ // data: z.record(z.any()).describe("Data to validate"),
41
+ // options: z
42
+ // .object({
43
+ // partial: z.boolean().optional().describe("Allow partial validation"),
44
+ // })
45
+ // .optional(),
46
+ // }),
47
+ // execute: async (args) => {
48
+ // const { modelName, data, options } = args;
49
+ //
50
+ // const ModelClass = modelRegistry.get(modelName) || Model.get(modelName);
51
+ // if (!ModelClass) {
52
+ // throw new Error(`Model "${modelName}" not found`);
53
+ // }
54
+ //
55
+ // try {
56
+ // const instance = new ModelClass(data);
57
+ // const errors = instance.hasErrors();
58
+ //
59
+ // return {
60
+ // isValid: !errors,
61
+ // errors: errors || null,
62
+ // validatedData: errors ? null : instance.serialize(),
63
+ // };
64
+ // } catch (error) {
65
+ // return {
66
+ // isValid: false,
67
+ // errors: [{ message: error.message }],
68
+ // validatedData: null,
69
+ // };
70
+ // }
71
+ // },
72
+ // });
73
+ //
74
+ // // Tool: Get model schema information
75
+ // server.addTool({
76
+ // name: "get-model-schema",
77
+ // description: "Get the validation schema for a model",
78
+ // parameters: z.object({
79
+ // modelName: z.string().describe("Name of the model class"),
80
+ // }),
81
+ // execute: async (args) => {
82
+ // const { modelName } = args;
83
+ //
84
+ // const ModelClass = modelRegistry.get(modelName) || Model.get(modelName);
85
+ // if (!ModelClass) {
86
+ // throw new Error(`Model "${modelName}" not found`);
87
+ // }
88
+ //
89
+ // // Extract validation metadata
90
+ // const instance = new ModelClass();
91
+ // const metadata = Reflect.getMetadata("validation", instance) || {};
92
+ //
93
+ // return {
94
+ // modelName,
95
+ // properties: Object.keys(metadata).map((key) => ({
96
+ // name: key,
97
+ // validators: metadata[key] || [],
98
+ // })),
99
+ // capabilities: {
100
+ // serialization: !!instance.serialize,
101
+ // hashing: !!instance.hash,
102
+ // comparison: !!instance.equals,
103
+ // },
104
+ // };
105
+ // },
106
+ // });
107
+ //
108
+ // // Tool: Serialize model
109
+ // server.addTool({
110
+ // name: "serialize-model",
111
+ // description: "Serialize a model instance to string",
112
+ // parameters: z.object({
113
+ // modelName: z.string().describe("Name of the model class"),
114
+ // data: z.record(z.any()).describe("Model data to serialize"),
115
+ // format: z.enum(["json", "yaml"]).optional().default("json"),
116
+ // }),
117
+ // execute: async (args) => {
118
+ // const { modelName, data, format } = args;
119
+ //
120
+ // const ModelClass = modelRegistry.get(modelName) || Model.get(modelName);
121
+ // if (!ModelClass) {
122
+ // throw new Error(`Model "${modelName}" not found`);
123
+ // }
124
+ //
125
+ // const instance = new ModelClass(data);
126
+ // const errors = instance.hasErrors();
127
+ //
128
+ // if (errors) {
129
+ // throw new Error(
130
+ // `Cannot serialize invalid model: ${JSON.stringify(errors)}`
131
+ // );
132
+ // }
133
+ //
134
+ // return {
135
+ // serialized: instance.serialize(),
136
+ // format,
137
+ // modelName,
138
+ // };
139
+ // },
140
+ // });
141
+ //
142
+ // // Tool: Deserialize model
143
+ // server.addTool({
144
+ // name: "deserialize-model",
145
+ // description: "Deserialize a string to model instance",
146
+ // parameters: z.object({
147
+ // serializedData: z.string().describe("Serialized model data"),
148
+ // modelName: z
149
+ // .string()
150
+ // .optional()
151
+ // .describe("Expected model name for validation"),
152
+ // }),
153
+ // execute: async (args) => {
154
+ // const { serializedData, modelName } = args;
155
+ //
156
+ // try {
157
+ // const instance = Model.deserialize(serializedData);
158
+ //
159
+ // if (modelName && instance.constructor.name !== modelName) {
160
+ // throw new Error(
161
+ // `Expected model "${modelName}", got "${instance.constructor.name}"`
162
+ // );
163
+ // }
164
+ //
165
+ // return {
166
+ // modelName: instance.constructor.name,
167
+ // data: JSON.parse(instance.serialize()),
168
+ // isValid: !instance.hasErrors(),
169
+ // };
170
+ // } catch (error) {
171
+ // throw new Error(`Deserialization failed: ${error.message}`);
172
+ // }
173
+ // },
174
+ // });
175
+ //
176
+ // // Tool: Compare models
177
+ // server.addTool({
178
+ // name: "compare-models",
179
+ // description: "Compare two model instances for equality",
180
+ // parameters: z.object({
181
+ // modelName: z.string().describe("Name of the model class"),
182
+ // data1: z.record(z.any()).describe("First model data"),
183
+ // data2: z.record(z.any()).describe("Second model data"),
184
+ // excludeFields: z
185
+ // .array(z.string())
186
+ // .optional()
187
+ // .describe("Fields to exclude from comparison"),
188
+ // }),
189
+ // execute: async (args) => {
190
+ // const { modelName, data1, data2, excludeFields } = args;
191
+ //
192
+ // const ModelClass = modelRegistry.get(modelName) || Model.get(modelName);
193
+ // if (!ModelClass) {
194
+ // throw new Error(`Model "${modelName}" not found`);
195
+ // }
196
+ //
197
+ // const instance1 = new ModelClass(data1);
198
+ // const instance2 = new ModelClass(data2);
199
+ //
200
+ // const isEqual = excludeFields
201
+ // ? instance1.equals(instance2, ...excludeFields)
202
+ // : instance1.equals(instance2);
203
+ //
204
+ // return {
205
+ // isEqual,
206
+ // hash1: instance1.hash(),
207
+ // hash2: instance2.hash(),
208
+ // differences: isEqual ? null : await findDifferences(instance1, instance2),
209
+ // };
210
+ // },
211
+ // });
212
+ //
213
+ // // Tool: List available decorators
214
+ // server.addTool({
215
+ // name: "list-decorators",
216
+ // description: "List all available validation decorators",
217
+ // parameters: z.object({
218
+ // category: z
219
+ // .enum(["basic", "type-specific", "comparison", "all"])
220
+ // .optional()
221
+ // .default("all"),
222
+ // }),
223
+ // execute: async (args) => {
224
+ // const { category } = args;
225
+ //
226
+ // const decorators = {
227
+ // basic: [
228
+ // {
229
+ // name: "required",
230
+ // description: "Marks field as required",
231
+ // args: ["message?"],
232
+ // },
233
+ // {
234
+ // name: "min",
235
+ // description: "Minimum value validation",
236
+ // args: ["value", "message?"],
237
+ // },
238
+ // {
239
+ // name: "max",
240
+ // description: "Maximum value validation",
241
+ // args: ["value", "message?"],
242
+ // },
243
+ // {
244
+ // name: "minlength",
245
+ // description: "Minimum length validation",
246
+ // args: ["length", "message?"],
247
+ // },
248
+ // {
249
+ // name: "maxlength",
250
+ // description: "Maximum length validation",
251
+ // args: ["length", "message?"],
252
+ // },
253
+ // {
254
+ // name: "pattern",
255
+ // description: "Regex pattern validation",
256
+ // args: ["pattern", "message?"],
257
+ // },
258
+ // {
259
+ // name: "step",
260
+ // description: "Step value validation",
261
+ // args: ["step", "message?"],
262
+ // },
263
+ // ],
264
+ // "type-specific": [
265
+ // {
266
+ // name: "email",
267
+ // description: "Email format validation",
268
+ // args: ["message?"],
269
+ // },
270
+ // {
271
+ // name: "url",
272
+ // description: "URL format validation",
273
+ // args: ["message?"],
274
+ // },
275
+ // {
276
+ // name: "date",
277
+ // description: "Date format validation",
278
+ // args: ["format?", "message?"],
279
+ // },
280
+ // {
281
+ // name: "password",
282
+ // description: "Password strength validation",
283
+ // args: ["message?"],
284
+ // },
285
+ // {
286
+ // name: "type",
287
+ // description: "Type validation",
288
+ // args: ["type", "message?"],
289
+ // },
290
+ // {
291
+ // name: "list",
292
+ // description: "Array validation",
293
+ // args: ["itemType", "message?"],
294
+ // },
295
+ // {
296
+ // name: "set",
297
+ // description: "Set validation",
298
+ // args: ["itemType", "message?"],
299
+ // },
300
+ // ],
301
+ // comparison: [
302
+ // {
303
+ // name: "eq",
304
+ // description: "Equal to another field",
305
+ // args: ["fieldName", "message?"],
306
+ // },
307
+ // {
308
+ // name: "diff",
309
+ // description: "Different from another field",
310
+ // args: ["fieldName", "message?"],
311
+ // },
312
+ // {
313
+ // name: "lt",
314
+ // description: "Less than another field",
315
+ // args: ["fieldName", "message?"],
316
+ // },
317
+ // {
318
+ // name: "lte",
319
+ // description: "Less than or equal to another field",
320
+ // args: ["fieldName", "message?"],
321
+ // },
322
+ // {
323
+ // name: "gt",
324
+ // description: "Greater than another field",
325
+ // args: ["fieldName", "message?"],
326
+ // },
327
+ // {
328
+ // name: "gte",
329
+ // description: "Greater than or equal to another field",
330
+ // args: ["fieldName", "message?"],
331
+ // },
332
+ // ],
333
+ // };
334
+ //
335
+ // if (category === "all") {
336
+ // return {
337
+ // categories: decorators,
338
+ // total: Object.values(decorators).reduce(
339
+ // (sum, arr) => sum + arr.length,
340
+ // 0
341
+ // ),
342
+ // };
343
+ // }
344
+ //
345
+ // return {
346
+ // category,
347
+ // decorators: decorators[category] || [],
348
+ // count: decorators[category]?.length || 0,
349
+ // };
350
+ // },
351
+ // });
352
+ //
353
+ // // Utility function to get decorator function by name
354
+ // function getDecoratorFunction(name: string): Function | null {
355
+ // const decoratorMap = {
356
+ // required,
357
+ // email,
358
+ // min,
359
+ // max,
360
+ // minlength,
361
+ // maxlength,
362
+ // pattern,
363
+ // url,
364
+ // date,
365
+ // password,
366
+ // list,
367
+ // set,
368
+ // eq,
369
+ // diff,
370
+ // lt,
371
+ // lte,
372
+ // gt,
373
+ // gte,
374
+ // type,
375
+ // step,
376
+ // };
377
+ // return decoratorMap[name] || null;
378
+ // }
379
+ //
380
+ // // Utility function to find differences between models
381
+ // async function findDifferences(instance1: any, instance2: any): Promise<any[]> {
382
+ // const differences = [];
383
+ // const serialized1 = JSON.parse(instance1.serialize());
384
+ // const serialized2 = JSON.parse(instance2.serialize());
385
+ //
386
+ // for (const key in serialized1) {
387
+ // if (serialized1[key] !== serialized2[key]) {
388
+ // differences.push({
389
+ // field: key,
390
+ // value1: serialized1[key],
391
+ // value2: serialized2[key],
392
+ // });
393
+ // }
394
+ // }
395
+ //
396
+ // return differences;
397
+ // }
398
+ //
399
+ // // Start the server
400
+ // server.start({
401
+ // transportType: "stdio",
402
+ // });
403
+ //
404
+ // export { server };
405
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWNwMS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tY3AvbWNwMS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEscUNBQXFDO0FBQ3JDLDJCQUEyQjtBQUMzQixnREFBZ0Q7QUFDaEQsaUVBQWlFO0FBQ2pFLG9DQUFvQztBQUNwQyxXQUFXO0FBQ1gsV0FBVztBQUNYLFNBQVM7QUFDVCxlQUFlO0FBQ2YsU0FBUztBQUNULGVBQWU7QUFDZixhQUFhO0FBQ2IsY0FBYztBQUNkLDBCQUEwQjtBQUMxQiw4REFBOEQ7QUFDOUQsRUFBRTtBQUNGLDZEQUE2RDtBQUM3RCx3Q0FBd0M7QUFDeEMseUJBQXlCO0FBQ3pCLDhCQUE4QjtBQUM5QixjQUFjO0FBQ2QsRUFBRTtBQUNGLCtCQUErQjtBQUMvQiwrQkFBK0I7QUFDL0IscUNBQXFDO0FBQ3JDLGtCQUFrQjtBQUNsQixzQkFBc0I7QUFDdEIsTUFBTTtBQUNOLEVBQUU7QUFDRixpREFBaUQ7QUFDakQsZ0RBQWdEO0FBQ2hELEVBQUU7QUFDRixxQ0FBcUM7QUFDckMsbUJBQW1CO0FBQ25CLDRCQUE0QjtBQUM1QixxRUFBcUU7QUFDckUsMkJBQTJCO0FBQzNCLGlFQUFpRTtBQUNqRSw0REFBNEQ7QUFDNUQsaUJBQWlCO0FBQ2pCLGtCQUFrQjtBQUNsQixnRkFBZ0Y7QUFDaEYsV0FBVztBQUNYLHFCQUFxQjtBQUNyQixRQUFRO0FBQ1IsK0JBQStCO0FBQy9CLGlEQUFpRDtBQUNqRCxFQUFFO0FBQ0YsK0VBQStFO0FBQy9FLHlCQUF5QjtBQUN6QiwyREFBMkQ7QUFDM0QsUUFBUTtBQUNSLEVBQUU7QUFDRixZQUFZO0FBQ1osK0NBQStDO0FBQy9DLDZDQUE2QztBQUM3QyxFQUFFO0FBQ0YsaUJBQWlCO0FBQ2pCLDRCQUE0QjtBQUM1QixrQ0FBa0M7QUFDbEMsK0RBQStEO0FBQy9ELFdBQVc7QUFDWCx3QkFBd0I7QUFDeEIsaUJBQWlCO0FBQ2pCLDBCQUEwQjtBQUMxQixnREFBZ0Q7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VixXQUFXO0FBQ1gsWUFBWTtBQUNaLFlBQVk7QUFDWixPQUFPO0FBQ1AsdUNBQXVDO0FBQ3ZDLElBQUk7QUFDSixFQUFFO0FBQ0YseURBQXlEO0FBQ3pELG1GQUFtRjtBQUNuRiw0QkFBNEI7QUFDNUIsMkRBQTJEO0FBQzNELDJEQUEyRDtBQUMzRCxFQUFFO0FBQ0YscUNBQXFDO0FBQ3JDLG1EQUFtRDtBQUNuRCwyQkFBMkI7QUFDM0Isc0JBQXNCO0FBQ3RCLG9DQUFvQztBQUNwQyxvQ0FBb0M7QUFDcEMsWUFBWTtBQUNaLFFBQVE7QUFDUixNQUFNO0FBQ04sRUFBRTtBQUNGLHdCQUF3QjtBQUN4QixJQUFJO0FBQ0osRUFBRTtBQUNGLHNCQUFzQjtBQUN0QixpQkFBaUI7QUFDakIsNEJBQTRCO0FBQzVCLE1BQU07QUFDTixFQUFFO0FBQ0YscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gaW1wb3J0IHsgRmFzdE1DUCB9IGZyb20gXCJmYXN0bWNwXCI7XG4vLyBpbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuLy8gaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gXCIuLi8uLi9wYWNrYWdlLmpzb25cIjtcbi8vIGltcG9ydCB7IE1vZGVsQ29udGV4dFByb3RvY29sIH0gZnJvbSBcIi4vTW9kZWxDb250ZXh0UHJvdG9jb2xcIjtcbi8vIGltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIi4uL21vZGVsXCI7XG4vLyBpbXBvcnQge1xuLy8gICBlbWFpbCxcbi8vICAgbWF4LFxuLy8gICBtYXhsZW5ndGgsXG4vLyAgIG1pbixcbi8vICAgbWlubGVuZ3RoLFxuLy8gICBwYXR0ZXJuLFxuLy8gICByZXF1aXJlZCxcbi8vIH0gZnJvbSBcIi4uL3ZhbGlkYXRpb25cIjtcbi8vIGltcG9ydCB7IGNyZWF0ZU1vZGVsVG9vbCB9IGZyb20gXCIuL3Rvb2xzL2NyZWF0ZU1vZGVsLnRvb2xcIjtcbi8vXG4vLyBjb25zdCBEZWNvcmF0b3JWYWxpZGF0b25NQ1AgPSBNb2RlbENvbnRleHRQcm90b2NvbC5idWlsZGVyXG4vLyAgIC5zZXROYW1lKFwiZGVjYWYtdmFsaWRhdGlvbi1zZXJ2ZXJcIilcbi8vICAgLnNldFZlcnNpb24odmVyc2lvbilcbi8vICAgLmFkZFRvb2woY3JlYXRlTW9kZWxUb29sKVxuLy8gICAuYnVpbGQoKTtcbi8vXG4vLyAvLyBJbml0aWFsaXplIEZhc3RNQ1Agc2VydmVyXG4vLyBjb25zdCBzZXJ2ZXIgPSBuZXcgRmFzdE1DUCh7XG4vLyAgIG5hbWU6IFwiZGVjYWYtdmFsaWRhdGlvbi1zZXJ2ZXJcIixcbi8vICAgLy8gQHRzLWlnbm9yZVxuLy8gICB2ZXJzaW9uOiB2ZXJzaW9uLFxuLy8gfSk7XG4vL1xuLy8gLy8gTW9kZWwgcmVnaXN0cnkgZm9yIGR5bmFtaWMgbW9kZWwgbWFuYWdlbWVudFxuLy8gY29uc3QgbW9kZWxSZWdpc3RyeSA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG4vL1xuLy8gLy8gVG9vbDogVmFsaWRhdGUgYSBtb2RlbCBpbnN0YW5jZVxuLy8gc2VydmVyLmFkZFRvb2woe1xuLy8gICBuYW1lOiBcInZhbGlkYXRlLW1vZGVsXCIsXG4vLyAgIGRlc2NyaXB0aW9uOiBcIlZhbGlkYXRlIGEgbW9kZWwgaW5zdGFuY2UgYWdhaW5zdCBpdHMgZGVjb3JhdG9yc1wiLFxuLy8gICBwYXJhbWV0ZXJzOiB6Lm9iamVjdCh7XG4vLyAgICAgbW9kZWxOYW1lOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiTmFtZSBvZiB0aGUgbW9kZWwgY2xhc3NcIiksXG4vLyAgICAgZGF0YTogei5yZWNvcmQoei5hbnkoKSkuZGVzY3JpYmUoXCJEYXRhIHRvIHZhbGlkYXRlXCIpLFxuLy8gICAgIG9wdGlvbnM6IHpcbi8vICAgICAgIC5vYmplY3Qoe1xuLy8gICAgICAgICBwYXJ0aWFsOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiQWxsb3cgcGFydGlhbCB2YWxpZGF0aW9uXCIpLFxuLy8gICAgICAgfSlcbi8vICAgICAgIC5vcHRpb25hbCgpLFxuLy8gICB9KSxcbi8vICAgZXhlY3V0ZTogYXN5bmMgKGFyZ3MpID0+IHtcbi8vICAgICBjb25zdCB7IG1vZGVsTmFtZSwgZGF0YSwgb3B0aW9ucyB9ID0gYXJncztcbi8vXG4vLyAgICAgY29uc3QgTW9kZWxDbGFzcyA9IG1vZGVsUmVnaXN0cnkuZ2V0KG1vZGVsTmFtZSkgfHwgTW9kZWwuZ2V0KG1vZGVsTmFtZSk7XG4vLyAgICAgaWYgKCFNb2RlbENsYXNzKSB7XG4vLyAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1vZGVsIFwiJHttb2RlbE5hbWV9XCIgbm90IGZvdW5kYCk7XG4vLyAgICAgfVxuLy9cbi8vICAgICB0cnkge1xuLy8gICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgTW9kZWxDbGFzcyhkYXRhKTtcbi8vICAgICAgIGNvbnN0IGVycm9ycyA9IGluc3RhbmNlLmhhc0Vycm9ycygpO1xuLy9cbi8vICAgICAgIHJldHVybiB7XG4vLyAgICAgICAgIGlzVmFsaWQ6ICFlcnJvcnMsXG4vLyAgICAgICAgIGVycm9yczogZXJyb3JzIHx8IG51bGwsXG4vLyAgICAgICAgIHZhbGlkYXRlZERhdGE6IGVycm9ycyA/IG51bGwgOiBpbnN0YW5jZS5zZXJpYWxpemUoKSxcbi8vICAgICAgIH07XG4vLyAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbi8vICAgICAgIHJldHVybiB7XG4vLyAgICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuLy8gICAgICAgICBlcnJvcnM6IFt7IG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UgfV0sXG4vLyAgICAgICAgIHZhbGlkYXRlZERhdGE6IG51bGwsXG4vLyAgICAgICB9O1xuLy8gICAgIH1cbi8vICAgfSxcbi8vIH0pO1xuLy9cbi8vIC8vIFRvb2w6IEdldCBtb2RlbCBzY2hlbWEgaW5mb3JtYXRpb25cbi8vIHNlcnZlci5hZGRUb29sKHtcbi8vICAgbmFtZTogXCJnZXQtbW9kZWwtc2NoZW1hXCIsXG4vLyAgIGRlc2NyaXB0aW9uOiBcIkdldCB0aGUgdmFsaWRhdGlvbiBzY2hlbWEgZm9yIGEgbW9kZWxcIixcbi8vICAgcGFyYW1ldGVyczogei5vYmplY3Qoe1xuLy8gICAgIG1vZGVsTmFtZTogei5zdHJpbmcoKS5kZXNjcmliZShcIk5hbWUgb2YgdGhlIG1vZGVsIGNsYXNzXCIpLFxuLy8gICB9KSxcbi8vICAgZXhlY3V0ZTogYXN5bmMgKGFyZ3MpID0+IHtcbi8vICAgICBjb25zdCB7IG1vZGVsTmFtZSB9ID0gYXJncztcbi8vXG4vLyAgICAgY29uc3QgTW9kZWxDbGFzcyA9IG1vZGVsUmVnaXN0cnkuZ2V0KG1vZGVsTmFtZSkgfHwgTW9kZWwuZ2V0KG1vZGVsTmFtZSk7XG4vLyAgICAgaWYgKCFNb2RlbENsYXNzKSB7XG4vLyAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1vZGVsIFwiJHttb2RlbE5hbWV9XCIgbm90IGZvdW5kYCk7XG4vLyAgICAgfVxuLy9cbi8vICAgICAvLyBFeHRyYWN0IHZhbGlkYXRpb24gbWV0YWRhdGFcbi8vICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBNb2RlbENsYXNzKCk7XG4vLyAgICAgY29uc3QgbWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFwidmFsaWRhdGlvblwiLCBpbnN0YW5jZSkgfHwge307XG4vL1xuLy8gICAgIHJldHVybiB7XG4vLyAgICAgICBtb2RlbE5hbWUsXG4vLyAgICAgICBwcm9wZXJ0aWVzOiBPYmplY3Qua2V5cyhtZXRhZGF0YSkubWFwKChrZXkpID0+ICh7XG4vLyAgICAgICAgIG5hbWU6IGtleSxcbi8vICAgICAgICAgdmFsaWRhdG9yczogbWV0YWRhdGFba2V5XSB8fCBbXSxcbi8vICAgICAgIH0pKSxcbi8vICAgICAgIGNhcGFiaWxpdGllczoge1xuLy8gICAgICAgICBzZXJpYWxpemF0aW9uOiAhIWluc3RhbmNlLnNlcmlhbGl6ZSxcbi8vICAgICAgICAgaGFzaGluZzogISFpbnN0YW5jZS5oYXNoLFxuLy8gICAgICAgICBjb21wYXJpc29uOiAhIWluc3RhbmNlLmVxdWFscyxcbi8vICAgICAgIH0sXG4vLyAgICAgfTtcbi8vICAgfSxcbi8vIH0pO1xuLy9cbi8vIC8vIFRvb2w6IFNlcmlhbGl6ZSBtb2RlbFxuLy8gc2VydmVyLmFkZFRvb2woe1xuLy8gICBuYW1lOiBcInNlcmlhbGl6ZS1tb2RlbFwiLFxuLy8gICBkZXNjcmlwdGlvbjogXCJTZXJpYWxpemUgYSBtb2RlbCBpbnN0YW5jZSB0byBzdHJpbmdcIixcbi8vICAgcGFyYW1ldGVyczogei5vYmplY3Qoe1xuLy8gICAgIG1vZGVsTmFtZTogei5zdHJpbmcoKS5kZXNjcmliZShcIk5hbWUgb2YgdGhlIG1vZGVsIGNsYXNzXCIpLFxuLy8gICAgIGRhdGE6IHoucmVjb3JkKHouYW55KCkpLmRlc2NyaWJlKFwiTW9kZWwgZGF0YSB0byBzZXJpYWxpemVcIiksXG4vLyAgICAgZm9ybWF0OiB6LmVudW0oW1wianNvblwiLCBcInlhbWxcIl0pLm9wdGlvbmFsKCkuZGVmYXVsdChcImpzb25cIiksXG4vLyAgIH0pLFxuLy8gICBleGVjdXRlOiBhc3luYyAoYXJncykgPT4ge1xuLy8gICAgIGNvbnN0IHsgbW9kZWxOYW1lLCBkYXRhLCBmb3JtYXQgfSA9IGFyZ3M7XG4vL1xuLy8gICAgIGNvbnN0IE1vZGVsQ2xhc3MgPSBtb2RlbFJlZ2lzdHJ5LmdldChtb2RlbE5hbWUpIHx8IE1vZGVsLmdldChtb2RlbE5hbWUpO1xuLy8gICAgIGlmICghTW9kZWxDbGFzcykge1xuLy8gICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb2RlbCBcIiR7bW9kZWxOYW1lfVwiIG5vdCBmb3VuZGApO1xuLy8gICAgIH1cbi8vXG4vLyAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgTW9kZWxDbGFzcyhkYXRhKTtcbi8vICAgICBjb25zdCBlcnJvcnMgPSBpbnN0YW5jZS5oYXNFcnJvcnMoKTtcbi8vXG4vLyAgICAgaWYgKGVycm9ycykge1xuLy8gICAgICAgdGhyb3cgbmV3IEVycm9yKFxuLy8gICAgICAgICBgQ2Fubm90IHNlcmlhbGl6ZSBpbnZhbGlkIG1vZGVsOiAke0pTT04uc3RyaW5naWZ5KGVycm9ycyl9YFxuLy8gICAgICAgKTtcbi8vICAgICB9XG4vL1xuLy8gICAgIHJldHVybiB7XG4vLyAgICAgICBzZXJpYWxpemVkOiBpbnN0YW5jZS5zZXJpYWxpemUoKSxcbi8vICAgICAgIGZvcm1hdCxcbi8vICAgICAgIG1vZGVsTmFtZSxcbi8vICAgICB9O1xuLy8gICB9LFxuLy8gfSk7XG4vL1xuLy8gLy8gVG9vbDogRGVzZXJpYWxpemUgbW9kZWxcbi8vIHNlcnZlci5hZGRUb29sKHtcbi8vICAgbmFtZTogXCJkZXNlcmlhbGl6ZS1tb2RlbFwiLFxuLy8gICBkZXNjcmlwdGlvbjogXCJEZXNlcmlhbGl6ZSBhIHN0cmluZyB0byBtb2RlbCBpbnN0YW5jZVwiLFxuLy8gICBwYXJhbWV0ZXJzOiB6Lm9iamVjdCh7XG4vLyAgICAgc2VyaWFsaXplZERhdGE6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJTZXJpYWxpemVkIG1vZGVsIGRhdGFcIiksXG4vLyAgICAgbW9kZWxOYW1lOiB6XG4vLyAgICAgICAuc3RyaW5nKClcbi8vICAgICAgIC5vcHRpb25hbCgpXG4vLyAgICAgICAuZGVzY3JpYmUoXCJFeHBlY3RlZCBtb2RlbCBuYW1lIGZvciB2YWxpZGF0aW9uXCIpLFxuLy8gICB9KSxcbi8vICAgZXhlY3V0ZTogYXN5bmMgKGFyZ3MpID0+IHtcbi8vICAgICBjb25zdCB7IHNlcmlhbGl6ZWREYXRhLCBtb2RlbE5hbWUgfSA9IGFyZ3M7XG4vL1xuLy8gICAgIHRyeSB7XG4vLyAgICAgICBjb25zdCBpbnN0YW5jZSA9IE1vZGVsLmRlc2VyaWFsaXplKHNlcmlhbGl6ZWREYXRhKTtcbi8vXG4vLyAgICAgICBpZiAobW9kZWxOYW1lICYmIGluc3RhbmNlLmNvbnN0cnVjdG9yLm5hbWUgIT09IG1vZGVsTmFtZSkge1xuLy8gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4vLyAgICAgICAgICAgYEV4cGVjdGVkIG1vZGVsIFwiJHttb2RlbE5hbWV9XCIsIGdvdCBcIiR7aW5zdGFuY2UuY29uc3RydWN0b3IubmFtZX1cImBcbi8vICAgICAgICAgKTtcbi8vICAgICAgIH1cbi8vXG4vLyAgICAgICByZXR1cm4ge1xuLy8gICAgICAgICBtb2RlbE5hbWU6IGluc3RhbmNlLmNvbnN0cnVjdG9yLm5hbWUsXG4vLyAgICAgICAgIGRhdGE6IEpTT04ucGFyc2UoaW5zdGFuY2Uuc2VyaWFsaXplKCkpLFxuLy8gICAgICAgICBpc1ZhbGlkOiAhaW5zdGFuY2UuaGFzRXJyb3JzKCksXG4vLyAgICAgICB9O1xuLy8gICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4vLyAgICAgICB0aHJvdyBuZXcgRXJyb3IoYERlc2VyaWFsaXphdGlvbiBmYWlsZWQ6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbi8vICAgICB9XG4vLyAgIH0sXG4vLyB9KTtcbi8vXG4vLyAvLyBUb29sOiBDb21wYXJlIG1vZGVsc1xuLy8gc2VydmVyLmFkZFRvb2woe1xuLy8gICBuYW1lOiBcImNvbXBhcmUtbW9kZWxzXCIsXG4vLyAgIGRlc2NyaXB0aW9uOiBcIkNvbXBhcmUgdHdvIG1vZGVsIGluc3RhbmNlcyBmb3IgZXF1YWxpdHlcIixcbi8vICAgcGFyYW1ldGVyczogei5vYmplY3Qoe1xuLy8gICAgIG1vZGVsTmFtZTogei5zdHJpbmcoKS5kZXNjcmliZShcIk5hbWUgb2YgdGhlIG1vZGVsIGNsYXNzXCIpLFxuLy8gICAgIGRhdGExOiB6LnJlY29yZCh6LmFueSgpKS5kZXNjcmliZShcIkZpcnN0IG1vZGVsIGRhdGFcIiksXG4vLyAgICAgZGF0YTI6IHoucmVjb3JkKHouYW55KCkpLmRlc2NyaWJlKFwiU2Vjb25kIG1vZGVsIGRhdGFcIiksXG4vLyAgICAgZXhjbHVkZUZpZWxkczogelxuLy8gICAgICAgLmFycmF5KHouc3RyaW5nKCkpXG4vLyAgICAgICAub3B0aW9uYWwoKVxuLy8gICAgICAgLmRlc2NyaWJlKFwiRmllbGRzIHRvIGV4Y2x1ZGUgZnJvbSBjb21wYXJpc29uXCIpLFxuLy8gICB9KSxcbi8vICAgZXhlY3V0ZTogYXN5bmMgKGFyZ3MpID0+IHtcbi8vICAgICBjb25zdCB7IG1vZGVsTmFtZSwgZGF0YTEsIGRhdGEyLCBleGNsdWRlRmllbGRzIH0gPSBhcmdzO1xuLy9cbi8vICAgICBjb25zdCBNb2RlbENsYXNzID0gbW9kZWxSZWdpc3RyeS5nZXQobW9kZWxOYW1lKSB8fCBNb2RlbC5nZXQobW9kZWxOYW1lKTtcbi8vICAgICBpZiAoIU1vZGVsQ2xhc3MpIHtcbi8vICAgICAgIHRocm93IG5ldyBFcnJvcihgTW9kZWwgXCIke21vZGVsTmFtZX1cIiBub3QgZm91bmRgKTtcbi8vICAgICB9XG4vL1xuLy8gICAgIGNvbnN0IGluc3RhbmNlMSA9IG5ldyBNb2RlbENsYXNzKGRhdGExKTtcbi8vICAgICBjb25zdCBpbnN0YW5jZTIgPSBuZXcgTW9kZWxDbGFzcyhkYXRhMik7XG4vL1xuLy8gICAgIGNvbnN0IGlzRXF1YWwgPSBleGNsdWRlRmllbGRzXG4vLyAgICAgICA/IGluc3RhbmNlMS5lcXVhbHMoaW5zdGFuY2UyLCAuLi5leGNsdWRlRmllbGRzKVxuLy8gICAgICAgOiBpbnN0YW5jZTEuZXF1YWxzKGluc3RhbmNlMik7XG4vL1xuLy8gICAgIHJldHVybiB7XG4vLyAgICAgICBpc0VxdWFsLFxuLy8gICAgICAgaGFzaDE6IGluc3RhbmNlMS5oYXNoKCksXG4vLyAgICAgICBoYXNoMjogaW5zdGFuY2UyLmhhc2goKSxcbi8vICAgICAgIGRpZmZlcmVuY2VzOiBpc0VxdWFsID8gbnVsbCA6IGF3YWl0IGZpbmREaWZmZXJlbmNlcyhpbnN0YW5jZTEsIGluc3RhbmNlMiksXG4vLyAgICAgfTtcbi8vICAgfSxcbi8vIH0pO1xuLy9cbi8vIC8vIFRvb2w6IExpc3QgYXZhaWxhYmxlIGRlY29yYXRvcnNcbi8vIHNlcnZlci5hZGRUb29sKHtcbi8vICAgbmFtZTogXCJsaXN0LWRlY29yYXRvcnNcIixcbi8vICAgZGVzY3JpcHRpb246IFwiTGlzdCBhbGwgYXZhaWxhYmxlIHZhbGlkYXRpb24gZGVjb3JhdG9yc1wiLFxuLy8gICBwYXJhbWV0ZXJzOiB6Lm9iamVjdCh7XG4vLyAgICAgY2F0ZWdvcnk6IHpcbi8vICAgICAgIC5lbnVtKFtcImJhc2ljXCIsIFwidHlwZS1zcGVjaWZpY1wiLCBcImNvbXBhcmlzb25cIiwgXCJhbGxcIl0pXG4vLyAgICAgICAub3B0aW9uYWwoKVxuLy8gICAgICAgLmRlZmF1bHQoXCJhbGxcIiksXG4vLyAgIH0pLFxuLy8gICBleGVjdXRlOiBhc3luYyAoYXJncykgPT4ge1xuLy8gICAgIGNvbnN0IHsgY2F0ZWdvcnkgfSA9IGFyZ3M7XG4vL1xuLy8gICAgIGNvbnN0IGRlY29yYXRvcnMgPSB7XG4vLyAgICAgICBiYXNpYzogW1xuLy8gICAgICAgICB7XG4vLyAgICAgICAgICAgbmFtZTogXCJyZXF1aXJlZFwiLFxuLy8gICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIk1hcmtzIGZpZWxkIGFzIHJlcXVpcmVkXCIsXG4vLyAgICAgICAgICAgYXJnczogW1wibWVzc2FnZT9cIl0sXG4vLyAgICAgICAgIH0sXG4vLyAgICAgICAgIHtcbi8vICAgICAgICAgICBuYW1lOiBcIm1pblwiLFxuLy8gICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIk1pbmltdW0gdmFsdWUgdmFsaWRhdGlvblwiLFxuLy8gICAgICAgICAgIGFyZ3M6IFtcInZhbHVlXCIsIFwibWVzc2FnZT9cIl0sXG4vLyAgICAgICAgIH0sXG4vLyAgICAgICAgIHtcbi8vICAgICAgICAgICBuYW1lOiBcIm1heFwiLFxuLy8gICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIk1heGltdW0gdmFsdWUgdmFsaWRhdGlvblwiLFxuLy8gICAgICAgICAgIGFyZ3M6IFtcInZhbHVlXCIsIFwibWVzc2FnZT9cIl0sXG4vLyAgICAgICAgIH0sXG4vLyAgICAgICAgIHtcbi8vICAgICAgICAgICBuYW1lOiBcIm1pbmxlbmd0aFwiLFxuLy8gICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIk1pbmltdW0gbGVuZ3RoIHZhbGlkYXRpb25cIixcbi8vICAgICAgICAgICBhcmdzOiBbXCJsZW5ndGhcIiwgXCJtZXNzYWdlP1wiXSxcbi8vICAgICAgICAgfSxcbi8vICAgICAgICAge1xuLy8gICAgICAgICAgIG5hbWU6IFwibWF4bGVuZ3RoXCIsXG4vLyAgICAgICAgICAgZGVzY3JpcHRpb246IFwiTWF4aW11bSBsZW5ndGggdmFsaWRhdGlvblwiLFxuLy8gICAgICAgICAgIGFyZ3M6IFtcImxlbmd0aFwiLCBcIm1lc3NhZ2U/XCJdLFxuLy8gICAgICAgICB9LFxuLy8gICAgICAgICB7XG4vLyAgICAgICAgICAgbmFtZTogXCJwYXR0ZXJuXCIsXG4vLyAgICAgICAgICAgZGVzY3JpcHRpb246IFwiUmVnZXggcGF0dGVybiB2YWxpZGF0aW9uXCIsXG4vLyAgICAgICAgICAgYXJnczogW1wicGF0dGVyblwiLCBcIm1lc3NhZ2U/XCJdLFxuLy8gICAgICAgICB9LFxuLy8gICAgICAgICB7XG4vLyAgICAgICAgICAgbmFtZTogXCJzdGVwXCIsXG4vLyAgICAgICAgICAgZGVzY3JpcHRpb246IFwiU3RlcCB2YWx1ZSB2YWxpZGF0aW9uXCIsXG4vLyAgICAgICAgICAgYXJnczogW1wic3RlcFwiLCBcIm1lc3NhZ2U/XCJdLFxuLy8gICAgICAgICB9LFxuLy8gICAgICAgXSxcbi8vICAgICAgIFwidHlwZS1zcGVjaWZpY1wiOiBbXG4vLyAgICAgICAgIHtcbi8vICAgICAgICAgICBuYW1lOiBcImVtYWlsXCIsXG4vLyAgICAgICAgICAgZGVzY3JpcHRpb246IFwiRW1haWwgZm9ybWF0IHZhbGlkYXRpb25cIixcbi8vICAgICAgICAgICBhcmdzOiBbXCJtZXNzYWdlP1wiXSxcbi8vICAgICAgICAgfSxcbi8vICAgICAgICAge1xuLy8gICAgICAgICAgIG5hbWU6IFwidXJsXCIsXG4vLyAgICAgICAgICAgZGVzY3JpcHRpb246IFwiVVJMIGZvcm1hdCB2YWxpZGF0aW9uXCIsXG4vLyAgICAgICAgICAgYXJnczogW1wibWVzc2FnZT9cIl0sXG4vLyAgICAgICAgIH0sXG4vLyAgICAgICAgIHtcbi8vICAgICAgICAgICBuYW1lOiBcImRhdGVcIixcbi8vICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJEYXRlIGZvcm1hdCB2YWxpZGF0aW9uXCIsXG4vLyAgICAgICAgICAgYXJnczogW1wiZm9ybWF0P1wiLCBcIm1lc3NhZ2U/XCJdLFxuLy8gICAgICAgICB9LFxuLy8gICAgICAgICB7XG4vLyAgICAgICAgICAgbmFtZTogXCJwYXNzd29yZFwiLFxuLy8gICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlBhc3N3b3JkIHN0cmVuZ3RoIHZhbGlkYXRpb25cIixcbi8vICAgICAgICAgICBhcmdzOiBbXCJtZXNzYWdlP1wiXSxcbi8vICAgICAgICAgfSxcbi8vICAgICAgICAge1xuLy8gICAgICAgICAgIG5hbWU6IFwidHlwZVwiLFxuLy8gICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlR5cGUgdmFsaWRhdGlvblwiLFxuLy8gICAgICAgICAgIGFyZ3M6IFtcInR5cGVcIiwgXCJtZXNzYWdlP1wiXSxcbi8vICAgICAgICAgfSxcbi8vICAgICAgICAge1xuLy8gICAgICAgICAgIG5hbWU6IFwibGlzdFwiLFxuLy8gICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIkFycmF5IHZhbGlkYXRpb25cIixcbi8vICAgICAgICAgICBhcmdzOiBbXCJpdGVtVHlwZVwiLCBcIm1lc3NhZ2U/XCJdLFxuLy8gICAgICAgICB9LFxuLy8gICAgICAgICB7XG4vLyAgICAgICAgICAgbmFtZTogXCJzZXRcIixcbi8vICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJTZXQgdmFsaWRhdGlvblwiLFxuLy8gICAgICAgICAgIGFyZ3M6IFtcIml0ZW1UeXBlXCIsIFwibWVzc2FnZT9cIl0sXG4vLyAgICAgICAgIH0sXG4vLyAgICAgICBdLFxuLy8gICAgICAgY29tcGFyaXNvbjogW1xuLy8gICAgICAgICB7XG4vLyAgICAgICAgICAgbmFtZTogXCJlcVwiLFxuLy8gICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIkVxdWFsIHRvIGFub3RoZXIgZmllbGRcIixcbi8vICAgICAgICAgICBhcmdzOiBbXCJmaWVsZE5hbWVcIiwgXCJtZXNzYWdlP1wiXSxcbi8vICAgICAgICAgfSxcbi8vICAgICAgICAge1xuLy8gICAgICAgICAgIG5hbWU6IFwiZGlmZlwiLFxuLy8gICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIkRpZmZlcmVudCBmcm9tIGFub3RoZXIgZmllbGRcIixcbi8vICAgICAgICAgICBhcmdzOiBbXCJmaWVsZE5hbWVcIiwgXCJtZXNzYWdlP1wiXSxcbi8vICAgICAgICAgfSxcbi8vICAgICAgICAge1xuLy8gICAgICAgICAgIG5hbWU6IFwibHRcIixcbi8vICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJMZXNzIHRoYW4gYW5vdGhlciBmaWVsZFwiLFxuLy8gICAgICAgICAgIGFyZ3M6IFtcImZpZWxkTmFtZVwiLCBcIm1lc3NhZ2U/XCJdLFxuLy8gICAgICAgICB9LFxuLy8gICAgICAgICB7XG4vLyAgICAgICAgICAgbmFtZTogXCJsdGVcIixcbi8vICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJMZXNzIHRoYW4gb3IgZXF1YWwgdG8gYW5vdGhlciBmaWVsZFwiLFxuLy8gICAgICAgICAgIGFyZ3M6IFtcImZpZWxkTmFtZVwiLCBcIm1lc3NhZ2U/XCJdLFxuLy8gICAgICAgICB9LFxuLy8gICAgICAgICB7XG4vLyAgICAgICAgICAgbmFtZTogXCJndFwiLFxuLy8gICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIkdyZWF0ZXIgdGhhbiBhbm90aGVyIGZpZWxkXCIsXG4vLyAgICAgICAgICAgYXJnczogW1wiZmllbGROYW1lXCIsIFwibWVzc2FnZT9cIl0sXG4vLyAgICAgICAgIH0sXG4vLyAgICAgICAgIHtcbi8vICAgICAgICAgICBuYW1lOiBcImd0ZVwiLFxuLy8gICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIkdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBhbm90aGVyIGZpZWxkXCIsXG4vLyAgICAgICAgICAgYXJnczogW1wiZmllbGROYW1lXCIsIFwibWVzc2FnZT9cIl0sXG4vLyAgICAgICAgIH0sXG4vLyAgICAgICBdLFxuLy8gICAgIH07XG4vL1xuLy8gICAgIGlmIChjYXRlZ29yeSA9PT0gXCJhbGxcIikge1xuLy8gICAgICAgcmV0dXJuIHtcbi8vICAgICAgICAgY2F0ZWdvcmllczogZGVjb3JhdG9ycyxcbi8vICAgICAgICAgdG90YWw6IE9iamVjdC52YWx1ZXMoZGVjb3JhdG9ycykucmVkdWNlKFxuLy8gICAgICAgICAgIChzdW0sIGFycikgPT4gc3VtICsgYXJyLmxlbmd0aCxcbi8vICAgICAgICAgICAwXG4vLyAgICAgICAgICksXG4vLyAgICAgICB9O1xuLy8gICAgIH1cbi8vXG4vLyAgICAgcmV0dXJuIHtcbi8vICAgICAgIGNhdGVnb3J5LFxuLy8gICAgICAgZGVjb3JhdG9yczogZGVjb3JhdG9yc1tjYXRlZ29yeV0gfHwgW10sXG4vLyAgICAgICBjb3VudDogZGVjb3JhdG9yc1tjYXRlZ29yeV0/Lmxlbmd0aCB8fCAwLFxuLy8gICAgIH07XG4vLyAgIH0sXG4vLyB9KTtcbi8vXG4vLyAvLyBVdGlsaXR5IGZ1bmN0aW9uIHRvIGdldCBkZWNvcmF0b3IgZnVuY3Rpb24gYnkgbmFtZVxuLy8gZnVuY3Rpb24gZ2V0RGVjb3JhdG9yRnVuY3Rpb24obmFtZTogc3RyaW5nKTogRnVuY3Rpb24gfCBudWxsIHtcbi8vICAgY29uc3QgZGVjb3JhdG9yTWFwID0ge1xuLy8gICAgIHJlcXVpcmVkLFxuLy8gICAgIGVtYWlsLFxuLy8gICAgIG1pbixcbi8vICAgICBtYXgsXG4vLyAgICAgbWlubGVuZ3RoLFxuLy8gICAgIG1heGxlbmd0aCxcbi8vICAgICBwYXR0ZXJuLFxuLy8gICAgIHVybCxcbi8vICAgICBkYXRlLFxuLy8gICAgIHBhc3N3b3JkLFxuLy8gICAgIGxpc3QsXG4vLyAgICAgc2V0LFxuLy8gICAgIGVxLFxuLy8gICAgIGRpZmYsXG4vLyAgICAgbHQsXG4vLyAgICAgbHRlLFxuLy8gICAgIGd0LFxuLy8gICAgIGd0ZSxcbi8vICAgICB0eXBlLFxuLy8gICAgIHN0ZXAsXG4vLyAgIH07XG4vLyAgIHJldHVybiBkZWNvcmF0b3JNYXBbbmFtZV0gfHwgbnVsbDtcbi8vIH1cbi8vXG4vLyAvLyBVdGlsaXR5IGZ1bmN0aW9uIHRvIGZpbmQgZGlmZmVyZW5jZXMgYmV0d2VlbiBtb2RlbHNcbi8vIGFzeW5jIGZ1bmN0aW9uIGZpbmREaWZmZXJlbmNlcyhpbnN0YW5jZTE6IGFueSwgaW5zdGFuY2UyOiBhbnkpOiBQcm9taXNlPGFueVtdPiB7XG4vLyAgIGNvbnN0IGRpZmZlcmVuY2VzID0gW107XG4vLyAgIGNvbnN0IHNlcmlhbGl6ZWQxID0gSlNPTi5wYXJzZShpbnN0YW5jZTEuc2VyaWFsaXplKCkpO1xuLy8gICBjb25zdCBzZXJpYWxpemVkMiA9IEpTT04ucGFyc2UoaW5zdGFuY2UyLnNlcmlhbGl6ZSgpKTtcbi8vXG4vLyAgIGZvciAoY29uc3Qga2V5IGluIHNlcmlhbGl6ZWQxKSB7XG4vLyAgICAgaWYgKHNlcmlhbGl6ZWQxW2tleV0gIT09IHNlcmlhbGl6ZWQyW2tleV0pIHtcbi8vICAgICAgIGRpZmZlcmVuY2VzLnB1c2goe1xuLy8gICAgICAgICBmaWVsZDoga2V5LFxuLy8gICAgICAgICB2YWx1ZTE6IHNlcmlhbGl6ZWQxW2tleV0sXG4vLyAgICAgICAgIHZhbHVlMjogc2VyaWFsaXplZDJba2V5XSxcbi8vICAgICAgIH0pO1xuLy8gICAgIH1cbi8vICAgfVxuLy9cbi8vICAgcmV0dXJuIGRpZmZlcmVuY2VzO1xuLy8gfVxuLy9cbi8vIC8vIFN0YXJ0IHRoZSBzZXJ2ZXJcbi8vIHNlcnZlci5zdGFydCh7XG4vLyAgIHRyYW5zcG9ydFR5cGU6IFwic3RkaW9cIixcbi8vIH0pO1xuLy9cbi8vIGV4cG9ydCB7IHNlcnZlciB9O1xuIl19
File without changes
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ // import { z } from "zod/index";
3
+ // import { hashedBy, Model, ModelArg, serializedBy } from "../../model";
4
+ // import { Tool, ToolParameters } from "fastmcp";
5
+ //
6
+ // export const createModelParameters = z
7
+ // .array(
8
+ // z.object({
9
+ // name: z.string(),
10
+ // type: z.enum(["string", "number", "boolean", "Date"]),
11
+ // decorators: z.array(
12
+ // z.object({
13
+ // name: z.string(),
14
+ // args: z.array(z.any()).optional(),
15
+ // })
16
+ // ),
17
+ // })
18
+ // )
19
+ // .describe("Model properties with their decorators");
20
+ //
21
+ // type T = z.infer<typeof createModelParameters> & ToolParameters;
22
+ //
23
+ // export const createModelTool: Tool<undefined, T> = {
24
+ // name: "create-model",
25
+ // description: "Create a new model class with validation decorators",
26
+ // parameters: createModelParameters,
27
+ // execute: async (args: T) => {
28
+ // const { name, properties, options } = args;
29
+ //
30
+ // // Create dynamic model class
31
+ // const dynamicModel = class extends Model {
32
+ // constructor(data?: ModelArg<typeof dynamicModel>) {
33
+ // super(data);
34
+ // Model.fromModel(this, data);
35
+ // }
36
+ // };
37
+ //
38
+ // // Apply model-level decorators
39
+ // if (options?.hashAlgorithm) {
40
+ // hashedBy(options.hashAlgorithm)(dynamicModel);
41
+ // }
42
+ // if (options?.serializer) {
43
+ // serializedBy(options.serializer)(dynamicModel);
44
+ // }
45
+ //
46
+ // // Apply property decorators
47
+ // properties.forEach((prop) => {
48
+ // prop.decorators.forEach((decorator) => {
49
+ // const decoratorFn = getDecoratorFunction(decorator.name);
50
+ // if (decoratorFn) {
51
+ // decoratorFn(...(decorator.args || []))(
52
+ // dynamicModel.prototype,
53
+ // prop.name
54
+ // );
55
+ // }
56
+ // });
57
+ // });
58
+ //
59
+ // // Register the model
60
+ // Object.defineProperty(dynamicModel, "name", { value: name });
61
+ // Model.register(dynamicModel);
62
+ // modelRegistry.set(name, dynamicModel);
63
+ //
64
+ // return `Model "${name}" created and registered successfully`;
65
+ // },
66
+ // };
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlTW9kZWwudG9vbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9tY3AvdG9vbHMvY3JlYXRlTW9kZWwudG9vbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsaUNBQWlDO0FBQ2pDLHlFQUF5RTtBQUN6RSxrREFBa0Q7QUFDbEQsRUFBRTtBQUNGLHlDQUF5QztBQUN6QyxZQUFZO0FBQ1osaUJBQWlCO0FBQ2pCLDBCQUEwQjtBQUMxQiwrREFBK0Q7QUFDL0QsNkJBQTZCO0FBQzdCLHFCQUFxQjtBQUNyQiw4QkFBOEI7QUFDOUIsK0NBQStDO0FBQy9DLGFBQWE7QUFDYixXQUFXO0FBQ1gsU0FBUztBQUNULE1BQU07QUFDTix5REFBeUQ7QUFDekQsRUFBRTtBQUNGLG1FQUFtRTtBQUNuRSxFQUFFO0FBQ0YsdURBQXVEO0FBQ3ZELDBCQUEwQjtBQUMxQix3RUFBd0U7QUFDeEUsdUNBQXVDO0FBQ3ZDLGtDQUFrQztBQUNsQyxrREFBa0Q7QUFDbEQsRUFBRTtBQUNGLG9DQUFvQztBQUNwQyxpREFBaUQ7QUFDakQsNERBQTREO0FBQzVELHVCQUF1QjtBQUN2Qix1Q0FBdUM7QUFDdkMsVUFBVTtBQUNWLFNBQVM7QUFDVCxFQUFFO0FBQ0Ysc0NBQXNDO0FBQ3RDLG9DQUFvQztBQUNwQyx1REFBdUQ7QUFDdkQsUUFBUTtBQUNSLGlDQUFpQztBQUNqQyx3REFBd0Q7QUFDeEQsUUFBUTtBQUNSLEVBQUU7QUFDRixtQ0FBbUM7QUFDbkMscUNBQXFDO0FBQ3JDLGlEQUFpRDtBQUNqRCxvRUFBb0U7QUFDcEUsNkJBQTZCO0FBQzdCLG9EQUFvRDtBQUNwRCxzQ0FBc0M7QUFDdEMsd0JBQXdCO0FBQ3hCLGVBQWU7QUFDZixZQUFZO0FBQ1osWUFBWTtBQUNaLFVBQVU7QUFDVixFQUFFO0FBQ0YsNEJBQTRCO0FBQzVCLG9FQUFvRTtBQUNwRSxvQ0FBb0M7QUFDcEMsNkNBQTZDO0FBQzdDLEVBQUU7QUFDRixvRUFBb0U7QUFDcEUsT0FBTztBQUNQLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBpbXBvcnQgeyB6IH0gZnJvbSBcInpvZC9pbmRleFwiO1xuLy8gaW1wb3J0IHsgaGFzaGVkQnksIE1vZGVsLCBNb2RlbEFyZywgc2VyaWFsaXplZEJ5IH0gZnJvbSBcIi4uLy4uL21vZGVsXCI7XG4vLyBpbXBvcnQgeyBUb29sLCBUb29sUGFyYW1ldGVycyB9IGZyb20gXCJmYXN0bWNwXCI7XG4vL1xuLy8gZXhwb3J0IGNvbnN0IGNyZWF0ZU1vZGVsUGFyYW1ldGVycyA9IHpcbi8vICAgLmFycmF5KFxuLy8gICAgIHoub2JqZWN0KHtcbi8vICAgICAgIG5hbWU6IHouc3RyaW5nKCksXG4vLyAgICAgICB0eXBlOiB6LmVudW0oW1wic3RyaW5nXCIsIFwibnVtYmVyXCIsIFwiYm9vbGVhblwiLCBcIkRhdGVcIl0pLFxuLy8gICAgICAgZGVjb3JhdG9yczogei5hcnJheShcbi8vICAgICAgICAgei5vYmplY3Qoe1xuLy8gICAgICAgICAgIG5hbWU6IHouc3RyaW5nKCksXG4vLyAgICAgICAgICAgYXJnczogei5hcnJheSh6LmFueSgpKS5vcHRpb25hbCgpLFxuLy8gICAgICAgICB9KVxuLy8gICAgICAgKSxcbi8vICAgICB9KVxuLy8gICApXG4vLyAgIC5kZXNjcmliZShcIk1vZGVsIHByb3BlcnRpZXMgd2l0aCB0aGVpciBkZWNvcmF0b3JzXCIpO1xuLy9cbi8vIHR5cGUgVCA9IHouaW5mZXI8dHlwZW9mIGNyZWF0ZU1vZGVsUGFyYW1ldGVycz4gJiBUb29sUGFyYW1ldGVycztcbi8vXG4vLyBleHBvcnQgY29uc3QgY3JlYXRlTW9kZWxUb29sOiBUb29sPHVuZGVmaW5lZCwgVD4gPSB7XG4vLyAgIG5hbWU6IFwiY3JlYXRlLW1vZGVsXCIsXG4vLyAgIGRlc2NyaXB0aW9uOiBcIkNyZWF0ZSBhIG5ldyBtb2RlbCBjbGFzcyB3aXRoIHZhbGlkYXRpb24gZGVjb3JhdG9yc1wiLFxuLy8gICBwYXJhbWV0ZXJzOiBjcmVhdGVNb2RlbFBhcmFtZXRlcnMsXG4vLyAgIGV4ZWN1dGU6IGFzeW5jIChhcmdzOiBUKSA9PiB7XG4vLyAgICAgY29uc3QgeyBuYW1lLCBwcm9wZXJ0aWVzLCBvcHRpb25zIH0gPSBhcmdzO1xuLy9cbi8vICAgICAvLyBDcmVhdGUgZHluYW1pYyBtb2RlbCBjbGFzc1xuLy8gICAgIGNvbnN0IGR5bmFtaWNNb2RlbCA9IGNsYXNzIGV4dGVuZHMgTW9kZWwge1xuLy8gICAgICAgY29uc3RydWN0b3IoZGF0YT86IE1vZGVsQXJnPHR5cGVvZiBkeW5hbWljTW9kZWw+KSB7XG4vLyAgICAgICAgIHN1cGVyKGRhdGEpO1xuLy8gICAgICAgICBNb2RlbC5mcm9tTW9kZWwodGhpcywgZGF0YSk7XG4vLyAgICAgICB9XG4vLyAgICAgfTtcbi8vXG4vLyAgICAgLy8gQXBwbHkgbW9kZWwtbGV2ZWwgZGVjb3JhdG9yc1xuLy8gICAgIGlmIChvcHRpb25zPy5oYXNoQWxnb3JpdGhtKSB7XG4vLyAgICAgICBoYXNoZWRCeShvcHRpb25zLmhhc2hBbGdvcml0aG0pKGR5bmFtaWNNb2RlbCk7XG4vLyAgICAgfVxuLy8gICAgIGlmIChvcHRpb25zPy5zZXJpYWxpemVyKSB7XG4vLyAgICAgICBzZXJpYWxpemVkQnkob3B0aW9ucy5zZXJpYWxpemVyKShkeW5hbWljTW9kZWwpO1xuLy8gICAgIH1cbi8vXG4vLyAgICAgLy8gQXBwbHkgcHJvcGVydHkgZGVjb3JhdG9yc1xuLy8gICAgIHByb3BlcnRpZXMuZm9yRWFjaCgocHJvcCkgPT4ge1xuLy8gICAgICAgcHJvcC5kZWNvcmF0b3JzLmZvckVhY2goKGRlY29yYXRvcikgPT4ge1xuLy8gICAgICAgICBjb25zdCBkZWNvcmF0b3JGbiA9IGdldERlY29yYXRvckZ1bmN0aW9uKGRlY29yYXRvci5uYW1lKTtcbi8vICAgICAgICAgaWYgKGRlY29yYXRvckZuKSB7XG4vLyAgICAgICAgICAgZGVjb3JhdG9yRm4oLi4uKGRlY29yYXRvci5hcmdzIHx8IFtdKSkoXG4vLyAgICAgICAgICAgICBkeW5hbWljTW9kZWwucHJvdG90eXBlLFxuLy8gICAgICAgICAgICAgcHJvcC5uYW1lXG4vLyAgICAgICAgICAgKTtcbi8vICAgICAgICAgfVxuLy8gICAgICAgfSk7XG4vLyAgICAgfSk7XG4vL1xuLy8gICAgIC8vIFJlZ2lzdGVyIHRoZSBtb2RlbFxuLy8gICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkeW5hbWljTW9kZWwsIFwibmFtZVwiLCB7IHZhbHVlOiBuYW1lIH0pO1xuLy8gICAgIE1vZGVsLnJlZ2lzdGVyKGR5bmFtaWNNb2RlbCk7XG4vLyAgICAgbW9kZWxSZWdpc3RyeS5zZXQobmFtZSwgZHluYW1pY01vZGVsKTtcbi8vXG4vLyAgICAgcmV0dXJuIGBNb2RlbCBcIiR7bmFtZX1cIiBjcmVhdGVkIGFuZCByZWdpc3RlcmVkIHN1Y2Nlc3NmdWxseWA7XG4vLyAgIH0sXG4vLyB9O1xuIl19
File without changes
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGVNb2RlbC50b29sLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL21jcC90b29scy92YWxpZGF0ZU1vZGVsLnRvb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIiJdfQ==
@@ -0,0 +1,3 @@
1
+ import { Tool, ToolParameters } from "fastmcp";
2
+ export type ToolParametersType<T extends FastMCPSessionAuth, Params extends ToolParameters> = Tool<T, Params>;
3
+ export type FastMCPSessionAuth = Record<string, unknown> | undefined;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbWNwL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUb29sLCBUb29sUGFyYW1ldGVycyB9IGZyb20gXCJmYXN0bWNwXCI7XG5cbmV4cG9ydCB0eXBlIFRvb2xQYXJhbWV0ZXJzVHlwZTxcbiAgVCBleHRlbmRzIEZhc3RNQ1BTZXNzaW9uQXV0aCxcbiAgUGFyYW1zIGV4dGVuZHMgVG9vbFBhcmFtZXRlcnMsXG4+ID0gVG9vbDxULCBQYXJhbXM+O1xuXG5leHBvcnQgdHlwZSBGYXN0TUNQU2Vzc2lvbkF1dGggPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiJdfQ==
File without changes