fixparser-plugin-mcp 9.1.7-71fc8a2b → 9.1.7-8db521e7
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.
- package/build/cjs/MCPLocal.js +346 -1614
- package/build/cjs/MCPLocal.js.map +4 -4
- package/build/esm/MCPLocal.mjs +346 -1623
- package/build/esm/MCPLocal.mjs.map +4 -4
- package/build-examples/cjs/example_mcp_local.js +4 -7
- package/build-examples/cjs/example_mcp_local.js.map +4 -4
- package/build-examples/esm/example_mcp_local.mjs +4 -7
- package/build-examples/esm/example_mcp_local.mjs.map +4 -4
- package/package.json +9 -8
- package/types/MCPLocal.d.ts +0 -1
package/build/esm/MCPLocal.mjs
CHANGED
|
@@ -8,1277 +8,172 @@ import {
|
|
|
8
8
|
ListResourcesRequestSchema,
|
|
9
9
|
ListToolsRequestSchema
|
|
10
10
|
} from "@modelcontextprotocol/sdk/types.js";
|
|
11
|
-
import {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
basePath: ["#"],
|
|
19
|
-
effectStrategy: "input",
|
|
20
|
-
pipeStrategy: "all",
|
|
21
|
-
dateStrategy: "format:date-time",
|
|
22
|
-
mapStrategy: "entries",
|
|
23
|
-
removeAdditionalStrategy: "passthrough",
|
|
24
|
-
allowedAdditionalProperties: true,
|
|
25
|
-
rejectedAdditionalProperties: false,
|
|
26
|
-
definitionPath: "definitions",
|
|
27
|
-
target: "jsonSchema7",
|
|
28
|
-
strictUnions: false,
|
|
29
|
-
definitions: {},
|
|
30
|
-
errorMessages: false,
|
|
31
|
-
markdownDescription: false,
|
|
32
|
-
patternStrategy: "escape",
|
|
33
|
-
applyRegexFlags: false,
|
|
34
|
-
emailStrategy: "format:email",
|
|
35
|
-
base64Strategy: "contentEncoding:base64",
|
|
36
|
-
nameStrategy: "ref"
|
|
37
|
-
};
|
|
38
|
-
var getDefaultOptions = (options) => typeof options === "string" ? {
|
|
39
|
-
...defaultOptions,
|
|
40
|
-
name: options
|
|
41
|
-
} : {
|
|
42
|
-
...defaultOptions,
|
|
43
|
-
...options
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
// ../../node_modules/zod-to-json-schema/dist/esm/Refs.js
|
|
47
|
-
var getRefs = (options) => {
|
|
48
|
-
const _options = getDefaultOptions(options);
|
|
49
|
-
const currentPath = _options.name !== void 0 ? [..._options.basePath, _options.definitionPath, _options.name] : _options.basePath;
|
|
50
|
-
return {
|
|
51
|
-
..._options,
|
|
52
|
-
currentPath,
|
|
53
|
-
propertyPath: void 0,
|
|
54
|
-
seen: new Map(Object.entries(_options.definitions).map(([name, def]) => [
|
|
55
|
-
def._def,
|
|
56
|
-
{
|
|
57
|
-
def: def._def,
|
|
58
|
-
path: [..._options.basePath, _options.definitionPath, name],
|
|
59
|
-
// Resolution of references will be forced even though seen, so it's ok that the schema is undefined here for now.
|
|
60
|
-
jsonSchema: void 0
|
|
61
|
-
}
|
|
62
|
-
]))
|
|
63
|
-
};
|
|
64
|
-
};
|
|
65
|
-
|
|
66
|
-
// ../../node_modules/zod-to-json-schema/dist/esm/errorMessages.js
|
|
67
|
-
function addErrorMessage(res, key, errorMessage, refs) {
|
|
68
|
-
if (!refs?.errorMessages)
|
|
69
|
-
return;
|
|
70
|
-
if (errorMessage) {
|
|
71
|
-
res.errorMessage = {
|
|
72
|
-
...res.errorMessage,
|
|
73
|
-
[key]: errorMessage
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
function setResponseValueAndErrors(res, key, value, errorMessage, refs) {
|
|
78
|
-
res[key] = value;
|
|
79
|
-
addErrorMessage(res, key, errorMessage, refs);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
// ../../node_modules/zod-to-json-schema/dist/esm/selectParser.js
|
|
83
|
-
import { ZodFirstPartyTypeKind as ZodFirstPartyTypeKind3 } from "zod";
|
|
84
|
-
|
|
85
|
-
// ../../node_modules/zod-to-json-schema/dist/esm/parsers/any.js
|
|
86
|
-
function parseAnyDef() {
|
|
87
|
-
return {};
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
// ../../node_modules/zod-to-json-schema/dist/esm/parsers/array.js
|
|
91
|
-
import { ZodFirstPartyTypeKind } from "zod";
|
|
92
|
-
function parseArrayDef(def, refs) {
|
|
93
|
-
const res = {
|
|
94
|
-
type: "array"
|
|
95
|
-
};
|
|
96
|
-
if (def.type?._def && def.type?._def?.typeName !== ZodFirstPartyTypeKind.ZodAny) {
|
|
97
|
-
res.items = parseDef(def.type._def, {
|
|
98
|
-
...refs,
|
|
99
|
-
currentPath: [...refs.currentPath, "items"]
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
if (def.minLength) {
|
|
103
|
-
setResponseValueAndErrors(res, "minItems", def.minLength.value, def.minLength.message, refs);
|
|
104
|
-
}
|
|
105
|
-
if (def.maxLength) {
|
|
106
|
-
setResponseValueAndErrors(res, "maxItems", def.maxLength.value, def.maxLength.message, refs);
|
|
107
|
-
}
|
|
108
|
-
if (def.exactLength) {
|
|
109
|
-
setResponseValueAndErrors(res, "minItems", def.exactLength.value, def.exactLength.message, refs);
|
|
110
|
-
setResponseValueAndErrors(res, "maxItems", def.exactLength.value, def.exactLength.message, refs);
|
|
111
|
-
}
|
|
112
|
-
return res;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
// ../../node_modules/zod-to-json-schema/dist/esm/parsers/bigint.js
|
|
116
|
-
function parseBigintDef(def, refs) {
|
|
117
|
-
const res = {
|
|
118
|
-
type: "integer",
|
|
119
|
-
format: "int64"
|
|
120
|
-
};
|
|
121
|
-
if (!def.checks)
|
|
122
|
-
return res;
|
|
123
|
-
for (const check of def.checks) {
|
|
124
|
-
switch (check.kind) {
|
|
125
|
-
case "min":
|
|
126
|
-
if (refs.target === "jsonSchema7") {
|
|
127
|
-
if (check.inclusive) {
|
|
128
|
-
setResponseValueAndErrors(res, "minimum", check.value, check.message, refs);
|
|
129
|
-
} else {
|
|
130
|
-
setResponseValueAndErrors(res, "exclusiveMinimum", check.value, check.message, refs);
|
|
131
|
-
}
|
|
132
|
-
} else {
|
|
133
|
-
if (!check.inclusive) {
|
|
134
|
-
res.exclusiveMinimum = true;
|
|
135
|
-
}
|
|
136
|
-
setResponseValueAndErrors(res, "minimum", check.value, check.message, refs);
|
|
137
|
-
}
|
|
138
|
-
break;
|
|
139
|
-
case "max":
|
|
140
|
-
if (refs.target === "jsonSchema7") {
|
|
141
|
-
if (check.inclusive) {
|
|
142
|
-
setResponseValueAndErrors(res, "maximum", check.value, check.message, refs);
|
|
143
|
-
} else {
|
|
144
|
-
setResponseValueAndErrors(res, "exclusiveMaximum", check.value, check.message, refs);
|
|
145
|
-
}
|
|
146
|
-
} else {
|
|
147
|
-
if (!check.inclusive) {
|
|
148
|
-
res.exclusiveMaximum = true;
|
|
149
|
-
}
|
|
150
|
-
setResponseValueAndErrors(res, "maximum", check.value, check.message, refs);
|
|
151
|
-
}
|
|
152
|
-
break;
|
|
153
|
-
case "multipleOf":
|
|
154
|
-
setResponseValueAndErrors(res, "multipleOf", check.value, check.message, refs);
|
|
155
|
-
break;
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
return res;
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
// ../../node_modules/zod-to-json-schema/dist/esm/parsers/boolean.js
|
|
162
|
-
function parseBooleanDef() {
|
|
163
|
-
return {
|
|
164
|
-
type: "boolean"
|
|
165
|
-
};
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
// ../../node_modules/zod-to-json-schema/dist/esm/parsers/branded.js
|
|
169
|
-
function parseBrandedDef(_def, refs) {
|
|
170
|
-
return parseDef(_def.type._def, refs);
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
// ../../node_modules/zod-to-json-schema/dist/esm/parsers/catch.js
|
|
174
|
-
var parseCatchDef = (def, refs) => {
|
|
175
|
-
return parseDef(def.innerType._def, refs);
|
|
176
|
-
};
|
|
177
|
-
|
|
178
|
-
// ../../node_modules/zod-to-json-schema/dist/esm/parsers/date.js
|
|
179
|
-
function parseDateDef(def, refs, overrideDateStrategy) {
|
|
180
|
-
const strategy = overrideDateStrategy ?? refs.dateStrategy;
|
|
181
|
-
if (Array.isArray(strategy)) {
|
|
182
|
-
return {
|
|
183
|
-
anyOf: strategy.map((item, i) => parseDateDef(def, refs, item))
|
|
184
|
-
};
|
|
185
|
-
}
|
|
186
|
-
switch (strategy) {
|
|
187
|
-
case "string":
|
|
188
|
-
case "format:date-time":
|
|
189
|
-
return {
|
|
190
|
-
type: "string",
|
|
191
|
-
format: "date-time"
|
|
192
|
-
};
|
|
193
|
-
case "format:date":
|
|
194
|
-
return {
|
|
195
|
-
type: "string",
|
|
196
|
-
format: "date"
|
|
197
|
-
};
|
|
198
|
-
case "integer":
|
|
199
|
-
return integerDateParser(def, refs);
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
var integerDateParser = (def, refs) => {
|
|
203
|
-
const res = {
|
|
204
|
-
type: "integer",
|
|
205
|
-
format: "unix-time"
|
|
206
|
-
};
|
|
207
|
-
if (refs.target === "openApi3") {
|
|
208
|
-
return res;
|
|
209
|
-
}
|
|
210
|
-
for (const check of def.checks) {
|
|
211
|
-
switch (check.kind) {
|
|
212
|
-
case "min":
|
|
213
|
-
setResponseValueAndErrors(
|
|
214
|
-
res,
|
|
215
|
-
"minimum",
|
|
216
|
-
check.value,
|
|
217
|
-
// This is in milliseconds
|
|
218
|
-
check.message,
|
|
219
|
-
refs
|
|
220
|
-
);
|
|
221
|
-
break;
|
|
222
|
-
case "max":
|
|
223
|
-
setResponseValueAndErrors(
|
|
224
|
-
res,
|
|
225
|
-
"maximum",
|
|
226
|
-
check.value,
|
|
227
|
-
// This is in milliseconds
|
|
228
|
-
check.message,
|
|
229
|
-
refs
|
|
230
|
-
);
|
|
231
|
-
break;
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
return res;
|
|
235
|
-
};
|
|
236
|
-
|
|
237
|
-
// ../../node_modules/zod-to-json-schema/dist/esm/parsers/default.js
|
|
238
|
-
function parseDefaultDef(_def, refs) {
|
|
239
|
-
return {
|
|
240
|
-
...parseDef(_def.innerType._def, refs),
|
|
241
|
-
default: _def.defaultValue()
|
|
242
|
-
};
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
// ../../node_modules/zod-to-json-schema/dist/esm/parsers/effects.js
|
|
246
|
-
function parseEffectsDef(_def, refs) {
|
|
247
|
-
return refs.effectStrategy === "input" ? parseDef(_def.schema._def, refs) : {};
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
// ../../node_modules/zod-to-json-schema/dist/esm/parsers/enum.js
|
|
251
|
-
function parseEnumDef(def) {
|
|
252
|
-
return {
|
|
253
|
-
type: "string",
|
|
254
|
-
enum: Array.from(def.values)
|
|
255
|
-
};
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
// ../../node_modules/zod-to-json-schema/dist/esm/parsers/intersection.js
|
|
259
|
-
var isJsonSchema7AllOfType = (type) => {
|
|
260
|
-
if ("type" in type && type.type === "string")
|
|
261
|
-
return false;
|
|
262
|
-
return "allOf" in type;
|
|
263
|
-
};
|
|
264
|
-
function parseIntersectionDef(def, refs) {
|
|
265
|
-
const allOf = [
|
|
266
|
-
parseDef(def.left._def, {
|
|
267
|
-
...refs,
|
|
268
|
-
currentPath: [...refs.currentPath, "allOf", "0"]
|
|
269
|
-
}),
|
|
270
|
-
parseDef(def.right._def, {
|
|
271
|
-
...refs,
|
|
272
|
-
currentPath: [...refs.currentPath, "allOf", "1"]
|
|
273
|
-
})
|
|
274
|
-
].filter((x) => !!x);
|
|
275
|
-
let unevaluatedProperties = refs.target === "jsonSchema2019-09" ? { unevaluatedProperties: false } : void 0;
|
|
276
|
-
const mergedAllOf = [];
|
|
277
|
-
allOf.forEach((schema) => {
|
|
278
|
-
if (isJsonSchema7AllOfType(schema)) {
|
|
279
|
-
mergedAllOf.push(...schema.allOf);
|
|
280
|
-
if (schema.unevaluatedProperties === void 0) {
|
|
281
|
-
unevaluatedProperties = void 0;
|
|
282
|
-
}
|
|
283
|
-
} else {
|
|
284
|
-
let nestedSchema = schema;
|
|
285
|
-
if ("additionalProperties" in schema && schema.additionalProperties === false) {
|
|
286
|
-
const { additionalProperties, ...rest } = schema;
|
|
287
|
-
nestedSchema = rest;
|
|
288
|
-
} else {
|
|
289
|
-
unevaluatedProperties = void 0;
|
|
290
|
-
}
|
|
291
|
-
mergedAllOf.push(nestedSchema);
|
|
292
|
-
}
|
|
293
|
-
});
|
|
294
|
-
return mergedAllOf.length ? {
|
|
295
|
-
allOf: mergedAllOf,
|
|
296
|
-
...unevaluatedProperties
|
|
297
|
-
} : void 0;
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
// ../../node_modules/zod-to-json-schema/dist/esm/parsers/literal.js
|
|
301
|
-
function parseLiteralDef(def, refs) {
|
|
302
|
-
const parsedType = typeof def.value;
|
|
303
|
-
if (parsedType !== "bigint" && parsedType !== "number" && parsedType !== "boolean" && parsedType !== "string") {
|
|
304
|
-
return {
|
|
305
|
-
type: Array.isArray(def.value) ? "array" : "object"
|
|
306
|
-
};
|
|
307
|
-
}
|
|
308
|
-
if (refs.target === "openApi3") {
|
|
309
|
-
return {
|
|
310
|
-
type: parsedType === "bigint" ? "integer" : parsedType,
|
|
311
|
-
enum: [def.value]
|
|
312
|
-
};
|
|
313
|
-
}
|
|
314
|
-
return {
|
|
315
|
-
type: parsedType === "bigint" ? "integer" : parsedType,
|
|
316
|
-
const: def.value
|
|
317
|
-
};
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
// ../../node_modules/zod-to-json-schema/dist/esm/parsers/record.js
|
|
321
|
-
import { ZodFirstPartyTypeKind as ZodFirstPartyTypeKind2 } from "zod";
|
|
322
|
-
|
|
323
|
-
// ../../node_modules/zod-to-json-schema/dist/esm/parsers/string.js
|
|
324
|
-
var emojiRegex = void 0;
|
|
325
|
-
var zodPatterns = {
|
|
326
|
-
/**
|
|
327
|
-
* `c` was changed to `[cC]` to replicate /i flag
|
|
328
|
-
*/
|
|
329
|
-
cuid: /^[cC][^\s-]{8,}$/,
|
|
330
|
-
cuid2: /^[0-9a-z]+$/,
|
|
331
|
-
ulid: /^[0-9A-HJKMNP-TV-Z]{26}$/,
|
|
332
|
-
/**
|
|
333
|
-
* `a-z` was added to replicate /i flag
|
|
334
|
-
*/
|
|
335
|
-
email: /^(?!\.)(?!.*\.\.)([a-zA-Z0-9_'+\-\.]*)[a-zA-Z0-9_+-]@([a-zA-Z0-9][a-zA-Z0-9\-]*\.)+[a-zA-Z]{2,}$/,
|
|
336
|
-
/**
|
|
337
|
-
* Constructed a valid Unicode RegExp
|
|
338
|
-
*
|
|
339
|
-
* Lazily instantiate since this type of regex isn't supported
|
|
340
|
-
* in all envs (e.g. React Native).
|
|
341
|
-
*
|
|
342
|
-
* See:
|
|
343
|
-
* https://github.com/colinhacks/zod/issues/2433
|
|
344
|
-
* Fix in Zod:
|
|
345
|
-
* https://github.com/colinhacks/zod/commit/9340fd51e48576a75adc919bff65dbc4a5d4c99b
|
|
346
|
-
*/
|
|
347
|
-
emoji: () => {
|
|
348
|
-
if (emojiRegex === void 0) {
|
|
349
|
-
emojiRegex = RegExp("^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$", "u");
|
|
11
|
+
import { Field, Fields, Messages } from "fixparser";
|
|
12
|
+
var parseInputSchema = {
|
|
13
|
+
type: "object",
|
|
14
|
+
properties: {
|
|
15
|
+
fixString: {
|
|
16
|
+
type: "string",
|
|
17
|
+
description: "FIX message string to parse"
|
|
350
18
|
}
|
|
351
|
-
return emojiRegex;
|
|
352
19
|
},
|
|
353
|
-
|
|
354
|
-
* Unused
|
|
355
|
-
*/
|
|
356
|
-
uuid: /^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/,
|
|
357
|
-
/**
|
|
358
|
-
* Unused
|
|
359
|
-
*/
|
|
360
|
-
ipv4: /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,
|
|
361
|
-
ipv4Cidr: /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/(3[0-2]|[12]?[0-9])$/,
|
|
362
|
-
/**
|
|
363
|
-
* Unused
|
|
364
|
-
*/
|
|
365
|
-
ipv6: /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/,
|
|
366
|
-
ipv6Cidr: /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,
|
|
367
|
-
base64: /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,
|
|
368
|
-
base64url: /^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,
|
|
369
|
-
nanoid: /^[a-zA-Z0-9_-]{21}$/,
|
|
370
|
-
jwt: /^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/
|
|
20
|
+
required: ["fixString"]
|
|
371
21
|
};
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
if (def.checks) {
|
|
377
|
-
for (const check of def.checks) {
|
|
378
|
-
switch (check.kind) {
|
|
379
|
-
case "min":
|
|
380
|
-
setResponseValueAndErrors(res, "minLength", typeof res.minLength === "number" ? Math.max(res.minLength, check.value) : check.value, check.message, refs);
|
|
381
|
-
break;
|
|
382
|
-
case "max":
|
|
383
|
-
setResponseValueAndErrors(res, "maxLength", typeof res.maxLength === "number" ? Math.min(res.maxLength, check.value) : check.value, check.message, refs);
|
|
384
|
-
break;
|
|
385
|
-
case "email":
|
|
386
|
-
switch (refs.emailStrategy) {
|
|
387
|
-
case "format:email":
|
|
388
|
-
addFormat(res, "email", check.message, refs);
|
|
389
|
-
break;
|
|
390
|
-
case "format:idn-email":
|
|
391
|
-
addFormat(res, "idn-email", check.message, refs);
|
|
392
|
-
break;
|
|
393
|
-
case "pattern:zod":
|
|
394
|
-
addPattern(res, zodPatterns.email, check.message, refs);
|
|
395
|
-
break;
|
|
396
|
-
}
|
|
397
|
-
break;
|
|
398
|
-
case "url":
|
|
399
|
-
addFormat(res, "uri", check.message, refs);
|
|
400
|
-
break;
|
|
401
|
-
case "uuid":
|
|
402
|
-
addFormat(res, "uuid", check.message, refs);
|
|
403
|
-
break;
|
|
404
|
-
case "regex":
|
|
405
|
-
addPattern(res, check.regex, check.message, refs);
|
|
406
|
-
break;
|
|
407
|
-
case "cuid":
|
|
408
|
-
addPattern(res, zodPatterns.cuid, check.message, refs);
|
|
409
|
-
break;
|
|
410
|
-
case "cuid2":
|
|
411
|
-
addPattern(res, zodPatterns.cuid2, check.message, refs);
|
|
412
|
-
break;
|
|
413
|
-
case "startsWith":
|
|
414
|
-
addPattern(res, RegExp(`^${escapeLiteralCheckValue(check.value, refs)}`), check.message, refs);
|
|
415
|
-
break;
|
|
416
|
-
case "endsWith":
|
|
417
|
-
addPattern(res, RegExp(`${escapeLiteralCheckValue(check.value, refs)}$`), check.message, refs);
|
|
418
|
-
break;
|
|
419
|
-
case "datetime":
|
|
420
|
-
addFormat(res, "date-time", check.message, refs);
|
|
421
|
-
break;
|
|
422
|
-
case "date":
|
|
423
|
-
addFormat(res, "date", check.message, refs);
|
|
424
|
-
break;
|
|
425
|
-
case "time":
|
|
426
|
-
addFormat(res, "time", check.message, refs);
|
|
427
|
-
break;
|
|
428
|
-
case "duration":
|
|
429
|
-
addFormat(res, "duration", check.message, refs);
|
|
430
|
-
break;
|
|
431
|
-
case "length":
|
|
432
|
-
setResponseValueAndErrors(res, "minLength", typeof res.minLength === "number" ? Math.max(res.minLength, check.value) : check.value, check.message, refs);
|
|
433
|
-
setResponseValueAndErrors(res, "maxLength", typeof res.maxLength === "number" ? Math.min(res.maxLength, check.value) : check.value, check.message, refs);
|
|
434
|
-
break;
|
|
435
|
-
case "includes": {
|
|
436
|
-
addPattern(res, RegExp(escapeLiteralCheckValue(check.value, refs)), check.message, refs);
|
|
437
|
-
break;
|
|
438
|
-
}
|
|
439
|
-
case "ip": {
|
|
440
|
-
if (check.version !== "v6") {
|
|
441
|
-
addFormat(res, "ipv4", check.message, refs);
|
|
442
|
-
}
|
|
443
|
-
if (check.version !== "v4") {
|
|
444
|
-
addFormat(res, "ipv6", check.message, refs);
|
|
445
|
-
}
|
|
446
|
-
break;
|
|
447
|
-
}
|
|
448
|
-
case "base64url":
|
|
449
|
-
addPattern(res, zodPatterns.base64url, check.message, refs);
|
|
450
|
-
break;
|
|
451
|
-
case "jwt":
|
|
452
|
-
addPattern(res, zodPatterns.jwt, check.message, refs);
|
|
453
|
-
break;
|
|
454
|
-
case "cidr": {
|
|
455
|
-
if (check.version !== "v6") {
|
|
456
|
-
addPattern(res, zodPatterns.ipv4Cidr, check.message, refs);
|
|
457
|
-
}
|
|
458
|
-
if (check.version !== "v4") {
|
|
459
|
-
addPattern(res, zodPatterns.ipv6Cidr, check.message, refs);
|
|
460
|
-
}
|
|
461
|
-
break;
|
|
462
|
-
}
|
|
463
|
-
case "emoji":
|
|
464
|
-
addPattern(res, zodPatterns.emoji(), check.message, refs);
|
|
465
|
-
break;
|
|
466
|
-
case "ulid": {
|
|
467
|
-
addPattern(res, zodPatterns.ulid, check.message, refs);
|
|
468
|
-
break;
|
|
469
|
-
}
|
|
470
|
-
case "base64": {
|
|
471
|
-
switch (refs.base64Strategy) {
|
|
472
|
-
case "format:binary": {
|
|
473
|
-
addFormat(res, "binary", check.message, refs);
|
|
474
|
-
break;
|
|
475
|
-
}
|
|
476
|
-
case "contentEncoding:base64": {
|
|
477
|
-
setResponseValueAndErrors(res, "contentEncoding", "base64", check.message, refs);
|
|
478
|
-
break;
|
|
479
|
-
}
|
|
480
|
-
case "pattern:zod": {
|
|
481
|
-
addPattern(res, zodPatterns.base64, check.message, refs);
|
|
482
|
-
break;
|
|
483
|
-
}
|
|
484
|
-
}
|
|
485
|
-
break;
|
|
486
|
-
}
|
|
487
|
-
case "nanoid": {
|
|
488
|
-
addPattern(res, zodPatterns.nanoid, check.message, refs);
|
|
489
|
-
}
|
|
490
|
-
case "toLowerCase":
|
|
491
|
-
case "toUpperCase":
|
|
492
|
-
case "trim":
|
|
493
|
-
break;
|
|
494
|
-
default:
|
|
495
|
-
/* @__PURE__ */ ((_) => {
|
|
496
|
-
})(check);
|
|
497
|
-
}
|
|
498
|
-
}
|
|
499
|
-
}
|
|
500
|
-
return res;
|
|
501
|
-
}
|
|
502
|
-
function escapeLiteralCheckValue(literal, refs) {
|
|
503
|
-
return refs.patternStrategy === "escape" ? escapeNonAlphaNumeric(literal) : literal;
|
|
504
|
-
}
|
|
505
|
-
var ALPHA_NUMERIC = new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789");
|
|
506
|
-
function escapeNonAlphaNumeric(source) {
|
|
507
|
-
let result = "";
|
|
508
|
-
for (let i = 0; i < source.length; i++) {
|
|
509
|
-
if (!ALPHA_NUMERIC.has(source[i])) {
|
|
510
|
-
result += "\\";
|
|
511
|
-
}
|
|
512
|
-
result += source[i];
|
|
513
|
-
}
|
|
514
|
-
return result;
|
|
515
|
-
}
|
|
516
|
-
function addFormat(schema, value, message, refs) {
|
|
517
|
-
if (schema.format || schema.anyOf?.some((x) => x.format)) {
|
|
518
|
-
if (!schema.anyOf) {
|
|
519
|
-
schema.anyOf = [];
|
|
520
|
-
}
|
|
521
|
-
if (schema.format) {
|
|
522
|
-
schema.anyOf.push({
|
|
523
|
-
format: schema.format,
|
|
524
|
-
...schema.errorMessage && refs.errorMessages && {
|
|
525
|
-
errorMessage: { format: schema.errorMessage.format }
|
|
526
|
-
}
|
|
527
|
-
});
|
|
528
|
-
delete schema.format;
|
|
529
|
-
if (schema.errorMessage) {
|
|
530
|
-
delete schema.errorMessage.format;
|
|
531
|
-
if (Object.keys(schema.errorMessage).length === 0) {
|
|
532
|
-
delete schema.errorMessage;
|
|
533
|
-
}
|
|
534
|
-
}
|
|
535
|
-
}
|
|
536
|
-
schema.anyOf.push({
|
|
537
|
-
format: value,
|
|
538
|
-
...message && refs.errorMessages && { errorMessage: { format: message } }
|
|
539
|
-
});
|
|
540
|
-
} else {
|
|
541
|
-
setResponseValueAndErrors(schema, "format", value, message, refs);
|
|
542
|
-
}
|
|
543
|
-
}
|
|
544
|
-
function addPattern(schema, regex, message, refs) {
|
|
545
|
-
if (schema.pattern || schema.allOf?.some((x) => x.pattern)) {
|
|
546
|
-
if (!schema.allOf) {
|
|
547
|
-
schema.allOf = [];
|
|
548
|
-
}
|
|
549
|
-
if (schema.pattern) {
|
|
550
|
-
schema.allOf.push({
|
|
551
|
-
pattern: schema.pattern,
|
|
552
|
-
...schema.errorMessage && refs.errorMessages && {
|
|
553
|
-
errorMessage: { pattern: schema.errorMessage.pattern }
|
|
554
|
-
}
|
|
555
|
-
});
|
|
556
|
-
delete schema.pattern;
|
|
557
|
-
if (schema.errorMessage) {
|
|
558
|
-
delete schema.errorMessage.pattern;
|
|
559
|
-
if (Object.keys(schema.errorMessage).length === 0) {
|
|
560
|
-
delete schema.errorMessage;
|
|
561
|
-
}
|
|
562
|
-
}
|
|
563
|
-
}
|
|
564
|
-
schema.allOf.push({
|
|
565
|
-
pattern: stringifyRegExpWithFlags(regex, refs),
|
|
566
|
-
...message && refs.errorMessages && { errorMessage: { pattern: message } }
|
|
567
|
-
});
|
|
568
|
-
} else {
|
|
569
|
-
setResponseValueAndErrors(schema, "pattern", stringifyRegExpWithFlags(regex, refs), message, refs);
|
|
570
|
-
}
|
|
571
|
-
}
|
|
572
|
-
function stringifyRegExpWithFlags(regex, refs) {
|
|
573
|
-
if (!refs.applyRegexFlags || !regex.flags) {
|
|
574
|
-
return regex.source;
|
|
575
|
-
}
|
|
576
|
-
const flags = {
|
|
577
|
-
i: regex.flags.includes("i"),
|
|
578
|
-
m: regex.flags.includes("m"),
|
|
579
|
-
s: regex.flags.includes("s")
|
|
580
|
-
// `.` matches newlines
|
|
581
|
-
};
|
|
582
|
-
const source = flags.i ? regex.source.toLowerCase() : regex.source;
|
|
583
|
-
let pattern = "";
|
|
584
|
-
let isEscaped = false;
|
|
585
|
-
let inCharGroup = false;
|
|
586
|
-
let inCharRange = false;
|
|
587
|
-
for (let i = 0; i < source.length; i++) {
|
|
588
|
-
if (isEscaped) {
|
|
589
|
-
pattern += source[i];
|
|
590
|
-
isEscaped = false;
|
|
591
|
-
continue;
|
|
592
|
-
}
|
|
593
|
-
if (flags.i) {
|
|
594
|
-
if (inCharGroup) {
|
|
595
|
-
if (source[i].match(/[a-z]/)) {
|
|
596
|
-
if (inCharRange) {
|
|
597
|
-
pattern += source[i];
|
|
598
|
-
pattern += `${source[i - 2]}-${source[i]}`.toUpperCase();
|
|
599
|
-
inCharRange = false;
|
|
600
|
-
} else if (source[i + 1] === "-" && source[i + 2]?.match(/[a-z]/)) {
|
|
601
|
-
pattern += source[i];
|
|
602
|
-
inCharRange = true;
|
|
603
|
-
} else {
|
|
604
|
-
pattern += `${source[i]}${source[i].toUpperCase()}`;
|
|
605
|
-
}
|
|
606
|
-
continue;
|
|
607
|
-
}
|
|
608
|
-
} else if (source[i].match(/[a-z]/)) {
|
|
609
|
-
pattern += `[${source[i]}${source[i].toUpperCase()}]`;
|
|
610
|
-
continue;
|
|
611
|
-
}
|
|
612
|
-
}
|
|
613
|
-
if (flags.m) {
|
|
614
|
-
if (source[i] === "^") {
|
|
615
|
-
pattern += `(^|(?<=[\r
|
|
616
|
-
]))`;
|
|
617
|
-
continue;
|
|
618
|
-
} else if (source[i] === "$") {
|
|
619
|
-
pattern += `($|(?=[\r
|
|
620
|
-
]))`;
|
|
621
|
-
continue;
|
|
622
|
-
}
|
|
623
|
-
}
|
|
624
|
-
if (flags.s && source[i] === ".") {
|
|
625
|
-
pattern += inCharGroup ? `${source[i]}\r
|
|
626
|
-
` : `[${source[i]}\r
|
|
627
|
-
]`;
|
|
628
|
-
continue;
|
|
629
|
-
}
|
|
630
|
-
pattern += source[i];
|
|
631
|
-
if (source[i] === "\\") {
|
|
632
|
-
isEscaped = true;
|
|
633
|
-
} else if (inCharGroup && source[i] === "]") {
|
|
634
|
-
inCharGroup = false;
|
|
635
|
-
} else if (!inCharGroup && source[i] === "[") {
|
|
636
|
-
inCharGroup = true;
|
|
637
|
-
}
|
|
638
|
-
}
|
|
639
|
-
try {
|
|
640
|
-
new RegExp(pattern);
|
|
641
|
-
} catch {
|
|
642
|
-
console.warn(`Could not convert regex pattern at ${refs.currentPath.join("/")} to a flag-independent form! Falling back to the flag-ignorant source`);
|
|
643
|
-
return regex.source;
|
|
644
|
-
}
|
|
645
|
-
return pattern;
|
|
646
|
-
}
|
|
647
|
-
|
|
648
|
-
// ../../node_modules/zod-to-json-schema/dist/esm/parsers/record.js
|
|
649
|
-
function parseRecordDef(def, refs) {
|
|
650
|
-
if (refs.target === "openAi") {
|
|
651
|
-
console.warn("Warning: OpenAI may not support records in schemas! Try an array of key-value pairs instead.");
|
|
652
|
-
}
|
|
653
|
-
if (refs.target === "openApi3" && def.keyType?._def.typeName === ZodFirstPartyTypeKind2.ZodEnum) {
|
|
654
|
-
return {
|
|
655
|
-
type: "object",
|
|
656
|
-
required: def.keyType._def.values,
|
|
657
|
-
properties: def.keyType._def.values.reduce((acc, key) => ({
|
|
658
|
-
...acc,
|
|
659
|
-
[key]: parseDef(def.valueType._def, {
|
|
660
|
-
...refs,
|
|
661
|
-
currentPath: [...refs.currentPath, "properties", key]
|
|
662
|
-
}) ?? {}
|
|
663
|
-
}), {}),
|
|
664
|
-
additionalProperties: refs.rejectedAdditionalProperties
|
|
665
|
-
};
|
|
666
|
-
}
|
|
667
|
-
const schema = {
|
|
668
|
-
type: "object",
|
|
669
|
-
additionalProperties: parseDef(def.valueType._def, {
|
|
670
|
-
...refs,
|
|
671
|
-
currentPath: [...refs.currentPath, "additionalProperties"]
|
|
672
|
-
}) ?? refs.allowedAdditionalProperties
|
|
673
|
-
};
|
|
674
|
-
if (refs.target === "openApi3") {
|
|
675
|
-
return schema;
|
|
676
|
-
}
|
|
677
|
-
if (def.keyType?._def.typeName === ZodFirstPartyTypeKind2.ZodString && def.keyType._def.checks?.length) {
|
|
678
|
-
const { type, ...keyType } = parseStringDef(def.keyType._def, refs);
|
|
679
|
-
return {
|
|
680
|
-
...schema,
|
|
681
|
-
propertyNames: keyType
|
|
682
|
-
};
|
|
683
|
-
} else if (def.keyType?._def.typeName === ZodFirstPartyTypeKind2.ZodEnum) {
|
|
684
|
-
return {
|
|
685
|
-
...schema,
|
|
686
|
-
propertyNames: {
|
|
687
|
-
enum: def.keyType._def.values
|
|
688
|
-
}
|
|
689
|
-
};
|
|
690
|
-
} else if (def.keyType?._def.typeName === ZodFirstPartyTypeKind2.ZodBranded && def.keyType._def.type._def.typeName === ZodFirstPartyTypeKind2.ZodString && def.keyType._def.type._def.checks?.length) {
|
|
691
|
-
const { type, ...keyType } = parseBrandedDef(def.keyType._def, refs);
|
|
692
|
-
return {
|
|
693
|
-
...schema,
|
|
694
|
-
propertyNames: keyType
|
|
695
|
-
};
|
|
696
|
-
}
|
|
697
|
-
return schema;
|
|
698
|
-
}
|
|
699
|
-
|
|
700
|
-
// ../../node_modules/zod-to-json-schema/dist/esm/parsers/map.js
|
|
701
|
-
function parseMapDef(def, refs) {
|
|
702
|
-
if (refs.mapStrategy === "record") {
|
|
703
|
-
return parseRecordDef(def, refs);
|
|
704
|
-
}
|
|
705
|
-
const keys = parseDef(def.keyType._def, {
|
|
706
|
-
...refs,
|
|
707
|
-
currentPath: [...refs.currentPath, "items", "items", "0"]
|
|
708
|
-
}) || {};
|
|
709
|
-
const values = parseDef(def.valueType._def, {
|
|
710
|
-
...refs,
|
|
711
|
-
currentPath: [...refs.currentPath, "items", "items", "1"]
|
|
712
|
-
}) || {};
|
|
713
|
-
return {
|
|
714
|
-
type: "array",
|
|
715
|
-
maxItems: 125,
|
|
716
|
-
items: {
|
|
717
|
-
type: "array",
|
|
718
|
-
items: [keys, values],
|
|
719
|
-
minItems: 2,
|
|
720
|
-
maxItems: 2
|
|
721
|
-
}
|
|
722
|
-
};
|
|
723
|
-
}
|
|
724
|
-
|
|
725
|
-
// ../../node_modules/zod-to-json-schema/dist/esm/parsers/nativeEnum.js
|
|
726
|
-
function parseNativeEnumDef(def) {
|
|
727
|
-
const object = def.values;
|
|
728
|
-
const actualKeys = Object.keys(def.values).filter((key) => {
|
|
729
|
-
return typeof object[object[key]] !== "number";
|
|
730
|
-
});
|
|
731
|
-
const actualValues = actualKeys.map((key) => object[key]);
|
|
732
|
-
const parsedTypes = Array.from(new Set(actualValues.map((values) => typeof values)));
|
|
733
|
-
return {
|
|
734
|
-
type: parsedTypes.length === 1 ? parsedTypes[0] === "string" ? "string" : "number" : ["string", "number"],
|
|
735
|
-
enum: actualValues
|
|
736
|
-
};
|
|
737
|
-
}
|
|
738
|
-
|
|
739
|
-
// ../../node_modules/zod-to-json-schema/dist/esm/parsers/never.js
|
|
740
|
-
function parseNeverDef() {
|
|
741
|
-
return {
|
|
742
|
-
not: {}
|
|
743
|
-
};
|
|
744
|
-
}
|
|
745
|
-
|
|
746
|
-
// ../../node_modules/zod-to-json-schema/dist/esm/parsers/null.js
|
|
747
|
-
function parseNullDef(refs) {
|
|
748
|
-
return refs.target === "openApi3" ? {
|
|
749
|
-
enum: ["null"],
|
|
750
|
-
nullable: true
|
|
751
|
-
} : {
|
|
752
|
-
type: "null"
|
|
753
|
-
};
|
|
754
|
-
}
|
|
755
|
-
|
|
756
|
-
// ../../node_modules/zod-to-json-schema/dist/esm/parsers/union.js
|
|
757
|
-
var primitiveMappings = {
|
|
758
|
-
ZodString: "string",
|
|
759
|
-
ZodNumber: "number",
|
|
760
|
-
ZodBigInt: "integer",
|
|
761
|
-
ZodBoolean: "boolean",
|
|
762
|
-
ZodNull: "null"
|
|
763
|
-
};
|
|
764
|
-
function parseUnionDef(def, refs) {
|
|
765
|
-
if (refs.target === "openApi3")
|
|
766
|
-
return asAnyOf(def, refs);
|
|
767
|
-
const options = def.options instanceof Map ? Array.from(def.options.values()) : def.options;
|
|
768
|
-
if (options.every((x) => x._def.typeName in primitiveMappings && (!x._def.checks || !x._def.checks.length))) {
|
|
769
|
-
const types = options.reduce((types2, x) => {
|
|
770
|
-
const type = primitiveMappings[x._def.typeName];
|
|
771
|
-
return type && !types2.includes(type) ? [...types2, type] : types2;
|
|
772
|
-
}, []);
|
|
773
|
-
return {
|
|
774
|
-
type: types.length > 1 ? types : types[0]
|
|
775
|
-
};
|
|
776
|
-
} else if (options.every((x) => x._def.typeName === "ZodLiteral" && !x.description)) {
|
|
777
|
-
const types = options.reduce((acc, x) => {
|
|
778
|
-
const type = typeof x._def.value;
|
|
779
|
-
switch (type) {
|
|
780
|
-
case "string":
|
|
781
|
-
case "number":
|
|
782
|
-
case "boolean":
|
|
783
|
-
return [...acc, type];
|
|
784
|
-
case "bigint":
|
|
785
|
-
return [...acc, "integer"];
|
|
786
|
-
case "object":
|
|
787
|
-
if (x._def.value === null)
|
|
788
|
-
return [...acc, "null"];
|
|
789
|
-
case "symbol":
|
|
790
|
-
case "undefined":
|
|
791
|
-
case "function":
|
|
792
|
-
default:
|
|
793
|
-
return acc;
|
|
794
|
-
}
|
|
795
|
-
}, []);
|
|
796
|
-
if (types.length === options.length) {
|
|
797
|
-
const uniqueTypes = types.filter((x, i, a) => a.indexOf(x) === i);
|
|
798
|
-
return {
|
|
799
|
-
type: uniqueTypes.length > 1 ? uniqueTypes : uniqueTypes[0],
|
|
800
|
-
enum: options.reduce((acc, x) => {
|
|
801
|
-
return acc.includes(x._def.value) ? acc : [...acc, x._def.value];
|
|
802
|
-
}, [])
|
|
803
|
-
};
|
|
804
|
-
}
|
|
805
|
-
} else if (options.every((x) => x._def.typeName === "ZodEnum")) {
|
|
806
|
-
return {
|
|
22
|
+
var parseToJSONInputSchema = {
|
|
23
|
+
type: "object",
|
|
24
|
+
properties: {
|
|
25
|
+
fixString: {
|
|
807
26
|
type: "string",
|
|
808
|
-
|
|
809
|
-
...acc,
|
|
810
|
-
...x._def.values.filter((x2) => !acc.includes(x2))
|
|
811
|
-
], [])
|
|
812
|
-
};
|
|
813
|
-
}
|
|
814
|
-
return asAnyOf(def, refs);
|
|
815
|
-
}
|
|
816
|
-
var asAnyOf = (def, refs) => {
|
|
817
|
-
const anyOf = (def.options instanceof Map ? Array.from(def.options.values()) : def.options).map((x, i) => parseDef(x._def, {
|
|
818
|
-
...refs,
|
|
819
|
-
currentPath: [...refs.currentPath, "anyOf", `${i}`]
|
|
820
|
-
})).filter((x) => !!x && (!refs.strictUnions || typeof x === "object" && Object.keys(x).length > 0));
|
|
821
|
-
return anyOf.length ? { anyOf } : void 0;
|
|
822
|
-
};
|
|
823
|
-
|
|
824
|
-
// ../../node_modules/zod-to-json-schema/dist/esm/parsers/nullable.js
|
|
825
|
-
function parseNullableDef(def, refs) {
|
|
826
|
-
if (["ZodString", "ZodNumber", "ZodBigInt", "ZodBoolean", "ZodNull"].includes(def.innerType._def.typeName) && (!def.innerType._def.checks || !def.innerType._def.checks.length)) {
|
|
827
|
-
if (refs.target === "openApi3") {
|
|
828
|
-
return {
|
|
829
|
-
type: primitiveMappings[def.innerType._def.typeName],
|
|
830
|
-
nullable: true
|
|
831
|
-
};
|
|
832
|
-
}
|
|
833
|
-
return {
|
|
834
|
-
type: [
|
|
835
|
-
primitiveMappings[def.innerType._def.typeName],
|
|
836
|
-
"null"
|
|
837
|
-
]
|
|
838
|
-
};
|
|
839
|
-
}
|
|
840
|
-
if (refs.target === "openApi3") {
|
|
841
|
-
const base2 = parseDef(def.innerType._def, {
|
|
842
|
-
...refs,
|
|
843
|
-
currentPath: [...refs.currentPath]
|
|
844
|
-
});
|
|
845
|
-
if (base2 && "$ref" in base2)
|
|
846
|
-
return { allOf: [base2], nullable: true };
|
|
847
|
-
return base2 && { ...base2, nullable: true };
|
|
848
|
-
}
|
|
849
|
-
const base = parseDef(def.innerType._def, {
|
|
850
|
-
...refs,
|
|
851
|
-
currentPath: [...refs.currentPath, "anyOf", "0"]
|
|
852
|
-
});
|
|
853
|
-
return base && { anyOf: [base, { type: "null" }] };
|
|
854
|
-
}
|
|
855
|
-
|
|
856
|
-
// ../../node_modules/zod-to-json-schema/dist/esm/parsers/number.js
|
|
857
|
-
function parseNumberDef(def, refs) {
|
|
858
|
-
const res = {
|
|
859
|
-
type: "number"
|
|
860
|
-
};
|
|
861
|
-
if (!def.checks)
|
|
862
|
-
return res;
|
|
863
|
-
for (const check of def.checks) {
|
|
864
|
-
switch (check.kind) {
|
|
865
|
-
case "int":
|
|
866
|
-
res.type = "integer";
|
|
867
|
-
addErrorMessage(res, "type", check.message, refs);
|
|
868
|
-
break;
|
|
869
|
-
case "min":
|
|
870
|
-
if (refs.target === "jsonSchema7") {
|
|
871
|
-
if (check.inclusive) {
|
|
872
|
-
setResponseValueAndErrors(res, "minimum", check.value, check.message, refs);
|
|
873
|
-
} else {
|
|
874
|
-
setResponseValueAndErrors(res, "exclusiveMinimum", check.value, check.message, refs);
|
|
875
|
-
}
|
|
876
|
-
} else {
|
|
877
|
-
if (!check.inclusive) {
|
|
878
|
-
res.exclusiveMinimum = true;
|
|
879
|
-
}
|
|
880
|
-
setResponseValueAndErrors(res, "minimum", check.value, check.message, refs);
|
|
881
|
-
}
|
|
882
|
-
break;
|
|
883
|
-
case "max":
|
|
884
|
-
if (refs.target === "jsonSchema7") {
|
|
885
|
-
if (check.inclusive) {
|
|
886
|
-
setResponseValueAndErrors(res, "maximum", check.value, check.message, refs);
|
|
887
|
-
} else {
|
|
888
|
-
setResponseValueAndErrors(res, "exclusiveMaximum", check.value, check.message, refs);
|
|
889
|
-
}
|
|
890
|
-
} else {
|
|
891
|
-
if (!check.inclusive) {
|
|
892
|
-
res.exclusiveMaximum = true;
|
|
893
|
-
}
|
|
894
|
-
setResponseValueAndErrors(res, "maximum", check.value, check.message, refs);
|
|
895
|
-
}
|
|
896
|
-
break;
|
|
897
|
-
case "multipleOf":
|
|
898
|
-
setResponseValueAndErrors(res, "multipleOf", check.value, check.message, refs);
|
|
899
|
-
break;
|
|
900
|
-
}
|
|
901
|
-
}
|
|
902
|
-
return res;
|
|
903
|
-
}
|
|
904
|
-
|
|
905
|
-
// ../../node_modules/zod-to-json-schema/dist/esm/parsers/object.js
|
|
906
|
-
import { ZodOptional } from "zod";
|
|
907
|
-
function parseObjectDef(def, refs) {
|
|
908
|
-
const forceOptionalIntoNullable = refs.target === "openAi";
|
|
909
|
-
const result = {
|
|
910
|
-
type: "object",
|
|
911
|
-
properties: {}
|
|
912
|
-
};
|
|
913
|
-
const required = [];
|
|
914
|
-
const shape = def.shape();
|
|
915
|
-
for (const propName in shape) {
|
|
916
|
-
let propDef = shape[propName];
|
|
917
|
-
if (propDef === void 0 || propDef._def === void 0) {
|
|
918
|
-
continue;
|
|
919
|
-
}
|
|
920
|
-
let propOptional = safeIsOptional(propDef);
|
|
921
|
-
if (propOptional && forceOptionalIntoNullable) {
|
|
922
|
-
if (propDef instanceof ZodOptional) {
|
|
923
|
-
propDef = propDef._def.innerType;
|
|
924
|
-
}
|
|
925
|
-
if (!propDef.isNullable()) {
|
|
926
|
-
propDef = propDef.nullable();
|
|
927
|
-
}
|
|
928
|
-
propOptional = false;
|
|
929
|
-
}
|
|
930
|
-
const parsedDef = parseDef(propDef._def, {
|
|
931
|
-
...refs,
|
|
932
|
-
currentPath: [...refs.currentPath, "properties", propName],
|
|
933
|
-
propertyPath: [...refs.currentPath, "properties", propName]
|
|
934
|
-
});
|
|
935
|
-
if (parsedDef === void 0) {
|
|
936
|
-
continue;
|
|
937
|
-
}
|
|
938
|
-
result.properties[propName] = parsedDef;
|
|
939
|
-
if (!propOptional) {
|
|
940
|
-
required.push(propName);
|
|
941
|
-
}
|
|
942
|
-
}
|
|
943
|
-
if (required.length) {
|
|
944
|
-
result.required = required;
|
|
945
|
-
}
|
|
946
|
-
const additionalProperties = decideAdditionalProperties(def, refs);
|
|
947
|
-
if (additionalProperties !== void 0) {
|
|
948
|
-
result.additionalProperties = additionalProperties;
|
|
949
|
-
}
|
|
950
|
-
return result;
|
|
951
|
-
}
|
|
952
|
-
function decideAdditionalProperties(def, refs) {
|
|
953
|
-
if (def.catchall._def.typeName !== "ZodNever") {
|
|
954
|
-
return parseDef(def.catchall._def, {
|
|
955
|
-
...refs,
|
|
956
|
-
currentPath: [...refs.currentPath, "additionalProperties"]
|
|
957
|
-
});
|
|
958
|
-
}
|
|
959
|
-
switch (def.unknownKeys) {
|
|
960
|
-
case "passthrough":
|
|
961
|
-
return refs.allowedAdditionalProperties;
|
|
962
|
-
case "strict":
|
|
963
|
-
return refs.rejectedAdditionalProperties;
|
|
964
|
-
case "strip":
|
|
965
|
-
return refs.removeAdditionalStrategy === "strict" ? refs.allowedAdditionalProperties : refs.rejectedAdditionalProperties;
|
|
966
|
-
}
|
|
967
|
-
}
|
|
968
|
-
function safeIsOptional(schema) {
|
|
969
|
-
try {
|
|
970
|
-
return schema.isOptional();
|
|
971
|
-
} catch {
|
|
972
|
-
return true;
|
|
973
|
-
}
|
|
974
|
-
}
|
|
975
|
-
|
|
976
|
-
// ../../node_modules/zod-to-json-schema/dist/esm/parsers/optional.js
|
|
977
|
-
var parseOptionalDef = (def, refs) => {
|
|
978
|
-
if (refs.currentPath.toString() === refs.propertyPath?.toString()) {
|
|
979
|
-
return parseDef(def.innerType._def, refs);
|
|
980
|
-
}
|
|
981
|
-
const innerSchema = parseDef(def.innerType._def, {
|
|
982
|
-
...refs,
|
|
983
|
-
currentPath: [...refs.currentPath, "anyOf", "1"]
|
|
984
|
-
});
|
|
985
|
-
return innerSchema ? {
|
|
986
|
-
anyOf: [
|
|
987
|
-
{
|
|
988
|
-
not: {}
|
|
989
|
-
},
|
|
990
|
-
innerSchema
|
|
991
|
-
]
|
|
992
|
-
} : {};
|
|
993
|
-
};
|
|
994
|
-
|
|
995
|
-
// ../../node_modules/zod-to-json-schema/dist/esm/parsers/pipeline.js
|
|
996
|
-
var parsePipelineDef = (def, refs) => {
|
|
997
|
-
if (refs.pipeStrategy === "input") {
|
|
998
|
-
return parseDef(def.in._def, refs);
|
|
999
|
-
} else if (refs.pipeStrategy === "output") {
|
|
1000
|
-
return parseDef(def.out._def, refs);
|
|
1001
|
-
}
|
|
1002
|
-
const a = parseDef(def.in._def, {
|
|
1003
|
-
...refs,
|
|
1004
|
-
currentPath: [...refs.currentPath, "allOf", "0"]
|
|
1005
|
-
});
|
|
1006
|
-
const b = parseDef(def.out._def, {
|
|
1007
|
-
...refs,
|
|
1008
|
-
currentPath: [...refs.currentPath, "allOf", a ? "1" : "0"]
|
|
1009
|
-
});
|
|
1010
|
-
return {
|
|
1011
|
-
allOf: [a, b].filter((x) => x !== void 0)
|
|
1012
|
-
};
|
|
1013
|
-
};
|
|
1014
|
-
|
|
1015
|
-
// ../../node_modules/zod-to-json-schema/dist/esm/parsers/promise.js
|
|
1016
|
-
function parsePromiseDef(def, refs) {
|
|
1017
|
-
return parseDef(def.type._def, refs);
|
|
1018
|
-
}
|
|
1019
|
-
|
|
1020
|
-
// ../../node_modules/zod-to-json-schema/dist/esm/parsers/set.js
|
|
1021
|
-
function parseSetDef(def, refs) {
|
|
1022
|
-
const items = parseDef(def.valueType._def, {
|
|
1023
|
-
...refs,
|
|
1024
|
-
currentPath: [...refs.currentPath, "items"]
|
|
1025
|
-
});
|
|
1026
|
-
const schema = {
|
|
1027
|
-
type: "array",
|
|
1028
|
-
uniqueItems: true,
|
|
1029
|
-
items
|
|
1030
|
-
};
|
|
1031
|
-
if (def.minSize) {
|
|
1032
|
-
setResponseValueAndErrors(schema, "minItems", def.minSize.value, def.minSize.message, refs);
|
|
1033
|
-
}
|
|
1034
|
-
if (def.maxSize) {
|
|
1035
|
-
setResponseValueAndErrors(schema, "maxItems", def.maxSize.value, def.maxSize.message, refs);
|
|
1036
|
-
}
|
|
1037
|
-
return schema;
|
|
1038
|
-
}
|
|
1039
|
-
|
|
1040
|
-
// ../../node_modules/zod-to-json-schema/dist/esm/parsers/tuple.js
|
|
1041
|
-
function parseTupleDef(def, refs) {
|
|
1042
|
-
if (def.rest) {
|
|
1043
|
-
return {
|
|
1044
|
-
type: "array",
|
|
1045
|
-
minItems: def.items.length,
|
|
1046
|
-
items: def.items.map((x, i) => parseDef(x._def, {
|
|
1047
|
-
...refs,
|
|
1048
|
-
currentPath: [...refs.currentPath, "items", `${i}`]
|
|
1049
|
-
})).reduce((acc, x) => x === void 0 ? acc : [...acc, x], []),
|
|
1050
|
-
additionalItems: parseDef(def.rest._def, {
|
|
1051
|
-
...refs,
|
|
1052
|
-
currentPath: [...refs.currentPath, "additionalItems"]
|
|
1053
|
-
})
|
|
1054
|
-
};
|
|
1055
|
-
} else {
|
|
1056
|
-
return {
|
|
1057
|
-
type: "array",
|
|
1058
|
-
minItems: def.items.length,
|
|
1059
|
-
maxItems: def.items.length,
|
|
1060
|
-
items: def.items.map((x, i) => parseDef(x._def, {
|
|
1061
|
-
...refs,
|
|
1062
|
-
currentPath: [...refs.currentPath, "items", `${i}`]
|
|
1063
|
-
})).reduce((acc, x) => x === void 0 ? acc : [...acc, x], [])
|
|
1064
|
-
};
|
|
1065
|
-
}
|
|
1066
|
-
}
|
|
1067
|
-
|
|
1068
|
-
// ../../node_modules/zod-to-json-schema/dist/esm/parsers/undefined.js
|
|
1069
|
-
function parseUndefinedDef() {
|
|
1070
|
-
return {
|
|
1071
|
-
not: {}
|
|
1072
|
-
};
|
|
1073
|
-
}
|
|
1074
|
-
|
|
1075
|
-
// ../../node_modules/zod-to-json-schema/dist/esm/parsers/unknown.js
|
|
1076
|
-
function parseUnknownDef() {
|
|
1077
|
-
return {};
|
|
1078
|
-
}
|
|
1079
|
-
|
|
1080
|
-
// ../../node_modules/zod-to-json-schema/dist/esm/parsers/readonly.js
|
|
1081
|
-
var parseReadonlyDef = (def, refs) => {
|
|
1082
|
-
return parseDef(def.innerType._def, refs);
|
|
1083
|
-
};
|
|
1084
|
-
|
|
1085
|
-
// ../../node_modules/zod-to-json-schema/dist/esm/selectParser.js
|
|
1086
|
-
var selectParser = (def, typeName, refs) => {
|
|
1087
|
-
switch (typeName) {
|
|
1088
|
-
case ZodFirstPartyTypeKind3.ZodString:
|
|
1089
|
-
return parseStringDef(def, refs);
|
|
1090
|
-
case ZodFirstPartyTypeKind3.ZodNumber:
|
|
1091
|
-
return parseNumberDef(def, refs);
|
|
1092
|
-
case ZodFirstPartyTypeKind3.ZodObject:
|
|
1093
|
-
return parseObjectDef(def, refs);
|
|
1094
|
-
case ZodFirstPartyTypeKind3.ZodBigInt:
|
|
1095
|
-
return parseBigintDef(def, refs);
|
|
1096
|
-
case ZodFirstPartyTypeKind3.ZodBoolean:
|
|
1097
|
-
return parseBooleanDef();
|
|
1098
|
-
case ZodFirstPartyTypeKind3.ZodDate:
|
|
1099
|
-
return parseDateDef(def, refs);
|
|
1100
|
-
case ZodFirstPartyTypeKind3.ZodUndefined:
|
|
1101
|
-
return parseUndefinedDef();
|
|
1102
|
-
case ZodFirstPartyTypeKind3.ZodNull:
|
|
1103
|
-
return parseNullDef(refs);
|
|
1104
|
-
case ZodFirstPartyTypeKind3.ZodArray:
|
|
1105
|
-
return parseArrayDef(def, refs);
|
|
1106
|
-
case ZodFirstPartyTypeKind3.ZodUnion:
|
|
1107
|
-
case ZodFirstPartyTypeKind3.ZodDiscriminatedUnion:
|
|
1108
|
-
return parseUnionDef(def, refs);
|
|
1109
|
-
case ZodFirstPartyTypeKind3.ZodIntersection:
|
|
1110
|
-
return parseIntersectionDef(def, refs);
|
|
1111
|
-
case ZodFirstPartyTypeKind3.ZodTuple:
|
|
1112
|
-
return parseTupleDef(def, refs);
|
|
1113
|
-
case ZodFirstPartyTypeKind3.ZodRecord:
|
|
1114
|
-
return parseRecordDef(def, refs);
|
|
1115
|
-
case ZodFirstPartyTypeKind3.ZodLiteral:
|
|
1116
|
-
return parseLiteralDef(def, refs);
|
|
1117
|
-
case ZodFirstPartyTypeKind3.ZodEnum:
|
|
1118
|
-
return parseEnumDef(def);
|
|
1119
|
-
case ZodFirstPartyTypeKind3.ZodNativeEnum:
|
|
1120
|
-
return parseNativeEnumDef(def);
|
|
1121
|
-
case ZodFirstPartyTypeKind3.ZodNullable:
|
|
1122
|
-
return parseNullableDef(def, refs);
|
|
1123
|
-
case ZodFirstPartyTypeKind3.ZodOptional:
|
|
1124
|
-
return parseOptionalDef(def, refs);
|
|
1125
|
-
case ZodFirstPartyTypeKind3.ZodMap:
|
|
1126
|
-
return parseMapDef(def, refs);
|
|
1127
|
-
case ZodFirstPartyTypeKind3.ZodSet:
|
|
1128
|
-
return parseSetDef(def, refs);
|
|
1129
|
-
case ZodFirstPartyTypeKind3.ZodLazy:
|
|
1130
|
-
return () => def.getter()._def;
|
|
1131
|
-
case ZodFirstPartyTypeKind3.ZodPromise:
|
|
1132
|
-
return parsePromiseDef(def, refs);
|
|
1133
|
-
case ZodFirstPartyTypeKind3.ZodNaN:
|
|
1134
|
-
case ZodFirstPartyTypeKind3.ZodNever:
|
|
1135
|
-
return parseNeverDef();
|
|
1136
|
-
case ZodFirstPartyTypeKind3.ZodEffects:
|
|
1137
|
-
return parseEffectsDef(def, refs);
|
|
1138
|
-
case ZodFirstPartyTypeKind3.ZodAny:
|
|
1139
|
-
return parseAnyDef();
|
|
1140
|
-
case ZodFirstPartyTypeKind3.ZodUnknown:
|
|
1141
|
-
return parseUnknownDef();
|
|
1142
|
-
case ZodFirstPartyTypeKind3.ZodDefault:
|
|
1143
|
-
return parseDefaultDef(def, refs);
|
|
1144
|
-
case ZodFirstPartyTypeKind3.ZodBranded:
|
|
1145
|
-
return parseBrandedDef(def, refs);
|
|
1146
|
-
case ZodFirstPartyTypeKind3.ZodReadonly:
|
|
1147
|
-
return parseReadonlyDef(def, refs);
|
|
1148
|
-
case ZodFirstPartyTypeKind3.ZodCatch:
|
|
1149
|
-
return parseCatchDef(def, refs);
|
|
1150
|
-
case ZodFirstPartyTypeKind3.ZodPipeline:
|
|
1151
|
-
return parsePipelineDef(def, refs);
|
|
1152
|
-
case ZodFirstPartyTypeKind3.ZodFunction:
|
|
1153
|
-
case ZodFirstPartyTypeKind3.ZodVoid:
|
|
1154
|
-
case ZodFirstPartyTypeKind3.ZodSymbol:
|
|
1155
|
-
return void 0;
|
|
1156
|
-
default:
|
|
1157
|
-
return /* @__PURE__ */ ((_) => void 0)(typeName);
|
|
1158
|
-
}
|
|
1159
|
-
};
|
|
1160
|
-
|
|
1161
|
-
// ../../node_modules/zod-to-json-schema/dist/esm/parseDef.js
|
|
1162
|
-
function parseDef(def, refs, forceResolution = false) {
|
|
1163
|
-
const seenItem = refs.seen.get(def);
|
|
1164
|
-
if (refs.override) {
|
|
1165
|
-
const overrideResult = refs.override?.(def, refs, seenItem, forceResolution);
|
|
1166
|
-
if (overrideResult !== ignoreOverride) {
|
|
1167
|
-
return overrideResult;
|
|
27
|
+
description: "FIX message string to parse"
|
|
1168
28
|
}
|
|
1169
|
-
}
|
|
1170
|
-
|
|
1171
|
-
const seenSchema = get$ref(seenItem, refs);
|
|
1172
|
-
if (seenSchema !== void 0) {
|
|
1173
|
-
return seenSchema;
|
|
1174
|
-
}
|
|
1175
|
-
}
|
|
1176
|
-
const newItem = { def, path: refs.currentPath, jsonSchema: void 0 };
|
|
1177
|
-
refs.seen.set(def, newItem);
|
|
1178
|
-
const jsonSchemaOrGetter = selectParser(def, def.typeName, refs);
|
|
1179
|
-
const jsonSchema = typeof jsonSchemaOrGetter === "function" ? parseDef(jsonSchemaOrGetter(), refs) : jsonSchemaOrGetter;
|
|
1180
|
-
if (jsonSchema) {
|
|
1181
|
-
addMeta(def, refs, jsonSchema);
|
|
1182
|
-
}
|
|
1183
|
-
if (refs.postProcess) {
|
|
1184
|
-
const postProcessResult = refs.postProcess(jsonSchema, def, refs);
|
|
1185
|
-
newItem.jsonSchema = jsonSchema;
|
|
1186
|
-
return postProcessResult;
|
|
1187
|
-
}
|
|
1188
|
-
newItem.jsonSchema = jsonSchema;
|
|
1189
|
-
return jsonSchema;
|
|
1190
|
-
}
|
|
1191
|
-
var get$ref = (item, refs) => {
|
|
1192
|
-
switch (refs.$refStrategy) {
|
|
1193
|
-
case "root":
|
|
1194
|
-
return { $ref: item.path.join("/") };
|
|
1195
|
-
case "relative":
|
|
1196
|
-
return { $ref: getRelativePath(refs.currentPath, item.path) };
|
|
1197
|
-
case "none":
|
|
1198
|
-
case "seen": {
|
|
1199
|
-
if (item.path.length < refs.currentPath.length && item.path.every((value, index) => refs.currentPath[index] === value)) {
|
|
1200
|
-
console.warn(`Recursive reference detected at ${refs.currentPath.join("/")}! Defaulting to any`);
|
|
1201
|
-
return {};
|
|
1202
|
-
}
|
|
1203
|
-
return refs.$refStrategy === "seen" ? {} : void 0;
|
|
1204
|
-
}
|
|
1205
|
-
}
|
|
1206
|
-
};
|
|
1207
|
-
var getRelativePath = (pathA, pathB) => {
|
|
1208
|
-
let i = 0;
|
|
1209
|
-
for (; i < pathA.length && i < pathB.length; i++) {
|
|
1210
|
-
if (pathA[i] !== pathB[i])
|
|
1211
|
-
break;
|
|
1212
|
-
}
|
|
1213
|
-
return [(pathA.length - i).toString(), ...pathB.slice(i)].join("/");
|
|
29
|
+
},
|
|
30
|
+
required: ["fixString"]
|
|
1214
31
|
};
|
|
1215
|
-
var
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
32
|
+
var newOrderSingleInputSchema = {
|
|
33
|
+
type: "object",
|
|
34
|
+
properties: {
|
|
35
|
+
clOrdID: {
|
|
36
|
+
type: "string",
|
|
37
|
+
description: "Client Order ID"
|
|
38
|
+
},
|
|
39
|
+
handlInst: {
|
|
40
|
+
type: "string",
|
|
41
|
+
enum: ["1", "2", "3"],
|
|
42
|
+
description: 'Handling instruction (IMPORTANT: Use the numeric/alphabetic value, not the descriptive name. For example, use "1" for Manual, "2" for Automated, "3" for AutomatedNoIntervention)'
|
|
43
|
+
},
|
|
44
|
+
quantity: {
|
|
45
|
+
type: "number",
|
|
46
|
+
description: "Order quantity"
|
|
47
|
+
},
|
|
48
|
+
price: {
|
|
49
|
+
type: "number",
|
|
50
|
+
description: "Order price"
|
|
51
|
+
},
|
|
52
|
+
ordType: {
|
|
53
|
+
type: "string",
|
|
54
|
+
enum: [
|
|
55
|
+
"1",
|
|
56
|
+
"2",
|
|
57
|
+
"3",
|
|
58
|
+
"4",
|
|
59
|
+
"5",
|
|
60
|
+
"6",
|
|
61
|
+
"7",
|
|
62
|
+
"8",
|
|
63
|
+
"9",
|
|
64
|
+
"A",
|
|
65
|
+
"B",
|
|
66
|
+
"C",
|
|
67
|
+
"D",
|
|
68
|
+
"E",
|
|
69
|
+
"F",
|
|
70
|
+
"G",
|
|
71
|
+
"H",
|
|
72
|
+
"I",
|
|
73
|
+
"J",
|
|
74
|
+
"K",
|
|
75
|
+
"L",
|
|
76
|
+
"M",
|
|
77
|
+
"P",
|
|
78
|
+
"Q",
|
|
79
|
+
"R",
|
|
80
|
+
"S"
|
|
81
|
+
],
|
|
82
|
+
description: 'Order type (IMPORTANT: Use the numeric/alphabetic value, not the descriptive name. For example, use "1" for Market, "2" for Limit, "3" for Stop)'
|
|
83
|
+
},
|
|
84
|
+
side: {
|
|
85
|
+
type: "string",
|
|
86
|
+
enum: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H"],
|
|
87
|
+
description: 'Order side (IMPORTANT: Use the numeric/alphabetic value, not the descriptive name. For example, use "1" for Buy, "2" for Sell, "3" for BuyMinus, "4" for SellPlus, "5" for SellShort, "6" for SellShortExempt, "7" for Undisclosed, "8" for Cross, "9" for CrossShort, "A" for CrossShortExempt, "B" for AsDefined, "C" for Opposite, "D" for Subscribe, "E" for Redeem, "F" for Lend, "G" for Borrow, "H" for SellUndisclosed)'
|
|
88
|
+
},
|
|
89
|
+
symbol: {
|
|
90
|
+
type: "string",
|
|
91
|
+
description: "Trading symbol"
|
|
92
|
+
},
|
|
93
|
+
timeInForce: {
|
|
94
|
+
type: "string",
|
|
95
|
+
enum: ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C"],
|
|
96
|
+
description: 'Time in force (IMPORTANT: Use the numeric/alphabetic value, not the descriptive name. For example, use "0" for Day, "1" for Good Till Cancel, "2" for At Opening, "3" for Immediate or Cancel, "4" for Fill or Kill, "5" for Good Till Crossing, "6" for Good Till Date)'
|
|
1220
97
|
}
|
|
1221
|
-
}
|
|
1222
|
-
|
|
98
|
+
},
|
|
99
|
+
required: ["clOrdID", "quantity", "price", "side", "symbol", "handlInst", "ordType", "timeInForce"]
|
|
1223
100
|
};
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
101
|
+
var marketDataRequestInputSchema = {
|
|
102
|
+
type: "object",
|
|
103
|
+
properties: {
|
|
104
|
+
mdUpdateType: {
|
|
105
|
+
type: "string",
|
|
106
|
+
enum: ["0", "1"],
|
|
107
|
+
description: 'Market data update type (IMPORTANT: Use the numeric/alphabetic value, not the descriptive name. For example, use "0" for FullRefresh, "1" for IncrementalRefresh)'
|
|
108
|
+
},
|
|
109
|
+
symbol: {
|
|
110
|
+
type: "string",
|
|
111
|
+
description: "Trading symbol"
|
|
112
|
+
},
|
|
113
|
+
mdReqID: {
|
|
114
|
+
type: "string",
|
|
115
|
+
description: "Market data request ID"
|
|
116
|
+
},
|
|
117
|
+
subscriptionRequestType: {
|
|
118
|
+
type: "string",
|
|
119
|
+
enum: ["0", "1", "2"],
|
|
120
|
+
description: 'Subscription request type (IMPORTANT: Use the numeric/alphabetic value, not the descriptive name. For example, use "0" for Snapshot + Updates, "1" for Snapshot, "2" for Unsubscribe)'
|
|
121
|
+
},
|
|
122
|
+
mdEntryType: {
|
|
123
|
+
type: "string",
|
|
124
|
+
enum: [
|
|
125
|
+
"0",
|
|
126
|
+
"1",
|
|
127
|
+
"2",
|
|
128
|
+
"3",
|
|
129
|
+
"4",
|
|
130
|
+
"5",
|
|
131
|
+
"6",
|
|
132
|
+
"7",
|
|
133
|
+
"8",
|
|
134
|
+
"9",
|
|
135
|
+
"A",
|
|
136
|
+
"B",
|
|
137
|
+
"C",
|
|
138
|
+
"D",
|
|
139
|
+
"E",
|
|
140
|
+
"F",
|
|
141
|
+
"G",
|
|
142
|
+
"H",
|
|
143
|
+
"J",
|
|
144
|
+
"K",
|
|
145
|
+
"L",
|
|
146
|
+
"M",
|
|
147
|
+
"N",
|
|
148
|
+
"O",
|
|
149
|
+
"P",
|
|
150
|
+
"Q",
|
|
151
|
+
"S",
|
|
152
|
+
"R",
|
|
153
|
+
"T",
|
|
154
|
+
"U",
|
|
155
|
+
"V",
|
|
156
|
+
"W",
|
|
157
|
+
"X",
|
|
158
|
+
"Y",
|
|
159
|
+
"Z",
|
|
160
|
+
"a",
|
|
161
|
+
"b",
|
|
162
|
+
"c",
|
|
163
|
+
"d",
|
|
164
|
+
"e",
|
|
165
|
+
"g",
|
|
166
|
+
"h",
|
|
167
|
+
"i",
|
|
168
|
+
"t"
|
|
169
|
+
],
|
|
170
|
+
description: 'Market data entry type (IMPORTANT: Use the numeric/alphabetic value, not the descriptive name. For example, use "0" for Bid, "1" for Offer, "2" for Trade, "3" for Index Value, "4" for Opening Price)'
|
|
1256
171
|
}
|
|
1257
|
-
}
|
|
1258
|
-
|
|
1259
|
-
combined.$schema = "http://json-schema.org/draft-07/schema#";
|
|
1260
|
-
} else if (refs.target === "jsonSchema2019-09" || refs.target === "openAi") {
|
|
1261
|
-
combined.$schema = "https://json-schema.org/draft/2019-09/schema#";
|
|
1262
|
-
}
|
|
1263
|
-
if (refs.target === "openAi" && ("anyOf" in combined || "oneOf" in combined || "allOf" in combined || "type" in combined && Array.isArray(combined.type))) {
|
|
1264
|
-
console.warn("Warning: OpenAI may not support schemas with unions as roots! Try wrapping it in an object property.");
|
|
1265
|
-
}
|
|
1266
|
-
return combined;
|
|
172
|
+
},
|
|
173
|
+
required: ["symbol", "mdReqID"]
|
|
1267
174
|
};
|
|
1268
|
-
|
|
1269
|
-
// src/MCPLocal.ts
|
|
1270
|
-
import {
|
|
1271
|
-
Field,
|
|
1272
|
-
Fields,
|
|
1273
|
-
HandlInst,
|
|
1274
|
-
MDEntryType,
|
|
1275
|
-
Messages,
|
|
1276
|
-
OrdType,
|
|
1277
|
-
SubscriptionRequestType,
|
|
1278
|
-
TimeInForce
|
|
1279
|
-
} from "fixparser";
|
|
1280
175
|
var MCPLocal = class {
|
|
1281
|
-
logger;
|
|
176
|
+
// private logger: Logger | undefined;
|
|
1282
177
|
parser;
|
|
1283
178
|
server = new Server(
|
|
1284
179
|
{
|
|
@@ -1297,32 +192,37 @@ var MCPLocal = class {
|
|
|
1297
192
|
onReady = void 0;
|
|
1298
193
|
pendingRequests = /* @__PURE__ */ new Map();
|
|
1299
194
|
constructor({ logger, onReady }) {
|
|
1300
|
-
if (logger) this.logger = logger;
|
|
1301
195
|
if (onReady) this.onReady = onReady;
|
|
1302
196
|
}
|
|
1303
197
|
async register(parser) {
|
|
1304
198
|
this.parser = parser;
|
|
1305
199
|
this.parser.addOnMessageCallback((message) => {
|
|
1306
|
-
this.logger?.log({
|
|
1307
|
-
level: "info",
|
|
1308
|
-
message: `FIXParser (MCP): (${parser.protocol?.toUpperCase()}): << received ${message.description}`
|
|
1309
|
-
});
|
|
1310
200
|
const msgType = message.messageType;
|
|
1311
|
-
if (msgType === Messages.MarketDataSnapshotFullRefresh || msgType === Messages.ExecutionReport) {
|
|
1312
|
-
const idField = msgType === Messages.MarketDataSnapshotFullRefresh ? message.getField(Fields.MDReqID) : message.getField(Fields.ClOrdID);
|
|
201
|
+
if (msgType === Messages.MarketDataSnapshotFullRefresh || msgType === Messages.ExecutionReport || msgType === Messages.Reject) {
|
|
202
|
+
const idField = msgType === Messages.MarketDataSnapshotFullRefresh ? message.getField(Fields.MDReqID) : msgType === Messages.Reject ? message.getField(Fields.RefSeqNum) : message.getField(Fields.ClOrdID);
|
|
1313
203
|
if (idField) {
|
|
1314
204
|
const id = idField.value;
|
|
1315
205
|
if (typeof id === "string" || typeof id === "number") {
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
206
|
+
if (msgType === Messages.Reject) {
|
|
207
|
+
const refMsgType = message.getField(Fields.RefMsgType);
|
|
208
|
+
if (refMsgType && refMsgType.value === Messages.NewOrderSingle) {
|
|
209
|
+
const callback = this.pendingRequests.get(String(id));
|
|
210
|
+
if (callback) {
|
|
211
|
+
callback(message);
|
|
212
|
+
this.pendingRequests.delete(String(id));
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
} else {
|
|
216
|
+
const callback = this.pendingRequests.get(String(id));
|
|
217
|
+
if (callback) {
|
|
218
|
+
callback(message);
|
|
219
|
+
this.pendingRequests.delete(String(id));
|
|
220
|
+
}
|
|
1320
221
|
}
|
|
1321
222
|
}
|
|
1322
223
|
}
|
|
1323
224
|
}
|
|
1324
225
|
});
|
|
1325
|
-
this.logger = parser.logger;
|
|
1326
226
|
this.addWorkflows();
|
|
1327
227
|
await this.server.connect(this.transport);
|
|
1328
228
|
if (this.onReady) {
|
|
@@ -1331,19 +231,27 @@ var MCPLocal = class {
|
|
|
1331
231
|
}
|
|
1332
232
|
addWorkflows() {
|
|
1333
233
|
if (!this.parser) {
|
|
1334
|
-
this.logger?.log({
|
|
1335
|
-
level: "error",
|
|
1336
|
-
message: "FIXParser (MCP): -- FIXParser instance not initialized. Ignoring setup of workflows..."
|
|
1337
|
-
});
|
|
1338
234
|
return;
|
|
1339
235
|
}
|
|
1340
236
|
if (!this.server) {
|
|
1341
|
-
this.logger?.log({
|
|
1342
|
-
level: "error",
|
|
1343
|
-
message: "FIXParser (MCP): -- MCP Server not initialized. Ignoring setup of workflows..."
|
|
1344
|
-
});
|
|
1345
237
|
return;
|
|
1346
238
|
}
|
|
239
|
+
const validateArgs = (args, schema) => {
|
|
240
|
+
const result = {};
|
|
241
|
+
for (const [key, propSchema] of Object.entries(schema.properties || {})) {
|
|
242
|
+
const prop = propSchema;
|
|
243
|
+
const value = args?.[key];
|
|
244
|
+
if (prop.required && (value === void 0 || value === null)) {
|
|
245
|
+
throw new Error(`Required property '${key}' is missing`);
|
|
246
|
+
}
|
|
247
|
+
if (value !== void 0) {
|
|
248
|
+
result[key] = value;
|
|
249
|
+
} else if (prop.default !== void 0) {
|
|
250
|
+
result[key] = prop.default;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
return result;
|
|
254
|
+
};
|
|
1347
255
|
this.server.setRequestHandler(ListResourcesRequestSchema, async () => {
|
|
1348
256
|
return {
|
|
1349
257
|
resources: []
|
|
@@ -1355,143 +263,22 @@ var MCPLocal = class {
|
|
|
1355
263
|
{
|
|
1356
264
|
name: "parse",
|
|
1357
265
|
description: "Parses a FIX message and describes it in plain language",
|
|
1358
|
-
inputSchema:
|
|
1359
|
-
z.object({
|
|
1360
|
-
fixString: z.string().describe("FIX message string to parse")
|
|
1361
|
-
}),
|
|
1362
|
-
{ name: "ParseInput" }
|
|
1363
|
-
)
|
|
266
|
+
inputSchema: parseInputSchema
|
|
1364
267
|
},
|
|
1365
268
|
{
|
|
1366
269
|
name: "parseToJSON",
|
|
1367
270
|
description: "Parses a FIX message into JSON",
|
|
1368
|
-
inputSchema:
|
|
1369
|
-
z.object({
|
|
1370
|
-
fixString: z.string().describe("FIX message string to parse")
|
|
1371
|
-
}),
|
|
1372
|
-
{ name: "ParseToJSONInput" }
|
|
1373
|
-
)
|
|
271
|
+
inputSchema: parseToJSONInputSchema
|
|
1374
272
|
},
|
|
1375
273
|
{
|
|
1376
274
|
name: "newOrderSingle",
|
|
1377
275
|
description: "Creates and sends a New Order Single",
|
|
1378
|
-
inputSchema:
|
|
1379
|
-
z.object({
|
|
1380
|
-
clOrdID: z.string().describe("Client Order ID"),
|
|
1381
|
-
handlInst: z.enum(["1", "2", "3"]).default(HandlInst.AutomatedExecutionNoIntervention).optional().describe("Handling instruction"),
|
|
1382
|
-
quantity: z.number().describe("Order quantity"),
|
|
1383
|
-
price: z.number().describe("Order price"),
|
|
1384
|
-
ordType: z.enum([
|
|
1385
|
-
"1",
|
|
1386
|
-
"2",
|
|
1387
|
-
"3",
|
|
1388
|
-
"4",
|
|
1389
|
-
"5",
|
|
1390
|
-
"6",
|
|
1391
|
-
"7",
|
|
1392
|
-
"8",
|
|
1393
|
-
"9",
|
|
1394
|
-
"A",
|
|
1395
|
-
"B",
|
|
1396
|
-
"C",
|
|
1397
|
-
"D",
|
|
1398
|
-
"E",
|
|
1399
|
-
"F",
|
|
1400
|
-
"G",
|
|
1401
|
-
"H",
|
|
1402
|
-
"I",
|
|
1403
|
-
"J",
|
|
1404
|
-
"K",
|
|
1405
|
-
"L",
|
|
1406
|
-
"M",
|
|
1407
|
-
"P",
|
|
1408
|
-
"Q",
|
|
1409
|
-
"R",
|
|
1410
|
-
"S"
|
|
1411
|
-
]).default("1").optional().describe("Order type"),
|
|
1412
|
-
side: z.enum([
|
|
1413
|
-
"1",
|
|
1414
|
-
"2",
|
|
1415
|
-
"3",
|
|
1416
|
-
"4",
|
|
1417
|
-
"5",
|
|
1418
|
-
"6",
|
|
1419
|
-
"7",
|
|
1420
|
-
"8",
|
|
1421
|
-
"9",
|
|
1422
|
-
"A",
|
|
1423
|
-
"B",
|
|
1424
|
-
"C",
|
|
1425
|
-
"D",
|
|
1426
|
-
"E",
|
|
1427
|
-
"F",
|
|
1428
|
-
"G",
|
|
1429
|
-
"H"
|
|
1430
|
-
]).describe("Order side (1=Buy, 2=Sell)"),
|
|
1431
|
-
symbol: z.string().describe("Trading symbol"),
|
|
1432
|
-
timeInForce: z.enum(["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C"]).default(TimeInForce.Day).optional().describe("Time in force")
|
|
1433
|
-
}),
|
|
1434
|
-
{ name: "NewOrderSingleInput" }
|
|
1435
|
-
)
|
|
276
|
+
inputSchema: newOrderSingleInputSchema
|
|
1436
277
|
},
|
|
1437
278
|
{
|
|
1438
279
|
name: "marketDataRequest",
|
|
1439
280
|
description: "Sends a request for Market Data with the given symbol",
|
|
1440
|
-
inputSchema:
|
|
1441
|
-
z.object({
|
|
1442
|
-
mdUpdateType: z.enum(["0", "1"]).default("0").optional().describe("Market data update type"),
|
|
1443
|
-
symbol: z.string().describe("Trading symbol"),
|
|
1444
|
-
mdReqID: z.string().describe("Market data request ID"),
|
|
1445
|
-
subscriptionRequestType: z.enum(["0", "1", "2"]).default(SubscriptionRequestType.SnapshotAndUpdates).optional().describe("Subscription request type"),
|
|
1446
|
-
mdEntryType: z.enum([
|
|
1447
|
-
"0",
|
|
1448
|
-
"1",
|
|
1449
|
-
"2",
|
|
1450
|
-
"3",
|
|
1451
|
-
"4",
|
|
1452
|
-
"5",
|
|
1453
|
-
"6",
|
|
1454
|
-
"7",
|
|
1455
|
-
"8",
|
|
1456
|
-
"9",
|
|
1457
|
-
"A",
|
|
1458
|
-
"B",
|
|
1459
|
-
"C",
|
|
1460
|
-
"D",
|
|
1461
|
-
"E",
|
|
1462
|
-
"F",
|
|
1463
|
-
"G",
|
|
1464
|
-
"H",
|
|
1465
|
-
"J",
|
|
1466
|
-
"K",
|
|
1467
|
-
"L",
|
|
1468
|
-
"M",
|
|
1469
|
-
"N",
|
|
1470
|
-
"O",
|
|
1471
|
-
"P",
|
|
1472
|
-
"Q",
|
|
1473
|
-
"S",
|
|
1474
|
-
"R",
|
|
1475
|
-
"T",
|
|
1476
|
-
"U",
|
|
1477
|
-
"V",
|
|
1478
|
-
"W",
|
|
1479
|
-
"X",
|
|
1480
|
-
"Y",
|
|
1481
|
-
"Z",
|
|
1482
|
-
"a",
|
|
1483
|
-
"b",
|
|
1484
|
-
"c",
|
|
1485
|
-
"d",
|
|
1486
|
-
"e",
|
|
1487
|
-
"g",
|
|
1488
|
-
"h",
|
|
1489
|
-
"i",
|
|
1490
|
-
"t"
|
|
1491
|
-
]).default(MDEntryType.Bid).optional().describe("Market data entry type")
|
|
1492
|
-
}),
|
|
1493
|
-
{ name: "MarketDataRequestInput" }
|
|
1494
|
-
)
|
|
281
|
+
inputSchema: marketDataRequestInputSchema
|
|
1495
282
|
}
|
|
1496
283
|
]
|
|
1497
284
|
};
|
|
@@ -1500,10 +287,8 @@ var MCPLocal = class {
|
|
|
1500
287
|
const { name, arguments: args } = request.params;
|
|
1501
288
|
switch (name) {
|
|
1502
289
|
case "parse": {
|
|
1503
|
-
const { fixString } = z.object({
|
|
1504
|
-
fixString: z.string().describe("FIX message string to parse")
|
|
1505
|
-
}).parse(args || {});
|
|
1506
290
|
try {
|
|
291
|
+
const { fixString } = validateArgs(args, parseInputSchema);
|
|
1507
292
|
const parsedMessage = this.parser?.parse(fixString);
|
|
1508
293
|
if (!parsedMessage || parsedMessage.length === 0) {
|
|
1509
294
|
return {
|
|
@@ -1515,7 +300,8 @@ var MCPLocal = class {
|
|
|
1515
300
|
content: [
|
|
1516
301
|
{
|
|
1517
302
|
type: "text",
|
|
1518
|
-
text:
|
|
303
|
+
text: `${parsedMessage[0].description}
|
|
304
|
+
${parsedMessage[0].messageTypeDescription}`
|
|
1519
305
|
}
|
|
1520
306
|
]
|
|
1521
307
|
};
|
|
@@ -1525,17 +311,15 @@ var MCPLocal = class {
|
|
|
1525
311
|
content: [
|
|
1526
312
|
{
|
|
1527
313
|
type: "text",
|
|
1528
|
-
text:
|
|
314
|
+
text: `Error: ${error instanceof Error ? error.message : "Failed to parse FIX string"}`
|
|
1529
315
|
}
|
|
1530
316
|
]
|
|
1531
317
|
};
|
|
1532
318
|
}
|
|
1533
319
|
}
|
|
1534
320
|
case "parseToJSON": {
|
|
1535
|
-
const { fixString } = z.object({
|
|
1536
|
-
fixString: z.string().describe("FIX message string to parse")
|
|
1537
|
-
}).parse(args || {});
|
|
1538
321
|
try {
|
|
322
|
+
const { fixString } = validateArgs(args, parseToJSONInputSchema);
|
|
1539
323
|
const parsedMessage = this.parser?.parse(fixString);
|
|
1540
324
|
if (!parsedMessage || parsedMessage.length === 0) {
|
|
1541
325
|
return {
|
|
@@ -1547,7 +331,7 @@ var MCPLocal = class {
|
|
|
1547
331
|
content: [
|
|
1548
332
|
{
|
|
1549
333
|
type: "text",
|
|
1550
|
-
text:
|
|
334
|
+
text: `${parsedMessage[0].toFIXJSON()}`
|
|
1551
335
|
}
|
|
1552
336
|
]
|
|
1553
337
|
};
|
|
@@ -1557,217 +341,123 @@ var MCPLocal = class {
|
|
|
1557
341
|
content: [
|
|
1558
342
|
{
|
|
1559
343
|
type: "text",
|
|
1560
|
-
text:
|
|
344
|
+
text: `Error: ${error instanceof Error ? error.message : "Failed to parse FIX string"}`
|
|
1561
345
|
}
|
|
1562
346
|
]
|
|
1563
347
|
};
|
|
1564
348
|
}
|
|
1565
349
|
}
|
|
1566
350
|
case "newOrderSingle": {
|
|
1567
|
-
|
|
1568
|
-
clOrdID
|
|
1569
|
-
|
|
1570
|
-
|
|
1571
|
-
price: z.number().describe("Order price"),
|
|
1572
|
-
ordType: z.enum([
|
|
1573
|
-
"1",
|
|
1574
|
-
"2",
|
|
1575
|
-
"3",
|
|
1576
|
-
"4",
|
|
1577
|
-
"5",
|
|
1578
|
-
"6",
|
|
1579
|
-
"7",
|
|
1580
|
-
"8",
|
|
1581
|
-
"9",
|
|
1582
|
-
"A",
|
|
1583
|
-
"B",
|
|
1584
|
-
"C",
|
|
1585
|
-
"D",
|
|
1586
|
-
"E",
|
|
1587
|
-
"F",
|
|
1588
|
-
"G",
|
|
1589
|
-
"H",
|
|
1590
|
-
"I",
|
|
1591
|
-
"J",
|
|
1592
|
-
"K",
|
|
1593
|
-
"L",
|
|
1594
|
-
"M",
|
|
1595
|
-
"P",
|
|
1596
|
-
"Q",
|
|
1597
|
-
"R",
|
|
1598
|
-
"S"
|
|
1599
|
-
]).default(OrdType.Market).optional().describe("Order type"),
|
|
1600
|
-
side: z.enum([
|
|
1601
|
-
"1",
|
|
1602
|
-
"2",
|
|
1603
|
-
"3",
|
|
1604
|
-
"4",
|
|
1605
|
-
"5",
|
|
1606
|
-
"6",
|
|
1607
|
-
"7",
|
|
1608
|
-
"8",
|
|
1609
|
-
"9",
|
|
1610
|
-
"A",
|
|
1611
|
-
"B",
|
|
1612
|
-
"C",
|
|
1613
|
-
"D",
|
|
1614
|
-
"E",
|
|
1615
|
-
"F",
|
|
1616
|
-
"G",
|
|
1617
|
-
"H"
|
|
1618
|
-
]).describe("Order side (1=Buy, 2=Sell)"),
|
|
1619
|
-
symbol: z.string().describe("Trading symbol"),
|
|
1620
|
-
timeInForce: z.enum(["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C"]).default(TimeInForce.Day).optional().describe("Time in force")
|
|
1621
|
-
}).parse(args || {});
|
|
1622
|
-
const response = new Promise((resolve) => {
|
|
1623
|
-
this.pendingRequests.set(clOrdID, resolve);
|
|
1624
|
-
});
|
|
1625
|
-
const order = this.parser?.createMessage(
|
|
1626
|
-
new Field(Fields.MsgType, Messages.NewOrderSingle),
|
|
1627
|
-
new Field(Fields.MsgSeqNum, this.parser?.getNextTargetMsgSeqNum()),
|
|
1628
|
-
new Field(Fields.SenderCompID, this.parser?.sender),
|
|
1629
|
-
new Field(Fields.TargetCompID, this.parser?.target),
|
|
1630
|
-
new Field(Fields.SendingTime, this.parser?.getTimestamp()),
|
|
1631
|
-
new Field(Fields.ClOrdID, clOrdID),
|
|
1632
|
-
new Field(Fields.Side, side),
|
|
1633
|
-
new Field(Fields.Symbol, symbol),
|
|
1634
|
-
new Field(Fields.OrderQty, quantity),
|
|
1635
|
-
new Field(Fields.Price, price),
|
|
1636
|
-
new Field(Fields.OrdType, ordType),
|
|
1637
|
-
new Field(Fields.HandlInst, handlInst),
|
|
1638
|
-
new Field(Fields.TimeInForce, timeInForce),
|
|
1639
|
-
new Field(Fields.TransactTime, this.parser?.getTimestamp())
|
|
1640
|
-
);
|
|
1641
|
-
if (!this.parser?.connected) {
|
|
1642
|
-
this.logger?.log({
|
|
1643
|
-
level: "error",
|
|
1644
|
-
message: "FIXParser (MCP): -- Not connected. Ignoring message."
|
|
351
|
+
try {
|
|
352
|
+
const { clOrdID, handlInst, quantity, price, ordType, side, symbol, timeInForce } = validateArgs(args, newOrderSingleInputSchema);
|
|
353
|
+
const response = new Promise((resolve) => {
|
|
354
|
+
this.pendingRequests.set(clOrdID, resolve);
|
|
1645
355
|
});
|
|
356
|
+
const order = this.parser?.createMessage(
|
|
357
|
+
new Field(Fields.MsgType, Messages.NewOrderSingle),
|
|
358
|
+
new Field(Fields.MsgSeqNum, this.parser?.getNextTargetMsgSeqNum()),
|
|
359
|
+
new Field(Fields.SenderCompID, this.parser?.sender),
|
|
360
|
+
new Field(Fields.TargetCompID, this.parser?.target),
|
|
361
|
+
new Field(Fields.SendingTime, this.parser?.getTimestamp()),
|
|
362
|
+
new Field(Fields.ClOrdID, clOrdID),
|
|
363
|
+
new Field(Fields.Side, side),
|
|
364
|
+
new Field(Fields.Symbol, symbol),
|
|
365
|
+
new Field(Fields.OrderQty, quantity),
|
|
366
|
+
new Field(Fields.Price, price),
|
|
367
|
+
new Field(Fields.OrdType, ordType),
|
|
368
|
+
new Field(Fields.HandlInst, handlInst),
|
|
369
|
+
new Field(Fields.TimeInForce, timeInForce),
|
|
370
|
+
new Field(Fields.TransactTime, this.parser?.getTimestamp())
|
|
371
|
+
);
|
|
372
|
+
if (!this.parser?.connected) {
|
|
373
|
+
return {
|
|
374
|
+
isError: true,
|
|
375
|
+
content: [
|
|
376
|
+
{
|
|
377
|
+
type: "text",
|
|
378
|
+
text: "Error: Not connected. Ignoring message."
|
|
379
|
+
}
|
|
380
|
+
]
|
|
381
|
+
};
|
|
382
|
+
}
|
|
383
|
+
this.parser?.send(order);
|
|
384
|
+
const fixData = await response;
|
|
385
|
+
return {
|
|
386
|
+
content: [
|
|
387
|
+
{
|
|
388
|
+
type: "text",
|
|
389
|
+
text: fixData.messageType === Messages.Reject ? `Reject message for order ${clOrdID}: ${JSON.stringify(fixData.toFIXJSON())}` : `Execution Report for order ${clOrdID}: ${JSON.stringify(fixData.toFIXJSON())}`
|
|
390
|
+
}
|
|
391
|
+
]
|
|
392
|
+
};
|
|
393
|
+
} catch (error) {
|
|
1646
394
|
return {
|
|
1647
395
|
isError: true,
|
|
1648
396
|
content: [
|
|
1649
397
|
{
|
|
1650
398
|
type: "text",
|
|
1651
|
-
text:
|
|
399
|
+
text: `Error: ${error instanceof Error ? error.message : "Failed to create order"}`
|
|
1652
400
|
}
|
|
1653
401
|
]
|
|
1654
402
|
};
|
|
1655
403
|
}
|
|
1656
|
-
this.parser?.send(order);
|
|
1657
|
-
this.logger?.log({
|
|
1658
|
-
level: "info",
|
|
1659
|
-
message: `FIXParser (MCP): (${this.parser?.protocol?.toUpperCase()}): >> sent ${order?.description}`
|
|
1660
|
-
});
|
|
1661
|
-
const fixData = await response;
|
|
1662
|
-
return {
|
|
1663
|
-
content: [
|
|
1664
|
-
{
|
|
1665
|
-
type: "text",
|
|
1666
|
-
text: `Execution Report for order ${clOrdID}: ${JSON.stringify(fixData.toFIXJSON())}`
|
|
1667
|
-
}
|
|
1668
|
-
]
|
|
1669
|
-
};
|
|
1670
404
|
}
|
|
1671
405
|
case "marketDataRequest": {
|
|
1672
|
-
|
|
1673
|
-
mdUpdateType
|
|
1674
|
-
|
|
1675
|
-
|
|
1676
|
-
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
"1",
|
|
1680
|
-
"2",
|
|
1681
|
-
"3",
|
|
1682
|
-
"4",
|
|
1683
|
-
"5",
|
|
1684
|
-
"6",
|
|
1685
|
-
"7",
|
|
1686
|
-
"8",
|
|
1687
|
-
"9",
|
|
1688
|
-
"A",
|
|
1689
|
-
"B",
|
|
1690
|
-
"C",
|
|
1691
|
-
"D",
|
|
1692
|
-
"E",
|
|
1693
|
-
"F",
|
|
1694
|
-
"G",
|
|
1695
|
-
"H",
|
|
1696
|
-
"J",
|
|
1697
|
-
"K",
|
|
1698
|
-
"L",
|
|
1699
|
-
"M",
|
|
1700
|
-
"N",
|
|
1701
|
-
"O",
|
|
1702
|
-
"P",
|
|
1703
|
-
"Q",
|
|
1704
|
-
"S",
|
|
1705
|
-
"R",
|
|
1706
|
-
"T",
|
|
1707
|
-
"U",
|
|
1708
|
-
"V",
|
|
1709
|
-
"W",
|
|
1710
|
-
"X",
|
|
1711
|
-
"Y",
|
|
1712
|
-
"Z",
|
|
1713
|
-
"a",
|
|
1714
|
-
"b",
|
|
1715
|
-
"c",
|
|
1716
|
-
"d",
|
|
1717
|
-
"e",
|
|
1718
|
-
"g",
|
|
1719
|
-
"h",
|
|
1720
|
-
"i",
|
|
1721
|
-
"t"
|
|
1722
|
-
]).default(MDEntryType.Bid).optional().describe("Market data entry type")
|
|
1723
|
-
}).parse(args || {});
|
|
1724
|
-
const response = new Promise((resolve) => {
|
|
1725
|
-
this.pendingRequests.set(mdReqID, resolve);
|
|
1726
|
-
});
|
|
1727
|
-
const marketDataRequest = this.parser?.createMessage(
|
|
1728
|
-
new Field(Fields.MsgType, Messages.MarketDataRequest),
|
|
1729
|
-
new Field(Fields.SenderCompID, this.parser?.sender),
|
|
1730
|
-
new Field(Fields.MsgSeqNum, this.parser?.getNextTargetMsgSeqNum()),
|
|
1731
|
-
new Field(Fields.TargetCompID, this.parser?.target),
|
|
1732
|
-
new Field(Fields.SendingTime, this.parser?.getTimestamp()),
|
|
1733
|
-
new Field(Fields.MarketDepth, 0),
|
|
1734
|
-
new Field(Fields.MDUpdateType, mdUpdateType),
|
|
1735
|
-
new Field(Fields.NoRelatedSym, 1),
|
|
1736
|
-
new Field(Fields.Symbol, symbol),
|
|
1737
|
-
new Field(Fields.MDReqID, mdReqID),
|
|
1738
|
-
new Field(Fields.SubscriptionRequestType, subscriptionRequestType),
|
|
1739
|
-
new Field(Fields.NoMDEntryTypes, 1),
|
|
1740
|
-
new Field(Fields.MDEntryType, mdEntryType)
|
|
1741
|
-
);
|
|
1742
|
-
if (!this.parser?.connected) {
|
|
1743
|
-
this.logger?.log({
|
|
1744
|
-
level: "error",
|
|
1745
|
-
message: "FIXParser (MCP): -- Not connected. Ignoring message."
|
|
406
|
+
try {
|
|
407
|
+
const { mdUpdateType, symbol, mdReqID, subscriptionRequestType, mdEntryType } = validateArgs(
|
|
408
|
+
args,
|
|
409
|
+
marketDataRequestInputSchema
|
|
410
|
+
);
|
|
411
|
+
const response = new Promise((resolve) => {
|
|
412
|
+
this.pendingRequests.set(mdReqID, resolve);
|
|
1746
413
|
});
|
|
414
|
+
const marketDataRequest = this.parser?.createMessage(
|
|
415
|
+
new Field(Fields.MsgType, Messages.MarketDataRequest),
|
|
416
|
+
new Field(Fields.SenderCompID, this.parser?.sender),
|
|
417
|
+
new Field(Fields.MsgSeqNum, this.parser?.getNextTargetMsgSeqNum()),
|
|
418
|
+
new Field(Fields.TargetCompID, this.parser?.target),
|
|
419
|
+
new Field(Fields.SendingTime, this.parser?.getTimestamp()),
|
|
420
|
+
new Field(Fields.MarketDepth, 0),
|
|
421
|
+
new Field(Fields.MDUpdateType, mdUpdateType),
|
|
422
|
+
new Field(Fields.NoRelatedSym, 1),
|
|
423
|
+
new Field(Fields.Symbol, symbol),
|
|
424
|
+
new Field(Fields.MDReqID, mdReqID),
|
|
425
|
+
new Field(Fields.SubscriptionRequestType, subscriptionRequestType),
|
|
426
|
+
new Field(Fields.NoMDEntryTypes, 1),
|
|
427
|
+
new Field(Fields.MDEntryType, mdEntryType)
|
|
428
|
+
);
|
|
429
|
+
if (!this.parser?.connected) {
|
|
430
|
+
return {
|
|
431
|
+
isError: true,
|
|
432
|
+
content: [
|
|
433
|
+
{
|
|
434
|
+
type: "text",
|
|
435
|
+
text: "Error: Not connected. Ignoring message."
|
|
436
|
+
}
|
|
437
|
+
]
|
|
438
|
+
};
|
|
439
|
+
}
|
|
440
|
+
this.parser?.send(marketDataRequest);
|
|
441
|
+
const fixData = await response;
|
|
442
|
+
return {
|
|
443
|
+
content: [
|
|
444
|
+
{
|
|
445
|
+
type: "text",
|
|
446
|
+
text: `Market data for ${symbol}: ${JSON.stringify(fixData.toFIXJSON())}`
|
|
447
|
+
}
|
|
448
|
+
]
|
|
449
|
+
};
|
|
450
|
+
} catch (error) {
|
|
1747
451
|
return {
|
|
1748
452
|
isError: true,
|
|
1749
453
|
content: [
|
|
1750
454
|
{
|
|
1751
455
|
type: "text",
|
|
1752
|
-
text:
|
|
456
|
+
text: `Error: ${error instanceof Error ? error.message : "Failed to request market data"}`
|
|
1753
457
|
}
|
|
1754
458
|
]
|
|
1755
459
|
};
|
|
1756
460
|
}
|
|
1757
|
-
this.parser?.send(marketDataRequest);
|
|
1758
|
-
this.logger?.log({
|
|
1759
|
-
level: "info",
|
|
1760
|
-
message: `FIXParser (MCP): (${this.parser?.protocol?.toUpperCase()}): >> sent ${marketDataRequest?.description}`
|
|
1761
|
-
});
|
|
1762
|
-
const fixData = await response;
|
|
1763
|
-
return {
|
|
1764
|
-
content: [
|
|
1765
|
-
{
|
|
1766
|
-
type: "text",
|
|
1767
|
-
text: `Market data for ${symbol}: ${JSON.stringify(fixData.toFIXJSON())}`
|
|
1768
|
-
}
|
|
1769
|
-
]
|
|
1770
|
-
};
|
|
1771
461
|
}
|
|
1772
462
|
default:
|
|
1773
463
|
throw new Error(`Unknown tool: ${name}`);
|
|
@@ -1800,7 +490,7 @@ var MCPLocal = class {
|
|
|
1800
490
|
},
|
|
1801
491
|
{
|
|
1802
492
|
name: "newOrderSingle",
|
|
1803
|
-
description: "Creates and sends a New Order Single",
|
|
493
|
+
description: "Creates and sends a New Order Single. IMPORTANT: All parameters must be explicitly provided by the user - no assumptions will be made.",
|
|
1804
494
|
arguments: [
|
|
1805
495
|
{
|
|
1806
496
|
name: "clOrdID",
|
|
@@ -1809,8 +499,8 @@ var MCPLocal = class {
|
|
|
1809
499
|
},
|
|
1810
500
|
{
|
|
1811
501
|
name: "handlInst",
|
|
1812
|
-
description: "Handling instruction",
|
|
1813
|
-
required:
|
|
502
|
+
description: "Handling instruction (1=Manual, 2=Automated, 3=AutomatedNoIntervention)",
|
|
503
|
+
required: true
|
|
1814
504
|
},
|
|
1815
505
|
{
|
|
1816
506
|
name: "quantity",
|
|
@@ -1824,12 +514,12 @@ var MCPLocal = class {
|
|
|
1824
514
|
},
|
|
1825
515
|
{
|
|
1826
516
|
name: "ordType",
|
|
1827
|
-
description: "Order type",
|
|
1828
|
-
required:
|
|
517
|
+
description: "Order type (1=Market, 2=Limit, 3=Stop)",
|
|
518
|
+
required: true
|
|
1829
519
|
},
|
|
1830
520
|
{
|
|
1831
521
|
name: "side",
|
|
1832
|
-
description: "Order side (1=Buy, 2=Sell)",
|
|
522
|
+
description: "Order side (1=Buy, 2=Sell, 3=BuyMinus, 4=SellPlus, 5=SellShort, 6=SellShortExempt, 7=Undisclosed, 8=Cross, 9=CrossShort, A=CrossShortExempt, B=AsDefined, C=Opposite, D=Subscribe, E=Redeem, F=Lend, G=Borrow, H=SellUndisclosed)",
|
|
1833
523
|
required: true
|
|
1834
524
|
},
|
|
1835
525
|
{
|
|
@@ -1839,19 +529,19 @@ var MCPLocal = class {
|
|
|
1839
529
|
},
|
|
1840
530
|
{
|
|
1841
531
|
name: "timeInForce",
|
|
1842
|
-
description: "Time in force",
|
|
1843
|
-
required:
|
|
532
|
+
description: "Time in force (0=Day, 1=Good Till Cancel, 2=At Opening, 3=Immediate or Cancel, 4=Fill or Kill, 5=Good Till Crossing, 6=Good Till Date)",
|
|
533
|
+
required: true
|
|
1844
534
|
}
|
|
1845
535
|
]
|
|
1846
536
|
},
|
|
1847
537
|
{
|
|
1848
538
|
name: "marketDataRequest",
|
|
1849
|
-
description: "Sends a request for Market Data with the given symbol",
|
|
539
|
+
description: "Sends a request for Market Data with the given symbol. IMPORTANT: All parameters must be explicitly provided by the user - no assumptions will be made.",
|
|
1850
540
|
arguments: [
|
|
1851
541
|
{
|
|
1852
542
|
name: "mdUpdateType",
|
|
1853
|
-
description: "Market data update type",
|
|
1854
|
-
required:
|
|
543
|
+
description: "Market data update type (0=FullRefresh, 1=IncrementalRefresh)",
|
|
544
|
+
required: true
|
|
1855
545
|
},
|
|
1856
546
|
{
|
|
1857
547
|
name: "symbol",
|
|
@@ -1865,13 +555,13 @@ var MCPLocal = class {
|
|
|
1865
555
|
},
|
|
1866
556
|
{
|
|
1867
557
|
name: "subscriptionRequestType",
|
|
1868
|
-
description: "Subscription request type",
|
|
1869
|
-
required:
|
|
558
|
+
description: "Subscription request type (0=Snapshot + Updates, 1=Snapshot, 2=Unsubscribe)",
|
|
559
|
+
required: true
|
|
1870
560
|
},
|
|
1871
561
|
{
|
|
1872
562
|
name: "mdEntryType",
|
|
1873
|
-
description: "Market data entry type",
|
|
1874
|
-
required:
|
|
563
|
+
description: "Market data entry type (0=Bid, 1=Offer, 2=Trade, 3=Index Value, 4=Opening Price)",
|
|
564
|
+
required: true
|
|
1875
565
|
}
|
|
1876
566
|
]
|
|
1877
567
|
}
|
|
@@ -1918,17 +608,37 @@ var MCPLocal = class {
|
|
|
1918
608
|
content: {
|
|
1919
609
|
type: "text",
|
|
1920
610
|
text: [
|
|
1921
|
-
"
|
|
611
|
+
"You are an AI assistant that helps users create FIX New Order Single messages.",
|
|
612
|
+
"You must **first verify** that all required fields are provided:",
|
|
613
|
+
"- ClOrdID (Client Order ID)",
|
|
614
|
+
"- HandlInst (1=Manual, 2=Automated, 3=AutomatedNoIntervention)",
|
|
615
|
+
"- Quantity (Order quantity)",
|
|
616
|
+
"- Price (Order price)",
|
|
617
|
+
"- OrdType (1=Market, 2=Limit, 3=Stop)",
|
|
618
|
+
"- Side (1=Buy, 2=Sell, 3=BuyMinus, 4=SellPlus, 5=SellShort, 6=SellShortExempt, 7=Undisclosed, 8=Cross, 9=CrossShort, A=CrossShortExempt, B=AsDefined, C=Opposite, D=Subscribe, E=Redeem, F=Lend, G=Borrow, H=SellUndisclosed)",
|
|
619
|
+
"- Symbol (Trading symbol)",
|
|
620
|
+
"- TimeInForce (0=Day, 1=Good Till Cancel, 2=At Opening, 3=Immediate or Cancel, 4=Fill or Kill, 5=Good Till Crossing, 6=Good Till Date)",
|
|
621
|
+
"",
|
|
622
|
+
"Only when all fields are present and valid, respond with:",
|
|
623
|
+
"`VERIFICATION: All parameters valid. Ready to proceed.`",
|
|
624
|
+
"",
|
|
625
|
+
"Otherwise, list the missing or invalid ones.",
|
|
626
|
+
"",
|
|
627
|
+
"Do not create the FIX message until verification is complete.",
|
|
628
|
+
"",
|
|
629
|
+
"Current parameters:",
|
|
1922
630
|
`- ClOrdID: ${clOrdID}`,
|
|
1923
|
-
`- HandlInst: ${handlInst
|
|
631
|
+
`- HandlInst: ${handlInst}`,
|
|
1924
632
|
`- Quantity: ${quantity}`,
|
|
1925
633
|
`- Price: ${price}`,
|
|
1926
|
-
`- OrdType: ${ordType
|
|
634
|
+
`- OrdType: ${ordType}`,
|
|
1927
635
|
`- Side: ${side}`,
|
|
1928
636
|
`- Symbol: ${symbol}`,
|
|
1929
|
-
`- TimeInForce: ${timeInForce
|
|
637
|
+
`- TimeInForce: ${timeInForce}`,
|
|
1930
638
|
"",
|
|
1931
|
-
"
|
|
639
|
+
"IMPORTANT: The response will be either:",
|
|
640
|
+
"1. An Execution Report (MsgType=8) if the order was successfully placed",
|
|
641
|
+
"2. A Reject message (MsgType=3) if the order failed to execute (e.g., due to missing or invalid parameters)"
|
|
1932
642
|
].join("\n")
|
|
1933
643
|
}
|
|
1934
644
|
}
|
|
@@ -1944,14 +654,27 @@ var MCPLocal = class {
|
|
|
1944
654
|
content: {
|
|
1945
655
|
type: "text",
|
|
1946
656
|
text: [
|
|
1947
|
-
"
|
|
1948
|
-
|
|
657
|
+
"You are an AI assistant that helps users create FIX Market Data Request messages.",
|
|
658
|
+
"You must **first verify** that all required fields are provided:",
|
|
659
|
+
"- MDUpdateType (0=FullRefresh, 1=IncrementalRefresh)",
|
|
660
|
+
"- Symbol (Trading symbol)",
|
|
661
|
+
"- MDReqID (Market data request ID)",
|
|
662
|
+
"- SubscriptionRequestType (0=Snapshot + Updates, 1=Snapshot, 2=Unsubscribe)",
|
|
663
|
+
"- MDEntryType (0=Bid, 1=Offer, 2=Trade, 3=Index Value, 4=Opening Price)",
|
|
664
|
+
"",
|
|
665
|
+
"Only when all fields are present and valid, respond with:",
|
|
666
|
+
"`VERIFICATION: All parameters valid. Ready to proceed.`",
|
|
667
|
+
"",
|
|
668
|
+
"Otherwise, list the missing or invalid ones.",
|
|
669
|
+
"",
|
|
670
|
+
"Do not create the FIX message until verification is complete.",
|
|
671
|
+
"",
|
|
672
|
+
"Current parameters:",
|
|
673
|
+
`- MDUpdateType: ${mdUpdateType}`,
|
|
1949
674
|
`- Symbol: ${symbol}`,
|
|
1950
675
|
`- MDReqID: ${mdReqID}`,
|
|
1951
|
-
`- SubscriptionRequestType: ${subscriptionRequestType
|
|
1952
|
-
`- MDEntryType: ${mdEntryType
|
|
1953
|
-
"",
|
|
1954
|
-
"Format the response as a JSON object with FIX tag numbers as keys and their corresponding values."
|
|
676
|
+
`- SubscriptionRequestType: ${subscriptionRequestType}`,
|
|
677
|
+
`- MDEntryType: ${mdEntryType}`
|
|
1955
678
|
].join("\n")
|
|
1956
679
|
}
|
|
1957
680
|
}
|