@kedem/okdb 1.0.1 → 1.0.4

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 (142) hide show
  1. package/bin/okdb.js +1 -1
  2. package/keys/public.pem +3 -0
  3. package/okdb.js +1 -1
  4. package/package.json +2 -2
  5. package/public/admin-app.js +1 -1
  6. package/public/components/admin-route-host.ok.js +1 -1
  7. package/public/components/env-picker.ok.js +1 -1
  8. package/public/components/field-path-input.ok.js +1 -1
  9. package/public/components/field.html +154 -2
  10. package/public/components/geo-map.ok.js +1 -1
  11. package/public/components/ok-cron-input.ok.js +1 -1
  12. package/public/components/ok-dropzone.ok.js +1 -1
  13. package/public/components/ok-js-input.ok.js +1 -1
  14. package/public/components/ok-json-input.ok.js +1 -1
  15. package/public/components/ok-text-monaco-input.ok.js +1 -1
  16. package/public/components/theme-toggle.ok.js +1 -1
  17. package/public/index.html +29 -2
  18. package/public/layouts/_default.ok.html +1 -1
  19. package/public/layouts/okdb-cube.ok.html +1 -1
  20. package/public/login-app.js +1 -1
  21. package/public/login.html +205 -1
  22. package/public/modules/ok.js +1 -1
  23. package/public/sections/api/index.ok.html +1 -1
  24. package/public/sections/api/parts/api-endpoint.ok.js +1 -1
  25. package/public/sections/auth/index.ok.html +1 -1
  26. package/public/sections/auth/modals/create-token-modal.ok.js +1 -1
  27. package/public/sections/auth/modals/edit-token-modal.ok.js +1 -1
  28. package/public/sections/auth/modals/perm-info-popover.ok.js +1 -1
  29. package/public/sections/auth/parts/token-detail.ok.js +1 -1
  30. package/public/sections/auth/parts/token-list.ok.js +1 -1
  31. package/public/sections/db/index.ok.html +1 -1
  32. package/public/sections/db/modals/add-item-modal.ok.js +1 -1
  33. package/public/sections/db/modals/create-env-modal.ok.js +1 -1
  34. package/public/sections/db/modals/create-fts-modal.ok.js +1 -1
  35. package/public/sections/db/modals/create-index-modal.ok.js +1 -1
  36. package/public/sections/db/modals/create-pipeline-modal.ok.js +1 -1
  37. package/public/sections/db/modals/demo-env-modal.ok.js +1 -1
  38. package/public/sections/db/modals/remove-env-modal.ok.js +1 -1
  39. package/public/sections/db/modals/schema-edit-modal.ok.js +1 -1
  40. package/public/sections/db/parts/db-overview.ok.js +1 -1
  41. package/public/sections/db/parts/db-pipelines-panel.ok.js +1 -1
  42. package/public/sections/db/parts/edit-row.ok.js +1 -1
  43. package/public/sections/db/parts/tm-timeline.ok.js +1 -1
  44. package/public/sections/db/parts/type-changelog.ok.js +1 -1
  45. package/public/sections/db/parts/type-list.ok.js +1 -1
  46. package/public/sections/db/parts/type-pipelines-tab.ok.js +1 -1
  47. package/public/sections/db/parts/type-schema-tab.ok.js +1 -1
  48. package/public/sections/db/parts/type-viewer.ok.js +1 -1
  49. package/public/sections/db/parts/type-violations-tab.ok.js +1 -1
  50. package/public/sections/docs/index.ok.html +1 -1
  51. package/public/sections/embeddings/index.ok.html +1 -1
  52. package/public/sections/embeddings/modals/register-model-modal.ok.js +1 -1
  53. package/public/sections/embeddings/parts/embed-create-panel.ok.js +1 -1
  54. package/public/sections/embeddings/parts/embed-embedder-panel.ok.js +1 -1
  55. package/public/sections/embeddings/parts/embed-engine-declaration-editor.ok.js +1 -1
  56. package/public/sections/embeddings/parts/embed-engine-list.ok.js +1 -1
  57. package/public/sections/embeddings/parts/embed-indexer-panel.ok.js +1 -1
  58. package/public/sections/embeddings/parts/embed-lifecycle-bar.ok.js +1 -1
  59. package/public/sections/embeddings/parts/embed-model-catalog.ok.js +1 -1
  60. package/public/sections/embeddings/parts/embed-overview.ok.js +1 -1
  61. package/public/sections/embeddings/parts/embed-search-panel.ok.js +1 -1
  62. package/public/sections/embeddings/parts/embed-worker-panel.ok.js +1 -1
  63. package/public/sections/embeddings/parts/embeddings-engine-panel.ok.js +1 -1
  64. package/public/sections/embeddings/parts/engines-overview.ok.js +1 -1
  65. package/public/sections/embeddings/parts/pipeline-create-panel.ok.js +1 -1
  66. package/public/sections/engines/engine-panel-shared-style.js +1 -1
  67. package/public/sections/engines/engine-ui-utils.js +1 -1
  68. package/public/sections/engines/index.ok.html +1 -1
  69. package/public/sections/engines/modals/engine-modal.ok.js +1 -1
  70. package/public/sections/engines/parts/engine-declaration-editor.ok.js +1 -1
  71. package/public/sections/engines/parts/engine-lifecycle-actions.ok.js +1 -1
  72. package/public/sections/engines/parts/engine-panel-shell.ok.js +1 -1
  73. package/public/sections/engines/parts/engine-resource-card.ok.js +1 -1
  74. package/public/sections/engines/parts/engine-row-item.ok.js +1 -1
  75. package/public/sections/engines/parts/generic-engine-panel.ok.js +1 -1
  76. package/public/sections/files/index.ok.html +1 -1
  77. package/public/sections/files/parts/files-blob-status.ok.js +1 -1
  78. package/public/sections/files/parts/files-collection-list.ok.js +1 -1
  79. package/public/sections/files/parts/files-collection-panel.ok.js +1 -1
  80. package/public/sections/files/parts/files-file-list.ok.js +1 -1
  81. package/public/sections/files/parts/files-overview.ok.js +1 -1
  82. package/public/sections/files/parts/files-path-browser.ok.js +1 -1
  83. package/public/sections/files/parts/files-upload-panel.ok.js +1 -1
  84. package/public/sections/functions/index.ok.html +1 -1
  85. package/public/sections/functions/modals/function-modal.ok.js +1 -1
  86. package/public/sections/functions/parts/function-detail.ok.js +1 -1
  87. package/public/sections/functions/parts/function-logs.ok.js +1 -1
  88. package/public/sections/functions/parts/function-runner.ok.js +1 -1
  89. package/public/sections/functions/parts/functions-list.ok.js +1 -1
  90. package/public/sections/license/index.ok.html +1 -1
  91. package/public/sections/license/parts/license-panel.ok.js +1 -1
  92. package/public/sections/processors/index.ok.html +1 -1
  93. package/public/sections/queue/index.ok.html +1 -1
  94. package/public/sections/queue/modals/create-bucket-modal.ok.js +1 -1
  95. package/public/sections/queue/modals/edit-bucket-modal.ok.js +1 -1
  96. package/public/sections/queue/modals/edit-job-modal.ok.js +1 -1
  97. package/public/sections/queue/modals/enqueue-job-modal.ok.js +1 -1
  98. package/public/sections/queue/modals/job-type-modal.ok.js +1 -1
  99. package/public/sections/queue/parts/ok-job-form.ok.js +1 -1
  100. package/public/sections/queue/parts/queue-buckets.ok.js +1 -1
  101. package/public/sections/queue/parts/queue-job-types.ok.js +1 -1
  102. package/public/sections/queue/parts/queue-jobs.ok.js +1 -1
  103. package/public/sections/queue/parts/queue-types.ok.js +1 -1
  104. package/public/sections/queue/parts/queue-workers.ok.js +1 -1
  105. package/public/sections/sync/index.ok.html +1 -1
  106. package/public/sections/sync/parts/sync-node-detail.ok.js +1 -1
  107. package/public/sections/sync/parts/sync-retention.ok.js +1 -1
  108. package/public/sections/sync/parts/sync-topology.ok.js +1 -1
  109. package/public/sections/system/index.ok.html +1 -1
  110. package/public/sections/system/modals/data-ops-modal.ok.js +1 -1
  111. package/public/sections/system/parts/system-api-panel.ok.js +1 -1
  112. package/public/sections/system/parts/system-auth-panel.ok.js +1 -1
  113. package/public/sections/system/parts/system-log-history.ok.js +1 -1
  114. package/public/sections/system/parts/system-log.ok.js +1 -1
  115. package/public/sections/system/parts/system-status.ok.js +1 -1
  116. package/public/sections/system/parts/system-sync-panel.ok.js +1 -1
  117. package/public/sections/views/index.ok.html +1 -1
  118. package/public/sections/views/modals/create-view-modal.ok.js +1 -1
  119. package/public/sections/views/parts/view-detail.ok.js +1 -1
  120. package/public/sections/views/parts/views-list.ok.js +1 -1
  121. package/public/sections/views/parts/views-overview.ok.js +1 -1
  122. package/public/setup-app.js +1 -1
  123. package/public/setup.html +189 -1
  124. package/public/stores/auth-store.js +1 -1
  125. package/public/stores/events-store.js +1 -1
  126. package/public/stores/functions-store.js +1 -1
  127. package/public/stores/okdb-store.js +1 -1
  128. package/public/stores/theme-store.js +1 -1
  129. package/public/test-cron-input.html +53 -3
  130. package/public/test-json-input.html +182 -3
  131. package/public/util/permissions.js +1 -1
  132. package/public/util/sift-schema.js +1 -1
  133. package/public/vendor/okjs/ok.esm.min.js +1 -2
  134. package/public/view-models/type-query-vm.js +1 -1
  135. package/okdb-data/default/data.mdb +0 -0
  136. package/okdb-data/default/lock.mdb +0 -0
  137. package/okdb-data/~log/data.mdb +0 -0
  138. package/okdb-data/~log/lock.mdb +0 -0
  139. package/okdb-data/~system/data.mdb +0 -0
  140. package/okdb-data/~system/lock.mdb +0 -0
  141. package/public/images/logo.png +0 -0
  142. package/public/images/logo.svg +0 -333
