ObjectOS
Referenz

Feldtypen

Jeder Feldtyp, den du auf einem Objekt deklarieren kannst — was er speichert, welche Optionen er akzeptiert, wie er in REST, Console und im AI Builder erscheint.

Feldtypen

48 integrierte Feldtypen, gruppiert nach Familie. Das vollständige Zod-Schema befindet sich in packages/spec/src/data/field.zod.ts — diese Seite ist eine praktische Zusammenfassung.

Kerneigenschaften (jedes Feld)

EigenschaftTypStandardZweck
namestring (snake_case)Maschinen-Bezeichner — REST-Pfadsegment, SQL-Spalte
labelstringAnzeigebezeichnung in der Console
typeFieldTypeSiehe Typtabellen unten
requiredbooleanfalseNOT NULL-Beschränkung
uniquebooleanfalseEindeutiger Index
searchablebooleanfalseIndexiert für /api/v1/search
multiplebooleanfalseSpeichert ein Array von Werten
defaultValueunknownAnfangswert (Literal oder CEL)
columnNamestring= nameÜberschreibt physische DB-Spalte
hiddenbooleanfalseIn Standard-Console-Ansichten ausblenden
readonlybooleanfalseIn Formularen deaktivieren
systembooleanfalseAutomatisch eingefügt (id, created_at, …)
indexbooleanfalseErstellt einen DB-Index
externalIdbooleanfalseFür Upsert über externen Schlüssel geeignet
inlineHelpTextstringTooltip / Hilfetext
conditionalRequiredP-PrädikatErforderlich, wenn CEL wahr ist
trackHistorybooleanfalseWertänderungen als menschenlesbare Einträge auf der Aktivitäts-Timeline des Datensatzes darstellen (ADR-0052)

Text-Familie

TypVerwendung fürWichtige Optionen
textkurze ZeichenkettenmaxLength, minLength
textareamehrzeiligmaxLength
emailE-Mailformatvalidiert; kleingeschrieben
urlURLformatvalidiert
phoneTelefonE.164
passwordeinseitige Geheimnissevom Auth-Subsystem gehasht; nie von GET zurückgegeben
secretumkehrbare Geheimnisse (API-Schlüssel, Token, DB-Passwörter)im Ruhezustand über den Krypto-Provider verschlüsselt, als opake Referenz gespeichert, beim Lesen maskiert. Fail-closed — ohne konfigurierten Provider werfen Schreibvorgänge einen Fehler, statt Klartext zu speichern
markdownMarkdown-Inhaltin Console-Vorschau gerendert
htmlbereinigtes HTMLDOMPurify beim Schreiben
richtextWYSIWYGConsole-Editor + serialisiertes JSON

Zahlen

TypVerwendung fürWichtige Optionen
numberGleitkommazahlenmin, max, precision, scale
currencyGeldcurrencyConfig: { precision, currencyMode: 'fixed' | 'dynamic', defaultCurrency }
percent0–100 %min, max, scale

integer und decimal sind keine eigenen Typen — verwende number mit scale: 0 für Ganzzahlen, precision+scale für feste Dezimalstellen.

Datum / Uhrzeit

TypSpeichertHinweise
dateKalenderdatumkeine Zeitzone
datetimeZeitpunktUTC
timeUhrzeitkein Datum

Logik

TypHinweise
booleanKontrollkästchen
toggleWie boolean, Schalter-UI

Auswahl

TypHinweise
selectEinzelauswahl — Optionen inline deklariert oder aus einer Auswahlliste referenziert
multiselectMehrfachauswahl, als Array gespeichert
radioUI-Alias für select mit Radio-Button-Darstellung
checkboxesUI-Alias für multiselect mit Kontrollkästchen-Darstellung

Optionsform:

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

Beziehungen

TypKardinalitätSemantik
lookupviele-zu-einsLose Referenz; das Löschen des übergeordneten Datensatzes löscht das untergeordnete standardmäßig nicht
master_detailviele-zu-eins, kaskadierendUntergeordneter Datensatz kann ohne übergeordneten nicht existieren; Berechtigungen werden vom übergeordneten geerbt
treeSelbstreferenzHierarchisch (parent_id auf demselben Objekt)

Häufige Optionen:

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

Berechnet

TypFunktionWichtige Option
formulaAbgeleiteter Wert, beim Lesen oder Neuberechnen ausgewertetexpression: F\record.qty * record.unit_price`` — siehe CEL
summaryAggregation über eine untergeordnete BeziehungsummaryOperations: { object, field, function } (count | sum | avg | min | max)
autonumberAutomatisch hochzählende Anzeigenummerformat (z. B. TKT-{0000}), startAt

Formel-Beispiel:

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

Medien

TypVerwendung fürWichtige Option
imageBildanhängefileAttachmentConfig (siehe unten)
filebeliebige Dateidasselbe
avatarProfilbilderquadratischer Zuschnitt, sinnvolle Standardwerte
videoVideo-UploadsDauer + Thumbnail-Erfassung
audioAudioWellenform-Vorschau
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'] }
}

Strukturiert

TypSpeichertHinweise
jsonbeliebiges JSONAuf Postgres als JSONB gespeichert
compositeUnterdatensatz mit benannten FeldernInline-Struktur, keine separate Tabelle
repeaterArray von zusammengesetzten WertenEins-zu-viele ohne untergeordnetes Objekt

Erweiterte UI

TypHinweise
locationBreiten-/Längengrad + Genauigkeit
addressStraße / Stadt / Region / Postleitzahl / Land
codeQuellcode-Feld — language, theme, lineNumbers
colorcolorFormat: 'hex' | 'rgb' | 'rgba' | 'hsl', presetColors[]
rating1–N Sterne — max, icon
sliderbegrenzte Zahl mit Schieberegler-UI
signaturegezeichnete Unterschrift, als Bild gespeichert
qrcoderendert den Wert als QR-Code oder Barcode (EAN / UPC / Code128)
progressabgeleiteter Prozentwert als Balken dargestellt
tagsfrei wählbares Tag-Array mit Autovervollständigung
vectorEmbedding-Spalte — vectorConfig: { dimensions, distanceMetric: 'cosine' | 'euclidean', indexed, indexType: 'hnsw' | 'ivfflat' }

Systemfelder (automatisch auf jedem Objekt eingefügt)

FeldTypHinweise
idtext (ULID)Primärschlüssel
created_atdatetimeUTC-Einfügezeit
updated_atdatetimeUTC-Zeit der letzten Schreiboperation
created_bylookup → userwer eingefügt hat
updated_bylookup → userwer zuletzt geschrieben hat
versionintegerToken für optimistische Nebenläufigkeit

Diese deklarierst du nicht — deaktiviere sie pro Objekt mit ObjectSpec.systemFields: false (selten eine gute Idee).

Wie Felder durch den Stack fließen

*.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`

Siehe auch

On this page