ObjectOS
Referencia

Tipos de campo

Cada tipo de campo que puedes declarar en un objeto — qué almacena, qué opciones acepta y cómo se manifiesta en REST, Console y el AI Builder.

Tipos de campo

48 tipos de campo integrados, agrupados por familia. El esquema Zod completo está en packages/spec/src/data/field.zod.ts — esta página es un resumen práctico.

Propiedades fundamentales (cada campo)

PropiedadTipoPredeterminadoPropósito
namestring (snake_case)Identificador de máquina — segmento de ruta REST, columna SQL
labelstringEtiqueta de visualización en Console
typeFieldTypeConsulta las tablas de tipos a continuación
requiredbooleanfalseRestricción NOT NULL
uniquebooleanfalseÍndice único
searchablebooleanfalseIndexado para /api/v1/search
multiplebooleanfalseAlmacena un arreglo de valores
defaultValueunknownValor inicial (literal o CEL)
columnNamestring= nameSobrescribe la columna física de la BD
hiddenbooleanfalseOculta de las vistas predeterminadas de Console
readonlybooleanfalseDeshabilita en formularios
systembooleanfalseInyectado automáticamente (id, created_at, …)
indexbooleanfalseCrea un índice en la BD
externalIdbooleanfalseApto para upsert mediante clave externa
inlineHelpTextstringTexto de información sobre herramientas / ayuda
conditionalRequiredpredicado PObligatorio cuando el CEL es verdadero
trackHistorybooleanfalseMuestra los cambios de valor como entradas legibles en la línea de tiempo de actividad del registro (ADR-0052)

Familia de texto

TipoPara qué usarloOpciones clave
textcadenas cortasmaxLength, minLength
textareavarias líneasmaxLength
emailcorreo electrónicovalidado por formato; en minúsculas
urlURLvalidado por formato
phoneteléfonoE.164
passwordsecretos de un solo sentidocon hash por el subsistema de autenticación; nunca devuelto por GET
secretsecretos reversibles (claves de API, tokens, contraseñas de BD)cifrado en reposo mediante el proveedor de criptografía, almacenado como una referencia opaca, enmascarado al leer. Fail-closed: sin un proveedor configurado, las escrituras lanzan un error en lugar de persistir texto plano
markdowncuerpo markdownrenderizado en la vista previa de Console
htmlHTML saneadoDOMPurify al escribir
richtextWYSIWYGeditor de Console + JSON serializado

Números

TipoPara qué usarloOpciones clave
numberflotantesmin, max, precision, scale
currencydinerocurrencyConfig: { precision, currencyMode: 'fixed' | 'dynamic', defaultCurrency }
percent0–100 %min, max, scale

integer y decimal no son tipos separados — usa number con scale: 0 para enteros, precision+scale para decimales fijos.

Fecha / hora

TipoAlmacenaNotas
datefecha de calendariosin zona horaria
datetimeinstanteUTC
timehora del relojsin fecha

Lógica

TipoNotas
booleanCasilla de verificación
toggleIgual que boolean, con interfaz de interruptor

Selección

TipoNotas
selectOpción única — opciones declaradas en línea o referenciadas desde una lista de selección
multiselectVarias opciones, almacenadas como un arreglo
radioAlias de interfaz para select con renderizado de botones de opción
checkboxesAlias de interfaz para multiselect con renderizado de casillas de verificación

Estructura de las opciones:

options: [
  { value: 'low',    label: 'Low' },
  { value: 'high',   label: 'High',   color: '#e02' },
  { value: 'urgent', label: 'Urgent', color: '#c00' }
]

Relaciones

TipoCardinalidadSemántica
lookupmuchos a unoReferencia laxa; eliminar el padre no elimina el hijo de forma predeterminada
master_detailmuchos a uno, en cascadaEl hijo no puede existir sin el padre; los permisos se heredan del padre
treeautorreferenciaJerárquico (parent_id en el mismo objeto)

Opciones comunes:

{
  type: 'lookup',
  reference: 'account',                       // target object name
  referenceFilters: ['status:active'],        // narrow the lookup picker
  deleteBehavior: 'set_null'                  // 'set_null' | 'cascade' | 'restrict'
}

Calculados

TipoQué haceOpción clave
formulaValor derivado, evaluado al leer o al recalcularexpression: F\record.qty * record.unit_price`` — consulta CEL
summaryAcumulación sobre una relación hijasummaryOperations: { object, field, function } (count | sum | avg | min | max)
autonumberNúmero de visualización autoincrementalformat (p. ej. TKT-{0000}), startAt

Ejemplo de fórmula:

{
  name: 'profit_margin',
  type: 'formula',
  expression: F`(record.revenue - record.cost) / record.revenue * 100`
}

Multimedia

TipoPara qué usarloOpción clave
imageadjuntos de imagenfileAttachmentConfig (ver abajo)
filecualquier archivoigual
avatarfotos de perfilrecorte cuadrado, valores predeterminados sensatos
videosubidas de videocaptura de duración + miniatura
audioaudiovista previa de forma de onda
fileAttachmentConfig: {
  maxSize: 10_000_000,                        // bytes
  allowedTypes: ['image/png','image/jpeg'],
  virusScan: true,
  storageProvider: 's3',                       // see Configure → Storage
  imageValidation: { minWidth: 200, maxWidth: 4096, generateThumbnails: ['sm','md','lg'] }
}

Estructurados

TipoAlmacenaNotas
jsonJSON arbitrarioAlmacenado como JSONB en Postgres
compositesubregistro con campos nombradosEstructura en línea, no una tabla separada
repeaterarreglo de valores compuestosUno a muchos sin un objeto hijo

Interfaz mejorada

TipoNotas
locationlatitud/longitud + precisión
addresscalle / ciudad / región / código postal / país
codecampo de código fuente — language, theme, lineNumbers
colorcolorFormat: 'hex' | 'rgb' | 'rgba' | 'hsl', presetColors[]
rating1–N estrellas — max, icon
slidernúmero acotado con interfaz de control deslizante
signaturefirma dibujada, almacenada como imagen
qrcoderenderiza el valor como un código QR o de barras (EAN / UPC / Code128)
progressporcentaje derivado renderizado como una barra
tagsarreglo de etiquetas de formato libre con autocompletado
vectorcolumna de embedding — vectorConfig: { dimensions, distanceMetric: 'cosine' | 'euclidean', indexed, indexType: 'hnsw' | 'ivfflat' }

Campos del sistema (inyectados automáticamente en cada objeto)

CampoTipoNotas
idtext (ULID)clave primaria
created_atdatetimehora de inserción UTC
updated_atdatetimehora de última escritura UTC
created_bylookup → userquién insertó
updated_bylookup → userquién escribió por última vez
versionintegertoken de concurrencia optimista

No declaras estos campos — desactívalos por objeto con ObjectSpec.systemFields: false (rara vez es buena idea).

Cómo fluyen los campos a través de la pila

*.object.ts (field spec)

   ├─► Postgres / MySQL / SQLite column + index + constraint
   ├─► REST: validated on POST/PATCH, exposed on GET
   ├─► Console: form widget + list column
   ├─► AI Builder: tool argument schema (so the AI knows what to ask)
   └─► Audit: change-tracked if `trackHistory: true`

Consulta también

On this page