@ai37/lift-calc-schemas 0.1.0 → 0.1.1

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 CHANGED
@@ -41,7 +41,7 @@ var FIELDS_52941 = [
41
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
42
  ];
43
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)" },
44
+ { key: "buildingType", section: "building", kind: "enum-string", allowed: ["hotel", "office"], label: "\u0422\u0438\u043F \u0437\u0434\u0430\u043D\u0438\u044F", describe: "\u0422\u0438\u043F \u041D\u0415\u0436\u0438\u043B\u043E\u0433\u043E \u0437\u0434\u0430\u043D\u0438\u044F: hotel (\u0433\u043E\u0441\u0442\u0438\u043D\u0438\u0446\u0430) / office (\u043E\u0444\u0438\u0441). \u0416\u0438\u043B\u044B\u0435 \u0437\u0434\u0430\u043D\u0438\u044F \u0441\u0447\u0438\u0442\u0430\u044E\u0442\u0441\u044F \u043F\u043E \u0413\u041E\u0421\u0422 \u0420 52941-2008 (\u043C\u0435\u0442\u043E\u0434\u0438\u043A\u0430 calc-lifts-52941)." },
45
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
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
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" },
@@ -1 +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"]}
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 — ТОЛЬКО НЕжилые здания (гостиницы / офисы). Жилые считаются по\n * ГОСТ Р 52941-2008 (продуктовое разделение: одна методика на тип здания, без пересечения). Одна\n * лифтовая группа (`Nl` одинаковых лифтов). `buildingType` (hotel/office) влияет на авто-`tOst`\n * (Прил. Е.2). Обязательны тип здания, N1/A/Nl, скорость и ширина двери; `tOst`/`Pk` — авто.\n */\nexport const FIELDS_34758: readonly FieldDescriptor[] = [\n { key: 'buildingType', section: 'building', kind: 'enum-string', allowed: ['hotel', 'office'], label: 'Тип здания', describe: 'Тип НЕжилого здания: hotel (гостиница) / office (офис). Жилые здания считаются по ГОСТ Р 52941-2008 (методика calc-lifts-52941).' },\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/dist/index.d.cts CHANGED
@@ -59,9 +59,10 @@ declare const VN_OPTIONS_52941: readonly [0.63, 1, 1.6, 2.5, 4];
59
59
  */
60
60
  declare const FIELDS_52941: readonly FieldDescriptor[];
61
61
  /**
62
- * Реестр полей ГОСТ 34758-2021 (жилые / гостиницы / офисы). Одна лифтовая группа (`Nl` одинаковых
63
- * лифтов). `buildingType` дискриминатор нежилых типов, влияет на авто-`tOst` (Прил. Е). Обязательны
64
- * тип здания, N1/A/Nl, скорость и ширина двери; `tOst`/`Pk` производятся автоматически.
62
+ * Реестр полей ГОСТ 34758-2021 ТОЛЬКО НЕжилые здания (гостиницы / офисы). Жилые считаются по
63
+ * ГОСТ Р 52941-2008 (продуктовое разделение: одна методика на тип здания, без пересечения). Одна
64
+ * лифтовая группа (`Nl` одинаковых лифтов). `buildingType` (hotel/office) влияет на авто-`tOst`
65
+ * (Прил. Е.2). Обязательны тип здания, N1/A/Nl, скорость и ширина двери; `tOst`/`Pk` — авто.
65
66
  */
66
67
  declare const FIELDS_34758: readonly FieldDescriptor[];
67
68
  /** Реестр по идентификатору ГОСТ. */
package/dist/index.d.ts CHANGED
@@ -59,9 +59,10 @@ declare const VN_OPTIONS_52941: readonly [0.63, 1, 1.6, 2.5, 4];
59
59
  */
60
60
  declare const FIELDS_52941: readonly FieldDescriptor[];
61
61
  /**
62
- * Реестр полей ГОСТ 34758-2021 (жилые / гостиницы / офисы). Одна лифтовая группа (`Nl` одинаковых
63
- * лифтов). `buildingType` дискриминатор нежилых типов, влияет на авто-`tOst` (Прил. Е). Обязательны
64
- * тип здания, N1/A/Nl, скорость и ширина двери; `tOst`/`Pk` производятся автоматически.
62
+ * Реестр полей ГОСТ 34758-2021 ТОЛЬКО НЕжилые здания (гостиницы / офисы). Жилые считаются по
63
+ * ГОСТ Р 52941-2008 (продуктовое разделение: одна методика на тип здания, без пересечения). Одна
64
+ * лифтовая группа (`Nl` одинаковых лифтов). `buildingType` (hotel/office) влияет на авто-`tOst`
65
+ * (Прил. Е.2). Обязательны тип здания, N1/A/Nl, скорость и ширина двери; `tOst`/`Pk` — авто.
65
66
  */
66
67
  declare const FIELDS_34758: readonly FieldDescriptor[];
67
68
  /** Реестр по идентификатору ГОСТ. */
package/dist/index.js CHANGED
@@ -39,7 +39,7 @@ var FIELDS_52941 = [
39
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
40
  ];
41
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)" },
42
+ { key: "buildingType", section: "building", kind: "enum-string", allowed: ["hotel", "office"], label: "\u0422\u0438\u043F \u0437\u0434\u0430\u043D\u0438\u044F", describe: "\u0422\u0438\u043F \u041D\u0415\u0436\u0438\u043B\u043E\u0433\u043E \u0437\u0434\u0430\u043D\u0438\u044F: hotel (\u0433\u043E\u0441\u0442\u0438\u043D\u0438\u0446\u0430) / office (\u043E\u0444\u0438\u0441). \u0416\u0438\u043B\u044B\u0435 \u0437\u0434\u0430\u043D\u0438\u044F \u0441\u0447\u0438\u0442\u0430\u044E\u0442\u0441\u044F \u043F\u043E \u0413\u041E\u0421\u0422 \u0420 52941-2008 (\u043C\u0435\u0442\u043E\u0434\u0438\u043A\u0430 calc-lifts-52941)." },
43
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
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
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" },
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types.ts","../src/registry.ts","../src/schemas.ts"],"names":[],"mappings":"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","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"]}
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;AAQO,IAAM,YAAA,GAA2C;AAAA,EACtD,EAAE,GAAA,EAAK,cAAA,EAAgB,OAAA,EAAS,YAAY,IAAA,EAAM,aAAA,EAAe,OAAA,EAAS,CAAC,SAAS,QAAQ,CAAA,EAAG,KAAA,EAAO,yDAAA,EAAc,UAAU,ucAAA,EAAmI;AAAA,EACjQ,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;ACzDA,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 — ТОЛЬКО НЕжилые здания (гостиницы / офисы). Жилые считаются по\n * ГОСТ Р 52941-2008 (продуктовое разделение: одна методика на тип здания, без пересечения). Одна\n * лифтовая группа (`Nl` одинаковых лифтов). `buildingType` (hotel/office) влияет на авто-`tOst`\n * (Прил. Е.2). Обязательны тип здания, N1/A/Nl, скорость и ширина двери; `tOst`/`Pk` — авто.\n */\nexport const FIELDS_34758: readonly FieldDescriptor[] = [\n { key: 'buildingType', section: 'building', kind: 'enum-string', allowed: ['hotel', 'office'], label: 'Тип здания', describe: 'Тип НЕжилого здания: hotel (гостиница) / office (офис). Жилые здания считаются по ГОСТ Р 52941-2008 (методика calc-lifts-52941).' },\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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai37/lift-calc-schemas",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Каноничные Zod-схемы полей расчёта лифтов по ГОСТ Р 52941-2008 и ГОСТ 34758-2021 (+ экспорт JSON Schema для skillsIo).",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",