@ai37/lift-calc-schemas 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs ADDED
@@ -0,0 +1,134 @@
1
+ 'use strict';
2
+
3
+ var zod = require('zod');
4
+
5
+ // src/types.ts
6
+ function isRequired(field) {
7
+ return field.default === void 0 && !field.auto;
8
+ }
9
+
10
+ // src/registry.ts
11
+ var Q_OPTIONS_34758 = [
12
+ 450,
13
+ 630,
14
+ 800,
15
+ 1e3,
16
+ 1275,
17
+ 1350,
18
+ 1600,
19
+ 1800,
20
+ 2e3,
21
+ 2500
22
+ ];
23
+ var DOORWIDTH_OPTIONS_34758 = [800, 900, 1e3, 1100, 1200];
24
+ var VN_OPTIONS_52941 = [0.63, 1, 1.6, 2.5, 4];
25
+ var FIELDS_52941 = [
26
+ { key: "N", section: "building", kind: "int", min: 1, label: "\u0427\u0438\u0441\u043B\u043E \u0437\u0430\u0441\u0435\u043B\u0451\u043D\u043D\u044B\u0445 \u044D\u0442\u0430\u0436\u0435\u0439", describe: "\u0427\u0438\u0441\u043B\u043E \u0437\u0430\u0441\u0435\u043B\u0451\u043D\u043D\u044B\u0445 \u044D\u0442\u0430\u0436\u0435\u0439 \u0437\u0434\u0430\u043D\u0438\u044F" },
27
+ { key: "A", section: "building", kind: "int", min: 1, label: "\u0416\u0438\u043B\u044C\u0446\u044B \u0432\u0441\u0435\u0433\u043E \u0437\u0434\u0430\u043D\u0438\u044F, \u0447\u0435\u043B.", describe: "\u041E\u0431\u0449\u0435\u0435 \u0447\u0438\u0441\u043B\u043E \u0436\u0438\u043B\u044C\u0446\u043E\u0432 \u0437\u0434\u0430\u043D\u0438\u044F" },
28
+ { key: "hf", section: "building", kind: "number", default: 2.8, label: "\u0412\u044B\u0441\u043E\u0442\u0430 \u044D\u0442\u0430\u0436\u0430, \u043C", describe: "\u0412\u044B\u0441\u043E\u0442\u0430 \u044D\u0442\u0430\u0436\u0430, \u043C" },
29
+ { key: "i", section: "building", kind: "number", default: 8, min: 0, max: 100, label: "\u0418\u043D\u0442\u0435\u043D\u0441\u0438\u0432\u043D\u043E\u0441\u0442\u044C \u043F\u0430\u0441\u0441\u0430\u0436\u0438\u0440\u043E\u043F\u043E\u0442\u043E\u043A\u0430, %", describe: "\u0420\u0430\u0441\u0447\u0451\u0442\u043D\u0430\u044F \u0438\u043D\u0442\u0435\u043D\u0441\u0438\u0432\u043D\u043E\u0441\u0442\u044C \u043F\u0430\u0441\u0441\u0430\u0436\u0438\u0440\u043E\u043F\u043E\u0442\u043E\u043A\u0430, % (4\u20138 \u0434\u043B\u044F \u0436\u0438\u043B\u044B\u0445)" },
30
+ { key: "kp", section: "building", kind: "number", default: 0.7, min: 0, max: 1, label: "\u041A\u043E\u044D\u0444. \u0432\u0435\u0440\u043E\u044F\u0442\u043D\u043E\u0439 \u0432\u044B\u0441\u043E\u0442\u044B \u043F\u043E\u0434\u044A\u0451\u043C\u0430", describe: "\u041A\u043E\u044D\u0444\u0444\u0438\u0446\u0438\u0435\u043D\u0442 \u0432\u0435\u0440\u043E\u044F\u0442\u043D\u043E\u0439 \u0432\u044B\u0441\u043E\u0442\u044B \u043F\u043E\u0434\u044A\u0451\u043C\u0430 (0,7\u20130,9)" },
31
+ { key: "kt", section: "building", kind: "number", default: 1.05, min: 1, max: 2, label: "\u041A\u043E\u044D\u0444. \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u043F\u043E\u0442\u0435\u0440\u044C", describe: "\u041A\u043E\u044D\u0444\u0444\u0438\u0446\u0438\u0435\u043D\u0442 \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u043F\u043E\u0442\u0435\u0440\u044C \u0432\u0440\u0435\u043C\u0435\u043D\u0438 (1,05\u20131,10)" },
32
+ { key: "gammaUp", section: "building", kind: "number", default: 0.8, min: 0, max: 1, label: "\u041A\u043E\u044D\u0444. \u0437\u0430\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F \u043F\u0440\u0438 \u043F\u043E\u0434\u044A\u0451\u043C\u0435", describe: "\u041A\u043E\u044D\u0444\u0444\u0438\u0446\u0438\u0435\u043D\u0442 \u0437\u0430\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F \u043A\u0430\u0431\u0438\u043D\u044B \u043F\u0440\u0438 \u043F\u043E\u0434\u044A\u0451\u043C\u0435" },
33
+ { key: "gammaDown", section: "building", kind: "number", default: 0.4, min: 0, max: 1, label: "\u041A\u043E\u044D\u0444. \u0437\u0430\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F \u043F\u0440\u0438 \u0441\u043F\u0443\u0441\u043A\u0435", describe: "\u041A\u043E\u044D\u0444\u0444\u0438\u0446\u0438\u0435\u043D\u0442 \u0437\u0430\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F \u043A\u0430\u0431\u0438\u043D\u044B \u043F\u0440\u0438 \u0441\u043F\u0443\u0441\u043A\u0435" },
34
+ { key: "nLifts", section: "building", kind: "int", default: 1, min: 1, max: 10, label: "\u0427\u0438\u0441\u043B\u043E \u043B\u0438\u0444\u0442\u043E\u0432 \u0432 \u0433\u0440\u0443\u043F\u043F\u0435", describe: "\u0427\u0438\u0441\u043B\u043E \u043E\u0434\u0438\u043D\u0430\u043A\u043E\u0432\u044B\u0445 \u043B\u0438\u0444\u0442\u043E\u0432 \u0432 \u0433\u0440\u0443\u043F\u043F\u0435" },
35
+ { key: "Q", section: "lift", kind: "number", default: 1e3, min: 1, label: "\u0413\u0440\u0443\u0437\u043E\u043F\u043E\u0434\u044A\u0451\u043C\u043D\u043E\u0441\u0442\u044C, \u043A\u0433", describe: "\u0413\u0440\u0443\u0437\u043E\u043F\u043E\u0434\u044A\u0451\u043C\u043D\u043E\u0441\u0442\u044C \u043A\u0430\u0431\u0438\u043D\u044B, \u043A\u0433 (\u0442\u0438\u043F\u043E\u0432\u044B\u0435 400 / 630 / 1000)" },
36
+ { key: "Vn", section: "lift", kind: "enum-number", allowed: VN_OPTIONS_52941, default: 1, label: "\u041D\u043E\u043C\u0438\u043D\u0430\u043B\u044C\u043D\u0430\u044F \u0441\u043A\u043E\u0440\u043E\u0441\u0442\u044C, \u043C/\u0441", describe: "\u041D\u043E\u043C\u0438\u043D\u0430\u043B\u044C\u043D\u0430\u044F \u0441\u043A\u043E\u0440\u043E\u0441\u0442\u044C, \u043C/\u0441 (0,63 / 1,0 / 1,6 / 2,5 / 4,0)" },
37
+ { key: "H0", section: "lift", kind: "number", default: 0, label: "\u041E\u0442\u043C\u0435\u0442\u043A\u0430 \u043D\u0438\u0436\u043D\u0435\u0439 \u043E\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0438, \u043C", describe: "\u041E\u0442\u043C\u0435\u0442\u043A\u0430 \u043D\u0438\u0436\u043D\u0435\u0439 \u043E\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0438, \u043C" },
38
+ { key: "Nn", section: "lift", kind: "int", default: 0, min: 0, label: "\u042D\u0442\u0430\u0436\u0435\u0439 \u0431\u0435\u0437 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u044F \u043B\u0438\u0444\u0442\u043E\u043C", describe: "\u0427\u0438\u0441\u043B\u043E \u043D\u0438\u0436\u043D\u0438\u0445 \u044D\u0442\u0430\u0436\u0435\u0439 \u0431\u0435\u0437 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u044F \u043B\u0438\u0444\u0442\u043E\u043C" },
39
+ { key: "h", section: "lift", kind: "number", auto: true, min: 0, label: "\u041F\u0443\u0442\u044C \u0440\u0430\u0437\u0433\u043E\u043D\u0430/\u0442\u043E\u0440\u043C\u043E\u0436\u0435\u043D\u0438\u044F, \u043C", describe: "\u041F\u0443\u0442\u044C \u0440\u0430\u0437\u0433\u043E\u043D\u0430/\u0442\u043E\u0440\u043C\u043E\u0436\u0435\u043D\u0438\u044F, \u043C (\u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E \u0438\u0437 \u0442\u0430\u0431\u043B\u0438\u0446\u044B \u043F\u043E \u0441\u043A\u043E\u0440\u043E\u0441\u0442\u0438)" },
40
+ { key: "t123", section: "lift", kind: "number", auto: true, min: 0, label: "\u041F\u043E\u0442\u0435\u0440\u0438 t1+t2+t3, \u0441", describe: "\u041F\u043E\u0442\u0435\u0440\u0438 \u0432\u0440\u0435\u043C\u0435\u043D\u0438 t1+t2+t3, \u0441 (\u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E \u0438\u0437 \u0442\u0430\u0431\u043B\u0438\u0446\u044B \u043F\u043E \u0441\u043A\u043E\u0440\u043E\u0441\u0442\u0438)" },
41
+ { key: "dt", section: "lift", kind: "number", default: 1, min: 0, label: "\u0412\u0440\u0435\u043C\u044F \u043D\u0430 \u043E\u0434\u043D\u043E\u0433\u043E \u043F\u0430\u0441\u0441\u0430\u0436\u0438\u0440\u0430, \u0441", describe: "\u0412\u0440\u0435\u043C\u044F \u043D\u0430 \u0432\u0445\u043E\u0434/\u0432\u044B\u0445\u043E\u0434 \u043E\u0434\u043D\u043E\u0433\u043E \u043F\u0430\u0441\u0441\u0430\u0436\u0438\u0440\u0430, \u0441" }
42
+ ];
43
+ var FIELDS_34758 = [
44
+ { key: "buildingType", section: "building", kind: "enum-string", allowed: ["residential", "hotel", "office"], label: "\u0422\u0438\u043F \u0437\u0434\u0430\u043D\u0438\u044F", describe: "\u0422\u0438\u043F \u0437\u0434\u0430\u043D\u0438\u044F: residential (\u0436\u0438\u043B\u043E\u0435) / hotel (\u0433\u043E\u0441\u0442\u0438\u043D\u0438\u0446\u0430) / office (\u043E\u0444\u0438\u0441)" },
45
+ { key: "N1", section: "building", kind: "int", min: 2, label: "\u0427\u0438\u0441\u043B\u043E \u043E\u0431\u0441\u043B\u0443\u0436\u0438\u0432\u0430\u0435\u043C\u044B\u0445 \u044D\u0442\u0430\u0436\u0435\u0439", describe: "\u0427\u0438\u0441\u043B\u043E \u043E\u0431\u0441\u043B\u0443\u0436\u0438\u0432\u0430\u0435\u043C\u044B\u0445 \u043B\u0438\u0444\u0442\u043E\u043C \u044D\u0442\u0430\u0436\u0435\u0439" },
46
+ { key: "A", section: "building", kind: "int", min: 1, label: "\u0417\u0430\u0441\u0435\u043B\u0451\u043D\u043D\u043E\u0441\u0442\u044C \u0437\u0434\u0430\u043D\u0438\u044F, \u0447\u0435\u043B.", describe: "\u0420\u0430\u0441\u0447\u0451\u0442\u043D\u0430\u044F \u0437\u0430\u0441\u0435\u043B\u0451\u043D\u043D\u043E\u0441\u0442\u044C \u0437\u0434\u0430\u043D\u0438\u044F, \u0447\u0435\u043B." },
47
+ { key: "Nl", section: "building", kind: "int", min: 1, label: "\u0427\u0438\u0441\u043B\u043E \u043B\u0438\u0444\u0442\u043E\u0432 \u0432 \u0433\u0440\u0443\u043F\u043F\u0435", describe: "\u0427\u0438\u0441\u043B\u043E \u043E\u0434\u0438\u043D\u0430\u043A\u043E\u0432\u044B\u0445 \u043B\u0438\u0444\u0442\u043E\u0432 \u0432 \u0433\u0440\u0443\u043F\u043F\u0435" },
48
+ { key: "hf", section: "building", kind: "number", default: 3.3, min: 0, label: "\u0412\u044B\u0441\u043E\u0442\u0430 \u044D\u0442\u0430\u0436\u0430, \u043C", describe: "\u0412\u044B\u0441\u043E\u0442\u0430 \u044D\u0442\u0430\u0436\u0430, \u043C" },
49
+ { key: "Q", section: "lift", kind: "enum-number", allowed: Q_OPTIONS_34758, default: 1e3, label: "\u0413\u0440\u0443\u0437\u043E\u043F\u043E\u0434\u044A\u0451\u043C\u043D\u043E\u0441\u0442\u044C, \u043A\u0433", describe: "\u0413\u0440\u0443\u0437\u043E\u043F\u043E\u0434\u044A\u0451\u043C\u043D\u043E\u0441\u0442\u044C \u0438\u0437 \u0440\u044F\u0434\u0430 450/630/800/1000/1275/1350/1600/1800/2000/2500, \u043A\u0433" },
50
+ { key: "Vn", section: "lift", kind: "number", min: 0, label: "\u041D\u043E\u043C\u0438\u043D\u0430\u043B\u044C\u043D\u0430\u044F \u0441\u043A\u043E\u0440\u043E\u0441\u0442\u044C, \u043C/\u0441", describe: "\u041D\u043E\u043C\u0438\u043D\u0430\u043B\u044C\u043D\u0430\u044F \u0441\u043A\u043E\u0440\u043E\u0441\u0442\u044C, \u043C/\u0441" },
51
+ { key: "doorWidth", section: "lift", kind: "enum-number", allowed: DOORWIDTH_OPTIONS_34758, label: "\u0428\u0438\u0440\u0438\u043D\u0430 \u0434\u0432\u0435\u0440\u043D\u043E\u0433\u043E \u043F\u0440\u043E\u0451\u043C\u0430, \u043C\u043C", describe: "\u0428\u0438\u0440\u0438\u043D\u0430 \u0434\u0432\u0435\u0440\u043D\u043E\u0433\u043E \u043F\u0440\u043E\u0451\u043C\u0430 \u0438\u0437 \u0440\u044F\u0434\u0430 800/900/1000/1100/1200, \u043C\u043C" },
52
+ { key: "tOst", section: "lift", kind: "number", auto: true, min: 0, label: "\u0412\u0440\u0435\u043C\u044F \u043D\u0430 \u043E\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0443, \u0441", describe: "\u0412\u0440\u0435\u043C\u044F \u043D\u0430 \u043E\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0443, \u0441 (\u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E \u0430\u0432\u0442\u043E \u043F\u043E \u041F\u0440\u0438\u043B. \u0415 \u0438\u0437 \u0448\u0438\u0440\u0438\u043D\u044B \u0434\u0432\u0435\u0440\u0438, \u0441\u043A\u043E\u0440\u043E\u0441\u0442\u0438 \u0438 \u0442\u0438\u043F\u0430 \u0437\u0434\u0430\u043D\u0438\u044F)" },
53
+ { key: "Pk", section: "lift", kind: "number", auto: true, min: 0, label: "\u0420\u0430\u0441\u0447\u0451\u0442\u043D\u0430\u044F \u0432\u043C\u0435\u0441\u0442\u0438\u043C\u043E\u0441\u0442\u044C, \u0447\u0435\u043B.", describe: "\u0420\u0430\u0441\u0447\u0451\u0442\u043D\u0430\u044F \u0432\u043C\u0435\u0441\u0442\u0438\u043C\u043E\u0441\u0442\u044C \u043A\u0430\u0431\u0438\u043D\u044B (\u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E \u0430\u0432\u0442\u043E round(E\xB70,8) \u043F\u043E \u0433\u0440\u0443\u0437\u043E\u043F\u043E\u0434\u044A\u0451\u043C\u043D\u043E\u0441\u0442\u0438)" }
54
+ ];
55
+ var REGISTRY = {
56
+ "52941": FIELDS_52941,
57
+ "34758": FIELDS_34758
58
+ };
59
+ function baseZod(field) {
60
+ switch (field.kind) {
61
+ case "int": {
62
+ let s = zod.z.number().int();
63
+ if (field.min !== void 0) s = s.min(field.min);
64
+ if (field.max !== void 0) s = s.max(field.max);
65
+ return s;
66
+ }
67
+ case "number": {
68
+ let s = zod.z.number();
69
+ if (field.min !== void 0) s = s.min(field.min);
70
+ if (field.max !== void 0) s = s.max(field.max);
71
+ return s;
72
+ }
73
+ case "enum-number": {
74
+ const opts = field.allowed ?? [];
75
+ const literals = opts.map((v) => zod.z.literal(v));
76
+ return zod.z.union(
77
+ literals
78
+ );
79
+ }
80
+ case "enum-string": {
81
+ const opts = field.allowed ?? [];
82
+ return zod.z.enum(opts);
83
+ }
84
+ }
85
+ }
86
+ function fieldZod(field) {
87
+ const base = baseZod(field).describe(field.describe);
88
+ if (field.default !== void 0) return base.default(field.default);
89
+ if (field.auto) return base.optional();
90
+ return base;
91
+ }
92
+ function buildShape(fields) {
93
+ const shape = {};
94
+ for (const field of fields) shape[field.key] = fieldZod(field);
95
+ return shape;
96
+ }
97
+ var shape52941 = buildShape(FIELDS_52941);
98
+ var shape34758 = buildShape(FIELDS_34758);
99
+ var schema52941 = zod.z.object(shape52941);
100
+ var schema34758 = zod.z.object(shape34758);
101
+ var SHAPES = { "52941": shape52941, "34758": shape34758 };
102
+ var SCHEMAS = { "52941": schema52941, "34758": schema34758 };
103
+ function inputJsonSchema(gost) {
104
+ return zod.z.toJSONSchema(SCHEMAS[gost], { target: "draft-7", io: "input" });
105
+ }
106
+ function requiredFields(gost) {
107
+ return REGISTRY[gost].filter(isRequired);
108
+ }
109
+ function collectMissing(gost, values) {
110
+ return requiredFields(gost).filter((f) => values[f.key] === void 0 || values[f.key] === null).map((f) => ({
111
+ field: f.key,
112
+ label: f.label,
113
+ ...f.allowed ? { allowed: f.allowed } : {}
114
+ }));
115
+ }
116
+
117
+ exports.DOORWIDTH_OPTIONS_34758 = DOORWIDTH_OPTIONS_34758;
118
+ exports.FIELDS_34758 = FIELDS_34758;
119
+ exports.FIELDS_52941 = FIELDS_52941;
120
+ exports.Q_OPTIONS_34758 = Q_OPTIONS_34758;
121
+ exports.REGISTRY = REGISTRY;
122
+ exports.SCHEMAS = SCHEMAS;
123
+ exports.SHAPES = SHAPES;
124
+ exports.VN_OPTIONS_52941 = VN_OPTIONS_52941;
125
+ exports.collectMissing = collectMissing;
126
+ exports.inputJsonSchema = inputJsonSchema;
127
+ exports.isRequired = isRequired;
128
+ exports.requiredFields = requiredFields;
129
+ exports.schema34758 = schema34758;
130
+ exports.schema52941 = schema52941;
131
+ exports.shape34758 = shape34758;
132
+ exports.shape52941 = shape52941;
133
+ //# sourceMappingURL=index.cjs.map
134
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types.ts","../src/registry.ts","../src/schemas.ts"],"names":["z"],"mappings":"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","file":"index.cjs","sourcesContent":["/** Идентификатор методики расчёта. */\nexport type GostId = '52941' | '34758';\n\n/** Раздел документа расчёта, к которому относится поле. */\nexport type FieldSection = 'building' | 'lift';\n\n/**\n * Тип значения поля (задаёт построение zod и JSON Schema):\n * - `int` / `number` — числовое (с опциональными min/max);\n * - `enum-number` — число из фиксированного ряда ГОСТ (union литералов → JSON Schema enum);\n * - `enum-string` — строка из фиксированного набора.\n */\nexport type FieldKind = 'int' | 'number' | 'enum-number' | 'enum-string';\n\n/**\n * Единый дескриптор поля расчёта — SOURCE OF TRUTH. Из него генерятся: zod-схема structured-tool,\n * JSON Schema для `skillsIo.input`, список обязательных полей для `collectMissing`, метки формы.\n *\n * Классификация обязательности (одно правило, устраняет рассинхрон):\n * - `default !== undefined` → типовое значение, пользователь может не задавать;\n * - `auto: true` → производное значение (elevator доставит: VN_TABLE / lookupTost / Pk), optional;\n * - иначе → ОБЯЗАТЕЛЬНОЕ (пользователь должен задать). См. `isRequired`.\n */\nexport interface FieldDescriptor {\n key: string;\n section: FieldSection;\n /** Человекочитаемая метка (форма, сообщения об ошибке). */\n label: string;\n /** Описание для zod `.describe()` / JSON Schema `description` (видит LLM). */\n describe: string;\n kind: FieldKind;\n /** Допустимые значения (для enum-*). */\n allowed?: readonly (number | string)[];\n /** Статический типовой дефолт. */\n default?: number | string;\n /** Производное значение — optional в схеме, проставляется агентом до расчёта. */\n auto?: boolean;\n min?: number;\n max?: number;\n}\n\n/** Поле, отсутствующее во вводе (для структурной ошибки валидации и `collectMissing`). */\nexport interface MissingField {\n field: string;\n label: string;\n allowed?: readonly (number | string)[];\n}\n\n/** Поле обязательно к вводу пользователем: нет ни статического дефолта, ни авто-производности. */\nexport function isRequired(field: FieldDescriptor): boolean {\n return field.default === undefined && !field.auto;\n}\n","import type { FieldDescriptor } from './types';\n\n/** Ряд грузоподъёмностей ГОСТ 34758 (Табл. Г.1), кг. */\nexport const Q_OPTIONS_34758 = [\n 450, 630, 800, 1000, 1275, 1350, 1600, 1800, 2000, 2500,\n] as const;\n\n/** Ряд ширин дверного проёма ГОСТ 34758, мм. */\nexport const DOORWIDTH_OPTIONS_34758 = [800, 900, 1000, 1100, 1200] as const;\n\n/** Номинальные скорости с табличными h/t123 (ГОСТ Р 52941, VN_TABLE), м/с. */\nexport const VN_OPTIONS_52941 = [0.63, 1.0, 1.6, 2.5, 4.0] as const;\n\n/**\n * Реестр полей ГОСТ Р 52941-2008 (жилые здания). Плоский набор (здание + один типовой лифт;\n * `nLifts` задаёт число одинаковых кабин в группе). Обязательны только N и A — остальное имеет\n * типовые дефолты или производится автоматически (h/t123 из скорости).\n */\nexport const FIELDS_52941: readonly FieldDescriptor[] = [\n { key: 'N', section: 'building', kind: 'int', min: 1, label: 'Число заселённых этажей', describe: 'Число заселённых этажей здания' },\n { key: 'A', section: 'building', kind: 'int', min: 1, label: 'Жильцы всего здания, чел.', describe: 'Общее число жильцов здания' },\n { key: 'hf', section: 'building', kind: 'number', default: 2.8, label: 'Высота этажа, м', describe: 'Высота этажа, м' },\n { key: 'i', section: 'building', kind: 'number', default: 8, min: 0, max: 100, label: 'Интенсивность пассажиропотока, %', describe: 'Расчётная интенсивность пассажиропотока, % (4–8 для жилых)' },\n { key: 'kp', section: 'building', kind: 'number', default: 0.7, min: 0, max: 1, label: 'Коэф. вероятной высоты подъёма', describe: 'Коэффициент вероятной высоты подъёма (0,7–0,9)' },\n { key: 'kt', section: 'building', kind: 'number', default: 1.05, min: 1, max: 2, label: 'Коэф. дополнительных потерь', describe: 'Коэффициент дополнительных потерь времени (1,05–1,10)' },\n { key: 'gammaUp', section: 'building', kind: 'number', default: 0.8, min: 0, max: 1, label: 'Коэф. заполнения при подъёме', describe: 'Коэффициент заполнения кабины при подъёме' },\n { key: 'gammaDown', section: 'building', kind: 'number', default: 0.4, min: 0, max: 1, label: 'Коэф. заполнения при спуске', describe: 'Коэффициент заполнения кабины при спуске' },\n\n { key: 'nLifts', section: 'building', kind: 'int', default: 1, min: 1, max: 10, label: 'Число лифтов в группе', describe: 'Число одинаковых лифтов в группе' },\n { key: 'Q', section: 'lift', kind: 'number', default: 1000, min: 1, label: 'Грузоподъёмность, кг', describe: 'Грузоподъёмность кабины, кг (типовые 400 / 630 / 1000)' },\n { key: 'Vn', section: 'lift', kind: 'enum-number', allowed: VN_OPTIONS_52941, default: 1.0, label: 'Номинальная скорость, м/с', describe: 'Номинальная скорость, м/с (0,63 / 1,0 / 1,6 / 2,5 / 4,0)' },\n { key: 'H0', section: 'lift', kind: 'number', default: 0, label: 'Отметка нижней остановки, м', describe: 'Отметка нижней остановки, м' },\n { key: 'Nn', section: 'lift', kind: 'int', default: 0, min: 0, label: 'Этажей без пользования лифтом', describe: 'Число нижних этажей без пользования лифтом' },\n { key: 'h', section: 'lift', kind: 'number', auto: true, min: 0, label: 'Путь разгона/торможения, м', describe: 'Путь разгона/торможения, м (по умолчанию из таблицы по скорости)' },\n { key: 't123', section: 'lift', kind: 'number', auto: true, min: 0, label: 'Потери t1+t2+t3, с', describe: 'Потери времени t1+t2+t3, с (по умолчанию из таблицы по скорости)' },\n { key: 'dt', section: 'lift', kind: 'number', default: 1, min: 0, label: 'Время на одного пассажира, с', describe: 'Время на вход/выход одного пассажира, с' },\n];\n\n/**\n * Реестр полей ГОСТ 34758-2021 (жилые / гостиницы / офисы). Одна лифтовая группа (`Nl` одинаковых\n * лифтов). `buildingType` — дискриминатор нежилых типов, влияет на авто-`tOst` (Прил. Е). Обязательны\n * тип здания, N1/A/Nl, скорость и ширина двери; `tOst`/`Pk` производятся автоматически.\n */\nexport const FIELDS_34758: readonly FieldDescriptor[] = [\n { key: 'buildingType', section: 'building', kind: 'enum-string', allowed: ['residential', 'hotel', 'office'], label: 'Тип здания', describe: 'Тип здания: residential (жилое) / hotel (гостиница) / office (офис)' },\n { key: 'N1', section: 'building', kind: 'int', min: 2, label: 'Число обслуживаемых этажей', describe: 'Число обслуживаемых лифтом этажей' },\n { key: 'A', section: 'building', kind: 'int', min: 1, label: 'Заселённость здания, чел.', describe: 'Расчётная заселённость здания, чел.' },\n { key: 'Nl', section: 'building', kind: 'int', min: 1, label: 'Число лифтов в группе', describe: 'Число одинаковых лифтов в группе' },\n { key: 'hf', section: 'building', kind: 'number', default: 3.3, min: 0, label: 'Высота этажа, м', describe: 'Высота этажа, м' },\n\n { key: 'Q', section: 'lift', kind: 'enum-number', allowed: Q_OPTIONS_34758, default: 1000, label: 'Грузоподъёмность, кг', describe: 'Грузоподъёмность из ряда 450/630/800/1000/1275/1350/1600/1800/2000/2500, кг' },\n { key: 'Vn', section: 'lift', kind: 'number', min: 0, label: 'Номинальная скорость, м/с', describe: 'Номинальная скорость, м/с' },\n { key: 'doorWidth', section: 'lift', kind: 'enum-number', allowed: DOORWIDTH_OPTIONS_34758, label: 'Ширина дверного проёма, мм', describe: 'Ширина дверного проёма из ряда 800/900/1000/1100/1200, мм' },\n { key: 'tOst', section: 'lift', kind: 'number', auto: true, min: 0, label: 'Время на остановку, с', describe: 'Время на остановку, с (по умолчанию авто по Прил. Е из ширины двери, скорости и типа здания)' },\n { key: 'Pk', section: 'lift', kind: 'number', auto: true, min: 0, label: 'Расчётная вместимость, чел.', describe: 'Расчётная вместимость кабины (по умолчанию авто round(E·0,8) по грузоподъёмности)' },\n];\n\n/** Реестр по идентификатору ГОСТ. */\nexport const REGISTRY = {\n '52941': FIELDS_52941,\n '34758': FIELDS_34758,\n} as const;\n","import { z } from 'zod';\nimport { FIELDS_52941, FIELDS_34758, REGISTRY } from './registry';\nimport { isRequired, type FieldDescriptor, type GostId, type MissingField } from './types';\n\n/** Базовый zod-тип поля (без учёта обязательности). */\nfunction baseZod(field: FieldDescriptor): z.ZodTypeAny {\n switch (field.kind) {\n case 'int': {\n let s = z.number().int();\n if (field.min !== undefined) s = s.min(field.min);\n if (field.max !== undefined) s = s.max(field.max);\n return s;\n }\n case 'number': {\n let s = z.number();\n if (field.min !== undefined) s = s.min(field.min);\n if (field.max !== undefined) s = s.max(field.max);\n return s;\n }\n case 'enum-number': {\n const opts = (field.allowed ?? []) as readonly number[];\n const literals = opts.map((v) => z.literal(v));\n return z.union(\n literals as [z.ZodLiteral<number>, z.ZodLiteral<number>, ...z.ZodLiteral<number>[]],\n );\n }\n case 'enum-string': {\n const opts = (field.allowed ?? []) as readonly string[];\n return z.enum(opts as [string, ...string[]]);\n }\n }\n}\n\n/** Поле → zod с учётом обязательности: default → типовое; auto → optional; иначе обязательное. */\nfunction fieldZod(field: FieldDescriptor): z.ZodTypeAny {\n const base = baseZod(field).describe(field.describe);\n if (field.default !== undefined) return base.default(field.default);\n if (field.auto) return base.optional();\n return base;\n}\n\nfunction buildShape(fields: readonly FieldDescriptor[]): z.ZodRawShape {\n // zod 4: ZodRawShape — readonly index signature, собираем в mutable и приводим на возврате.\n const shape: Record<string, z.ZodTypeAny> = {};\n for (const field of fields) shape[field.key] = fieldZod(field);\n return shape;\n}\n\n/** Zod raw shape (для `inputSchema` MCP-tool). */\nexport const shape52941 = buildShape(FIELDS_52941);\nexport const shape34758 = buildShape(FIELDS_34758);\n\n/** Zod-объекты (для валидации структурного входа). */\nexport const schema52941 = z.object(shape52941);\nexport const schema34758 = z.object(shape34758);\n\nexport const SHAPES = { '52941': shape52941, '34758': shape34758 } as const;\nexport const SCHEMAS = { '52941': schema52941, '34758': schema34758 } as const;\n\n/** JSON Schema входа для публикации в `x-ai37.skillsIo[...].input` (карточка агента). */\nexport function inputJsonSchema(gost: GostId): Record<string, unknown> {\n // Нативный генератор zod 4 (draft-7). `io: 'input'` — учитывать дефолты как опциональные во входе.\n return z.toJSONSchema(SCHEMAS[gost], { target: 'draft-7', io: 'input' }) as Record<\n string,\n unknown\n >;\n}\n\n/** Обязательные поля ГОСТ (нет ни статического дефолта, ни авто-производности). */\nexport function requiredFields(gost: GostId): FieldDescriptor[] {\n return REGISTRY[gost].filter(isRequired);\n}\n\n/**\n * Обязательные поля без значения — единый источник для `collectMissing` (диалог) и структурной\n * ошибки валидации (MCP). Значение считается заданным, если оно не `undefined`/`null`.\n */\nexport function collectMissing(\n gost: GostId,\n values: Record<string, unknown>,\n): MissingField[] {\n return requiredFields(gost)\n .filter((f) => values[f.key] === undefined || values[f.key] === null)\n .map((f) => ({\n field: f.key,\n label: f.label,\n ...(f.allowed ? { allowed: f.allowed } : {}),\n }));\n}\n"]}
@@ -0,0 +1,113 @@
1
+ import { z } from 'zod';
2
+
3
+ /** Идентификатор методики расчёта. */
4
+ type GostId = '52941' | '34758';
5
+ /** Раздел документа расчёта, к которому относится поле. */
6
+ type FieldSection = 'building' | 'lift';
7
+ /**
8
+ * Тип значения поля (задаёт построение zod и JSON Schema):
9
+ * - `int` / `number` — числовое (с опциональными min/max);
10
+ * - `enum-number` — число из фиксированного ряда ГОСТ (union литералов → JSON Schema enum);
11
+ * - `enum-string` — строка из фиксированного набора.
12
+ */
13
+ type FieldKind = 'int' | 'number' | 'enum-number' | 'enum-string';
14
+ /**
15
+ * Единый дескриптор поля расчёта — SOURCE OF TRUTH. Из него генерятся: zod-схема structured-tool,
16
+ * JSON Schema для `skillsIo.input`, список обязательных полей для `collectMissing`, метки формы.
17
+ *
18
+ * Классификация обязательности (одно правило, устраняет рассинхрон):
19
+ * - `default !== undefined` → типовое значение, пользователь может не задавать;
20
+ * - `auto: true` → производное значение (elevator доставит: VN_TABLE / lookupTost / Pk), optional;
21
+ * - иначе → ОБЯЗАТЕЛЬНОЕ (пользователь должен задать). См. `isRequired`.
22
+ */
23
+ interface FieldDescriptor {
24
+ key: string;
25
+ section: FieldSection;
26
+ /** Человекочитаемая метка (форма, сообщения об ошибке). */
27
+ label: string;
28
+ /** Описание для zod `.describe()` / JSON Schema `description` (видит LLM). */
29
+ describe: string;
30
+ kind: FieldKind;
31
+ /** Допустимые значения (для enum-*). */
32
+ allowed?: readonly (number | string)[];
33
+ /** Статический типовой дефолт. */
34
+ default?: number | string;
35
+ /** Производное значение — optional в схеме, проставляется агентом до расчёта. */
36
+ auto?: boolean;
37
+ min?: number;
38
+ max?: number;
39
+ }
40
+ /** Поле, отсутствующее во вводе (для структурной ошибки валидации и `collectMissing`). */
41
+ interface MissingField {
42
+ field: string;
43
+ label: string;
44
+ allowed?: readonly (number | string)[];
45
+ }
46
+ /** Поле обязательно к вводу пользователем: нет ни статического дефолта, ни авто-производности. */
47
+ declare function isRequired(field: FieldDescriptor): boolean;
48
+
49
+ /** Ряд грузоподъёмностей ГОСТ 34758 (Табл. Г.1), кг. */
50
+ declare const Q_OPTIONS_34758: readonly [450, 630, 800, 1000, 1275, 1350, 1600, 1800, 2000, 2500];
51
+ /** Ряд ширин дверного проёма ГОСТ 34758, мм. */
52
+ declare const DOORWIDTH_OPTIONS_34758: readonly [800, 900, 1000, 1100, 1200];
53
+ /** Номинальные скорости с табличными h/t123 (ГОСТ Р 52941, VN_TABLE), м/с. */
54
+ declare const VN_OPTIONS_52941: readonly [0.63, 1, 1.6, 2.5, 4];
55
+ /**
56
+ * Реестр полей ГОСТ Р 52941-2008 (жилые здания). Плоский набор (здание + один типовой лифт;
57
+ * `nLifts` задаёт число одинаковых кабин в группе). Обязательны только N и A — остальное имеет
58
+ * типовые дефолты или производится автоматически (h/t123 из скорости).
59
+ */
60
+ declare const FIELDS_52941: readonly FieldDescriptor[];
61
+ /**
62
+ * Реестр полей ГОСТ 34758-2021 (жилые / гостиницы / офисы). Одна лифтовая группа (`Nl` одинаковых
63
+ * лифтов). `buildingType` — дискриминатор нежилых типов, влияет на авто-`tOst` (Прил. Е). Обязательны
64
+ * тип здания, N1/A/Nl, скорость и ширина двери; `tOst`/`Pk` производятся автоматически.
65
+ */
66
+ declare const FIELDS_34758: readonly FieldDescriptor[];
67
+ /** Реестр по идентификатору ГОСТ. */
68
+ declare const REGISTRY: {
69
+ readonly '52941': readonly FieldDescriptor[];
70
+ readonly '34758': readonly FieldDescriptor[];
71
+ };
72
+
73
+ /** Zod raw shape (для `inputSchema` MCP-tool). */
74
+ declare const shape52941: Readonly<{
75
+ [k: string]: z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>;
76
+ }>;
77
+ declare const shape34758: Readonly<{
78
+ [k: string]: z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>;
79
+ }>;
80
+ /** Zod-объекты (для валидации структурного входа). */
81
+ declare const schema52941: z.ZodObject<{
82
+ [x: string]: z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>;
83
+ }, z.core.$strip>;
84
+ declare const schema34758: z.ZodObject<{
85
+ [x: string]: z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>;
86
+ }, z.core.$strip>;
87
+ declare const SHAPES: {
88
+ readonly '52941': Readonly<{
89
+ [k: string]: z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>;
90
+ }>;
91
+ readonly '34758': Readonly<{
92
+ [k: string]: z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>;
93
+ }>;
94
+ };
95
+ declare const SCHEMAS: {
96
+ readonly '52941': z.ZodObject<{
97
+ [x: string]: z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>;
98
+ }, z.core.$strip>;
99
+ readonly '34758': z.ZodObject<{
100
+ [x: string]: z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>;
101
+ }, z.core.$strip>;
102
+ };
103
+ /** JSON Schema входа для публикации в `x-ai37.skillsIo[...].input` (карточка агента). */
104
+ declare function inputJsonSchema(gost: GostId): Record<string, unknown>;
105
+ /** Обязательные поля ГОСТ (нет ни статического дефолта, ни авто-производности). */
106
+ declare function requiredFields(gost: GostId): FieldDescriptor[];
107
+ /**
108
+ * Обязательные поля без значения — единый источник для `collectMissing` (диалог) и структурной
109
+ * ошибки валидации (MCP). Значение считается заданным, если оно не `undefined`/`null`.
110
+ */
111
+ declare function collectMissing(gost: GostId, values: Record<string, unknown>): MissingField[];
112
+
113
+ export { DOORWIDTH_OPTIONS_34758, FIELDS_34758, FIELDS_52941, type FieldDescriptor, type FieldKind, type FieldSection, type GostId, type MissingField, Q_OPTIONS_34758, REGISTRY, SCHEMAS, SHAPES, VN_OPTIONS_52941, collectMissing, inputJsonSchema, isRequired, requiredFields, schema34758, schema52941, shape34758, shape52941 };
@@ -0,0 +1,113 @@
1
+ import { z } from 'zod';
2
+
3
+ /** Идентификатор методики расчёта. */
4
+ type GostId = '52941' | '34758';
5
+ /** Раздел документа расчёта, к которому относится поле. */
6
+ type FieldSection = 'building' | 'lift';
7
+ /**
8
+ * Тип значения поля (задаёт построение zod и JSON Schema):
9
+ * - `int` / `number` — числовое (с опциональными min/max);
10
+ * - `enum-number` — число из фиксированного ряда ГОСТ (union литералов → JSON Schema enum);
11
+ * - `enum-string` — строка из фиксированного набора.
12
+ */
13
+ type FieldKind = 'int' | 'number' | 'enum-number' | 'enum-string';
14
+ /**
15
+ * Единый дескриптор поля расчёта — SOURCE OF TRUTH. Из него генерятся: zod-схема structured-tool,
16
+ * JSON Schema для `skillsIo.input`, список обязательных полей для `collectMissing`, метки формы.
17
+ *
18
+ * Классификация обязательности (одно правило, устраняет рассинхрон):
19
+ * - `default !== undefined` → типовое значение, пользователь может не задавать;
20
+ * - `auto: true` → производное значение (elevator доставит: VN_TABLE / lookupTost / Pk), optional;
21
+ * - иначе → ОБЯЗАТЕЛЬНОЕ (пользователь должен задать). См. `isRequired`.
22
+ */
23
+ interface FieldDescriptor {
24
+ key: string;
25
+ section: FieldSection;
26
+ /** Человекочитаемая метка (форма, сообщения об ошибке). */
27
+ label: string;
28
+ /** Описание для zod `.describe()` / JSON Schema `description` (видит LLM). */
29
+ describe: string;
30
+ kind: FieldKind;
31
+ /** Допустимые значения (для enum-*). */
32
+ allowed?: readonly (number | string)[];
33
+ /** Статический типовой дефолт. */
34
+ default?: number | string;
35
+ /** Производное значение — optional в схеме, проставляется агентом до расчёта. */
36
+ auto?: boolean;
37
+ min?: number;
38
+ max?: number;
39
+ }
40
+ /** Поле, отсутствующее во вводе (для структурной ошибки валидации и `collectMissing`). */
41
+ interface MissingField {
42
+ field: string;
43
+ label: string;
44
+ allowed?: readonly (number | string)[];
45
+ }
46
+ /** Поле обязательно к вводу пользователем: нет ни статического дефолта, ни авто-производности. */
47
+ declare function isRequired(field: FieldDescriptor): boolean;
48
+
49
+ /** Ряд грузоподъёмностей ГОСТ 34758 (Табл. Г.1), кг. */
50
+ declare const Q_OPTIONS_34758: readonly [450, 630, 800, 1000, 1275, 1350, 1600, 1800, 2000, 2500];
51
+ /** Ряд ширин дверного проёма ГОСТ 34758, мм. */
52
+ declare const DOORWIDTH_OPTIONS_34758: readonly [800, 900, 1000, 1100, 1200];
53
+ /** Номинальные скорости с табличными h/t123 (ГОСТ Р 52941, VN_TABLE), м/с. */
54
+ declare const VN_OPTIONS_52941: readonly [0.63, 1, 1.6, 2.5, 4];
55
+ /**
56
+ * Реестр полей ГОСТ Р 52941-2008 (жилые здания). Плоский набор (здание + один типовой лифт;
57
+ * `nLifts` задаёт число одинаковых кабин в группе). Обязательны только N и A — остальное имеет
58
+ * типовые дефолты или производится автоматически (h/t123 из скорости).
59
+ */
60
+ declare const FIELDS_52941: readonly FieldDescriptor[];
61
+ /**
62
+ * Реестр полей ГОСТ 34758-2021 (жилые / гостиницы / офисы). Одна лифтовая группа (`Nl` одинаковых
63
+ * лифтов). `buildingType` — дискриминатор нежилых типов, влияет на авто-`tOst` (Прил. Е). Обязательны
64
+ * тип здания, N1/A/Nl, скорость и ширина двери; `tOst`/`Pk` производятся автоматически.
65
+ */
66
+ declare const FIELDS_34758: readonly FieldDescriptor[];
67
+ /** Реестр по идентификатору ГОСТ. */
68
+ declare const REGISTRY: {
69
+ readonly '52941': readonly FieldDescriptor[];
70
+ readonly '34758': readonly FieldDescriptor[];
71
+ };
72
+
73
+ /** Zod raw shape (для `inputSchema` MCP-tool). */
74
+ declare const shape52941: Readonly<{
75
+ [k: string]: z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>;
76
+ }>;
77
+ declare const shape34758: Readonly<{
78
+ [k: string]: z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>;
79
+ }>;
80
+ /** Zod-объекты (для валидации структурного входа). */
81
+ declare const schema52941: z.ZodObject<{
82
+ [x: string]: z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>;
83
+ }, z.core.$strip>;
84
+ declare const schema34758: z.ZodObject<{
85
+ [x: string]: z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>;
86
+ }, z.core.$strip>;
87
+ declare const SHAPES: {
88
+ readonly '52941': Readonly<{
89
+ [k: string]: z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>;
90
+ }>;
91
+ readonly '34758': Readonly<{
92
+ [k: string]: z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>;
93
+ }>;
94
+ };
95
+ declare const SCHEMAS: {
96
+ readonly '52941': z.ZodObject<{
97
+ [x: string]: z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>;
98
+ }, z.core.$strip>;
99
+ readonly '34758': z.ZodObject<{
100
+ [x: string]: z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>;
101
+ }, z.core.$strip>;
102
+ };
103
+ /** JSON Schema входа для публикации в `x-ai37.skillsIo[...].input` (карточка агента). */
104
+ declare function inputJsonSchema(gost: GostId): Record<string, unknown>;
105
+ /** Обязательные поля ГОСТ (нет ни статического дефолта, ни авто-производности). */
106
+ declare function requiredFields(gost: GostId): FieldDescriptor[];
107
+ /**
108
+ * Обязательные поля без значения — единый источник для `collectMissing` (диалог) и структурной
109
+ * ошибки валидации (MCP). Значение считается заданным, если оно не `undefined`/`null`.
110
+ */
111
+ declare function collectMissing(gost: GostId, values: Record<string, unknown>): MissingField[];
112
+
113
+ export { DOORWIDTH_OPTIONS_34758, FIELDS_34758, FIELDS_52941, type FieldDescriptor, type FieldKind, type FieldSection, type GostId, type MissingField, Q_OPTIONS_34758, REGISTRY, SCHEMAS, SHAPES, VN_OPTIONS_52941, collectMissing, inputJsonSchema, isRequired, requiredFields, schema34758, schema52941, shape34758, shape52941 };
package/dist/index.js ADDED
@@ -0,0 +1,117 @@
1
+ import { z } from 'zod';
2
+
3
+ // src/types.ts
4
+ function isRequired(field) {
5
+ return field.default === void 0 && !field.auto;
6
+ }
7
+
8
+ // src/registry.ts
9
+ var Q_OPTIONS_34758 = [
10
+ 450,
11
+ 630,
12
+ 800,
13
+ 1e3,
14
+ 1275,
15
+ 1350,
16
+ 1600,
17
+ 1800,
18
+ 2e3,
19
+ 2500
20
+ ];
21
+ var DOORWIDTH_OPTIONS_34758 = [800, 900, 1e3, 1100, 1200];
22
+ var VN_OPTIONS_52941 = [0.63, 1, 1.6, 2.5, 4];
23
+ var FIELDS_52941 = [
24
+ { key: "N", section: "building", kind: "int", min: 1, label: "\u0427\u0438\u0441\u043B\u043E \u0437\u0430\u0441\u0435\u043B\u0451\u043D\u043D\u044B\u0445 \u044D\u0442\u0430\u0436\u0435\u0439", describe: "\u0427\u0438\u0441\u043B\u043E \u0437\u0430\u0441\u0435\u043B\u0451\u043D\u043D\u044B\u0445 \u044D\u0442\u0430\u0436\u0435\u0439 \u0437\u0434\u0430\u043D\u0438\u044F" },
25
+ { key: "A", section: "building", kind: "int", min: 1, label: "\u0416\u0438\u043B\u044C\u0446\u044B \u0432\u0441\u0435\u0433\u043E \u0437\u0434\u0430\u043D\u0438\u044F, \u0447\u0435\u043B.", describe: "\u041E\u0431\u0449\u0435\u0435 \u0447\u0438\u0441\u043B\u043E \u0436\u0438\u043B\u044C\u0446\u043E\u0432 \u0437\u0434\u0430\u043D\u0438\u044F" },
26
+ { key: "hf", section: "building", kind: "number", default: 2.8, label: "\u0412\u044B\u0441\u043E\u0442\u0430 \u044D\u0442\u0430\u0436\u0430, \u043C", describe: "\u0412\u044B\u0441\u043E\u0442\u0430 \u044D\u0442\u0430\u0436\u0430, \u043C" },
27
+ { key: "i", section: "building", kind: "number", default: 8, min: 0, max: 100, label: "\u0418\u043D\u0442\u0435\u043D\u0441\u0438\u0432\u043D\u043E\u0441\u0442\u044C \u043F\u0430\u0441\u0441\u0430\u0436\u0438\u0440\u043E\u043F\u043E\u0442\u043E\u043A\u0430, %", describe: "\u0420\u0430\u0441\u0447\u0451\u0442\u043D\u0430\u044F \u0438\u043D\u0442\u0435\u043D\u0441\u0438\u0432\u043D\u043E\u0441\u0442\u044C \u043F\u0430\u0441\u0441\u0430\u0436\u0438\u0440\u043E\u043F\u043E\u0442\u043E\u043A\u0430, % (4\u20138 \u0434\u043B\u044F \u0436\u0438\u043B\u044B\u0445)" },
28
+ { key: "kp", section: "building", kind: "number", default: 0.7, min: 0, max: 1, label: "\u041A\u043E\u044D\u0444. \u0432\u0435\u0440\u043E\u044F\u0442\u043D\u043E\u0439 \u0432\u044B\u0441\u043E\u0442\u044B \u043F\u043E\u0434\u044A\u0451\u043C\u0430", describe: "\u041A\u043E\u044D\u0444\u0444\u0438\u0446\u0438\u0435\u043D\u0442 \u0432\u0435\u0440\u043E\u044F\u0442\u043D\u043E\u0439 \u0432\u044B\u0441\u043E\u0442\u044B \u043F\u043E\u0434\u044A\u0451\u043C\u0430 (0,7\u20130,9)" },
29
+ { key: "kt", section: "building", kind: "number", default: 1.05, min: 1, max: 2, label: "\u041A\u043E\u044D\u0444. \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u043F\u043E\u0442\u0435\u0440\u044C", describe: "\u041A\u043E\u044D\u0444\u0444\u0438\u0446\u0438\u0435\u043D\u0442 \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u043F\u043E\u0442\u0435\u0440\u044C \u0432\u0440\u0435\u043C\u0435\u043D\u0438 (1,05\u20131,10)" },
30
+ { key: "gammaUp", section: "building", kind: "number", default: 0.8, min: 0, max: 1, label: "\u041A\u043E\u044D\u0444. \u0437\u0430\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F \u043F\u0440\u0438 \u043F\u043E\u0434\u044A\u0451\u043C\u0435", describe: "\u041A\u043E\u044D\u0444\u0444\u0438\u0446\u0438\u0435\u043D\u0442 \u0437\u0430\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F \u043A\u0430\u0431\u0438\u043D\u044B \u043F\u0440\u0438 \u043F\u043E\u0434\u044A\u0451\u043C\u0435" },
31
+ { key: "gammaDown", section: "building", kind: "number", default: 0.4, min: 0, max: 1, label: "\u041A\u043E\u044D\u0444. \u0437\u0430\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F \u043F\u0440\u0438 \u0441\u043F\u0443\u0441\u043A\u0435", describe: "\u041A\u043E\u044D\u0444\u0444\u0438\u0446\u0438\u0435\u043D\u0442 \u0437\u0430\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F \u043A\u0430\u0431\u0438\u043D\u044B \u043F\u0440\u0438 \u0441\u043F\u0443\u0441\u043A\u0435" },
32
+ { key: "nLifts", section: "building", kind: "int", default: 1, min: 1, max: 10, label: "\u0427\u0438\u0441\u043B\u043E \u043B\u0438\u0444\u0442\u043E\u0432 \u0432 \u0433\u0440\u0443\u043F\u043F\u0435", describe: "\u0427\u0438\u0441\u043B\u043E \u043E\u0434\u0438\u043D\u0430\u043A\u043E\u0432\u044B\u0445 \u043B\u0438\u0444\u0442\u043E\u0432 \u0432 \u0433\u0440\u0443\u043F\u043F\u0435" },
33
+ { key: "Q", section: "lift", kind: "number", default: 1e3, min: 1, label: "\u0413\u0440\u0443\u0437\u043E\u043F\u043E\u0434\u044A\u0451\u043C\u043D\u043E\u0441\u0442\u044C, \u043A\u0433", describe: "\u0413\u0440\u0443\u0437\u043E\u043F\u043E\u0434\u044A\u0451\u043C\u043D\u043E\u0441\u0442\u044C \u043A\u0430\u0431\u0438\u043D\u044B, \u043A\u0433 (\u0442\u0438\u043F\u043E\u0432\u044B\u0435 400 / 630 / 1000)" },
34
+ { key: "Vn", section: "lift", kind: "enum-number", allowed: VN_OPTIONS_52941, default: 1, label: "\u041D\u043E\u043C\u0438\u043D\u0430\u043B\u044C\u043D\u0430\u044F \u0441\u043A\u043E\u0440\u043E\u0441\u0442\u044C, \u043C/\u0441", describe: "\u041D\u043E\u043C\u0438\u043D\u0430\u043B\u044C\u043D\u0430\u044F \u0441\u043A\u043E\u0440\u043E\u0441\u0442\u044C, \u043C/\u0441 (0,63 / 1,0 / 1,6 / 2,5 / 4,0)" },
35
+ { key: "H0", section: "lift", kind: "number", default: 0, label: "\u041E\u0442\u043C\u0435\u0442\u043A\u0430 \u043D\u0438\u0436\u043D\u0435\u0439 \u043E\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0438, \u043C", describe: "\u041E\u0442\u043C\u0435\u0442\u043A\u0430 \u043D\u0438\u0436\u043D\u0435\u0439 \u043E\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0438, \u043C" },
36
+ { key: "Nn", section: "lift", kind: "int", default: 0, min: 0, label: "\u042D\u0442\u0430\u0436\u0435\u0439 \u0431\u0435\u0437 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u044F \u043B\u0438\u0444\u0442\u043E\u043C", describe: "\u0427\u0438\u0441\u043B\u043E \u043D\u0438\u0436\u043D\u0438\u0445 \u044D\u0442\u0430\u0436\u0435\u0439 \u0431\u0435\u0437 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u044F \u043B\u0438\u0444\u0442\u043E\u043C" },
37
+ { key: "h", section: "lift", kind: "number", auto: true, min: 0, label: "\u041F\u0443\u0442\u044C \u0440\u0430\u0437\u0433\u043E\u043D\u0430/\u0442\u043E\u0440\u043C\u043E\u0436\u0435\u043D\u0438\u044F, \u043C", describe: "\u041F\u0443\u0442\u044C \u0440\u0430\u0437\u0433\u043E\u043D\u0430/\u0442\u043E\u0440\u043C\u043E\u0436\u0435\u043D\u0438\u044F, \u043C (\u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E \u0438\u0437 \u0442\u0430\u0431\u043B\u0438\u0446\u044B \u043F\u043E \u0441\u043A\u043E\u0440\u043E\u0441\u0442\u0438)" },
38
+ { key: "t123", section: "lift", kind: "number", auto: true, min: 0, label: "\u041F\u043E\u0442\u0435\u0440\u0438 t1+t2+t3, \u0441", describe: "\u041F\u043E\u0442\u0435\u0440\u0438 \u0432\u0440\u0435\u043C\u0435\u043D\u0438 t1+t2+t3, \u0441 (\u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E \u0438\u0437 \u0442\u0430\u0431\u043B\u0438\u0446\u044B \u043F\u043E \u0441\u043A\u043E\u0440\u043E\u0441\u0442\u0438)" },
39
+ { key: "dt", section: "lift", kind: "number", default: 1, min: 0, label: "\u0412\u0440\u0435\u043C\u044F \u043D\u0430 \u043E\u0434\u043D\u043E\u0433\u043E \u043F\u0430\u0441\u0441\u0430\u0436\u0438\u0440\u0430, \u0441", describe: "\u0412\u0440\u0435\u043C\u044F \u043D\u0430 \u0432\u0445\u043E\u0434/\u0432\u044B\u0445\u043E\u0434 \u043E\u0434\u043D\u043E\u0433\u043E \u043F\u0430\u0441\u0441\u0430\u0436\u0438\u0440\u0430, \u0441" }
40
+ ];
41
+ var FIELDS_34758 = [
42
+ { key: "buildingType", section: "building", kind: "enum-string", allowed: ["residential", "hotel", "office"], label: "\u0422\u0438\u043F \u0437\u0434\u0430\u043D\u0438\u044F", describe: "\u0422\u0438\u043F \u0437\u0434\u0430\u043D\u0438\u044F: residential (\u0436\u0438\u043B\u043E\u0435) / hotel (\u0433\u043E\u0441\u0442\u0438\u043D\u0438\u0446\u0430) / office (\u043E\u0444\u0438\u0441)" },
43
+ { key: "N1", section: "building", kind: "int", min: 2, label: "\u0427\u0438\u0441\u043B\u043E \u043E\u0431\u0441\u043B\u0443\u0436\u0438\u0432\u0430\u0435\u043C\u044B\u0445 \u044D\u0442\u0430\u0436\u0435\u0439", describe: "\u0427\u0438\u0441\u043B\u043E \u043E\u0431\u0441\u043B\u0443\u0436\u0438\u0432\u0430\u0435\u043C\u044B\u0445 \u043B\u0438\u0444\u0442\u043E\u043C \u044D\u0442\u0430\u0436\u0435\u0439" },
44
+ { key: "A", section: "building", kind: "int", min: 1, label: "\u0417\u0430\u0441\u0435\u043B\u0451\u043D\u043D\u043E\u0441\u0442\u044C \u0437\u0434\u0430\u043D\u0438\u044F, \u0447\u0435\u043B.", describe: "\u0420\u0430\u0441\u0447\u0451\u0442\u043D\u0430\u044F \u0437\u0430\u0441\u0435\u043B\u0451\u043D\u043D\u043E\u0441\u0442\u044C \u0437\u0434\u0430\u043D\u0438\u044F, \u0447\u0435\u043B." },
45
+ { key: "Nl", section: "building", kind: "int", min: 1, label: "\u0427\u0438\u0441\u043B\u043E \u043B\u0438\u0444\u0442\u043E\u0432 \u0432 \u0433\u0440\u0443\u043F\u043F\u0435", describe: "\u0427\u0438\u0441\u043B\u043E \u043E\u0434\u0438\u043D\u0430\u043A\u043E\u0432\u044B\u0445 \u043B\u0438\u0444\u0442\u043E\u0432 \u0432 \u0433\u0440\u0443\u043F\u043F\u0435" },
46
+ { key: "hf", section: "building", kind: "number", default: 3.3, min: 0, label: "\u0412\u044B\u0441\u043E\u0442\u0430 \u044D\u0442\u0430\u0436\u0430, \u043C", describe: "\u0412\u044B\u0441\u043E\u0442\u0430 \u044D\u0442\u0430\u0436\u0430, \u043C" },
47
+ { key: "Q", section: "lift", kind: "enum-number", allowed: Q_OPTIONS_34758, default: 1e3, label: "\u0413\u0440\u0443\u0437\u043E\u043F\u043E\u0434\u044A\u0451\u043C\u043D\u043E\u0441\u0442\u044C, \u043A\u0433", describe: "\u0413\u0440\u0443\u0437\u043E\u043F\u043E\u0434\u044A\u0451\u043C\u043D\u043E\u0441\u0442\u044C \u0438\u0437 \u0440\u044F\u0434\u0430 450/630/800/1000/1275/1350/1600/1800/2000/2500, \u043A\u0433" },
48
+ { key: "Vn", section: "lift", kind: "number", min: 0, label: "\u041D\u043E\u043C\u0438\u043D\u0430\u043B\u044C\u043D\u0430\u044F \u0441\u043A\u043E\u0440\u043E\u0441\u0442\u044C, \u043C/\u0441", describe: "\u041D\u043E\u043C\u0438\u043D\u0430\u043B\u044C\u043D\u0430\u044F \u0441\u043A\u043E\u0440\u043E\u0441\u0442\u044C, \u043C/\u0441" },
49
+ { key: "doorWidth", section: "lift", kind: "enum-number", allowed: DOORWIDTH_OPTIONS_34758, label: "\u0428\u0438\u0440\u0438\u043D\u0430 \u0434\u0432\u0435\u0440\u043D\u043E\u0433\u043E \u043F\u0440\u043E\u0451\u043C\u0430, \u043C\u043C", describe: "\u0428\u0438\u0440\u0438\u043D\u0430 \u0434\u0432\u0435\u0440\u043D\u043E\u0433\u043E \u043F\u0440\u043E\u0451\u043C\u0430 \u0438\u0437 \u0440\u044F\u0434\u0430 800/900/1000/1100/1200, \u043C\u043C" },
50
+ { key: "tOst", section: "lift", kind: "number", auto: true, min: 0, label: "\u0412\u0440\u0435\u043C\u044F \u043D\u0430 \u043E\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0443, \u0441", describe: "\u0412\u0440\u0435\u043C\u044F \u043D\u0430 \u043E\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0443, \u0441 (\u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E \u0430\u0432\u0442\u043E \u043F\u043E \u041F\u0440\u0438\u043B. \u0415 \u0438\u0437 \u0448\u0438\u0440\u0438\u043D\u044B \u0434\u0432\u0435\u0440\u0438, \u0441\u043A\u043E\u0440\u043E\u0441\u0442\u0438 \u0438 \u0442\u0438\u043F\u0430 \u0437\u0434\u0430\u043D\u0438\u044F)" },
51
+ { key: "Pk", section: "lift", kind: "number", auto: true, min: 0, label: "\u0420\u0430\u0441\u0447\u0451\u0442\u043D\u0430\u044F \u0432\u043C\u0435\u0441\u0442\u0438\u043C\u043E\u0441\u0442\u044C, \u0447\u0435\u043B.", describe: "\u0420\u0430\u0441\u0447\u0451\u0442\u043D\u0430\u044F \u0432\u043C\u0435\u0441\u0442\u0438\u043C\u043E\u0441\u0442\u044C \u043A\u0430\u0431\u0438\u043D\u044B (\u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E \u0430\u0432\u0442\u043E round(E\xB70,8) \u043F\u043E \u0433\u0440\u0443\u0437\u043E\u043F\u043E\u0434\u044A\u0451\u043C\u043D\u043E\u0441\u0442\u0438)" }
52
+ ];
53
+ var REGISTRY = {
54
+ "52941": FIELDS_52941,
55
+ "34758": FIELDS_34758
56
+ };
57
+ function baseZod(field) {
58
+ switch (field.kind) {
59
+ case "int": {
60
+ let s = z.number().int();
61
+ if (field.min !== void 0) s = s.min(field.min);
62
+ if (field.max !== void 0) s = s.max(field.max);
63
+ return s;
64
+ }
65
+ case "number": {
66
+ let s = z.number();
67
+ if (field.min !== void 0) s = s.min(field.min);
68
+ if (field.max !== void 0) s = s.max(field.max);
69
+ return s;
70
+ }
71
+ case "enum-number": {
72
+ const opts = field.allowed ?? [];
73
+ const literals = opts.map((v) => z.literal(v));
74
+ return z.union(
75
+ literals
76
+ );
77
+ }
78
+ case "enum-string": {
79
+ const opts = field.allowed ?? [];
80
+ return z.enum(opts);
81
+ }
82
+ }
83
+ }
84
+ function fieldZod(field) {
85
+ const base = baseZod(field).describe(field.describe);
86
+ if (field.default !== void 0) return base.default(field.default);
87
+ if (field.auto) return base.optional();
88
+ return base;
89
+ }
90
+ function buildShape(fields) {
91
+ const shape = {};
92
+ for (const field of fields) shape[field.key] = fieldZod(field);
93
+ return shape;
94
+ }
95
+ var shape52941 = buildShape(FIELDS_52941);
96
+ var shape34758 = buildShape(FIELDS_34758);
97
+ var schema52941 = z.object(shape52941);
98
+ var schema34758 = z.object(shape34758);
99
+ var SHAPES = { "52941": shape52941, "34758": shape34758 };
100
+ var SCHEMAS = { "52941": schema52941, "34758": schema34758 };
101
+ function inputJsonSchema(gost) {
102
+ return z.toJSONSchema(SCHEMAS[gost], { target: "draft-7", io: "input" });
103
+ }
104
+ function requiredFields(gost) {
105
+ return REGISTRY[gost].filter(isRequired);
106
+ }
107
+ function collectMissing(gost, values) {
108
+ return requiredFields(gost).filter((f) => values[f.key] === void 0 || values[f.key] === null).map((f) => ({
109
+ field: f.key,
110
+ label: f.label,
111
+ ...f.allowed ? { allowed: f.allowed } : {}
112
+ }));
113
+ }
114
+
115
+ export { DOORWIDTH_OPTIONS_34758, FIELDS_34758, FIELDS_52941, Q_OPTIONS_34758, REGISTRY, SCHEMAS, SHAPES, VN_OPTIONS_52941, collectMissing, inputJsonSchema, isRequired, requiredFields, schema34758, schema52941, shape34758, shape52941 };
116
+ //# sourceMappingURL=index.js.map
117
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types.ts","../src/registry.ts","../src/schemas.ts"],"names":[],"mappings":";;;AAiDO,SAAS,WAAW,KAAA,EAAiC;AAC1D,EAAA,OAAO,KAAA,CAAM,OAAA,KAAY,MAAA,IAAa,CAAC,KAAA,CAAM,IAAA;AAC/C;;;AChDO,IAAM,eAAA,GAAkB;AAAA,EAC7B,GAAA;AAAA,EAAK,GAAA;AAAA,EAAK,GAAA;AAAA,EAAK,GAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,GAAA;AAAA,EAAM;AACrD;AAGO,IAAM,0BAA0B,CAAC,GAAA,EAAK,GAAA,EAAK,GAAA,EAAM,MAAM,IAAI;AAG3D,IAAM,mBAAmB,CAAC,IAAA,EAAM,CAAA,EAAK,GAAA,EAAK,KAAK,CAAG;AAOlD,IAAM,YAAA,GAA2C;AAAA,EACtD,EAAE,GAAA,EAAK,GAAA,EAAK,OAAA,EAAS,UAAA,EAAY,IAAA,EAAM,KAAA,EAAO,GAAA,EAAK,CAAA,EAAG,KAAA,EAAO,kIAAA,EAA2B,QAAA,EAAU,uKAAA,EAAiC;AAAA,EACnI,EAAE,GAAA,EAAK,GAAA,EAAK,OAAA,EAAS,UAAA,EAAY,IAAA,EAAM,KAAA,EAAO,GAAA,EAAK,CAAA,EAAG,KAAA,EAAO,+HAAA,EAA6B,QAAA,EAAU,+IAAA,EAA6B;AAAA,EACjI,EAAE,GAAA,EAAK,IAAA,EAAM,OAAA,EAAS,UAAA,EAAY,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,GAAA,EAAK,KAAA,EAAO,6EAAA,EAAmB,QAAA,EAAU,6EAAA,EAAkB;AAAA,EACtH,EAAE,GAAA,EAAK,GAAA,EAAK,OAAA,EAAS,UAAA,EAAY,MAAM,QAAA,EAAU,OAAA,EAAS,CAAA,EAAG,GAAA,EAAK,GAAG,GAAA,EAAK,GAAA,EAAK,KAAA,EAAO,8KAAA,EAAoC,UAAU,kSAAA,EAA6D;AAAA,EACjM,EAAE,GAAA,EAAK,IAAA,EAAM,OAAA,EAAS,UAAA,EAAY,MAAM,QAAA,EAAU,OAAA,EAAS,GAAA,EAAK,GAAA,EAAK,GAAG,GAAA,EAAK,CAAA,EAAG,KAAA,EAAO,kKAAA,EAAkC,UAAU,0NAAA,EAAiD;AAAA,EACpL,EAAE,GAAA,EAAK,IAAA,EAAM,OAAA,EAAS,UAAA,EAAY,MAAM,QAAA,EAAU,OAAA,EAAS,IAAA,EAAM,GAAA,EAAK,GAAG,GAAA,EAAK,CAAA,EAAG,KAAA,EAAO,qJAAA,EAA+B,UAAU,0PAAA,EAAwD;AAAA,EACzL,EAAE,GAAA,EAAK,SAAA,EAAW,OAAA,EAAS,UAAA,EAAY,MAAM,QAAA,EAAU,OAAA,EAAS,GAAA,EAAK,GAAA,EAAK,GAAG,GAAA,EAAK,CAAA,EAAG,KAAA,EAAO,sJAAA,EAAgC,UAAU,oOAAA,EAA4C;AAAA,EAClL,EAAE,GAAA,EAAK,WAAA,EAAa,OAAA,EAAS,UAAA,EAAY,MAAM,QAAA,EAAU,OAAA,EAAS,GAAA,EAAK,GAAA,EAAK,GAAG,GAAA,EAAK,CAAA,EAAG,KAAA,EAAO,gJAAA,EAA+B,UAAU,8NAAA,EAA2C;AAAA,EAElL,EAAE,GAAA,EAAK,QAAA,EAAU,OAAA,EAAS,UAAA,EAAY,MAAM,KAAA,EAAO,OAAA,EAAS,CAAA,EAAG,GAAA,EAAK,GAAG,GAAA,EAAK,EAAA,EAAI,KAAA,EAAO,iHAAA,EAAyB,UAAU,8KAAA,EAAmC;AAAA,EAC7J,EAAE,GAAA,EAAK,GAAA,EAAK,OAAA,EAAS,QAAQ,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,GAAA,EAAM,GAAA,EAAK,CAAA,EAAG,KAAA,EAAO,gHAAA,EAAwB,UAAU,mNAAA,EAAyD;AAAA,EACtK,EAAE,GAAA,EAAK,IAAA,EAAM,OAAA,EAAS,QAAQ,IAAA,EAAM,aAAA,EAAe,OAAA,EAAS,gBAAA,EAAkB,OAAA,EAAS,CAAA,EAAK,KAAA,EAAO,oIAAA,EAA6B,UAAU,mKAAA,EAA2D;AAAA,EACrM,EAAE,GAAA,EAAK,IAAA,EAAM,OAAA,EAAS,MAAA,EAAQ,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,CAAA,EAAG,KAAA,EAAO,gJAAA,EAA+B,QAAA,EAAU,gJAAA,EAA8B;AAAA,EACxI,EAAE,GAAA,EAAK,IAAA,EAAM,OAAA,EAAS,QAAQ,IAAA,EAAM,KAAA,EAAO,OAAA,EAAS,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,KAAA,EAAO,iKAAA,EAAiC,UAAU,qOAAA,EAA6C;AAAA,EAC9J,EAAE,GAAA,EAAK,GAAA,EAAK,OAAA,EAAS,QAAQ,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,IAAA,EAAM,GAAA,EAAK,CAAA,EAAG,KAAA,EAAO,0IAAA,EAA8B,UAAU,sUAAA,EAAmE;AAAA,EACnL,EAAE,GAAA,EAAK,MAAA,EAAQ,OAAA,EAAS,QAAQ,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,IAAA,EAAM,GAAA,EAAK,CAAA,EAAG,KAAA,EAAO,uDAAA,EAAsB,UAAU,8RAAA,EAAmE;AAAA,EAC9K,EAAE,GAAA,EAAK,IAAA,EAAM,OAAA,EAAS,QAAQ,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,KAAA,EAAO,iJAAA,EAAgC,UAAU,yMAAA;AACrH;AAOO,IAAM,YAAA,GAA2C;AAAA,EACtD,EAAE,GAAA,EAAK,cAAA,EAAgB,OAAA,EAAS,UAAA,EAAY,MAAM,aAAA,EAAe,OAAA,EAAS,CAAC,aAAA,EAAe,SAAS,QAAQ,CAAA,EAAG,KAAA,EAAO,yDAAA,EAAc,UAAU,4MAAA,EAAsE;AAAA,EACnN,EAAE,GAAA,EAAK,IAAA,EAAM,OAAA,EAAS,UAAA,EAAY,IAAA,EAAM,KAAA,EAAO,GAAA,EAAK,CAAA,EAAG,KAAA,EAAO,oJAAA,EAA8B,QAAA,EAAU,yLAAA,EAAoC;AAAA,EAC1I,EAAE,GAAA,EAAK,GAAA,EAAK,OAAA,EAAS,UAAA,EAAY,IAAA,EAAM,KAAA,EAAO,GAAA,EAAK,CAAA,EAAG,KAAA,EAAO,oIAAA,EAA6B,QAAA,EAAU,2LAAA,EAAsC;AAAA,EAC1I,EAAE,GAAA,EAAK,IAAA,EAAM,OAAA,EAAS,UAAA,EAAY,IAAA,EAAM,KAAA,EAAO,GAAA,EAAK,CAAA,EAAG,KAAA,EAAO,iHAAA,EAAyB,QAAA,EAAU,8KAAA,EAAmC;AAAA,EACpI,EAAE,GAAA,EAAK,IAAA,EAAM,OAAA,EAAS,YAAY,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,GAAA,EAAK,GAAA,EAAK,CAAA,EAAG,KAAA,EAAO,6EAAA,EAAmB,UAAU,6EAAA,EAAkB;AAAA,EAE9H,EAAE,GAAA,EAAK,GAAA,EAAK,OAAA,EAAS,QAAQ,IAAA,EAAM,aAAA,EAAe,OAAA,EAAS,eAAA,EAAiB,OAAA,EAAS,GAAA,EAAM,KAAA,EAAO,gHAAA,EAAwB,UAAU,qMAAA,EAA8E;AAAA,EAClN,EAAE,GAAA,EAAK,IAAA,EAAM,OAAA,EAAS,MAAA,EAAQ,IAAA,EAAM,QAAA,EAAU,GAAA,EAAK,CAAA,EAAG,KAAA,EAAO,oIAAA,EAA6B,QAAA,EAAU,oIAAA,EAA4B;AAAA,EAChI,EAAE,GAAA,EAAK,WAAA,EAAa,OAAA,EAAS,MAAA,EAAQ,IAAA,EAAM,aAAA,EAAe,OAAA,EAAS,uBAAA,EAAyB,KAAA,EAAO,0IAAA,EAA8B,QAAA,EAAU,uMAAA,EAA4D;AAAA,EACvM,EAAE,GAAA,EAAK,MAAA,EAAQ,OAAA,EAAS,QAAQ,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,IAAA,EAAM,GAAA,EAAK,CAAA,EAAG,KAAA,EAAO,4GAAA,EAAyB,UAAU,icAAA,EAA+F;AAAA,EAC7M,EAAE,GAAA,EAAK,IAAA,EAAM,OAAA,EAAS,QAAQ,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,IAAA,EAAM,GAAA,EAAK,CAAA,EAAG,KAAA,EAAO,gJAAA,EAA+B,UAAU,6XAAA;AACpH;AAGO,IAAM,QAAA,GAAW;AAAA,EACtB,OAAA,EAAS,YAAA;AAAA,EACT,OAAA,EAAS;AACX;ACxDA,SAAS,QAAQ,KAAA,EAAsC;AACrD,EAAA,QAAQ,MAAM,IAAA;AAAM,IAClB,KAAK,KAAA,EAAO;AACV,MAAA,IAAI,CAAA,GAAI,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,EAAI;AACvB,MAAA,IAAI,MAAM,GAAA,KAAQ,MAAA,MAAe,CAAA,CAAE,GAAA,CAAI,MAAM,GAAG,CAAA;AAChD,MAAA,IAAI,MAAM,GAAA,KAAQ,MAAA,MAAe,CAAA,CAAE,GAAA,CAAI,MAAM,GAAG,CAAA;AAChD,MAAA,OAAO,CAAA;AAAA,IACT;AAAA,IACA,KAAK,QAAA,EAAU;AACb,MAAA,IAAI,CAAA,GAAI,EAAE,MAAA,EAAO;AACjB,MAAA,IAAI,MAAM,GAAA,KAAQ,MAAA,MAAe,CAAA,CAAE,GAAA,CAAI,MAAM,GAAG,CAAA;AAChD,MAAA,IAAI,MAAM,GAAA,KAAQ,MAAA,MAAe,CAAA,CAAE,GAAA,CAAI,MAAM,GAAG,CAAA;AAChD,MAAA,OAAO,CAAA;AAAA,IACT;AAAA,IACA,KAAK,aAAA,EAAe;AAClB,MAAA,MAAM,IAAA,GAAQ,KAAA,CAAM,OAAA,IAAW,EAAC;AAChC,MAAA,MAAM,QAAA,GAAW,KAAK,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA;AAC7C,MAAA,OAAO,CAAA,CAAE,KAAA;AAAA,QACP;AAAA,OACF;AAAA,IACF;AAAA,IACA,KAAK,aAAA,EAAe;AAClB,MAAA,MAAM,IAAA,GAAQ,KAAA,CAAM,OAAA,IAAW,EAAC;AAChC,MAAA,OAAO,CAAA,CAAE,KAAK,IAA6B,CAAA;AAAA,IAC7C;AAAA;AAEJ;AAGA,SAAS,SAAS,KAAA,EAAsC;AACtD,EAAA,MAAM,OAAO,OAAA,CAAQ,KAAK,CAAA,CAAE,QAAA,CAAS,MAAM,QAAQ,CAAA;AACnD,EAAA,IAAI,MAAM,OAAA,KAAY,MAAA,SAAkB,IAAA,CAAK,OAAA,CAAQ,MAAM,OAAO,CAAA;AAClE,EAAA,IAAI,KAAA,CAAM,IAAA,EAAM,OAAO,IAAA,CAAK,QAAA,EAAS;AACrC,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,WAAW,MAAA,EAAmD;AAErE,EAAA,MAAM,QAAsC,EAAC;AAC7C,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ,KAAA,CAAM,MAAM,GAAG,CAAA,GAAI,SAAS,KAAK,CAAA;AAC7D,EAAA,OAAO,KAAA;AACT;AAGO,IAAM,UAAA,GAAa,WAAW,YAAY;AAC1C,IAAM,UAAA,GAAa,WAAW,YAAY;AAG1C,IAAM,WAAA,GAAc,CAAA,CAAE,MAAA,CAAO,UAAU;AACvC,IAAM,WAAA,GAAc,CAAA,CAAE,MAAA,CAAO,UAAU;AAEvC,IAAM,MAAA,GAAS,EAAE,OAAA,EAAS,UAAA,EAAY,SAAS,UAAA;AAC/C,IAAM,OAAA,GAAU,EAAE,OAAA,EAAS,WAAA,EAAa,SAAS,WAAA;AAGjD,SAAS,gBAAgB,IAAA,EAAuC;AAErE,EAAA,OAAO,CAAA,CAAE,YAAA,CAAa,OAAA,CAAQ,IAAI,CAAA,EAAG,EAAE,MAAA,EAAQ,SAAA,EAAW,EAAA,EAAI,OAAA,EAAS,CAAA;AAIzE;AAGO,SAAS,eAAe,IAAA,EAAiC;AAC9D,EAAA,OAAO,QAAA,CAAS,IAAI,CAAA,CAAE,MAAA,CAAO,UAAU,CAAA;AACzC;AAMO,SAAS,cAAA,CACd,MACA,MAAA,EACgB;AAChB,EAAA,OAAO,eAAe,IAAI,CAAA,CACvB,OAAO,CAAC,CAAA,KAAM,OAAO,CAAA,CAAE,GAAG,MAAM,MAAA,IAAa,MAAA,CAAO,EAAE,GAAG,CAAA,KAAM,IAAI,CAAA,CACnE,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACX,OAAO,CAAA,CAAE,GAAA;AAAA,IACT,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,GAAI,EAAE,OAAA,GAAU,EAAE,SAAS,CAAA,CAAE,OAAA,KAAY;AAAC,GAC5C,CAAE,CAAA;AACN","file":"index.js","sourcesContent":["/** Идентификатор методики расчёта. */\nexport type GostId = '52941' | '34758';\n\n/** Раздел документа расчёта, к которому относится поле. */\nexport type FieldSection = 'building' | 'lift';\n\n/**\n * Тип значения поля (задаёт построение zod и JSON Schema):\n * - `int` / `number` — числовое (с опциональными min/max);\n * - `enum-number` — число из фиксированного ряда ГОСТ (union литералов → JSON Schema enum);\n * - `enum-string` — строка из фиксированного набора.\n */\nexport type FieldKind = 'int' | 'number' | 'enum-number' | 'enum-string';\n\n/**\n * Единый дескриптор поля расчёта — SOURCE OF TRUTH. Из него генерятся: zod-схема structured-tool,\n * JSON Schema для `skillsIo.input`, список обязательных полей для `collectMissing`, метки формы.\n *\n * Классификация обязательности (одно правило, устраняет рассинхрон):\n * - `default !== undefined` → типовое значение, пользователь может не задавать;\n * - `auto: true` → производное значение (elevator доставит: VN_TABLE / lookupTost / Pk), optional;\n * - иначе → ОБЯЗАТЕЛЬНОЕ (пользователь должен задать). См. `isRequired`.\n */\nexport interface FieldDescriptor {\n key: string;\n section: FieldSection;\n /** Человекочитаемая метка (форма, сообщения об ошибке). */\n label: string;\n /** Описание для zod `.describe()` / JSON Schema `description` (видит LLM). */\n describe: string;\n kind: FieldKind;\n /** Допустимые значения (для enum-*). */\n allowed?: readonly (number | string)[];\n /** Статический типовой дефолт. */\n default?: number | string;\n /** Производное значение — optional в схеме, проставляется агентом до расчёта. */\n auto?: boolean;\n min?: number;\n max?: number;\n}\n\n/** Поле, отсутствующее во вводе (для структурной ошибки валидации и `collectMissing`). */\nexport interface MissingField {\n field: string;\n label: string;\n allowed?: readonly (number | string)[];\n}\n\n/** Поле обязательно к вводу пользователем: нет ни статического дефолта, ни авто-производности. */\nexport function isRequired(field: FieldDescriptor): boolean {\n return field.default === undefined && !field.auto;\n}\n","import type { FieldDescriptor } from './types';\n\n/** Ряд грузоподъёмностей ГОСТ 34758 (Табл. Г.1), кг. */\nexport const Q_OPTIONS_34758 = [\n 450, 630, 800, 1000, 1275, 1350, 1600, 1800, 2000, 2500,\n] as const;\n\n/** Ряд ширин дверного проёма ГОСТ 34758, мм. */\nexport const DOORWIDTH_OPTIONS_34758 = [800, 900, 1000, 1100, 1200] as const;\n\n/** Номинальные скорости с табличными h/t123 (ГОСТ Р 52941, VN_TABLE), м/с. */\nexport const VN_OPTIONS_52941 = [0.63, 1.0, 1.6, 2.5, 4.0] as const;\n\n/**\n * Реестр полей ГОСТ Р 52941-2008 (жилые здания). Плоский набор (здание + один типовой лифт;\n * `nLifts` задаёт число одинаковых кабин в группе). Обязательны только N и A — остальное имеет\n * типовые дефолты или производится автоматически (h/t123 из скорости).\n */\nexport const FIELDS_52941: readonly FieldDescriptor[] = [\n { key: 'N', section: 'building', kind: 'int', min: 1, label: 'Число заселённых этажей', describe: 'Число заселённых этажей здания' },\n { key: 'A', section: 'building', kind: 'int', min: 1, label: 'Жильцы всего здания, чел.', describe: 'Общее число жильцов здания' },\n { key: 'hf', section: 'building', kind: 'number', default: 2.8, label: 'Высота этажа, м', describe: 'Высота этажа, м' },\n { key: 'i', section: 'building', kind: 'number', default: 8, min: 0, max: 100, label: 'Интенсивность пассажиропотока, %', describe: 'Расчётная интенсивность пассажиропотока, % (4–8 для жилых)' },\n { key: 'kp', section: 'building', kind: 'number', default: 0.7, min: 0, max: 1, label: 'Коэф. вероятной высоты подъёма', describe: 'Коэффициент вероятной высоты подъёма (0,7–0,9)' },\n { key: 'kt', section: 'building', kind: 'number', default: 1.05, min: 1, max: 2, label: 'Коэф. дополнительных потерь', describe: 'Коэффициент дополнительных потерь времени (1,05–1,10)' },\n { key: 'gammaUp', section: 'building', kind: 'number', default: 0.8, min: 0, max: 1, label: 'Коэф. заполнения при подъёме', describe: 'Коэффициент заполнения кабины при подъёме' },\n { key: 'gammaDown', section: 'building', kind: 'number', default: 0.4, min: 0, max: 1, label: 'Коэф. заполнения при спуске', describe: 'Коэффициент заполнения кабины при спуске' },\n\n { key: 'nLifts', section: 'building', kind: 'int', default: 1, min: 1, max: 10, label: 'Число лифтов в группе', describe: 'Число одинаковых лифтов в группе' },\n { key: 'Q', section: 'lift', kind: 'number', default: 1000, min: 1, label: 'Грузоподъёмность, кг', describe: 'Грузоподъёмность кабины, кг (типовые 400 / 630 / 1000)' },\n { key: 'Vn', section: 'lift', kind: 'enum-number', allowed: VN_OPTIONS_52941, default: 1.0, label: 'Номинальная скорость, м/с', describe: 'Номинальная скорость, м/с (0,63 / 1,0 / 1,6 / 2,5 / 4,0)' },\n { key: 'H0', section: 'lift', kind: 'number', default: 0, label: 'Отметка нижней остановки, м', describe: 'Отметка нижней остановки, м' },\n { key: 'Nn', section: 'lift', kind: 'int', default: 0, min: 0, label: 'Этажей без пользования лифтом', describe: 'Число нижних этажей без пользования лифтом' },\n { key: 'h', section: 'lift', kind: 'number', auto: true, min: 0, label: 'Путь разгона/торможения, м', describe: 'Путь разгона/торможения, м (по умолчанию из таблицы по скорости)' },\n { key: 't123', section: 'lift', kind: 'number', auto: true, min: 0, label: 'Потери t1+t2+t3, с', describe: 'Потери времени t1+t2+t3, с (по умолчанию из таблицы по скорости)' },\n { key: 'dt', section: 'lift', kind: 'number', default: 1, min: 0, label: 'Время на одного пассажира, с', describe: 'Время на вход/выход одного пассажира, с' },\n];\n\n/**\n * Реестр полей ГОСТ 34758-2021 (жилые / гостиницы / офисы). Одна лифтовая группа (`Nl` одинаковых\n * лифтов). `buildingType` — дискриминатор нежилых типов, влияет на авто-`tOst` (Прил. Е). Обязательны\n * тип здания, N1/A/Nl, скорость и ширина двери; `tOst`/`Pk` производятся автоматически.\n */\nexport const FIELDS_34758: readonly FieldDescriptor[] = [\n { key: 'buildingType', section: 'building', kind: 'enum-string', allowed: ['residential', 'hotel', 'office'], label: 'Тип здания', describe: 'Тип здания: residential (жилое) / hotel (гостиница) / office (офис)' },\n { key: 'N1', section: 'building', kind: 'int', min: 2, label: 'Число обслуживаемых этажей', describe: 'Число обслуживаемых лифтом этажей' },\n { key: 'A', section: 'building', kind: 'int', min: 1, label: 'Заселённость здания, чел.', describe: 'Расчётная заселённость здания, чел.' },\n { key: 'Nl', section: 'building', kind: 'int', min: 1, label: 'Число лифтов в группе', describe: 'Число одинаковых лифтов в группе' },\n { key: 'hf', section: 'building', kind: 'number', default: 3.3, min: 0, label: 'Высота этажа, м', describe: 'Высота этажа, м' },\n\n { key: 'Q', section: 'lift', kind: 'enum-number', allowed: Q_OPTIONS_34758, default: 1000, label: 'Грузоподъёмность, кг', describe: 'Грузоподъёмность из ряда 450/630/800/1000/1275/1350/1600/1800/2000/2500, кг' },\n { key: 'Vn', section: 'lift', kind: 'number', min: 0, label: 'Номинальная скорость, м/с', describe: 'Номинальная скорость, м/с' },\n { key: 'doorWidth', section: 'lift', kind: 'enum-number', allowed: DOORWIDTH_OPTIONS_34758, label: 'Ширина дверного проёма, мм', describe: 'Ширина дверного проёма из ряда 800/900/1000/1100/1200, мм' },\n { key: 'tOst', section: 'lift', kind: 'number', auto: true, min: 0, label: 'Время на остановку, с', describe: 'Время на остановку, с (по умолчанию авто по Прил. Е из ширины двери, скорости и типа здания)' },\n { key: 'Pk', section: 'lift', kind: 'number', auto: true, min: 0, label: 'Расчётная вместимость, чел.', describe: 'Расчётная вместимость кабины (по умолчанию авто round(E·0,8) по грузоподъёмности)' },\n];\n\n/** Реестр по идентификатору ГОСТ. */\nexport const REGISTRY = {\n '52941': FIELDS_52941,\n '34758': FIELDS_34758,\n} as const;\n","import { z } from 'zod';\nimport { FIELDS_52941, FIELDS_34758, REGISTRY } from './registry';\nimport { isRequired, type FieldDescriptor, type GostId, type MissingField } from './types';\n\n/** Базовый zod-тип поля (без учёта обязательности). */\nfunction baseZod(field: FieldDescriptor): z.ZodTypeAny {\n switch (field.kind) {\n case 'int': {\n let s = z.number().int();\n if (field.min !== undefined) s = s.min(field.min);\n if (field.max !== undefined) s = s.max(field.max);\n return s;\n }\n case 'number': {\n let s = z.number();\n if (field.min !== undefined) s = s.min(field.min);\n if (field.max !== undefined) s = s.max(field.max);\n return s;\n }\n case 'enum-number': {\n const opts = (field.allowed ?? []) as readonly number[];\n const literals = opts.map((v) => z.literal(v));\n return z.union(\n literals as [z.ZodLiteral<number>, z.ZodLiteral<number>, ...z.ZodLiteral<number>[]],\n );\n }\n case 'enum-string': {\n const opts = (field.allowed ?? []) as readonly string[];\n return z.enum(opts as [string, ...string[]]);\n }\n }\n}\n\n/** Поле → zod с учётом обязательности: default → типовое; auto → optional; иначе обязательное. */\nfunction fieldZod(field: FieldDescriptor): z.ZodTypeAny {\n const base = baseZod(field).describe(field.describe);\n if (field.default !== undefined) return base.default(field.default);\n if (field.auto) return base.optional();\n return base;\n}\n\nfunction buildShape(fields: readonly FieldDescriptor[]): z.ZodRawShape {\n // zod 4: ZodRawShape — readonly index signature, собираем в mutable и приводим на возврате.\n const shape: Record<string, z.ZodTypeAny> = {};\n for (const field of fields) shape[field.key] = fieldZod(field);\n return shape;\n}\n\n/** Zod raw shape (для `inputSchema` MCP-tool). */\nexport const shape52941 = buildShape(FIELDS_52941);\nexport const shape34758 = buildShape(FIELDS_34758);\n\n/** Zod-объекты (для валидации структурного входа). */\nexport const schema52941 = z.object(shape52941);\nexport const schema34758 = z.object(shape34758);\n\nexport const SHAPES = { '52941': shape52941, '34758': shape34758 } as const;\nexport const SCHEMAS = { '52941': schema52941, '34758': schema34758 } as const;\n\n/** JSON Schema входа для публикации в `x-ai37.skillsIo[...].input` (карточка агента). */\nexport function inputJsonSchema(gost: GostId): Record<string, unknown> {\n // Нативный генератор zod 4 (draft-7). `io: 'input'` — учитывать дефолты как опциональные во входе.\n return z.toJSONSchema(SCHEMAS[gost], { target: 'draft-7', io: 'input' }) as Record<\n string,\n unknown\n >;\n}\n\n/** Обязательные поля ГОСТ (нет ни статического дефолта, ни авто-производности). */\nexport function requiredFields(gost: GostId): FieldDescriptor[] {\n return REGISTRY[gost].filter(isRequired);\n}\n\n/**\n * Обязательные поля без значения — единый источник для `collectMissing` (диалог) и структурной\n * ошибки валидации (MCP). Значение считается заданным, если оно не `undefined`/`null`.\n */\nexport function collectMissing(\n gost: GostId,\n values: Record<string, unknown>,\n): MissingField[] {\n return requiredFields(gost)\n .filter((f) => values[f.key] === undefined || values[f.key] === null)\n .map((f) => ({\n field: f.key,\n label: f.label,\n ...(f.allowed ? { allowed: f.allowed } : {}),\n }));\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "@ai37/lift-calc-schemas",
3
+ "version": "0.1.0",
4
+ "description": "Каноничные Zod-схемы полей расчёта лифтов по ГОСТ Р 52941-2008 и ГОСТ 34758-2021 (+ экспорт JSON Schema для skillsIo).",
5
+ "license": "Apache-2.0",
6
+ "type": "module",
7
+ "sideEffects": false,
8
+ "main": "dist/index.cjs",
9
+ "module": "dist/index.js",
10
+ "types": "dist/index.d.ts",
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/index.d.ts",
14
+ "import": "./dist/index.js",
15
+ "require": "./dist/index.cjs"
16
+ }
17
+ },
18
+ "files": [
19
+ "dist",
20
+ "README.md",
21
+ "LICENSE"
22
+ ],
23
+ "keywords": [
24
+ "ai37",
25
+ "gost",
26
+ "lifts",
27
+ "zod",
28
+ "json-schema"
29
+ ],
30
+ "repository": {
31
+ "type": "git",
32
+ "url": "git+https://github.com/AI-37/ai37-catalog.git",
33
+ "directory": "packages/lift-calc-schemas"
34
+ },
35
+ "engines": {
36
+ "node": ">=22.0.0"
37
+ },
38
+ "publishConfig": {
39
+ "access": "public"
40
+ },
41
+ "scripts": {
42
+ "build": "tsup",
43
+ "typecheck": "tsc -p tsconfig.json --noEmit",
44
+ "test": "vitest run",
45
+ "prepublishOnly": "pnpm run build"
46
+ },
47
+ "peerDependencies": {
48
+ "zod": "^4.0.0"
49
+ },
50
+ "devDependencies": {
51
+ "tsup": "^8.5.0",
52
+ "zod": "^4.4.3"
53
+ }
54
+ }