@objectstack/platform-objects 7.3.0 → 7.4.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.
Files changed (51) hide show
  1. package/dist/apps/index.d.mts +45 -19
  2. package/dist/apps/index.d.ts +45 -19
  3. package/dist/apps/index.js +1434 -3406
  4. package/dist/apps/index.js.map +1 -1
  5. package/dist/apps/index.mjs +1434 -3407
  6. package/dist/apps/index.mjs.map +1 -1
  7. package/dist/audit/index.d.mts +4595 -26176
  8. package/dist/audit/index.d.ts +4595 -26176
  9. package/dist/audit/index.js +63 -1063
  10. package/dist/audit/index.js.map +1 -1
  11. package/dist/audit/index.mjs +64 -1057
  12. package/dist/audit/index.mjs.map +1 -1
  13. package/dist/identity/index.d.mts +839 -1281
  14. package/dist/identity/index.d.ts +839 -1281
  15. package/dist/index.d.mts +3 -8
  16. package/dist/index.d.ts +3 -8
  17. package/dist/index.js +2344 -6782
  18. package/dist/index.js.map +1 -1
  19. package/dist/index.mjs +2343 -6767
  20. package/dist/index.mjs.map +1 -1
  21. package/dist/integration/index.d.mts +1 -2947
  22. package/dist/integration/index.d.ts +1 -2947
  23. package/dist/integration/index.js +0 -136
  24. package/dist/integration/index.js.map +1 -1
  25. package/dist/integration/index.mjs +0 -135
  26. package/dist/integration/index.mjs.map +1 -1
  27. package/dist/metadata/index.d.mts +3924 -261
  28. package/dist/metadata/index.d.ts +3924 -261
  29. package/dist/metadata/index.js +101 -0
  30. package/dist/metadata/index.js.map +1 -1
  31. package/dist/metadata/index.mjs +101 -1
  32. package/dist/metadata/index.mjs.map +1 -1
  33. package/dist/metadata-translations/index.js +597 -505
  34. package/dist/metadata-translations/index.js.map +1 -1
  35. package/dist/metadata-translations/index.mjs +597 -505
  36. package/dist/metadata-translations/index.mjs.map +1 -1
  37. package/dist/plugin.js +1790 -3614
  38. package/dist/plugin.js.map +1 -1
  39. package/dist/plugin.mjs +1790 -3614
  40. package/dist/plugin.mjs.map +1 -1
  41. package/dist/security/index.d.mts +1 -18850
  42. package/dist/security/index.d.ts +1 -18850
  43. package/dist/security/index.js +0 -1531
  44. package/dist/security/index.js.map +1 -1
  45. package/dist/security/index.mjs +0 -1523
  46. package/dist/security/index.mjs.map +1 -1
  47. package/dist/system/index.d.mts +144 -212
  48. package/dist/system/index.d.ts +144 -212
  49. package/package.json +2 -2
  50. package/dist/state-machine.zod-BNanU03M.d-Ek3_yo9P.d.mts +0 -41
  51. package/dist/state-machine.zod-BNanU03M.d-Ek3_yo9P.d.ts +0 -41
@@ -487,10 +487,111 @@ var SysMetadataAuditObject = data.ObjectSchema.create({
487
487
  trash: false
488
488
  }
489
489
  });
490
+ var SysViewDefinitionObject = data.ObjectSchema.create({
491
+ name: "sys_view_definition",
492
+ label: "View Definition",
493
+ pluralLabel: "View Definitions",
494
+ icon: "layout-grid",
495
+ isSystem: true,
496
+ description: "Runtime-authored view definitions (shared / personal layers). The package layer ships from source.",
497
+ fields: {
498
+ /** Primary Key (UUID) */
499
+ id: data.Field.text({ label: "ID", required: true, readonly: true }),
500
+ /**
501
+ * Globally-unique qualified view id, `<object>.<viewKey>`, matching the
502
+ * spec `ViewItemSchema.name`. For personal views the runtime may suffix
503
+ * to keep it unique per owner.
504
+ */
505
+ name: data.Field.text({
506
+ label: "Name",
507
+ required: true,
508
+ searchable: true,
509
+ maxLength: 255
510
+ }),
511
+ /** Bound object — the foreign key used to aggregate views for the switcher. */
512
+ object: data.Field.text({
513
+ label: "Object",
514
+ required: true,
515
+ searchable: true,
516
+ maxLength: 255
517
+ }),
518
+ /** Whether `config` is a ListView (list family) or a FormView. */
519
+ view_kind: data.Field.select(["list", "form"], {
520
+ label: "View Kind",
521
+ required: true,
522
+ defaultValue: "list"
523
+ }),
524
+ /** Display label (plain string; i18n keys also accepted). */
525
+ label: data.Field.text({ label: "Label", required: false, maxLength: 255 }),
526
+ /** Whether this is the object's default view in the switcher. */
527
+ is_default: data.Field.boolean({ label: "Is Default", required: false, defaultValue: false }),
528
+ /** Sort order within the object's switcher / left rail. */
529
+ view_order: data.Field.number({ label: "Order", required: false, defaultValue: 0 }),
530
+ /**
531
+ * Identity layer. Only `shared` and `personal` are stored at runtime;
532
+ * `package` views come from source.
533
+ */
534
+ scope: data.Field.select(["shared", "personal"], {
535
+ label: "Scope",
536
+ required: true,
537
+ defaultValue: "personal"
538
+ }),
539
+ /** Owner user id — set when scope = personal; null for shared. */
540
+ owner: data.Field.text({ label: "Owner", required: false, maxLength: 255 }),
541
+ /** Hidden from the switcher (per-user / per-org declutter). */
542
+ hidden: data.Field.boolean({ label: "Hidden", required: false, defaultValue: false }),
543
+ /** The ListView / FormView configuration payload. */
544
+ config: data.Field.json({
545
+ label: "Config",
546
+ required: true,
547
+ description: "ListView or FormView configuration (matches spec ViewItem.config)."
548
+ }),
549
+ /** Organization for multi-tenant isolation. */
550
+ organization_id: data.Field.lookup("sys_organization", {
551
+ label: "Organization",
552
+ required: false,
553
+ description: "Organization for multi-tenant isolation."
554
+ }),
555
+ /** Lifecycle state. */
556
+ state: data.Field.select(["draft", "active", "archived"], {
557
+ label: "State",
558
+ required: false,
559
+ defaultValue: "active"
560
+ }),
561
+ /** Audit fields. */
562
+ created_by: data.Field.lookup("sys_user", { label: "Created By", required: false, readonly: true }),
563
+ created_at: data.Field.datetime({ label: "Created At", required: false, readonly: true }),
564
+ updated_by: data.Field.lookup("sys_user", { label: "Updated By", required: false }),
565
+ updated_at: data.Field.datetime({ label: "Updated At", required: false })
566
+ },
567
+ indexes: [
568
+ // A given view name is unique per (organization, owner) among active rows —
569
+ // a shared view (owner NULL) and each user's personal views don't collide.
570
+ {
571
+ name: "idx_sys_view_def_active",
572
+ fields: ["name", "organization_id", "owner"],
573
+ unique: true,
574
+ partial: "state = 'active'"
575
+ },
576
+ // The switcher query: views for one object within a tenant.
577
+ { name: "idx_sys_view_def_object", fields: ["organization_id", "object"] },
578
+ { fields: ["scope"] },
579
+ { fields: ["owner"] },
580
+ { fields: ["state"] }
581
+ ],
582
+ enable: {
583
+ trackHistory: true,
584
+ searchable: false,
585
+ apiEnabled: true,
586
+ apiMethods: ["get", "list", "create", "update", "delete"],
587
+ trash: false
588
+ }
589
+ });
490
590
 
491
591
  exports.SysMetadata = SysMetadataObject;
492
592
  exports.SysMetadataAuditObject = SysMetadataAuditObject;
493
593
  exports.SysMetadataHistoryObject = SysMetadataHistoryObject;
494
594
  exports.SysMetadataObject = SysMetadataObject;
595
+ exports.SysViewDefinitionObject = SysViewDefinitionObject;
495
596
  //# sourceMappingURL=index.js.map
