{"version":3,"file":"LlmSchemaComposer.mjs","sources":["../../src/composers/LlmSchemaComposer.ts"],"sourcesContent":["import { OpenApi } from \"../OpenApi\";\nimport { IJsonSchemaAttribute } from \"../structures/IJsonSchemaAttribute\";\nimport { ILlmFunction } from \"../structures/ILlmFunction\";\nimport { ILlmSchema } from \"../structures/ILlmSchema\";\nimport { IOpenApiSchemaError } from \"../structures/IOpenApiSchemaError\";\nimport { IResult } from \"../structures/IResult\";\nimport { LlmTypeChecker } from \"../utils/LlmTypeChecker\";\nimport { NamingConvention } from \"../utils/NamingConvention\";\nimport { OpenApiConstraintShifter } from \"../utils/OpenApiConstraintShifter\";\nimport { OpenApiTypeChecker } from \"../utils/OpenApiTypeChecker\";\nimport { OpenApiValidator } from \"../utils/OpenApiValidator\";\nimport { JsonDescriptionUtil } from \"../utils/internal/JsonDescriptionUtil\";\nimport { LlmDescriptionInverter } from \"./LlmDescriptionInverter\";\nimport { LlmParametersFinder } from \"./LlmParametersComposer\";\n\nexport namespace LlmSchemaComposer {\n  /* -----------------------------------------------------------\n    CONVERTERS\n  ----------------------------------------------------------- */\n  export const parameters = (props: {\n    config?: Partial<ILlmSchema.IConfig>;\n    components: OpenApi.IComponents;\n    schema: OpenApi.IJsonSchema.IObject | OpenApi.IJsonSchema.IReference;\n    accessor?: string;\n    refAccessor?: string;\n  }): IResult<ILlmSchema.IParameters, IOpenApiSchemaError> => {\n    const config: ILlmSchema.IConfig = getConfig(props.config);\n    const entity: IResult<OpenApi.IJsonSchema.IObject, IOpenApiSchemaError> =\n      LlmParametersFinder.parameters({\n        ...props,\n        method: \"LlmSchemaComposer.parameters\",\n      });\n    if (entity.success === false) return entity;\n\n    const $defs: Record<string, ILlmSchema> = {};\n    const result: IResult<ILlmSchema, IOpenApiSchemaError> = transform({\n      ...props,\n      config,\n      $defs,\n      schema: entity.value,\n    });\n    if (result.success === false) return result;\n    return {\n      success: true,\n      value: {\n        ...(result.value as ILlmSchema.IObject),\n        additionalProperties: false,\n        $defs,\n        description: OpenApiTypeChecker.isReference(props.schema)\n          ? JsonDescriptionUtil.cascade({\n              prefix: \"#/components/schemas/\",\n              components: props.components,\n              schema: {\n                ...props.schema,\n                description: result.value.description,\n              },\n              escape: true,\n            })\n          : result.value.description,\n      } satisfies ILlmSchema.IParameters,\n    };\n  };\n\n  export const schema = (props: {\n    config?: Partial<ILlmSchema.IConfig>;\n    components: OpenApi.IComponents;\n    $defs: Record<string, ILlmSchema>;\n    schema: OpenApi.IJsonSchema;\n    accessor?: string;\n    refAccessor?: string;\n  }): IResult<ILlmSchema, IOpenApiSchemaError> =>\n    transform({\n      config: getConfig(props.config),\n      components: props.components,\n      $defs: props.$defs,\n      schema: props.schema,\n      accessor: props.accessor,\n      refAccessor: props.refAccessor,\n    });\n\n  const transform = (props: {\n    config: ILlmSchema.IConfig;\n    components: OpenApi.IComponents;\n    $defs: Record<string, ILlmSchema>;\n    schema: OpenApi.IJsonSchema;\n    accessor?: string;\n    refAccessor?: string;\n  }): IResult<ILlmSchema, IOpenApiSchemaError> => {\n    // PREPARE ASSETS\n    const union: Array<ILlmSchema> = [];\n    const attribute: IJsonSchemaAttribute = {\n      title: props.schema.title,\n      description: props.schema.description,\n      deprecated: props.schema.deprecated,\n      readOnly: props.schema.readOnly,\n      writeOnly: props.schema.writeOnly,\n      example: props.schema.example,\n      examples: props.schema.examples,\n      ...Object.fromEntries(\n        Object.entries(props.schema).filter(\n          ([key, value]) => key.startsWith(\"x-\") && value !== undefined,\n        ),\n      ),\n    };\n\n    // VALIDADTE SCHEMA\n    const reasons: IOpenApiSchemaError.IReason[] = [];\n    OpenApiTypeChecker.visit({\n      closure: (next, accessor) => {\n        if (props.config.strict === true) {\n          // STRICT MODE VALIDATION\n          reasons.push(...validateStrict(next, accessor));\n        }\n        if (OpenApiTypeChecker.isTuple(next))\n          reasons.push({\n            accessor,\n            schema: next,\n            message: `LLM does not allow tuple type.`,\n          });\n        else if (OpenApiTypeChecker.isReference(next)) {\n          // UNABLE TO FIND MATCHED REFERENCE\n          const key: string = next.$ref.split(\"#/components/schemas/\")[1];\n          if (props.components.schemas?.[key] === undefined)\n            reasons.push({\n              schema: next,\n              accessor: accessor,\n              message: `unable to find reference type ${JSON.stringify(key)}.`,\n            });\n        }\n      },\n      components: props.components,\n      schema: props.schema,\n      accessor: props.accessor,\n      refAccessor: props.refAccessor,\n    });\n    if (reasons.length > 0)\n      return {\n        success: false,\n        error: {\n          method: \"LlmSchemaComposer.schema\",\n          message: \"Failed to compose LLM schema\",\n          reasons,\n        },\n      };\n\n    const visitConstant = (input: OpenApi.IJsonSchema): void => {\n      const insert = (value: any): void => {\n        const matched:\n          | ILlmSchema.IString\n          | ILlmSchema.INumber\n          | ILlmSchema.IBoolean\n          | undefined = union.find(\n          (u) =>\n            (u as (IJsonSchemaAttribute & { type: string }) | undefined)\n              ?.type === typeof value,\n        ) as ILlmSchema.IString | undefined;\n        if (matched !== undefined) {\n          matched.enum ??= [];\n          matched.enum.push(value);\n        } else\n          union.push({\n            type: typeof value as \"number\",\n            enum: [value],\n          });\n      };\n      if (OpenApiTypeChecker.isConstant(input)) insert(input.const);\n      else if (OpenApiTypeChecker.isOneOf(input))\n        input.oneOf.forEach(visitConstant);\n    };\n    const visit = (input: OpenApi.IJsonSchema, accessor: string): void => {\n      if (OpenApiTypeChecker.isOneOf(input)) {\n        // UNION TYPE\n        input.oneOf.forEach((s, i) => visit(s, `${accessor}.oneOf[${i}]`));\n      } else if (OpenApiTypeChecker.isReference(input)) {\n        // REFERENCE TYPE\n        const key: string = input.$ref.split(\"#/components/schemas/\")[1];\n        const target: OpenApi.IJsonSchema | undefined =\n          props.components.schemas?.[key];\n        if (target === undefined) return;\n        else if (\n          // KEEP THE REFERENCE TYPE\n          props.config.reference === true ||\n          OpenApiTypeChecker.isRecursiveReference({\n            components: props.components,\n            schema: input,\n          })\n        ) {\n          const out = () => {\n            union.push({\n              ...input,\n              $ref: `#/$defs/${key}`,\n            });\n          };\n          if (props.$defs[key] !== undefined) return out();\n\n          props.$defs[key] = {};\n          const converted: IResult<ILlmSchema, IOpenApiSchemaError> = transform(\n            {\n              config: props.config,\n              components: props.components,\n              $defs: props.$defs,\n              schema: target,\n              refAccessor: props.refAccessor,\n              accessor: `${props.refAccessor ?? \"$def\"}[${JSON.stringify(key)}]`,\n            },\n          );\n          if (converted.success === false) return; // UNREACHABLE\n          props.$defs[key] = converted.value;\n          return out();\n        } else {\n          // DISCARD THE REFERENCE TYPE\n          const length: number = union.length;\n          visit(target, accessor);\n          visitConstant(target);\n          if (length === union.length - 1)\n            union[union.length - 1] = {\n              ...union[union.length - 1]!,\n              description: JsonDescriptionUtil.cascade({\n                prefix: \"#/components/schemas/\",\n                components: props.components,\n                schema: input,\n                escape: true,\n              }),\n            };\n          else\n            attribute.description = JsonDescriptionUtil.cascade({\n              prefix: \"#/components/schemas/\",\n              components: props.components,\n              schema: input,\n              escape: true,\n            });\n        }\n      } else if (OpenApiTypeChecker.isObject(input)) {\n        // OBJECT TYPE\n        const properties: Record<string, ILlmSchema> = Object.fromEntries(\n          Object.entries(input.properties ?? {})\n            .map(([key, value]) => {\n              const converted: IResult<ILlmSchema, IOpenApiSchemaError> =\n                transform({\n                  config: props.config,\n                  components: props.components,\n                  $defs: props.$defs,\n                  schema: value,\n                  refAccessor: props.refAccessor,\n                  accessor: `${props.accessor ?? \"$input.schema\"}.properties[${JSON.stringify(key)}]`,\n                });\n              if (converted.success === false) {\n                reasons.push(...converted.error.reasons);\n                return [key, null];\n              }\n              return [key, converted.value];\n            })\n            .filter(([, value]) => value !== null),\n        );\n        if (Object.values(properties).some((v) => v === null)) return;\n\n        const additionalProperties: ILlmSchema | boolean | undefined | null =\n          (() => {\n            if (\n              typeof input.additionalProperties === \"object\" &&\n              input.additionalProperties !== null\n            ) {\n              const converted: IResult<ILlmSchema, IOpenApiSchemaError> =\n                transform({\n                  config: props.config,\n                  components: props.components,\n                  $defs: props.$defs,\n                  schema: input.additionalProperties,\n                  refAccessor: props.refAccessor,\n                  accessor: `${accessor}.additionalProperties`,\n                });\n              if (converted.success === false) {\n                reasons.push(...converted.error.reasons);\n                return null;\n              }\n              return converted.value;\n            }\n            return props.config.strict === true\n              ? false\n              : input.additionalProperties;\n          })();\n        if (additionalProperties === null) return;\n        union.push({\n          ...input,\n          properties,\n          additionalProperties,\n          required: input.required ?? [],\n          description:\n            props.config.strict === true\n              ? JsonDescriptionUtil.take(input)\n              : input.description,\n        });\n      } else if (OpenApiTypeChecker.isArray(input)) {\n        // ARRAY TYPE\n        const items: IResult<ILlmSchema, IOpenApiSchemaError> = transform({\n          config: props.config,\n          components: props.components,\n          $defs: props.$defs,\n          schema: input.items,\n          refAccessor: props.refAccessor,\n          accessor: `${accessor}.items`,\n        });\n        if (items.success === false) {\n          reasons.push(...items.error.reasons);\n          return;\n        }\n        union.push(\n          props.config.strict === true\n            ? OpenApiConstraintShifter.shiftArray({\n                ...input,\n                items: items.value,\n              })\n            : {\n                ...input,\n                items: items.value,\n              },\n        );\n      } else if (OpenApiTypeChecker.isString(input))\n        union.push(\n          props.config.strict === true\n            ? OpenApiConstraintShifter.shiftString({ ...input })\n            : input,\n        );\n      else if (\n        OpenApiTypeChecker.isNumber(input) ||\n        OpenApiTypeChecker.isInteger(input)\n      )\n        union.push(\n          props.config.strict === true\n            ? OpenApiConstraintShifter.shiftNumeric({ ...input })\n            : input,\n        );\n      else if (OpenApiTypeChecker.isTuple(input))\n        return; // UNREACHABLE\n      else if (OpenApiTypeChecker.isConstant(input) === false)\n        union.push({ ...input });\n    };\n\n    visitConstant(props.schema);\n    visit(props.schema, props.accessor ?? \"$input.schema\");\n\n    if (reasons.length > 0)\n      return {\n        success: false,\n        error: {\n          method: \"LlmSchemaComposer.schema\",\n          message: \"Failed to compose LLM schema\",\n          reasons,\n        },\n      };\n    else if (union.length === 0)\n      return {\n        // unknown type\n        success: true,\n        value: {\n          ...attribute,\n          type: undefined,\n        },\n      };\n    else if (union.length === 1)\n      return {\n        // single type\n        success: true,\n        value: {\n          ...attribute,\n          ...union[0],\n          description:\n            props.config.strict === true && LlmTypeChecker.isReference(union[0])\n              ? undefined\n              : (union[0].description ?? attribute.description),\n        },\n      };\n    return {\n      success: true,\n      value: {\n        ...attribute,\n        anyOf: union.map((u) => ({\n          ...u,\n          description:\n            props.config.strict === true && LlmTypeChecker.isReference(u)\n              ? undefined\n              : u.description,\n        })),\n        \"x-discriminator\":\n          OpenApiTypeChecker.isOneOf(props.schema) &&\n          props.schema.discriminator !== undefined &&\n          props.schema.oneOf.length === union.length &&\n          union.every(\n            (e) => LlmTypeChecker.isReference(e) || LlmTypeChecker.isNull(e),\n          )\n            ? {\n                propertyName: props.schema.discriminator.propertyName,\n                mapping:\n                  props.schema.discriminator.mapping !== undefined\n                    ? Object.fromEntries(\n                        Object.entries(props.schema.discriminator.mapping).map(\n                          ([key, value]) => [\n                            key,\n                            `#/$defs/${value.split(\"/\").at(-1)}`,\n                          ],\n                        ),\n                      )\n                    : undefined,\n              }\n            : undefined,\n      },\n    };\n  };\n\n  /* -----------------------------------------------------------\n    SEPARATORS\n  ----------------------------------------------------------- */\n  export const separate = (props: {\n    parameters: ILlmSchema.IParameters;\n    predicate: (schema: ILlmSchema) => boolean;\n    convention?: (key: string, type: \"llm\" | \"human\") => string;\n    equals?: boolean;\n  }): ILlmFunction.ISeparated => {\n    const convention =\n      props.convention ??\n      ((key, type) => `${key}.${NamingConvention.capitalize(type)}`);\n    const [llm, human] = separateObject({\n      predicate: props.predicate,\n      convention,\n      $defs: props.parameters.$defs,\n      schema: props.parameters,\n    });\n    if (llm === null || human === null)\n      return {\n        llm: (llm as ILlmSchema.IParameters | null) ?? {\n          type: \"object\",\n          properties: {} as Record<string, ILlmSchema>,\n          required: [],\n          additionalProperties: false,\n          $defs: {},\n        },\n        human: human as ILlmSchema.IParameters | null,\n      };\n    const output: ILlmFunction.ISeparated = {\n      llm: {\n        ...llm,\n        $defs: Object.fromEntries(\n          Object.entries(props.parameters.$defs).filter(([key]) =>\n            key.endsWith(\".Llm\"),\n          ),\n        ),\n        additionalProperties: false,\n      },\n      human: {\n        ...human,\n        $defs: Object.fromEntries(\n          Object.entries(props.parameters.$defs).filter(([key]) =>\n            key.endsWith(\".Human\"),\n          ),\n        ),\n        additionalProperties: false,\n      },\n    };\n    for (const key of Object.keys(props.parameters.$defs))\n      if (key.endsWith(\".Llm\") === false && key.endsWith(\".Human\") === false)\n        delete props.parameters.$defs[key];\n    if (Object.keys(output.llm.properties).length !== 0) {\n      const components: OpenApi.IComponents = {};\n      output.validate = OpenApiValidator.create({\n        components,\n        schema: invert({\n          components,\n          schema: output.llm,\n          $defs: output.llm.$defs,\n        }),\n        required: true,\n        equals: props.equals,\n      });\n    }\n    return output;\n  };\n\n  const separateStation = (props: {\n    predicate: (schema: ILlmSchema) => boolean;\n    convention: (key: string, type: \"llm\" | \"human\") => string;\n    $defs: Record<string, ILlmSchema>;\n    schema: ILlmSchema;\n  }): [ILlmSchema | null, ILlmSchema | null] => {\n    if (props.predicate(props.schema) === true) return [null, props.schema];\n    else if (\n      LlmTypeChecker.isUnknown(props.schema) ||\n      LlmTypeChecker.isAnyOf(props.schema)\n    )\n      return [props.schema, null];\n    else if (LlmTypeChecker.isObject(props.schema))\n      return separateObject({\n        predicate: props.predicate,\n        convention: props.convention,\n        $defs: props.$defs,\n        schema: props.schema,\n      });\n    else if (LlmTypeChecker.isArray(props.schema))\n      return separateArray({\n        predicate: props.predicate,\n        convention: props.convention,\n        $defs: props.$defs,\n        schema: props.schema,\n      });\n    else if (LlmTypeChecker.isReference(props.schema))\n      return separateReference({\n        predicate: props.predicate,\n        convention: props.convention,\n        $defs: props.$defs,\n        schema: props.schema,\n      });\n    return [props.schema, null];\n  };\n\n  const separateArray = (props: {\n    predicate: (schema: ILlmSchema) => boolean;\n    convention: (key: string, type: \"llm\" | \"human\") => string;\n    $defs: Record<string, ILlmSchema>;\n    schema: ILlmSchema.IArray;\n  }): [ILlmSchema.IArray | null, ILlmSchema.IArray | null] => {\n    const [x, y] = separateStation({\n      predicate: props.predicate,\n      convention: props.convention,\n      $defs: props.$defs,\n      schema: props.schema.items,\n    });\n    return [\n      x !== null\n        ? {\n            ...props.schema,\n            items: x,\n          }\n        : null,\n      y !== null\n        ? {\n            ...props.schema,\n            items: y,\n          }\n        : null,\n    ];\n  };\n\n  const separateObject = (props: {\n    $defs: Record<string, ILlmSchema>;\n    predicate: (schema: ILlmSchema) => boolean;\n    convention: (key: string, type: \"llm\" | \"human\") => string;\n    schema: ILlmSchema.IObject;\n  }): [ILlmSchema.IObject | null, ILlmSchema.IObject | null] => {\n    // EMPTY OBJECT\n    if (\n      Object.keys(props.schema.properties ?? {}).length === 0 &&\n      !!props.schema.additionalProperties === false\n    )\n      return [props.schema, null];\n\n    const llm = {\n      ...props.schema,\n      properties: {} as Record<string, ILlmSchema>,\n      additionalProperties: props.schema.additionalProperties,\n    } satisfies ILlmSchema.IObject;\n    const human = {\n      ...props.schema,\n      properties: {} as Record<string, ILlmSchema>,\n    } satisfies ILlmSchema.IObject;\n\n    for (const [key, value] of Object.entries(props.schema.properties ?? {})) {\n      const [x, y] = separateStation({\n        predicate: props.predicate,\n        convention: props.convention,\n        $defs: props.$defs,\n        schema: value,\n      });\n      if (x !== null) llm.properties[key] = x;\n      if (y !== null) human.properties[key] = y;\n    }\n    if (\n      typeof props.schema.additionalProperties === \"object\" &&\n      props.schema.additionalProperties !== null\n    ) {\n      const [dx, dy] = separateStation({\n        predicate: props.predicate,\n        convention: props.convention,\n        $defs: props.$defs,\n        schema: props.schema.additionalProperties,\n      });\n      llm.additionalProperties = dx ?? false;\n      human.additionalProperties = dy ?? false;\n    }\n    return [\n      !!Object.keys(llm.properties).length || !!llm.additionalProperties\n        ? shrinkRequired(llm)\n        : null,\n      !!Object.keys(human.properties).length || human.additionalProperties\n        ? shrinkRequired(human)\n        : null,\n    ];\n  };\n\n  const separateReference = (props: {\n    predicate: (schema: ILlmSchema) => boolean;\n    convention: (key: string, type: \"llm\" | \"human\") => string;\n    $defs: Record<string, ILlmSchema>;\n    schema: ILlmSchema.IReference;\n  }): [ILlmSchema.IReference | null, ILlmSchema.IReference | null] => {\n    const key: string = props.schema.$ref.split(\"#/$defs/\")[1];\n    const humanKey: string = props.convention(key, \"human\");\n    const llmKey: string = props.convention(key, \"llm\");\n\n    // FIND EXISTING\n    if (props.$defs?.[humanKey] || props.$defs?.[llmKey])\n      return [\n        props.$defs?.[llmKey]\n          ? {\n              ...props.schema,\n              $ref: `#/$defs/${llmKey}`,\n            }\n          : null,\n        props.$defs?.[humanKey]\n          ? {\n              ...props.schema,\n              $ref: `#/$defs/${humanKey}`,\n            }\n          : null,\n      ];\n\n    // PRE-ASSIGNMENT\n    props.$defs![llmKey] = {};\n    props.$defs![humanKey] = {};\n\n    // DO COMPOSE\n    const schema: ILlmSchema = props.$defs?.[key]!;\n    const [llm, human] = separateStation({\n      predicate: props.predicate,\n      convention: props.convention,\n      $defs: props.$defs,\n      schema,\n    });\n    if (llm !== null) Object.assign(props.$defs[llmKey], llm);\n    if (human !== null) Object.assign(props.$defs[humanKey], human);\n\n    // ONLY ONE\n    if (llm === null || human === null) {\n      delete props.$defs[llmKey];\n      delete props.$defs[humanKey];\n      return llm === null ? [null, props.schema] : [props.schema, null];\n    }\n\n    // BOTH OF THEM\n    return [\n      llm !== null\n        ? {\n            ...props.schema,\n            $ref: `#/$defs/${llmKey}`,\n          }\n        : null,\n      human !== null\n        ? {\n            ...props.schema,\n            $ref: `#/$defs/${humanKey}`,\n          }\n        : null,\n    ];\n  };\n\n  const shrinkRequired = (s: ILlmSchema.IObject): ILlmSchema.IObject => {\n    s.required = s.required.filter((key) => s.properties?.[key] !== undefined);\n    return s;\n  };\n\n  /* -----------------------------------------------------------\n    INVERTERS\n  ----------------------------------------------------------- */\n  export const invert = (props: {\n    components: OpenApi.IComponents;\n    schema: ILlmSchema;\n    $defs: Record<string, ILlmSchema>;\n  }): OpenApi.IJsonSchema => {\n    const union: OpenApi.IJsonSchema[] = [];\n    const attribute: IJsonSchemaAttribute = {\n      title: props.schema.title,\n      description: props.schema.description,\n      deprecated: props.schema.deprecated,\n      readOnly: props.schema.readOnly,\n      writeOnly: props.schema.writeOnly,\n      example: props.schema.example,\n      examples: props.schema.examples,\n      ...Object.fromEntries(\n        Object.entries(props.schema).filter(\n          ([key, value]) => key.startsWith(\"x-\") && value !== undefined,\n        ),\n      ),\n    };\n\n    const next = (schema: ILlmSchema): OpenApi.IJsonSchema =>\n      invert({\n        components: props.components,\n        $defs: props.$defs,\n        schema,\n      });\n    const visit = (schema: ILlmSchema): void => {\n      if (LlmTypeChecker.isArray(schema))\n        union.push({\n          ...schema,\n          ...LlmDescriptionInverter.array(schema.description),\n          items: next(schema.items),\n        });\n      else if (LlmTypeChecker.isObject(schema))\n        union.push({\n          ...schema,\n          properties: Object.fromEntries(\n            Object.entries(schema.properties).map(([key, value]) => [\n              key,\n              next(value),\n            ]),\n          ),\n          additionalProperties:\n            typeof schema.additionalProperties === \"object\" &&\n            schema.additionalProperties !== null\n              ? next(schema.additionalProperties)\n              : schema.additionalProperties,\n        });\n      else if (LlmTypeChecker.isAnyOf(schema)) schema.anyOf.forEach(visit);\n      else if (LlmTypeChecker.isReference(schema)) {\n        const key: string = schema.$ref.split(\"#/$defs/\")[1];\n        if (props.components.schemas?.[key] === undefined) {\n          props.components.schemas ??= {};\n          props.components.schemas[key] = {};\n          props.components.schemas[key] = next(props.$defs[key] ?? {});\n        }\n        union.push({\n          ...schema,\n          $ref: `#/components/schemas/${key}`,\n        });\n      } else if (LlmTypeChecker.isBoolean(schema))\n        if (!!schema.enum?.length)\n          schema.enum.forEach((v) =>\n            union.push({\n              const: v,\n            }),\n          );\n        else union.push(schema);\n      else if (\n        LlmTypeChecker.isInteger(schema) ||\n        LlmTypeChecker.isNumber(schema)\n      )\n        if (!!schema.enum?.length)\n          schema.enum.forEach((v) =>\n            union.push({\n              const: v,\n            }),\n          );\n        else\n          union.push({\n            ...schema,\n            ...LlmDescriptionInverter.numeric(schema.description),\n            ...{ enum: undefined },\n          });\n      else if (LlmTypeChecker.isString(schema))\n        if (!!schema.enum?.length)\n          schema.enum.forEach((v) =>\n            union.push({\n              const: v,\n            }),\n          );\n        else\n          union.push({\n            ...schema,\n            ...LlmDescriptionInverter.string(schema.description),\n            ...{ enum: undefined },\n          });\n      else\n        union.push({\n          ...schema,\n        });\n    };\n    visit(props.schema);\n\n    return {\n      ...attribute,\n      ...(union.length === 0\n        ? { type: undefined }\n        : union.length === 1\n          ? { ...union[0] }\n          : {\n              oneOf: union.map((u) => ({ ...u, nullable: undefined })),\n              discriminator:\n                LlmTypeChecker.isAnyOf(props.schema) &&\n                props.schema[\"x-discriminator\"] !== undefined\n                  ? {\n                      propertyName:\n                        props.schema[\"x-discriminator\"].propertyName,\n                      mapping:\n                        props.schema[\"x-discriminator\"].mapping !== undefined\n                          ? Object.fromEntries(\n                              Object.entries(\n                                props.schema[\"x-discriminator\"].mapping,\n                              ).map(([key, value]) => [\n                                key,\n                                `#/components/schemas/${value.split(\"/\").at(-1)}`,\n                              ]),\n                            )\n                          : undefined,\n                    }\n                  : undefined,\n            }),\n    } satisfies OpenApi.IJsonSchema;\n  };\n\n  export const getConfig = (\n    config?: Partial<ILlmSchema.IConfig> | undefined,\n  ): ILlmSchema.IConfig => ({\n    reference: config?.reference ?? true,\n    strict: config?.strict ?? false,\n  });\n}\n\nconst validateStrict = (\n  schema: OpenApi.IJsonSchema,\n  accessor: string,\n): IOpenApiSchemaError.IReason[] => {\n  const reasons: IOpenApiSchemaError.IReason[] = [];\n  if (OpenApiTypeChecker.isObject(schema)) {\n    if (!!schema.additionalProperties)\n      reasons.push({\n        schema: schema,\n        accessor: `${accessor}.additionalProperties`,\n        message:\n          \"LLM does not allow additionalProperties in strict mode, the dynamic key typed object.\",\n      });\n    for (const key of Object.keys(schema.properties ?? {}))\n      if (schema.required?.includes(key) === false)\n        reasons.push({\n          schema: schema,\n          accessor: `${accessor}.properties.${key}`,\n          message: \"LLM does not allow optional properties in strict mode.\",\n        });\n  }\n  return reasons;\n};\n"],"names":["LlmSchemaComposer","parameters","props","config","getConfig","entity","LlmParametersFinder","method","success","$defs","result","transform","schema","value","additionalProperties","description","OpenApiTypeChecker","isReference","JsonDescriptionUtil","cascade","prefix","components","escape","accessor","refAccessor","union","attribute","title","deprecated","readOnly","writeOnly","example","examples","Object","fromEntries","entries","filter","key","startsWith","undefined","reasons","visit","closure","next","strict","push","validateStrict","isTuple","message","$ref","split","schemas","JSON","stringify","length","error","visitConstant","input","insert","matched","find","u","type","enum","isConstant","const","isOneOf","oneOf","forEach","s","i","target","reference","isRecursiveReference","out","converted","isObject","properties","map","values","some","v","required","take","isArray","items","OpenApiConstraintShifter","shiftArray","isString","shiftString","isNumber","isInteger","shiftNumeric","LlmTypeChecker","anyOf","discriminator","every","e","isNull","propertyName","mapping","at","separate","convention","NamingConvention","capitalize","llm","human","separateObject","predicate","output","endsWith","keys","validate","OpenApiValidator","create","invert","equals","separateStation","isUnknown","isAnyOf","separateArray","separateReference","x","y","dx","dy","shrinkRequired","humanKey","llmKey","assign","LlmDescriptionInverter","array","_a","isBoolean","numeric","string","nullable","includes"],"mappings":"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"}