@@ -1 +1 @@
1
- const _0x5c6739=_0xc20a;(function(_0x11267e,_0x2cae91){const _0x29e949=_0xc20a,_0x471fc8=_0x11267e();while(!![]){try{const _0x3a0c78=-parseInt(_0x29e949(0x130))/0x1+-parseInt(_0x29e949(0x12b))/0x2*(-parseInt(_0x29e949(0x140))/0x3)+parseInt(_0x29e949(0x156))/0x4*(-parseInt(_0x29e949(0x174))/0x5)+-parseInt(_0x29e949(0x124))/0x6*(-parseInt(_0x29e949(0x133))/0x7)+-parseInt(_0x29e949(0x161))/0x8+parseInt(_0x29e949(0x13b))/0x9*(parseInt(_0x29e949(0x16c))/0xa)+parseInt(_0x29e949(0x11a))/0xb;if(_0x3a0c78===_0x2cae91)break;else _0x471fc8['push'](_0x471fc8['shift']());}catch(_0x2bc452){_0x471fc8['push'](_0x471fc8['shift']());}}}(_0x3baf,0x2ed74));function _0x3baf(){const _0x536e90=['/violations/','status','slice','minimum','44HDsQsV','map','entries','$attr','all','apiBase','items≤','just\x20now','length','uniqueItems','len≤','1491792NcAPFy','schema','no_action','type','s\x20ago','exclusiveMaximum','message','violationCount','additionalProperties','type-schema-tab','split','390agCoLg','statusText','some','open','\x20|\x20','refViolationsBusy','minLength','const','143125VKerdT','errorCount','minItems','$ok','expandedViolation','_notifyViolationCount','function','/type/','round','schemaLoaded','definition','now','\x20props','enum(','schemaError','isArray','maxItems','shared','enum','len≥','items','3391883UUlmhG','violationsError','violationsBusy','items≥','envApiBase','catch','exclusiveMinimum','refViolations','expandedRefViolation','maxLength','972gJirCQ','onSchemaChanged','Failed\x20to\x20load\x20violations','<schema-edit-modal\x20:modal=\x22modal\x22\x20:type=\x22type\x22\x20:schema=\x22schema\x22\x20:env-api-base=\x22envApiBase\x22\x20:on-done=\x22onDone\x22\x20/>','loadViolations','multipleOf','required','339926WseXIc','data','properties','push','m\x20ago','118962YUKADf','errors','Failed\x20to\x20load\x20ref\x20violations','973jKxkHQ','error','result','loadSchema','join','/schema','items:\x20','propertyEntries','71847Wuqjvj','\x0a\x20\x20\x20\x20\x20\x20type-schema-tab\x20.sts-grid\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20display:\x20grid;\x0a\x20\x20\x20\x20\x20\x20\x20\x20grid-template-columns:\x20minmax(80px,\x201.5fr)\x20minmax(60px,\x201fr)\x2040px\x20minmax(80px,\x201.5fr)\x202fr;\x0a\x20\x20\x20\x20\x20\x20\x20\x20gap:\x200;\x0a\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20type-schema-tab\x20.sts-hd\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20font-size:\x2011px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20opacity:\x20.4;\x0a\x20\x20\x20\x20\x20\x20\x20\x20padding:\x200\x2012px\x206px\x200;\x0a\x20\x20\x20\x20\x20\x20\x20\x20border-bottom:\x201px\x20solid\x20var(--okdb-app-border);\x0a\x20\x20\x20\x20\x20\x20\x20\x20font-weight:\x20normal;\x0a\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20type-schema-tab\x20.sts-cell\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20padding:\x206px\x2012px\x206px\x200;\x0a\x20\x20\x20\x20\x20\x20\x20\x20border-bottom:\x201px\x20solid\x20var(--okdb-app-surface);\x0a\x20\x20\x20\x20\x20\x20\x20\x20font-size:\x2013px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20display:\x20flex;\x0a\x20\x20\x20\x20\x20\x20\x20\x20align-items:\x20center;\x0a\x20\x20\x20\x20\x20\x20\x20\x20min-width:\x200;\x0a\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20type-schema-tab\x20.sts-dim\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20opacity:\x20.5;\x0a\x20\x20\x20\x20\x20\x20\x20\x20font-size:\x2012px;\x0a\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20type-schema-tab\x20.sts-json-preview\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20margin-top:\x208px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20padding:\x2010px\x2012px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20background:\x20var(--okdb-app-bg-deep);\x0a\x20\x20\x20\x20\x20\x20\x20\x20border:\x201px\x20solid\x20var(--okdb-app-surface-2);\x0a\x20\x20\x20\x20\x20\x20\x20\x20border-radius:\x206px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20font-size:\x2011px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20line-height:\x201.6;\x0a\x20\x20\x20\x20\x20\x20\x20\x20overflow:\x20auto;\x0a\x20\x20\x20\x20\x20\x20\x20\x20max-height:\x20280px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20white-space:\x20pre-wrap;\x0a\x20\x20\x20\x20\x20\x20\x20\x20word-break:\x20break-word;\x0a\x20\x20\x20\x20\x20\x20\x20\x20color:\x20var(--okdb-app-fg-muted);\x0a\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20/*\x20──\x20Violations\x20sub-panel\x20──\x20*/\x0a\x20\x20\x20\x20\x20\x20type-schema-tab\x20.sts-viol-badge\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20margin-left:\x206px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20font-size:\x2010px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20padding:\x202px\x208px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20border-radius:\x20999px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20border:\x201px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-danger)\x2033%,\x20transparent);\x0a\x20\x20\x20\x20\x20\x20\x20\x20color:\x20var(--okdb-danger);\x0a\x20\x20\x20\x20\x20\x20\x20\x20font-weight:\x20600;\x0a\x20\x20\x20\x20\x20\x20\x20\x20text-transform:\x20none;\x0a\x20\x20\x20\x20\x20\x20\x20\x20letter-spacing:\x200;\x0a\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20type-schema-tab\x20.sts-viol-table\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20display:\x20grid;\x0a\x20\x20\x20\x20\x20\x20\x20\x20grid-template-columns:\x20minmax(120px,\x202fr)\x2060px\x2090px\x20auto;\x0a\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20type-schema-tab\x20.sts-viol-hd\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20font-size:\x2011px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20opacity:\x20.4;\x0a\x20\x20\x20\x20\x20\x20\x20\x20padding:\x200\x2012px\x206px\x200;\x0a\x20\x20\x20\x20\x20\x20\x20\x20border-bottom:\x201px\x20solid\x20var(--okdb-app-border);\x0a\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20type-schema-tab\x20.sts-viol-cell\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20display:\x20flex;\x0a\x20\x20\x20\x20\x20\x20\x20\x20align-items:\x20center;\x0a\x20\x20\x20\x20\x20\x20\x20\x20padding:\x207px\x2012px\x207px\x200;\x0a\x20\x20\x20\x20\x20\x20\x20\x20border-bottom:\x201px\x20solid\x20var(--okdb-app-surface);\x0a\x20\x20\x20\x20\x20\x20\x20\x20cursor:\x20pointer;\x0a\x20\x20\x20\x20\x20\x20\x20\x20transition:\x20background\x20.1s;\x0a\x20\x20\x20\x20\x20\x20\x20\x20min-width:\x200;\x0a\x20\x20\x20\x20\x20\x20\x20\x20overflow:\x20hidden;\x0a\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20type-schema-tab\x20.sts-viol-cell:hover\x20{\x20background:\x20#ffffff07;\x20}\x0a\x20\x20\x20\x20\x20\x20type-schema-tab\x20.sts-viol-key\x20{\x20overflow:\x20hidden;\x20}\x0a\x20\x20\x20\x20\x20\x20type-schema-tab\x20.sts-viol-key\x20span\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20overflow:\x20hidden;\x0a\x20\x20\x20\x20\x20\x20\x20\x20text-overflow:\x20ellipsis;\x0a\x20\x20\x20\x20\x20\x20\x20\x20white-space:\x20nowrap;\x0a\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20type-schema-tab\x20.sts-viol-expanded\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20padding:\x2010px\x2012px\x2012px\x2014px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20background:\x20var(--okdb-app-bg-deep);\x0a\x20\x20\x20\x20\x20\x20\x20\x20border-bottom:\x201px\x20solid\x20var(--okdb-app-surface);\x0a\x20\x20\x20\x20\x20\x20\x20\x20display:\x20flex;\x0a\x20\x20\x20\x20\x20\x20\x20\x20flex-direction:\x20column;\x0a\x20\x20\x20\x20\x20\x20\x20\x20gap:\x204px;\x0a\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20type-schema-tab\x20.sts-viol-err-row\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20display:\x20flex;\x0a\x20\x20\x20\x20\x20\x20\x20\x20gap:\x2010px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20align-items:\x20baseline;\x0a\x20\x20\x20\x20\x20\x20\x20\x20flex-wrap:\x20wrap;\x0a\x20\x20\x20\x20\x20\x20\x20\x20padding:\x204px\x200;\x0a\x20\x20\x20\x20\x20\x20\x20\x20border-bottom:\x201px\x20solid\x20var(--okdb-app-surface-2);\x0a\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20type-schema-tab\x20.sts-viol-err-row:last-child\x20{\x20border-bottom:\x20none;\x20}\x0a\x20\x20\x20\x20\x20\x20type-schema-tab\x20.sts-viol-path\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20font-size:\x2011px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20color:\x20var(--okdb-danger);\x0a\x20\x20\x20\x20\x20\x20\x20\x20font-family:\x20monospace;\x0a\x20\x20\x20\x20\x20\x20\x20\x20white-space:\x20nowrap;\x0a\x20\x20\x20\x20\x20\x20\x20\x20flex-shrink:\x200;\x0a\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20/*\x20──\x20Ref\x20violations\x20sub-panel\x20──\x20*/\x0a\x20\x20\x20\x20\x20\x20type-schema-tab\x20.sts-ref-badge\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20margin-left:\x206px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20font-size:\x2010px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20padding:\x202px\x208px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20border-radius:\x20999px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20border:\x201px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-purple)\x2033%,\x20transparent);\x0a\x20\x20\x20\x20\x20\x20\x20\x20color:\x20var(--okdb-purple);\x0a\x20\x20\x20\x20\x20\x20\x20\x20font-weight:\x20600;\x0a\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20type-schema-tab\x20.sts-ref-table\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20display:\x20grid;\x0a\x20\x20\x20\x20\x20\x20\x20\x20grid-template-columns:\x20minmax(100px,\x201.5fr)\x20minmax(80px,\x201fr)\x20minmax(120px,\x202fr)\x2080px\x20auto;\x0a\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20type-schema-tab\x20.sts-ref-hint\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20color:\x20var(--okdb-purple);\x0a\x20\x20\x20\x20\x20\x20\x20\x20opacity:\x20.85;\x0a\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20','stringify','ref','maximum','3AOUxTa','json','schemaBusy','refViolationsError','onViewKey','loadRefViolations','unique','violations','$watch','ref\x20→\x20','description','onViolationCountChanged','h\x20ago','okdb','modal','format','toLocaleDateString','keys'];_0x3baf=function(){return _0x536e90;};return _0x3baf();}import _0x4ac158 from'@toolkit/elements/ok-icon.ok.js';import _0x69e117 from'../modals/schema-edit-modal.ok.js';function _0xc20a(_0xa8fcb6,_0x5c09b9){_0xa8fcb6=_0xa8fcb6-0x111;const _0x3baf3c=_0x3baf();let _0xc20ac4=_0x3baf3c[_0xa8fcb6];return _0xc20ac4;}export default{'tag':_0x5c6739(0x16a),'dependencies':[_0x4ac158,_0x69e117],'attr':{'type':{},'onViewKey':{},'onSchemaChanged':{},'onViolationCountChanged':{}},'context':_0x31aae2=>({'schema':null,'schemaBusy':!0x1,'schemaError':null,'schemaLoaded':!0x1,'violations':[],'violationsBusy':!0x1,'violationsError':null,'expandedViolation':null,'refViolations':[],'refViolationsBusy':!0x1,'refViolationsError':null,'expandedRefViolation':null,get 'type'(){const _0x3b02e2=_0x5c6739;return _0x31aae2[_0x3b02e2(0x159)][_0x3b02e2(0x164)];},get 'envApiBase'(){const _0x522a73=_0x5c6739;return _0x31aae2[_0x522a73(0x177)]['stores'][_0x522a73(0x14d)][_0x522a73(0x15b)];},get 'hasSchema'(){const _0x444dd6=_0x5c6739;return!!this['schema']?.[_0x444dd6(0x17e)];},get 'enforceMode'(){return this['schema']?.['enforce']??!0x1;},get 'definition'(){const _0x174c88=_0x5c6739;return this[_0x174c88(0x162)]?.[_0x174c88(0x17e)]??null;},get 'violationCount'(){const _0x367b38=_0x5c6739;return this['violations'][_0x367b38(0x15e)]+this[_0x367b38(0x121)][_0x367b38(0x15e)];},get 'hasRefs'(){const _0x467dda=_0x5c6739;return this[_0x467dda(0x13a)][_0x467dda(0x16e)](_0x3b4dbb=>_0x3b4dbb['hasRef']);},get 'propertyEntries'(){const _0x1162bf=_0x5c6739,_0x366031=this[_0x1162bf(0x17e)];if(!_0x366031?.[_0x1162bf(0x12d)])return[];const _0xa59d8d=new Set(_0x366031[_0x1162bf(0x12a)]||[]);return Object[_0x1162bf(0x158)](_0x366031[_0x1162bf(0x12d)])[_0x1162bf(0x157)](([_0x4dc8c0,_0x12810e])=>{const _0x2857fb=_0x1162bf,_0x368743=Array[_0x2857fb(0x114)](_0x12810e['type'])?_0x12810e['type'][_0x2857fb(0x137)](_0x2857fb(0x170)):_0x12810e[_0x2857fb(0x164)]||'—',_0x1c088a=[];_0x12810e[_0x2857fb(0x14f)]&&_0x1c088a[_0x2857fb(0x12e)](_0x12810e[_0x2857fb(0x14f)]),_0x12810e[_0x2857fb(0x117)]&&_0x1c088a['push'](_0x2857fb(0x112)+_0x12810e['enum']['length']+')'),void 0x0!==_0x12810e['const']&&_0x1c088a[_0x2857fb(0x12e)](_0x2857fb(0x173)),void 0x0!==_0x12810e['minimum']&&_0x1c088a['push']('≥'+_0x12810e[_0x2857fb(0x155)]),void 0x0!==_0x12810e[_0x2857fb(0x13f)]&&_0x1c088a[_0x2857fb(0x12e)]('≤'+_0x12810e['maximum']),void 0x0!==_0x12810e[_0x2857fb(0x120)]&&_0x1c088a['push']('>'+_0x12810e[_0x2857fb(0x120)]),void 0x0!==_0x12810e[_0x2857fb(0x166)]&&_0x1c088a[_0x2857fb(0x12e)]('<'+_0x12810e[_0x2857fb(0x166)]),void 0x0!==_0x12810e['multipleOf']&&_0x1c088a[_0x2857fb(0x12e)]('×'+_0x12810e[_0x2857fb(0x129)]),void 0x0!==_0x12810e[_0x2857fb(0x172)]&&_0x1c088a['push'](_0x2857fb(0x118)+_0x12810e['minLength']),void 0x0!==_0x12810e[_0x2857fb(0x123)]&&_0x1c088a[_0x2857fb(0x12e)](_0x2857fb(0x160)+_0x12810e['maxLength']),_0x12810e['pattern']&&_0x1c088a['push']('pattern'),void 0x0!==_0x12810e[_0x2857fb(0x176)]&&_0x1c088a[_0x2857fb(0x12e)](_0x2857fb(0x11d)+_0x12810e[_0x2857fb(0x176)]),void 0x0!==_0x12810e[_0x2857fb(0x115)]&&_0x1c088a[_0x2857fb(0x12e)](_0x2857fb(0x15c)+_0x12810e['maxItems']),_0x12810e[_0x2857fb(0x15f)]&&_0x1c088a[_0x2857fb(0x12e)](_0x2857fb(0x146)),_0x12810e[_0x2857fb(0x12d)]&&_0x1c088a[_0x2857fb(0x12e)](Object[_0x2857fb(0x151)](_0x12810e[_0x2857fb(0x12d)])['length']+_0x2857fb(0x111)),_0x12810e[_0x2857fb(0x119)]&&_0x1c088a['push'](_0x2857fb(0x139)+(_0x12810e['items'][_0x2857fb(0x164)]||'any'));const _0x488ce4=_0x12810e[_0x2857fb(0x13e)];if(_0x488ce4?.[_0x2857fb(0x164)]){const _0x3b243c=_0x488ce4['onDelete']||_0x2857fb(0x163);_0x1c088a[_0x2857fb(0x12e)](_0x2857fb(0x149)+_0x488ce4[_0x2857fb(0x164)]+'\x20('+_0x3b243c+')');}return{'name':_0x4dc8c0,'type':_0x368743,'required':_0xa59d8d['has'](_0x4dc8c0),'description':_0x12810e[_0x2857fb(0x14a)]||'','constraints':_0x1c088a[_0x2857fb(0x137)](',\x20'),'hasRef':!!_0x488ce4?.[_0x2857fb(0x164)],'refTarget':_0x488ce4?.[_0x2857fb(0x164)]||null};});},get 'additionalAllowed'(){const _0x455f55=_0x5c6739;return!0x1!==this[_0x455f55(0x17e)]?.[_0x455f55(0x169)];},get 'jsonPreview'(){const _0x5d84ec=_0x5c6739;if(!this[_0x5d84ec(0x17e)])return'';const _0x111d48=JSON[_0x5d84ec(0x13d)](this[_0x5d84ec(0x17e)],null,0x2),_0x159c06=_0x111d48[_0x5d84ec(0x16b)]('\x0a');return _0x159c06[_0x5d84ec(0x15e)]<=0x14?_0x111d48:_0x159c06[_0x5d84ec(0x154)](0x0,0x14)[_0x5d84ec(0x137)]('\x0a')+'\x0a\x20\x20…';},async 'loadSchema'(){const _0x1b79b4=_0x5c6739;if(this['type']){this[_0x1b79b4(0x142)]=!0x0,this[_0x1b79b4(0x113)]=null;try{const _0x4292dc=await fetch(this[_0x1b79b4(0x11e)]+_0x1b79b4(0x17b)+encodeURIComponent(this[_0x1b79b4(0x164)])+_0x1b79b4(0x138));if(0x194===_0x4292dc[_0x1b79b4(0x153)])this[_0x1b79b4(0x162)]=null;else{if(!_0x4292dc['ok']){const _0x54f2e1=await _0x4292dc[_0x1b79b4(0x141)]()['catch'](()=>({}));throw new Error(_0x54f2e1?.['error']?.['message']||_0x4292dc[_0x1b79b4(0x16d)]);}{const _0x14e045=await _0x4292dc[_0x1b79b4(0x141)]();this[_0x1b79b4(0x162)]=_0x14e045[_0x1b79b4(0x12c)]??_0x14e045['result']??_0x14e045;}}this[_0x1b79b4(0x17d)]=!0x0;}catch(_0x4c78dc){this[_0x1b79b4(0x113)]=_0x4c78dc[_0x1b79b4(0x167)]||'Failed\x20to\x20load\x20schema';}finally{this[_0x1b79b4(0x142)]=!0x1;}}},async 'loadViolations'(){const _0x3167ca=_0x5c6739;if(this[_0x3167ca(0x164)]){this[_0x3167ca(0x11c)]=!0x0,this[_0x3167ca(0x11b)]=null;try{const _0x2121c0=await fetch(this[_0x3167ca(0x11e)]+_0x3167ca(0x152)+encodeURIComponent(this[_0x3167ca(0x164)]));if(0x194===_0x2121c0[_0x3167ca(0x153)])return void(this[_0x3167ca(0x147)]=[]);if(!_0x2121c0['ok']){const _0x476a6d=await _0x2121c0[_0x3167ca(0x141)]()[_0x3167ca(0x11f)](()=>({}));throw new Error(_0x476a6d?.[_0x3167ca(0x134)]?.[_0x3167ca(0x167)]||_0x2121c0[_0x3167ca(0x16d)]);}const _0x212b58=await _0x2121c0[_0x3167ca(0x141)]();this[_0x3167ca(0x147)]=_0x212b58?.[_0x3167ca(0x12c)]?.[_0x3167ca(0x147)]??_0x212b58?.[_0x3167ca(0x135)]?.[_0x3167ca(0x147)]??[];}catch(_0x2d35e1){this[_0x3167ca(0x11b)]=_0x2d35e1['message']||_0x3167ca(0x126),this[_0x3167ca(0x147)]=[];}finally{this[_0x3167ca(0x11c)]=!0x1,this[_0x3167ca(0x179)]();}}},async 'loadRefViolations'(){const _0x2bfb09=_0x5c6739;if(this[_0x2bfb09(0x164)]){this[_0x2bfb09(0x171)]=!0x0,this[_0x2bfb09(0x143)]=null;try{const _0x497161=await fetch(this[_0x2bfb09(0x11e)]+'/ref-violations/'+encodeURIComponent(this[_0x2bfb09(0x164)]));if(0x194===_0x497161[_0x2bfb09(0x153)])return void(this[_0x2bfb09(0x121)]=[]);if(!_0x497161['ok']){const _0x3f3ab5=await _0x497161[_0x2bfb09(0x141)]()[_0x2bfb09(0x11f)](()=>({}));throw new Error(_0x3f3ab5?.['error']?.[_0x2bfb09(0x167)]||_0x497161[_0x2bfb09(0x16d)]);}const _0x30c767=await _0x497161[_0x2bfb09(0x141)]();this[_0x2bfb09(0x121)]=_0x30c767?.[_0x2bfb09(0x12c)]?.[_0x2bfb09(0x147)]??_0x30c767?.[_0x2bfb09(0x135)]?.[_0x2bfb09(0x147)]??[];}catch(_0x45a15c){this[_0x2bfb09(0x143)]=_0x45a15c[_0x2bfb09(0x167)]||_0x2bfb09(0x132),this[_0x2bfb09(0x121)]=[];}finally{this[_0x2bfb09(0x171)]=!0x1,this[_0x2bfb09(0x179)]();}}},'_notifyViolationCount'(){const _0x37a82d=_0x5c6739,_0x457e7c=_0x31aae2[_0x37a82d(0x159)][_0x37a82d(0x14b)];'function'==typeof _0x457e7c&&_0x457e7c(this[_0x37a82d(0x168)]);},'toggleViolation'(_0x324a94){const _0x390f7b=_0x5c6739;this['expandedViolation']=this[_0x390f7b(0x178)]===_0x324a94?null:_0x324a94;},'toggleRefViolation'(_0x3ded25){this['expandedRefViolation']=this['expandedRefViolation']===_0x3ded25?null:_0x3ded25;},'viewDocument'(_0x403ee0){const _0x1de7f6=_0x5c6739,_0x33757b=_0x31aae2['$attr'][_0x1de7f6(0x144)];_0x1de7f6(0x17a)==typeof _0x33757b&&_0x33757b(_0x403ee0);},'relTime'(_0x3bc90e){const _0x5e72ad=_0x5c6739;if(!_0x3bc90e)return'—';const _0x102950=Date[_0x5e72ad(0x17f)]()-_0x3bc90e;return _0x102950<0x1388?_0x5e72ad(0x15d):_0x102950<0xea60?Math[_0x5e72ad(0x17c)](_0x102950/0x3e8)+_0x5e72ad(0x165):_0x102950<0x36ee80?Math[_0x5e72ad(0x17c)](_0x102950/0xea60)+_0x5e72ad(0x12f):_0x102950<0x5265c00?Math[_0x5e72ad(0x17c)](_0x102950/0x36ee80)+_0x5e72ad(0x14c):new Date(_0x3bc90e)[_0x5e72ad(0x150)]();},'errorCount':_0x250b65=>(_0x250b65[_0x5c6739(0x131)]??[])[_0x5c6739(0x15e)]||(_0x250b65[_0x5c6739(0x175)]??0x0),async 'openEditModal'(){const _0x2981dc=_0x5c6739;await _0x31aae2[_0x2981dc(0x177)][_0x2981dc(0x116)][_0x2981dc(0x14e)][_0x2981dc(0x16f)]({'owner':_0x31aae2,'title':'Schema\x20·\x20'+this[_0x2981dc(0x164)],'canDrag':!0x0,'content':_0x2981dc(0x127),'context':_0x43373f=>({'modal':_0x43373f,'type':this[_0x2981dc(0x164)],'schema':this[_0x2981dc(0x162)],'envApiBase':this['envApiBase'],'onDone':async()=>{const _0x17aabf=_0x2981dc;await Promise['all']([this['loadSchema'](),this[_0x17aabf(0x128)](),this[_0x17aabf(0x145)]()]);const _0x22abb5=_0x31aae2['$attr'][_0x17aabf(0x125)];_0x17aabf(0x17a)==typeof _0x22abb5&&_0x22abb5();}})});}}),async 'init'(_0x480e3c){const _0x493163=_0x5c6739;_0x480e3c[_0x493163(0x148)](()=>this['type'],async()=>{const _0x585c83=_0x493163;this[_0x585c83(0x17d)]=!0x1,this['schema']=null,this['violations']=[],this[_0x585c83(0x178)]=null,this[_0x585c83(0x121)]=[],this[_0x585c83(0x122)]=null,this[_0x585c83(0x164)]&&await Promise[_0x585c83(0x15a)]([this[_0x585c83(0x136)](),this[_0x585c83(0x128)](),this[_0x585c83(0x145)]()]);}),this[_0x493163(0x164)]&&await Promise['all']([this['loadSchema'](),this['loadViolations'](),this['loadRefViolations']()]);},'template':'\x0a<div\x20style=\x22display:flex;\x20flex-direction:column;\x20gap:16px;\x20flex:1;\x20overflow:auto;\x20padding-right:4px;\x22>\x0a\x0a\x20\x20<!--\x20──\x20Schema\x20summary\x20card\x20────────────────────────────────────\x20-->\x0a\x20\x20<div\x20class=\x22card\x22>\x0a\x20\x20\x20\x20<div\x20class=\x22manage-section-header\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22manage-section-title\x22>Schema\x20Definition</div>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;\x20gap:8px;\x20align-items:center;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22schemaBusy\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-size:11px;\x20opacity:.4;\x22>Loading…</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22hasSchema\x20&&\x20!schemaBusy\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20:style=\x22\x27font-size:10px;\x20padding:2px\x208px;\x20border-radius:999px;\x20border:1px\x20solid;\x20\x27\x20+\x20(enforceMode\x20?\x20\x27color:var(--okdb-success);\x20border-color:color-mix(in\x20srgb,\x20var(--okdb-success)\x2033%,\x20transparent);\x27\x20:\x20\x27color:var(--okdb-app-fg-muted);\x20border-color:color-mix(in\x20srgb,\x20var(--okdb-app-fg-muted)\x2033%,\x20transparent);\x27)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{\x20enforceMode\x20?\x20\x27enforcing\x27\x20:\x20\x27passive\x27\x20}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22openEditModal()\x22\x20class=\x22btn-icon\x22\x20style=\x22font-size:12px;\x20padding:4px\x2014px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<ok-icon\x20name=\x22edit-2\x22></ok-icon>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{\x20hasSchema\x20?\x20\x27Edit\x20Schema\x27\x20:\x20\x27Set\x20Schema\x27\x20}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20<if\x20:=\x22schemaError\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22margin-bottom:12px;\x20color:var(--okdb-danger);\x20font-size:12px;\x20padding:8px\x2010px;\x20border-radius:8px;\x20border:1px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-danger)\x2020%,\x20transparent);\x20background:color-mix(in\x20srgb,\x20var(--okdb-danger)\x204%,\x20transparent);\x22>{{\x20schemaError\x20}}</div>\x0a\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20<!--\x20No\x20schema\x20state\x20-->\x0a\x20\x20\x20\x20<if\x20:=\x22schemaLoaded\x20&&\x20!hasSchema\x20&&\x20!schemaBusy\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22opacity:.45;\x20font-size:13px;\x20padding:8px\x200;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20No\x20schema\x20defined\x20for\x20this\x20type.\x20Click\x20<b>Set\x20Schema</b>\x20to\x20add\x20one.\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20<!--\x20Schema\x20summary\x20-->\x0a\x20\x20\x20\x20<if\x20:=\x22hasSchema\x20&&\x20!schemaBusy\x22>\x0a\x0a\x20\x20\x20\x20\x20\x20<!--\x20Properties\x20table\x20-->\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22propertyEntries.length\x20>\x200\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22sts-grid\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22sts-hd\x22>Property</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22sts-hd\x22>Type</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22sts-hd\x22>Req</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22sts-hd\x22>Constraints</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22sts-hd\x22>Description</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<each\x20:of=\x22propertyEntries\x22\x20let:item=\x22p\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22sts-cell\x22><code\x20style=\x22font-size:12px;\x20color:var(--okdb-json-key);\x22>{{\x20p.name\x20}}</code></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22sts-cell\x20sts-dim\x22>{{\x20p.type\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22sts-cell\x22\x20style=\x22text-align:center;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22p.required\x22><span\x20style=\x22color:var(--okdb-success);\x20font-size:11px;\x22>✓</span></if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20:class=\x22\x27sts-cell\x20sts-dim\x27\x20+\x20(p.hasRef\x20?\x20\x27\x20sts-ref-hint\x27\x20:\x20\x27\x27)\x22\x20style=\x22font-size:11px;\x22>{{\x20p.constraints\x20||\x20\x27—\x27\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22sts-cell\x20sts-dim\x22>{{\x20p.description\x20||\x20\x27—\x27\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</each>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:11px;\x20opacity:.35;\x20margin-top:6px;\x20user-select:none;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{\x20propertyEntries.length\x20}}\x20propert{{\x20propertyEntries.length\x20===\x201\x20?\x20\x27y\x27\x20:\x20\x27ies\x27\x20}}{{\x20additionalAllowed\x20?\x20\x27\x20·\x20additional\x20properties\x20allowed\x27\x20:\x20\x27\x20·\x20no\x20additional\x20properties\x27\x20}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22propertyEntries.length\x20===\x200\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22opacity:.4;\x20font-size:13px;\x20padding:4px\x200;\x22>Schema\x20has\x20no\x20top-level\x20properties\x20defined.</div>\x0a\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20\x20\x20<!--\x20Collapsed\x20JSON\x20preview\x20-->\x0a\x20\x20\x20\x20\x20\x20<details\x20style=\x22margin-top:12px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<summary\x20style=\x22font-size:11px;\x20opacity:.45;\x20cursor:pointer;\x20user-select:none;\x22>Raw\x20JSON\x20Schema</summary>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<pre\x20class=\x22sts-json-preview\x22>{{\x20jsonPreview\x20}}</pre>\x0a\x20\x20\x20\x20\x20\x20</details>\x0a\x0a\x20\x20\x20\x20</if>\x0a\x20\x20</div>\x0a\x0a\x20\x20<!--\x20──\x20Schema\x20Violations\x20panel\x20───────────────\x20-->\x0a\x20\x20<div\x20class=\x22card\x22>\x0a\x20\x20\x20\x20<div\x20class=\x22manage-section-header\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22manage-section-title\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20Schema\x20Violations\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22violations.length\x20>\x200\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22sts-viol-badge\x22>{{\x20violations.length\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20<button\x20@click=\x22loadViolations()\x22\x20:disabled=\x22violationsBusy\x22\x20class=\x22btn-icon\x22\x20style=\x22font-size:11px;\x20padding:3px\x2010px;\x20opacity:.75;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<ok-icon\x20name=\x22refresh-cw\x22></ok-icon>Refresh\x0a\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20<if\x20:=\x22violationsBusy\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22opacity:.45;\x20font-size:13px;\x22>Loading\x20violations…</div>\x0a\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20<if\x20:=\x22violationsError\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22color:var(--okdb-danger);\x20font-size:12px;\x20padding:8px\x2010px;\x20border-radius:8px;\x20border:1px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-danger)\x2020%,\x20transparent);\x20background:color-mix(in\x20srgb,\x20var(--okdb-danger)\x204%,\x20transparent);\x22>{{\x20violationsError\x20}}</div>\x0a\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20<if\x20:=\x22!violationsBusy\x20&&\x20!violationsError\x20&&\x20violations.length\x20===\x200\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22opacity:.4;\x20font-size:13px;\x22>No\x20violations\x20—\x20all\x20documents\x20conform\x20to\x20the\x20schema.</div>\x0a\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20<if\x20:=\x22violations.length\x20>\x200\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22sts-viol-table\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22sts-viol-hd\x22>Key</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22sts-viol-hd\x22>Errors</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22sts-viol-hd\x22>When</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22sts-viol-hd\x22></div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20<each\x20:of=\x22violations\x22\x20let:item=\x22v\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22sts-viol-cell\x20sts-viol-key\x22\x20@click=\x22toggleViolation(v.key)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-family:monospace;\x20font-size:12px;\x20color:var(--okdb-json-key);\x22>{{\x20v.key\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22sts-viol-cell\x22\x20@click=\x22toggleViolation(v.key)\x22\x20style=\x22font-size:12px;\x20opacity:.65;\x22>{{\x20errorCount(v)\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22sts-viol-cell\x22\x20@click=\x22toggleViolation(v.key)\x22\x20style=\x22font-size:11px;\x20opacity:.45;\x22>{{\x20relTime(v.timestamp)\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22sts-viol-cell\x22\x20style=\x22justify-content:flex-end;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22$attr.onViewKey\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@click:stop=\x22viewDocument(v.key)\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20class=\x22btn-icon\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22font-size:11px;\x20padding:2px\x208px;\x20opacity:.75;\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20title=\x22Switch\x20to\x20data\x20tab\x20for\x20this\x20document\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20>View\x20→</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22expandedViolation\x20===\x20v.key\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22sts-viol-expanded\x22\x20style=\x22grid-column:1/-1;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<each\x20:of=\x22(v.errors\x20??\x20[])\x22\x20let:item=\x22err\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22sts-viol-err-row\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22sts-viol-path\x22>{{\x20err.path\x20||\x20\x27/\x27\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-size:12px;\x20opacity:.85;\x20flex:1;\x20min-width:0;\x22>{{\x20err.message\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22err.expected\x20!=\x20null\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-size:11px;\x20opacity:.5;\x20white-space:nowrap;\x22>expected:\x20<code\x20style=\x22font-size:11px;\x22>{{\x20err.expected\x20}}</code></span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22err.actual\x20!=\x20null\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-size:11px;\x20opacity:.5;\x20white-space:nowrap;\x22>got:\x20<code\x20style=\x22font-size:11px;\x20color:var(--okdb-danger);\x22>{{\x20err.actual\x20}}</code></span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</each>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22!(v.errors\x20??\x20[]).length\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:12px;\x20opacity:.4;\x20padding:4px\x200;\x22>No\x20error\x20details\x20stored.</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</each>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</if>\x0a\x20\x20</div>\x0a\x0a\x20\x20<!--\x20──\x20Ref\x20Violations\x20panel\x20(foreign\x20key)\x20───────────────\x20-->\x0a\x20\x20<if\x20:=\x22hasRefs\x20||\x20refViolations.length\x20>\x200\x22>\x0a\x20\x20<div\x20class=\x22card\x22>\x0a\x20\x20\x20\x20<div\x20class=\x22manage-section-header\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22manage-section-title\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20Ref\x20Violations\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22refViolations.length\x20>\x200\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22sts-ref-badge\x22>{{\x20refViolations.length\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20<button\x20@click=\x22loadRefViolations()\x22\x20:disabled=\x22refViolationsBusy\x22\x20class=\x22btn-icon\x22\x20style=\x22font-size:11px;\x20padding:3px\x2010px;\x20opacity:.75;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<ok-icon\x20name=\x22refresh-cw\x22></ok-icon>Refresh\x0a\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20<if\x20:=\x22refViolationsBusy\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22opacity:.45;\x20font-size:13px;\x22>Loading\x20ref\x20violations…</div>\x0a\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20<if\x20:=\x22refViolationsError\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22color:var(--okdb-danger);\x20font-size:12px;\x20padding:8px\x2010px;\x20border-radius:8px;\x20border:1px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-danger)\x2020%,\x20transparent);\x20background:color-mix(in\x20srgb,\x20var(--okdb-danger)\x204%,\x20transparent);\x22>{{\x20refViolationsError\x20}}</div>\x0a\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20<if\x20:=\x22!refViolationsBusy\x20&&\x20!refViolationsError\x20&&\x20refViolations.length\x20===\x200\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22opacity:.4;\x20font-size:13px;\x22>No\x20ref\x20violations\x20—\x20all\x20foreign\x20key\x20references\x20are\x20valid.</div>\x0a\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20<if\x20:=\x22refViolations.length\x20>\x200\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22sts-ref-table\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22sts-viol-hd\x22>Source</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22sts-viol-hd\x22>Field</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22sts-viol-hd\x22>Target</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22sts-viol-hd\x22>When</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22sts-viol-hd\x22></div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20<each\x20:of=\x22refViolations\x22\x20let:item=\x22rv\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22sts-viol-cell\x20sts-viol-key\x22\x20@click=\x22toggleRefViolation(rv.sourceKey\x20+\x20\x27@\x27\x20+\x20rv.fieldPath)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-family:monospace;\x20font-size:12px;\x20color:var(--okdb-json-key);\x22>{{\x20rv.sourceKey\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22sts-viol-cell\x22\x20@click=\x22toggleRefViolation(rv.sourceKey\x20+\x20\x27@\x27\x20+\x20rv.fieldPath)\x22\x20style=\x22font-size:12px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<code\x20style=\x22font-size:11px;\x20color:var(--okdb-purple);\x22>{{\x20rv.fieldPath\x20}}</code>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22sts-viol-cell\x22\x20@click=\x22toggleRefViolation(rv.sourceKey\x20+\x20\x27@\x27\x20+\x20rv.fieldPath)\x22\x20style=\x22font-size:12px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22opacity:.5;\x22>{{\x20rv.targetType\x20}}</span><span\x20style=\x22color:var(--okdb-danger);\x22>@{{\x20rv.targetKey\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22sts-viol-cell\x22\x20@click=\x22toggleRefViolation(rv.sourceKey\x20+\x20\x27@\x27\x20+\x20rv.fieldPath)\x22\x20style=\x22font-size:11px;\x20opacity:.45;\x22>{{\x20relTime(rv.timestamp\x20||\x20rv.detectedAt)\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22sts-viol-cell\x22\x20style=\x22justify-content:flex-end;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22$attr.onViewKey\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@click:stop=\x22viewDocument(rv.sourceKey)\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20class=\x22btn-icon\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22font-size:11px;\x20padding:2px\x208px;\x20opacity:.75;\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20title=\x22View\x20the\x20document\x20with\x20the\x20dangling\x20ref\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20>View\x20→</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22expandedRefViolation\x20===\x20(rv.sourceKey\x20+\x20\x27@\x27\x20+\x20rv.fieldPath)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22sts-viol-expanded\x22\x20style=\x22grid-column:1/-1;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22sts-viol-err-row\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22sts-viol-path\x22>{{\x20rv.fieldPath\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-size:12px;\x20opacity:.85;\x20flex:1;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20References\x20<code\x20style=\x22font-size:12px;\x22>{{\x20rv.targetType\x20}}@{{\x20rv.targetKey\x20}}</code>\x20which\x20does\x20not\x20exist\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</each>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</if>\x0a\x20\x20</div>\x0a\x20\x20</if>\x0a\x0a</div>\x0a','style':_0x5c6739(0x13c)};
1
+ import n from"@toolkit/elements/ok-icon.ok.js";import e from"../modals/schema-edit-modal.ok.js";export default{tag:"type-schema-tab",dependencies:[n,e],attr:{type:{},onViewKey:{},onSchemaChanged:{},onViolationCountChanged:{}},context:n=>({schema:null,schemaBusy:!1,schemaError:null,schemaLoaded:!1,violations:[],violationsBusy:!1,violationsError:null,expandedViolation:null,refViolations:[],refViolationsBusy:!1,refViolationsError:null,expandedRefViolation:null,get type(){return n.$attr.type},get envApiBase(){return n.$ok.stores.okdb.apiBase},get hasSchema(){return!!this.schema?.definition},get enforceMode(){return this.schema?.enforce??!1},get definition(){return this.schema?.definition??null},get violationCount(){return this.violations.length+this.refViolations.length},get hasRefs(){return this.propertyEntries.some(n=>n.hasRef)},get propertyEntries(){const n=this.definition;if(!n?.properties)return[];const e=new Set(n.required||[]);return Object.entries(n.properties).map(([n,i])=>{const t=Array.isArray(i.type)?i.type.join(" | "):i.type||"—",s=[];i.format&&s.push(i.format),i.enum&&s.push(`enum(${i.enum.length})`),void 0!==i.const&&s.push("const"),void 0!==i.minimum&&s.push(`≥${i.minimum}`),void 0!==i.maximum&&s.push(`≤${i.maximum}`),void 0!==i.exclusiveMinimum&&s.push(`>${i.exclusiveMinimum}`),void 0!==i.exclusiveMaximum&&s.push(`<${i.exclusiveMaximum}`),void 0!==i.multipleOf&&s.push(`×${i.multipleOf}`),void 0!==i.minLength&&s.push(`len≥${i.minLength}`),void 0!==i.maxLength&&s.push(`len≤${i.maxLength}`),i.pattern&&s.push("pattern"),void 0!==i.minItems&&s.push(`items≥${i.minItems}`),void 0!==i.maxItems&&s.push(`items≤${i.maxItems}`),i.uniqueItems&&s.push("unique"),i.properties&&s.push(`${Object.keys(i.properties).length} props`),i.items&&s.push("items: "+(i.items.type||"any"));const o=i.ref;if(o?.type){const n=o.onDelete||"no_action";s.push(`ref → ${o.type} (${n})`)}return{name:n,type:t,required:e.has(n),description:i.description||"",constraints:s.join(", "),hasRef:!!o?.type,refTarget:o?.type||null}})},get additionalAllowed(){return!1!==this.definition?.additionalProperties},get jsonPreview(){if(!this.definition)return"";const n=JSON.stringify(this.definition,null,2),e=n.split("\n");return e.length<=20?n:e.slice(0,20).join("\n")+"\n …"},async loadSchema(){if(this.type){this.schemaBusy=!0,this.schemaError=null;try{const n=await fetch(`${this.envApiBase}/type/${encodeURIComponent(this.type)}/schema`);if(404===n.status)this.schema=null;else{if(!n.ok){const e=await n.json().catch(()=>({}));throw new Error(e?.error?.message||n.statusText)}{const e=await n.json();this.schema=e.data??e.result??e}}this.schemaLoaded=!0}catch(n){this.schemaError=n.message||"Failed to load schema"}finally{this.schemaBusy=!1}}},async loadViolations(){if(this.type){this.violationsBusy=!0,this.violationsError=null;try{const n=await fetch(`${this.envApiBase}/violations/${encodeURIComponent(this.type)}`);if(404===n.status)return void(this.violations=[]);if(!n.ok){const e=await n.json().catch(()=>({}));throw new Error(e?.error?.message||n.statusText)}const e=await n.json();this.violations=e?.data?.violations??e?.result?.violations??[]}catch(n){this.violationsError=n.message||"Failed to load violations",this.violations=[]}finally{this.violationsBusy=!1,this._notifyViolationCount()}}},async loadRefViolations(){if(this.type){this.refViolationsBusy=!0,this.refViolationsError=null;try{const n=await fetch(`${this.envApiBase}/ref-violations/${encodeURIComponent(this.type)}`);if(404===n.status)return void(this.refViolations=[]);if(!n.ok){const e=await n.json().catch(()=>({}));throw new Error(e?.error?.message||n.statusText)}const e=await n.json();this.refViolations=e?.data?.violations??e?.result?.violations??[]}catch(n){this.refViolationsError=n.message||"Failed to load ref violations",this.refViolations=[]}finally{this.refViolationsBusy=!1,this._notifyViolationCount()}}},_notifyViolationCount(){const e=n.$attr.onViolationCountChanged;"function"==typeof e&&e(this.violationCount)},toggleViolation(n){this.expandedViolation=this.expandedViolation===n?null:n},toggleRefViolation(n){this.expandedRefViolation=this.expandedRefViolation===n?null:n},viewDocument(e){const i=n.$attr.onViewKey;"function"==typeof i&&i(e)},relTime(n){if(!n)return"—";const e=Date.now()-n;return e<5e3?"just now":e<6e4?`${Math.round(e/1e3)}s ago`:e<36e5?`${Math.round(e/6e4)}m ago`:e<864e5?`${Math.round(e/36e5)}h ago`:new Date(n).toLocaleDateString()},errorCount:n=>(n.errors??[]).length||(n.errorCount??0),async openEditModal(){await n.$ok.shared.modal.open({owner:n,title:`Schema · ${this.type}`,canDrag:!0,content:'<schema-edit-modal :modal="modal" :type="type" :schema="schema" :env-api-base="envApiBase" :on-done="onDone" />',context:e=>({modal:e,type:this.type,schema:this.schema,envApiBase:this.envApiBase,onDone:async()=>{await Promise.all([this.loadSchema(),this.loadViolations(),this.loadRefViolations()]);const e=n.$attr.onSchemaChanged;"function"==typeof e&&e()}})})}}),async init(n){n.$watch(()=>this.type,async()=>{this.schemaLoaded=!1,this.schema=null,this.violations=[],this.expandedViolation=null,this.refViolations=[],this.expandedRefViolation=null,this.type&&await Promise.all([this.loadSchema(),this.loadViolations(),this.loadRefViolations()])}),this.type&&await Promise.all([this.loadSchema(),this.loadViolations(),this.loadRefViolations()])},template:'\n<div style="display:flex; flex-direction:column; gap:16px; flex:1; overflow:auto; padding-right:4px;">\n\n \x3c!-- ── Schema summary card ──────────────────────────────────── --\x3e\n <div class="card">\n <div class="manage-section-header">\n <div class="manage-section-title">Schema Definition</div>\n <div style="display:flex; gap:8px; align-items:center;">\n <if :="schemaBusy">\n <span style="font-size:11px; opacity:.4;">Loading…</span>\n </if>\n <if :="hasSchema && !schemaBusy">\n <span :style="\'font-size:10px; padding:2px 8px; border-radius:999px; border:1px solid; \' + (enforceMode ? \'color:var(--okdb-success); border-color:color-mix(in srgb, var(--okdb-success) 33%, transparent);\' : \'color:var(--okdb-app-fg-muted); border-color:color-mix(in srgb, var(--okdb-app-fg-muted) 33%, transparent);\')">\n {{ enforceMode ? \'enforcing\' : \'passive\' }}\n </span>\n </if>\n <button @click="openEditModal()" class="btn-icon" style="font-size:12px; padding:4px 14px;">\n <ok-icon name="edit-2"></ok-icon>\n {{ hasSchema ? \'Edit Schema\' : \'Set Schema\' }}\n </button>\n </div>\n </div>\n\n <if :="schemaError">\n <div style="margin-bottom:12px; color:var(--okdb-danger); font-size:12px; padding:8px 10px; border-radius:8px; border:1px solid color-mix(in srgb, var(--okdb-danger) 20%, transparent); background:color-mix(in srgb, var(--okdb-danger) 4%, transparent);">{{ schemaError }}</div>\n </if>\n\n \x3c!-- No schema state --\x3e\n <if :="schemaLoaded && !hasSchema && !schemaBusy">\n <div style="opacity:.45; font-size:13px; padding:8px 0;">\n No schema defined for this type. Click <b>Set Schema</b> to add one.\n </div>\n </if>\n\n \x3c!-- Schema summary --\x3e\n <if :="hasSchema && !schemaBusy">\n\n \x3c!-- Properties table --\x3e\n <if :="propertyEntries.length > 0">\n <div class="sts-grid">\n <div class="sts-hd">Property</div>\n <div class="sts-hd">Type</div>\n <div class="sts-hd">Req</div>\n <div class="sts-hd">Constraints</div>\n <div class="sts-hd">Description</div>\n <each :of="propertyEntries" let:item="p">\n <div class="sts-cell"><code style="font-size:12px; color:var(--okdb-json-key);">{{ p.name }}</code></div>\n <div class="sts-cell sts-dim">{{ p.type }}</div>\n <div class="sts-cell" style="text-align:center;">\n <if :="p.required"><span style="color:var(--okdb-success); font-size:11px;">✓</span></if>\n </div>\n <div :class="\'sts-cell sts-dim\' + (p.hasRef ? \' sts-ref-hint\' : \'\')" style="font-size:11px;">{{ p.constraints || \'—\' }}</div>\n <div class="sts-cell sts-dim">{{ p.description || \'—\' }}</div>\n </each>\n </div>\n <div style="font-size:11px; opacity:.35; margin-top:6px; user-select:none;">\n {{ propertyEntries.length }} propert{{ propertyEntries.length === 1 ? \'y\' : \'ies\' }}{{ additionalAllowed ? \' · additional properties allowed\' : \' · no additional properties\' }}\n </div>\n </if>\n\n <if :="propertyEntries.length === 0">\n <div style="opacity:.4; font-size:13px; padding:4px 0;">Schema has no top-level properties defined.</div>\n </if>\n\n \x3c!-- Collapsed JSON preview --\x3e\n <details style="margin-top:12px;">\n <summary style="font-size:11px; opacity:.45; cursor:pointer; user-select:none;">Raw JSON Schema</summary>\n <pre class="sts-json-preview">{{ jsonPreview }}</pre>\n </details>\n\n </if>\n </div>\n\n \x3c!-- ── Schema Violations panel ─────────────── --\x3e\n <div class="card">\n <div class="manage-section-header">\n <div class="manage-section-title">\n Schema Violations\n <if :="violations.length > 0">\n <span class="sts-viol-badge">{{ violations.length }}</span>\n </if>\n </div>\n <button @click="loadViolations()" :disabled="violationsBusy" class="btn-icon" style="font-size:11px; padding:3px 10px; opacity:.75;">\n <ok-icon name="refresh-cw"></ok-icon>Refresh\n </button>\n </div>\n\n <if :="violationsBusy">\n <div style="opacity:.45; font-size:13px;">Loading violations…</div>\n </if>\n\n <if :="violationsError">\n <div style="color:var(--okdb-danger); font-size:12px; padding:8px 10px; border-radius:8px; border:1px solid color-mix(in srgb, var(--okdb-danger) 20%, transparent); background:color-mix(in srgb, var(--okdb-danger) 4%, transparent);">{{ violationsError }}</div>\n </if>\n\n <if :="!violationsBusy && !violationsError && violations.length === 0">\n <div style="opacity:.4; font-size:13px;">No violations — all documents conform to the schema.</div>\n </if>\n\n <if :="violations.length > 0">\n <div class="sts-viol-table">\n <div class="sts-viol-hd">Key</div>\n <div class="sts-viol-hd">Errors</div>\n <div class="sts-viol-hd">When</div>\n <div class="sts-viol-hd"></div>\n\n <each :of="violations" let:item="v">\n <div class="sts-viol-cell sts-viol-key" @click="toggleViolation(v.key)">\n <span style="font-family:monospace; font-size:12px; color:var(--okdb-json-key);">{{ v.key }}</span>\n </div>\n <div class="sts-viol-cell" @click="toggleViolation(v.key)" style="font-size:12px; opacity:.65;">{{ errorCount(v) }}</div>\n <div class="sts-viol-cell" @click="toggleViolation(v.key)" style="font-size:11px; opacity:.45;">{{ relTime(v.timestamp) }}</div>\n <div class="sts-viol-cell" style="justify-content:flex-end;">\n <if :="$attr.onViewKey">\n <button\n @click:stop="viewDocument(v.key)"\n class="btn-icon"\n style="font-size:11px; padding:2px 8px; opacity:.75;"\n title="Switch to data tab for this document"\n >View →</button>\n </if>\n </div>\n\n <if :="expandedViolation === v.key">\n <div class="sts-viol-expanded" style="grid-column:1/-1;">\n <each :of="(v.errors ?? [])" let:item="err">\n <div class="sts-viol-err-row">\n <span class="sts-viol-path">{{ err.path || \'/\' }}</span>\n <span style="font-size:12px; opacity:.85; flex:1; min-width:0;">{{ err.message }}</span>\n <if :="err.expected != null">\n <span style="font-size:11px; opacity:.5; white-space:nowrap;">expected: <code style="font-size:11px;">{{ err.expected }}</code></span>\n </if>\n <if :="err.actual != null">\n <span style="font-size:11px; opacity:.5; white-space:nowrap;">got: <code style="font-size:11px; color:var(--okdb-danger);">{{ err.actual }}</code></span>\n </if>\n </div>\n </each>\n <if :="!(v.errors ?? []).length">\n <div style="font-size:12px; opacity:.4; padding:4px 0;">No error details stored.</div>\n </if>\n </div>\n </if>\n </each>\n </div>\n </if>\n </div>\n\n \x3c!-- ── Ref Violations panel (foreign key) ─────────────── --\x3e\n <if :="hasRefs || refViolations.length > 0">\n <div class="card">\n <div class="manage-section-header">\n <div class="manage-section-title">\n Ref Violations\n <if :="refViolations.length > 0">\n <span class="sts-ref-badge">{{ refViolations.length }}</span>\n </if>\n </div>\n <button @click="loadRefViolations()" :disabled="refViolationsBusy" class="btn-icon" style="font-size:11px; padding:3px 10px; opacity:.75;">\n <ok-icon name="refresh-cw"></ok-icon>Refresh\n </button>\n </div>\n\n <if :="refViolationsBusy">\n <div style="opacity:.45; font-size:13px;">Loading ref violations…</div>\n </if>\n\n <if :="refViolationsError">\n <div style="color:var(--okdb-danger); font-size:12px; padding:8px 10px; border-radius:8px; border:1px solid color-mix(in srgb, var(--okdb-danger) 20%, transparent); background:color-mix(in srgb, var(--okdb-danger) 4%, transparent);">{{ refViolationsError }}</div>\n </if>\n\n <if :="!refViolationsBusy && !refViolationsError && refViolations.length === 0">\n <div style="opacity:.4; font-size:13px;">No ref violations — all foreign key references are valid.</div>\n </if>\n\n <if :="refViolations.length > 0">\n <div class="sts-ref-table">\n <div class="sts-viol-hd">Source</div>\n <div class="sts-viol-hd">Field</div>\n <div class="sts-viol-hd">Target</div>\n <div class="sts-viol-hd">When</div>\n <div class="sts-viol-hd"></div>\n\n <each :of="refViolations" let:item="rv">\n <div class="sts-viol-cell sts-viol-key" @click="toggleRefViolation(rv.sourceKey + \'@\' + rv.fieldPath)">\n <span style="font-family:monospace; font-size:12px; color:var(--okdb-json-key);">{{ rv.sourceKey }}</span>\n </div>\n <div class="sts-viol-cell" @click="toggleRefViolation(rv.sourceKey + \'@\' + rv.fieldPath)" style="font-size:12px;">\n <code style="font-size:11px; color:var(--okdb-purple);">{{ rv.fieldPath }}</code>\n </div>\n <div class="sts-viol-cell" @click="toggleRefViolation(rv.sourceKey + \'@\' + rv.fieldPath)" style="font-size:12px;">\n <span style="opacity:.5;">{{ rv.targetType }}</span><span style="color:var(--okdb-danger);">@{{ rv.targetKey }}</span>\n </div>\n <div class="sts-viol-cell" @click="toggleRefViolation(rv.sourceKey + \'@\' + rv.fieldPath)" style="font-size:11px; opacity:.45;">{{ relTime(rv.timestamp || rv.detectedAt) }}</div>\n <div class="sts-viol-cell" style="justify-content:flex-end;">\n <if :="$attr.onViewKey">\n <button\n @click:stop="viewDocument(rv.sourceKey)"\n class="btn-icon"\n style="font-size:11px; padding:2px 8px; opacity:.75;"\n title="View the document with the dangling ref"\n >View →</button>\n </if>\n </div>\n\n <if :="expandedRefViolation === (rv.sourceKey + \'@\' + rv.fieldPath)">\n <div class="sts-viol-expanded" style="grid-column:1/-1;">\n <div class="sts-viol-err-row">\n <span class="sts-viol-path">{{ rv.fieldPath }}</span>\n <span style="font-size:12px; opacity:.85; flex:1;">\n References <code style="font-size:12px;">{{ rv.targetType }}@{{ rv.targetKey }}</code> which does not exist\n </span>\n </div>\n </div>\n </if>\n </each>\n </div>\n </if>\n </div>\n </if>\n\n</div>\n',style:"\n type-schema-tab .sts-grid {\n display: grid;\n grid-template-columns: minmax(80px, 1.5fr) minmax(60px, 1fr) 40px minmax(80px, 1.5fr) 2fr;\n gap: 0;\n }\n type-schema-tab .sts-hd {\n font-size: 11px;\n opacity: .4;\n padding: 0 12px 6px 0;\n border-bottom: 1px solid var(--okdb-app-border);\n font-weight: normal;\n }\n type-schema-tab .sts-cell {\n padding: 6px 12px 6px 0;\n border-bottom: 1px solid var(--okdb-app-surface);\n font-size: 13px;\n display: flex;\n align-items: center;\n min-width: 0;\n }\n type-schema-tab .sts-dim {\n opacity: .5;\n font-size: 12px;\n }\n type-schema-tab .sts-json-preview {\n margin-top: 8px;\n padding: 10px 12px;\n background: var(--okdb-app-bg-deep);\n border: 1px solid var(--okdb-app-surface-2);\n border-radius: 6px;\n font-size: 11px;\n line-height: 1.6;\n overflow: auto;\n max-height: 280px;\n white-space: pre-wrap;\n word-break: break-word;\n color: var(--okdb-app-fg-muted);\n }\n\n /* ── Violations sub-panel ── */\n type-schema-tab .sts-viol-badge {\n margin-left: 6px;\n font-size: 10px;\n padding: 2px 8px;\n border-radius: 999px;\n border: 1px solid color-mix(in srgb, var(--okdb-danger) 33%, transparent);\n color: var(--okdb-danger);\n font-weight: 600;\n text-transform: none;\n letter-spacing: 0;\n }\n type-schema-tab .sts-viol-table {\n display: grid;\n grid-template-columns: minmax(120px, 2fr) 60px 90px auto;\n }\n type-schema-tab .sts-viol-hd {\n font-size: 11px;\n opacity: .4;\n padding: 0 12px 6px 0;\n border-bottom: 1px solid var(--okdb-app-border);\n }\n type-schema-tab .sts-viol-cell {\n display: flex;\n align-items: center;\n padding: 7px 12px 7px 0;\n border-bottom: 1px solid var(--okdb-app-surface);\n cursor: pointer;\n transition: background .1s;\n min-width: 0;\n overflow: hidden;\n }\n type-schema-tab .sts-viol-cell:hover { background: #ffffff07; }\n type-schema-tab .sts-viol-key { overflow: hidden; }\n type-schema-tab .sts-viol-key span {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n type-schema-tab .sts-viol-expanded {\n padding: 10px 12px 12px 14px;\n background: var(--okdb-app-bg-deep);\n border-bottom: 1px solid var(--okdb-app-surface);\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n type-schema-tab .sts-viol-err-row {\n display: flex;\n gap: 10px;\n align-items: baseline;\n flex-wrap: wrap;\n padding: 4px 0;\n border-bottom: 1px solid var(--okdb-app-surface-2);\n }\n type-schema-tab .sts-viol-err-row:last-child { border-bottom: none; }\n type-schema-tab .sts-viol-path {\n font-size: 11px;\n color: var(--okdb-danger);\n font-family: monospace;\n white-space: nowrap;\n flex-shrink: 0;\n }\n\n /* ── Ref violations sub-panel ── */\n type-schema-tab .sts-ref-badge {\n margin-left: 6px;\n font-size: 10px;\n padding: 2px 8px;\n border-radius: 999px;\n border: 1px solid color-mix(in srgb, var(--okdb-purple) 33%, transparent);\n color: var(--okdb-purple);\n font-weight: 600;\n }\n type-schema-tab .sts-ref-table {\n display: grid;\n grid-template-columns: minmax(100px, 1.5fr) minmax(80px, 1fr) minmax(120px, 2fr) 80px auto;\n }\n type-schema-tab .sts-ref-hint {\n color: var(--okdb-purple);\n opacity: .85;\n }\n "};