496
597
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/metadata/sys-metadata.object.ts","../../src/metadata/sys-metadata-history.object.ts","../../src/metadata/sys-metadata-audit.object.ts"],"names":["ObjectSchema","Field"],"mappings":"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","file":"index.js","sourcesContent":["// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport { ObjectSchema, Field } from '@objectstack/spec/data';\n\n/**\n * sys_metadata — System Metadata Object\n *\n * Canonical ObjectStack object definition for the metadata persistence table.\n * Stores all platform-scope and user-scope metadata records (Objects, Views,\n * Flows, etc.) using the MetadataRecordSchema envelope.\n *\n * This is a system object (isSystem: true) — protected from deletion and\n * automatically provisioned by the DatabaseLoader on first use.\n *\n * @see MetadataRecordSchema in metadata-persistence.zod.ts\n */\nexport const SysMetadataObject = ObjectSchema.create({\n name: 'sys_metadata',\n label: 'System Metadata',\n pluralLabel: 'System Metadata',\n icon: 'settings',\n isSystem: true,\n // managedBy: 'system' — the metadata table backs every other config\n // object. Writing rows directly here bypasses the typed Zod APIs and\n // would let an admin inject malformed payloads. The \"All Metadata\"\n // menu is therefore a read-only debug surface (Export only); typed\n // edits flow through the dedicated per-type pages (Approval Process,\n // Sharing Rule, etc.).\n managedBy: 'system',\n description: 'Stores platform and user-scope metadata records (objects, views, flows, etc.)',\n\n fields: {\n /** Primary Key (UUID) */\n id: Field.text({\n label: 'ID',\n required: true,\n readonly: true,\n }),\n\n /** Machine name — unique identifier used in code references */\n name: Field.text({\n label: 'Name',\n required: true,\n searchable: true,\n maxLength: 255,\n }),\n\n /** Metadata type (e.g. \"object\", \"view\", \"flow\") */\n type: Field.text({\n label: 'Metadata Type',\n required: true,\n searchable: true,\n maxLength: 100,\n }),\n\n /** Namespace / module grouping (e.g. \"crm\", \"core\") */\n namespace: Field.text({\n label: 'Namespace',\n required: false,\n defaultValue: 'default',\n maxLength: 100,\n }),\n\n /** Package that owns/delivered this metadata (legacy string identifier, kept for compat) */\n package_id: Field.text({\n label: 'Package ID',\n required: false,\n maxLength: 255,\n description: 'Legacy package manifest ID string. Use package_version_id for new records.',\n }),\n\n /**\n * FK → sys_package_version (UUID). Set for metadata that belongs to a specific\n * package release snapshot. NULL = platform-built-in or environment override.\n */\n package_version_id: Field.lookup('sys_package_version', {\n label: 'Package Version',\n required: false,\n description:\n 'Foreign key to sys_package_version (UUID). Null = platform-built-in or env-level override.',\n }),\n\n /** Who manages this record: package, platform, or user */\n managed_by: Field.select(['package', 'platform', 'user'], {\n label: 'Managed By',\n required: false,\n }),\n\n /** Scope: system (code), platform (admin DB), user (personal DB) */\n scope: Field.select(['system', 'platform', 'user'], {\n label: 'Scope',\n required: true,\n defaultValue: 'platform',\n }),\n\n /** JSON payload — the actual metadata configuration */\n metadata: Field.textarea({\n label: 'Metadata',\n required: true,\n description: 'JSON-serialized metadata payload',\n }),\n\n /** Parent metadata name for extension/override */\n extends: Field.text({\n label: 'Extends',\n required: false,\n maxLength: 255,\n }),\n\n /** Merge strategy when extending parent metadata */\n strategy: Field.select(['merge', 'replace'], {\n label: 'Strategy',\n required: false,\n defaultValue: 'merge',\n }),\n\n /** Owner user ID (for user-scope items) */\n owner: Field.text({\n label: 'Owner',\n required: false,\n maxLength: 255,\n }),\n\n /** Lifecycle state */\n state: Field.select(['draft', 'active', 'archived', 'deprecated'], {\n label: 'State',\n required: false,\n defaultValue: 'active',\n }),\n\n /** Organization ID for multi-tenant isolation */\n organization_id: Field.lookup('sys_organization', {\n label: 'Organization',\n required: false,\n description: 'Organization for multi-tenant isolation.',\n }),\n\n /**\n * @deprecated ADR-0005 (revised 2026-05): per-env DBs replace per-project\n * isolation. `environment_id` is no longer written by saveMetaItem and not\n * consulted by overlay reads. Kept for legacy rows; new writes leave it\n * NULL. Will be dropped in a future schema migration.\n */\n environment_id: Field.lookup('sys_environment', {\n label: 'Environment (deprecated)',\n required: false,\n description: 'DEPRECATED. Use organization_id for tenant isolation.',\n }),\n\n /** Version number for optimistic concurrency */\n version: Field.number({\n label: 'Version',\n required: false,\n defaultValue: 1,\n }),\n\n /** Content checksum for change detection (e.g. `sha256:<64 hex>` = 71 chars) */\n checksum: Field.text({\n label: 'Checksum',\n required: false,\n maxLength: 71,\n }),\n\n /** Origin of this metadata record */\n source: Field.select(['filesystem', 'database', 'api', 'migration'], {\n label: 'Source',\n required: false,\n }),\n\n /** Classification tags (JSON array) */\n tags: Field.textarea({\n label: 'Tags',\n required: false,\n description: 'JSON-serialized array of classification tags',\n }),\n\n /** Audit fields */\n created_by: Field.lookup('sys_user', {\n label: 'Created By',\n required: false,\n readonly: true,\n }),\n\n created_at: Field.datetime({\n label: 'Created At',\n required: false,\n readonly: true,\n }),\n\n updated_by: Field.lookup('sys_user', {\n label: 'Updated By',\n required: false,\n }),\n\n updated_at: Field.datetime({\n label: 'Updated At',\n required: false,\n }),\n },\n\n indexes: [\n // ADR-0005 (revised 2026-05): overlay uniqueness is scoped by\n // (type, name, organization_id), restricted to active rows so resets\n // / archived versions don't collide. environment_id is deprecated and\n // not part of the discriminator. The runtime layer (protocol.ts\n // ensureOverlayIndex) issues a DROP-then-CREATE migration to\n // replace any pre-existing legacy composite index in-place.\n {\n name: 'idx_sys_metadata_overlay_active',\n fields: ['type', 'name', 'organization_id'],\n unique: true,\n partial: \"state = 'active'\",\n },\n { name: 'idx_sys_metadata_org_type', fields: ['organization_id', 'type'] },\n { fields: ['type', 'scope'] },\n { fields: ['package_version_id'] },\n { fields: ['state'] },\n { fields: ['namespace'] },\n ],\n\n enable: {\n trackHistory: true,\n searchable: false,\n apiEnabled: true,\n apiMethods: ['get', 'list', 'create', 'update', 'delete'],\n trash: false,\n },\n\n // Named list views — power the Setup App \"Data Model\" group so admins\n // can browse object/field metadata in a typed grid instead of the raw\n // `All Metadata` debug surface. Each entry pre-filters by `type` and\n // shows the columns that matter for that type. The dedicated visual\n // designer (objectui's <ObjectManager> / <FieldDesigner>) deep-links\n // from the row's `Edit in Designer` action; the grid stays useful for\n // search, audit (state / updated_at) and triage.\n listViews: {\n only_objects: {\n type: 'grid',\n name: 'only_objects',\n label: 'Objects',\n data: { provider: 'object', object: 'sys_metadata' },\n columns: ['name', 'namespace', 'scope', 'managed_by', 'state', 'updated_at'],\n filter: [{ field: 'type', operator: 'equals', value: 'object' }],\n sort: [{ field: 'name', order: 'asc' }],\n pagination: { pageSize: 50 },\n },\n only_fields: {\n type: 'grid',\n name: 'only_fields',\n label: 'Fields',\n data: { provider: 'object', object: 'sys_metadata' },\n columns: ['name', 'namespace', 'scope', 'managed_by', 'state', 'updated_at'],\n filter: [{ field: 'type', operator: 'equals', value: 'field' }],\n sort: [{ field: 'name', order: 'asc' }],\n pagination: { pageSize: 50 },\n },\n all_metadata: {\n type: 'grid',\n name: 'all_metadata',\n label: 'All',\n data: { provider: 'object', object: 'sys_metadata' },\n columns: ['name', 'type', 'namespace', 'scope', 'state', 'updated_at'],\n sort: [{ field: 'updated_at', order: 'desc' }],\n pagination: { pageSize: 50 },\n },\n },\n});\n","// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport { ObjectSchema, Field } from '@objectstack/spec/data';\n\n/**\n * sys_metadata_history — Metadata Version History / Event Log\n *\n * Append-only durable log of every overlay change made through\n * `SysMetadataRepository.put` / `delete` (ADR-0008 §10 M1). Each row is a\n * single event in the per-organisation event log; rows are NEVER\n * mutated after insertion. The legacy `DatabaseLoader` writes the same\n * shape from its own put/restore code paths.\n *\n * ─────────────────────────────────────────────────────────────────────\n * Key design points (ADR-0008 §0 amendment + M1):\n *\n * • Keyed by `(organization_id, type, name)` only — `environment_id` was\n * removed in the branch/project-removal amendment. The original\n * `metadata_id` column (a downgraded plain-text version of the old\n * `sys_metadata.id` FK) was removed in the M1 follow-up — joins go\n * through `(organization_id, type, name, version)` exclusively.\n *\n * • `event_seq` is the per-org monotonic event-log cursor. Producers\n * compute `MAX(event_seq) + 1 WHERE organization_id = X` inside the\n * same transaction as the parent `sys_metadata` write.\n *\n * • `version` is the per-(org,type,name) lineage counter. Producers\n * compute `MAX(version) + 1 WHERE organization_id = X AND type = T\n * AND name = N` so delete + recreate continues incrementing instead\n * of restarting at 1.\n *\n * • `metadata` / `checksum` are nullable — DELETE rows have no body or\n * hash. Readers must tolerate null on both columns.\n *\n * • `source` records the producer ('sys-metadata-repo', 'fs',\n * 'studio', …) and feeds MetadataEvent.source on history() reads.\n *\n * Indexes are purpose-built for the two dominant read patterns:\n * 1. per-item history view → `(organization_id, type, name, version)`\n * 2. org-wide event replay → `(organization_id, event_seq)`\n * ─────────────────────────────────────────────────────────────────────\n */\nexport const SysMetadataHistoryObject = ObjectSchema.create({\n name: 'sys_metadata_history',\n label: 'Metadata History',\n pluralLabel: 'Metadata History',\n icon: 'history',\n isSystem: true,\n managedBy: 'system',\n description: 'Durable event log of metadata overlay changes (per-org, append-only)',\n\n fields: {\n /** Primary Key (UUID) */\n id: Field.text({\n label: 'ID',\n required: true,\n readonly: true,\n }),\n\n /** Per-org monotonic event sequence (durable cursor for replay). */\n event_seq: Field.number({\n label: 'Event Seq',\n required: true,\n readonly: true,\n description: 'Per-organization monotonic event log cursor.',\n }),\n\n /** Machine name (denormalized for easier querying) */\n name: Field.text({\n label: 'Name',\n required: true,\n searchable: true,\n readonly: true,\n maxLength: 255,\n }),\n\n /** Metadata type (denormalized for easier querying) */\n type: Field.text({\n label: 'Metadata Type',\n required: true,\n searchable: true,\n readonly: true,\n maxLength: 100,\n }),\n\n /** Per-(org,type,name) lineage counter at this snapshot. */\n version: Field.number({\n label: 'Version',\n required: true,\n readonly: true,\n }),\n\n /** Type of operation that created this history entry */\n operation_type: Field.select(['create', 'update', 'publish', 'revert', 'delete'], {\n label: 'Operation Type',\n required: true,\n readonly: true,\n }),\n\n /**\n * Historical metadata snapshot (JSON payload).\n * Null for `operation_type = 'delete'` — the row carries no body.\n */\n metadata: Field.textarea({\n label: 'Metadata',\n required: false,\n readonly: true,\n description: 'JSON-serialized metadata snapshot at this version (null for deletes).',\n }),\n\n /** SHA-256 checksum of metadata content (null for deletes). */\n checksum: Field.text({\n label: 'Checksum',\n required: false,\n readonly: true,\n maxLength: 80,\n }),\n\n /** Checksum of the previous version (null for the first event). */\n previous_checksum: Field.text({\n label: 'Previous Checksum',\n required: false,\n readonly: true,\n maxLength: 80,\n }),\n\n /** Human-readable description of changes (= MetadataEvent.message). */\n change_note: Field.textarea({\n label: 'Change Note',\n required: false,\n readonly: true,\n description: 'Description of what changed in this version.',\n }),\n\n /**\n * Producer of the event ('sys-metadata-repo', 'fs', 'studio',\n * 'api', …). Defaults to 'sys-metadata-repo' on the canonical\n * write path; preserved on history() reads as MetadataEvent.source.\n */\n source: Field.text({\n label: 'Source',\n required: false,\n readonly: true,\n maxLength: 64,\n }),\n\n /** Organization ID for multi-tenant isolation */\n organization_id: Field.lookup('sys_organization', {\n label: 'Organization',\n required: false,\n readonly: true,\n description: 'Organization for multi-tenant isolation.',\n }),\n\n /** User who made this change (= MetadataEvent.actor). */\n recorded_by: Field.lookup('sys_user', {\n label: 'Recorded By',\n required: false,\n readonly: true,\n }),\n\n /** When was this version recorded */\n recorded_at: Field.datetime({\n label: 'Recorded At',\n required: true,\n readonly: true,\n }),\n },\n\n indexes: [\n { fields: ['organization_id', 'event_seq'], unique: true },\n { fields: ['organization_id', 'type', 'name', 'version'], unique: true },\n { fields: ['organization_id', 'type', 'name', 'recorded_at'] },\n // ADR-0009: getByHash() lookup — execution-pinned types resolve a\n // historical body by content hash via this index.\n { fields: ['organization_id', 'type', 'name', 'checksum'] },\n { fields: ['type', 'name'] },\n { fields: ['recorded_at'] },\n { fields: ['operation_type'] },\n ],\n\n enable: {\n trackHistory: false,\n searchable: false,\n apiEnabled: true,\n apiMethods: ['get', 'list'],\n trash: false,\n },\n});\n","// Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport { ObjectSchema, Field } from '@objectstack/spec/data';\n\n/**\n * sys_metadata_audit — Metadata Protection Audit Log\n *\n * Append-only audit trail for every metadata write **decision** — both\n * allowed writes and refused ones. Introduced in ADR-0010 Phase 1 as\n * the compliance surface for the new `_lock` enforcement: every PUT /\n * publish / rollback / delete that targets `sys_metadata` writes one\n * row here describing the outcome and the lock state that produced it.\n *\n * Distinct from `sys_metadata_history`:\n * - `sys_metadata_history` records the **body** of every successful\n * write (full JSON snapshot + checksum). Used for rollback,\n * diff, and history() reads.\n * - `sys_metadata_audit` records the **decision** (who tried what,\n * what code was emitted, was a lock involved). Refused writes\n * never reach history; they DO reach audit.\n *\n * Designed as the smallest possible row that satisfies the four\n * compliance questions of metadata governance:\n * 1. Who tried to change what? → actor + type + name\n * 2. When? → occurred_at\n * 3. What outcome? → outcome + code\n * 4. Was an override involved? → lock_overridden + lock_state\n *\n * Indexed on `(organization_id, occurred_at)` for the per-org timeline\n * query and `(type, name, occurred_at)` for the per-item history tab\n * Studio surfaces on the editor page.\n */\nexport const SysMetadataAuditObject = ObjectSchema.create({\n name: 'sys_metadata_audit',\n label: 'Metadata Audit',\n pluralLabel: 'Metadata Audit',\n icon: 'shield-check',\n isSystem: true,\n managedBy: 'append-only',\n description: 'Append-only audit trail of metadata write decisions (ADR-0010).',\n\n fields: {\n /** Primary Key (UUID) */\n id: Field.text({\n label: 'ID',\n required: true,\n readonly: true,\n }),\n\n /** When the decision was made (ISO-8601 UTC). */\n occurred_at: Field.datetime({\n label: 'Occurred At',\n required: true,\n readonly: true,\n }),\n\n /** Acting principal (user id, system id, or 'system'). */\n actor: Field.text({\n label: 'Actor',\n required: true,\n readonly: true,\n maxLength: 255,\n description: 'Acting principal — user id, system id, or \"system\".',\n }),\n\n /** Code path that produced the decision (e.g. `protocol.saveMetaItem`). */\n source: Field.text({\n label: 'Source',\n required: false,\n readonly: true,\n maxLength: 128,\n }),\n\n /** Metadata type (singular, e.g. `app`, `object`, `view`). */\n type: Field.text({\n label: 'Metadata Type',\n required: true,\n readonly: true,\n searchable: true,\n maxLength: 100,\n }),\n\n /** Item machine name. */\n name: Field.text({\n label: 'Name',\n required: true,\n readonly: true,\n searchable: true,\n maxLength: 255,\n }),\n\n /** Organization for multi-tenant filtering. NULL for env-wide writes. */\n organization_id: Field.lookup('sys_organization', {\n label: 'Organization',\n required: false,\n readonly: true,\n }),\n\n /** Operation kind. */\n operation: Field.select(['save', 'publish', 'rollback', 'delete', 'reset'], {\n label: 'Operation',\n required: true,\n readonly: true,\n }),\n\n /** Decision outcome — allowed, denied (refused), or forced (bypassed via override). */\n outcome: Field.select(['allowed', 'denied', 'forced'], {\n label: 'Outcome',\n required: true,\n readonly: true,\n }),\n\n /**\n * Machine-readable code for the decision:\n * - on `allowed`: `'ok'`\n * - on `denied`: `'not_overridable'` | `'not_creatable'` |\n * `'item_locked'` | `'invalid_metadata'` | `'destructive_change'` |\n * `'metadata_conflict'`\n * - on `forced`: `'lock_override'` (Phase 3)\n */\n code: Field.text({\n label: 'Code',\n required: true,\n readonly: true,\n maxLength: 64,\n }),\n\n /**\n * Lock state observed at the time of the decision (`none` if the\n * item carried no `_lock`). Captured even on `allowed` rows so\n * later compliance queries can see \"what was the lock state when\n * this write succeeded\".\n */\n lock_state: Field.select(['none', 'no-overlay', 'no-delete', 'full'], {\n label: 'Lock State',\n required: false,\n readonly: true,\n }),\n\n /** True when the write succeeded by bypassing a lock (Phase 3). */\n lock_overridden: Field.boolean({\n label: 'Lock Overridden',\n required: false,\n readonly: true,\n }),\n\n /** Optional request correlation id for tracing. */\n request_id: Field.text({\n label: 'Request ID',\n required: false,\n readonly: true,\n maxLength: 128,\n }),\n\n /** Optional free-form context (e.g. brief diff summary). */\n note: Field.textarea({\n label: 'Note',\n required: false,\n readonly: true,\n }),\n },\n\n indexes: [\n { fields: ['organization_id', 'occurred_at'] },\n { fields: ['type', 'name', 'occurred_at'] },\n { fields: ['actor', 'occurred_at'] },\n { fields: ['outcome'] },\n ],\n\n enable: {\n trackHistory: false,\n searchable: false,\n apiEnabled: true,\n apiMethods: ['get', 'list'],\n trash: false,\n },\n});\n"]}
1
+ {"version":3,"sources":["../../src/metadata/sys-metadata.object.ts","../../src/metadata/sys-metadata-history.object.ts","../../src/metadata/sys-metadata-audit.object.ts","../../src/metadata/sys-view-definition.object.ts"],"names":["ObjectSchema","Field"],"mappings":"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","file":"index.js","sourcesContent":["// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport { ObjectSchema, Field } from '@objectstack/spec/data';\n\n/**\n * sys_metadata — System Metadata Object\n *\n * Canonical ObjectStack object definition for the metadata persistence table.\n * Stores all platform-scope and user-scope metadata records (Objects, Views,\n * Flows, etc.) using the MetadataRecordSchema envelope.\n *\n * This is a system object (isSystem: true) — protected from deletion and\n * automatically provisioned by the DatabaseLoader on first use.\n *\n * @see MetadataRecordSchema in metadata-persistence.zod.ts\n */\nexport const SysMetadataObject = ObjectSchema.create({\n name: 'sys_metadata',\n label: 'System Metadata',\n pluralLabel: 'System Metadata',\n icon: 'settings',\n isSystem: true,\n // managedBy: 'system' — the metadata table backs every other config\n // object. Writing rows directly here bypasses the typed Zod APIs and\n // would let an admin inject malformed payloads. The \"All Metadata\"\n // menu is therefore a read-only debug surface (Export only); typed\n // edits flow through the dedicated per-type pages (Approval Process,\n // Sharing Rule, etc.).\n managedBy: 'system',\n description: 'Stores platform and user-scope metadata records (objects, views, flows, etc.)',\n\n fields: {\n /** Primary Key (UUID) */\n id: Field.text({\n label: 'ID',\n required: true,\n readonly: true,\n }),\n\n /** Machine name — unique identifier used in code references */\n name: Field.text({\n label: 'Name',\n required: true,\n searchable: true,\n maxLength: 255,\n }),\n\n /** Metadata type (e.g. \"object\", \"view\", \"flow\") */\n type: Field.text({\n label: 'Metadata Type',\n required: true,\n searchable: true,\n maxLength: 100,\n }),\n\n /** Namespace / module grouping (e.g. \"crm\", \"core\") */\n namespace: Field.text({\n label: 'Namespace',\n required: false,\n defaultValue: 'default',\n maxLength: 100,\n }),\n\n /** Package that owns/delivered this metadata (legacy string identifier, kept for compat) */\n package_id: Field.text({\n label: 'Package ID',\n required: false,\n maxLength: 255,\n description: 'Legacy package manifest ID string. Use package_version_id for new records.',\n }),\n\n /**\n * FK → sys_package_version (UUID). Set for metadata that belongs to a specific\n * package release snapshot. NULL = platform-built-in or environment override.\n */\n package_version_id: Field.lookup('sys_package_version', {\n label: 'Package Version',\n required: false,\n description:\n 'Foreign key to sys_package_version (UUID). Null = platform-built-in or env-level override.',\n }),\n\n /** Who manages this record: package, platform, or user */\n managed_by: Field.select(['package', 'platform', 'user'], {\n label: 'Managed By',\n required: false,\n }),\n\n /** Scope: system (code), platform (admin DB), user (personal DB) */\n scope: Field.select(['system', 'platform', 'user'], {\n label: 'Scope',\n required: true,\n defaultValue: 'platform',\n }),\n\n /** JSON payload — the actual metadata configuration */\n metadata: Field.textarea({\n label: 'Metadata',\n required: true,\n description: 'JSON-serialized metadata payload',\n }),\n\n /** Parent metadata name for extension/override */\n extends: Field.text({\n label: 'Extends',\n required: false,\n maxLength: 255,\n }),\n\n /** Merge strategy when extending parent metadata */\n strategy: Field.select(['merge', 'replace'], {\n label: 'Strategy',\n required: false,\n defaultValue: 'merge',\n }),\n\n /** Owner user ID (for user-scope items) */\n owner: Field.text({\n label: 'Owner',\n required: false,\n maxLength: 255,\n }),\n\n /** Lifecycle state */\n state: Field.select(['draft', 'active', 'archived', 'deprecated'], {\n label: 'State',\n required: false,\n defaultValue: 'active',\n }),\n\n /** Organization ID for multi-tenant isolation */\n organization_id: Field.lookup('sys_organization', {\n label: 'Organization',\n required: false,\n description: 'Organization for multi-tenant isolation.',\n }),\n\n /**\n * @deprecated ADR-0005 (revised 2026-05): per-env DBs replace per-project\n * isolation. `environment_id` is no longer written by saveMetaItem and not\n * consulted by overlay reads. Kept for legacy rows; new writes leave it\n * NULL. Will be dropped in a future schema migration.\n */\n environment_id: Field.lookup('sys_environment', {\n label: 'Environment (deprecated)',\n required: false,\n description: 'DEPRECATED. Use organization_id for tenant isolation.',\n }),\n\n /** Version number for optimistic concurrency */\n version: Field.number({\n label: 'Version',\n required: false,\n defaultValue: 1,\n }),\n\n /** Content checksum for change detection (e.g. `sha256:<64 hex>` = 71 chars) */\n checksum: Field.text({\n label: 'Checksum',\n required: false,\n maxLength: 71,\n }),\n\n /** Origin of this metadata record */\n source: Field.select(['filesystem', 'database', 'api', 'migration'], {\n label: 'Source',\n required: false,\n }),\n\n /** Classification tags (JSON array) */\n tags: Field.textarea({\n label: 'Tags',\n required: false,\n description: 'JSON-serialized array of classification tags',\n }),\n\n /** Audit fields */\n created_by: Field.lookup('sys_user', {\n label: 'Created By',\n required: false,\n readonly: true,\n }),\n\n created_at: Field.datetime({\n label: 'Created At',\n required: false,\n readonly: true,\n }),\n\n updated_by: Field.lookup('sys_user', {\n label: 'Updated By',\n required: false,\n }),\n\n updated_at: Field.datetime({\n label: 'Updated At',\n required: false,\n }),\n },\n\n indexes: [\n // ADR-0005 (revised 2026-05): overlay uniqueness is scoped by\n // (type, name, organization_id), restricted to active rows so resets\n // / archived versions don't collide. environment_id is deprecated and\n // not part of the discriminator. The runtime layer (protocol.ts\n // ensureOverlayIndex) issues a DROP-then-CREATE migration to\n // replace any pre-existing legacy composite index in-place.\n {\n name: 'idx_sys_metadata_overlay_active',\n fields: ['type', 'name', 'organization_id'],\n unique: true,\n partial: \"state = 'active'\",\n },\n { name: 'idx_sys_metadata_org_type', fields: ['organization_id', 'type'] },\n { fields: ['type', 'scope'] },\n { fields: ['package_version_id'] },\n { fields: ['state'] },\n { fields: ['namespace'] },\n ],\n\n enable: {\n trackHistory: true,\n searchable: false,\n apiEnabled: true,\n apiMethods: ['get', 'list', 'create', 'update', 'delete'],\n trash: false,\n },\n\n // Named list views — power the Setup App \"Data Model\" group so admins\n // can browse object/field metadata in a typed grid instead of the raw\n // `All Metadata` debug surface. Each entry pre-filters by `type` and\n // shows the columns that matter for that type. The dedicated visual\n // designer (objectui's <ObjectManager> / <FieldDesigner>) deep-links\n // from the row's `Edit in Designer` action; the grid stays useful for\n // search, audit (state / updated_at) and triage.\n listViews: {\n only_objects: {\n type: 'grid',\n name: 'only_objects',\n label: 'Objects',\n data: { provider: 'object', object: 'sys_metadata' },\n columns: ['name', 'namespace', 'scope', 'managed_by', 'state', 'updated_at'],\n filter: [{ field: 'type', operator: 'equals', value: 'object' }],\n sort: [{ field: 'name', order: 'asc' }],\n pagination: { pageSize: 50 },\n },\n only_fields: {\n type: 'grid',\n name: 'only_fields',\n label: 'Fields',\n data: { provider: 'object', object: 'sys_metadata' },\n columns: ['name', 'namespace', 'scope', 'managed_by', 'state', 'updated_at'],\n filter: [{ field: 'type', operator: 'equals', value: 'field' }],\n sort: [{ field: 'name', order: 'asc' }],\n pagination: { pageSize: 50 },\n },\n all_metadata: {\n type: 'grid',\n name: 'all_metadata',\n label: 'All',\n data: { provider: 'object', object: 'sys_metadata' },\n columns: ['name', 'type', 'namespace', 'scope', 'state', 'updated_at'],\n sort: [{ field: 'updated_at', order: 'desc' }],\n pagination: { pageSize: 50 },\n },\n },\n});\n","// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport { ObjectSchema, Field } from '@objectstack/spec/data';\n\n/**\n * sys_metadata_history — Metadata Version History / Event Log\n *\n * Append-only durable log of every overlay change made through\n * `SysMetadataRepository.put` / `delete` (ADR-0008 §10 M1). Each row is a\n * single event in the per-organisation event log; rows are NEVER\n * mutated after insertion. The legacy `DatabaseLoader` writes the same\n * shape from its own put/restore code paths.\n *\n * ─────────────────────────────────────────────────────────────────────\n * Key design points (ADR-0008 §0 amendment + M1):\n *\n * • Keyed by `(organization_id, type, name)` only — `environment_id` was\n * removed in the branch/project-removal amendment. The original\n * `metadata_id` column (a downgraded plain-text version of the old\n * `sys_metadata.id` FK) was removed in the M1 follow-up — joins go\n * through `(organization_id, type, name, version)` exclusively.\n *\n * • `event_seq` is the per-org monotonic event-log cursor. Producers\n * compute `MAX(event_seq) + 1 WHERE organization_id = X` inside the\n * same transaction as the parent `sys_metadata` write.\n *\n * • `version` is the per-(org,type,name) lineage counter. Producers\n * compute `MAX(version) + 1 WHERE organization_id = X AND type = T\n * AND name = N` so delete + recreate continues incrementing instead\n * of restarting at 1.\n *\n * • `metadata` / `checksum` are nullable — DELETE rows have no body or\n * hash. Readers must tolerate null on both columns.\n *\n * • `source` records the producer ('sys-metadata-repo', 'fs',\n * 'studio', …) and feeds MetadataEvent.source on history() reads.\n *\n * Indexes are purpose-built for the two dominant read patterns:\n * 1. per-item history view → `(organization_id, type, name, version)`\n * 2. org-wide event replay → `(organization_id, event_seq)`\n * ─────────────────────────────────────────────────────────────────────\n */\nexport const SysMetadataHistoryObject = ObjectSchema.create({\n name: 'sys_metadata_history',\n label: 'Metadata History',\n pluralLabel: 'Metadata History',\n icon: 'history',\n isSystem: true,\n managedBy: 'system',\n description: 'Durable event log of metadata overlay changes (per-org, append-only)',\n\n fields: {\n /** Primary Key (UUID) */\n id: Field.text({\n label: 'ID',\n required: true,\n readonly: true,\n }),\n\n /** Per-org monotonic event sequence (durable cursor for replay). */\n event_seq: Field.number({\n label: 'Event Seq',\n required: true,\n readonly: true,\n description: 'Per-organization monotonic event log cursor.',\n }),\n\n /** Machine name (denormalized for easier querying) */\n name: Field.text({\n label: 'Name',\n required: true,\n searchable: true,\n readonly: true,\n maxLength: 255,\n }),\n\n /** Metadata type (denormalized for easier querying) */\n type: Field.text({\n label: 'Metadata Type',\n required: true,\n searchable: true,\n readonly: true,\n maxLength: 100,\n }),\n\n /** Per-(org,type,name) lineage counter at this snapshot. */\n version: Field.number({\n label: 'Version',\n required: true,\n readonly: true,\n }),\n\n /** Type of operation that created this history entry */\n operation_type: Field.select(['create', 'update', 'publish', 'revert', 'delete'], {\n label: 'Operation Type',\n required: true,\n readonly: true,\n }),\n\n /**\n * Historical metadata snapshot (JSON payload).\n * Null for `operation_type = 'delete'` — the row carries no body.\n */\n metadata: Field.textarea({\n label: 'Metadata',\n required: false,\n readonly: true,\n description: 'JSON-serialized metadata snapshot at this version (null for deletes).',\n }),\n\n /** SHA-256 checksum of metadata content (null for deletes). */\n checksum: Field.text({\n label: 'Checksum',\n required: false,\n readonly: true,\n maxLength: 80,\n }),\n\n /** Checksum of the previous version (null for the first event). */\n previous_checksum: Field.text({\n label: 'Previous Checksum',\n required: false,\n readonly: true,\n maxLength: 80,\n }),\n\n /** Human-readable description of changes (= MetadataEvent.message). */\n change_note: Field.textarea({\n label: 'Change Note',\n required: false,\n readonly: true,\n description: 'Description of what changed in this version.',\n }),\n\n /**\n * Producer of the event ('sys-metadata-repo', 'fs', 'studio',\n * 'api', …). Defaults to 'sys-metadata-repo' on the canonical\n * write path; preserved on history() reads as MetadataEvent.source.\n */\n source: Field.text({\n label: 'Source',\n required: false,\n readonly: true,\n maxLength: 64,\n }),\n\n /** Organization ID for multi-tenant isolation */\n organization_id: Field.lookup('sys_organization', {\n label: 'Organization',\n required: false,\n readonly: true,\n description: 'Organization for multi-tenant isolation.',\n }),\n\n /** User who made this change (= MetadataEvent.actor). */\n recorded_by: Field.lookup('sys_user', {\n label: 'Recorded By',\n required: false,\n readonly: true,\n }),\n\n /** When was this version recorded */\n recorded_at: Field.datetime({\n label: 'Recorded At',\n required: true,\n readonly: true,\n }),\n },\n\n indexes: [\n { fields: ['organization_id', 'event_seq'], unique: true },\n { fields: ['organization_id', 'type', 'name', 'version'], unique: true },\n { fields: ['organization_id', 'type', 'name', 'recorded_at'] },\n // ADR-0009: getByHash() lookup — execution-pinned types resolve a\n // historical body by content hash via this index.\n { fields: ['organization_id', 'type', 'name', 'checksum'] },\n { fields: ['type', 'name'] },\n { fields: ['recorded_at'] },\n { fields: ['operation_type'] },\n ],\n\n enable: {\n trackHistory: false,\n searchable: false,\n apiEnabled: true,\n apiMethods: ['get', 'list'],\n trash: false,\n },\n});\n","// Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport { ObjectSchema, Field } from '@objectstack/spec/data';\n\n/**\n * sys_metadata_audit — Metadata Protection Audit Log\n *\n * Append-only audit trail for every metadata write **decision** — both\n * allowed writes and refused ones. Introduced in ADR-0010 Phase 1 as\n * the compliance surface for the new `_lock` enforcement: every PUT /\n * publish / rollback / delete that targets `sys_metadata` writes one\n * row here describing the outcome and the lock state that produced it.\n *\n * Distinct from `sys_metadata_history`:\n * - `sys_metadata_history` records the **body** of every successful\n * write (full JSON snapshot + checksum). Used for rollback,\n * diff, and history() reads.\n * - `sys_metadata_audit` records the **decision** (who tried what,\n * what code was emitted, was a lock involved). Refused writes\n * never reach history; they DO reach audit.\n *\n * Designed as the smallest possible row that satisfies the four\n * compliance questions of metadata governance:\n * 1. Who tried to change what? → actor + type + name\n * 2. When? → occurred_at\n * 3. What outcome? → outcome + code\n * 4. Was an override involved? → lock_overridden + lock_state\n *\n * Indexed on `(organization_id, occurred_at)` for the per-org timeline\n * query and `(type, name, occurred_at)` for the per-item history tab\n * Studio surfaces on the editor page.\n */\nexport const SysMetadataAuditObject = ObjectSchema.create({\n name: 'sys_metadata_audit',\n label: 'Metadata Audit',\n pluralLabel: 'Metadata Audit',\n icon: 'shield-check',\n isSystem: true,\n managedBy: 'append-only',\n description: 'Append-only audit trail of metadata write decisions (ADR-0010).',\n\n fields: {\n /** Primary Key (UUID) */\n id: Field.text({\n label: 'ID',\n required: true,\n readonly: true,\n }),\n\n /** When the decision was made (ISO-8601 UTC). */\n occurred_at: Field.datetime({\n label: 'Occurred At',\n required: true,\n readonly: true,\n }),\n\n /** Acting principal (user id, system id, or 'system'). */\n actor: Field.text({\n label: 'Actor',\n required: true,\n readonly: true,\n maxLength: 255,\n description: 'Acting principal — user id, system id, or \"system\".',\n }),\n\n /** Code path that produced the decision (e.g. `protocol.saveMetaItem`). */\n source: Field.text({\n label: 'Source',\n required: false,\n readonly: true,\n maxLength: 128,\n }),\n\n /** Metadata type (singular, e.g. `app`, `object`, `view`). */\n type: Field.text({\n label: 'Metadata Type',\n required: true,\n readonly: true,\n searchable: true,\n maxLength: 100,\n }),\n\n /** Item machine name. */\n name: Field.text({\n label: 'Name',\n required: true,\n readonly: true,\n searchable: true,\n maxLength: 255,\n }),\n\n /** Organization for multi-tenant filtering. NULL for env-wide writes. */\n organization_id: Field.lookup('sys_organization', {\n label: 'Organization',\n required: false,\n readonly: true,\n }),\n\n /** Operation kind. */\n operation: Field.select(['save', 'publish', 'rollback', 'delete', 'reset'], {\n label: 'Operation',\n required: true,\n readonly: true,\n }),\n\n /** Decision outcome — allowed, denied (refused), or forced (bypassed via override). */\n outcome: Field.select(['allowed', 'denied', 'forced'], {\n label: 'Outcome',\n required: true,\n readonly: true,\n }),\n\n /**\n * Machine-readable code for the decision:\n * - on `allowed`: `'ok'`\n * - on `denied`: `'not_overridable'` | `'not_creatable'` |\n * `'item_locked'` | `'invalid_metadata'` | `'destructive_change'` |\n * `'metadata_conflict'`\n * - on `forced`: `'lock_override'` (Phase 3)\n */\n code: Field.text({\n label: 'Code',\n required: true,\n readonly: true,\n maxLength: 64,\n }),\n\n /**\n * Lock state observed at the time of the decision (`none` if the\n * item carried no `_lock`). Captured even on `allowed` rows so\n * later compliance queries can see \"what was the lock state when\n * this write succeeded\".\n */\n lock_state: Field.select(['none', 'no-overlay', 'no-delete', 'full'], {\n label: 'Lock State',\n required: false,\n readonly: true,\n }),\n\n /** True when the write succeeded by bypassing a lock (Phase 3). */\n lock_overridden: Field.boolean({\n label: 'Lock Overridden',\n required: false,\n readonly: true,\n }),\n\n /** Optional request correlation id for tracing. */\n request_id: Field.text({\n label: 'Request ID',\n required: false,\n readonly: true,\n maxLength: 128,\n }),\n\n /** Optional free-form context (e.g. brief diff summary). */\n note: Field.textarea({\n label: 'Note',\n required: false,\n readonly: true,\n }),\n },\n\n indexes: [\n { fields: ['organization_id', 'occurred_at'] },\n { fields: ['type', 'name', 'occurred_at'] },\n { fields: ['actor', 'occurred_at'] },\n { fields: ['outcome'] },\n ],\n\n enable: {\n trackHistory: false,\n searchable: false,\n apiEnabled: true,\n apiMethods: ['get', 'list'],\n trash: false,\n },\n});\n","// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport { ObjectSchema, Field } from '@objectstack/spec/data';\n\n/**\n * sys_view_definition — Runtime View Storage (\"Object has-many View\")\n *\n * Persists view definitions authored at RUNTIME by end users — the `shared`\n * and `personal` layers of the view model (see spec `ViewItemSchema`). The\n * `package` layer ships from `*.view.ts` source and lives in the metadata\n * registry; it is NOT stored here.\n *\n * Why a dedicated object (not the `sys_metadata` overlay): runtime views are\n * data, not admin metadata customisation. They carry an `owner`, a visibility\n * `scope`, and are queried per-user — so they belong in a typed, permissioned\n * ObjectQL object rather than the global metadata registry (which a personal\n * \"My hot leads\" view should never pollute).\n *\n * CRUD flows through ObjectQL's generic data API (`/api/v1/data/\n * sys_view_definition`) — no bespoke per-view REST endpoints. The runtime\n * switcher reads the `package` layer via `GET /meta/view?object=<object>` and\n * merges these rows client-side, filtered to `scope='shared'` OR\n * `owner=<current user>`.\n *\n * This is a system object (isSystem: true) — protected from deletion and\n * auto-provisioned on first use.\n */\nexport const SysViewDefinitionObject = ObjectSchema.create({\n name: 'sys_view_definition',\n label: 'View Definition',\n pluralLabel: 'View Definitions',\n icon: 'layout-grid',\n isSystem: true,\n description:\n 'Runtime-authored view definitions (shared / personal layers). The package layer ships from source.',\n\n fields: {\n /** Primary Key (UUID) */\n id: Field.text({ label: 'ID', required: true, readonly: true }),\n\n /**\n * Globally-unique qualified view id, `<object>.<viewKey>`, matching the\n * spec `ViewItemSchema.name`. For personal views the runtime may suffix\n * to keep it unique per owner.\n */\n name: Field.text({\n label: 'Name',\n required: true,\n searchable: true,\n maxLength: 255,\n }),\n\n /** Bound object — the foreign key used to aggregate views for the switcher. */\n object: Field.text({\n label: 'Object',\n required: true,\n searchable: true,\n maxLength: 255,\n }),\n\n /** Whether `config` is a ListView (list family) or a FormView. */\n view_kind: Field.select(['list', 'form'], {\n label: 'View Kind',\n required: true,\n defaultValue: 'list',\n }),\n\n /** Display label (plain string; i18n keys also accepted). */\n label: Field.text({ label: 'Label', required: false, maxLength: 255 }),\n\n /** Whether this is the object's default view in the switcher. */\n is_default: Field.boolean({ label: 'Is Default', required: false, defaultValue: false }),\n\n /** Sort order within the object's switcher / left rail. */\n view_order: Field.number({ label: 'Order', required: false, defaultValue: 0 }),\n\n /**\n * Identity layer. Only `shared` and `personal` are stored at runtime;\n * `package` views come from source.\n */\n scope: Field.select(['shared', 'personal'], {\n label: 'Scope',\n required: true,\n defaultValue: 'personal',\n }),\n\n /** Owner user id — set when scope = personal; null for shared. */\n owner: Field.text({ label: 'Owner', required: false, maxLength: 255 }),\n\n /** Hidden from the switcher (per-user / per-org declutter). */\n hidden: Field.boolean({ label: 'Hidden', required: false, defaultValue: false }),\n\n /** The ListView / FormView configuration payload. */\n config: Field.json({\n label: 'Config',\n required: true,\n description: 'ListView or FormView configuration (matches spec ViewItem.config).',\n }),\n\n /** Organization for multi-tenant isolation. */\n organization_id: Field.lookup('sys_organization', {\n label: 'Organization',\n required: false,\n description: 'Organization for multi-tenant isolation.',\n }),\n\n /** Lifecycle state. */\n state: Field.select(['draft', 'active', 'archived'], {\n label: 'State',\n required: false,\n defaultValue: 'active',\n }),\n\n /** Audit fields. */\n created_by: Field.lookup('sys_user', { label: 'Created By', required: false, readonly: true }),\n created_at: Field.datetime({ label: 'Created At', required: false, readonly: true }),\n updated_by: Field.lookup('sys_user', { label: 'Updated By', required: false }),\n updated_at: Field.datetime({ label: 'Updated At', required: false }),\n },\n\n indexes: [\n // A given view name is unique per (organization, owner) among active rows —\n // a shared view (owner NULL) and each user's personal views don't collide.\n {\n name: 'idx_sys_view_def_active',\n fields: ['name', 'organization_id', 'owner'],\n unique: true,\n partial: \"state = 'active'\",\n },\n // The switcher query: views for one object within a tenant.\n { name: 'idx_sys_view_def_object', fields: ['organization_id', 'object'] },\n { fields: ['scope'] },\n { fields: ['owner'] },\n { fields: ['state'] },\n ],\n\n enable: {\n trackHistory: true,\n searchable: false,\n apiEnabled: true,\n apiMethods: ['get', 'list', 'create', 'update', 'delete'],\n trash: false,\n },\n});\n"]}
@@ -485,7 +485,107 @@ var SysMetadataAuditObject = ObjectSchema.create({
485
485
  trash: false
486
486
  }
487
487
  });
488
+ var SysViewDefinitionObject = ObjectSchema.create({
489
+ name: "sys_view_definition",
490
+ label: "View Definition",
491
+ pluralLabel: "View Definitions",
492
+ icon: "layout-grid",
493
+ isSystem: true,
494
+ description: "Runtime-authored view definitions (shared / personal layers). The package layer ships from source.",
495
+ fields: {
496
+ /** Primary Key (UUID) */
497
+ id: Field.text({ label: "ID", required: true, readonly: true }),
498
+ /**
499
+ * Globally-unique qualified view id, `<object>.<viewKey>`, matching the
500
+ * spec `ViewItemSchema.name`. For personal views the runtime may suffix
501
+ * to keep it unique per owner.
502
+ */
503
+ name: Field.text({
504
+ label: "Name",
505
+ required: true,
506
+ searchable: true,
507
+ maxLength: 255
508
+ }),
509
+ /** Bound object — the foreign key used to aggregate views for the switcher. */
510
+ object: Field.text({
511
+ label: "Object",
512
+ required: true,
513
+ searchable: true,
514
+ maxLength: 255
515
+ }),
516
+ /** Whether `config` is a ListView (list family) or a FormView. */
517
+ view_kind: Field.select(["list", "form"], {
518
+ label: "View Kind",
519
+ required: true,
520
+ defaultValue: "list"
521
+ }),
522
+ /** Display label (plain string; i18n keys also accepted). */
523
+ label: Field.text({ label: "Label", required: false, maxLength: 255 }),
524
+ /** Whether this is the object's default view in the switcher. */
525
+ is_default: Field.boolean({ label: "Is Default", required: false, defaultValue: false }),
526
+ /** Sort order within the object's switcher / left rail. */
527
+ view_order: Field.number({ label: "Order", required: false, defaultValue: 0 }),
528
+ /**
529
+ * Identity layer. Only `shared` and `personal` are stored at runtime;
530
+ * `package` views come from source.
531
+ */
532
+ scope: Field.select(["shared", "personal"], {
533
+ label: "Scope",
534
+ required: true,
535
+ defaultValue: "personal"
536
+ }),
537
+ /** Owner user id — set when scope = personal; null for shared. */
538
+ owner: Field.text({ label: "Owner", required: false, maxLength: 255 }),
539
+ /** Hidden from the switcher (per-user / per-org declutter). */
540
+ hidden: Field.boolean({ label: "Hidden", required: false, defaultValue: false }),
541
+ /** The ListView / FormView configuration payload. */
542
+ config: Field.json({
543
+ label: "Config",
544
+ required: true,
545
+ description: "ListView or FormView configuration (matches spec ViewItem.config)."
546
+ }),
547
+ /** Organization for multi-tenant isolation. */
548
+ organization_id: Field.lookup("sys_organization", {
549
+ label: "Organization",
550
+ required: false,
551
+ description: "Organization for multi-tenant isolation."
552
+ }),
553
+ /** Lifecycle state. */
554
+ state: Field.select(["draft", "active", "archived"], {
555
+ label: "State",
556
+ required: false,
557
+ defaultValue: "active"
558
+ }),
559
+ /** Audit fields. */
560
+ created_by: Field.lookup("sys_user", { label: "Created By", required: false, readonly: true }),
561
+ created_at: Field.datetime({ label: "Created At", required: false, readonly: true }),
562
+ updated_by: Field.lookup("sys_user", { label: "Updated By", required: false }),
563
+ updated_at: Field.datetime({ label: "Updated At", required: false })
564
+ },
565
+ indexes: [
566
+ // A given view name is unique per (organization, owner) among active rows —
567
+ // a shared view (owner NULL) and each user's personal views don't collide.
568
+ {
569
+ name: "idx_sys_view_def_active",
570
+ fields: ["name", "organization_id", "owner"],
571
+ unique: true,
572
+ partial: "state = 'active'"
573
+ },
574
+ // The switcher query: views for one object within a tenant.
575
+ { name: "idx_sys_view_def_object", fields: ["organization_id", "object"] },
576
+ { fields: ["scope"] },
577
+ { fields: ["owner"] },
578
+ { fields: ["state"] }
579
+ ],
580
+ enable: {
581
+ trackHistory: true,
582
+ searchable: false,
583
+ apiEnabled: true,
584
+ apiMethods: ["get", "list", "create", "update", "delete"],
585
+ trash: false
586
+ }
587
+ });
488
588
 
489
- export { SysMetadataObject as SysMetadata, SysMetadataAuditObject, SysMetadataHistoryObject, SysMetadataObject };
589
+ export { SysMetadataObject as SysMetadata, SysMetadataAuditObject, SysMetadataHistoryObject, SysMetadataObject, SysViewDefinitionObject };
490
590
  //# sourceMappingURL=index.mjs.map
491
591
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/metadata/sys-metadata.object.ts","../../src/metadata/sys-metadata-history.object.ts","../../src/metadata/sys-metadata-audit.object.ts"],"names":["ObjectSchema","Field"],"mappings":"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","file":"index.mjs","sourcesContent":["// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport { ObjectSchema, Field } from '@objectstack/spec/data';\n\n/**\n * sys_metadata — System Metadata Object\n *\n * Canonical ObjectStack object definition for the metadata persistence table.\n * Stores all platform-scope and user-scope metadata records (Objects, Views,\n * Flows, etc.) using the MetadataRecordSchema envelope.\n *\n * This is a system object (isSystem: true) — protected from deletion and\n * automatically provisioned by the DatabaseLoader on first use.\n *\n * @see MetadataRecordSchema in metadata-persistence.zod.ts\n */\nexport const SysMetadataObject = ObjectSchema.create({\n name: 'sys_metadata',\n label: 'System Metadata',\n pluralLabel: 'System Metadata',\n icon: 'settings',\n isSystem: true,\n // managedBy: 'system' — the metadata table backs every other config\n // object. Writing rows directly here bypasses the typed Zod APIs and\n // would let an admin inject malformed payloads. The \"All Metadata\"\n // menu is therefore a read-only debug surface (Export only); typed\n // edits flow through the dedicated per-type pages (Approval Process,\n // Sharing Rule, etc.).\n managedBy: 'system',\n description: 'Stores platform and user-scope metadata records (objects, views, flows, etc.)',\n\n fields: {\n /** Primary Key (UUID) */\n id: Field.text({\n label: 'ID',\n required: true,\n readonly: true,\n }),\n\n /** Machine name — unique identifier used in code references */\n name: Field.text({\n label: 'Name',\n required: true,\n searchable: true,\n maxLength: 255,\n }),\n\n /** Metadata type (e.g. \"object\", \"view\", \"flow\") */\n type: Field.text({\n label: 'Metadata Type',\n required: true,\n searchable: true,\n maxLength: 100,\n }),\n\n /** Namespace / module grouping (e.g. \"crm\", \"core\") */\n namespace: Field.text({\n label: 'Namespace',\n required: false,\n defaultValue: 'default',\n maxLength: 100,\n }),\n\n /** Package that owns/delivered this metadata (legacy string identifier, kept for compat) */\n package_id: Field.text({\n label: 'Package ID',\n required: false,\n maxLength: 255,\n description: 'Legacy package manifest ID string. Use package_version_id for new records.',\n }),\n\n /**\n * FK → sys_package_version (UUID). Set for metadata that belongs to a specific\n * package release snapshot. NULL = platform-built-in or environment override.\n */\n package_version_id: Field.lookup('sys_package_version', {\n label: 'Package Version',\n required: false,\n description:\n 'Foreign key to sys_package_version (UUID). Null = platform-built-in or env-level override.',\n }),\n\n /** Who manages this record: package, platform, or user */\n managed_by: Field.select(['package', 'platform', 'user'], {\n label: 'Managed By',\n required: false,\n }),\n\n /** Scope: system (code), platform (admin DB), user (personal DB) */\n scope: Field.select(['system', 'platform', 'user'], {\n label: 'Scope',\n required: true,\n defaultValue: 'platform',\n }),\n\n /** JSON payload — the actual metadata configuration */\n metadata: Field.textarea({\n label: 'Metadata',\n required: true,\n description: 'JSON-serialized metadata payload',\n }),\n\n /** Parent metadata name for extension/override */\n extends: Field.text({\n label: 'Extends',\n required: false,\n maxLength: 255,\n }),\n\n /** Merge strategy when extending parent metadata */\n strategy: Field.select(['merge', 'replace'], {\n label: 'Strategy',\n required: false,\n defaultValue: 'merge',\n }),\n\n /** Owner user ID (for user-scope items) */\n owner: Field.text({\n label: 'Owner',\n required: false,\n maxLength: 255,\n }),\n\n /** Lifecycle state */\n state: Field.select(['draft', 'active', 'archived', 'deprecated'], {\n label: 'State',\n required: false,\n defaultValue: 'active',\n }),\n\n /** Organization ID for multi-tenant isolation */\n organization_id: Field.lookup('sys_organization', {\n label: 'Organization',\n required: false,\n description: 'Organization for multi-tenant isolation.',\n }),\n\n /**\n * @deprecated ADR-0005 (revised 2026-05): per-env DBs replace per-project\n * isolation. `environment_id` is no longer written by saveMetaItem and not\n * consulted by overlay reads. Kept for legacy rows; new writes leave it\n * NULL. Will be dropped in a future schema migration.\n */\n environment_id: Field.lookup('sys_environment', {\n label: 'Environment (deprecated)',\n required: false,\n description: 'DEPRECATED. Use organization_id for tenant isolation.',\n }),\n\n /** Version number for optimistic concurrency */\n version: Field.number({\n label: 'Version',\n required: false,\n defaultValue: 1,\n }),\n\n /** Content checksum for change detection (e.g. `sha256:<64 hex>` = 71 chars) */\n checksum: Field.text({\n label: 'Checksum',\n required: false,\n maxLength: 71,\n }),\n\n /** Origin of this metadata record */\n source: Field.select(['filesystem', 'database', 'api', 'migration'], {\n label: 'Source',\n required: false,\n }),\n\n /** Classification tags (JSON array) */\n tags: Field.textarea({\n label: 'Tags',\n required: false,\n description: 'JSON-serialized array of classification tags',\n }),\n\n /** Audit fields */\n created_by: Field.lookup('sys_user', {\n label: 'Created By',\n required: false,\n readonly: true,\n }),\n\n created_at: Field.datetime({\n label: 'Created At',\n required: false,\n readonly: true,\n }),\n\n updated_by: Field.lookup('sys_user', {\n label: 'Updated By',\n required: false,\n }),\n\n updated_at: Field.datetime({\n label: 'Updated At',\n required: false,\n }),\n },\n\n indexes: [\n // ADR-0005 (revised 2026-05): overlay uniqueness is scoped by\n // (type, name, organization_id), restricted to active rows so resets\n // / archived versions don't collide. environment_id is deprecated and\n // not part of the discriminator. The runtime layer (protocol.ts\n // ensureOverlayIndex) issues a DROP-then-CREATE migration to\n // replace any pre-existing legacy composite index in-place.\n {\n name: 'idx_sys_metadata_overlay_active',\n fields: ['type', 'name', 'organization_id'],\n unique: true,\n partial: \"state = 'active'\",\n },\n { name: 'idx_sys_metadata_org_type', fields: ['organization_id', 'type'] },\n { fields: ['type', 'scope'] },\n { fields: ['package_version_id'] },\n { fields: ['state'] },\n { fields: ['namespace'] },\n ],\n\n enable: {\n trackHistory: true,\n searchable: false,\n apiEnabled: true,\n apiMethods: ['get', 'list', 'create', 'update', 'delete'],\n trash: false,\n },\n\n // Named list views — power the Setup App \"Data Model\" group so admins\n // can browse object/field metadata in a typed grid instead of the raw\n // `All Metadata` debug surface. Each entry pre-filters by `type` and\n // shows the columns that matter for that type. The dedicated visual\n // designer (objectui's <ObjectManager> / <FieldDesigner>) deep-links\n // from the row's `Edit in Designer` action; the grid stays useful for\n // search, audit (state / updated_at) and triage.\n listViews: {\n only_objects: {\n type: 'grid',\n name: 'only_objects',\n label: 'Objects',\n data: { provider: 'object', object: 'sys_metadata' },\n columns: ['name', 'namespace', 'scope', 'managed_by', 'state', 'updated_at'],\n filter: [{ field: 'type', operator: 'equals', value: 'object' }],\n sort: [{ field: 'name', order: 'asc' }],\n pagination: { pageSize: 50 },\n },\n only_fields: {\n type: 'grid',\n name: 'only_fields',\n label: 'Fields',\n data: { provider: 'object', object: 'sys_metadata' },\n columns: ['name', 'namespace', 'scope', 'managed_by', 'state', 'updated_at'],\n filter: [{ field: 'type', operator: 'equals', value: 'field' }],\n sort: [{ field: 'name', order: 'asc' }],\n pagination: { pageSize: 50 },\n },\n all_metadata: {\n type: 'grid',\n name: 'all_metadata',\n label: 'All',\n data: { provider: 'object', object: 'sys_metadata' },\n columns: ['name', 'type', 'namespace', 'scope', 'state', 'updated_at'],\n sort: [{ field: 'updated_at', order: 'desc' }],\n pagination: { pageSize: 50 },\n },\n },\n});\n","// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport { ObjectSchema, Field } from '@objectstack/spec/data';\n\n/**\n * sys_metadata_history — Metadata Version History / Event Log\n *\n * Append-only durable log of every overlay change made through\n * `SysMetadataRepository.put` / `delete` (ADR-0008 §10 M1). Each row is a\n * single event in the per-organisation event log; rows are NEVER\n * mutated after insertion. The legacy `DatabaseLoader` writes the same\n * shape from its own put/restore code paths.\n *\n * ─────────────────────────────────────────────────────────────────────\n * Key design points (ADR-0008 §0 amendment + M1):\n *\n * • Keyed by `(organization_id, type, name)` only — `environment_id` was\n * removed in the branch/project-removal amendment. The original\n * `metadata_id` column (a downgraded plain-text version of the old\n * `sys_metadata.id` FK) was removed in the M1 follow-up — joins go\n * through `(organization_id, type, name, version)` exclusively.\n *\n * • `event_seq` is the per-org monotonic event-log cursor. Producers\n * compute `MAX(event_seq) + 1 WHERE organization_id = X` inside the\n * same transaction as the parent `sys_metadata` write.\n *\n * • `version` is the per-(org,type,name) lineage counter. Producers\n * compute `MAX(version) + 1 WHERE organization_id = X AND type = T\n * AND name = N` so delete + recreate continues incrementing instead\n * of restarting at 1.\n *\n * • `metadata` / `checksum` are nullable — DELETE rows have no body or\n * hash. Readers must tolerate null on both columns.\n *\n * • `source` records the producer ('sys-metadata-repo', 'fs',\n * 'studio', …) and feeds MetadataEvent.source on history() reads.\n *\n * Indexes are purpose-built for the two dominant read patterns:\n * 1. per-item history view → `(organization_id, type, name, version)`\n * 2. org-wide event replay → `(organization_id, event_seq)`\n * ─────────────────────────────────────────────────────────────────────\n */\nexport const SysMetadataHistoryObject = ObjectSchema.create({\n name: 'sys_metadata_history',\n label: 'Metadata History',\n pluralLabel: 'Metadata History',\n icon: 'history',\n isSystem: true,\n managedBy: 'system',\n description: 'Durable event log of metadata overlay changes (per-org, append-only)',\n\n fields: {\n /** Primary Key (UUID) */\n id: Field.text({\n label: 'ID',\n required: true,\n readonly: true,\n }),\n\n /** Per-org monotonic event sequence (durable cursor for replay). */\n event_seq: Field.number({\n label: 'Event Seq',\n required: true,\n readonly: true,\n description: 'Per-organization monotonic event log cursor.',\n }),\n\n /** Machine name (denormalized for easier querying) */\n name: Field.text({\n label: 'Name',\n required: true,\n searchable: true,\n readonly: true,\n maxLength: 255,\n }),\n\n /** Metadata type (denormalized for easier querying) */\n type: Field.text({\n label: 'Metadata Type',\n required: true,\n searchable: true,\n readonly: true,\n maxLength: 100,\n }),\n\n /** Per-(org,type,name) lineage counter at this snapshot. */\n version: Field.number({\n label: 'Version',\n required: true,\n readonly: true,\n }),\n\n /** Type of operation that created this history entry */\n operation_type: Field.select(['create', 'update', 'publish', 'revert', 'delete'], {\n label: 'Operation Type',\n required: true,\n readonly: true,\n }),\n\n /**\n * Historical metadata snapshot (JSON payload).\n * Null for `operation_type = 'delete'` — the row carries no body.\n */\n metadata: Field.textarea({\n label: 'Metadata',\n required: false,\n readonly: true,\n description: 'JSON-serialized metadata snapshot at this version (null for deletes).',\n }),\n\n /** SHA-256 checksum of metadata content (null for deletes). */\n checksum: Field.text({\n label: 'Checksum',\n required: false,\n readonly: true,\n maxLength: 80,\n }),\n\n /** Checksum of the previous version (null for the first event). */\n previous_checksum: Field.text({\n label: 'Previous Checksum',\n required: false,\n readonly: true,\n maxLength: 80,\n }),\n\n /** Human-readable description of changes (= MetadataEvent.message). */\n change_note: Field.textarea({\n label: 'Change Note',\n required: false,\n readonly: true,\n description: 'Description of what changed in this version.',\n }),\n\n /**\n * Producer of the event ('sys-metadata-repo', 'fs', 'studio',\n * 'api', …). Defaults to 'sys-metadata-repo' on the canonical\n * write path; preserved on history() reads as MetadataEvent.source.\n */\n source: Field.text({\n label: 'Source',\n required: false,\n readonly: true,\n maxLength: 64,\n }),\n\n /** Organization ID for multi-tenant isolation */\n organization_id: Field.lookup('sys_organization', {\n label: 'Organization',\n required: false,\n readonly: true,\n description: 'Organization for multi-tenant isolation.',\n }),\n\n /** User who made this change (= MetadataEvent.actor). */\n recorded_by: Field.lookup('sys_user', {\n label: 'Recorded By',\n required: false,\n readonly: true,\n }),\n\n /** When was this version recorded */\n recorded_at: Field.datetime({\n label: 'Recorded At',\n required: true,\n readonly: true,\n }),\n },\n\n indexes: [\n { fields: ['organization_id', 'event_seq'], unique: true },\n { fields: ['organization_id', 'type', 'name', 'version'], unique: true },\n { fields: ['organization_id', 'type', 'name', 'recorded_at'] },\n // ADR-0009: getByHash() lookup — execution-pinned types resolve a\n // historical body by content hash via this index.\n { fields: ['organization_id', 'type', 'name', 'checksum'] },\n { fields: ['type', 'name'] },\n { fields: ['recorded_at'] },\n { fields: ['operation_type'] },\n ],\n\n enable: {\n trackHistory: false,\n searchable: false,\n apiEnabled: true,\n apiMethods: ['get', 'list'],\n trash: false,\n },\n});\n","// Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport { ObjectSchema, Field } from '@objectstack/spec/data';\n\n/**\n * sys_metadata_audit — Metadata Protection Audit Log\n *\n * Append-only audit trail for every metadata write **decision** — both\n * allowed writes and refused ones. Introduced in ADR-0010 Phase 1 as\n * the compliance surface for the new `_lock` enforcement: every PUT /\n * publish / rollback / delete that targets `sys_metadata` writes one\n * row here describing the outcome and the lock state that produced it.\n *\n * Distinct from `sys_metadata_history`:\n * - `sys_metadata_history` records the **body** of every successful\n * write (full JSON snapshot + checksum). Used for rollback,\n * diff, and history() reads.\n * - `sys_metadata_audit` records the **decision** (who tried what,\n * what code was emitted, was a lock involved). Refused writes\n * never reach history; they DO reach audit.\n *\n * Designed as the smallest possible row that satisfies the four\n * compliance questions of metadata governance:\n * 1. Who tried to change what? → actor + type + name\n * 2. When? → occurred_at\n * 3. What outcome? → outcome + code\n * 4. Was an override involved? → lock_overridden + lock_state\n *\n * Indexed on `(organization_id, occurred_at)` for the per-org timeline\n * query and `(type, name, occurred_at)` for the per-item history tab\n * Studio surfaces on the editor page.\n */\nexport const SysMetadataAuditObject = ObjectSchema.create({\n name: 'sys_metadata_audit',\n label: 'Metadata Audit',\n pluralLabel: 'Metadata Audit',\n icon: 'shield-check',\n isSystem: true,\n managedBy: 'append-only',\n description: 'Append-only audit trail of metadata write decisions (ADR-0010).',\n\n fields: {\n /** Primary Key (UUID) */\n id: Field.text({\n label: 'ID',\n required: true,\n readonly: true,\n }),\n\n /** When the decision was made (ISO-8601 UTC). */\n occurred_at: Field.datetime({\n label: 'Occurred At',\n required: true,\n readonly: true,\n }),\n\n /** Acting principal (user id, system id, or 'system'). */\n actor: Field.text({\n label: 'Actor',\n required: true,\n readonly: true,\n maxLength: 255,\n description: 'Acting principal — user id, system id, or \"system\".',\n }),\n\n /** Code path that produced the decision (e.g. `protocol.saveMetaItem`). */\n source: Field.text({\n label: 'Source',\n required: false,\n readonly: true,\n maxLength: 128,\n }),\n\n /** Metadata type (singular, e.g. `app`, `object`, `view`). */\n type: Field.text({\n label: 'Metadata Type',\n required: true,\n readonly: true,\n searchable: true,\n maxLength: 100,\n }),\n\n /** Item machine name. */\n name: Field.text({\n label: 'Name',\n required: true,\n readonly: true,\n searchable: true,\n maxLength: 255,\n }),\n\n /** Organization for multi-tenant filtering. NULL for env-wide writes. */\n organization_id: Field.lookup('sys_organization', {\n label: 'Organization',\n required: false,\n readonly: true,\n }),\n\n /** Operation kind. */\n operation: Field.select(['save', 'publish', 'rollback', 'delete', 'reset'], {\n label: 'Operation',\n required: true,\n readonly: true,\n }),\n\n /** Decision outcome — allowed, denied (refused), or forced (bypassed via override). */\n outcome: Field.select(['allowed', 'denied', 'forced'], {\n label: 'Outcome',\n required: true,\n readonly: true,\n }),\n\n /**\n * Machine-readable code for the decision:\n * - on `allowed`: `'ok'`\n * - on `denied`: `'not_overridable'` | `'not_creatable'` |\n * `'item_locked'` | `'invalid_metadata'` | `'destructive_change'` |\n * `'metadata_conflict'`\n * - on `forced`: `'lock_override'` (Phase 3)\n */\n code: Field.text({\n label: 'Code',\n required: true,\n readonly: true,\n maxLength: 64,\n }),\n\n /**\n * Lock state observed at the time of the decision (`none` if the\n * item carried no `_lock`). Captured even on `allowed` rows so\n * later compliance queries can see \"what was the lock state when\n * this write succeeded\".\n */\n lock_state: Field.select(['none', 'no-overlay', 'no-delete', 'full'], {\n label: 'Lock State',\n required: false,\n readonly: true,\n }),\n\n /** True when the write succeeded by bypassing a lock (Phase 3). */\n lock_overridden: Field.boolean({\n label: 'Lock Overridden',\n required: false,\n readonly: true,\n }),\n\n /** Optional request correlation id for tracing. */\n request_id: Field.text({\n label: 'Request ID',\n required: false,\n readonly: true,\n maxLength: 128,\n }),\n\n /** Optional free-form context (e.g. brief diff summary). */\n note: Field.textarea({\n label: 'Note',\n required: false,\n readonly: true,\n }),\n },\n\n indexes: [\n { fields: ['organization_id', 'occurred_at'] },\n { fields: ['type', 'name', 'occurred_at'] },\n { fields: ['actor', 'occurred_at'] },\n { fields: ['outcome'] },\n ],\n\n enable: {\n trackHistory: false,\n searchable: false,\n apiEnabled: true,\n apiMethods: ['get', 'list'],\n trash: false,\n },\n});\n"]}
1
+ {"version":3,"sources":["../../src/metadata/sys-metadata.object.ts","../../src/metadata/sys-metadata-history.object.ts","../../src/metadata/sys-metadata-audit.object.ts","../../src/metadata/sys-view-definition.object.ts"],"names":["ObjectSchema","Field"],"mappings":"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","file":"index.mjs","sourcesContent":["// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport { ObjectSchema, Field } from '@objectstack/spec/data';\n\n/**\n * sys_metadata — System Metadata Object\n *\n * Canonical ObjectStack object definition for the metadata persistence table.\n * Stores all platform-scope and user-scope metadata records (Objects, Views,\n * Flows, etc.) using the MetadataRecordSchema envelope.\n *\n * This is a system object (isSystem: true) — protected from deletion and\n * automatically provisioned by the DatabaseLoader on first use.\n *\n * @see MetadataRecordSchema in metadata-persistence.zod.ts\n */\nexport const SysMetadataObject = ObjectSchema.create({\n name: 'sys_metadata',\n label: 'System Metadata',\n pluralLabel: 'System Metadata',\n icon: 'settings',\n isSystem: true,\n // managedBy: 'system' — the metadata table backs every other config\n // object. Writing rows directly here bypasses the typed Zod APIs and\n // would let an admin inject malformed payloads. The \"All Metadata\"\n // menu is therefore a read-only debug surface (Export only); typed\n // edits flow through the dedicated per-type pages (Approval Process,\n // Sharing Rule, etc.).\n managedBy: 'system',\n description: 'Stores platform and user-scope metadata records (objects, views, flows, etc.)',\n\n fields: {\n /** Primary Key (UUID) */\n id: Field.text({\n label: 'ID',\n required: true,\n readonly: true,\n }),\n\n /** Machine name — unique identifier used in code references */\n name: Field.text({\n label: 'Name',\n required: true,\n searchable: true,\n maxLength: 255,\n }),\n\n /** Metadata type (e.g. \"object\", \"view\", \"flow\") */\n type: Field.text({\n label: 'Metadata Type',\n required: true,\n searchable: true,\n maxLength: 100,\n }),\n\n /** Namespace / module grouping (e.g. \"crm\", \"core\") */\n namespace: Field.text({\n label: 'Namespace',\n required: false,\n defaultValue: 'default',\n maxLength: 100,\n }),\n\n /** Package that owns/delivered this metadata (legacy string identifier, kept for compat) */\n package_id: Field.text({\n label: 'Package ID',\n required: false,\n maxLength: 255,\n description: 'Legacy package manifest ID string. Use package_version_id for new records.',\n }),\n\n /**\n * FK → sys_package_version (UUID). Set for metadata that belongs to a specific\n * package release snapshot. NULL = platform-built-in or environment override.\n */\n package_version_id: Field.lookup('sys_package_version', {\n label: 'Package Version',\n required: false,\n description:\n 'Foreign key to sys_package_version (UUID). Null = platform-built-in or env-level override.',\n }),\n\n /** Who manages this record: package, platform, or user */\n managed_by: Field.select(['package', 'platform', 'user'], {\n label: 'Managed By',\n required: false,\n }),\n\n /** Scope: system (code), platform (admin DB), user (personal DB) */\n scope: Field.select(['system', 'platform', 'user'], {\n label: 'Scope',\n required: true,\n defaultValue: 'platform',\n }),\n\n /** JSON payload — the actual metadata configuration */\n metadata: Field.textarea({\n label: 'Metadata',\n required: true,\n description: 'JSON-serialized metadata payload',\n }),\n\n /** Parent metadata name for extension/override */\n extends: Field.text({\n label: 'Extends',\n required: false,\n maxLength: 255,\n }),\n\n /** Merge strategy when extending parent metadata */\n strategy: Field.select(['merge', 'replace'], {\n label: 'Strategy',\n required: false,\n defaultValue: 'merge',\n }),\n\n /** Owner user ID (for user-scope items) */\n owner: Field.text({\n label: 'Owner',\n required: false,\n maxLength: 255,\n }),\n\n /** Lifecycle state */\n state: Field.select(['draft', 'active', 'archived', 'deprecated'], {\n label: 'State',\n required: false,\n defaultValue: 'active',\n }),\n\n /** Organization ID for multi-tenant isolation */\n organization_id: Field.lookup('sys_organization', {\n label: 'Organization',\n required: false,\n description: 'Organization for multi-tenant isolation.',\n }),\n\n /**\n * @deprecated ADR-0005 (revised 2026-05): per-env DBs replace per-project\n * isolation. `environment_id` is no longer written by saveMetaItem and not\n * consulted by overlay reads. Kept for legacy rows; new writes leave it\n * NULL. Will be dropped in a future schema migration.\n */\n environment_id: Field.lookup('sys_environment', {\n label: 'Environment (deprecated)',\n required: false,\n description: 'DEPRECATED. Use organization_id for tenant isolation.',\n }),\n\n /** Version number for optimistic concurrency */\n version: Field.number({\n label: 'Version',\n required: false,\n defaultValue: 1,\n }),\n\n /** Content checksum for change detection (e.g. `sha256:<64 hex>` = 71 chars) */\n checksum: Field.text({\n label: 'Checksum',\n required: false,\n maxLength: 71,\n }),\n\n /** Origin of this metadata record */\n source: Field.select(['filesystem', 'database', 'api', 'migration'], {\n label: 'Source',\n required: false,\n }),\n\n /** Classification tags (JSON array) */\n tags: Field.textarea({\n label: 'Tags',\n required: false,\n description: 'JSON-serialized array of classification tags',\n }),\n\n /** Audit fields */\n created_by: Field.lookup('sys_user', {\n label: 'Created By',\n required: false,\n readonly: true,\n }),\n\n created_at: Field.datetime({\n label: 'Created At',\n required: false,\n readonly: true,\n }),\n\n updated_by: Field.lookup('sys_user', {\n label: 'Updated By',\n required: false,\n }),\n\n updated_at: Field.datetime({\n label: 'Updated At',\n required: false,\n }),\n },\n\n indexes: [\n // ADR-0005 (revised 2026-05): overlay uniqueness is scoped by\n // (type, name, organization_id), restricted to active rows so resets\n // / archived versions don't collide. environment_id is deprecated and\n // not part of the discriminator. The runtime layer (protocol.ts\n // ensureOverlayIndex) issues a DROP-then-CREATE migration to\n // replace any pre-existing legacy composite index in-place.\n {\n name: 'idx_sys_metadata_overlay_active',\n fields: ['type', 'name', 'organization_id'],\n unique: true,\n partial: \"state = 'active'\",\n },\n { name: 'idx_sys_metadata_org_type', fields: ['organization_id', 'type'] },\n { fields: ['type', 'scope'] },\n { fields: ['package_version_id'] },\n { fields: ['state'] },\n { fields: ['namespace'] },\n ],\n\n enable: {\n trackHistory: true,\n searchable: false,\n apiEnabled: true,\n apiMethods: ['get', 'list', 'create', 'update', 'delete'],\n trash: false,\n },\n\n // Named list views — power the Setup App \"Data Model\" group so admins\n // can browse object/field metadata in a typed grid instead of the raw\n // `All Metadata` debug surface. Each entry pre-filters by `type` and\n // shows the columns that matter for that type. The dedicated visual\n // designer (objectui's <ObjectManager> / <FieldDesigner>) deep-links\n // from the row's `Edit in Designer` action; the grid stays useful for\n // search, audit (state / updated_at) and triage.\n listViews: {\n only_objects: {\n type: 'grid',\n name: 'only_objects',\n label: 'Objects',\n data: { provider: 'object', object: 'sys_metadata' },\n columns: ['name', 'namespace', 'scope', 'managed_by', 'state', 'updated_at'],\n filter: [{ field: 'type', operator: 'equals', value: 'object' }],\n sort: [{ field: 'name', order: 'asc' }],\n pagination: { pageSize: 50 },\n },\n only_fields: {\n type: 'grid',\n name: 'only_fields',\n label: 'Fields',\n data: { provider: 'object', object: 'sys_metadata' },\n columns: ['name', 'namespace', 'scope', 'managed_by', 'state', 'updated_at'],\n filter: [{ field: 'type', operator: 'equals', value: 'field' }],\n sort: [{ field: 'name', order: 'asc' }],\n pagination: { pageSize: 50 },\n },\n all_metadata: {\n type: 'grid',\n name: 'all_metadata',\n label: 'All',\n data: { provider: 'object', object: 'sys_metadata' },\n columns: ['name', 'type', 'namespace', 'scope', 'state', 'updated_at'],\n sort: [{ field: 'updated_at', order: 'desc' }],\n pagination: { pageSize: 50 },\n },\n },\n});\n","// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport { ObjectSchema, Field } from '@objectstack/spec/data';\n\n/**\n * sys_metadata_history — Metadata Version History / Event Log\n *\n * Append-only durable log of every overlay change made through\n * `SysMetadataRepository.put` / `delete` (ADR-0008 §10 M1). Each row is a\n * single event in the per-organisation event log; rows are NEVER\n * mutated after insertion. The legacy `DatabaseLoader` writes the same\n * shape from its own put/restore code paths.\n *\n * ─────────────────────────────────────────────────────────────────────\n * Key design points (ADR-0008 §0 amendment + M1):\n *\n * • Keyed by `(organization_id, type, name)` only — `environment_id` was\n * removed in the branch/project-removal amendment. The original\n * `metadata_id` column (a downgraded plain-text version of the old\n * `sys_metadata.id` FK) was removed in the M1 follow-up — joins go\n * through `(organization_id, type, name, version)` exclusively.\n *\n * • `event_seq` is the per-org monotonic event-log cursor. Producers\n * compute `MAX(event_seq) + 1 WHERE organization_id = X` inside the\n * same transaction as the parent `sys_metadata` write.\n *\n * • `version` is the per-(org,type,name) lineage counter. Producers\n * compute `MAX(version) + 1 WHERE organization_id = X AND type = T\n * AND name = N` so delete + recreate continues incrementing instead\n * of restarting at 1.\n *\n * • `metadata` / `checksum` are nullable — DELETE rows have no body or\n * hash. Readers must tolerate null on both columns.\n *\n * • `source` records the producer ('sys-metadata-repo', 'fs',\n * 'studio', …) and feeds MetadataEvent.source on history() reads.\n *\n * Indexes are purpose-built for the two dominant read patterns:\n * 1. per-item history view → `(organization_id, type, name, version)`\n * 2. org-wide event replay → `(organization_id, event_seq)`\n * ─────────────────────────────────────────────────────────────────────\n */\nexport const SysMetadataHistoryObject = ObjectSchema.create({\n name: 'sys_metadata_history',\n label: 'Metadata History',\n pluralLabel: 'Metadata History',\n icon: 'history',\n isSystem: true,\n managedBy: 'system',\n description: 'Durable event log of metadata overlay changes (per-org, append-only)',\n\n fields: {\n /** Primary Key (UUID) */\n id: Field.text({\n label: 'ID',\n required: true,\n readonly: true,\n }),\n\n /** Per-org monotonic event sequence (durable cursor for replay). */\n event_seq: Field.number({\n label: 'Event Seq',\n required: true,\n readonly: true,\n description: 'Per-organization monotonic event log cursor.',\n }),\n\n /** Machine name (denormalized for easier querying) */\n name: Field.text({\n label: 'Name',\n required: true,\n searchable: true,\n readonly: true,\n maxLength: 255,\n }),\n\n /** Metadata type (denormalized for easier querying) */\n type: Field.text({\n label: 'Metadata Type',\n required: true,\n searchable: true,\n readonly: true,\n maxLength: 100,\n }),\n\n /** Per-(org,type,name) lineage counter at this snapshot. */\n version: Field.number({\n label: 'Version',\n required: true,\n readonly: true,\n }),\n\n /** Type of operation that created this history entry */\n operation_type: Field.select(['create', 'update', 'publish', 'revert', 'delete'], {\n label: 'Operation Type',\n required: true,\n readonly: true,\n }),\n\n /**\n * Historical metadata snapshot (JSON payload).\n * Null for `operation_type = 'delete'` — the row carries no body.\n */\n metadata: Field.textarea({\n label: 'Metadata',\n required: false,\n readonly: true,\n description: 'JSON-serialized metadata snapshot at this version (null for deletes).',\n }),\n\n /** SHA-256 checksum of metadata content (null for deletes). */\n checksum: Field.text({\n label: 'Checksum',\n required: false,\n readonly: true,\n maxLength: 80,\n }),\n\n /** Checksum of the previous version (null for the first event). */\n previous_checksum: Field.text({\n label: 'Previous Checksum',\n required: false,\n readonly: true,\n maxLength: 80,\n }),\n\n /** Human-readable description of changes (= MetadataEvent.message). */\n change_note: Field.textarea({\n label: 'Change Note',\n required: false,\n readonly: true,\n description: 'Description of what changed in this version.',\n }),\n\n /**\n * Producer of the event ('sys-metadata-repo', 'fs', 'studio',\n * 'api', …). Defaults to 'sys-metadata-repo' on the canonical\n * write path; preserved on history() reads as MetadataEvent.source.\n */\n source: Field.text({\n label: 'Source',\n required: false,\n readonly: true,\n maxLength: 64,\n }),\n\n /** Organization ID for multi-tenant isolation */\n organization_id: Field.lookup('sys_organization', {\n label: 'Organization',\n required: false,\n readonly: true,\n description: 'Organization for multi-tenant isolation.',\n }),\n\n /** User who made this change (= MetadataEvent.actor). */\n recorded_by: Field.lookup('sys_user', {\n label: 'Recorded By',\n required: false,\n readonly: true,\n }),\n\n /** When was this version recorded */\n recorded_at: Field.datetime({\n label: 'Recorded At',\n required: true,\n readonly: true,\n }),\n },\n\n indexes: [\n { fields: ['organization_id', 'event_seq'], unique: true },\n { fields: ['organization_id', 'type', 'name', 'version'], unique: true },\n { fields: ['organization_id', 'type', 'name', 'recorded_at'] },\n // ADR-0009: getByHash() lookup — execution-pinned types resolve a\n // historical body by content hash via this index.\n { fields: ['organization_id', 'type', 'name', 'checksum'] },\n { fields: ['type', 'name'] },\n { fields: ['recorded_at'] },\n { fields: ['operation_type'] },\n ],\n\n enable: {\n trackHistory: false,\n searchable: false,\n apiEnabled: true,\n apiMethods: ['get', 'list'],\n trash: false,\n },\n});\n","// Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport { ObjectSchema, Field } from '@objectstack/spec/data';\n\n/**\n * sys_metadata_audit — Metadata Protection Audit Log\n *\n * Append-only audit trail for every metadata write **decision** — both\n * allowed writes and refused ones. Introduced in ADR-0010 Phase 1 as\n * the compliance surface for the new `_lock` enforcement: every PUT /\n * publish / rollback / delete that targets `sys_metadata` writes one\n * row here describing the outcome and the lock state that produced it.\n *\n * Distinct from `sys_metadata_history`:\n * - `sys_metadata_history` records the **body** of every successful\n * write (full JSON snapshot + checksum). Used for rollback,\n * diff, and history() reads.\n * - `sys_metadata_audit` records the **decision** (who tried what,\n * what code was emitted, was a lock involved). Refused writes\n * never reach history; they DO reach audit.\n *\n * Designed as the smallest possible row that satisfies the four\n * compliance questions of metadata governance:\n * 1. Who tried to change what? → actor + type + name\n * 2. When? → occurred_at\n * 3. What outcome? → outcome + code\n * 4. Was an override involved? → lock_overridden + lock_state\n *\n * Indexed on `(organization_id, occurred_at)` for the per-org timeline\n * query and `(type, name, occurred_at)` for the per-item history tab\n * Studio surfaces on the editor page.\n */\nexport const SysMetadataAuditObject = ObjectSchema.create({\n name: 'sys_metadata_audit',\n label: 'Metadata Audit',\n pluralLabel: 'Metadata Audit',\n icon: 'shield-check',\n isSystem: true,\n managedBy: 'append-only',\n description: 'Append-only audit trail of metadata write decisions (ADR-0010).',\n\n fields: {\n /** Primary Key (UUID) */\n id: Field.text({\n label: 'ID',\n required: true,\n readonly: true,\n }),\n\n /** When the decision was made (ISO-8601 UTC). */\n occurred_at: Field.datetime({\n label: 'Occurred At',\n required: true,\n readonly: true,\n }),\n\n /** Acting principal (user id, system id, or 'system'). */\n actor: Field.text({\n label: 'Actor',\n required: true,\n readonly: true,\n maxLength: 255,\n description: 'Acting principal — user id, system id, or \"system\".',\n }),\n\n /** Code path that produced the decision (e.g. `protocol.saveMetaItem`). */\n source: Field.text({\n label: 'Source',\n required: false,\n readonly: true,\n maxLength: 128,\n }),\n\n /** Metadata type (singular, e.g. `app`, `object`, `view`). */\n type: Field.text({\n label: 'Metadata Type',\n required: true,\n readonly: true,\n searchable: true,\n maxLength: 100,\n }),\n\n /** Item machine name. */\n name: Field.text({\n label: 'Name',\n required: true,\n readonly: true,\n searchable: true,\n maxLength: 255,\n }),\n\n /** Organization for multi-tenant filtering. NULL for env-wide writes. */\n organization_id: Field.lookup('sys_organization', {\n label: 'Organization',\n required: false,\n readonly: true,\n }),\n\n /** Operation kind. */\n operation: Field.select(['save', 'publish', 'rollback', 'delete', 'reset'], {\n label: 'Operation',\n required: true,\n readonly: true,\n }),\n\n /** Decision outcome — allowed, denied (refused), or forced (bypassed via override). */\n outcome: Field.select(['allowed', 'denied', 'forced'], {\n label: 'Outcome',\n required: true,\n readonly: true,\n }),\n\n /**\n * Machine-readable code for the decision:\n * - on `allowed`: `'ok'`\n * - on `denied`: `'not_overridable'` | `'not_creatable'` |\n * `'item_locked'` | `'invalid_metadata'` | `'destructive_change'` |\n * `'metadata_conflict'`\n * - on `forced`: `'lock_override'` (Phase 3)\n */\n code: Field.text({\n label: 'Code',\n required: true,\n readonly: true,\n maxLength: 64,\n }),\n\n /**\n * Lock state observed at the time of the decision (`none` if the\n * item carried no `_lock`). Captured even on `allowed` rows so\n * later compliance queries can see \"what was the lock state when\n * this write succeeded\".\n */\n lock_state: Field.select(['none', 'no-overlay', 'no-delete', 'full'], {\n label: 'Lock State',\n required: false,\n readonly: true,\n }),\n\n /** True when the write succeeded by bypassing a lock (Phase 3). */\n lock_overridden: Field.boolean({\n label: 'Lock Overridden',\n required: false,\n readonly: true,\n }),\n\n /** Optional request correlation id for tracing. */\n request_id: Field.text({\n label: 'Request ID',\n required: false,\n readonly: true,\n maxLength: 128,\n }),\n\n /** Optional free-form context (e.g. brief diff summary). */\n note: Field.textarea({\n label: 'Note',\n required: false,\n readonly: true,\n }),\n },\n\n indexes: [\n { fields: ['organization_id', 'occurred_at'] },\n { fields: ['type', 'name', 'occurred_at'] },\n { fields: ['actor', 'occurred_at'] },\n { fields: ['outcome'] },\n ],\n\n enable: {\n trackHistory: false,\n searchable: false,\n apiEnabled: true,\n apiMethods: ['get', 'list'],\n trash: false,\n },\n});\n","// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport { ObjectSchema, Field } from '@objectstack/spec/data';\n\n/**\n * sys_view_definition — Runtime View Storage (\"Object has-many View\")\n *\n * Persists view definitions authored at RUNTIME by end users — the `shared`\n * and `personal` layers of the view model (see spec `ViewItemSchema`). The\n * `package` layer ships from `*.view.ts` source and lives in the metadata\n * registry; it is NOT stored here.\n *\n * Why a dedicated object (not the `sys_metadata` overlay): runtime views are\n * data, not admin metadata customisation. They carry an `owner`, a visibility\n * `scope`, and are queried per-user — so they belong in a typed, permissioned\n * ObjectQL object rather than the global metadata registry (which a personal\n * \"My hot leads\" view should never pollute).\n *\n * CRUD flows through ObjectQL's generic data API (`/api/v1/data/\n * sys_view_definition`) — no bespoke per-view REST endpoints. The runtime\n * switcher reads the `package` layer via `GET /meta/view?object=<object>` and\n * merges these rows client-side, filtered to `scope='shared'` OR\n * `owner=<current user>`.\n *\n * This is a system object (isSystem: true) — protected from deletion and\n * auto-provisioned on first use.\n */\nexport const SysViewDefinitionObject = ObjectSchema.create({\n name: 'sys_view_definition',\n label: 'View Definition',\n pluralLabel: 'View Definitions',\n icon: 'layout-grid',\n isSystem: true,\n description:\n 'Runtime-authored view definitions (shared / personal layers). The package layer ships from source.',\n\n fields: {\n /** Primary Key (UUID) */\n id: Field.text({ label: 'ID', required: true, readonly: true }),\n\n /**\n * Globally-unique qualified view id, `<object>.<viewKey>`, matching the\n * spec `ViewItemSchema.name`. For personal views the runtime may suffix\n * to keep it unique per owner.\n */\n name: Field.text({\n label: 'Name',\n required: true,\n searchable: true,\n maxLength: 255,\n }),\n\n /** Bound object — the foreign key used to aggregate views for the switcher. */\n object: Field.text({\n label: 'Object',\n required: true,\n searchable: true,\n maxLength: 255,\n }),\n\n /** Whether `config` is a ListView (list family) or a FormView. */\n view_kind: Field.select(['list', 'form'], {\n label: 'View Kind',\n required: true,\n defaultValue: 'list',\n }),\n\n /** Display label (plain string; i18n keys also accepted). */\n label: Field.text({ label: 'Label', required: false, maxLength: 255 }),\n\n /** Whether this is the object's default view in the switcher. */\n is_default: Field.boolean({ label: 'Is Default', required: false, defaultValue: false }),\n\n /** Sort order within the object's switcher / left rail. */\n view_order: Field.number({ label: 'Order', required: false, defaultValue: 0 }),\n\n /**\n * Identity layer. Only `shared` and `personal` are stored at runtime;\n * `package` views come from source.\n */\n scope: Field.select(['shared', 'personal'], {\n label: 'Scope',\n required: true,\n defaultValue: 'personal',\n }),\n\n /** Owner user id — set when scope = personal; null for shared. */\n owner: Field.text({ label: 'Owner', required: false, maxLength: 255 }),\n\n /** Hidden from the switcher (per-user / per-org declutter). */\n hidden: Field.boolean({ label: 'Hidden', required: false, defaultValue: false }),\n\n /** The ListView / FormView configuration payload. */\n config: Field.json({\n label: 'Config',\n required: true,\n description: 'ListView or FormView configuration (matches spec ViewItem.config).',\n }),\n\n /** Organization for multi-tenant isolation. */\n organization_id: Field.lookup('sys_organization', {\n label: 'Organization',\n required: false,\n description: 'Organization for multi-tenant isolation.',\n }),\n\n /** Lifecycle state. */\n state: Field.select(['draft', 'active', 'archived'], {\n label: 'State',\n required: false,\n defaultValue: 'active',\n }),\n\n /** Audit fields. */\n created_by: Field.lookup('sys_user', { label: 'Created By', required: false, readonly: true }),\n created_at: Field.datetime({ label: 'Created At', required: false, readonly: true }),\n updated_by: Field.lookup('sys_user', { label: 'Updated By', required: false }),\n updated_at: Field.datetime({ label: 'Updated At', required: false }),\n },\n\n indexes: [\n // A given view name is unique per (organization, owner) among active rows —\n // a shared view (owner NULL) and each user's personal views don't collide.\n {\n name: 'idx_sys_view_def_active',\n fields: ['name', 'organization_id', 'owner'],\n unique: true,\n partial: \"state = 'active'\",\n },\n // The switcher query: views for one object within a tenant.\n { name: 'idx_sys_view_def_object', fields: ['organization_id', 'object'] },\n { fields: ['scope'] },\n { fields: ['owner'] },\n { fields: ['state'] },\n ],\n\n enable: {\n trackHistory: true,\n searchable: false,\n apiEnabled: true,\n apiMethods: ['get', 'list', 'create', 'update', 'delete'],\n trash: false,\n },\n});\n"]}